ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWE3ZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTU1IEBACisNCis9IFZlcnNpb24gMC45IHJlbGVhc2VkIG9uIDIwMDgtMDMtMTYNCisNCisgICAgKiBBZGRlZCBzdXBwb3J0IGZvciBjaXBoZXJzdWl0ZTogU1NMX1JTQV9BRVNfMTI4X1NIQQ0KKyAgICAqIEVuYWJsZWQgc3VwcG9ydCBmb3IgbGFyZ2UgZmlsZXMgYnkgZGVmYXVsdCBpbiBhZXNjcnlwdDIuYw0KKyAgICAqIFByZWxpbWluYXJ5IG9wZW5zc2wgd3JhcHBlciBjb250cmlidXRlZCBieSBEYXZpZCBCYXJyZXR0DQorICAgICogRml4ZWQgYSBidWcgaW4gc3NsX3dyaXRlKCkgdGhhdCBjYXVzZWQgdGhlIHNhbWUgcGF5bG9hZCB0bw0KKyAgICAgIGJlIHNlbnQgdHdpY2UgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2hlbiBzZW5kIHJldHVybnMgRUFHQUlODQorICAgICogRml4ZWQgc3NsX3BhcnNlX2NsaWVudF9oZWxsbygpOiBzZXNzaW9uIGlkIGFuZCBjaGFsbGVuZ2UgbXVzdA0KKyAgICAgIG5vdCBiZSBzd2FwcGVkIGluIHRoZSBTU0x2MiBDbGllbnRIZWxsbyAoZm91bmQgYnkgR3JlZyBSb2Jzb24pDQorICAgICogQWRkZWQgdXNlci1kZWZpbmVkIGNhbGxiYWNrIGRlYnVnIGZ1bmN0aW9uIChLcnlzdGlhbiBLb2xvZHppZWopDQorICAgICogQmVmb3JlIGZyZWVpbmcgYSBjZXJ0aWZpY2F0ZSwgcHJvcGVybHkgemVybyBvdXQgYWxsIGNlcnQuIGRhdGENCisgICAgKiBGaXhlZCB0aGUgIm1vZGUiIHBhcmFtZXRlciBzbyB0aGF0IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBhcmUNCisgICAgICBub3Qgc3dhcHBlZCBvbiBQYWRMb2NrOyBhbHNvIGZpeGVkIGNvbXBpbGF0aW9uIG9uIG9sZGVyIHZlcnNpb25zDQorICAgICAgb2YgZ2NjIChidWcgcmVwb3J0ZWQgYnkgRGF2aWQgQmFycmV0dCkNCisgICAgKiBDb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIGluIHBhZGxvY2tfeGNyeXB0Y2JjKCkgd2hlbiBpbnB1dCBvcg0KKyAgICAgIG91cHV0IGRhdGEgaXMgbm9uLWFsaWduZWQgYnkgZmFsbGluZyBiYWNrIHRvIHRoZSBzb2Z0d2FyZQ0KKyAgICAgIGltcGxlbWVudGF0aW9uLCBhcyBWSUEgTmVoZW1pYWggY2Fubm90IGhhbmRsZSBub24tYWxpZ25lZCBidWZmZXJzDQorICAgICogRml4ZWQgYSBtZW1vcnkgbGVhayBpbiB4NTA5cGFyc2VfY3J0KCkgd2hpY2ggd2FzIHJlcG9ydGVkIGJ5IEdyZWcNCisgICAgICBSb2Jzb24tR2FydGg7IHNvbWUgeDUwOXdyaXRlLmMgZml4ZXMgYnkgUGFzY2FsIFZpemVsaSwgdGhhbmtzIHRvDQorICAgICAgTWF0dGhldyBQYWdlIHdobyByZXBvcnRlZCBzZXZlcmFsIGJ1Z3MNCisgICAgKiBGaXhlZCB4NTA5X2dldF9leHQoKSB0byBhY2NlcHQgc29tZSByYXJlIGNlcnRpZmljYXRlcyB3aGljaCBoYXZlDQorICAgICAgYW4gSU5URUdFUiBpbnN0ZWFkIG9mIGEgQk9PTEVBTiBmb3IgQmFzaWNDb25zdHJhaW50czo6Y0EuDQorICAgICogQWRkZWQgc3VwcG9ydCBvbiB0aGUgY2xpZW50IHNpZGUgZm9yIHRoZSBUTFMgImhvc3RuYW1lIiBleHRlbnNpb24NCisgICAgICAocGF0Y2ggY29udHJpYnV0ZWQgYnkgRGF2aWQgUGF0aW5vKQ0KKyAgICAqIE1ha2UgeDUwOXBhcnNlX3ZlcmlmeSgpIHJldHVybiBCQURDRVJUX0NOX01JU01BVENIIHdoZW4gYW4gZW1wdHkNCisgICAgICBzdHJpbmcgaXMgcGFzc2VkIGFzIHRoZSBDTiAoYnVnIHJlcG9ydGVkIGJ5IHNwb29meSkNCisgICAgKiBBZGRlZCBhbiBvcHRpb24gdG8gZW5hYmxlL2Rpc2FibGUgdGhlIEJOIGFzc2VtYmx5IGNvZGUNCisgICAgKiBVcGRhdGVkIHJzYV9jaGVja19wcml2a2V5KCkgdG8gdmVyaWZ5IHRoYXQgKEQqRSkgPSAxICUgKFAtMSkqKFEtMSkNCisgICAgKiBEaXNhYmxlZCBvYnNvbGV0ZSBoYXNoIGZ1bmN0aW9ucyBieSBkZWZhdWx0IChNRDIsIE1ENCk7IHVwZGF0ZWQNCisgICAgICBzZWxmdGVzdCBhbmQgYmVuY2htYXJrIHRvIG5vdCB0ZXN0IGNpcGhlcnMgdGhhdCBoYXZlIGJlZW4gZGlzYWJsZWQNCisgICAgKiBVcGRhdGVkIHg1MDlwYXJzZV9jZXJ0X2luZm8oKSB0byBjb3JyZWN0bHkgZGlzcGxheSBieXRlIDAgb2YgdGhlDQorICAgICAgc2VyaWFsIG51bWJlciwgc2V0dXAgY29ycmVjdCBzZXJ2ZXIgcG9ydCBpbiB0aGUgc3NsIGNsaWVudCBleGFtcGxlDQorICAgICogRml4ZWQgYSBjcml0aWNhbCBkZW5pYWwtb2Ytc2VydmljZSB3aXRoIFguNTA5IGNlcnQuIHZlcmlmaWNhdGlvbjoNCisgICAgICBwZWVyIG1heSBjYXVzZSB4eXNzbCB0byBsb29wIGluZGVmaW5pdGVseSBieSBzZW5kaW5nIGEgY2VydGlmaWNhdGUNCisgICAgICBmb3Igd2hpY2ggdGhlIFJTQSBzaWduYXR1cmUgY2hlY2sgZmFpbHMgKGJ1ZyByZXBvcnRlZCBieSBCZW5vaXQpDQorICAgICogQWRkZWQgdGVzdCB2ZWN0b3JzIGZvcjogQUVTLUNCQywgQUVTLUNGQiwgREVTLUNCQyBhbmQgM0RFUy1DQkMsDQorICAgICAgSE1BQy1NRDUsIEhNQUMtU0hBMSwgSE1BQy1TSEEtMjU2LCBITUFDLVNIQS0zODQsIGFuZCBITUFDLVNIQS01MTINCisgICAgKiBGaXhlZCBITUFDLVNIQS0zODQgYW5kIEhNQUMtU0hBLTUxMiAodGhhbmtzIHRvIEpvc2ggU2lueWtpbikNCisgICAgKiBNb2RpZmllZCBzc2xfcGFyc2VfY2xpZW50X2tleV9leGNoYW5nZSgpIHRvIHByb3RlY3QgYWdhaW5zdA0KKyAgICAgIERhbmllbCBCbGVpY2hlbmJhY2hlciBhdHRhY2sgb24gUEtDUyMxIHYxLjUgcGFkZGluZywgYXMgd2VsbA0KKyAgICAgIGFzIHRoZSBLbGltYS1Qb2tvcm55LVJvc2EgZXh0ZW5zaW9uIG9mIEJsZWljaGVuYmFjaGVyJ3MgYXR0YWNrDQorICAgICogVXBkYXRlZCByc2FfZ2VuX2tleSgpIHNvIHRoYXQgY3R4LT5OIGlzIGFsd2F5cyBuYml0cyBpbiBzaXplDQorICAgICogRml4ZWQgYXNzZW1ibHkgUFBDIGNvbXBpbGF0aW9uIGVycm9ycyBvbiBNYWMgT1MgWCwgdGhhbmtzIHRvDQorICAgICAgRGF2aWQgQmFycmV0dCBhbmQgRHVzYW4gU2VtZW4NCisNCis9IFZlcnNpb24gMC44IHJlbGVhc2VkIG9uIDIwMDctMTAtMjANCisNCisgICAgKiBNb2RpZmllZCB0aGUgSE1BQyBmdW5jdGlvbnMgdG8gaGFuZGxlIGtleXMgbGFyZ2VyDQorICAgICAgdGhhbiA2NCBieXRlcywgdGhhbmtzIHRvIFN0ZXBoYW5lIERlc25ldXggYW5kIGdhcnkgbmcNCisgICAgKiBGaXhlZCBzc2xfcmVhZF9yZWNvcmQoKSB0byBwcm9wZXJseSB1cGRhdGUgdGhlIGhhbmRzaGFrZQ0KKyAgICAgIG1lc3NhZ2UgZGlnZXN0cywgd2hpY2ggZml4ZXMgSUU2L0lFNyBjbGllbnQgYXV0aGVudGljYXRpb24NCisgICAgKiBDbGVhbmVkIHVwIHRoZSBYWVNTTCogI2RlZmluZXMsIHN1Z2dlc3RlZCBieSBBenJpZWwgRmFzdGVuDQorICAgICogRml4ZWQgbmV0X3JlY3YoKSwgdGhhbmtzIHRvIExvcmVueiBTY2hvcmkgYW5kIEVnb24gS29jamFuDQorICAgICogQWRkZWQgdXNlci1kZWZpbmVkIGNhbGxiYWNrcyBmb3IgaGFuZGxpbmcgSS9PIGFuZCBzZXNzaW9ucw0KKyAgICAqIEFkZGVkIGxvdHMgb2YgZGVidWdnaW5nIG91dHB1dCBpbiB0aGUgU1NML1RMUyBmdW5jdGlvbnMNCisgICAgKiBBZGRlZCBwcmVsaW1pbmFyeSBYLjUwOSBjZXJ0LiB3cml0aW5nIGJ5IFBhc2NhbCBWaXplbGkNCisgICAgKiBBZGRlZCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB0aGUgVklBIFBhZExvY2sgcm91dGluZXMNCisgICAgKiBBZGRlZCBBRVMtQ0ZCIG1vZGUgb2Ygb3BlcmF0aW9uLCBjb250cmlidXRlZCBieSBjaG1pa2UNCisgICAgKiBBZGRlZCBhbiBTU0wvVExTIHN0cmVzcyB0ZXN0aW5nIHByb2dyYW0gKHNzbF90ZXN0LmMpDQorICAgICogVXBkYXRlZCB0aGUgUlNBIFBLQ1MjMSBjb2RlIHRvIGFsbG93IGNob29zaW5nIGJldHdlZW4NCisgICAgICBSU0FfUFVCTElDIGFuZCBSU0FfUFJJVkFURSwgYXMgc3VnZ2VzdGVkIGJ5IERhdmlkIEJhcnJldHQNCisgICAgKiBVcGRhdGVkIHNzbF9yZWFkKCkgdG8gc2tpcCAwLWxlbmd0aCByZWNvcmRzIGZyb20gT3BlblNTTA0KKyAgICAqIEZpeGVkIHRoZSBtYWtlIGluc3RhbGwgdGFyZ2V0IHRvIGNvbXBseSB3aXRoICpCU0QgbWFrZQ0KKyAgICAqIEZpeGVkIGEgYnVnIGluIG1waV9yZWFkX2JpbmFyeSgpIG9uIDY0LWJpdCBwbGF0Zm9ybXMNCisgICAgKiBtcGlfaXNfcHJpbWUoKSBzcGVlZHVwcywgdGhhbmtzIHRvIEtldmluIE1jTGF1Z2hsaW4NCisgICAgKiBGaXhlZCBhIGxvbmcgc3RhbmRpbmcgbWVtb3J5IGxlYWsgaW4gbXBpX2lzX3ByaW1lKCkNCisgICAgKiBSZXBsYWNlZCByZWFsbG9jIHdpdGggbWFsbG9jIGluIG1waV9ncm93KCksIGFuZCBzZXQNCisgICAgICB0aGUgc2lnbiBvZiB6ZXJvIGFzIHBvc2l0aXZlIGluIG1waV9pbml0KCkgKHJlcG9ydGVkDQorICAgICAgYnkgSm9uYXRoYW4gTS4gTWNDdW5lKQ0KKw0KKz0gVmVyc2lvbiAwLjcgcmVsZWFzZWQgb24gMjAwNy0wNy0wNw0KKw0KKyAgICAqIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBNaWNyb0JsYXplIHNvZnQtY29yZSBwcm9jZXNzb3INCisgICAgKiBGaXhlZCBhIGJ1ZyBpbiBzc2xfdGxzLmMgd2hpY2ggc29tZXRpbWVzIHByZXZlbnRlZCBTU0wNCisgICAgICBjb25uZWN0aW9ucyBmcm9tIGJlaW5nIGVzdGFibGlzaGVkIHdpdGggbm9uLWJsb2NraW5nIEkvTw0KKyAgICAqIEZpeGVkIGEgY291cGxlIGJ1Z3MgaW4gdGhlIFZTNiBhbmQgVU5JWCBNYWtlZmlsZXMNCisgICAgKiBGaXhlZCB0aGUgIlBJQyByZWdpc3RlciBlYnggY2xvYmJlcmVkIGluIGFzbSIgYnVnDQorICAgICogQWRkZWQgSE1BQyBzdGFydHMvdXBkYXRlL2ZpbmlzaCBzdXBwb3J0IGZ1bmN0aW9ucw0KKyAgICAqIEFkZGVkIHRoZSBTSEEtMjI0LCBTSEEtMzg0IGFuZCBTSEEtNTEyIGhhc2ggZnVuY3Rpb25zDQorICAgICogRml4ZWQgdGhlIG5ldF9zZXRfKmJsb2NrIHJvdXRpbmVzLCB0aGFua3MgdG8gQW5kcmVhcw0KKyAgICAqIEFkZGVkIGEgZmV3IGRlbW9uc3RyYXRpb24gcHJvZ3JhbXM6IG1kNXN1bSwgc2hhMXN1bSwNCisgICAgICBkaF9jbGllbnQsIGRoX3NlcnZlciwgcnNhX2dlbmtleSwgcnNhX3NpZ24sIHJzYV92ZXJpZnkNCisgICAgKiBBZGRlZCBuZXcgYmlnbnVtIGltcG9ydCBhbmQgZXhwb3J0IGhlbHBlciBmdW5jdGlvbnMNCisgICAgKiBSZXdyb3RlIFJFQURNRS50eHQgaW4gcHJvZ3JhbS9zc2wvY2EgdG8gYmV0dGVyIGV4cGxhaW4NCisgICAgICBob3cgdG8gY3JlYXRlIGEgdGVzdCBQS0kNCisNCis9IFZlcnNpb24gMC42IHJlbGVhc2VkIG9uIDIwMDctMDQtMDENCisNCisgICAgKiBDaXBoZXJzIHVzZWQgaW4gU1NML1RMUyBjYW4gbm93IGJlIGRpc2FibGVkIGF0IGNvbXBpbGUNCisgICAgICB0aW1lLCB0byByZWR1Y2UgdGhlIG1lbW9yeSBmb290cHJpbnQgb24gZW1iZWRkZWQgc3lzdGVtcw0KKyAgICAqIEFkZGVkIG11bHRpcGx5IGFzc2VtYmx5IGNvZGUgZm9yIHRoZSBUcmlDb3JlIGFuZCBtb2RpZmllZA0KKyAgICAgIGhhdmVnZV9zdHJ1Y3QgZm9yIHRoaXMgcHJvY2Vzc29yLCB0aGFua3MgdG8gRGF2aWQgUGF0afFvDQorICAgICogQWRkZWQgbXVsdGlwbHkgYXNzZW1ibHkgY29kZSBmb3IgNjQtYml0IFBvd2VyUENzLA0KKyAgICAgIHRoYW5rcyB0byBQZWtpbmcgVW5pdmVyc2l0eSBhbmQgdGhlIE9TVSBPcGVuIFNvdXJjZSBMYWINCisgICAgKiBBZGRlZCBleHBlcmltZW50YWwgc3VwcG9ydCBvZiBRdWFudHVtIENyeXB0b2dyYXBoeQ0KKyAgICAqIEFkZGVkIHN1cHBvcnQgZm9yIGF1dG9jb25mLCBjb250cmlidXRlZCBieSBBcm5hdWQgQ29ybmV0DQorICAgICogRml4ZWQgImxvbmcgbG9uZyIgY29tcGlsYXRpb24gaXNzdWVzIG9uIElBLTY0IGFuZCBQUEM2NA0KKyAgICAqIEZpeGVkIGEgYnVnIGludHJvZHVjZWQgaW4geHlzc2wtMC41L3RpbWluZy5jOiBoYXJkY2xvY2sNCisgICAgICB3YXMgbm90IGJlaW5nIGNvcnJlY3RseSBkZWZpbmVkIG9uIEFSTSBhbmQgTUlQUw0KKw0KKz0gVmVyc2lvbiAwLjUgcmVsZWFzZWQgb24gMjAwNy0wMy0wMQ0KKw0KKyAgICAqIEFkZGVkIG11bHRpcGx5IGFzc2VtYmx5IGNvZGUgZm9yIFNQQVJDIGFuZCBBbHBoYQ0KKyAgICAqIEFkZGVkIChiZXRhKSBzdXBwb3J0IGZvciBub24tYmxvY2tpbmcgSS9PIG9wZXJhdGlvbnMNCisgICAgKiBJbXBsZW1lbnRlZCBzZXNzaW9uIHJlc3VtaW5nIGFuZCBjbGllbnQgYXV0aGVudGljYXRpb24NCisgICAgKiBGaXhlZCBzb21lIHBvcnRhYmlsaXR5IGlzc3VlcyBvbiBXaW5DRSwgTUlOSVggMywgUGxhbjkNCisgICAgICAodGhhbmtzIHRvIEJlbmphbWluIE5ld21hbiksIEhQLVVYLCBGcmVlQlNEIGFuZCBTb2xhcmlzDQorICAgICogSW1wcm92ZWQgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBFREgga2V5IGV4Y2hhbmdlDQorICAgICogRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgdmFsaWQgcGFja2V0cyB3aXRoIGEgcGF5bG9hZA0KKyAgICAgIHNpemUgb2YgMTYzODQgYnl0ZXMgdG8gYmUgcmVqZWN0ZWQNCisNCis9IFZlcnNpb24gMC40IHJlbGVhc2VkIG9uIDIwMDctMDItMDENCisNCisgICAgKiBBZGRlZCBzdXBwb3J0IGZvciBFcGhlbWVyYWwgRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlDQorICAgICogQWRkZWQgbXVsdGlwbHkgYXNtIGNvZGUgZm9yIFNTRTIsIEFSTSwgUFBDLCBNSVBTIGFuZCBNNjhLDQorICAgICogVmFyaW91cyBpbXByb3ZlbWVudCB0byB0aGUgbW9kdWxhciBleHBvbmVudGlhdGlvbiBjb2RlDQorICAgICogUmV3cm90ZSB0aGUgaGVhZGVycyB0byBnZW5lcmF0ZSB0aGUgQVBJIGRvY3Mgd2l0aCBkb3h5Z2VuDQorICAgICogRml4ZWQgYSBidWcgaW4gc3NsX2VuY3J5cHRfYnVmIChpbmNvcnJlY3QgcGFkZGluZyB3YXMNCisgICAgICBnZW5lcmF0ZWQpIGFuZCBpbiBzc2xfcGFyc2VfY2xpZW50X2hlbGxvIChtYXguIGNsaWVudA0KKyAgICAgIHZlcnNpb24gd2FzIG5vdCBwcm9wZXJseSBzZXQpLCB0aGFua3MgdG8gRGlkaWVyIFJlYmVpeA0KKyAgICAqIEZpeGVkIGFub3RoZXIgYnVnIGluIHNzbF9wYXJzZV9jbGllbnRfaGVsbG86IGNsaWVudHMgd2l0aA0KKyAgICAgIGNpcGhlcmxpc3RzIGxhcmdlciB0aGFuIDk2IGJ5dGVzIHdlcmUgaW5jb3JyZWN0bHkgcmVqZWN0ZWQNCisgICAgKiBGaXhlZCBhIGNvdXBsZSBtZW1vcnkgbGVhayBpbiB4NTA5X3JlYWQuYw0KKw0KKz0gVmVyc2lvbiAwLjMgcmVsZWFzZWQgb24gMjAwNy0wMS0wMQ0KKw0KKyAgICAqIEFkZGVkIHNlcnZlci1zaWRlIFNTTHYzIGFuZCBUTFN2MS4wIHN1cHBvcnQNCisgICAgKiBNdWx0aXBsZSBmaXhlcyB0byBlbmhhbmNlIHRoZSBjb21wYXRpYmlsaXR5IHdpdGggZysrLA0KKyAgICAgIHRoYW5rcyB0byBYb3PpIEFudPNuIE90ZXJvIEZlcnJlaXJhDQorICAgICogRml4ZWQgYSBidWcgaW4gdGhlIENCQyBjb2RlLCB0aGFua3MgdG8gZG93c3Q7IGFsc28sDQorICAgICAgdGhlIGJpZ251bSBjb2RlIGlzIG5vIGxvbmdlciBkZXBlbmRhbnQgb24gbG9uZyBsb25nDQorICAgICogVXBkYXRlZCByc2FfcGtjczFfc2lnbiB0byBoYW5kbGUgYXJiaXRyYXJ5IGxhcmdlIGlucHV0cw0KKyAgICAqIFVwZGF0ZWQgdGltaW5nLmMgZm9yIGltcHJvdmVkIGNvbXBhdGliaWxpdHkgd2l0aCBpMzg2DQorICAgICAgYW5kIDQ4NiBwcm9jZXNzb3JzLCB0aGFua3MgdG8gQXJuYXVkIENvcm5ldA0KKw0KKz0gVmVyc2lvbiAwLjIgcmVsZWFzZWQgb24gMjAwNi0xMi0wMQ0KKw0KKyAgICAqIFVwZGF0ZWQgdGltaW5nLmMgdG8gc3VwcG9ydCBBUk0gYW5kIE1JUFMgYXJjaA0KKyAgICAqIFVwZGF0ZWQgdGhlIE1QSSBjb2RlIHRvIHN1cHBvcnQgODA4NiBvbiBNU1ZDIDEuNQ0KKyAgICAqIEFkZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGF0IHRoZSB0b3Agb2YgaGF2ZWdlLmgNCisgICAgKiBGaXhlZCBhIGJ1ZyBpbiBzaGEyX2htYWMsIHRoYW5rcyB0byBuZXdzb2Z0L1dlbmZhbmcgWmhhbmcNCisgICAgKiBGaXhlZCBhIGJ1ZyByZXBvcnRlZCBieSBBZHJpYW4gUvxlZ3NlZ2dlciBpbiB4NTA5X3JlYWRfa2V5DQorICAgICogRml4ZWQgYSBidWcgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYXV0ZXIgaW4gc3NsX3JlYWRfcmVjb3JkDQorICAgICogRml4ZWQgYSBidWcgaW4gcnNhX2NoZWNrX3ByaXZrZXkgdGhhdCB3b3VsZCB3cm9uZ2x5IGNhdXNlDQorICAgICAgdmFsaWQgUlNBIGtleXMgdG8gYmUgZGlzbWlzc2VkICh0aGFua3MgdG8gb2xkd29sZikNCisgICAgKiBGaXhlZCBhIGJ1ZyBpbiBtcGlfaXNfcHJpbWUgdGhhdCBjYXVzZWQgc29tZSBwcmltZXMgdG8gZmFpbA0KKyAgICAgIHRoZSBNaWxsZXItUmFiaW4gcHJpbWFsaXR5IHRlc3QNCisNCisgICAgSSdkIGFsc28gbGlrZSB0byB0aGFuayBZb3Vu6HMgSGFmcmkgZm9yIHRoZSBDUlVYIGxpbnV4IHBvcnQsDQorICAgIEtoYWxpbCBQZXRpdCB3aG8gYWRkZWQgWHlTU0wgaW50byBwa2dzcmMgYW5kIEFybmF1ZCBDb3JuZXQNCisgICAgd2hvIG1haW50YWlucyB0aGUgRGViaWFuIHBhY2thZ2UgOi0pDQorDQorPSBWZXJzaW9uIDAuMSByZWxlYXNlZCBvbiAyMDA2LTExLTAxDQorDQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWVlMDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUKQEAgLTAsMCArMSwzMCBAQAorCitERVNURElSPS91c3IvbG9jYWwKK1BSRUZJWD14eXNzbF8KKworLlNJTEVOVDoKKworYWxsOgorCWNkIGxpYnJhcnkgICYmIG1ha2UgYWxsICYmIGNkIC4uCisJY2QgcHJvZ3JhbXMgJiYgbWFrZSBhbGwgJiYgY2QgLi4KKworaW5zdGFsbDoKKwlta2RpciAtcCAkKERFU1RESVIpL2luY2x1ZGUveHlzc2wKKwljcCAtciBpbmNsdWRlL3h5c3NsICQoREVTVERJUikvaW5jbHVkZQorCQorCW1rZGlyIC1wICQoREVTVERJUikvbGliCisJY3AgbGlicmFyeS9saWJ4eXNzbC4qICQoREVTVERJUikvbGliCisJCisJbWtkaXIgLXAgJChERVNURElSKS9iaW4KKwlmb3IgcCBpbiBwcm9ncmFtcy8qLyogOyBkbyAgICAgICAgICAgICAgXAorCSAgICBpZiBbIC14ICQkcCBdICYmIFsgISAtZCAkJHAgXSA7ICAgICBcCisJICAgIHRoZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgIGY9JChQUkVGSVgpYGJhc2VuYW1lICQkcGAgOyAgICAgXAorCSAgICAgICAgY3AgJCRwICQoREVTVERJUikvYmluLyQkZiA7ICAgICBcCisJICAgIGZpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkb25lCisKK2NsZWFuOgorCWNkIGxpYnJhcnkgICYmIG1ha2UgY2xlYW4gJiYgY2QgLi4KKwljZCBwcm9ncmFtcyAmJiBtYWtlIGNsZWFuICYmIGNkIC4uCisKZGlmZiAtLWdpdCBhL1h5U1NMLnBuZyBiL1h5U1NMLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjMxYTNiCi0tLSAvZGV2L251bGwKKysrIGIvWHlTU0wucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvaW5kZW50LnNoIGIvY29udHJpYi9pbmRlbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWUyYTZkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvaW5kZW50LnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL2Jpbi9zaAorCitpbmRlbnQgLS1ibGFuay1saW5lcy1hZnRlci1kZWNsYXJhdGlvbnMgICAgICAgICBcCisgICAgICAgLS1ibGFuay1saW5lcy1hZnRlci1wcm9jZWR1cmVzICAgICAgICAgICBcCisgICAgICAgLS1zd2FsbG93LW9wdGlvbmFsLWJsYW5rLWxpbmVzICAgICAgICAgICBcCisgICAgICAgLS1ibGFuay1saW5lcy1iZWZvcmUtYmxvY2stY29tbWVudHMgICAgICBcCisgICAgICAgLS1mb3JtYXQtYWxsLWNvbW1lbnRzICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1mb3JtYXQtZmlyc3QtY29sdW1uLWNvbW1lbnRzICAgICAgICAgICBcCisgICAgICAgLS1jb21tZW50LWRlbGltaXRlcnMtb24tYmxhbmstbGluZXMgICAgICBcCisgICAgICAgLS1zdGFydC1sZWZ0LXNpZGUtb2YtY29tbWVudHMgICAgICAgICAgICBcCisgICAgICAgLS1icmFjZXMtYWZ0ZXItaWYtbGluZSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1icmFjZXMtYWZ0ZXItc3RydWN0LWRlY2wtbGluZSAgICAgICAgICBcCisgICAgICAgLS1icmFjZS1pbmRlbnQgMCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1kb250LWN1ZGRsZS1lbHNlICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1kb250LWN1ZGRsZS1kby13aGlsZSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1jYXNlLWluZGVudGF0aW9uIDQgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1jYXNlLWJyYWNlLWluZGVudGF0aW9uIDAgICAgICAgICAgICAgICBcCisgICAgICAgLS1kb250LXNwYWNlLXNwZWNpYWwtc2VtaWNvbG9uICAgICAgICAgICBcCisgICAgICAgLS1uby1zcGFjZS1hZnRlci1mdW5jdGlvbi1jYWxsLW5hbWVzICAgICBcCisgICAgICAgLS1uby1zcGFjZS1hZnRlci1jYXN0cyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1uby1zcGFjZS1hZnRlci1mb3IgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1uby1zcGFjZS1hZnRlci1pZiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1uby1zcGFjZS1hZnRlci13aGlsZSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1zcGFjZS1hZnRlci1wYXJlbnRoZXNlcyAgICAgICAgICAgICAgICBcCisgICAgICAgLS1uby1ibGFuay1saW5lcy1hZnRlci1jb21tYXMgICAgICAgICAgICBcCisgICAgICAgLS1icmVhay1mdW5jdGlvbi1kZWNsLWFyZ3MgICAgICAgICAgICAgICBcCisgICAgICAgLS1kb250LWJyZWFrLWZ1bmN0aW9uLWRlY2wtYXJncy1lbmQgICAgICBcCisgICAgICAgLS1kb250LWJyZWFrLXByb2NlZHVyZS10eXBlICAgICAgICAgICAgICBcCisgICAgICAgLS1pbmRlbnQtbGV2ZWwgNCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLS1jb250aW51ZS1hdC1wYXJlbnRoZXNlcyAgICAgICAgICAgICAgICBcCisgICAgICAgIiRAIgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL2Flcy5oIGIvaW5jbHVkZS9wb2xhcnNzbC9hZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWY3ODUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wb2xhcnNzbC9hZXMuaApAQCAtMCwwICsxLDEwMyBAQAorLyoqCisgKiBcZmlsZSBhZXMuaAorICovCisjaWZuZGVmIFhZU1NMX0FFU19ICisjZGVmaW5lIFhZU1NMX0FFU19ICisKKyNkZWZpbmUgQUVTX0VOQ1JZUFQgICAgIDEKKyNkZWZpbmUgQUVTX0RFQ1JZUFQgICAgIDAKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQUVTIGNvbnRleHQgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IG5yOyAgICAgICAgICAgICAgICAgICAgIC8qITwgIG51bWJlciBvZiByb3VuZHMgICovCisgICAgdW5zaWduZWQgbG9uZyAqcms7ICAgICAgICAgIC8qITwgIEFFUyByb3VuZCBrZXlzICAgICovCisgICAgdW5zaWduZWQgbG9uZyBidWZbNjhdOyAgICAgIC8qITwgIHVuYWxpZ25lZCBkYXRhICAgICovCit9CithZXNfY29udGV4dDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxicmllZiAgICAgICAgICBBRVMga2V5IHNjaGVkdWxlIChlbmNyeXB0aW9uKQorICoKKyAqIFxwYXJhbSBjdHggICAgICBBRVMgY29udGV4dCB0byBiZSBpbml0aWFsaXplZAorICogXHBhcmFtIGtleSAgICAgIGVuY3J5cHRpb24ga2V5CisgKiBccGFyYW0ga2V5c2l6ZSAgbXVzdCBiZSAxMjgsIDE5MiBvciAyNTYKKyAqLwordm9pZCBhZXNfc2V0a2V5X2VuYyggYWVzX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5c2l6ZSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBBRVMga2V5IHNjaGVkdWxlIChkZWNyeXB0aW9uKQorICoKKyAqIFxwYXJhbSBjdHggICAgICBBRVMgY29udGV4dCB0byBiZSBpbml0aWFsaXplZAorICogXHBhcmFtIGtleSAgICAgIGRlY3J5cHRpb24ga2V5CisgKiBccGFyYW0ga2V5c2l6ZSAgbXVzdCBiZSAxMjgsIDE5MiBvciAyNTYKKyAqLwordm9pZCBhZXNfc2V0a2V5X2RlYyggYWVzX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5c2l6ZSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBBRVMtRUNCIGJsb2NrIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICoKKyAqIFxwYXJhbSBjdHggICAgICBBRVMgY29udGV4dAorICogXHBhcmFtIG1vZGUgICAgIEFFU19FTkNSWVBUIG9yIEFFU19ERUNSWVBUCisgKiBccGFyYW0gaW5wdXQgICAgMTYtYnl0ZSBpbnB1dCBibG9jaworICogXHBhcmFtIG91dHB1dCAgIDE2LWJ5dGUgb3V0cHV0IGJsb2NrCisgKi8KK3ZvaWQgYWVzX2NyeXB0X2VjYiggYWVzX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5wdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQUVTLUNCQyBidWZmZXIgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKgorICogXHBhcmFtIGN0eCAgICAgIEFFUyBjb250ZXh0CisgKiBccGFyYW0gbW9kZSAgICAgQUVTX0VOQ1JZUFQgb3IgQUVTX0RFQ1JZUFQKKyAqIFxwYXJhbSBsZW5ndGggICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBpdiAgICAgICBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKHVwZGF0ZWQgYWZ0ZXIgdXNlKQorICogXHBhcmFtIGlucHV0ICAgIGJ1ZmZlciBob2xkaW5nIHRoZSBpbnB1dCBkYXRhCisgKiBccGFyYW0gb3V0cHV0ICAgYnVmZmVyIGhvbGRpbmcgdGhlIG91dHB1dCBkYXRhCisgKi8KK3ZvaWQgYWVzX2NyeXB0X2NiYyggYWVzX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIEFFUy1DRkIxMjggYnVmZmVyIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICoKKyAqIFxwYXJhbSBjdHggICAgICBBRVMgY29udGV4dAorICogXHBhcmFtIG1vZGUgICAgIEFFU19FTkNSWVBUIG9yIEFFU19ERUNSWVBUCisgKiBccGFyYW0gbGVuZ3RoICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgKiBccGFyYW0gaXZfb2ZmICAgb2Zmc2V0IGluIElWICh1cGRhdGVkIGFmdGVyIHVzZSkKKyAqIFxwYXJhbSBpdiAgICAgICBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKHVwZGF0ZWQgYWZ0ZXIgdXNlKQorICogXHBhcmFtIGlucHV0ICAgIGJ1ZmZlciBob2xkaW5nIHRoZSBpbnB1dCBkYXRhCisgKiBccGFyYW0gb3V0cHV0ICAgYnVmZmVyIGhvbGRpbmcgdGhlIG91dHB1dCBkYXRhCisgKi8KK3ZvaWQgYWVzX2NyeXB0X2NmYjEyOCggYWVzX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqaXZfb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGl2WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBDaGVja3VwIHJvdXRpbmUKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciAxIGlmIHRoZSB0ZXN0IGZhaWxlZAorICovCitpbnQgYWVzX3NlbGZfdGVzdCggaW50IHZlcmJvc2UgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIGFlcy5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL2FyYzQuaCBiL2luY2x1ZGUvcG9sYXJzc2wvYXJjNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDc0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3BvbGFyc3NsL2FyYzQuaApAQCAtMCwwICsxLDUxIEBACisvKioKKyAqIFxmaWxlIGFyYzQuaAorICovCisjaWZuZGVmIFhZU1NMX0FSQzRfSAorI2RlZmluZSBYWVNTTF9BUkM0X0gKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQVJDNCBjb250ZXh0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAvKiE8IHBlcm11dGF0aW9uIGluZGV4ICovCisgICAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgcGVybXV0YXRpb24gaW5kZXggKi8KKyAgICB1bnNpZ25lZCBjaGFyIG1bMjU2XTsgICAgICAgLyohPCBwZXJtdXRhdGlvbiB0YWJsZSAqLworfQorYXJjNF9jb250ZXh0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgIEFSQzQga2V5IHNjaGVkdWxlCisgKgorICogXHBhcmFtIGN0eCAgICAgIEFSQzQgY29udGV4dCB0byBiZSBpbml0aWFsaXplZAorICogXHBhcmFtIGtleSAgICAgIHRoZSBzZWNyZXQga2V5CisgKiBccGFyYW0ga2V5bGVuICAgbGVuZ3RoIG9mIHRoZSBrZXkKKyAqLwordm9pZCBhcmM0X3NldHVwKCBhcmM0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIEFSQzQgY2lwaGVyIGZ1bmN0aW9uCisgKgorICogXHBhcmFtIGN0eCAgICAgIEFSQzQgY29udGV4dAorICogXHBhcmFtIGJ1ZiAgICAgIGJ1ZmZlciB0byBiZSBwcm9jZXNzZWQKKyAqIFxwYXJhbSBidWZsZW4gICBhbW91bnQgb2YgZGF0YSBpbiBidWYKKyAqLwordm9pZCBhcmM0X2NyeXB0KCBhcmM0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuICk7CisKKy8qCisgKiBcYnJpZWYgICAgICAgICAgQ2hlY2t1cCByb3V0aW5lCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBpZiB0aGUgdGVzdCBmYWlsZWQKKyAqLworaW50IGFyYzRfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogYXJjNC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL2Jhc2U2NC5oIGIvaW5jbHVkZS9wb2xhcnNzbC9iYXNlNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2FkODYzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wb2xhcnNzbC9iYXNlNjQuaApAQCAtMCwwICsxLDYyIEBACisvKioKKyAqIFxmaWxlIGJhc2U2NC5oCisgKi8KKyNpZm5kZWYgWFlTU0xfQkFTRTY0X0gKKyNkZWZpbmUgWFlTU0xfQkFTRTY0X0gKKworI2RlZmluZSBYWVNTTF9FUlJfQkFTRTY0X0JVRkZFUl9UT09fU01BTEwgICAgICAgICAgICAgICAtMHgwMDEwCisjZGVmaW5lIFhZU1NMX0VSUl9CQVNFNjRfSU5WQUxJRF9DSEFSQUNURVIgICAgICAgICAgICAgIC0weDAwMTIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxicmllZiAgICAgICAgICBFbmNvZGUgYSBidWZmZXIgaW50byBiYXNlNjQgZm9ybWF0CisgKgorICogXHBhcmFtIGRzdCAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogXHBhcmFtIGRsZW4gICAgIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogXHBhcmFtIHNyYyAgICAgIHNvdXJjZSBidWZmZXIKKyAqIFxwYXJhbSBzbGVuICAgICBhbW91bnQgb2YgZGF0YSB0byBiZSBlbmNvZGVkCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgWFlTU0xfRVJSX0JBU0U2NF9CVUZGRVJfVE9PX1NNQUxMLgorICogICAgICAgICAgICAgICAgICpkbGVuIGlzIGFsd2F5cyB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGFtb3VudAorICogICAgICAgICAgICAgICAgIG9mIGRhdGEgdGhhdCBoYXMgKG9yIHdvdWxkIGhhdmUpIGJlZW4gd3JpdHRlbi4KKyAqCisgKiBcbm90ZSAgICAgICAgICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggKmRsZW4gPSAwIHRvIG9idGFpbiB0aGUKKyAqICAgICAgICAgICAgICAgICByZXF1aXJlZCBidWZmZXIgc2l6ZSBpbiAqZGxlbgorICovCitpbnQgYmFzZTY0X2VuY29kZSggdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgKmRsZW4sCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgIHNsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgRGVjb2RlIGEgYmFzZTY0LWZvcm1hdHRlZCBidWZmZXIKKyAqCisgKiBccGFyYW0gZHN0ICAgICAgZGVzdGluYXRpb24gYnVmZmVyCisgKiBccGFyYW0gZGxlbiAgICAgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiBccGFyYW0gc3JjICAgICAgc291cmNlIGJ1ZmZlcgorICogXHBhcmFtIHNsZW4gICAgIGFtb3VudCBvZiBkYXRhIHRvIGJlIGRlY29kZWQKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBYWVNTTF9FUlJfQkFTRTY0X0JVRkZFUl9UT09fU01BTEwsIG9yCisgKiAgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0JBU0U2NF9JTlZBTElEX0RBVEEgaWYgdGhlIGlucHV0IGRhdGEgaXMgbm90CisgKiAgICAgICAgICAgICAgICAgY29ycmVjdC4gKmRsZW4gaXMgYWx3YXlzIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgYW1vdW50CisgKiAgICAgICAgICAgICAgICAgb2YgZGF0YSB0aGF0IGhhcyAob3Igd291bGQgaGF2ZSkgYmVlbiB3cml0dGVuLgorICoKKyAqIFxub3RlICAgICAgICAgICBDYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCAqZGxlbiA9IDAgdG8gb2J0YWluIHRoZQorICogICAgICAgICAgICAgICAgIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGluICpkbGVuCisgKi8KK2ludCBiYXNlNjRfZGVjb2RlKCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCAqZGxlbiwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmMsIGludCAgc2xlbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBDaGVja3VwIHJvdXRpbmUKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciAxIGlmIHRoZSB0ZXN0IGZhaWxlZAorICovCitpbnQgYmFzZTY0X3NlbGZfdGVzdCggaW50IHZlcmJvc2UgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIGJhc2U2NC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL2JpZ251bS5oIGIvaW5jbHVkZS9wb2xhcnNzbC9iaWdudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzIxNDEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wb2xhcnNzbC9iaWdudW0uaApAQCAtMCwwICsxLDQwNiBAQAorLyoqCisgKiBcZmlsZSBiaWdudW0uaAorICovCisjaWZuZGVmIFhZU1NMX0JJR05VTV9ICisjZGVmaW5lIFhZU1NMX0JJR05VTV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIFhZU1NMX0VSUl9NUElfRklMRV9JT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIC0weDAwMDIKKyNkZWZpbmUgWFlTU0xfRVJSX01QSV9CQURfSU5QVVRfREFUQSAgICAgICAgICAgICAgICAgICAgLTB4MDAwNAorI2RlZmluZSBYWVNTTF9FUlJfTVBJX0lOVkFMSURfQ0hBUkFDVEVSICAgICAgICAgICAgICAgICAtMHgwMDA2CisjZGVmaW5lIFhZU1NMX0VSUl9NUElfQlVGRkVSX1RPT19TTUFMTCAgICAgICAgICAgICAgICAgIC0weDAwMDgKKyNkZWZpbmUgWFlTU0xfRVJSX01QSV9ORUdBVElWRV9WQUxVRSAgICAgICAgICAgICAgICAgICAgLTB4MDAwQQorI2RlZmluZSBYWVNTTF9FUlJfTVBJX0RJVklTSU9OX0JZX1pFUk8gICAgICAgICAgICAgICAgICAtMHgwMDBDCisjZGVmaW5lIFhZU1NMX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgICAgICAgICAgICAgICAgICAgIC0weDAwMEUKKworI2RlZmluZSBNUElfQ0hLKGYpIGlmKCAoIHJldCA9IGYgKSAhPSAwICkgZ290byBjbGVhbnVwCisKKy8qCisgKiBEZWZpbmUgdGhlIGJhc2UgaW50ZWdlciB0eXBlLCBhcmNoaXRlY3R1cmUtd2lzZQorICovCisjaWYgZGVmaW5lZChYWVNTTF9IQVZFX0lOVDgpCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHRfaW50OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB0X2RibDsKKyNlbHNlCisjaWYgZGVmaW5lZChYWVNTTF9IQVZFX0lOVDE2KQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB0X2ludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdF9kYmw7CisjZWxzZQorICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdF9pbnQ7CisgICNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpCisgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB0X2RibDsKKyAgI2Vsc2UKKyAgICAjaWYgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgICAgfHwgXAorICAgICAgICBkZWZpbmVkKF9fcHBjNjRfXykgfHwgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSB8fCBcCisgICAgICAgIGRlZmluZWQoX19pYTY0X18pICB8fCBkZWZpbmVkKF9fYWxwaGFfXykKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCB0X2RibCBfX2F0dHJpYnV0ZV9fKChtb2RlKFRJKSkpOworICAgICNlbHNlCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdF9kYmw7CisgICAgI2VuZGlmCisgICNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTVBJIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBzOyAgICAgICAgICAgICAgLyohPCAgaW50ZWdlciBzaWduICAgICAgKi8KKyAgICBpbnQgbjsgICAgICAgICAgICAgIC8qITwgIHRvdGFsICMgb2YgbGltYnMgICovCisgICAgdF9pbnQgKnA7ICAgICAgICAgICAvKiE8ICBwb2ludGVyIHRvIGxpbWJzICAqLworfQorbXBpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgIEluaXRpYWxpemUgb25lIG9yIG1vcmUgbXBpCisgKi8KK3ZvaWQgbXBpX2luaXQoIG1waSAqWCwgLi4uICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFVuYWxsb2NhdGUgb25lIG9yIG1vcmUgbXBpCisgKi8KK3ZvaWQgbXBpX2ZyZWUoIG1waSAqWCwgLi4uICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIEVubGFyZ2UgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbGltYnMKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLAorICogICAgICAgICAgICAgICAgIDEgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCisgKi8KK2ludCBtcGlfZ3JvdyggbXBpICpYLCBpbnQgbmJsaW1icyApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBDb3B5IHRoZSBjb250ZW50cyBvZiBZIGludG8gWAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgMSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKyAqLworaW50IG1waV9jb3B5KCBtcGkgKlgsIG1waSAqWSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTd2FwIHRoZSBjb250ZW50cyBvZiBYIGFuZCBZCisgKi8KK3ZvaWQgbXBpX3N3YXAoIG1waSAqWCwgbXBpICpZICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNldCB2YWx1ZSBmcm9tIGludGVnZXIKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLAorICogICAgICAgICAgICAgICAgIDEgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCisgKi8KK2ludCBtcGlfbHNldCggbXBpICpYLCBpbnQgeiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBsZWFzdCBzaWduaWZpY2FudCBiaXRzCisgKi8KK2ludCBtcGlfbHNiKCBtcGkgKlggKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgbW9zdCBzaWduaWZpY2FudCBiaXRzCisgKi8KK2ludCBtcGlfbXNiKCBtcGkgKlggKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgUmV0dXJuIHRoZSB0b3RhbCBzaXplIGluIGJ5dGVzCisgKi8KK2ludCBtcGlfc2l6ZSggbXBpICpYICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIEltcG9ydCBmcm9tIGFuIEFTQ0lJIHN0cmluZworICoKKyAqIFxwYXJhbSBYICAgICAgICBkZXN0aW5hdGlvbiBtcGkKKyAqIFxwYXJhbSByYWRpeCAgICBpbnB1dCBudW1lcmljIGJhc2UKKyAqIFxwYXJhbSBzICAgICAgICBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJ1ZmZlcgorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGFuIFhZU1NMX0VSUl9NUElfWFhYIGVycm9yIGNvZGUKKyAqLworaW50IG1waV9yZWFkX3N0cmluZyggbXBpICpYLCBpbnQgcmFkaXgsIGNoYXIgKnMgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgRXhwb3J0IGludG8gYW4gQVNDSUkgc3RyaW5nCisgKgorICogXHBhcmFtIFggICAgICAgIHNvdXJjZSBtcGkKKyAqIFxwYXJhbSByYWRpeCAgICBvdXRwdXQgbnVtZXJpYyBiYXNlCisgKiBccGFyYW0gcyAgICAgICAgc3RyaW5nIGJ1ZmZlcgorICogXHBhcmFtIHNsZW4gICAgIHN0cmluZyBidWZmZXIgc2l6ZQorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGFuIFhZU1NMX0VSUl9NUElfWFhYIGVycm9yIGNvZGUKKyAqCisgKiBcbm90ZSAgICAgICAgICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggKnNsZW4gPSAwIHRvIG9idGFpbiB0aGUKKyAqICAgICAgICAgICAgICAgICBtaW5pbXVtIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGluICpzbGVuLgorICovCitpbnQgbXBpX3dyaXRlX3N0cmluZyggbXBpICpYLCBpbnQgcmFkaXgsIGNoYXIgKnMsIGludCAqc2xlbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBSZWFkIFggZnJvbSBhbiBvcGVuZWQgZmlsZQorICoKKyAqIFxwYXJhbSBYICAgICAgICBkZXN0aW5hdGlvbiBtcGkKKyAqIFxwYXJhbSByYWRpeCAgICBpbnB1dCBudW1lcmljIGJhc2UKKyAqIFxwYXJhbSBmaW4gICAgICBpbnB1dCBmaWxlIGhhbmRsZQorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGFuIFhZU1NMX0VSUl9NUElfWFhYIGVycm9yIGNvZGUKKyAqLworaW50IG1waV9yZWFkX2ZpbGUoIG1waSAqWCwgaW50IHJhZGl4LCBGSUxFICpmaW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgV3JpdGUgWCBpbnRvIGFuIG9wZW5lZCBmaWxlLCBvciBzdGRvdXQKKyAqCisgKiBccGFyYW0gcCAgICAgICAgcHJlZml4LCBjYW4gYmUgTlVMTAorICogXHBhcmFtIFggICAgICAgIHNvdXJjZSBtcGkKKyAqIFxwYXJhbSByYWRpeCAgICBvdXRwdXQgbnVtZXJpYyBiYXNlCisgKiBccGFyYW0gZm91dCAgICAgb3V0cHV0IGZpbGUgaGFuZGxlCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYW4gWFlTU0xfRVJSX01QSV9YWFggZXJyb3IgY29kZQorICoKKyAqIFxub3RlICAgICAgICAgICBTZXQgZm91dCA9PSBOVUxMIHRvIHByaW50IFggb24gdGhlIGNvbnNvbGUuCisgKi8KK2ludCBtcGlfd3JpdGVfZmlsZSggY2hhciAqcCwgbXBpICpYLCBpbnQgcmFkaXgsIEZJTEUgKmZvdXQgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgSW1wb3J0IFggZnJvbSB1bnNpZ25lZCBiaW5hcnkgZGF0YSwgYmlnIGVuZGlhbgorICoKKyAqIFxwYXJhbSBYICAgICAgICBkZXN0aW5hdGlvbiBtcGkKKyAqIFxwYXJhbSBidWYgICAgICBpbnB1dCBidWZmZXIKKyAqIFxwYXJhbSBidWZsZW4gICBpbnB1dCBidWZmZXIgc2l6ZQorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgMSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKyAqLworaW50IG1waV9yZWFkX2JpbmFyeSggbXBpICpYLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgRXhwb3J0IFggaW50byB1bnNpZ25lZCBiaW5hcnkgZGF0YSwgYmlnIGVuZGlhbgorICoKKyAqIFxwYXJhbSBYICAgICAgICBzb3VyY2UgbXBpCisgKiBccGFyYW0gYnVmICAgICAgb3V0cHV0IGJ1ZmZlcgorICogXHBhcmFtIGJ1ZmxlbiAgIG91dHB1dCBidWZmZXIgc2l6ZQorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgWFlTU0xfRVJSX01QSV9CVUZGRVJfVE9PX1NNQUxMIGlmIGJ1ZiBpc24ndCBsYXJnZSBlbm91Z2gKKyAqCisgKiBcbm90ZSAgICAgICAgICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggKmJ1ZmxlbiA9IDAgdG8gb2J0YWluIHRoZQorICogICAgICAgICAgICAgICAgIG1pbmltdW0gcmVxdWlyZWQgYnVmZmVyIHNpemUgaW4gKmJ1Zmxlbi4KKyAqLworaW50IG1waV93cml0ZV9iaW5hcnkoIG1waSAqWCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIExlZnQtc2hpZnQ6IFggPDw9IGNvdW50CisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwKKyAqICAgICAgICAgICAgICAgICAxIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAorICovCitpbnQgbXBpX3NoaWZ0X2woIG1waSAqWCwgaW50IGNvdW50ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFJpZ2h0LXNoaWZ0OiBYID4+PSBjb3VudAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgMSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKyAqLworaW50IG1waV9zaGlmdF9yKCBtcGkgKlgsIGludCBjb3VudCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBDb21wYXJlIHVuc2lnbmVkIHZhbHVlcworICoKKyAqIFxyZXR1cm4gICAgICAgICAxIGlmIHxYfCBpcyBncmVhdGVyIHRoYW4gfFl8LAorICogICAgICAgICAgICAgICAgLTEgaWYgfFh8IGlzIGxlc3NlciAgdGhhbiB8WXwgb3IKKyAqICAgICAgICAgICAgICAgICAwIGlmIHxYfCBpcyBlcXVhbCB0byB8WXwKKyAqLworaW50IG1waV9jbXBfYWJzKCBtcGkgKlgsIG1waSAqWSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBDb21wYXJlIHNpZ25lZCB2YWx1ZXMKKyAqCisgKiBccmV0dXJuICAgICAgICAgMSBpZiBYIGlzIGdyZWF0ZXIgdGhhbiBZLAorICogICAgICAgICAgICAgICAgLTEgaWYgWCBpcyBsZXNzZXIgIHRoYW4gWSBvcgorICogICAgICAgICAgICAgICAgIDAgaWYgWCBpcyBlcXVhbCB0byBZCisgKi8KK2ludCBtcGlfY21wX21waSggbXBpICpYLCBtcGkgKlkgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQ29tcGFyZSBzaWduZWQgdmFsdWVzCisgKgorICogXHJldHVybiAgICAgICAgIDEgaWYgWCBpcyBncmVhdGVyIHRoYW4geiwKKyAqICAgICAgICAgICAgICAgIC0xIGlmIFggaXMgbGVzc2VyICB0aGFuIHogb3IKKyAqICAgICAgICAgICAgICAgICAwIGlmIFggaXMgZXF1YWwgdG8gegorICovCitpbnQgbXBpX2NtcF9pbnQoIG1waSAqWCwgaW50IHogKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgVW5zaWduZWQgYWRkaXRpb246IFggPSB8QXwgKyB8QnwKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLAorICogICAgICAgICAgICAgICAgIDEgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCisgKi8KK2ludCBtcGlfYWRkX2FicyggbXBpICpYLCBtcGkgKkEsIG1waSAqQiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBVbnNpZ25lZCBzdWJzdHJhY3Rpb246IFggPSB8QXwgLSB8QnwKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLAorICogICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9NUElfTkVHQVRJVkVfVkFMVUUgaWYgQiBpcyBncmVhdGVyIHRoYW4gQQorICovCitpbnQgbXBpX3N1Yl9hYnMoIG1waSAqWCwgbXBpICpBLCBtcGkgKkIgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgU2lnbmVkIGFkZGl0aW9uOiBYID0gQSArIEIKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLAorICogICAgICAgICAgICAgICAgIDEgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCisgKi8KK2ludCBtcGlfYWRkX21waSggbXBpICpYLCBtcGkgKkEsIG1waSAqQiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTaWduZWQgc3Vic3RyYWN0aW9uOiBYID0gQSAtIEIKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLAorICogICAgICAgICAgICAgICAgIDEgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCisgKi8KK2ludCBtcGlfc3ViX21waSggbXBpICpYLCBtcGkgKkEsIG1waSAqQiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTaWduZWQgYWRkaXRpb246IFggPSBBICsgYgorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgMSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKyAqLworaW50IG1waV9hZGRfaW50KCBtcGkgKlgsIG1waSAqQSwgaW50IGIgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgU2lnbmVkIHN1YnN0cmFjdGlvbjogWCA9IEEgLSBiCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwKKyAqICAgICAgICAgICAgICAgICAxIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAorICovCitpbnQgbXBpX3N1Yl9pbnQoIG1waSAqWCwgbXBpICpBLCBpbnQgYiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBCYXNlbGluZSBtdWx0aXBsaWNhdGlvbjogWCA9IEEgKiBCCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwKKyAqICAgICAgICAgICAgICAgICAxIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAorICovCitpbnQgbXBpX211bF9tcGkoIG1waSAqWCwgbXBpICpBLCBtcGkgKkIgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQmFzZWxpbmUgbXVsdGlwbGljYXRpb246IFggPSBBICogYgorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgMSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKyAqLworaW50IG1waV9tdWxfaW50KCBtcGkgKlgsIG1waSAqQSwgdF9pbnQgYiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBEaXZpc2lvbiBieSBtcGk6IEEgPSBRICogQiArIFIKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLAorICogICAgICAgICAgICAgICAgIDEgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLAorICogICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9NUElfRElWSVNJT05fQllfWkVSTyBpZiBCID09IDAKKyAqCisgKiBcbm90ZSAgICAgICAgICAgRWl0aGVyIFEgb3IgUiBjYW4gYmUgTlVMTC4KKyAqLworaW50IG1waV9kaXZfbXBpKCBtcGkgKlEsIG1waSAqUiwgbXBpICpBLCBtcGkgKkIgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgRGl2aXNpb24gYnkgaW50OiBBID0gUSAqIGIgKyBSCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwKKyAqICAgICAgICAgICAgICAgICAxIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCwKKyAqICAgICAgICAgICAgICAgICBYWVNTTF9FUlJfTVBJX0RJVklTSU9OX0JZX1pFUk8gaWYgYiA9PSAwCisgKgorICogXG5vdGUgICAgICAgICAgIEVpdGhlciBRIG9yIFIgY2FuIGJlIE5VTEwuCisgKi8KK2ludCBtcGlfZGl2X2ludCggbXBpICpRLCBtcGkgKlIsIG1waSAqQSwgaW50IGIgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTW9kdWxvOiBSID0gQSBtb2QgQgorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgMSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQsCisgKiAgICAgICAgICAgICAgICAgWFlTU0xfRVJSX01QSV9ESVZJU0lPTl9CWV9aRVJPIGlmIEIgPT0gMAorICovCitpbnQgbXBpX21vZF9tcGkoIG1waSAqUiwgbXBpICpBLCBtcGkgKkIgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTW9kdWxvOiByID0gQSBtb2QgYgorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgMSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQsCisgKiAgICAgICAgICAgICAgICAgWFlTU0xfRVJSX01QSV9ESVZJU0lPTl9CWV9aRVJPIGlmIGIgPT0gMAorICovCitpbnQgbXBpX21vZF9pbnQoIHRfaW50ICpyLCBtcGkgKkEsIGludCBiICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNsaWRpbmctd2luZG93IGV4cG9uZW50aWF0aW9uOiBYID0gQV5FIG1vZCBOCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwKKyAqICAgICAgICAgICAgICAgICAxIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCwKKyAqICAgICAgICAgICAgICAgICBYWVNTTF9FUlJfTVBJX0JBRF9JTlBVVF9EQVRBIGlmIE4gaXMgbmVnYXRpdmUgb3IgZXZlbgorICoKKyAqIFxub3RlICAgICAgICAgICBfUlIgaXMgdXNlZCB0byBhdm9pZCByZS1jb21wdXRpbmcgUipSIG1vZCBOIGFjcm9zcworICogICAgICAgICAgICAgICAgIG11bHRpcGxlIGNhbGxzLCB3aGljaCBzcGVlZHMgdXAgdGhpbmdzIGEgYml0LiBJdCBjYW4KKyAqICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gTlVMTCBpZiB0aGUgZXh0cmEgcGVyZm9ybWFuY2UgaXMgdW5uZWVkZWQuCisgKi8KK2ludCBtcGlfZXhwX21vZCggbXBpICpYLCBtcGkgKkEsIG1waSAqRSwgbXBpICpOLCBtcGkgKl9SUiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBHcmVhdGVzdCBjb21tb24gZGl2aXNvcjogRyA9IGdjZChBLCBCKQorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgMSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKyAqLworaW50IG1waV9nY2QoIG1waSAqRywgbXBpICpBLCBtcGkgKkIgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTW9kdWxhciBpbnZlcnNlOiBYID0gQV4tMSBtb2QgTgorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgICAgICAgICAgMSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQsCisgKiAgICAgICAgICAgICAgICAgWFlTU0xfRVJSX01QSV9CQURfSU5QVVRfREFUQSBpZiBOIGlzIG5lZ2F0aXZlIG9yIG5pbAorICogICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgaWYgQSBoYXMgbm8gaW52ZXJzZSBtb2QgTgorICovCitpbnQgbXBpX2ludl9tb2QoIG1waSAqWCwgbXBpICpBLCBtcGkgKk4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTWlsbGVyLVJhYmluIHByaW1hbGl0eSB0ZXN0CisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCAocHJvYmFibHkgcHJpbWUpLAorICogICAgICAgICAgICAgICAgIDEgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLAorICogICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgaWYgWCBpcyBub3QgcHJpbWUKKyAqLworaW50IG1waV9pc19wcmltZSggbXBpICpYLCBpbnQgKCpmX3JuZykodm9pZCAqKSwgdm9pZCAqcF9ybmcgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgUHJpbWUgbnVtYmVyIGdlbmVyYXRpb24KKyAqCisgKiBccGFyYW0gWCAgICAgICAgZGVzdGluYXRpb24gbXBpCisgKiBccGFyYW0gbmJpdHMgICAgcmVxdWlyZWQgc2l6ZSBvZiBYIGluIGJpdHMKKyAqIFxwYXJhbSBkaF9mbGFnICBpZiAxLCB0aGVuIChYLTEpLzIgd2lsbCBiZSBwcmltZSB0b28KKyAqIFxwYXJhbSBmX3JuZyAgICBSTkcgZnVuY3Rpb24KKyAqIFxwYXJhbSBwX3JuZyAgICBSTkcgcGFyYW1ldGVyCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCAocHJvYmFibHkgcHJpbWUpLAorICogICAgICAgICAgICAgICAgIDEgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLAorICogICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9NUElfQkFEX0lOUFVUX0RBVEEgaWYgbmJpdHMgaXMgPCAzCisgKi8KK2ludCBtcGlfZ2VuX3ByaW1lKCBtcGkgKlgsIGludCBuYml0cywgaW50IGRoX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgaW50ICgqZl9ybmcpKHZvaWQgKiksIHZvaWQgKnBfcm5nICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIENoZWNrdXAgcm91dGluZQorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgaWYgdGhlIHRlc3QgZmFpbGVkCisgKi8KK2ludCBtcGlfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogYmlnbnVtLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcG9sYXJzc2wvYm5fbXVsLmggYi9pbmNsdWRlL3BvbGFyc3NsL2JuX211bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTNlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3BvbGFyc3NsL2JuX211bC5oCkBAIC0wLDAgKzEsNzAwIEBACisvKioKKyAqIFxmaWxlIGJuX211bC5oCisgKi8KKy8qCisgKiAgICAgIE11bHRpcGx5IHNvdXJjZSB2ZWN0b3IgW3NdIHdpdGggYiwgYWRkIHJlc3VsdAorICogICAgICAgdG8gZGVzdGluYXRpb24gdmVjdG9yIFtkXSBhbmQgc2V0IGNhcnJ5IGMuCisgKgorICogICAgICBDdXJyZW50bHkgc3VwcG9ydHM6CisgKgorICogICAgICAgICAuIElBLTMyICgzODYrKSAgICAgICAgIC4gQU1ENjQgLyBFTTY0VAorICogICAgICAgICAuIElBLTMyIChTU0UyKSAgICAgICAgIC4gTW90b3JvbGEgNjgwMDAKKyAqICAgICAgICAgLiBQb3dlclBDLCAzMi1iaXQgICAgICAuIE1pY3JvQmxhemUKKyAqICAgICAgICAgLiBQb3dlclBDLCA2NC1iaXQgICAgICAuIFRyaUNvcmUKKyAqICAgICAgICAgLiBTUEFSQyB2OCAgICAgICAgICAgICAuIEFSTSB2MysKKyAqICAgICAgICAgLiBBbHBoYSAgICAgICAgICAgICAgICAuIE1JUFMzMgorICogICAgICAgICAuIEMsIGxvbmdsb25nICAgICAgICAgIC4gQywgZ2VuZXJpYworICovCisjaWZuZGVmIFhZU1NMX0JOX01VTF9ICisjZGVmaW5lIFhZU1NMX0JOX01VTF9ICisKKyNpbmNsdWRlICJ4eXNzbC9jb25maWcuaCIKKworI2lmIGRlZmluZWQoWFlTU0xfSEFWRV9BU00pCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorI2lmIGRlZmluZWQoX19pMzg2X18pCisKKyNkZWZpbmUgTVVMQUREQ19JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZsICAgJSVlYngsICUwICAgICAgIiA6ICI9bSIgKHQpKTsgIFwKKyAgICBhc20oICJtb3ZsICAgJTAsICUlZXNpICAgICAgIiA6OiAibSIgKHMpKTsgIFwKKyAgICBhc20oICJtb3ZsICAgJTAsICUlZWRpICAgICAgIiA6OiAibSIgKGQpKTsgIFwKKyAgICBhc20oICJtb3ZsICAgJTAsICUlZWN4ICAgICAgIiA6OiAibSIgKGMpKTsgIFwKKyAgICBhc20oICJtb3ZsICAgJTAsICUlZWJ4ICAgICAgIiA6OiAibSIgKGIpKTsKKworI2RlZmluZSBNVUxBRERDX0NPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggImxvZHNsICAgICAgICAgICAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm11bGwgICAlZWJ4ICAgICAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGwgICAlZWN4LCAgICVlYXggICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkY2wgICAkMCwgICAgICVlZHggICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGwgICAoJWVkaSksICVlYXggICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkY2wgICAkMCwgICAgICVlZHggICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm1vdmwgICAlZWR4LCAgICVlY3ggICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggInN0b3NsICAgICAgICAgICAgICAgICAiICk7CisKKyNpZiBkZWZpbmVkKFhZU1NMX0hBVkVfU1NFMikKKworI2RlZmluZSBNVUxBRERDX0hVSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVlY3gsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVlYngsICAgICAlbW0wICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICglZWRpKSwgICAlbW0zICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTMsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICglZXNpKSwgICAlbW0yICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBtdWx1ZHEgICVtbTAsICAgICAlbW0yICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDQoJWVzaSksICAlbW00ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBtdWx1ZHEgICVtbTAsICAgICAlbW00ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDgoJWVzaSksICAlbW02ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBtdWx1ZHEgICVtbTAsICAgICAlbW02ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDEyKCVlc2kpLCAlbW03ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBtdWx1ZHEgICVtbTAsICAgICAlbW03ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTIsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDQoJWVkaSksICAlbW0zICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTQsICAgICAlbW0zICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDgoJWVkaSksICAlbW01ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTYsICAgICAlbW01ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDEyKCVlZGkpLCAlbW00ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTQsICAgICAlbW03ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVtbTEsICAgICAoJWVkaSkgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDE2KCVlc2kpLCAlbW0yICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBtdWx1ZHEgICVtbTAsICAgICAlbW0yICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBzcmxxICAgICQzMiwgICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDIwKCVlc2kpLCAlbW00ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBtdWx1ZHEgICVtbTAsICAgICAlbW00ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTMsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDI0KCVlc2kpLCAlbW02ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBtdWx1ZHEgICVtbTAsICAgICAlbW02ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVtbTEsICAgICA0KCVlZGkpICAiICk7ICAgICAgXAorICAgIGFzbSggInBzcmxxICAgICQzMiwgICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDI4KCVlc2kpLCAlbW0zICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBtdWx1ZHEgICVtbTAsICAgICAlbW0zICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTUsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDE2KCVlZGkpLCAlbW01ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTUsICAgICAlbW0yICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVtbTEsICAgICA4KCVlZGkpICAiICk7ICAgICAgXAorICAgIGFzbSggInBzcmxxICAgICQzMiwgICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTcsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDIwKCVlZGkpLCAlbW01ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTUsICAgICAlbW00ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVtbTEsICAgICAxMiglZWRpKSAiICk7ICAgICAgXAorICAgIGFzbSggInBzcmxxICAgICQzMiwgICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTIsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDI0KCVlZGkpLCAlbW01ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTUsICAgICAlbW02ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVtbTEsICAgICAxNiglZWRpKSAiICk7ICAgICAgXAorICAgIGFzbSggInBzcmxxICAgICQzMiwgICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTQsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgIDI4KCVlZGkpLCAlbW01ICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTUsICAgICAlbW0zICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVtbTEsICAgICAyMCglZWRpKSAiICk7ICAgICAgXAorICAgIGFzbSggInBzcmxxICAgICQzMiwgICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTYsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVtbTEsICAgICAyNCglZWRpKSAiICk7ICAgICAgXAorICAgIGFzbSggInBzcmxxICAgICQzMiwgICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBhZGRxICAgICVtbTMsICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVtbTEsICAgICAyOCglZWRpKSAiICk7ICAgICAgXAorICAgIGFzbSggImFkZGwgICAgICQzMiwgICAgICAlZWRpICAgICAiICk7ICAgICAgXAorICAgIGFzbSggImFkZGwgICAgICQzMiwgICAgICAlZXNpICAgICAiICk7ICAgICAgXAorICAgIGFzbSggInBzcmxxICAgICQzMiwgICAgICAlbW0xICAgICAiICk7ICAgICAgXAorICAgIGFzbSggIm1vdmQgICAgICVtbTEsICAgICAlZWN4ICAgICAiICk7CisKKyNkZWZpbmUgTVVMQUREQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJlbW1zICAgICAgICAgICAgICAgICAgICAgICAgIiApOyAgICAgIFwKKyAgICBhc20oICJtb3ZsICAgJTAsICUlZWJ4ICAgICAgIiA6OiAibSIgKHQpKTsgIFwKKyAgICBhc20oICJtb3ZsICAgJSVlY3gsICUwICAgICAgIiA6ICI9bSIgKGMpKTsgIFwKKyAgICBhc20oICJtb3ZsICAgJSVlZGksICUwICAgICAgIiA6ICI9bSIgKGQpKTsgIFwKKyAgICBhc20oICJtb3ZsICAgJSVlc2ksICUwICAgICAgIiA6ICI9bSIgKHMpIDo6IFwKKyAgICAiZWF4IiwgImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIgKTsKKworI2Vsc2UKKworI2RlZmluZSBNVUxBRERDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggIm1vdmwgICAlMCwgJSVlYnggICAgICAiIDo6ICJtIiAodCkpOyAgXAorICAgIGFzbSggIm1vdmwgICAlJWVjeCwgJTAgICAgICAiIDogIj1tIiAoYykpOyAgXAorICAgIGFzbSggIm1vdmwgICAlJWVkaSwgJTAgICAgICAiIDogIj1tIiAoZCkpOyAgXAorICAgIGFzbSggIm1vdmwgICAlJWVzaSwgJTAgICAgICAiIDogIj1tIiAocykgOjogXAorICAgICJlYXgiLCAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIiApOworCisjZW5kaWYgLyogU1NFMiAqLworI2VuZGlmIC8qIGkzODYgKi8KKworI2lmIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkIChfX3g4Nl82NF9fKQorCisjZGVmaW5lIE1VTEFERENfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAibW92cSAgICUwLCAlJXJzaSAgICAgICIgOjogIm0iIChzKSk7ICBcCisgICAgYXNtKCAibW92cSAgICUwLCAlJXJkaSAgICAgICIgOjogIm0iIChkKSk7ICBcCisgICAgYXNtKCAibW92cSAgICUwLCAlJXJjeCAgICAgICIgOjogIm0iIChjKSk7ICBcCisgICAgYXNtKCAibW92cSAgICUwLCAlJXJieCAgICAgICIgOjogIm0iIChiKSk7ICBcCisgICAgYXNtKCAieG9ycSAgICVyOCwgJXI4ICAgICAgICIgKTsKKworI2RlZmluZSBNVUxBRERDX0NPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggIm1vdnEgICglcnNpKSwlcmF4ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm11bHEgICAlcmJ4ICAgICAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHEgICAkOCwgICAlcnNpICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHEgICAlcmN4LCAlcmF4ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm1vdnEgICAlcjgsICAlcmN4ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkY3EgICAkMCwgICAlcmR4ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm5vcCAgICAgICAgICAgICAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHEgICAlcmF4LCAoJXJkaSkgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkY3EgICAlcmR4LCAlcmN4ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHEgICAkOCwgICAlcmRpICAgICAiICk7CisKKyNkZWZpbmUgTVVMQUREQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZxICAgJSVyY3gsICUwICAgICAgIiA6ICI9bSIgKGMpKTsgIFwKKyAgICBhc20oICJtb3ZxICAgJSVyZGksICUwICAgICAgIiA6ICI9bSIgKGQpKTsgIFwKKyAgICBhc20oICJtb3ZxICAgJSVyc2ksICUwICAgICAgIiA6ICI9bSIgKHMpIDo6IFwKKyAgICAicmF4IiwgInJjeCIsICJyZHgiLCAicmJ4IiwgInJzaSIsICJyZGkiLCAicjgiICk7CisKKyNlbmRpZiAvKiBBTUQ2NCAqLworCisjaWYgZGVmaW5lZChfX21jNjgwMjBfXykgfHwgZGVmaW5lZChfX21jcHUzMl9fKQorCisjZGVmaW5lIE1VTEFERENfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAibW92bCAgICUwLCAlJWEyICAgICAgICIgOjogIm0iIChzKSk7ICBcCisgICAgYXNtKCAibW92bCAgICUwLCAlJWEzICAgICAgICIgOjogIm0iIChkKSk7ICBcCisgICAgYXNtKCAibW92bCAgICUwLCAlJWQzICAgICAgICIgOjogIm0iIChjKSk7ICBcCisgICAgYXNtKCAibW92bCAgICUwLCAlJWQyICAgICAgICIgOjogIm0iIChiKSk7ICBcCisgICAgYXNtKCAibW92ZXEgICMwLCAlZDAgICAgICAgICIgKTsKKworI2RlZmluZSBNVUxBRERDX0NPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggIm1vdmVsICAlYTJAKywgJWQxICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm11bHVsICAlZDIsICVkNDolZDEgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGwgICAlZDMsICVkMSAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHhsICAlZDAsICVkNCAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm1vdmVxICAjMCwgICVkMyAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGwgICAlZDEsICVhM0ArICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHhsICAlZDQsICVkMyAgICAgICAiICk7CisKKyNkZWZpbmUgTVVMQUREQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZsICAgJSVkMywgJTAgICAgICAgIiA6ICI9bSIgKGMpKTsgIFwKKyAgICBhc20oICJtb3ZsICAgJSVhMywgJTAgICAgICAgIiA6ICI9bSIgKGQpKTsgIFwKKyAgICBhc20oICJtb3ZsICAgJSVhMiwgJTAgICAgICAgIiA6ICI9bSIgKHMpIDo6IFwKKyAgICAiZDAiLCAiZDEiLCAiZDIiLCAiZDMiLCAiZDQiLCAiYTIiLCAiYTMiICk7CisKKyNkZWZpbmUgTVVMQUREQ19IVUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZlbCAgJWEyQCssICVkMSAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWx1bCAgJWQyLCAlZDQ6JWQxICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQzLCAlZDEgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQwLCAlZDQgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRsICAgJWQxLCAlYTNAKyAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZlbCAgJWEyQCssICVkMSAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWx1bCAgJWQyLCAlZDM6JWQxICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQ0LCAlZDEgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQwLCAlZDMgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRsICAgJWQxLCAlYTNAKyAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZlbCAgJWEyQCssICVkMSAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWx1bCAgJWQyLCAlZDQ6JWQxICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQzLCAlZDEgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQwLCAlZDQgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRsICAgJWQxLCAlYTNAKyAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZlbCAgJWEyQCssICVkMSAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWx1bCAgJWQyLCAlZDM6JWQxICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQ0LCAlZDEgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQwLCAlZDMgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRsICAgJWQxLCAlYTNAKyAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZlbCAgJWEyQCssICVkMSAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWx1bCAgJWQyLCAlZDQ6JWQxICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQzLCAlZDEgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQwLCAlZDQgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRsICAgJWQxLCAlYTNAKyAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZlbCAgJWEyQCssICVkMSAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWx1bCAgJWQyLCAlZDM6JWQxICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQ0LCAlZDEgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQwLCAlZDMgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRsICAgJWQxLCAlYTNAKyAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZlbCAgJWEyQCssICVkMSAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWx1bCAgJWQyLCAlZDQ6JWQxICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQzLCAlZDEgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQwLCAlZDQgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRsICAgJWQxLCAlYTNAKyAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtb3ZlbCAgJWEyQCssICVkMSAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWx1bCAgJWQyLCAlZDM6JWQxICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQ0LCAlZDEgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQwLCAlZDMgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRsICAgJWQxLCAlYTNAKyAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR4bCAgJWQwLCAlZDMgICAgICAgIiApOworCisjZW5kaWYgLyogTUM2ODAwMCAqLworCisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgICB8fCBkZWZpbmVkKF9fcHBjX18pCisjaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSB8fCBkZWZpbmVkKF9fcHBjNjRfXykKKworI2lmIGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKQorCisjZGVmaW5lIE1VTEFERENfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAibGQgICAgIHIzLCAlMCAgICAgICAgICIgOjogIm0iIChzKSk7ICBcCisgICAgYXNtKCAibGQgICAgIHI0LCAlMCAgICAgICAgICIgOjogIm0iIChkKSk7ICBcCisgICAgYXNtKCAibGQgICAgIHI1LCAlMCAgICAgICAgICIgOjogIm0iIChjKSk7ICBcCisgICAgYXNtKCAibGQgICAgIHI2LCAlMCAgICAgICAgICIgOjogIm0iIChiKSk7ICBcCisgICAgYXNtKCAiYWRkaSAgIHIzLCByMywgLTggICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkaSAgIHI0LCByNCwgLTggICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkaWMgIHI1LCByNSwgIDAgICAgICIgKTsKKworI2RlZmluZSBNVUxBRERDX0NPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggImxkdSAgICByNywgOChyMykgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm11bGxkICByOCwgcjcsIHI2ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm11bGhkdSByOSwgcjcsIHI2ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGUgICByOCwgcjgsIHI1ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImxkICAgICByNywgOChyNCkgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHplICByNSwgcjkgICAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGMgICByOCwgcjgsIHI3ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggInN0ZHUgICByOCwgOChyNCkgICAgICAiICk7CisKKyNkZWZpbmUgTVVMQUREQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR6ZSAgcjUsIHI1ICAgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRpICAgcjQsIHI0LCA4ICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRpICAgcjMsIHIzLCA4ICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJzdGQgICAgcjUsICUwICAgICAgICAgIiA6ICI9bSIgKGMpKTsgIFwKKyAgICBhc20oICJzdGQgICAgcjQsICUwICAgICAgICAgIiA6ICI9bSIgKGQpKTsgIFwKKyAgICBhc20oICJzdGQgICAgcjMsICUwICAgICAgICAgIiA6ICI9bSIgKHMpIDo6IFwKKyAgICAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiICk7CisKKyNlbHNlCisKKyNkZWZpbmUgTVVMQUREQ19JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJsZCAgICAgJSVyMywgJTAgICAgICAgIiA6OiAibSIgKHMpKTsgIFwKKyAgICBhc20oICJsZCAgICAgJSVyNCwgJTAgICAgICAgIiA6OiAibSIgKGQpKTsgIFwKKyAgICBhc20oICJsZCAgICAgJSVyNSwgJTAgICAgICAgIiA6OiAibSIgKGMpKTsgIFwKKyAgICBhc20oICJsZCAgICAgJSVyNiwgJTAgICAgICAgIiA6OiAibSIgKGIpKTsgIFwKKyAgICBhc20oICJhZGRpICAgJXIzLCAlcjMsIC04ICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRpICAgJXI0LCAlcjQsIC04ICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRpYyAgJXI1LCAlcjUsICAwICAgIiApOworCisjZGVmaW5lIE1VTEFERENfQ09SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAibGR1ICAgICVyNywgOCglcjMpICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibXVsbGQgICVyOCwgJXI3LCAlcjYgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibXVsaGR1ICVyOSwgJXI3LCAlcjYgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkZSAgICVyOCwgJXI4LCAlcjUgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibGQgICAgICVyNywgOCglcjQpICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkemUgICVyNSwgJXI5ICAgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkYyAgICVyOCwgJXI4LCAlcjcgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAic3RkdSAgICVyOCwgOCglcjQpICAgICIgKTsKKworI2RlZmluZSBNVUxBRERDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHplICAlcjUsICVyNSAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGkgICAlcjQsICVyNCwgOCAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGkgICAlcjMsICVyMywgOCAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggInN0ZCAgICAlJXI1LCAlMCAgICAgICAiIDogIj1tIiAoYykpOyAgXAorICAgIGFzbSggInN0ZCAgICAlJXI0LCAlMCAgICAgICAiIDogIj1tIiAoZCkpOyAgXAorICAgIGFzbSggInN0ZCAgICAlJXIzLCAlMCAgICAgICAiIDogIj1tIiAocykgOjogXAorICAgICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJyOSIgKTsKKworI2VuZGlmCisKKyNlbHNlIC8qIFBQQzMyICovCisKKyNpZiBkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykKKworI2RlZmluZSBNVUxBRERDX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggImx3eiAgICByMywgJTAgICAgICAgICAiIDo6ICJtIiAocykpOyAgXAorICAgIGFzbSggImx3eiAgICByNCwgJTAgICAgICAgICAiIDo6ICJtIiAoZCkpOyAgXAorICAgIGFzbSggImx3eiAgICByNSwgJTAgICAgICAgICAiIDo6ICJtIiAoYykpOyAgXAorICAgIGFzbSggImx3eiAgICByNiwgJTAgICAgICAgICAiIDo6ICJtIiAoYikpOyAgXAorICAgIGFzbSggImFkZGkgICByMywgcjMsIC00ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGkgICByNCwgcjQsIC00ICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGljICByNSwgcjUsICAwICAgICAiICk7CisKKyNkZWZpbmUgTVVMQUREQ19DT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJsd3p1ICAgcjcsIDQocjMpICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWxsdyAgcjgsIHI3LCByNiAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWxod3UgcjksIHI3LCByNiAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRlICAgcjgsIHI4LCByNSAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJsd3ogICAgcjcsIDQocjQpICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR6ZSAgcjUsIHI5ICAgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRjICAgcjgsIHI4LCByNyAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJzdHd1ICAgcjgsIDQocjQpICAgICAgIiApOworCisjZGVmaW5lIE1VTEFERENfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkemUgIHI1LCByNSAgICAgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkaSAgIHI0LCByNCwgNCAgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkaSAgIHIzLCByMywgNCAgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAic3R3ICAgIHI1LCAlMCAgICAgICAgICIgOiAiPW0iIChjKSk7ICBcCisgICAgYXNtKCAic3R3ICAgIHI0LCAlMCAgICAgICAgICIgOiAiPW0iIChkKSk7ICBcCisgICAgYXNtKCAic3R3ICAgIHIzLCAlMCAgICAgICAgICIgOiAiPW0iIChzKSA6OiBcCisgICAgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwgInI4IiwgInI5IiApOworCisjZWxzZQorCisjZGVmaW5lIE1VTEFERENfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAibHd6ICAgICUlcjMsICUwICAgICAgICIgOjogIm0iIChzKSk7ICBcCisgICAgYXNtKCAibHd6ICAgICUlcjQsICUwICAgICAgICIgOjogIm0iIChkKSk7ICBcCisgICAgYXNtKCAibHd6ICAgICUlcjUsICUwICAgICAgICIgOjogIm0iIChjKSk7ICBcCisgICAgYXNtKCAibHd6ICAgICUlcjYsICUwICAgICAgICIgOjogIm0iIChiKSk7ICBcCisgICAgYXNtKCAiYWRkaSAgICVyMywgJXIzLCAtNCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkaSAgICVyNCwgJXI0LCAtNCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkaWMgICVyNSwgJXI1LCAgMCAgICIgKTsKKworI2RlZmluZSBNVUxBRERDX0NPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggImx3enUgICAlcjcsIDQoJXIzKSAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm11bGx3ICAlcjgsICVyNywgJXI2ICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggIm11bGh3dSAlcjksICVyNywgJXI2ICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGUgICAlcjgsICVyOCwgJXI1ICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImx3eiAgICAlcjcsIDQoJXI0KSAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHplICAlcjUsICVyOSAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGMgICAlcjgsICVyOCwgJXI3ICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggInN0d3UgICAlcjgsIDQoJXI0KSAgICAiICk7CisKKyNkZWZpbmUgTVVMQUREQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR6ZSAgJXI1LCAlcjUgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRpICAgJXI0LCAlcjQsIDQgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRpICAgJXIzLCAlcjMsIDQgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJzdHcgICAgJSVyNSwgJTAgICAgICAgIiA6ICI9bSIgKGMpKTsgIFwKKyAgICBhc20oICJzdHcgICAgJSVyNCwgJTAgICAgICAgIiA6ICI9bSIgKGQpKTsgIFwKKyAgICBhc20oICJzdHcgICAgJSVyMywgJTAgICAgICAgIiA6ICI9bSIgKHMpIDo6IFwKKyAgICAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiICk7CisKKyNlbmRpZgorCisjZW5kaWYgLyogUFBDMzIgKi8KKyNlbmRpZiAvKiBQUEM2NCAqLworCisjaWYgZGVmaW5lZChfX3NwYXJjX18pCisKKyNkZWZpbmUgTVVMQUREQ19JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJsZCAgICAgJTAsICUlbzAgICAgICAgIiA6OiAibSIgKHMpKTsgIFwKKyAgICBhc20oICJsZCAgICAgJTAsICUlbzEgICAgICAgIiA6OiAibSIgKGQpKTsgIFwKKyAgICBhc20oICJsZCAgICAgJTAsICUlbzIgICAgICAgIiA6OiAibSIgKGMpKTsgIFwKKyAgICBhc20oICJsZCAgICAgJTAsICUlbzMgICAgICAgIiA6OiAibSIgKGIpKTsKKworI2RlZmluZSBNVUxBRERDX0NPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggImxkICAgIFslbzBdLCAlbzQgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImluYyAgICAgIDQsICAlbzAgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImxkICAgIFslbzFdLCAlbzUgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggInVtdWwgICAlbzMsICAlbzQsICVvNCAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGNjICAlbzQsICAlbzIsICVvNCAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggInJkICAgICAgJXksICAlZzEgICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHggICAlZzEsICAgIDAsICVnMSAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZGNjICAlbzQsICAlbzUsICVvNCAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggInN0ICAgICAlbzQsIFslbzFdICAgICAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImFkZHggICAlZzEsICAgIDAsICVvMiAiICk7ICAgICAgICAgICAgXAorICAgIGFzbSggImluYyAgICAgIDQsICAlbzEgICAgICAiICk7CisKKyNkZWZpbmUgTVVMQUREQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJzdCAgICAgJSVvMiwgJTAgICAgICAgIiA6ICI9bSIgKGMpKTsgIFwKKyAgICBhc20oICJzdCAgICAgJSVvMSwgJTAgICAgICAgIiA6ICI9bSIgKGQpKTsgIFwKKyAgICBhc20oICJzdCAgICAgJSVvMCwgJTAgICAgICAgIiA6ICI9bSIgKHMpIDo6IFwKKyAgICAiZzEiLCAibzAiLCAibzEiLCAibzIiLCAibzMiLCAibzQiLCAibzUiICk7CisKKyNlbmRpZiAvKiBTUEFSQ3Y4ICovCisKKyNpZiBkZWZpbmVkKF9fbWljcm9ibGF6ZV9fKSB8fCBkZWZpbmVkKG1pY3JvYmxhemUpCisKKyNkZWZpbmUgTVVMQUREQ19JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJsd2kgICByMywgICAlMCAgICAgICAgIiA6OiAibSIgKHMpKTsgIFwKKyAgICBhc20oICJsd2kgICByNCwgICAlMCAgICAgICAgIiA6OiAibSIgKGQpKTsgIFwKKyAgICBhc20oICJsd2kgICByNSwgICAlMCAgICAgICAgIiA6OiAibSIgKGMpKTsgIFwKKyAgICBhc20oICJsd2kgICByNiwgICAlMCAgICAgICAgIiA6OiAibSIgKGIpKTsgIFwKKyAgICBhc20oICJhbmRpICByNywgICByNiwgMHhmZmZmIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJic3JsaSByNiwgICByNiwgMTYgICAgIiApOworCisjZGVmaW5lIE1VTEFERENfQ09SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAibGh1aSAgcjgsICAgcjMsICAgMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkaSAgcjMsICAgcjMsICAgMiAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibGh1aSAgcjksICAgcjMsICAgMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkaSAgcjMsICAgcjMsICAgMiAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibXVsICAgcjEwLCAgcjksICByNiAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibXVsICAgcjExLCAgcjgsICByNyAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibXVsICAgcjEyLCAgcjksICByNyAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibXVsICAgcjEzLCAgcjgsICByNiAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYnNybGkgIHI4LCByMTAsICAxNiAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYnNybGkgIHI5LCByMTEsICAxNiAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkICAgcjEzLCByMTMsICByOCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkICAgcjEzLCByMTMsICByOSAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYnNsbGkgcjEwLCByMTAsICAxNiAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYnNsbGkgcjExLCByMTEsICAxNiAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkICAgcjEyLCByMTIsIHIxMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkYyAgcjEzLCByMTMsICByMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkICAgcjEyLCByMTIsIHIxMSAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkYyAgcjEzLCByMTMsICByMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibHdpICAgcjEwLCAgcjQsICAgMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkICAgcjEyLCByMTIsIHIxMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkYyAgcjEzLCByMTMsICByMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkICAgcjEyLCByMTIsICByNSAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkYyAgIHI1LCByMTMsICByMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAic3dpICAgcjEyLCAgcjQsICAgMCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkaSAgIHI0LCAgcjQsICAgNCAgICIgKTsKKworI2RlZmluZSBNVUxBRERDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggInN3aSAgIHI1LCAgICUwICAgICAgICAiIDogIj1tIiAoYykpOyAgXAorICAgIGFzbSggInN3aSAgIHI0LCAgICUwICAgICAgICAiIDogIj1tIiAoZCkpOyAgXAorICAgIGFzbSggInN3aSAgIHIzLCAgICUwICAgICAgICAiIDogIj1tIiAocykgOjogXAorICAgICAicjMiLCAicjQiICwgInI1IiAsICJyNiIgLCAicjciICwgInI4IiAsICAgXAorICAgICAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiApOworCisjZW5kaWYgLyogTWljcm9CbGF6ZSAqLworCisjaWYgZGVmaW5lZChfX3RyaWNvcmVfXykKKworI2RlZmluZSBNVUxBRERDX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggImxkLmEgICAlJWEyLCAlMCAgICAgICAiIDo6ICJtIiAocykpOyAgXAorICAgIGFzbSggImxkLmEgICAlJWEzLCAlMCAgICAgICAiIDo6ICJtIiAoZCkpOyAgXAorICAgIGFzbSggImxkLncgICAlJWQ0LCAlMCAgICAgICAiIDo6ICJtIiAoYykpOyAgXAorICAgIGFzbSggImxkLncgICAlJWQxLCAlMCAgICAgICAiIDo6ICJtIiAoYikpOyAgXAorICAgIGFzbSggInhvciAgICAlZDUsICVkNSAgICAgICAiICk7CisKKyNkZWZpbmUgTVVMQUREQ19DT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJsZC53ICAgJWQwLCAgIFslYTIrXSAgICAgICIgKTsgICAgICAgIFwKKyAgICBhc20oICJtYWRkLnUgJWUyLCAlZTQsICVkMCwgJWQxICIgKTsgICAgICAgIFwKKyAgICBhc20oICJsZC53ICAgJWQwLCAgIFslYTNdICAgICAgICIgKTsgICAgICAgIFwKKyAgICBhc20oICJhZGR4ICAgJWQyLCAgICAlZDIsICAlZDAgICIgKTsgICAgICAgIFwKKyAgICBhc20oICJhZGRjICAgJWQzLCAgICAlZDMsICAgIDAgICIgKTsgICAgICAgIFwKKyAgICBhc20oICJtb3YgICAgJWQ0LCAgICAlZDMgICAgICAgICIgKTsgICAgICAgIFwKKyAgICBhc20oICJzdC53ICBbJWEzK10sICAlZDIgICAgICAgICIgKTsKKworI2RlZmluZSBNVUxBRERDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggInN0LncgICAlMCwgJSVkNCAgICAgICAiIDogIj1tIiAoYykpOyAgXAorICAgIGFzbSggInN0LmEgICAlMCwgJSVhMyAgICAgICAiIDogIj1tIiAoZCkpOyAgXAorICAgIGFzbSggInN0LmEgICAlMCwgJSVhMiAgICAgICAiIDogIj1tIiAocykgOjogXAorICAgICJkMCIsICJkMSIsICJlMiIsICJkNCIsICJhMiIsICJhMyIgKTsKKworI2VuZGlmIC8qIFRyaUNvcmUgKi8KKworI2lmIGRlZmluZWQoX19hcm1fXykKKworI2RlZmluZSBNVUxBRERDX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggImxkciAgICByMCwgJTAgICAgICAgICAiIDo6ICJtIiAocykpOyAgXAorICAgIGFzbSggImxkciAgICByMSwgJTAgICAgICAgICAiIDo6ICJtIiAoZCkpOyAgXAorICAgIGFzbSggImxkciAgICByMiwgJTAgICAgICAgICAiIDo6ICJtIiAoYykpOyAgXAorICAgIGFzbSggImxkciAgICByMywgJTAgICAgICAgICAiIDo6ICJtIiAoYikpOworCisjZGVmaW5lIE1VTEFERENfQ09SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAibGRyICAgIHI0LCBbcjBdLCAjNCAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibW92ICAgIHI1LCAjMCAgICAgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibGRyICAgIHI2LCBbcjFdICAgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAidW1sYWwgIHIyLCByNSwgcjMsIHI0ICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkcyAgIHI3LCByNiwgcjIgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRjICAgIHIyLCByNSwgIzAgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAic3RyICAgIHI3LCBbcjFdLCAjNCAgICIgKTsKKworI2RlZmluZSBNVUxBRERDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggInN0ciAgICByMiwgJTAgICAgICAgICAiIDogIj1tIiAoYykpOyAgXAorICAgIGFzbSggInN0ciAgICByMSwgJTAgICAgICAgICAiIDogIj1tIiAoZCkpOyAgXAorICAgIGFzbSggInN0ciAgICByMCwgJTAgICAgICAgICAiIDogIj1tIiAocykgOjogXAorICAgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIgKTsKKworI2VuZGlmIC8qIEFSTXYzICovCisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKworI2RlZmluZSBNVUxBRERDX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggImxkcSAgICAkMSwgJTAgICAgICAgICAiIDo6ICJtIiAocykpOyAgXAorICAgIGFzbSggImxkcSAgICAkMiwgJTAgICAgICAgICAiIDo6ICJtIiAoZCkpOyAgXAorICAgIGFzbSggImxkcSAgICAkMywgJTAgICAgICAgICAiIDo6ICJtIiAoYykpOyAgXAorICAgIGFzbSggImxkcSAgICAkNCwgJTAgICAgICAgICAiIDo6ICJtIiAoYikpOworCisjZGVmaW5lIE1VTEFERENfQ09SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAibGRxICAgICQ2LCAgMCgkMSkgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkcSAgICQxLCAgOCwgJDEgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibXVscSAgICQ2LCAkNCwgJDcgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAidW11bGggICQ2LCAkNCwgJDYgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkcSAgICQ3LCAkMywgJDcgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiY21wdWx0ICQ3LCAkMywgJDMgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAibGRxICAgICQ1LCAgMCgkMikgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkcSAgICQ3LCAkNSwgJDcgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiY21wdWx0ICQ3LCAkNSwgJDUgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAic3RxICAgICQ3LCAgMCgkMikgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkcSAgICQyLCAgOCwgJDIgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkcSAgICQ2LCAkMywgJDMgICAgICIgKTsgICAgICAgICAgICBcCisgICAgYXNtKCAiYWRkcSAgICQ1LCAkMywgJDMgICAgICIgKTsKKworI2RlZmluZSBNVUxBRERDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSggInN0cSAgICAkMywgJTAgICAgICAgICAiIDogIj1tIiAoYykpOyAgXAorICAgIGFzbSggInN0cSAgICAkMiwgJTAgICAgICAgICAiIDogIj1tIiAoZCkpOyAgXAorICAgIGFzbSggInN0cSAgICAkMSwgJTAgICAgICAgICAiIDogIj1tIiAocykgOjogXAorICAgICIkMSIsICIkMiIsICIkMyIsICIkNCIsICIkNSIsICIkNiIsICIkNyIgKTsKKworI2VuZGlmIC8qIEFscGhhICovCisKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorCisjZGVmaW5lIE1VTEFERENfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAibHcgICAgICQxMCwgJTAgICAgICAgICIgOjogIm0iIChzKSk7ICBcCisgICAgYXNtKCAibHcgICAgICQxMSwgJTAgICAgICAgICIgOjogIm0iIChkKSk7ICBcCisgICAgYXNtKCAibHcgICAgICQxMiwgJTAgICAgICAgICIgOjogIm0iIChjKSk7ICBcCisgICAgYXNtKCAibHcgICAgICQxMywgJTAgICAgICAgICIgOjogIm0iIChiKSk7CisKKyNkZWZpbmUgTVVMQUREQ19DT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oICJsdyAgICAgJDE0LCAwKCQxMCkgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtdWx0dSAgJDEzLCAkMTQgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRpICAgJDEwLCAkMTAsIDQgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtZmxvICAgJDE0ICAgICAgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJtZmhpICAgJDkgICAgICAgICAgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR1ICAgJDE0LCAkMTIsICQxNCAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJsdyAgICAgJDE1LCAwKCQxMSkgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJzbHR1ICAgJDEyLCAkMTQsICQxMiAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR1ICAgJDE1LCAkMTQsICQxNSAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJzbHR1ICAgJDE0LCAkMTUsICQxNCAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR1ICAgJDEyLCAkMTIsICQ5ICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJzdyAgICAgJDE1LCAwKCQxMSkgICAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGR1ICAgJDEyLCAkMTIsICQxNCAgIiApOyAgICAgICAgICAgIFwKKyAgICBhc20oICJhZGRpICAgJDExLCAkMTEsIDQgICAgIiApOworCisjZGVmaW5lIE1VTEFERENfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtKCAic3cgICAgICQxMiwgJTAgICAgICAgICIgOiAiPW0iIChjKSk7ICBcCisgICAgYXNtKCAic3cgICAgICQxMSwgJTAgICAgICAgICIgOiAiPW0iIChkKSk7ICBcCisgICAgYXNtKCAic3cgICAgICQxMCwgJTAgICAgICAgICIgOiAiPW0iIChzKSA6OiBcCisgICAgIiQ5IiwgIiQxMCIsICIkMTEiLCAiJDEyIiwgIiQxMyIsICIkMTQiLCAiJDE1IiApOworCisjZW5kaWYgLyogTUlQUyAqLworI2VuZGlmIC8qIEdOVUMgKi8KKworI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKQorCisjZGVmaW5lIE1VTEFERENfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBtb3YgICAgIGVzaSwgcyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBtb3YgICAgIGVkaSwgZCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBtb3YgICAgIGVjeCwgYyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBtb3YgICAgIGVieCwgYgorCisjZGVmaW5lIE1VTEFERENfQ09SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBsb2RzZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBtdWwgICAgIGVieCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBhZGQgICAgIGVheCwgZWN4ICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBhZGMgICAgIGVkeCwgMCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBhZGQgICAgIGVheCwgW2VkaV0gICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBhZGMgICAgIGVkeCwgMCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBtb3YgICAgIGVjeCwgZWR4ICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBzdG9zZAorCisjaWYgZGVmaW5lZChYWVNTTF9IQVZFX1NTRTIpCisKKyNkZWZpbmUgRU1JVCBfX2FzbSBfZW1pdAorCisjZGVmaW5lIE1VTEFERENfSFVJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHhDOSAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHhDMyAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHgxRiAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhDQiAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHgxNiAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RjQgIEVNSVQgMHhEMCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg2NiAgRU1JVCAweDA0ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RjQgIEVNSVQgMHhFMCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg3NiAgRU1JVCAweDA4ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RjQgIEVNSVQgMHhGMCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg3RSAgRU1JVCAweDBDICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RjQgIEVNSVQgMHhGOCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhDQSAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg1RiAgRU1JVCAweDA0ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhEQyAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg2RiAgRU1JVCAweDA4ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhFRSAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg2NyAgRU1JVCAweDBDICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhGQyAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4N0UgIEVNSVQgMHgwRiAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg1NiAgRU1JVCAweDEwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RjQgIEVNSVQgMHhEMCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NzMgIEVNSVQgMHhEMSAgRU1JVCAweDIwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg2NiAgRU1JVCAweDE0ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RjQgIEVNSVQgMHhFMCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhDQiAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg3NiAgRU1JVCAweDE4ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RjQgIEVNSVQgMHhGMCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4N0UgIEVNSVQgMHg0RiAgRU1JVCAweDA0ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NzMgIEVNSVQgMHhEMSAgRU1JVCAweDIwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg1RSAgRU1JVCAweDFDICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RjQgIEVNSVQgMHhEOCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhDRCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg2RiAgRU1JVCAweDEwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhENSAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4N0UgIEVNSVQgMHg0RiAgRU1JVCAweDA4ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NzMgIEVNSVQgMHhEMSAgRU1JVCAweDIwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhDRiAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg2RiAgRU1JVCAweDE0ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhFNSAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4N0UgIEVNSVQgMHg0RiAgRU1JVCAweDBDICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NzMgIEVNSVQgMHhEMSAgRU1JVCAweDIwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhDQSAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg2RiAgRU1JVCAweDE4ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhGNSAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4N0UgIEVNSVQgMHg0RiAgRU1JVCAweDEwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NzMgIEVNSVQgMHhEMSAgRU1JVCAweDIwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhDQyAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NkUgIEVNSVQgMHg2RiAgRU1JVCAweDFDICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhERCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4N0UgIEVNSVQgMHg0RiAgRU1JVCAweDE0ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NzMgIEVNSVQgMHhEMSAgRU1JVCAweDIwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhDRSAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4N0UgIEVNSVQgMHg0RiAgRU1JVCAweDE4ICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NzMgIEVNSVQgMHhEMSAgRU1JVCAweDIwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4RDQgIEVNSVQgMHhDQiAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4N0UgIEVNSVQgMHg0RiAgRU1JVCAweDFDICBcCisgICAgRU1JVCAweDgzICBFTUlUIDB4QzcgIEVNSVQgMHgyMCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDgzICBFTUlUIDB4QzYgIEVNSVQgMHgyMCAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NzMgIEVNSVQgMHhEMSAgRU1JVCAweDIwICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4N0UgIEVNSVQgMHhDOQorCisjZGVmaW5lIE1VTEFERENfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRU1JVCAweDBGICBFTUlUIDB4NzcgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBtb3YgICAgIGMsIGVjeCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBtb3YgICAgIGQsIGVkaSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc20gICBtb3YgICAgIHMsIGVzaSAgICAgICAgICAgICAgICAgICAgICBcCisKKyNlbHNlCisKKyNkZWZpbmUgTVVMQUREQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbSAgIG1vdiAgICAgYywgZWN4ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbSAgIG1vdiAgICAgZCwgZWRpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbSAgIG1vdiAgICAgcywgZXNpICAgICAgICAgICAgICAgICAgICAgIFwKKworI2VuZGlmIC8qIFNTRTIgKi8KKyNlbmRpZiAvKiBNU1ZDICovCisKKyNlbmRpZiAvKiBYWVNTTF9IQVZFX0FTTSAqLworCisjaWYgIWRlZmluZWQoTVVMQUREQ19DT1JFKQorI2lmIGRlZmluZWQoWFlTU0xfSEFWRV9MT05HTE9ORykKKworI2RlZmluZSBNVUxBRERDX0lOSVQgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdF9kYmwgcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRfaW50IHIwLCByMTsKKworI2RlZmluZSBNVUxBRERDX0NPUkUgICAgICAgICAgICAgICAgICAgIFwKKyAgICByICAgPSAqKHMrKykgKiAodF9kYmwpIGI7ICAgICAgICAgICBcCisgICAgcjAgID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIxICA9IHIgPj4gYmlMOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByMCArPSBjOyAgcjEgKz0gKHIwIDwgIGMpOyAgICAgICAgICBcCisgICAgcjAgKz0gKmQ7IHIxICs9IChyMCA8ICpkKTsgICAgICAgICAgXAorICAgIGMgPSByMTsgKihkKyspID0gcjA7CisKKyNkZWZpbmUgTVVMQUREQ19TVE9QICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNlbHNlCisjZGVmaW5lIE1VTEFERENfSU5JVCAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0X2ludCBzMCwgczEsIGIwLCBiMTsgICAgICAgICAgICAgICBcCisgICAgdF9pbnQgcjAsIHIxLCByeCwgcnk7ICAgICAgICAgICAgICAgXAorICAgIGIwID0gKCBiIDw8IGJpSCApID4+IGJpSDsgICAgICAgICAgIFwKKyAgICBiMSA9ICggYiA+PiBiaUggKTsKKworI2RlZmluZSBNVUxBRERDX0NPUkUgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzMCA9ICggKnMgPDwgYmlIICkgPj4gYmlIOyAgICAgICAgICBcCisgICAgczEgPSAoICpzID4+IGJpSCApOyBzKys7ICAgICAgICAgICAgXAorICAgIHJ4ID0gczAgKiBiMTsgcjAgPSBzMCAqIGIwOyAgICAgICAgIFwKKyAgICByeSA9IHMxICogYjA7IHIxID0gczEgKiBiMTsgICAgICAgICBcCisgICAgcjEgKz0gKCByeCA+PiBiaUggKTsgICAgICAgICAgICAgICAgXAorICAgIHIxICs9ICggcnkgPj4gYmlIICk7ICAgICAgICAgICAgICAgIFwKKyAgICByeCA8PD0gYmlIOyByeSA8PD0gYmlIOyAgICAgICAgICAgICBcCisgICAgcjAgKz0gcng7IHIxICs9IChyMCA8IHJ4KTsgICAgICAgICAgXAorICAgIHIwICs9IHJ5OyByMSArPSAocjAgPCByeSk7ICAgICAgICAgIFwKKyAgICByMCArPSAgYzsgcjEgKz0gKHIwIDwgIGMpOyAgICAgICAgICBcCisgICAgcjAgKz0gKmQ7IHIxICs9IChyMCA8ICpkKTsgICAgICAgICAgXAorICAgIGMgPSByMTsgKihkKyspID0gcjA7CisKKyNkZWZpbmUgTVVMQUREQ19TVE9QICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNlbmRpZiAvKiBDIChnZW5lcmljKSAgKi8KKyNlbmRpZiAvKiBDIChsb25nbG9uZykgKi8KKworI2VuZGlmIC8qIGJuX211bC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL2NlcnRzLmggYi9pbmNsdWRlL3BvbGFyc3NsL2NlcnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5MWJhZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcG9sYXJzc2wvY2VydHMuaApAQCAtMCwwICsxLDI0IEBACisvKioKKyAqIFxmaWxlIGNlcnRzLmgKKyAqLworI2lmbmRlZiBYWVNTTF9DRVJUU19ICisjZGVmaW5lIFhZU1NMX0NFUlRTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gY2hhciB0ZXN0X2NhX2NydFtdOworZXh0ZXJuIGNoYXIgdGVzdF9jYV9rZXlbXTsKK2V4dGVybiBjaGFyIHRlc3RfY2FfcHdkW107CitleHRlcm4gY2hhciB0ZXN0X3Nydl9jcnRbXTsKK2V4dGVybiBjaGFyIHRlc3Rfc3J2X2tleVtdOworZXh0ZXJuIGNoYXIgdGVzdF9jbGlfY3J0W107CitleHRlcm4gY2hhciB0ZXN0X2NsaV9rZXlbXTsKK2V4dGVybiBjaGFyIHh5c3NsX2NhX2NydFtdOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogY2VydHMuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wb2xhcnNzbC9jb25maWcuaCBiL2luY2x1ZGUvcG9sYXJzc2wvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNzYwOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcG9sYXJzc2wvY29uZmlnLmgKQEAgLTAsMCArMSwyODQgQEAKKy8qKgorICogXGZpbGUgY29uZmlnLmgKKyAqCisgKiBUaGlzIHNldCBvZiBjb21waWxlLXRpbWUgb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBlbmFibGUKKyAqIG9yIGRpc2FibGUgZmVhdHVyZXMgc2VsZWN0aXZlbHksIGFuZCByZWR1Y2UgdGhlIGdsb2JhbAorICogbWVtb3J5IGZvb3RwcmludC4KKyAqLworI2lmbmRlZiBYWVNTTF9DT05GSUdfSAorI2RlZmluZSBYWVNTTF9DT05GSUdfSAorCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisKKy8qCisgKiBVbmNvbW1lbnQgaWYgbmF0aXZlIGludGVnZXJzIGFyZSA4LWJpdCB3aWRlLgorICoKKyNkZWZpbmUgWFlTU0xfSEFWRV9JTlQ4CisgKi8KKworLyoKKyAqIFVuY29tbWVudCBpZiBuYXRpdmUgaW50ZWdlcnMgYXJlIDE2LWJpdCB3aWRlLgorICoKKyNkZWZpbmUgWFlTU0xfSEFWRV9JTlQxNgorICovCisKKy8qCisgKiBVbmNvbW1lbnQgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGxvbmcgbG9uZy4KKyAqCisjZGVmaW5lIFhZU1NMX0hBVkVfTE9OR0xPTkcKKyAqLworCisvKgorICogVW5jb21tZW50IHRvIGVuYWJsZSB0aGUgdXNlIG9mIGFzc2VtYmx5IGNvZGUuCisgKi8KKyNkZWZpbmUgWFlTU0xfSEFWRV9BU00KKworLyoKKyAqIFVuY29tbWVudCBpZiB0aGUgQ1BVIHN1cHBvcnRzIFNTRTIgKElBLTMyIHNwZWNpZmljKS4KKyAqCisjZGVmaW5lIFhZU1NMX0hBVkVfU1NFMgorICovCisKKy8qCisgKiBFbmFibGUgYWxsIFNTTC9UTFMgZGVidWdnaW5nIG1lc3NhZ2VzLgorICovCisjZGVmaW5lIFhZU1NMX0RFQlVHX01TRworCisvKgorICogRW5hYmxlIHRoZSBjaGVja3VwIGZ1bmN0aW9ucyAoKl9zZWxmX3Rlc3QpLgorICovCisjZGVmaW5lIFhZU1NMX1NFTEZfVEVTVAorCisvKgorICogRW5hYmxlIHRoZSBwcmltZS1udW1iZXIgZ2VuZXJhdGlvbiBjb2RlLgorICovCisjZGVmaW5lIFhZU1NMX0dFTlBSSU1FCisKKy8qCisgKiBVbmNvbW1lbnQgdGhpcyBtYWNybyB0byBzdG9yZSB0aGUgQUVTIHRhYmxlcyBpbiBST00uCisgKgorI2RlZmluZSBYWVNTTF9BRVNfUk9NX1RBQkxFUworICovCisKKy8qCisgKiBNb2R1bGU6ICBsaWJyYXJ5L2Flcy5jCisgKiBDYWxsZXI6ICBsaWJyYXJ5L3NzbF90bHMuYworICoKKyAqIFRoaXMgbW9kdWxlIGVuYWJsZXMgdGhlIGZvbGxvd2luZyBjaXBoZXJzdWl0ZXM6CisgKiAgICAgIFNTTF9SU0FfQUVTXzEyOF9TSEEKKyAqICAgICAgU1NMX1JTQV9BRVNfMjU2X1NIQQorICogICAgICBTU0xfRURIX1JTQV9BRVNfMjU2X1NIQQorICovCisjZGVmaW5lIFhZU1NMX0FFU19DCisKKy8qCisgKiBNb2R1bGU6ICBsaWJyYXJ5L2FyYzQuYworICogQ2FsbGVyOiAgbGlicmFyeS9zc2xfdGxzLmMKKyAqCisgKiBUaGlzIG1vZHVsZSBlbmFibGVzIHRoZSBmb2xsb3dpbmcgY2lwaGVyc3VpdGVzOgorICogICAgICBTU0xfUlNBX1JDNF8xMjhfTUQ1CisgKiAgICAgIFNTTF9SU0FfUkM0XzEyOF9TSEEKKyAqLworI2RlZmluZSBYWVNTTF9BUkM0X0MKKworLyoKKyAqIE1vZHVsZTogIGxpYnJhcnkvYmFzZTY0LmMKKyAqIENhbGxlcjogIGxpYnJhcnkveDUwOXBhcnNlLmMKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyByZXF1aXJlZCBmb3IgWC41MDkgc3VwcG9ydC4KKyAqLworI2RlZmluZSBYWVNTTF9CQVNFNjRfQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS9iaWdudW0uYworICogQ2FsbGVyOiAgbGlicmFyeS9kaG0uYworICogICAgICAgICAgbGlicmFyeS9yc2EuYworICogICAgICAgICAgbGlicmFyeS9zc2xfdGxzLmMKKyAqICAgICAgICAgIGxpYnJhcnkveDUwOXBhcnNlLmMKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyByZXF1aXJlZCBmb3IgUlNBIGFuZCBESE0gc3VwcG9ydC4KKyAqLworI2RlZmluZSBYWVNTTF9CSUdOVU1fQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS9jZXJ0cy5jCisgKiBDYWxsZXI6CisgKgorICogVGhpcyBtb2R1bGUgaXMgdXNlZCBmb3IgdGVzdGluZyAoc3NsX2NsaWVudC9zZXJ2ZXIpLgorICovCisjZGVmaW5lIFhZU1NMX0NFUlRTX0MKKworLyoKKyAqIE1vZHVsZTogIGxpYnJhcnkvZGVidWcuYworICogQ2FsbGVyOiAgbGlicmFyeS9zc2xfY2xpLmMKKyAqICAgICAgICAgIGxpYnJhcnkvc3NsX3Nydi5jCisgKiAgICAgICAgICBsaWJyYXJ5L3NzbF90bHMuYworICoKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGRlYnVnZ2luZyBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgWFlTU0xfREVCVUdfQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS9kZXMuYworICogQ2FsbGVyOiAgbGlicmFyeS9zc2xfdGxzLmMKKyAqCisgKiBUaGlzIG1vZHVsZSBlbmFibGVzIHRoZSBmb2xsb3dpbmcgY2lwaGVyc3VpdGVzOgorICogICAgICBTU0xfUlNBX0RFU18xNjhfU0hBCisgKiAgICAgIFNTTF9FREhfUlNBX0RFU18xNjhfU0hBCisgKi8KKyNkZWZpbmUgWFlTU0xfREVTX0MKKworLyoKKyAqIE1vZHVsZTogIGxpYnJhcnkvZGhtLmMKKyAqIENhbGxlcjogIGxpYnJhcnkvc3NsX2NsaS5jCisgKiAgICAgICAgICBsaWJyYXJ5L3NzbF9zcnYuYworICoKKyAqIFRoaXMgbW9kdWxlIGVuYWJsZXMgdGhlIGZvbGxvd2luZyBjaXBoZXJzdWl0ZXM6CisgKiAgICAgIFNTTF9FREhfUlNBX0RFU18xNjhfU0hBCisgKiAgICAgIFNTTF9FREhfUlNBX0FFU18yNTZfU0hBCisgKi8KKyNkZWZpbmUgWFlTU0xfREhNX0MKKworLyoKKyAqIE1vZHVsZTogIGxpYnJhcnkvaGF2ZWdlLmMKKyAqIENhbGxlcjoKKyAqCisgKiBUaGlzIG1vZHVsZSBlbmFibGVzIHRoZSBIQVZFR0UgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgKi8KKyNkZWZpbmUgWFlTU0xfSEFWRUdFX0MKKworLyoKKyAqIE1vZHVsZTogIGxpYnJhcnkvbWQyLmMKKyAqIENhbGxlcjogIGxpYnJhcnkveDUwOXBhcnNlLmMKKyAqCisgKiBVbmNvbW1lbnQgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIChyYXJlKSBNRDItc2lnbmVkIFguNTA5IGNlcnRzLgorICoKKyNkZWZpbmUgWFlTU0xfTUQyX0MKKyAqLworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS9tZDQuYworICogQ2FsbGVyOiAgbGlicmFyeS94NTA5cGFyc2UuYworICoKKyAqIFVuY29tbWVudCB0byBlbmFibGUgc3VwcG9ydCBmb3IgKHJhcmUpIE1ENC1zaWduZWQgWC41MDkgY2VydHMuCisgKgorI2RlZmluZSBYWVNTTF9NRDRfQworICovCisKKy8qCisgKiBNb2R1bGU6ICBsaWJyYXJ5L21kNS5jCisgKiBDYWxsZXI6ICBsaWJyYXJ5L3NzbF90bHMuYworICogICAgICAgICAgbGlicmFyeS94NTA5cGFyc2UuYworICoKKyAqIFRoaXMgbW9kdWxlIGlzIHJlcXVpcmVkIGZvciBTU0wvVExTIGFuZCBYLjUwOS4KKyAqLworI2RlZmluZSBYWVNTTF9NRDVfQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS9uZXQuYworICogQ2FsbGVyOgorICoKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIFRDUC9JUCBuZXR3b3JraW5nIHJvdXRpbmVzLgorICovCisjZGVmaW5lIFhZU1NMX05FVF9DCisKKy8qCisgKiBNb2R1bGU6ICBsaWJyYXJ5L3BhZGxvY2suYworICogQ2FsbGVyOiAgbGlicmFyeS9hZXMuYworICoKKyAqIFRoaXMgbW9kdWxlcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBWSUEgUGFkTG9jayBvbiB4ODYuCisgKi8KKyNkZWZpbmUgWFlTU0xfUEFETE9DS19DCisKKy8qCisgKiBNb2R1bGU6ICBsaWJyYXJ5L3JzYS5jCisgKiBDYWxsZXI6ICBsaWJyYXJ5L3NzbF9jbGkuYworICogICAgICAgICAgbGlicmFyeS9zc2xfc3J2LmMKKyAqICAgICAgICAgIGxpYnJhcnkvc3NsX3Rscy5jCisgKiAgICAgICAgICBsaWJyYXJ5L3g1MDkuYworICoKKyAqIFRoaXMgbW9kdWxlIGlzIHJlcXVpcmVkIGZvciBTU0wvVExTIGFuZCBNRDUtc2lnbmVkIGNlcnRpZmljYXRlcy4KKyAqLworI2RlZmluZSBYWVNTTF9SU0FfQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS9zaGExLmMKKyAqIENhbGxlcjogIGxpYnJhcnkvc3NsX2NsaS5jCisgKiAgICAgICAgICBsaWJyYXJ5L3NzbF9zcnYuYworICogICAgICAgICAgbGlicmFyeS9zc2xfdGxzLmMKKyAqICAgICAgICAgIGxpYnJhcnkveDUwOXBhcnNlLmMKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyByZXF1aXJlZCBmb3IgU1NML1RMUyBhbmQgU0hBMS1zaWduZWQgY2VydGlmaWNhdGVzLgorICovCisjZGVmaW5lIFhZU1NMX1NIQTFfQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS9zaGEyLmMKKyAqIENhbGxlcjoKKyAqCisgKiBUaGlzIG1vZHVsZSBhZGRzIHN1cHBvcnQgZm9yIFNIQS0yMjQgYW5kIFNIQS0yNTYuCisgKi8KKyNkZWZpbmUgWFlTU0xfU0hBMl9DCisKKy8qCisgKiBNb2R1bGU6ICBsaWJyYXJ5L3NoYTQuYworICogQ2FsbGVyOgorICoKKyAqIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgU0hBLTM4NCBhbmQgU0hBLTUxMi4KKyAqLworI2RlZmluZSBYWVNTTF9TSEE0X0MKKworLyoKKyAqIE1vZHVsZTogIGxpYnJhcnkvc3NsX2NsaS5jCisgKiBDYWxsZXI6CisgKgorICogVGhpcyBtb2R1bGUgaXMgcmVxdWlyZWQgZm9yIFNTTC9UTFMgY2xpZW50IHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgWFlTU0xfU1NMX0NMSV9DCisKKy8qCisgKiBNb2R1bGU6ICBsaWJyYXJ5L3NzbF9zcnYuYworICogQ2FsbGVyOgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIHJlcXVpcmVkIGZvciBTU0wvVExTIHNlcnZlciBzdXBwb3J0LgorICovCisjZGVmaW5lIFhZU1NMX1NTTF9TUlZfQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS9zc2xfdGxzLmMKKyAqIENhbGxlcjogIGxpYnJhcnkvc3NsX2NsaS5jCisgKiAgICAgICAgICBsaWJyYXJ5L3NzbF9zcnYuYworICoKKyAqIFRoaXMgbW9kdWxlIGlzIHJlcXVpcmVkIGZvciBTU0wvVExTLgorICovCisjZGVmaW5lIFhZU1NMX1NTTF9UTFNfQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS90aW1pbmcuYworICogQ2FsbGVyOiAgbGlicmFyeS9oYXZlZ2UuYworICoKKyAqIFRoaXMgbW9kdWxlIGlzIHVzZWQgYnkgdGhlIEhBVkVHRSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAqLworI2RlZmluZSBYWVNTTF9USU1JTkdfQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS94NTA5cGFyc2UuYworICogQ2FsbGVyOiAgbGlicmFyeS9zc2xfY2xpLmMKKyAqICAgICAgICAgIGxpYnJhcnkvc3NsX3Nydi5jCisgKiAgICAgICAgICBsaWJyYXJ5L3NzbF90bHMuYworICoKKyAqIFRoaXMgbW9kdWxlIGlzIHJlcXVpcmVkIGZvciBYLjUwOSBjZXJ0aWZpY2F0ZSBwYXJzaW5nLgorICovCisjZGVmaW5lIFhZU1NMX1g1MDlfUEFSU0VfQworCisvKgorICogTW9kdWxlOiAgbGlicmFyeS94NTA5X3dyaXRlLmMKKyAqIENhbGxlcjoKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyByZXF1aXJlZCBmb3IgWC41MDkgY2VydGlmaWNhdGUgd3JpdGluZy4KKyAqLworI2RlZmluZSBYWVNTTF9YNTA5X1dSSVRFX0MKKworI2VuZGlmIC8qIGNvbmZpZy5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL2RlYnVnLmggYi9pbmNsdWRlL3BvbGFyc3NsL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmYjBlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcG9sYXJzc2wvZGVidWcuaApAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIFxmaWxlIGRlYnVnLmgKKyAqLworI2lmbmRlZiBTU0xfREVCVUdfSAorI2RlZmluZSBTU0xfREVCVUdfSAorCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisjaW5jbHVkZSAieHlzc2wvc3NsLmgiCisKKyNpZiBkZWZpbmVkKFhZU1NMX0RFQlVHX01TRykKKworI2RlZmluZSBTU0xfREVCVUdfTVNHKCBsZXZlbCwgYXJncyApICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVidWdfcHJpbnRfbXNnKCBzc2wsIGxldmVsLCBfX0ZJTEVfXywgX19MSU5FX18sIGRlYnVnX2ZtdCBhcmdzICk7CisKKyNkZWZpbmUgU1NMX0RFQlVHX1JFVCggbGV2ZWwsIHRleHQsIHJldCApICAgICAgICAgICAgICAgIFwKKyAgICBkZWJ1Z19wcmludF9yZXQoIHNzbCwgbGV2ZWwsIF9fRklMRV9fLCBfX0xJTkVfXywgdGV4dCwgcmV0ICk7CisKKyNkZWZpbmUgU1NMX0RFQlVHX0JVRiggbGV2ZWwsIHRleHQsIGJ1ZiwgbGVuICkgICAgICAgICAgIFwKKyAgICBkZWJ1Z19wcmludF9idWYoIHNzbCwgbGV2ZWwsIF9fRklMRV9fLCBfX0xJTkVfXywgdGV4dCwgYnVmLCBsZW4gKTsKKworI2RlZmluZSBTU0xfREVCVUdfTVBJKCBsZXZlbCwgdGV4dCwgWCApICAgICAgICAgICAgICAgICAgXAorICAgIGRlYnVnX3ByaW50X21waSggc3NsLCBsZXZlbCwgX19GSUxFX18sIF9fTElORV9fLCB0ZXh0LCBYICk7CisKKyNkZWZpbmUgU1NMX0RFQlVHX0NSVCggbGV2ZWwsIHRleHQsIGNydCApICAgICAgICAgICAgICAgIFwKKyAgICBkZWJ1Z19wcmludF9jcnQoIHNzbCwgbGV2ZWwsIF9fRklMRV9fLCBfX0xJTkVfXywgdGV4dCwgY3J0ICk7CisKKyNlbHNlCisKKyNkZWZpbmUgU1NMX0RFQlVHX01TRyggbGV2ZWwsIGFyZ3MgKSAgICAgICAgICAgIGRvIHsgfSB3aGlsZSggMCApCisjZGVmaW5lIFNTTF9ERUJVR19SRVQoIGxldmVsLCB0ZXh0LCByZXQgKSAgICAgICBkbyB7IH0gd2hpbGUoIDAgKQorI2RlZmluZSBTU0xfREVCVUdfQlVGKCBsZXZlbCwgdGV4dCwgYnVmLCBsZW4gKSAgZG8geyB9IHdoaWxlKCAwICkKKyNkZWZpbmUgU1NMX0RFQlVHX01QSSggbGV2ZWwsIHRleHQsIFggKSAgICAgICAgIGRvIHsgfSB3aGlsZSggMCApCisjZGVmaW5lIFNTTF9ERUJVR19DUlQoIGxldmVsLCB0ZXh0LCBjcnQgKSAgICAgICBkbyB7IH0gd2hpbGUoIDAgKQorCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitjaGFyICpkZWJ1Z19mbXQoIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uICk7CisKK3ZvaWQgZGVidWdfcHJpbnRfbXNnKCBzc2xfY29udGV4dCAqc3NsLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKnRleHQgKTsKKwordm9pZCBkZWJ1Z19wcmludF9yZXQoIHNzbF9jb250ZXh0ICpzc2wsIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqdGV4dCwgaW50IHJldCApOworCit2b2lkIGRlYnVnX3ByaW50X2J1Ziggc3NsX2NvbnRleHQgKnNzbCwgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpbGUsIGludCBsaW5lLCBjaGFyICp0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiApOworCit2b2lkIGRlYnVnX3ByaW50X21waSggc3NsX2NvbnRleHQgKnNzbCwgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpbGUsIGludCBsaW5lLCBjaGFyICp0ZXh0LCBtcGkgKlggKTsKKwordm9pZCBkZWJ1Z19wcmludF9jcnQoIHNzbF9jb250ZXh0ICpzc2wsIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqdGV4dCwgeDUwOV9jZXJ0ICpjcnQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIGRlYnVnLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcG9sYXJzc2wvZGVzLmggYi9pbmNsdWRlL3BvbGFyc3NsL2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMThlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3BvbGFyc3NsL2Rlcy5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKioKKyAqIFxmaWxlIGRlcy5oCisgKi8KKyNpZm5kZWYgWFlTU0xfREVTX0gKKyNkZWZpbmUgWFlTU0xfREVTX0gKKworI2RlZmluZSBERVNfRU5DUllQVCAgICAgMQorI2RlZmluZSBERVNfREVDUllQVCAgICAgMAorCisvKioKKyAqIFxicmllZiAgICAgICAgICBERVMgY29udGV4dCBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgbW9kZTsgICAgICAgICAgICAgICAgICAgLyohPCAgZW5jcnlwdC9kZWNyeXB0ICAgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNrWzMyXTsgICAgICAgLyohPCAgREVTIHN1YmtleXMgICAgICAgKi8KK30KK2Rlc19jb250ZXh0OworCisvKioKKyAqIFxicmllZiAgICAgICAgICBUcmlwbGUtREVTIGNvbnRleHQgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IG1vZGU7ICAgICAgICAgICAgICAgICAgIC8qITwgIGVuY3J5cHQvZGVjcnlwdCAgICovCisgICAgdW5zaWduZWQgbG9uZyBza1s5Nl07ICAgICAgIC8qITwgIDNERVMgc3Via2V5cyAgICAgICovCit9CitkZXMzX2NvbnRleHQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgREVTIGtleSBzY2hlZHVsZSAoNTYtYml0LCBlbmNyeXB0aW9uKQorICoKKyAqIFxwYXJhbSBjdHggICAgICBERVMgY29udGV4dCB0byBiZSBpbml0aWFsaXplZAorICogXHBhcmFtIGtleSAgICAgIDgtYnl0ZSBzZWNyZXQga2V5CisgKi8KK3ZvaWQgZGVzX3NldGtleV9lbmMoIGRlc19jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIga2V5WzhdICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIERFUyBrZXkgc2NoZWR1bGUgKDU2LWJpdCwgZGVjcnlwdGlvbikKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgREVTIGNvbnRleHQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqIFxwYXJhbSBrZXkgICAgICA4LWJ5dGUgc2VjcmV0IGtleQorICovCit2b2lkIGRlc19zZXRrZXlfZGVjKCBkZXNfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIGtleVs4XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBUcmlwbGUtREVTIGtleSBzY2hlZHVsZSAoMTEyLWJpdCwgZW5jcnlwdGlvbikKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgM0RFUyBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKiBccGFyYW0ga2V5ICAgICAgMTYtYnl0ZSBzZWNyZXQga2V5CisgKi8KK3ZvaWQgZGVzM19zZXQya2V5X2VuYyggZGVzM19jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIga2V5WzE2XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBUcmlwbGUtREVTIGtleSBzY2hlZHVsZSAoMTEyLWJpdCwgZGVjcnlwdGlvbikKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgM0RFUyBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKiBccGFyYW0ga2V5ICAgICAgMTYtYnl0ZSBzZWNyZXQga2V5CisgKi8KK3ZvaWQgZGVzM19zZXQya2V5X2RlYyggZGVzM19jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIga2V5WzE2XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBUcmlwbGUtREVTIGtleSBzY2hlZHVsZSAoMTY4LWJpdCwgZW5jcnlwdGlvbikKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgM0RFUyBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKiBccGFyYW0ga2V5ICAgICAgMjQtYnl0ZSBzZWNyZXQga2V5CisgKi8KK3ZvaWQgZGVzM19zZXQza2V5X2VuYyggZGVzM19jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIga2V5WzI0XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBUcmlwbGUtREVTIGtleSBzY2hlZHVsZSAoMTY4LWJpdCwgZGVjcnlwdGlvbikKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgM0RFUyBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKiBccGFyYW0ga2V5ICAgICAgMjQtYnl0ZSBzZWNyZXQga2V5CisgKi8KK3ZvaWQgZGVzM19zZXQza2V5X2RlYyggZGVzM19jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIga2V5WzI0XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBERVMtRUNCIGJsb2NrIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICoKKyAqIFxwYXJhbSBjdHggICAgICBERVMgY29udGV4dAorICogXHBhcmFtIGlucHV0ICAgIDY0LWJpdCBpbnB1dCBibG9jaworICogXHBhcmFtIG91dHB1dCAgIDY0LWJpdCBvdXRwdXQgYmxvY2sKKyAqLwordm9pZCBkZXNfY3J5cHRfZWNiKCBkZXNfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGlucHV0WzhdLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFs4XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBERVMtQ0JDIGJ1ZmZlciBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAqCisgKiBccGFyYW0gY3R4ICAgICAgREVTIGNvbnRleHQKKyAqIFxwYXJhbSBtb2RlICAgICBERVNfRU5DUllQVCBvciBERVNfREVDUllQVAorICogXHBhcmFtIGxlbmd0aCAgIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQorICogXHBhcmFtIGl2ICAgICAgIGluaXRpYWxpemF0aW9uIHZlY3RvciAodXBkYXRlZCBhZnRlciB1c2UpCisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBidWZmZXIgaG9sZGluZyB0aGUgb3V0cHV0IGRhdGEKKyAqLwordm9pZCBkZXNfY3J5cHRfY2JjKCBkZXNfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpdls4XSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAzREVTLUVDQiBibG9jayBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAqCisgKiBccGFyYW0gY3R4ICAgICAgM0RFUyBjb250ZXh0CisgKiBccGFyYW0gaW5wdXQgICAgNjQtYml0IGlucHV0IGJsb2NrCisgKiBccGFyYW0gb3V0cHV0ICAgNjQtYml0IG91dHB1dCBibG9jaworICovCit2b2lkIGRlczNfY3J5cHRfZWNiKCBkZXMzX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5wdXRbOF0sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFs4XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAzREVTLUNCQyBidWZmZXIgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKgorICogXHBhcmFtIGN0eCAgICAgIDNERVMgY29udGV4dAorICogXHBhcmFtIG1vZGUgICAgIERFU19FTkNSWVBUIG9yIERFU19ERUNSWVBUCisgKiBccGFyYW0gbGVuZ3RoICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgKiBccGFyYW0gaXYgICAgICAgaW5pdGlhbGl6YXRpb24gdmVjdG9yICh1cGRhdGVkIGFmdGVyIHVzZSkKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgaW5wdXQgZGF0YQorICogXHBhcmFtIG91dHB1dCAgIGJ1ZmZlciBob2xkaW5nIHRoZSBvdXRwdXQgZGF0YQorICovCit2b2lkIGRlczNfY3J5cHRfY2JjKCBkZXMzX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaXZbOF0sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCApOworCisvKgorICogXGJyaWVmICAgICAgICAgIENoZWNrdXAgcm91dGluZQorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgaWYgdGhlIHRlc3QgZmFpbGVkCisgKi8KK2ludCBkZXNfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogZGVzLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcG9sYXJzc2wvZGhtLmggYi9pbmNsdWRlL3BvbGFyc3NsL2RobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyN2Q2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3BvbGFyc3NsL2RobS5oCkBAIC0wLDAgKzEsMTIyIEBACisvKioKKyAqIFxmaWxlIGRobS5oCisgKi8KKyNpZm5kZWYgWFlTU0xfREhNX0gKKyNkZWZpbmUgWFlTU0xfREhNX0gKKworI2luY2x1ZGUgInh5c3NsL2JpZ251bS5oIgorCisjZGVmaW5lIFhZU1NMX0VSUl9ESE1fQkFEX0lOUFVUX0RBVEEgICAgICAgICAgICAgICAgICAgIC0weDA0ODAKKyNkZWZpbmUgWFlTU0xfRVJSX0RITV9SRUFEX1BBUkFNU19GQUlMRUQgICAgICAgICAgICAgICAgLTB4MDQ5MAorI2RlZmluZSBYWVNTTF9FUlJfREhNX01BS0VfUEFSQU1TX0ZBSUxFRCAgICAgICAgICAgICAgICAtMHgwNEEwCisjZGVmaW5lIFhZU1NMX0VSUl9ESE1fUkVBRF9QVUJMSUNfRkFJTEVEICAgICAgICAgICAgICAgIC0weDA0QjAKKyNkZWZpbmUgWFlTU0xfRVJSX0RITV9NQUtFX1BVQkxJQ19GQUlMRUQgICAgICAgICAgICAgICAgLTB4MDRDMAorI2RlZmluZSBYWVNTTF9FUlJfREhNX0NBTENfU0VDUkVUX0ZBSUxFRCAgICAgICAgICAgICAgICAtMHgwNEQwCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGxlbjsgICAgLyohPCAgc2l6ZShQKSBpbiBjaGFycyAgKi8KKyAgICBtcGkgUDsgICAgICAvKiE8ICBwcmltZSBtb2R1bHVzICAgICAqLworICAgIG1waSBHOyAgICAgIC8qITwgIGdlbmVyYXRvciAgICAgICAgICovCisgICAgbXBpIFg7ICAgICAgLyohPCAgc2VjcmV0IHZhbHVlICAgICAgKi8KKyAgICBtcGkgR1g7ICAgICAvKiE8ICBzZWxmID0gR15YIG1vZCBQICAqLworICAgIG1waSBHWTsgICAgIC8qITwgIHBlZXIgPSBHXlkgbW9kIFAgICovCisgICAgbXBpIEs7ICAgICAgLyohPCAga2V5ID0gR1leWCBtb2QgUCAgKi8KKyAgICBtcGkgUlA7ICAgICAvKiE8ICBjYWNoZWQgUl4yIG1vZCBQICAqLworfQorZGhtX2NvbnRleHQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgUGFyc2UgdGhlIFNlcnZlcktleUV4Y2hhbmdlIHBhcmFtZXRlcnMKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgREhNIGNvbnRleHQKKyAqIFxwYXJhbSBwICAgICAgICAmKHN0YXJ0IG9mIGlucHV0IGJ1ZmZlcikKKyAqIFxwYXJhbSBlbmQgICAgICBlbmQgb2YgYnVmZmVyCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYW4gWFlTU0xfRVJSX0RITV9YWFggZXJyb3IgY29kZQorICovCitpbnQgZGhtX3JlYWRfcGFyYW1zKCBkaG1fY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKnAsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbmQgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgU2V0dXAgYW5kIHdyaXRlIHRoZSBTZXJ2ZXJLZXlFeGNoYW5nZSBwYXJhbWV0ZXJzCisgKgorICogXHBhcmFtIGN0eCAgICAgIERITSBjb250ZXh0CisgKiBccGFyYW0geF9zaXplICAgcHJpdmF0ZSB2YWx1ZSBzaXplIGluIGJpdHMKKyAqIFxwYXJhbSBvdXRwdXQgICBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFxwYXJhbSBvbGVuICAgICBudW1iZXIgb2YgY2hhcnMgd3JpdHRlbgorICogXHBhcmFtIGZfcm5nICAgIFJORyBmdW5jdGlvbgorICogXHBhcmFtIHBfcm5nICAgIFJORyBwYXJhbWV0ZXIKKyAqCisgKiBcbm90ZSAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgY3R4LT5QIGFuZCBjdHgtPkcKKyAqICAgICAgICAgICAgICAgICBoYXZlIGFscmVhZHkgYmVlbiBwcm9wZXJseSBzZXQgKGZvciBleGFtcGxlCisgKiAgICAgICAgICAgICAgICAgdXNpbmcgbXBpX3JlYWRfc3RyaW5nIG9yIG1waV9yZWFkX2JpbmFyeSkuCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYW4gWFlTU0xfRVJSX0RITV9YWFggZXJyb3IgY29kZQorICovCitpbnQgZGhtX21ha2VfcGFyYW1zKCBkaG1fY29udGV4dCAqY3R4LCBpbnQgc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBpbnQgKm9sZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmX3JuZykodm9pZCAqKSwgdm9pZCAqcF9ybmcgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgSW1wb3J0IHRoZSBwZWVyJ3MgcHVibGljIHZhbHVlIEdeWQorICoKKyAqIFxwYXJhbSBjdHggICAgICBESE0gY29udGV4dAorICogXHBhcmFtIGlucHV0ICAgIGlucHV0IGJ1ZmZlcgorICogXHBhcmFtIGlsZW4gICAgIHNpemUgb2YgYnVmZmVyCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYW4gWFlTU0xfRVJSX0RITV9YWFggZXJyb3IgY29kZQorICovCitpbnQgZGhtX3JlYWRfcHVibGljKCBkaG1fY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIENyZWF0ZSBvd24gcHJpdmF0ZSB2YWx1ZSBYIGFuZCBleHBvcnQgR15YCisgKgorICogXHBhcmFtIGN0eCAgICAgIERITSBjb250ZXh0CisgKiBccGFyYW0geF9zaXplICAgcHJpdmF0ZSB2YWx1ZSBzaXplIGluIGJpdHMKKyAqIFxwYXJhbSBvdXRwdXQgICBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFxwYXJhbSBvbGVuICAgICBtdXN0IGJlIGVxdWFsIHRvIGN0eC0+UC5sZW4KKyAqIFxwYXJhbSBmX3JuZyAgICBSTkcgZnVuY3Rpb24KKyAqIFxwYXJhbSBwX3JuZyAgICBSTkcgcGFyYW1ldGVyCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYW4gWFlTU0xfRVJSX0RITV9YWFggZXJyb3IgY29kZQorICovCitpbnQgZGhtX21ha2VfcHVibGljKCBkaG1fY29udGV4dCAqY3R4LCBpbnQgc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBpbnQgb2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCAoKmZfcm5nKSh2b2lkICopLCB2b2lkICpwX3JuZyApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBEZXJpdmUgYW5kIGV4cG9ydCB0aGUgc2hhcmVkIHNlY3JldCAoR15ZKV5YIG1vZCBQCisgKgorICogXHBhcmFtIGN0eCAgICAgIERITSBjb250ZXh0CisgKiBccGFyYW0gb3V0cHV0ICAgZGVzdGluYXRpb24gYnVmZmVyCisgKiBccGFyYW0gb2xlbiAgICAgbnVtYmVyIG9mIGNoYXJzIHdyaXR0ZW4KKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciBhbiBYWVNTTF9FUlJfREhNX1hYWCBlcnJvciBjb2RlCisgKi8KK2ludCBkaG1fY2FsY19zZWNyZXQoIGRobV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCAqb2xlbiApOworCisvKgorICogXGJyaWVmICAgICAgICAgIEZyZWUgdGhlIGNvbXBvbmVudHMgb2YgYSBESE0ga2V5CisgKi8KK3ZvaWQgZGhtX2ZyZWUoIGRobV9jb250ZXh0ICpjdHggKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQ2hlY2t1cCByb3V0aW5lCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBpZiB0aGUgdGVzdCBmYWlsZWQKKyAqLworaW50IGRobV9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wb2xhcnNzbC9oYXZlZ2UuaCBiL2luY2x1ZGUvcG9sYXJzc2wvaGF2ZWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkODRiNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcG9sYXJzc2wvaGF2ZWdlLmgKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBcZmlsZSBoYXZlZ2UuaAorICovCisjaWZuZGVmIFhZU1NMX0hBVkVHRV9ICisjZGVmaW5lIFhZU1NMX0hBVkVHRV9ICisKKyNkZWZpbmUgQ09MTEVDVF9TSVpFIDEwMjQKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgSEFWRUdFIHN0YXRlIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBQVDEsIFBUMiwgb2Zmc2V0WzJdOworICAgIGludCBwb29sW0NPTExFQ1RfU0laRV07CisgICAgaW50IFdBTEtbODE5Ml07Cit9CitoYXZlZ2Vfc3RhdGU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgSEFWRUdFIGluaXRpYWxpemF0aW9uCisgKgorICogXHBhcmFtIGhzICAgICAgIEhBVkVHRSBzdGF0ZSB0byBiZSBpbml0aWFsaXplZAorICovCit2b2lkIGhhdmVnZV9pbml0KCBoYXZlZ2Vfc3RhdGUgKmhzICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIEhBVkVHRSByYW5kIGZ1bmN0aW9uCisgKgorICogXHBhcmFtIHJuZ19zdCAgIHBvaW50cyB0byBhbiBIQVZFR0Ugc3RhdGUKKyAqCisgKiBccmV0dXJuICAgICAgICAgQSByYW5kb20gaW50CisgKi8KK2ludCBoYXZlZ2VfcmFuZCggdm9pZCAqcF9ybmcgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIGhhdmVnZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL21kMi5oIGIvaW5jbHVkZS9wb2xhcnNzbC9tZDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzAzNDgzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wb2xhcnNzbC9tZDIuaApAQCAtMCwwICsxLDEyMCBAQAorLyoqCisgKiBcZmlsZSBtZDIuaAorICovCisjaWZuZGVmIFhZU1NMX01EMl9ICisjZGVmaW5lIFhZU1NMX01EMl9ICisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE1EMiBjb250ZXh0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGNoYXIgY2tzdW1bMTZdOyAgICAvKiE8IGNoZWNrc3VtIG9mIHRoZSBkYXRhIGJsb2NrICovCisgICAgdW5zaWduZWQgY2hhciBzdGF0ZVs0OF07ICAgIC8qITwgaW50ZXJtZWRpYXRlIGRpZ2VzdCBzdGF0ZSAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07ICAgLyohPCBkYXRhIGJsb2NrIGJlaW5nIHByb2Nlc3NlZCAqLworCisgICAgdW5zaWduZWQgY2hhciBpcGFkWzY0XTsgICAgIC8qITwgSE1BQzogaW5uZXIgcGFkZGluZyAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG9wYWRbNjRdOyAgICAgLyohPCBITUFDOiBvdXRlciBwYWRkaW5nICAgICAgICAqLworICAgIGludCBsZWZ0OyAgICAgICAgICAgICAgICAgICAvKiE8IGFtb3VudCBvZiBkYXRhIGluIGJ1ZmZlciAgICovCit9CittZDJfY29udGV4dDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxicmllZiAgICAgICAgICBNRDIgY29udGV4dCBzZXR1cAorICoKKyAqIFxwYXJhbSBjdHggICAgICBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKi8KK3ZvaWQgbWQyX3N0YXJ0cyggbWQyX2NvbnRleHQgKmN0eCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBNRDIgcHJvY2VzcyBidWZmZXIKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgTUQyIGNvbnRleHQKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqLwordm9pZCBtZDJfdXBkYXRlKCBtZDJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTUQyIGZpbmFsIGRpZ2VzdAorICoKKyAqIFxwYXJhbSBjdHggICAgICBNRDIgY29udGV4dAorICogXHBhcmFtIG91dHB1dCAgIE1EMiBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBtZDJfZmluaXNoKCBtZDJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgT3V0cHV0ID0gTUQyKCBpbnB1dCBidWZmZXIgKQorICoKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBNRDIgY2hlY2tzdW0gcmVzdWx0CisgKi8KK3ZvaWQgbWQyKCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBPdXRwdXQgPSBNRDIoIGZpbGUgY29udGVudHMgKQorICoKKyAqIFxwYXJhbSBwYXRoICAgICBpbnB1dCBmaWxlIG5hbWUKKyAqIFxwYXJhbSBvdXRwdXQgICBNRDIgY2hlY2tzdW0gcmVzdWx0CisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgMSBpZiBmb3BlbiBmYWlsZWQsCisgKiAgICAgICAgICAgICAgICAgb3IgMiBpZiBmcmVhZCBmYWlsZWQKKyAqLworaW50IG1kMl9maWxlKCBjaGFyICpwYXRoLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTUQyIEhNQUMgY29udGV4dCBzZXR1cAorICoKKyAqIFxwYXJhbSBjdHggICAgICBITUFDIGNvbnRleHQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqIFxwYXJhbSBrZXkgICAgICBITUFDIHNlY3JldCBrZXkKKyAqIFxwYXJhbSBrZXlsZW4gICBsZW5ndGggb2YgdGhlIEhNQUMga2V5CisgKi8KK3ZvaWQgbWQyX2htYWNfc3RhcnRzKCBtZDJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTUQyIEhNQUMgcHJvY2VzcyBidWZmZXIKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgSE1BQyBjb250ZXh0CisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbiAgICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgKi8KK3ZvaWQgbWQyX2htYWNfdXBkYXRlKCBtZDJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTUQyIEhNQUMgZmluYWwgZGlnZXN0CisgKgorICogXHBhcmFtIGN0eCAgICAgIEhNQUMgY29udGV4dAorICogXHBhcmFtIG91dHB1dCAgIE1EMiBITUFDIGNoZWNrc3VtIHJlc3VsdAorICovCit2b2lkIG1kMl9obWFjX2ZpbmlzaCggbWQyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE91dHB1dCA9IEhNQUMtTUQyKCBobWFjIGtleSwgaW5wdXQgYnVmZmVyICkKKyAqCisgKiBccGFyYW0ga2V5ICAgICAgSE1BQyBzZWNyZXQga2V5CisgKiBccGFyYW0ga2V5bGVuICAgbGVuZ3RoIG9mIHRoZSBITUFDIGtleQorICogXHBhcmFtIGlucHV0ICAgIGJ1ZmZlciBob2xkaW5nIHRoZSAgZGF0YQorICogXHBhcmFtIGlsZW4gICAgIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQorICogXHBhcmFtIG91dHB1dCAgIEhNQUMtTUQyIHJlc3VsdAorICovCit2b2lkIG1kMl9obWFjKCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sCisgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQ2hlY2t1cCByb3V0aW5lCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBpZiB0aGUgdGVzdCBmYWlsZWQKKyAqLworaW50IG1kMl9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBtZDIuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wb2xhcnNzbC9tZDQuaCBiL2luY2x1ZGUvcG9sYXJzc2wvbWQ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhN2MzMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcG9sYXJzc2wvbWQ0LmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qKgorICogXGZpbGUgbWQ0LmgKKyAqLworI2lmbmRlZiBYWVNTTF9NRDRfSAorI2RlZmluZSBYWVNTTF9NRDRfSAorCisvKioKKyAqIFxicmllZiAgICAgICAgICBNRDQgY29udGV4dCBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsWzJdOyAgICAgLyohPCBudW1iZXIgb2YgYnl0ZXMgcHJvY2Vzc2VkICAqLworICAgIHVuc2lnbmVkIGxvbmcgc3RhdGVbNF07ICAgICAvKiE8IGludGVybWVkaWF0ZSBkaWdlc3Qgc3RhdGUgICovCisgICAgdW5zaWduZWQgY2hhciBidWZmZXJbNjRdOyAgIC8qITwgZGF0YSBibG9jayBiZWluZyBwcm9jZXNzZWQgKi8KKworICAgIHVuc2lnbmVkIGNoYXIgaXBhZFs2NF07ICAgICAvKiE8IEhNQUM6IGlubmVyIHBhZGRpbmcgICAgICAgICovCisgICAgdW5zaWduZWQgY2hhciBvcGFkWzY0XTsgICAgIC8qITwgSE1BQzogb3V0ZXIgcGFkZGluZyAgICAgICAgKi8KK30KK21kNF9jb250ZXh0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE1ENCBjb250ZXh0IHNldHVwCisgKgorICogXHBhcmFtIGN0eCAgICAgIGNvbnRleHQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqLwordm9pZCBtZDRfc3RhcnRzKCBtZDRfY29udGV4dCAqY3R4ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE1ENCBwcm9jZXNzIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBjdHggICAgICBNRDQgY29udGV4dAorICogXHBhcmFtIGlucHV0ICAgIGJ1ZmZlciBob2xkaW5nIHRoZSAgZGF0YQorICogXHBhcmFtIGlsZW4gICAgIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQorICovCit2b2lkIG1kNF91cGRhdGUoIG1kNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBNRDQgZmluYWwgZGlnZXN0CisgKgorICogXHBhcmFtIGN0eCAgICAgIE1ENCBjb250ZXh0CisgKiBccGFyYW0gb3V0cHV0ICAgTUQ0IGNoZWNrc3VtIHJlc3VsdAorICovCit2b2lkIG1kNF9maW5pc2goIG1kNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBPdXRwdXQgPSBNRDQoIGlucHV0IGJ1ZmZlciApCisgKgorICogXHBhcmFtIGlucHV0ICAgIGJ1ZmZlciBob2xkaW5nIHRoZSAgZGF0YQorICogXHBhcmFtIGlsZW4gICAgIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQorICogXHBhcmFtIG91dHB1dCAgIE1ENCBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBtZDQoIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE91dHB1dCA9IE1ENCggZmlsZSBjb250ZW50cyApCisgKgorICogXHBhcmFtIHBhdGggICAgIGlucHV0IGZpbGUgbmFtZQorICogXHBhcmFtIG91dHB1dCAgIE1ENCBjaGVja3N1bSByZXN1bHQKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCAxIGlmIGZvcGVuIGZhaWxlZCwKKyAqICAgICAgICAgICAgICAgICBvciAyIGlmIGZyZWFkIGZhaWxlZAorICovCitpbnQgbWQ0X2ZpbGUoIGNoYXIgKnBhdGgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBNRDQgSE1BQyBjb250ZXh0IHNldHVwCisgKgorICogXHBhcmFtIGN0eCAgICAgIEhNQUMgY29udGV4dCB0byBiZSBpbml0aWFsaXplZAorICogXHBhcmFtIGtleSAgICAgIEhNQUMgc2VjcmV0IGtleQorICogXHBhcmFtIGtleWxlbiAgIGxlbmd0aCBvZiB0aGUgSE1BQyBrZXkKKyAqLwordm9pZCBtZDRfaG1hY19zdGFydHMoIG1kNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBNRDQgSE1BQyBwcm9jZXNzIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBjdHggICAgICBITUFDIGNvbnRleHQKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqLwordm9pZCBtZDRfaG1hY191cGRhdGUoIG1kNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBNRDQgSE1BQyBmaW5hbCBkaWdlc3QKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgSE1BQyBjb250ZXh0CisgKiBccGFyYW0gb3V0cHV0ICAgTUQ0IEhNQUMgY2hlY2tzdW0gcmVzdWx0CisgKi8KK3ZvaWQgbWQ0X2htYWNfZmluaXNoKCBtZDRfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgT3V0cHV0ID0gSE1BQy1NRDQoIGhtYWMga2V5LCBpbnB1dCBidWZmZXIgKQorICoKKyAqIFxwYXJhbSBrZXkgICAgICBITUFDIHNlY3JldCBrZXkKKyAqIFxwYXJhbSBrZXlsZW4gICBsZW5ndGggb2YgdGhlIEhNQUMga2V5CisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbiAgICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgKiBccGFyYW0gb3V0cHV0ICAgSE1BQy1NRDQgcmVzdWx0CisgKi8KK3ZvaWQgbWQ0X2htYWMoIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBDaGVja3VwIHJvdXRpbmUKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciAxIGlmIHRoZSB0ZXN0IGZhaWxlZAorICovCitpbnQgbWQ0X3NlbGZfdGVzdCggaW50IHZlcmJvc2UgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIG1kNC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL21kNS5oIGIvaW5jbHVkZS9wb2xhcnNzbC9tZDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzcyNTQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wb2xhcnNzbC9tZDUuaApAQCAtMCwwICsxLDExOSBAQAorLyoqCisgKiBcZmlsZSBtZDUuaAorICovCisjaWZuZGVmIFhZU1NMX01ENV9ICisjZGVmaW5lIFhZU1NMX01ENV9ICisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE1ENSBjb250ZXh0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGxvbmcgdG90YWxbMl07ICAgICAvKiE8IG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQgICovCisgICAgdW5zaWduZWQgbG9uZyBzdGF0ZVs0XTsgICAgIC8qITwgaW50ZXJtZWRpYXRlIGRpZ2VzdCBzdGF0ZSAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07ICAgLyohPCBkYXRhIGJsb2NrIGJlaW5nIHByb2Nlc3NlZCAqLworCisgICAgdW5zaWduZWQgY2hhciBpcGFkWzY0XTsgICAgIC8qITwgSE1BQzogaW5uZXIgcGFkZGluZyAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG9wYWRbNjRdOyAgICAgLyohPCBITUFDOiBvdXRlciBwYWRkaW5nICAgICAgICAqLworfQorbWQ1X2NvbnRleHQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTUQ1IGNvbnRleHQgc2V0dXAKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgY29udGV4dCB0byBiZSBpbml0aWFsaXplZAorICovCit2b2lkIG1kNV9zdGFydHMoIG1kNV9jb250ZXh0ICpjdHggKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTUQ1IHByb2Nlc3MgYnVmZmVyCisgKgorICogXHBhcmFtIGN0eCAgICAgIE1ENSBjb250ZXh0CisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbiAgICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgKi8KK3ZvaWQgbWQ1X3VwZGF0ZSggbWQ1X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE1ENSBmaW5hbCBkaWdlc3QKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgTUQ1IGNvbnRleHQKKyAqIFxwYXJhbSBvdXRwdXQgICBNRDUgY2hlY2tzdW0gcmVzdWx0CisgKi8KK3ZvaWQgbWQ1X2ZpbmlzaCggbWQ1X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE91dHB1dCA9IE1ENSggaW5wdXQgYnVmZmVyICkKKyAqCisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbiAgICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgKiBccGFyYW0gb3V0cHV0ICAgTUQ1IGNoZWNrc3VtIHJlc3VsdAorICovCit2b2lkIG1kNSggdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgT3V0cHV0ID0gTUQ1KCBmaWxlIGNvbnRlbnRzICkKKyAqCisgKiBccGFyYW0gcGF0aCAgICAgaW5wdXQgZmlsZSBuYW1lCisgKiBccGFyYW0gb3V0cHV0ICAgTUQ1IGNoZWNrc3VtIHJlc3VsdAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIDEgaWYgZm9wZW4gZmFpbGVkLAorICogICAgICAgICAgICAgICAgIG9yIDIgaWYgZnJlYWQgZmFpbGVkCisgKi8KK2ludCBtZDVfZmlsZSggY2hhciAqcGF0aCwgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE1ENSBITUFDIGNvbnRleHQgc2V0dXAKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgSE1BQyBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKiBccGFyYW0ga2V5ICAgICAgSE1BQyBzZWNyZXQga2V5CisgKiBccGFyYW0ga2V5bGVuICAgbGVuZ3RoIG9mIHRoZSBITUFDIGtleQorICovCit2b2lkIG1kNV9obWFjX3N0YXJ0cyggbWQ1X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE1ENSBITUFDIHByb2Nlc3MgYnVmZmVyCisgKgorICogXHBhcmFtIGN0eCAgICAgIEhNQUMgY29udGV4dAorICogXHBhcmFtIGlucHV0ICAgIGJ1ZmZlciBob2xkaW5nIHRoZSAgZGF0YQorICogXHBhcmFtIGlsZW4gICAgIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQorICovCit2b2lkIG1kNV9obWFjX3VwZGF0ZSggbWQ1X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE1ENSBITUFDIGZpbmFsIGRpZ2VzdAorICoKKyAqIFxwYXJhbSBjdHggICAgICBITUFDIGNvbnRleHQKKyAqIFxwYXJhbSBvdXRwdXQgICBNRDUgSE1BQyBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBtZDVfaG1hY19maW5pc2goIG1kNV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBPdXRwdXQgPSBITUFDLU1ENSggaG1hYyBrZXksIGlucHV0IGJ1ZmZlciApCisgKgorICogXHBhcmFtIGtleSAgICAgIEhNQUMgc2VjcmV0IGtleQorICogXHBhcmFtIGtleWxlbiAgIGxlbmd0aCBvZiB0aGUgSE1BQyBrZXkKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBITUFDLU1ENSByZXN1bHQKKyAqLwordm9pZCBtZDVfaG1hYyggdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIENoZWNrdXAgcm91dGluZQorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgaWYgdGhlIHRlc3QgZmFpbGVkCisgKi8KK2ludCBtZDVfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogbWQ1LmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcG9sYXJzc2wvbmV0LmggYi9pbmNsdWRlL3BvbGFyc3NsL25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjBiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3BvbGFyc3NsL25ldC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKioKKyAqIFxmaWxlIG5ldC5oCisgKi8KKyNpZm5kZWYgWFlTU0xfTkVUX0gKKyNkZWZpbmUgWFlTU0xfTkVUX0gKKworI2RlZmluZSBYWVNTTF9FUlJfTkVUX1VOS05PV05fSE9TVCAgICAgICAgICAgICAgICAgICAgICAtMHgwRjAwCisjZGVmaW5lIFhZU1NMX0VSUl9ORVRfU09DS0VUX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIC0weDBGMTAKKyNkZWZpbmUgWFlTU0xfRVJSX05FVF9DT05ORUNUX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgLTB4MEYyMAorI2RlZmluZSBYWVNTTF9FUlJfTkVUX0JJTkRfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAtMHgwRjMwCisjZGVmaW5lIFhZU1NMX0VSUl9ORVRfTElTVEVOX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIC0weDBGNDAKKyNkZWZpbmUgWFlTU0xfRVJSX05FVF9BQ0NFUFRfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgLTB4MEY1MAorI2RlZmluZSBYWVNTTF9FUlJfTkVUX1JFQ1ZfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAtMHgwRjYwCisjZGVmaW5lIFhZU1NMX0VSUl9ORVRfU0VORF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgIC0weDBGNzAKKyNkZWZpbmUgWFlTU0xfRVJSX05FVF9DT05OX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgLTB4MEY4MAorI2RlZmluZSBYWVNTTF9FUlJfTkVUX1RSWV9BR0FJTiAgICAgICAgICAgICAgICAgICAgICAgICAtMHgwRjkwCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgSW5pdGlhdGUgYSBUQ1AgY29ubmVjdGlvbiB3aXRoIGhvc3Q6cG9ydAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIG9uZSBvZjoKKyAqICAgICAgICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9ORVRfU09DS0VUX0ZBSUxFRCwKKyAqICAgICAgICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9ORVRfVU5LTk9XTl9IT1NULAorICogICAgICAgICAgICAgICAgICAgICAgWFlTU0xfRVJSX05FVF9DT05ORUNUX0ZBSUxFRAorICovCitpbnQgbmV0X2Nvbm5lY3QoIGludCAqZmQsIGNoYXIgKmhvc3QsIGludCBwb3J0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIENyZWF0ZSBhIGxpc3RlbmluZyBzb2NrZXQgb24gYmluZF9pcDpwb3J0LgorICogICAgICAgICAgICAgICAgIElmIGJpbmRfaXAgPT0gTlVMTCwgYWxsIGludGVyZmFjZXMgYXJlIGJpbmRlZC4KKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciBvbmUgb2Y6CisgKiAgICAgICAgICAgICAgICAgICAgICBYWVNTTF9FUlJfTkVUX1NPQ0tFVF9GQUlMRUQsCisgKiAgICAgICAgICAgICAgICAgICAgICBYWVNTTF9FUlJfTkVUX0JJTkRfRkFJTEVELAorICogICAgICAgICAgICAgICAgICAgICAgWFlTU0xfRVJSX05FVF9MSVNURU5fRkFJTEVECisgKi8KK2ludCBuZXRfYmluZCggaW50ICpmZCwgY2hhciAqYmluZF9pcCwgaW50IHBvcnQgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQWNjZXB0IGEgY29ubmVjdGlvbiBmcm9tIGEgcmVtb3RlIGNsaWVudAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIFhZU1NMX0VSUl9ORVRfQUNDRVBUX0ZBSUxFRCwgb3IKKyAqICAgICAgICAgICAgICAgICBYWVNTTF9FUlJfTkVUX1dPVUxEX0JMT0NLIGlzIGJpbmRfZmQgd2FzIHNldCB0bworICogICAgICAgICAgICAgICAgIG5vbi1ibG9ja2luZyBhbmQgYWNjZXB0KCkgaXMgYmxvY2tpbmcuCisgKi8KK2ludCBuZXRfYWNjZXB0KCBpbnQgYmluZF9mZCwgaW50ICpjbGllbnRfZmQsIHZvaWQgKmNsaWVudF9pcCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTZXQgdGhlIHNvY2tldCBibG9ja2luZworICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbm9uLXplcm8gZXJyb3IgY29kZQorICovCitpbnQgbmV0X3NldF9ibG9jayggaW50IGZkICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNldCB0aGUgc29ja2V0IG5vbi1ibG9ja2luZworICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbm9uLXplcm8gZXJyb3IgY29kZQorICovCitpbnQgbmV0X3NldF9ub25ibG9jayggaW50IGZkICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFBvcnRhYmxlIHVzbGVlcCBoZWxwZXIKKyAqCisgKiBcbm90ZSAgICAgICAgICAgUmVhbCBhbW91bnQgb2YgdGltZSBzbGVwdCB3aWxsIG5vdCBiZSBsZXNzIHRoYW4KKyAqICAgICAgICAgICAgICAgICBzZWxlY3QoKSdzIHRpbWVvdXQgZ3JhbnVsYXJpdHkgKHR5cGljYWxseSwgMTBtcykuCisgKi8KK3ZvaWQgbmV0X3VzbGVlcCggdW5zaWduZWQgbG9uZyB1c2VjICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFJlYWQgYXQgbW9zdCAnbGVuJyBjaGFyYWN0ZXJzLiBsZW4gaXMgdXBkYXRlZCB0bworICogICAgICAgICAgICAgICAgIHJlZmxlY3QgdGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLgorICoKKyAqIFxyZXR1cm4gICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwKKyAqICAgICAgICAgICAgICAgICBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGU7IFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOCisgKiAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHJlYWQoKSBpcyBibG9ja2luZy4KKyAqLworaW50IG5ldF9yZWN2KCB2b2lkICpjdHgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBXcml0ZSBhdCBtb3N0ICdsZW4nIGNoYXJhY3RlcnMuIGxlbiBpcyB1cGRhdGVkIHRvCisgKiAgICAgICAgICAgICAgICAgcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgX25vdF8gd3JpdHRlbi4KKyAqCisgKiBccmV0dXJuICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCwKKyAqICAgICAgICAgICAgICAgICBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGU7IFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOCisgKiAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHdyaXRlKCkgaXMgYmxvY2tpbmcuCisgKi8KK2ludCBuZXRfc2VuZCggdm9pZCAqY3R4LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgR3JhY2VmdWxseSBzaHV0ZG93biB0aGUgY29ubmVjdGlvbgorICovCit2b2lkIG5ldF9jbG9zZSggaW50IGZkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBuZXQuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wb2xhcnNzbC9vcGVuc3NsLmggYi9pbmNsdWRlL3BvbGFyc3NsL29wZW5zc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDA2NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wb2xhcnNzbC9vcGVuc3NsLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qKgorICogXGZpbGUgb3BlbnNzbC5oCisgKi8KKy8qCisgKiBPcGVuU1NMIHdyYXBwZXIgY29udHJpYnV0ZWQgYnkgRGF2aWQgQmFyZXR0CisgKi8KKyNpZm5kZWYgWFlTU0xfT1BFTlNTTF9ICisjZGVmaW5lIFhZU1NMX09QRU5TU0xfSAorCisjaW5jbHVkZSAieHlzc2wvYWVzLmgiCisjaW5jbHVkZSAieHlzc2wvbWQ1LmgiCisjaW5jbHVkZSAieHlzc2wvcnNhLmgiCisjaW5jbHVkZSAieHlzc2wvc2hhMS5oIgorCisjZGVmaW5lIEFFU19TSVpFICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEFFU19CTE9DS19TSVpFICAgICAgICAgIDE2CisjZGVmaW5lIEFFU19LRVkgICAgICAgICAgICAgICAgIGFlc19jb250ZXh0CisjZGVmaW5lIE1ENV9DVFggICAgICAgICAgICAgICAgIG1kNV9jb250ZXh0CisjZGVmaW5lIFNIQV9DVFggICAgICAgICAgICAgICAgIHNoYTFfY29udGV4dAorCisjZGVmaW5lIFNIQTFfSW5pdCggQ1RYICkgXAorICAgICAgICBzaGExX3N0YXJ0cyggKENUWCkgKQorI2RlZmluZSBTSEExX1VwZGF0ZSggIENUWCwgQlVGLCBMRU4gKSBcCisgICAgICAgIHNoYTFfdXBkYXRlKCAoQ1RYKSwgKHVuc2lnbmVkIGNoYXIgKikoQlVGKSwgKExFTikgKQorI2RlZmluZSBTSEExX0ZpbmFsKCBPVVQsIENUWCApIFwKKyAgICAgICAgc2hhMV9maW5pc2goIChDVFgpLCAoT1VUKSApCisKKyNkZWZpbmUgTUQ1X0luaXQoIENUWCApIFwKKyAgICAgICAgbWQ1X3N0YXJ0cyggKENUWCkgKQorI2RlZmluZSBNRDVfVXBkYXRlKCBDVFgsIEJVRiwgTEVOICkgXAorICAgICAgICBtZDVfdXBkYXRlKCAoQ1RYKSwgKHVuc2lnbmVkIGNoYXIgKikoQlVGKSwgKExFTikgKQorI2RlZmluZSBNRDVfRmluYWwoIE9VVCwgQ1RYICkgXAorICAgICAgICBtZDVfZmluaXNoKCAoQ1RYKSwgKE9VVCkgKQorCisjZGVmaW5lIEFFU19zZXRfZW5jcnlwdF9rZXkoIEtFWSwgS0VZU0laRSwgQ1RYICkgXAorICAgICAgICBhZXNfc2V0a2V5X2VuYyggKENUWCksIChLRVkpLCAoS0VZU0laRSkgKQorI2RlZmluZSBBRVNfc2V0X2RlY3J5cHRfa2V5KCBLRVksIEtFWVNJWkUsIENUWCApIFwKKyAgICAgICAgYWVzX3NldGtleV9kZWMoIChDVFgpLCAoS0VZKSwgKEtFWVNJWkUpICkKKyNkZWZpbmUgQUVTX2NiY19lbmNyeXB0KCBJTlBVVCwgT1VUUFVULCBMRU4sIENUWCwgSVYsIE1PREUgKSBcCisgICAgICAgIGFlc19jcnlwdF9jYmMoIChDVFgpLCAoTU9ERSksIChMRU4pLCAoSVYpLCAoSU5QVVQpLCAoT1VUUFVUKSApCisKKy8qCisgKiBSU0Egc3R1ZmYgZm9sbG93cy4gVE9ETzogbmVlZHMgY2xlYW51cAorICovCitpbmxpbmUgaW50IF9fUlNBX1Bhc3N0aHJvdWdoKCB2b2lkICpvdXRwdXQsIHZvaWQgKmlucHV0LCBpbnQgc2l6ZSApCit7CisgICAgbWVtY3B5KCBvdXRwdXQsIGlucHV0LCBzaXplICk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK2lubGluZSByc2FfY29udGV4dCogZDJpX1JTQV9QVUJLRVkoIHZvaWQgKmlnbm9yZSwgdW5zaWduZWQgY2hhciAqKmJ1ZnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gKQoreworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9ICoodW5zaWduZWQgY2hhciAqKikgYnVmcHRyOworICAgIHJzYV9jb250ZXh0ICpyc2E7CisgICAgCisgICAgLyoKKyAgICAgKiBOb3QgYSBnZW5lcmFsLXB1cnBvc2UgcGFyc2VyOiBvbmx5IHBhcnNlcyBwdWJsaWMga2V5IGZyb20gKmV4YWN0bHkqCisgICAgICogICBvcGVuc3NsIGdlbnJzYSAtb3V0IHByaXZrZXkucGVtIDUxMiAob3IgMTAyNCkKKyAgICAgKiAgIG9wZW5zc2wgcnNhIC1pbiBwcml2a2V5LnBlbSAtb3V0IHByaXZhdGVrZXkuZGVyIC1vdXRmb3JtIGRlcgorICAgICAqICAgb3BlbnNzbCByc2EgLWluIHByaXZrZXkucGVtIC1vdXQgcHVia2V5LmRlciAtb3V0Zm9ybSBkZXIgLXB1Ym91dAorICAgICAqCisgICAgICogVE9ETzogbWFrZSBhIGdlbmVyYWwtcHVycG9zZSBwYXJzZQorICAgICAqLworICAgIGlmKCBpZ25vcmUgIT0gMCB8fCAoIGxlbiAhPSA5NCAmJiBsZW4gIT0gMTYyICkgKQorICAgICAgICByZXR1cm4oIDAgKTsKKworICAgIHJzYSA9IChyc2FfY29udGV4dCAqKSBtYWxsb2MoIHNpemVvZiggcnNhX3JzYSApICk7CisgICAgaWYoIHJzYSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuKCAwICk7CisKKyAgICBtZW1zZXQoIHJzYSwgMCwgc2l6ZW9mKCByc2FfY29udGV4dCApICk7CisKKyAgICBpZiggKCBsZW4gPT0gIDk0ICYmIAorICAgICAgICAgIG1waV9yZWFkX2JpbmFyeSggJnJzYS0+TiwgJmJ1ZmZlclsgMjVdLCAgNjQgKSA9PSAwICYmCisgICAgICAgICAgbXBpX3JlYWRfYmluYXJ5KCAmcnNhLT5FLCAmYnVmZmVyWyA5MV0sICAgMyApID09IDAgKSB8fAorICAgICAgICAoIGxlbiA9PSAxNjIgJiYKKyAgICAgICAgICBtcGlfcmVhZF9iaW5hcnkoICZyc2EtPk4sICZidWZmZXJbIDI5XSwgMTI4ICkgPT0gMCApICYmCisgICAgICAgICAgbXBpX3JlYWRfYmluYXJ5KCAmcnNhLT5FLCAmYnVmZmVyWzE1OV0sICAgMyApID09IDAgKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICoga2V5IHJlYWQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAqLworICAgICAgICByc2EtPmxlbiA9ICggbXBpX21zYiggJnJzYS0+TiApICsgNyApID4+IDM7CisgICAgICAgIHJldHVybiggcnNhICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1lbXNldCggcnNhLCAwLCBzaXplb2YoIHJzYV9jb250ZXh0ICkgKTsKKyAgICAgICAgZnJlZSggcnNhICk7CisgICAgICAgIHJldHVybiggMCApOworICAgIH0KK30KKworI2RlZmluZSBSU0EgICAgICAgICAgICAgICAgICAgICByc2FfY29udGV4dAorI2RlZmluZSBSU0FfUEtDUzFfUEFERElORyAgICAgICAxIC8qIGlnbm9yZWQ7IGFsd2F5cyBlbmNyeXB0IHdpdGggdGhpcyAqLworI2RlZmluZSBSU0Ffc2l6ZSggQ1RYICkgICAgICAgICAoQ1RYKS0+bGVuCisjZGVmaW5lIFJTQV9mcmVlKCBDVFggKSAgICAgICAgIHJzYV9mcmVlKCBDVFggKQorI2RlZmluZSBFUlJfZ2V0X2Vycm9yKCApICAgICAgICAiRVJSX2dldF9lcnJvcigpIG5vdCBzdXBwb3J0ZWQiCisjZGVmaW5lIFJTQV9ibGluZGluZ19vZmYoIElHTk9SRSApCisKKyNkZWZpbmUgZDJpX1JTQVByaXZhdGVLZXkoIGEsIGIsIGMgKSBuZXcgcnNhX2NvbnRleHQgLyogVE9ETzogQysrIGJsZWggKi8KKworaW5saW5lIGludCBSU0FfcHVibGljX2RlY3J5cHQgKCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciogaW5wdXQsIHVuc2lnbmVkIGNoYXIqIG91dHB1dCwgUlNBKiBrZXksIGludCBpZ25vcmUgKSB7IGludCBvdXRzaXplPXNpemU7IGlmKCAhcnNhX3BrY3MxX2RlY3J5cHQoIGtleSwgUlNBX1BVQkxJQywgICZvdXRzaXplLCBpbnB1dCwgb3V0cHV0ICkgKSByZXR1cm4gb3V0c2l6ZTsgZWxzZSByZXR1cm4gLTE7IH0KK2lubGluZSBpbnQgUlNBX3ByaXZhdGVfZGVjcnlwdCggaW50IHNpemUsIHVuc2lnbmVkIGNoYXIqIGlucHV0LCB1bnNpZ25lZCBjaGFyKiBvdXRwdXQsIFJTQSoga2V5LCBpbnQgaWdub3JlICkgeyBpbnQgb3V0c2l6ZT1zaXplOyBpZiggIXJzYV9wa2NzMV9kZWNyeXB0KCBrZXksIFJTQV9QUklWQVRFLCAmb3V0c2l6ZSwgaW5wdXQsIG91dHB1dCApICkgcmV0dXJuIG91dHNpemU7IGVsc2UgcmV0dXJuIC0xOyB9CitpbmxpbmUgaW50IFJTQV9wdWJsaWNfZW5jcnlwdCAoIGludCBzaXplLCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwgdW5zaWduZWQgY2hhciogb3V0cHV0LCBSU0EqIGtleSwgaW50IGlnbm9yZSApIHsgaWYoICFyc2FfcGtjczFfZW5jcnlwdCgga2V5LCBSU0FfUFVCTElDLCAgc2l6ZSwgaW5wdXQsIG91dHB1dCApICkgcmV0dXJuIFJTQV9zaXplKGtleSk7IGVsc2UgcmV0dXJuIC0xOyB9CitpbmxpbmUgaW50IFJTQV9wcml2YXRlX2VuY3J5cHQoIGludCBzaXplLCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwgdW5zaWduZWQgY2hhciogb3V0cHV0LCBSU0EqIGtleSwgaW50IGlnbm9yZSApIHsgaWYoICFyc2FfcGtjczFfZW5jcnlwdCgga2V5LCBSU0FfUFJJVkFURSwgc2l6ZSwgaW5wdXQsIG91dHB1dCApICkgcmV0dXJuIFJTQV9zaXplKGtleSk7IGVsc2UgcmV0dXJuIC0xOyB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBvcGVuc3NsLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcG9sYXJzc2wvcGFkbG9jay5oIGIvaW5jbHVkZS9wb2xhcnNzbC9wYWRsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3N2RlNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcG9sYXJzc2wvcGFkbG9jay5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qKgorICogXGZpbGUgcGFkbG9jay5oCisgKi8KKyNpZm5kZWYgWFlTU0xfUEFETE9DS19ICisjZGVmaW5lIFhZU1NMX1BBRExPQ0tfSAorCisjaW5jbHVkZSAieHlzc2wvYWVzLmgiCisKKyNpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykpCisKKyNpZm5kZWYgWFlTU0xfSEFWRV9YODYKKyNkZWZpbmUgWFlTU0xfSEFWRV9YODYKKyNlbmRpZgorCisjZGVmaW5lIFBBRExPQ0tfUk5HIDB4MDAwQworI2RlZmluZSBQQURMT0NLX0FDRSAweDAwQzAKKyNkZWZpbmUgUEFETE9DS19QSEUgMHgwQzAwCisjZGVmaW5lIFBBRExPQ0tfUE1NIDB4MzAwMAorCisjZGVmaW5lIFBBRExPQ0tfQUxJR04xNih4KSAodW5zaWduZWQgbG9uZyAqKSAoMTYgKyAoKGxvbmcpIHggJiB+MTUpKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFBhZExvY2sgZGV0ZWN0aW9uIHJvdXRpbmUKKyAqCisgKiBccmV0dXJuICAgICAgICAgMSBpZiBDUFUgaGFzIHN1cHBvcnQgZm9yIHRoZSBmZWF0dXJlLCAwIG90aGVyd2lzZQorICovCitpbnQgcGFkbG9ja19zdXBwb3J0cyggaW50IGZlYXR1cmUgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgUGFkTG9jayBBRVMtRUNCIGJsb2NrIGVuKGRlKWNyeXB0aW9uCisgKgorICogXHBhcmFtIGN0eCAgICAgIEFFUyBjb250ZXh0CisgKiBccGFyYW0gbW9kZSAgICAgQUVTX0VOQ1JZUFQgb3IgQUVTX0RFQ1JZUFQKKyAqIFxwYXJhbSBpbnB1dCAgICAxNi1ieXRlIGlucHV0IGJsb2NrCisgKiBccGFyYW0gb3V0cHV0ICAgMTYtYnl0ZSBvdXRwdXQgYmxvY2sKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzLCAxIGlmIG9wZXJhdGlvbiBmYWlsZWQKKyAqLworaW50IHBhZGxvY2tfeGNyeXB0ZWNiKCBhZXNfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpbnB1dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBQYWRMb2NrIEFFUy1DQkMgYnVmZmVyIGVuKGRlKWNyeXB0aW9uCisgKgorICogXHBhcmFtIGN0eCAgICAgIEFFUyBjb250ZXh0CisgKiBccGFyYW0gbW9kZSAgICAgQUVTX0VOQ1JZUFQgb3IgQUVTX0RFQ1JZUFQKKyAqIFxwYXJhbSBsZW5ndGggICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBpdiAgICAgICBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKHVwZGF0ZWQgYWZ0ZXIgdXNlKQorICogXHBhcmFtIGlucHV0ICAgIGJ1ZmZlciBob2xkaW5nIHRoZSBpbnB1dCBkYXRhCisgKiBccGFyYW0gb3V0cHV0ICAgYnVmZmVyIGhvbGRpbmcgdGhlIG91dHB1dCBkYXRhCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2VzcywgMSBpZiBvcGVyYXRpb24gZmFpbGVkCisgKi8KK2ludCBwYWRsb2NrX3hjcnlwdGNiYyggYWVzX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0ICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX1g4NiAgKi8KKworI2VuZGlmIC8qIHBhZGxvY2suaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wb2xhcnNzbC9yc2EuaCBiL2luY2x1ZGUvcG9sYXJzc2wvcnNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4YTVkYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcG9sYXJzc2wvcnNhLmgKQEAgLTAsMCArMSwyNzQgQEAKKy8qKgorICogXGZpbGUgcnNhLmgKKyAqLworI2lmbmRlZiBYWVNTTF9SU0FfSAorI2RlZmluZSBYWVNTTF9SU0FfSAorCisjaW5jbHVkZSAieHlzc2wvYmlnbnVtLmgiCisKKyNkZWZpbmUgWFlTU0xfRVJSX1JTQV9CQURfSU5QVVRfREFUQSAgICAgICAgICAgICAgICAgICAgLTB4MDQwMAorI2RlZmluZSBYWVNTTF9FUlJfUlNBX0lOVkFMSURfUEFERElORyAgICAgICAgICAgICAgICAgICAtMHgwNDEwCisjZGVmaW5lIFhZU1NMX0VSUl9SU0FfS0VZX0dFTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgIC0weDA0MjAKKyNkZWZpbmUgWFlTU0xfRVJSX1JTQV9LRVlfQ0hFQ0tfRkFJTEVEICAgICAgICAgICAgICAgICAgLTB4MDQzMAorI2RlZmluZSBYWVNTTF9FUlJfUlNBX1BVQkxJQ19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAtMHgwNDQwCisjZGVmaW5lIFhZU1NMX0VSUl9SU0FfUFJJVkFURV9GQUlMRUQgICAgICAgICAgICAgICAgICAgIC0weDA0NTAKKyNkZWZpbmUgWFlTU0xfRVJSX1JTQV9WRVJJRllfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgLTB4MDQ2MAorCisvKgorICogUEtDUyMxIGNvbnN0YW50cworICovCisjZGVmaW5lIFJTQV9SQVcgICAgICAgICAwCisjZGVmaW5lIFJTQV9NRDIgICAgICAgICAyCisjZGVmaW5lIFJTQV9NRDQgICAgICAgICAzCisjZGVmaW5lIFJTQV9NRDUgICAgICAgICA0CisjZGVmaW5lIFJTQV9TSEExICAgICAgICA1CisjZGVmaW5lIFJTQV9TSEEyNTYgICAgICA2CisKKyNkZWZpbmUgUlNBX1BVQkxJQyAgICAgIDAKKyNkZWZpbmUgUlNBX1BSSVZBVEUgICAgIDEKKworI2RlZmluZSBSU0FfUEtDU19WMTUgICAgMAorI2RlZmluZSBSU0FfUEtDU19WMjEgICAgMQorCisjZGVmaW5lIFJTQV9TSUdOICAgICAgICAxCisjZGVmaW5lIFJTQV9DUllQVCAgICAgICAyCisKKy8qCisgKiBEaWdlc3RJbmZvIDo6PSBTRVFVRU5DRSB7CisgKiAgIGRpZ2VzdEFsZ29yaXRobSBEaWdlc3RBbGdvcml0aG1JZGVudGlmaWVyLAorICogICBkaWdlc3QgRGlnZXN0IH0KKyAqCisgKiBEaWdlc3RBbGdvcml0aG1JZGVudGlmaWVyIDo6PSBBbGdvcml0aG1JZGVudGlmaWVyCisgKgorICogRGlnZXN0IDo6PSBPQ1RFVCBTVFJJTkcKKyAqLworI2RlZmluZSBBU04xX0hBU0hfTURYICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIlx4MzBceDIwXHgzMFx4MENceDA2XHgwOFx4MkFceDg2XHg0OCIgIFwKKyAgICAiXHg4Nlx4RjdceDBEXHgwMlx4MDBceDA1XHgwMFx4MDRceDEwIgorCisjZGVmaW5lIEFTTjFfSEFTSF9TSEExICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiXHgzMFx4MjFceDMwXHgwOVx4MDZceDA1XHgyQlx4MEVceDAzIiAgXAorICAgICJceDAyXHgxQVx4MDVceDAwXHgwNFx4MTQiCisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFJTQSBjb250ZXh0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCB2ZXI7ICAgICAgICAgICAgICAgICAgICAvKiE8ICBhbHdheXMgMCAgICAgICAgICAqLworICAgIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAvKiE8ICBzaXplKE4pIGluIGNoYXJzICAqLworCisgICAgbXBpIE47ICAgICAgICAgICAgICAgICAgICAgIC8qITwgIHB1YmxpYyBtb2R1bHVzICAgICovCisgICAgbXBpIEU7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgIHB1YmxpYyBleHBvbmVudCAgICovCisKKyAgICBtcGkgRDsgICAgICAgICAgICAgICAgICAgICAgLyohPCAgcHJpdmF0ZSBleHBvbmVudCAgKi8KKyAgICBtcGkgUDsgICAgICAgICAgICAgICAgICAgICAgLyohPCAgMXN0IHByaW1lIGZhY3RvciAgKi8KKyAgICBtcGkgUTsgICAgICAgICAgICAgICAgICAgICAgLyohPCAgMm5kIHByaW1lIGZhY3RvciAgKi8KKyAgICBtcGkgRFA7ICAgICAgICAgICAgICAgICAgICAgLyohPCAgRCAlIChQIC0gMSkgICAgICAgKi8KKyAgICBtcGkgRFE7ICAgICAgICAgICAgICAgICAgICAgLyohPCAgRCAlIChRIC0gMSkgICAgICAgKi8KKyAgICBtcGkgUVA7ICAgICAgICAgICAgICAgICAgICAgLyohPCAgMSAvIChRICUgUCkgICAgICAgKi8KKworICAgIG1waSBSTjsgICAgICAgICAgICAgICAgICAgICAvKiE8ICBjYWNoZWQgUl4yIG1vZCBOICAqLworICAgIG1waSBSUDsgICAgICAgICAgICAgICAgICAgICAvKiE8ICBjYWNoZWQgUl4yIG1vZCBQICAqLworICAgIG1waSBSUTsgICAgICAgICAgICAgICAgICAgICAvKiE8ICBjYWNoZWQgUl4yIG1vZCBRICAqLworCisgICAgaW50IHBhZGRpbmc7ICAgICAgICAgICAgICAgIC8qITwgIDEuNSBvciBPQUVQL1BTUyAgICovCisgICAgaW50IGhhc2hfaWQ7ICAgICAgICAgICAgICAgIC8qITwgIGhhc2ggaWRlbnRpZmllciAgICovCisgICAgaW50ICgqZl9ybmcpKHZvaWQgKik7ICAgICAgIC8qITwgIFJORyBmdW5jdGlvbiAgICAgICovCisgICAgdm9pZCAqcF9ybmc7ICAgICAgICAgICAgICAgIC8qITwgIFJORyBwYXJhbWV0ZXIgICAgICovCit9Cityc2FfY29udGV4dDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxicmllZiAgICAgICAgICBJbml0aWFsaXplIGFuIFJTQSBjb250ZXh0CisgKgorICogXHBhcmFtIGN0eCAgICAgIFJTQSBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKiBccGFyYW0gcGFkZGluZyAgUlNBX1BLQ1NfVjE1IG9yIFJTQV9QS0NTX1YyMQorICogXHBhcmFtIGhhc2hfaWQgIFJTQV9QS0NTX1YyMSBoYXNoIGlkZW50aWZpZXIKKyAqIFxwYXJhbSBmX3JuZyAgICBSTkcgZnVuY3Rpb24KKyAqIFxwYXJhbSBwX3JuZyAgICBSTkcgcGFyYW1ldGVyCisgKgorICogXG5vdGUgICAgICAgICAgIFRoZSBoYXNoX2lkIHBhcmFtZXRlciBpcyBhY3R1YWxseSBpZ25vcmVkCisgKiAgICAgICAgICAgICAgICAgd2hlbiB1c2luZyBSU0FfUEtDU19WMTUgcGFkZGluZy4KKyAqCisgKiBcbm90ZSAgICAgICAgICAgQ3VycmVudGx5ICh4eXNzbC0wLjgpLCBSU0FfUEtDU19WMjEgcGFkZGluZworICogICAgICAgICAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQuCisgKi8KK3ZvaWQgcnNhX2luaXQoIHJzYV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICBpbnQgcGFkZGluZywKKyAgICAgICAgICAgICAgIGludCBoYXNoX2lkLAorICAgICAgICAgICAgICAgaW50ICgqZl9ybmcpKHZvaWQgKiksCisgICAgICAgICAgICAgICB2b2lkICpwX3JuZyApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBHZW5lcmF0ZSBhbiBSU0Ega2V5cGFpcgorICoKKyAqIFxwYXJhbSBjdHggICAgICBSU0EgY29udGV4dCB0aGF0IHdpbGwgaG9sZCB0aGUga2V5CisgKiBccGFyYW0gbmJpdHMgICAgc2l6ZSBvZiB0aGUgcHVibGljIGtleSBpbiBiaXRzCisgKiBccGFyYW0gZXhwb25lbnQgcHVibGljIGV4cG9uZW50IChlLmcuLCA2NTUzNykKKyAqCisgKiBcbm90ZSAgICAgICAgICAgcnNhX2luaXQoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmVoYW5kIHRvIHNldHVwCisgKiAgICAgICAgICAgICAgICAgdGhlIFJTQSBjb250ZXh0IChlc3BlY2lhbGx5IGZfcm5nIGFuZCBwX3JuZykuCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYW4gWFlTU0xfRVJSX1JTQV9YWFggZXJyb3IgY29kZQorICovCitpbnQgcnNhX2dlbl9rZXkoIHJzYV9jb250ZXh0ICpjdHgsIGludCBuYml0cywgaW50IGV4cG9uZW50ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIENoZWNrIGEgcHVibGljIFJTQSBrZXkKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgUlNBIGNvbnRleHQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGFuIFhZU1NMX0VSUl9SU0FfWFhYIGVycm9yIGNvZGUKKyAqLworaW50IHJzYV9jaGVja19wdWJrZXkoIHJzYV9jb250ZXh0ICpjdHggKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQ2hlY2sgYSBwcml2YXRlIFJTQSBrZXkKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgUlNBIGNvbnRleHQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGFuIFhZU1NMX0VSUl9SU0FfWFhYIGVycm9yIGNvZGUKKyAqLworaW50IHJzYV9jaGVja19wcml2a2V5KCByc2FfY29udGV4dCAqY3R4ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIERvIGFuIFJTQSBwdWJsaWMga2V5IG9wZXJhdGlvbgorICoKKyAqIFxwYXJhbSBjdHggICAgICBSU0EgY29udGV4dAorICogXHBhcmFtIGlucHV0ICAgIGlucHV0IGJ1ZmZlcgorICogXHBhcmFtIG91dHB1dCAgIG91dHB1dCBidWZmZXIKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciBhbiBYWVNTTF9FUlJfUlNBX1hYWCBlcnJvciBjb2RlCisgKgorICogXG5vdGUgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgdGFrZSBjYXJlIG9mIG1lc3NhZ2UKKyAqICAgICAgICAgICAgICAgICBwYWRkaW5nLiBBbHNvLCBiZSBzdXJlIHRvIHNldCBpbnB1dFswXSA9IDAuCisgKgorICogXG5vdGUgICAgICAgICAgIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSBsYXJnZQorICogICAgICAgICAgICAgICAgIGVub3VnaCAoZWcuIDEyOCBieXRlcyBpZiBSU0EtMTAyNCBpcyB1c2VkKS4KKyAqLworaW50IHJzYV9wdWJsaWMoIHJzYV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIERvIGFuIFJTQSBwcml2YXRlIGtleSBvcGVyYXRpb24KKyAqCisgKiBccGFyYW0gY3R4ICAgICAgUlNBIGNvbnRleHQKKyAqIFxwYXJhbSBpbnB1dCAgICBpbnB1dCBidWZmZXIKKyAqIFxwYXJhbSBvdXRwdXQgICBvdXRwdXQgYnVmZmVyCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYW4gWFlTU0xfRVJSX1JTQV9YWFggZXJyb3IgY29kZQorICoKKyAqIFxub3RlICAgICAgICAgICBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgbGFyZ2UKKyAqICAgICAgICAgICAgICAgICBlbm91Z2ggKGVnLiAxMjggYnl0ZXMgaWYgUlNBLTEwMjQgaXMgdXNlZCkuCisgKi8KK2ludCByc2FfcHJpdmF0ZSggcnNhX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBBZGQgdGhlIG1lc3NhZ2UgcGFkZGluZywgdGhlbiBkbyBhbiBSU0Egb3BlcmF0aW9uCisgKgorICogXHBhcmFtIGN0eCAgICAgIFJTQSBjb250ZXh0CisgKiBccGFyYW0gbW9kZSAgICAgUlNBX1BVQkxJQyBvciBSU0FfUFJJVkFURQorICogXHBhcmFtIGlsZW4gICAgIGNvbnRhaW5zIHRoZSB0aGUgcGxhaW50ZXh0IGxlbmd0aAorICogXHBhcmFtIGlucHV0ICAgIGJ1ZmZlciBob2xkaW5nIHRoZSBkYXRhIHRvIGJlIGVuY3J5cHRlZAorICogXHBhcmFtIG91dHB1dCAgIGJ1ZmZlciB0aGF0IHdpbGwgaG9sZCB0aGUgY2lwaGVydGV4dAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGFuIFhZU1NMX0VSUl9SU0FfWFhYIGVycm9yIGNvZGUKKyAqCisgKiBcbm90ZSAgICAgICAgICAgVGhlIG91dHB1dCBidWZmZXIgbXVzdCBiZSBhcyBsYXJnZSBhcyB0aGUgc2l6ZQorICogICAgICAgICAgICAgICAgIG9mIGN0eC0+TiAoZWcuIDEyOCBieXRlcyBpZiBSU0EtMTAyNCBpcyB1c2VkKS4KKyAqLworaW50IHJzYV9wa2NzMV9lbmNyeXB0KCByc2FfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50ICBpbGVuLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIERvIGFuIFJTQSBvcGVyYXRpb24sIHRoZW4gcmVtb3ZlIHRoZSBtZXNzYWdlIHBhZGRpbmcKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgUlNBIGNvbnRleHQKKyAqIFxwYXJhbSBtb2RlICAgICBSU0FfUFVCTElDIG9yIFJTQV9QUklWQVRFCisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlIGVuY3J5cHRlZCBkYXRhCisgKiBccGFyYW0gb3V0cHV0ICAgYnVmZmVyIHRoYXQgd2lsbCBob2xkIHRoZSBwbGFpbnRleHQKKyAqIFxwYXJhbSBvbGVuICAgICB3aWxsIGNvbnRhaW4gdGhlIHBsYWludGV4dCBsZW5ndGgKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciBhbiBYWVNTTF9FUlJfUlNBX1hYWCBlcnJvciBjb2RlCisgKgorICogXG5vdGUgICAgICAgICAgIFRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgYXMgbGFyZ2UgYXMgdGhlIHNpemUKKyAqICAgICAgICAgICAgICAgICBvZiBjdHgtPk4gKGVnLiAxMjggYnl0ZXMgaWYgUlNBLTEwMjQgaXMgdXNlZCkuCisgKi8KK2ludCByc2FfcGtjczFfZGVjcnlwdCggcnNhX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsIGludCAqb2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBEbyBhIHByaXZhdGUgUlNBIHRvIHNpZ24gYSBtZXNzYWdlIGRpZ2VzdAorICoKKyAqIFxwYXJhbSBjdHggICAgICBSU0EgY29udGV4dAorICogXHBhcmFtIG1vZGUgICAgIFJTQV9QVUJMSUMgb3IgUlNBX1BSSVZBVEUKKyAqIFxwYXJhbSBoYXNoX2lkICBSU0FfUkFXLCBSU0FfTUR7Miw0LDV9IG9yIFJTQV9TSEF7MSwyNTZ9CisgKiBccGFyYW0gaGFzaGxlbiAgbWVzc2FnZSBkaWdlc3QgbGVuZ3RoIChmb3IgUlNBX1JBVyBvbmx5KQorICogXHBhcmFtIGhhc2ggICAgIGJ1ZmZlciBob2xkaW5nIHRoZSBtZXNzYWdlIGRpZ2VzdAorICogXHBhcmFtIHNpZyAgICAgIGJ1ZmZlciB0aGF0IHdpbGwgaG9sZCB0aGUgY2lwaGVydGV4dAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHRoZSBzaWduaW5nIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwKKyAqICAgICAgICAgICAgICAgICBvciBhbiBYWVNTTF9FUlJfUlNBX1hYWCBlcnJvciBjb2RlCisgKgorICogXG5vdGUgICAgICAgICAgIFRoZSAic2lnIiBidWZmZXIgbXVzdCBiZSBhcyBsYXJnZSBhcyB0aGUgc2l6ZQorICogICAgICAgICAgICAgICAgIG9mIGN0eC0+TiAoZWcuIDEyOCBieXRlcyBpZiBSU0EtMTAyNCBpcyB1c2VkKS4KKyAqLworaW50IHJzYV9wa2NzMV9zaWduKCByc2FfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGhhc2hfaWQsCisgICAgICAgICAgICAgICAgICAgIGludCBoYXNobGVuLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpoYXNoLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaWcgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgRG8gYSBwdWJsaWMgUlNBIGFuZCBjaGVjayB0aGUgbWVzc2FnZSBkaWdlc3QKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgcG9pbnRzIHRvIGFuIFJTQSBwdWJsaWMga2V5CisgKiBccGFyYW0gbW9kZSAgICAgUlNBX1BVQkxJQyBvciBSU0FfUFJJVkFURQorICogXHBhcmFtIGhhc2hfaWQgIFJTQV9SQVcsIFJTQV9NRHsyLDQsNX0gb3IgUlNBX1NIQXsxLDI1Nn0KKyAqIFxwYXJhbSBoYXNobGVuICBtZXNzYWdlIGRpZ2VzdCBsZW5ndGggKGZvciBSU0FfUkFXIG9ubHkpCisgKiBccGFyYW0gaGFzaCAgICAgYnVmZmVyIGhvbGRpbmcgdGhlIG1lc3NhZ2UgZGlnZXN0CisgKiBccGFyYW0gc2lnICAgICAgYnVmZmVyIGhvbGRpbmcgdGhlIGNpcGhlcnRleHQKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiB0aGUgdmVyaWZ5IG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwKKyAqICAgICAgICAgICAgICAgICBvciBhbiBYWVNTTF9FUlJfUlNBX1hYWCBlcnJvciBjb2RlCisgKgorICogXG5vdGUgICAgICAgICAgIFRoZSAic2lnIiBidWZmZXIgbXVzdCBiZSBhcyBsYXJnZSBhcyB0aGUgc2l6ZQorICogICAgICAgICAgICAgICAgIG9mIGN0eC0+TiAoZWcuIDEyOCBieXRlcyBpZiBSU0EtMTAyNCBpcyB1c2VkKS4KKyAqLworaW50IHJzYV9wa2NzMV92ZXJpZnkoIHJzYV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc2hsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaWcgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgRnJlZSB0aGUgY29tcG9uZW50cyBvZiBhbiBSU0Ega2V5CisgKi8KK3ZvaWQgcnNhX2ZyZWUoIHJzYV9jb250ZXh0ICpjdHggKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQ2hlY2t1cCByb3V0aW5lCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBpZiB0aGUgdGVzdCBmYWlsZWQKKyAqLworaW50IHJzYV9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiByc2EuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wb2xhcnNzbC9zaGExLmggYi9pbmNsdWRlL3BvbGFyc3NsL3NoYTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDQ0YzY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wb2xhcnNzbC9zaGExLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qKgorICogXGZpbGUgc2hhMS5oCisgKi8KKyNpZm5kZWYgWFlTU0xfU0hBMV9ICisjZGVmaW5lIFhZU1NMX1NIQTFfSAorCisvKioKKyAqIFxicmllZiAgICAgICAgICBTSEEtMSBjb250ZXh0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGxvbmcgdG90YWxbMl07ICAgICAvKiE8IG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQgICovCisgICAgdW5zaWduZWQgbG9uZyBzdGF0ZVs1XTsgICAgIC8qITwgaW50ZXJtZWRpYXRlIGRpZ2VzdCBzdGF0ZSAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07ICAgLyohPCBkYXRhIGJsb2NrIGJlaW5nIHByb2Nlc3NlZCAqLworCisgICAgdW5zaWduZWQgY2hhciBpcGFkWzY0XTsgICAgIC8qITwgSE1BQzogaW5uZXIgcGFkZGluZyAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG9wYWRbNjRdOyAgICAgLyohPCBITUFDOiBvdXRlciBwYWRkaW5nICAgICAgICAqLworfQorc2hhMV9jb250ZXh0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS0xIGNvbnRleHQgc2V0dXAKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgY29udGV4dCB0byBiZSBpbml0aWFsaXplZAorICovCit2b2lkIHNoYTFfc3RhcnRzKCBzaGExX2NvbnRleHQgKmN0eCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTSEEtMSBwcm9jZXNzIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBjdHggICAgICBTSEEtMSBjb250ZXh0CisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbiAgICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgKi8KK3ZvaWQgc2hhMV91cGRhdGUoIHNoYTFfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgU0hBLTEgZmluYWwgZGlnZXN0CisgKgorICogXHBhcmFtIGN0eCAgICAgIFNIQS0xIGNvbnRleHQKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMSBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBzaGExX2ZpbmlzaCggc2hhMV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBPdXRwdXQgPSBTSEEtMSggaW5wdXQgYnVmZmVyICkKKyAqCisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbiAgICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgKiBccGFyYW0gb3V0cHV0ICAgU0hBLTEgY2hlY2tzdW0gcmVzdWx0CisgKi8KK3ZvaWQgc2hhMSggdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgT3V0cHV0ID0gU0hBLTEoIGZpbGUgY29udGVudHMgKQorICoKKyAqIFxwYXJhbSBwYXRoICAgICBpbnB1dCBmaWxlIG5hbWUKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMSBjaGVja3N1bSByZXN1bHQKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCAxIGlmIGZvcGVuIGZhaWxlZCwKKyAqICAgICAgICAgICAgICAgICBvciAyIGlmIGZyZWFkIGZhaWxlZAorICovCitpbnQgc2hhMV9maWxlKCBjaGFyICpwYXRoLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgU0hBLTEgSE1BQyBjb250ZXh0IHNldHVwCisgKgorICogXHBhcmFtIGN0eCAgICAgIEhNQUMgY29udGV4dCB0byBiZSBpbml0aWFsaXplZAorICogXHBhcmFtIGtleSAgICAgIEhNQUMgc2VjcmV0IGtleQorICogXHBhcmFtIGtleWxlbiAgIGxlbmd0aCBvZiB0aGUgSE1BQyBrZXkKKyAqLwordm9pZCBzaGExX2htYWNfc3RhcnRzKCBzaGExX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS0xIEhNQUMgcHJvY2VzcyBidWZmZXIKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgSE1BQyBjb250ZXh0CisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbiAgICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgKi8KK3ZvaWQgc2hhMV9obWFjX3VwZGF0ZSggc2hhMV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTSEEtMSBITUFDIGZpbmFsIGRpZ2VzdAorICoKKyAqIFxwYXJhbSBjdHggICAgICBITUFDIGNvbnRleHQKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMSBITUFDIGNoZWNrc3VtIHJlc3VsdAorICovCit2b2lkIHNoYTFfaG1hY19maW5pc2goIHNoYTFfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgT3V0cHV0ID0gSE1BQy1TSEEtMSggaG1hYyBrZXksIGlucHV0IGJ1ZmZlciApCisgKgorICogXHBhcmFtIGtleSAgICAgIEhNQUMgc2VjcmV0IGtleQorICogXHBhcmFtIGtleWxlbiAgIGxlbmd0aCBvZiB0aGUgSE1BQyBrZXkKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBITUFDLVNIQS0xIHJlc3VsdAorICovCit2b2lkIHNoYTFfaG1hYyggdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgQ2hlY2t1cCByb3V0aW5lCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBpZiB0aGUgdGVzdCBmYWlsZWQKKyAqLworaW50IHNoYTFfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogc2hhMS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL3NoYTIuaCBiL2luY2x1ZGUvcG9sYXJzc2wvc2hhMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMmQzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3BvbGFyc3NsL3NoYTIuaApAQCAtMCwwICsxLDEyNyBAQAorLyoqCisgKiBcZmlsZSBzaGEyLmgKKyAqLworI2lmbmRlZiBYWVNTTF9TSEEyX0gKKyNkZWZpbmUgWFlTU0xfU0hBMl9ICisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS0yNTYgY29udGV4dCBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsWzJdOyAgICAgLyohPCBudW1iZXIgb2YgYnl0ZXMgcHJvY2Vzc2VkICAqLworICAgIHVuc2lnbmVkIGxvbmcgc3RhdGVbOF07ICAgICAvKiE8IGludGVybWVkaWF0ZSBkaWdlc3Qgc3RhdGUgICovCisgICAgdW5zaWduZWQgY2hhciBidWZmZXJbNjRdOyAgIC8qITwgZGF0YSBibG9jayBiZWluZyBwcm9jZXNzZWQgKi8KKworICAgIHVuc2lnbmVkIGNoYXIgaXBhZFs2NF07ICAgICAvKiE8IEhNQUM6IGlubmVyIHBhZGRpbmcgICAgICAgICovCisgICAgdW5zaWduZWQgY2hhciBvcGFkWzY0XTsgICAgIC8qITwgSE1BQzogb3V0ZXIgcGFkZGluZyAgICAgICAgKi8KKyAgICBpbnQgaXMyMjQ7ICAgICAgICAgICAgICAgICAgLyohPCAwID0+IFNIQS0yNTYsIGVsc2UgU0hBLTIyNCAqLworfQorc2hhMl9jb250ZXh0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS0yNTYgY29udGV4dCBzZXR1cAorICoKKyAqIFxwYXJhbSBjdHggICAgICBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKiBccGFyYW0gaXMyMjQgICAgMCA9IHVzZSBTSEEyNTYsIDEgPSB1c2UgU0hBMjI0CisgKi8KK3ZvaWQgc2hhMl9zdGFydHMoIHNoYTJfY29udGV4dCAqY3R4LCBpbnQgaXMyMjQgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgU0hBLTI1NiBwcm9jZXNzIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBjdHggICAgICBTSEEtMjU2IGNvbnRleHQKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqLwordm9pZCBzaGEyX3VwZGF0ZSggc2hhMl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTSEEtMjU2IGZpbmFsIGRpZ2VzdAorICoKKyAqIFxwYXJhbSBjdHggICAgICBTSEEtMjU2IGNvbnRleHQKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMjI0LzI1NiBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBzaGEyX2ZpbmlzaCggc2hhMl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzMyXSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBPdXRwdXQgPSBTSEEtMjU2KCBpbnB1dCBidWZmZXIgKQorICoKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMjI0LzI1NiBjaGVja3N1bSByZXN1bHQKKyAqIFxwYXJhbSBpczIyNCAgICAwID0gdXNlIFNIQTI1NiwgMSA9IHVzZSBTSEEyMjQKKyAqLwordm9pZCBzaGEyKCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzMyXSwgaW50IGlzMjI0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE91dHB1dCA9IFNIQS0yNTYoIGZpbGUgY29udGVudHMgKQorICoKKyAqIFxwYXJhbSBwYXRoICAgICBpbnB1dCBmaWxlIG5hbWUKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMjI0LzI1NiBjaGVja3N1bSByZXN1bHQKKyAqIFxwYXJhbSBpczIyNCAgICAwID0gdXNlIFNIQTI1NiwgMSA9IHVzZSBTSEEyMjQKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCAxIGlmIGZvcGVuIGZhaWxlZCwKKyAqICAgICAgICAgICAgICAgICBvciAyIGlmIGZyZWFkIGZhaWxlZAorICovCitpbnQgc2hhMl9maWxlKCBjaGFyICpwYXRoLCB1bnNpZ25lZCBjaGFyIG91dHB1dFszMl0sIGludCBpczIyNCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTSEEtMjU2IEhNQUMgY29udGV4dCBzZXR1cAorICoKKyAqIFxwYXJhbSBjdHggICAgICBITUFDIGNvbnRleHQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqIFxwYXJhbSBrZXkgICAgICBITUFDIHNlY3JldCBrZXkKKyAqIFxwYXJhbSBrZXlsZW4gICBsZW5ndGggb2YgdGhlIEhNQUMga2V5CisgKiBccGFyYW0gaXMyMjQgICAgMCA9IHVzZSBTSEEyNTYsIDEgPSB1c2UgU0hBMjI0CisgKi8KK3ZvaWQgc2hhMl9obWFjX3N0YXJ0cyggc2hhMl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzMjI0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS0yNTYgSE1BQyBwcm9jZXNzIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBjdHggICAgICBITUFDIGNvbnRleHQKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqLwordm9pZCBzaGEyX2htYWNfdXBkYXRlKCBzaGEyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS0yNTYgSE1BQyBmaW5hbCBkaWdlc3QKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgSE1BQyBjb250ZXh0CisgKiBccGFyYW0gb3V0cHV0ICAgU0hBLTIyNC8yNTYgSE1BQyBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBzaGEyX2htYWNfZmluaXNoKCBzaGEyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBvdXRwdXRbMzJdICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE91dHB1dCA9IEhNQUMtU0hBLTI1NiggaG1hYyBrZXksIGlucHV0IGJ1ZmZlciApCisgKgorICogXHBhcmFtIGtleSAgICAgIEhNQUMgc2VjcmV0IGtleQorICogXHBhcmFtIGtleWxlbiAgIGxlbmd0aCBvZiB0aGUgSE1BQyBrZXkKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBITUFDLVNIQS0yMjQvMjU2IHJlc3VsdAorICogXHBhcmFtIGlzMjI0ICAgIDAgPSB1c2UgU0hBMjU2LCAxID0gdXNlIFNIQTIyNAorICovCit2b2lkIHNoYTJfaG1hYyggdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFszMl0sIGludCBpczIyNCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBDaGVja3VwIHJvdXRpbmUKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciAxIGlmIHRoZSB0ZXN0IGZhaWxlZAorICovCitpbnQgc2hhMl9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBzaGEyLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcG9sYXJzc2wvc2hhNC5oIGIvaW5jbHVkZS9wb2xhcnNzbC9zaGE0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MDA4NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcG9sYXJzc2wvc2hhNC5oCkBAIC0wLDAgKzEsMTM1IEBACisvKioKKyAqIFxmaWxlIHNoYTQuaAorICovCisjaWZuZGVmIFhZU1NMX1NIQTRfSAorI2RlZmluZSBYWVNTTF9TSEE0X0gKKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19XQVRDT01DX18pCisgICNkZWZpbmUgVUw2NCh4KSB4IyN1aTY0CisgICNkZWZpbmUgaW50NjQgX19pbnQ2NAorI2Vsc2UKKyAgI2RlZmluZSBVTDY0KHgpIHgjI1VMTAorICAjZGVmaW5lIGludDY0IGxvbmcgbG9uZworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS01MTIgY29udGV4dCBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBpbnQ2NCB0b3RhbFsyXTsgICAgLyohPCBudW1iZXIgb2YgYnl0ZXMgcHJvY2Vzc2VkICAqLworICAgIHVuc2lnbmVkIGludDY0IHN0YXRlWzhdOyAgICAvKiE8IGludGVybWVkaWF0ZSBkaWdlc3Qgc3RhdGUgICovCisgICAgdW5zaWduZWQgY2hhciBidWZmZXJbMTI4XTsgIC8qITwgZGF0YSBibG9jayBiZWluZyBwcm9jZXNzZWQgKi8KKworICAgIHVuc2lnbmVkIGNoYXIgaXBhZFsxMjhdOyAgICAvKiE8IEhNQUM6IGlubmVyIHBhZGRpbmcgICAgICAgICovCisgICAgdW5zaWduZWQgY2hhciBvcGFkWzEyOF07ICAgIC8qITwgSE1BQzogb3V0ZXIgcGFkZGluZyAgICAgICAgKi8KKyAgICBpbnQgaXMzODQ7ICAgICAgICAgICAgICAgICAgLyohPCAwID0+IFNIQS01MTIsIGVsc2UgU0hBLTM4NCAqLworfQorc2hhNF9jb250ZXh0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS01MTIgY29udGV4dCBzZXR1cAorICoKKyAqIFxwYXJhbSBjdHggICAgICBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKiBccGFyYW0gaXMzODQgICAgMCA9IHVzZSBTSEE1MTIsIDEgPSB1c2UgU0hBMzg0CisgKi8KK3ZvaWQgc2hhNF9zdGFydHMoIHNoYTRfY29udGV4dCAqY3R4LCBpbnQgaXMzODQgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgU0hBLTUxMiBwcm9jZXNzIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBjdHggICAgICBTSEEtNTEyIGNvbnRleHQKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqLwordm9pZCBzaGE0X3VwZGF0ZSggc2hhNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTSEEtNTEyIGZpbmFsIGRpZ2VzdAorICoKKyAqIFxwYXJhbSBjdHggICAgICBTSEEtNTEyIGNvbnRleHQKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMzg0LzUxMiBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBzaGE0X2ZpbmlzaCggc2hhNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzY0XSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBPdXRwdXQgPSBTSEEtNTEyKCBpbnB1dCBidWZmZXIgKQorICoKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMzg0LzUxMiBjaGVja3N1bSByZXN1bHQKKyAqIFxwYXJhbSBpczM4NCAgICAwID0gdXNlIFNIQTUxMiwgMSA9IHVzZSBTSEEzODQKKyAqLwordm9pZCBzaGE0KCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzY0XSwgaW50IGlzMzg0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE91dHB1dCA9IFNIQS01MTIoIGZpbGUgY29udGVudHMgKQorICoKKyAqIFxwYXJhbSBwYXRoICAgICBpbnB1dCBmaWxlIG5hbWUKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMzg0LzUxMiBjaGVja3N1bSByZXN1bHQKKyAqIFxwYXJhbSBpczM4NCAgICAwID0gdXNlIFNIQTUxMiwgMSA9IHVzZSBTSEEzODQKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCAxIGlmIGZvcGVuIGZhaWxlZCwKKyAqICAgICAgICAgICAgICAgICBvciAyIGlmIGZyZWFkIGZhaWxlZAorICovCitpbnQgc2hhNF9maWxlKCBjaGFyICpwYXRoLCB1bnNpZ25lZCBjaGFyIG91dHB1dFs2NF0sIGludCBpczM4NCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTSEEtNTEyIEhNQUMgY29udGV4dCBzZXR1cAorICoKKyAqIFxwYXJhbSBjdHggICAgICBITUFDIGNvbnRleHQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqIFxwYXJhbSBpczM4NCAgICAwID0gdXNlIFNIQTUxMiwgMSA9IHVzZSBTSEEzODQKKyAqIFxwYXJhbSBrZXkgICAgICBITUFDIHNlY3JldCBrZXkKKyAqIFxwYXJhbSBrZXlsZW4gICBsZW5ndGggb2YgdGhlIEhNQUMga2V5CisgKi8KK3ZvaWQgc2hhNF9obWFjX3N0YXJ0cyggc2hhNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzMzg0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS01MTIgSE1BQyBwcm9jZXNzIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBjdHggICAgICBITUFDIGNvbnRleHQKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqLwordm9pZCBzaGE0X2htYWNfdXBkYXRlKCBzaGE0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNIQS01MTIgSE1BQyBmaW5hbCBkaWdlc3QKKyAqCisgKiBccGFyYW0gY3R4ICAgICAgSE1BQyBjb250ZXh0CisgKiBccGFyYW0gb3V0cHV0ICAgU0hBLTM4NC81MTIgSE1BQyBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBzaGE0X2htYWNfZmluaXNoKCBzaGE0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBvdXRwdXRbNjRdICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIE91dHB1dCA9IEhNQUMtU0hBLTUxMiggaG1hYyBrZXksIGlucHV0IGJ1ZmZlciApCisgKgorICogXHBhcmFtIGtleSAgICAgIEhNQUMgc2VjcmV0IGtleQorICogXHBhcmFtIGtleWxlbiAgIGxlbmd0aCBvZiB0aGUgSE1BQyBrZXkKKyAqIFxwYXJhbSBpbnB1dCAgICBidWZmZXIgaG9sZGluZyB0aGUgIGRhdGEKKyAqIFxwYXJhbSBpbGVuICAgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBITUFDLVNIQS0zODQvNTEyIHJlc3VsdAorICogXHBhcmFtIGlzMzg0ICAgIDAgPSB1c2UgU0hBNTEyLCAxID0gdXNlIFNIQTM4NAorICovCit2b2lkIHNoYTRfaG1hYyggdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFs2NF0sIGludCBpczM4NCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBDaGVja3VwIHJvdXRpbmUKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciAxIGlmIHRoZSB0ZXN0IGZhaWxlZAorICovCitpbnQgc2hhNF9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBzaGE0LmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcG9sYXJzc2wvc3NsLmggYi9pbmNsdWRlL3BvbGFyc3NsL3NzbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YmQwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3BvbGFyc3NsL3NzbC5oCkBAIC0wLDAgKzEsNTE3IEBACisvKioKKyAqIFxmaWxlIHNzbC5oCisgKi8KKyNpZm5kZWYgWFlTU0xfU1NMX0gKKyNkZWZpbmUgWFlTU0xfU1NMX0gKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgInh5c3NsL25ldC5oIgorI2luY2x1ZGUgInh5c3NsL2RobS5oIgorI2luY2x1ZGUgInh5c3NsL3JzYS5oIgorI2luY2x1ZGUgInh5c3NsL21kNS5oIgorI2luY2x1ZGUgInh5c3NsL3NoYTEuaCIKKyNpbmNsdWRlICJ4eXNzbC94NTA5LmgiCisKKyNkZWZpbmUgWFlTU0xfRVJSX1NTTF9GRUFUVVJFX1VOQVZBSUxBQkxFICAgICAgICAgICAgICAgLTB4MTAwMAorI2RlZmluZSBYWVNTTF9FUlJfU1NMX0JBRF9JTlBVVF9EQVRBICAgICAgICAgICAgICAgICAgICAtMHgxODAwCisjZGVmaW5lIFhZU1NMX0VSUl9TU0xfSU5WQUxJRF9NQUMgICAgICAgICAgICAgICAgICAgICAgIC0weDIwMDAKKyNkZWZpbmUgWFlTU0xfRVJSX1NTTF9JTlZBTElEX1JFQ09SRCAgICAgICAgICAgICAgICAgICAgLTB4MjgwMAorI2RlZmluZSBYWVNTTF9FUlJfU1NMX0lOVkFMSURfTU9EVUxVU19TSVpFICAgICAgICAgICAgICAtMHgzMDAwCisjZGVmaW5lIFhZU1NMX0VSUl9TU0xfVU5LTk9XTl9DSVBIRVIgICAgICAgICAgICAgICAgICAgIC0weDM4MDAKKyNkZWZpbmUgWFlTU0xfRVJSX1NTTF9OT19DSVBIRVJfQ0hPU0VOICAgICAgICAgICAgICAgICAgLTB4NDAwMAorI2RlZmluZSBYWVNTTF9FUlJfU1NMX05PX1NFU1NJT05fRk9VTkQgICAgICAgICAgICAgICAgICAtMHg0ODAwCisjZGVmaW5lIFhZU1NMX0VSUl9TU0xfTk9fQ0xJRU5UX0NFUlRJRklDQVRFICAgICAgICAgICAgIC0weDUwMDAKKyNkZWZpbmUgWFlTU0xfRVJSX1NTTF9DRVJUSUZJQ0FURV9UT09fTEFSR0UgICAgICAgICAgICAgLTB4NTgwMAorI2RlZmluZSBYWVNTTF9FUlJfU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEICAgICAgICAgICAgICAtMHg2MDAwCisjZGVmaW5lIFhZU1NMX0VSUl9TU0xfUFJJVkFURV9LRVlfUkVRVUlSRUQgICAgICAgICAgICAgIC0weDY4MDAKKyNkZWZpbmUgWFlTU0xfRVJSX1NTTF9DQV9DSEFJTl9SRVFVSVJFRCAgICAgICAgICAgICAgICAgLTB4NzAwMAorI2RlZmluZSBYWVNTTF9FUlJfU1NMX1VORVhQRUNURURfTUVTU0FHRSAgICAgICAgICAgICAgICAtMHg3ODAwCisjZGVmaW5lIFhZU1NMX0VSUl9TU0xfRkFUQUxfQUxFUlRfTUVTU0FHRSAgICAgICAgICAgICAgIC0weDgwMDAKKyNkZWZpbmUgWFlTU0xfRVJSX1NTTF9QRUVSX1ZFUklGWV9GQUlMRUQgICAgICAgICAgICAgICAgLTB4ODgwMAorI2RlZmluZSBYWVNTTF9FUlJfU1NMX1BFRVJfQ0xPU0VfTk9USUZZICAgICAgICAgICAgICAgICAtMHg5MDAwCisjZGVmaW5lIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NMSUVOVF9IRUxMTyAgICAgICAgICAgICAgIC0weDk4MDAKKyNkZWZpbmUgWFlTU0xfRVJSX1NTTF9CQURfSFNfU0VSVkVSX0hFTExPICAgICAgICAgICAgICAgLTB4QTAwMAorI2RlZmluZSBYWVNTTF9FUlJfU1NMX0JBRF9IU19DRVJUSUZJQ0FURSAgICAgICAgICAgICAgICAtMHhBODAwCisjZGVmaW5lIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NFUlRJRklDQVRFX1JFUVVFU1QgICAgICAgIC0weEIwMDAKKyNkZWZpbmUgWFlTU0xfRVJSX1NTTF9CQURfSFNfU0VSVkVSX0tFWV9FWENIQU5HRSAgICAgICAgLTB4QjgwMAorI2RlZmluZSBYWVNTTF9FUlJfU1NMX0JBRF9IU19TRVJWRVJfSEVMTE9fRE9ORSAgICAgICAgICAtMHhDMDAwCisjZGVmaW5lIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NMSUVOVF9LRVlfRVhDSEFOR0UgICAgICAgIC0weEM4MDAKKyNkZWZpbmUgWFlTU0xfRVJSX1NTTF9CQURfSFNfQ0VSVElGSUNBVEVfVkVSSUZZICAgICAgICAgLTB4RDAwMAorI2RlZmluZSBYWVNTTF9FUlJfU1NMX0JBRF9IU19DSEFOR0VfQ0lQSEVSX1NQRUMgICAgICAgICAtMHhEODAwCisjZGVmaW5lIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0ZJTklTSEVEICAgICAgICAgICAgICAgICAgIC0weEUwMDAKKworLyoKKyAqIFZhcmlvdXMgY29uc3RhbnRzCisgKi8KKyNkZWZpbmUgU1NMX01BSk9SX1ZFUlNJT05fMyAgICAgICAgICAgICAzCisjZGVmaW5lIFNTTF9NSU5PUl9WRVJTSU9OXzAgICAgICAgICAgICAgMCAgIC8qITwgU1NMIHYzLjAgKi8KKyNkZWZpbmUgU1NMX01JTk9SX1ZFUlNJT05fMSAgICAgICAgICAgICAxICAgLyohPCBUTFMgdjEuMCAqLworI2RlZmluZSBTU0xfTUlOT1JfVkVSU0lPTl8yICAgICAgICAgICAgIDIgICAvKiE8IFRMUyB2MS4xICovCisKKyNkZWZpbmUgU1NMX0lTX0NMSUVOVCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNTTF9JU19TRVJWRVIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTU0xfQ09NUFJFU1NfTlVMTCAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBTU0xfVkVSSUZZX05PTkUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1NMX1ZFUklGWV9PUFRJT05BTCAgICAgICAgICAgICAxCisjZGVmaW5lIFNTTF9WRVJJRllfUkVRVUlSRUQgICAgICAgICAgICAgMgorCisjZGVmaW5lIFNTTF9NQVhfQ09OVEVOVF9MRU4gICAgICAgICAxNjM4NAorCisvKgorICogQWxsb3cgYW4gZXh0cmEgNTEyIGJ5dGVzIGZvciB0aGUgcmVjb3JkIGhlYWRlcgorICogYW5kIGVuY3J5cHRpb24gb3ZlcmhlYWQgKGNvdW50ZXIgKyBNQUMgKyBwYWRkaW5nKS4KKyAqLworI2RlZmluZSBTU0xfQlVGRkVSX0xFTiAoU1NMX01BWF9DT05URU5UX0xFTiArIDUxMikKKworLyoKKyAqIFN1cHBvcnRlZCBjaXBoZXJzdWl0ZXMKKyAqLworI2RlZmluZSBTU0xfUlNBX1JDNF8xMjhfTUQ1ICAgICAgICAgICAgICA0CisjZGVmaW5lIFNTTF9SU0FfUkM0XzEyOF9TSEEgICAgICAgICAgICAgIDUKKyNkZWZpbmUgU1NMX1JTQV9ERVNfMTY4X1NIQSAgICAgICAgICAgICAxMAorI2RlZmluZSBTU0xfRURIX1JTQV9ERVNfMTY4X1NIQSAgICAgICAgIDIyCisjZGVmaW5lIFNTTF9SU0FfQUVTXzEyOF9TSEEgICAgICAgICAgICAgNDcKKyNkZWZpbmUgU1NMX1JTQV9BRVNfMjU2X1NIQSAgICAgICAgICAgICA1MworI2RlZmluZSBTU0xfRURIX1JTQV9BRVNfMjU2X1NIQSAgICAgICAgIDU3CisKKy8qCisgKiBNZXNzYWdlLCBhbGVydCBhbmQgaGFuZHNoYWtlIHR5cGVzCisgKi8KKyNkZWZpbmUgU1NMX01TR19DSEFOR0VfQ0lQSEVSX1NQRUMgICAgIDIwCisjZGVmaW5lIFNTTF9NU0dfQUxFUlQgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBTU0xfTVNHX0hBTkRTSEFLRSAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgU1NMX01TR19BUFBMSUNBVElPTl9EQVRBICAgICAgIDIzCisKKyNkZWZpbmUgU1NMX0FMRVJUX0NMT1NFX05PVElGWSAgICAgICAgICAwCisjZGVmaW5lIFNTTF9BTEVSVF9XQVJOSU5HICAgICAgICAgICAgICAgMQorI2RlZmluZSBTU0xfQUxFUlRfRkFUQUwgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU1NMX0FMRVJUX05PX0NFUlRJRklDQVRFICAgICAgIDQxCisKKyNkZWZpbmUgU1NMX0hTX0hFTExPX1JFUVVFU1QgICAgICAgICAgICAwCisjZGVmaW5lIFNTTF9IU19DTElFTlRfSEVMTE8gICAgICAgICAgICAgMQorI2RlZmluZSBTU0xfSFNfU0VSVkVSX0hFTExPICAgICAgICAgICAgIDIKKyNkZWZpbmUgU1NMX0hTX0NFUlRJRklDQVRFICAgICAgICAgICAgIDExCisjZGVmaW5lIFNTTF9IU19TRVJWRVJfS0VZX0VYQ0hBTkdFICAgICAxMgorI2RlZmluZSBTU0xfSFNfQ0VSVElGSUNBVEVfUkVRVUVTVCAgICAgMTMKKyNkZWZpbmUgU1NMX0hTX1NFUlZFUl9IRUxMT19ET05FICAgICAgIDE0CisjZGVmaW5lIFNTTF9IU19DRVJUSUZJQ0FURV9WRVJJRlkgICAgICAxNQorI2RlZmluZSBTU0xfSFNfQ0xJRU5UX0tFWV9FWENIQU5HRSAgICAgMTYKKyNkZWZpbmUgU1NMX0hTX0ZJTklTSEVEICAgICAgICAgICAgICAgIDIwCisKKy8qCisgKiBUTFMgZXh0ZW5zaW9ucworICovCisjZGVmaW5lIFRMU19FWFRfU0VSVkVSTkFNRSAgICAgICAgICAgICAgMAorI2RlZmluZSBUTFNfRVhUX1NFUlZFUk5BTUVfSE9TVE5BTUUgICAgIDAKKworLyoKKyAqIFNTTCBzdGF0ZSBtYWNoaW5lCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIFNTTF9IRUxMT19SRVFVRVNULAorICAgIFNTTF9DTElFTlRfSEVMTE8sCisgICAgU1NMX1NFUlZFUl9IRUxMTywKKyAgICBTU0xfU0VSVkVSX0NFUlRJRklDQVRFLAorICAgIFNTTF9TRVJWRVJfS0VZX0VYQ0hBTkdFLAorICAgIFNTTF9DRVJUSUZJQ0FURV9SRVFVRVNULAorICAgIFNTTF9TRVJWRVJfSEVMTE9fRE9ORSwKKyAgICBTU0xfQ0xJRU5UX0NFUlRJRklDQVRFLAorICAgIFNTTF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorICAgIFNTTF9DRVJUSUZJQ0FURV9WRVJJRlksCisgICAgU1NMX0NMSUVOVF9DSEFOR0VfQ0lQSEVSX1NQRUMsCisgICAgU1NMX0NMSUVOVF9GSU5JU0hFRCwKKyAgICBTU0xfU0VSVkVSX0NIQU5HRV9DSVBIRVJfU1BFQywKKyAgICBTU0xfU0VSVkVSX0ZJTklTSEVELAorICAgIFNTTF9GTFVTSF9CVUZGRVJTLAorICAgIFNTTF9IQU5EU0hBS0VfT1ZFUgorfQorc3NsX3N0YXRlczsKKwordHlwZWRlZiBzdHJ1Y3QgX3NzbF9zZXNzaW9uIHNzbF9zZXNzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX3NzbF9jb250ZXh0IHNzbF9jb250ZXh0OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3Igc2Vzc2lvbiByZXN1bWluZy4KKyAqLworc3RydWN0IF9zc2xfc2Vzc2lvbgoreworICAgIHRpbWVfdCBzdGFydDsgICAgICAgICAgICAgICAvKiE8IHN0YXJ0aW5nIHRpbWUgICAgICAqLworICAgIGludCBjaXBoZXI7ICAgICAgICAgICAgICAgICAvKiE8IGNob3NlbiBjaXBoZXIgICAgICAqLworICAgIGludCBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKiE8IHNlc3Npb24gaWQgbGVuZ3RoICAqLworICAgIHVuc2lnbmVkIGNoYXIgaWRbMzJdOyAgICAgICAvKiE8IHNlc3Npb24gaWRlbnRpZmllciAqLworICAgIHVuc2lnbmVkIGNoYXIgbWFzdGVyWzQ4XTsgICAvKiE8IHRoZSBtYXN0ZXIgc2VjcmV0ICAqLworICAgIHNzbF9zZXNzaW9uICpuZXh0OyAgICAgICAgICAvKiE8IG5leHQgc2Vzc2lvbiBlbnRyeSAqLworfTsKKworc3RydWN0IF9zc2xfY29udGV4dAoreworICAgIC8qCisgICAgICogTWlzY2VsbGFuZW91cworICAgICAqLworICAgIGludCBzdGF0ZTsgICAgICAgICAgICAgICAgICAvKiE8IFNTTCBoYW5kc2hha2U6IGN1cnJlbnQgc3RhdGUgICAgICovCisKKyAgICBpbnQgbWFqb3JfdmVyOyAgICAgICAgICAgICAgLyohPCBlcXVhbCB0byAgU1NMX01BSk9SX1ZFUlNJT05fMyAgICAqLworICAgIGludCBtaW5vcl92ZXI7ICAgICAgICAgICAgICAvKiE8IGVpdGhlciAwIChTU0wzKSBvciAxIChUTFMxLjApICAgICovCisKKyAgICBpbnQgbWF4X21ham9yX3ZlcjsgICAgICAgICAgLyohPCBtYXguIG1ham9yIHZlcnNpb24gZnJvbSBjbGllbnQgICAqLworICAgIGludCBtYXhfbWlub3JfdmVyOyAgICAgICAgICAvKiE8IG1heC4gbWlub3IgdmVyc2lvbiBmcm9tIGNsaWVudCAgICovCisKKyAgICAvKgorICAgICAqIENhbGxiYWNrcyAoUk5HLCBkZWJ1ZywgSS9PKQorICAgICAqLworICAgIGludCAgKCpmX3JuZykodm9pZCAqKTsKKyAgICB2b2lkICgqZl9kYmcpKHZvaWQgKiwgaW50LCBjaGFyICopOworICAgIGludCAoKmZfcmVjdikodm9pZCAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CisgICAgaW50ICgqZl9zZW5kKSh2b2lkICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworICAgIHZvaWQgKnBfcm5nOyAgICAgICAgICAgICAgICAvKiE8IGNvbnRleHQgZm9yIHRoZSBSTkcgZnVuY3Rpb24gICAgICovCisgICAgdm9pZCAqcF9kYmc7ICAgICAgICAgICAgICAgIC8qITwgY29udGV4dCBmb3IgdGhlIGRlYnVnIGZ1bmN0aW9uICAgKi8KKyAgICB2b2lkICpwX3JlY3Y7ICAgICAgICAgICAgICAgLyohPCBjb250ZXh0IGZvciByZWFkaW5nIG9wZXJhdGlvbnMgICAqLworICAgIHZvaWQgKnBfc2VuZDsgICAgICAgICAgICAgICAvKiE8IGNvbnRleHQgZm9yIHdyaXRpbmcgb3BlcmF0aW9ucyAgICovCisKKyAgICAvKgorICAgICAqIFNlc3Npb24gbGF5ZXIKKyAgICAgKi8KKyAgICBpbnQgcmVzdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8ICBzZXNzaW9uIHJlc3VtaW5nIGZsYWcgICAqLworICAgIGludCB0aW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgIHNlc3MuIGV4cGlyYXRpb24gdGltZSAgICovCisgICAgc3NsX3Nlc3Npb24gKnNlc3Npb247ICAgICAgICAgICAgICAgLyohPCAgY3VycmVudCBzZXNzaW9uIGRhdGEgICAgKi8KKyAgICBpbnQgKCpzX2dldCkoc3NsX2NvbnRleHQgKik7ICAgICAgICAvKiE8ICAoc2VydmVyKSBnZXQgY2FsbGJhY2sgICAqLworICAgIGludCAoKnNfc2V0KShzc2xfY29udGV4dCAqKTsgICAgICAgIC8qITwgIChzZXJ2ZXIpIHNldCBjYWxsYmFjayAgICovCisKKyAgICAvKgorICAgICAqIFJlY29yZCBsYXllciAoaW5jb21pbmcgZGF0YSkKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyICppbl9jdHI7ICAgICAgLyohPCA2NC1iaXQgaW5jb21pbmcgbWVzc2FnZSBjb3VudGVyICAqLworICAgIHVuc2lnbmVkIGNoYXIgKmluX2hkcjsgICAgICAvKiE8IDUtYnl0ZSByZWNvcmQgaGVhZGVyIChpbl9jdHIrOCkgICovCisgICAgdW5zaWduZWQgY2hhciAqaW5fbXNnOyAgICAgIC8qITwgdGhlIG1lc3NhZ2UgY29udGVudHMgKGluX2hkcis1KSAgKi8KKyAgICB1bnNpZ25lZCBjaGFyICppbl9vZmZ0OyAgICAgLyohPCByZWFkIG9mZnNldCBpbiBhcHBsaWNhdGlvbiBkYXRhICAqLworCisgICAgaW50IGluX21zZ3R5cGU7ICAgICAgICAgICAgIC8qITwgcmVjb3JkIGhlYWRlcjogbWVzc2FnZSB0eXBlICAgICAgKi8KKyAgICBpbnQgaW5fbXNnbGVuOyAgICAgICAgICAgICAgLyohPCByZWNvcmQgaGVhZGVyOiBtZXNzYWdlIGxlbmd0aCAgICAqLworICAgIGludCBpbl9sZWZ0OyAgICAgICAgICAgICAgICAvKiE8IGFtb3VudCBvZiBkYXRhIHJlYWQgc28gZmFyICAgICAgICovCisKKyAgICBpbnQgaW5faHNsZW47ICAgICAgICAgICAgICAgLyohPCBjdXJyZW50IGhhbmRzaGFrZSBtZXNzYWdlIGxlbmd0aCAqLworICAgIGludCBuYl96ZXJvOyAgICAgICAgICAgICAgICAvKiE8ICMgb2YgMC1sZW5ndGggZW5jcnlwdGVkIG1lc3NhZ2VzICovCisKKyAgICAvKgorICAgICAqIFJlY29yZCBsYXllciAob3V0Z29pbmcgZGF0YSkKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpvdXRfY3RyOyAgICAgLyohPCA2NC1iaXQgb3V0Z29pbmcgbWVzc2FnZSBjb3VudGVyICAqLworICAgIHVuc2lnbmVkIGNoYXIgKm91dF9oZHI7ICAgICAvKiE8IDUtYnl0ZSByZWNvcmQgaGVhZGVyIChvdXRfY3RyKzgpICovCisgICAgdW5zaWduZWQgY2hhciAqb3V0X21zZzsgICAgIC8qITwgdGhlIG1lc3NhZ2UgY29udGVudHMgKG91dF9oZHIrNSkgKi8KKworICAgIGludCBvdXRfbXNndHlwZTsgICAgICAgICAgICAvKiE8IHJlY29yZCBoZWFkZXI6IG1lc3NhZ2UgdHlwZSAgICAgICovCisgICAgaW50IG91dF9tc2dsZW47ICAgICAgICAgICAgIC8qITwgcmVjb3JkIGhlYWRlcjogbWVzc2FnZSBsZW5ndGggICAgKi8KKyAgICBpbnQgb3V0X2xlZnQ7ICAgICAgICAgICAgICAgLyohPCBhbW91bnQgb2YgZGF0YSBub3QgeWV0IHdyaXR0ZW4gICAqLworCisgICAgLyoKKyAgICAgKiBQS0kgbGF5ZXIKKyAgICAgKi8KKyAgICByc2FfY29udGV4dCAqcnNhX2tleTsgICAgICAgICAgICAgICAvKiE8ICBvd24gUlNBIHByaXZhdGUga2V5ICAgICAqLworICAgIHg1MDlfY2VydCAqb3duX2NlcnQ7ICAgICAgICAgICAgICAgIC8qITwgIG93biBYLjUwOSBjZXJ0aWZpY2F0ZSAgICovCisgICAgeDUwOV9jZXJ0ICpjYV9jaGFpbjsgICAgICAgICAgICAgICAgLyohPCAgb3duIHRydXN0ZWQgQ0EgY2hhaW4gICAgKi8KKyAgICB4NTA5X2NlcnQgKnBlZXJfY2VydDsgICAgICAgICAgICAgICAvKiE8ICBwZWVyIFguNTA5IGNlcnQgY2hhaW4gICAqLworICAgIGNoYXIgKnBlZXJfY247ICAgICAgICAgICAgICAgICAgICAgIC8qITwgIGV4cGVjdGVkIHBlZXIgQ04gICAgICAgICovCisKKyAgICBpbnQgZW5kcG9pbnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8ICAwOiBjbGllbnQsIDE6IHNlcnZlciAgICAqLworICAgIGludCBhdXRobW9kZTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgIHZlcmlmaWNhdGlvbiBtb2RlICAgICAgICovCisgICAgaW50IGNsaWVudF9hdXRoOyAgICAgICAgICAgICAgICAgICAgLyohPCAgZmxhZyBmb3IgY2xpZW50IGF1dGguICAgKi8KKyAgICBpbnQgdmVyaWZ5X3Jlc3VsdDsgICAgICAgICAgICAgICAgICAvKiE8ICB2ZXJpZmljYXRpb24gcmVzdWx0ICAgICAqLworCisgICAgLyoKKyAgICAgKiBDcnlwdG8gbGF5ZXIKKyAgICAgKi8KKyAgICAgZGhtX2NvbnRleHQgZGhtX2N0eDsgICAgICAgICAgICAgICAvKiE8ICBESE0ga2V5IGV4Y2hhbmdlICAgICAgICAqLworICAgICBtZDVfY29udGV4dCBmaW5fbWQ1OyAgICAgICAgICAgICAgIC8qITwgIEZpbmlzaGVkIE1ENSBjaGVja3N1bSAgICovCisgICAgc2hhMV9jb250ZXh0IGZpbl9zaGExOyAgICAgICAgICAgICAgLyohPCAgRmluaXNoZWQgU0hBLTEgY2hlY2tzdW0gKi8KKworICAgIGludCBkb19jcnlwdDsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgIGVuKGRlKWNyeXB0aW9uIGZsYWcgICAgICovCisgICAgaW50ICpjaXBoZXJzOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCAgYWxsb3dlZCBjaXBoZXJzdWl0ZXMgICAgKi8KKyAgICBpbnQgcG1zbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8ICBwcmVtYXN0ZXIgbGVuZ3RoICAgICAgICAqLworICAgIGludCBrZXlsZW47ICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgIHN5bW1ldHJpYyBrZXkgbGVuZ3RoICAgICovCisgICAgaW50IG1pbmxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAgbWluLiBjaXBoZXJ0ZXh0IGxlbmd0aCAgKi8KKyAgICBpbnQgaXZsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8ICBJViBsZW5ndGggICAgICAgICAgICAgICAqLworICAgIGludCBtYWNsZW47ICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgIE1BQyBsZW5ndGggICAgICAgICAgICAgICovCisKKyAgICB1bnNpZ25lZCBjaGFyIHJhbmRieXRlc1s2NF07ICAgICAgICAvKiE8ICByYW5kb20gYnl0ZXMgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgcHJlbWFzdGVyWzI1Nl07ICAgICAgIC8qITwgIHByZW1hc3RlciBzZWNyZXQgICAgICAgICovCisKKyAgICB1bnNpZ25lZCBjaGFyIGl2X2VuY1sxNl07ICAgICAgICAgICAvKiE8ICBJViAoZW5jcnlwdGlvbikgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgaXZfZGVjWzE2XTsgICAgICAgICAgIC8qITwgIElWIChkZWNyeXB0aW9uKSAgICAgICAgICovCisKKyAgICB1bnNpZ25lZCBjaGFyIG1hY19lbmNbMzJdOyAgICAgICAgICAvKiE8ICBNQUMgKGVuY3J5cHRpb24pICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgbWFjX2RlY1szMl07ICAgICAgICAgIC8qITwgIE1BQyAoZGVjcnlwdGlvbikgICAgICAgICovCisKKyAgICB1bnNpZ25lZCBsb25nIGN0eF9lbmNbMTI4XTsgICAgICAgICAvKiE8ICBlbmNyeXB0aW9uIGNvbnRleHQgICAgICAqLworICAgIHVuc2lnbmVkIGxvbmcgY3R4X2RlY1sxMjhdOyAgICAgICAgIC8qITwgIGRlY3J5cHRpb24gY29udGV4dCAgICAgICovCisKKyAgICAvKgorICAgICAqIFRMUyBleHRlbnNpb25zCisgICAgICovCisgICAgdW5zaWduZWQgY2hhciAqaG9zdG5hbWU7CisgICAgdW5zaWduZWQgbG9uZyAgaG9zdG5hbWVfbGVuOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gaW50IHNzbF9kZWZhdWx0X2NpcGhlcnNbXTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgSW5pdGlhbGl6ZSBhbiBTU0wgY29udGV4dAorICoKKyAqIFxwYXJhbSBzc2wgICAgICBTU0wgY29udGV4dAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCisgKi8KK2ludCBzc2xfaW5pdCggc3NsX2NvbnRleHQgKnNzbCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTZXQgdGhlIGN1cnJlbnQgZW5kcG9pbnQgdHlwZQorICoKKyAqIFxwYXJhbSBzc2wgICAgICBTU0wgY29udGV4dAorICogXHBhcmFtIGVuZHBvaW50IG11c3QgYmUgU1NMX0lTX0NMSUVOVCBvciBTU0xfSVNfU0VSVkVSCisgKi8KK3ZvaWQgc3NsX3NldF9lbmRwb2ludCggc3NsX2NvbnRleHQgKnNzbCwgaW50IGVuZHBvaW50ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNldCB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIG1vZGUKKyAqCisgKiBccGFyYW0gc3NsICAgICAgU1NMIGNvbnRleHQKKyAqIFxwYXJhbSBtb2RlICAgICBjYW4gYmU6CisgKgorICogIFNTTF9WRVJJRllfTk9ORTogICAgICBwZWVyIGNlcnRpZmljYXRlIGlzIG5vdCBjaGVja2VkIChkZWZhdWx0KSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBpbnNlY3VyZSBhbmQgU0hPVUxEIGJlIGF2b2lkZWQuCisgKgorICogIFNTTF9WRVJJRllfT1BUSU9OQUw6ICBwZWVyIGNlcnRpZmljYXRlIGlzIGNoZWNrZWQsIGhvd2V2ZXIgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZSBjb250aW51ZXMgZXZlbiBpZiB2ZXJpZmljYXRpb24gZmFpbGVkOworICogICAgICAgICAgICAgICAgICAgICAgICBzc2xfZ2V0X3ZlcmlmeV9yZXN1bHQoKSBjYW4gYmUgY2FsbGVkIGFmdGVyIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UgaXMgY29tcGxldGUuCisgKgorICogIFNTTF9WRVJJRllfUkVRVUlSRUQ6ICBwZWVyICptdXN0KiBwcmVzZW50IGEgdmFsaWQgY2VydGlmaWNhdGUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZSBpcyBhYm9ydGVkIGlmIHZlcmlmaWNhdGlvbiBmYWlsZWQuCisgKi8KK3ZvaWQgc3NsX3NldF9hdXRobW9kZSggc3NsX2NvbnRleHQgKnNzbCwgaW50IGF1dGhtb2RlICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNldCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2FsbGJhY2sKKyAqCisgKiBccGFyYW0gc3NsICAgICAgU1NMIGNvbnRleHQKKyAqIFxwYXJhbSBmX3JuZyAgICBSTkcgZnVuY3Rpb24KKyAqIFxwYXJhbSBwX3JuZyAgICBSTkcgcGFyYW1ldGVyCisgKi8KK3ZvaWQgc3NsX3NldF9ybmcoIHNzbF9jb250ZXh0ICpzc2wsCisgICAgICAgICAgICAgICAgICBpbnQgKCpmX3JuZykodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKnBfcm5nICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNldCB0aGUgZGVidWcgY2FsbGJhY2sKKyAqCisgKiBccGFyYW0gc3NsICAgICAgU1NMIGNvbnRleHQKKyAqIFxwYXJhbSBmX2RiZyAgICBkZWJ1ZyBmdW5jdGlvbgorICogXHBhcmFtIHBfZGJnICAgIGRlYnVnIHBhcmFtZXRlcgorICovCit2b2lkIHNzbF9zZXRfZGJnKCBzc2xfY29udGV4dCAqc3NsLAorICAgICAgICAgICAgICAgICAgdm9pZCAoKmZfZGJnKSh2b2lkICosIGludCwgY2hhciAqKSwKKyAgICAgICAgICAgICAgICAgIHZvaWQgICpwX2RiZyApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTZXQgdGhlIHVuZGVybHlpbmcgQklPIHJlYWQgYW5kIHdyaXRlIGNhbGxiYWNrcworICoKKyAqIFxwYXJhbSBzc2wgICAgICBTU0wgY29udGV4dAorICogXHBhcmFtIGZfcmVjdiAgIHJlYWQgY2FsbGJhY2sKKyAqIFxwYXJhbSBwX3JlY3YgICByZWFkIHBhcmFtZXRlcgorICogXHBhcmFtIGZfc2VuZCAgIHdyaXRlIGNhbGxiYWNrCisgKiBccGFyYW0gcF9zZW5kICAgd3JpdGUgcGFyYW1ldGVyCisgKi8KK3ZvaWQgc3NsX3NldF9iaW8oIHNzbF9jb250ZXh0ICpzc2wsCisgICAgICAgIGludCAoKmZfcmVjdikodm9pZCAqLCB1bnNpZ25lZCBjaGFyICosIGludCksIHZvaWQgKnBfcmVjdiwKKyAgICAgICAgaW50ICgqZl9zZW5kKSh2b2lkICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KSwgdm9pZCAqcF9zZW5kICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNldCB0aGUgc2Vzc2lvbiBjYWxsYmFja3MgKHNlcnZlci1zaWRlIG9ubHkpCisgKgorICogXHBhcmFtIHNzbCAgICAgIFNTTCBjb250ZXh0CisgKiBccGFyYW0gc19nZXQgICAgc2Vzc2lvbiBnZXQgY2FsbGJhY2sKKyAqIFxwYXJhbSBzX3NldCAgICBzZXNzaW9uIHNldCBjYWxsYmFjaworICovCit2b2lkIHNzbF9zZXRfc2NiKCBzc2xfY29udGV4dCAqc3NsLAorICAgICAgICAgICAgICAgICAgaW50ICgqc19nZXQpKHNzbF9jb250ZXh0ICopLAorICAgICAgICAgICAgICAgICAgaW50ICgqc19zZXQpKHNzbF9jb250ZXh0ICopICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNldCB0aGUgc2Vzc2lvbiByZXN1bWluZyBmbGFnLCB0aW1lb3V0IGFuZCBkYXRhCisgKgorICogXHBhcmFtIHNzbCAgICAgIFNTTCBjb250ZXh0CisgKiBccGFyYW0gcmVzdW1lICAgaWYgMCAoZGVmYXVsdCksIHRoZSBzZXNzaW9uIHdpbGwgbm90IGJlIHJlc3VtZWQKKyAqIFxwYXJhbSB0aW1lb3V0ICBzZXNzaW9uIHRpbWVvdXQgaW4gc2Vjb25kcywgb3IgMCAobm8gdGltZW91dCkKKyAqIFxwYXJhbSBzZXNzaW9uICBzZXNzaW9uIGNvbnRleHQKKyAqLwordm9pZCBzc2xfc2V0X3Nlc3Npb24oIHNzbF9jb250ZXh0ICpzc2wsIGludCByZXN1bWUsIGludCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgIHNzbF9zZXNzaW9uICpzZXNzaW9uICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNldCB0aGUgbGlzdCBvZiBhbGxvd2VkIGNpcGhlcnN1aXRlcworICoKKyAqIFxwYXJhbSBzc2wgICAgICBTU0wgY29udGV4dAorICogXHBhcmFtIGNpcGhlcnMgIDAtdGVybWluYXRlZCBsaXN0IG9mIGFsbG93ZWQgY2lwaGVycworICovCit2b2lkIHNzbF9zZXRfY2lwaGVycyggc3NsX2NvbnRleHQgKnNzbCwgaW50ICpjaXBoZXJzICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNldCB0aGUgZGF0YSByZXF1aXJlZCB0byB2ZXJpZnkgcGVlciBjZXJ0aWZpY2F0ZQorICoKKyAqIFxwYXJhbSBzc2wgICAgICBTU0wgY29udGV4dAorICogXHBhcmFtIGNhX2NoYWluIHRydXN0ZWQgQ0EgY2hhaW4KKyAqIFxwYXJhbSBwZWVyX2NuICBleHBlY3RlZCBwZWVyIENvbW1vbk5hbWUgKG9yIE5VTEwpCisgKgorICogXG5vdGUgICAgICAgICAgIFRPRE86IGFkZCB0d28gbW9yZSBwYXJhbWV0ZXJzOiBkZXB0aCBhbmQgY3JsCisgKi8KK3ZvaWQgc3NsX3NldF9jYV9jaGFpbiggc3NsX2NvbnRleHQgKnNzbCwgeDUwOV9jZXJ0ICpjYV9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGVlcl9jbiApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTZXQgb3duIGNlcnRpZmljYXRlIGFuZCBwcml2YXRlIGtleQorICoKKyAqIFxwYXJhbSBzc2wgICAgICBTU0wgY29udGV4dAorICogXHBhcmFtIG93bl9jZXJ0IG93biBwdWJsaWMgY2VydGlmaWNhdGUKKyAqIFxwYXJhbSByc2Ffa2V5ICBvd24gcHJpdmF0ZSBSU0Ega2V5CisgKi8KK3ZvaWQgc3NsX3NldF9vd25fY2VydCggc3NsX2NvbnRleHQgKnNzbCwgeDUwOV9jZXJ0ICpvd25fY2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgcnNhX2NvbnRleHQgKnJzYV9rZXkgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgU2V0IHRoZSBEaWZmaWUtSGVsbG1hbiBwdWJsaWMgUCBhbmQgRyB2YWx1ZXMsCisgKiAgICAgICAgICAgICAgICAgcmVhZCBhcyBoZXhhZGVjaW1hbCBzdHJpbmdzIChzZXJ2ZXItc2lkZSBvbmx5KQorICoKKyAqIFxwYXJhbSBzc2wgICAgICBTU0wgY29udGV4dAorICogXHBhcmFtIGRobV9QICAgIERpZmZpZS1IZWxsbWFuLU1lcmtsZSBtb2R1bHVzCisgKiBccGFyYW0gZGhtX0cgICAgRGlmZmllLUhlbGxtYW4tTWVya2xlIGdlbmVyYXRvcgorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwKKyAqLworaW50IHNzbF9zZXRfZGhfcGFyYW0oIHNzbF9jb250ZXh0ICpzc2wsIGNoYXIgKmRobV9QLCBjaGFyICpkaG1fRyApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTZXQgaG9zdG5hbWUgZm9yIFNlcnZlck5hbWUgVExTIEV4dGVuc2lvbgorICogICAgICAgICAgICAgICAgIAorICoKKyAqIFxwYXJhbSBzc2wgICAgICBTU0wgY29udGV4dAorICogXHBhcmFtIGhvc3RuYW1lIHRoZSBzZXJ2ZXIgaG9zdG5hbWUKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsCisgKi8KK2ludCBzc2xfc2V0X2hvc3RuYW1lKCBzc2xfY29udGV4dCAqc3NsLCBjaGFyICpob3N0bmFtZSApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGF2YWlsYWJsZSB0byByZWFkCisgKgorICogXHBhcmFtIHNzbCAgICAgIFNTTCBjb250ZXh0CisgKgorICogXHJldHVybiAgICAgICAgIGhvdyBtYW55IGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIHJlYWQgYnVmZmVyCisgKi8KK2ludCBzc2xfZ2V0X2J5dGVzX2F2YWlsKCBzc2xfY29udGV4dCAqc3NsICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24KKyAqCisgKiBccGFyYW0gc3NsICAgICAgU1NMIGNvbnRleHQKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBvciBhIGNvbWJpbmF0aW9uIG9mOgorICogICAgICAgICAgICAgICAgICAgICAgQkFEQ0VSVF9FWFBJUkVECisgKiAgICAgICAgICAgICAgICAgICAgICBCQURDRVJUX1JFVk9LRUQKKyAqICAgICAgICAgICAgICAgICAgICAgIEJBRENFUlRfQ05fTUlTTUFUQ0gKKyAqICAgICAgICAgICAgICAgICAgICAgIEJBRENFUlRfTk9UX1RSVVNURUQKKyAqLworaW50IHNzbF9nZXRfdmVyaWZ5X3Jlc3VsdCggc3NsX2NvbnRleHQgKnNzbCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgY2lwaGVyCisgKgorICogXHBhcmFtIHNzbCAgICAgIFNTTCBjb250ZXh0CisgKgorICogXHJldHVybiAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNpcGhlciBuYW1lCisgKi8KK2NoYXIgKnNzbF9nZXRfY2lwaGVyKCBzc2xfY29udGV4dCAqc3NsICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFBlcmZvcm0gdGhlIFNTTCBoYW5kc2hha2UKKyAqCisgKiBccGFyYW0gc3NsICAgICAgU1NMIGNvbnRleHQKKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsLCBYWVNTTF9FUlJfTkVUX1RSWV9BR0FJTiwKKyAqICAgICAgICAgICAgICAgICBvciBhIHNwZWNpZmljIFNTTCBlcnJvciBjb2RlLgorICovCitpbnQgc3NsX2hhbmRzaGFrZSggc3NsX2NvbnRleHQgKnNzbCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBSZWFkIGF0IG1vc3QgJ2xlbicgYXBwbGljYXRpb24gZGF0YSBieXRlcworICoKKyAqIFxwYXJhbSBzc2wgICAgICBTU0wgY29udGV4dAorICogXHBhcmFtIGJ1ZiAgICAgIGJ1ZmZlciB0aGF0IHdpbGwgaG9sZCB0aGUgZGF0YQorICogXHBhcmFtIGxlbiAgICAgIGhvdyBtYW55IGJ5dGVzIG11c3QgYmUgcmVhZAorICoKKyAqIFxyZXR1cm4gICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLAorICogICAgICAgICAgICAgICAgIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNzbF9yZWFkKCBzc2xfY29udGV4dCAqc3NsLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgV3JpdGUgZXhhY3RseSAnbGVuJyBhcHBsaWNhdGlvbiBkYXRhIGJ5dGVzCisgKgorICogXHBhcmFtIHNzbCAgICAgIFNTTCBjb250ZXh0CisgKiBccGFyYW0gYnVmICAgICAgYnVmZmVyIGhvbGRpbmcgdGhlIGRhdGEKKyAqIFxwYXJhbSBsZW4gICAgICBob3cgbWFueSBieXRlcyBtdXN0IGJlIHdyaXR0ZW4KKyAqCisgKiBccmV0dXJuICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwKKyAqICAgICAgICAgICAgICAgICBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogXG5vdGUgICAgICAgICAgIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOLAorICogICAgICAgICAgICAgICAgIGl0IG11c3QgYmUgY2FsbGVkIGxhdGVyIHdpdGggdGhlICpzYW1lKiBhcmd1bWVudHMsCisgKiAgICAgICAgICAgICAgICAgdW50aWwgaXQgcmV0dXJucyBhIHBvc2l0aXZlIHZhbHVlLgorICovCitpbnQgc3NsX3dyaXRlKCBzc2xfY29udGV4dCAqc3NsLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTm90aWZ5IHRoZSBwZWVyIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgYmVpbmcgY2xvc2VkCisgKi8KK2ludCBzc2xfY2xvc2Vfbm90aWZ5KCBzc2xfY29udGV4dCAqc3NsICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIEZyZWUgYW4gU1NMIGNvbnRleHQKKyAqLwordm9pZCBzc2xfZnJlZSggc3NsX2NvbnRleHQgKnNzbCApOworCisvKgorICogSW50ZXJuYWwgZnVuY3Rpb25zIChkbyBub3QgY2FsbCBkaXJlY3RseSkKKyAqLworaW50IHNzbF9oYW5kc2hha2VfY2xpZW50KCBzc2xfY29udGV4dCAqc3NsICk7CitpbnQgc3NsX2hhbmRzaGFrZV9zZXJ2ZXIoIHNzbF9jb250ZXh0ICpzc2wgKTsKKworaW50IHNzbF9kZXJpdmVfa2V5cyggc3NsX2NvbnRleHQgKnNzbCApOwordm9pZCBzc2xfY2FsY192ZXJpZnkoIHNzbF9jb250ZXh0ICpzc2wsIHVuc2lnbmVkIGNoYXIgaGFzaFszNl0gKTsKKworaW50IHNzbF9yZWFkX3JlY29yZCggc3NsX2NvbnRleHQgKnNzbCApOworaW50IHNzbF9mZXRjaF9pbnB1dCggc3NsX2NvbnRleHQgKnNzbCwgaW50IG5iX3dhbnQgKTsKKworaW50IHNzbF93cml0ZV9yZWNvcmQoIHNzbF9jb250ZXh0ICpzc2wgKTsKK2ludCBzc2xfZmx1c2hfb3V0cHV0KCBzc2xfY29udGV4dCAqc3NsICk7CisKK2ludCBzc2xfcGFyc2VfY2VydGlmaWNhdGUoIHNzbF9jb250ZXh0ICpzc2wgKTsKK2ludCBzc2xfd3JpdGVfY2VydGlmaWNhdGUoIHNzbF9jb250ZXh0ICpzc2wgKTsKKworaW50IHNzbF9wYXJzZV9jaGFuZ2VfY2lwaGVyX3NwZWMoIHNzbF9jb250ZXh0ICpzc2wgKTsKK2ludCBzc2xfd3JpdGVfY2hhbmdlX2NpcGhlcl9zcGVjKCBzc2xfY29udGV4dCAqc3NsICk7CisKK2ludCBzc2xfcGFyc2VfZmluaXNoZWQoIHNzbF9jb250ZXh0ICpzc2wgKTsKK2ludCBzc2xfd3JpdGVfZmluaXNoZWQoIHNzbF9jb250ZXh0ICpzc2wgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIHNzbC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BvbGFyc3NsL3RpbWluZy5oIGIvaW5jbHVkZS9wb2xhcnNzbC90aW1pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmU1M2U4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wb2xhcnNzbC90aW1pbmcuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIFxmaWxlIHRpbWluZy5oCisgKi8KKyNpZm5kZWYgWFlTU0xfVElNSU5HX0gKKyNkZWZpbmUgWFlTU0xfVElNSU5HX0gKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgdGltZXIgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBocl90aW1lCit7CisgICAgdW5zaWduZWQgY2hhciBvcGFxdWVbMzJdOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gaW50IGFsYXJtZWQ7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFJldHVybiB0aGUgQ1BVIGN5Y2xlIGNvdW50ZXIgdmFsdWUKKyAqLwordW5zaWduZWQgbG9uZyBoYXJkY2xvY2soIHZvaWQgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgUmV0dXJuIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgKgorICogXHBhcmFtIHZhbCAgICAgIHBvaW50cyB0byBhIHRpbWVyIHN0cnVjdHVyZQorICogXHBhcmFtIHJlc2V0ICAgIGlmIHNldCB0byAxLCB0aGUgdGltZXIgaXMgcmVzdGFydGVkCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RpbWVyKCBzdHJ1Y3QgaHJfdGltZSAqdmFsLCBpbnQgcmVzZXQgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgU2V0dXAgYW4gYWxhcm0gY2xvY2sKKyAqCisgKiBccGFyYW0gc2Vjb25kcyAgZGVsYXkgYmVmb3JlIHRoZSAiYWxhcm1lZCIgZmxhZyBpcyBzZXQKKyAqLwordm9pZCBzZXRfYWxhcm0oIGludCBzZWNvbmRzICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFNsZWVwIGZvciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUKKyAqLwordm9pZCBtX3NsZWVwKCBpbnQgbWlsbGlzZWNvbmRzICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiB0aW1pbmcuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wb2xhcnNzbC94NTA5LmggYi9pbmNsdWRlL3BvbGFyc3NsL3g1MDkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWRhMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wb2xhcnNzbC94NTA5LmgKQEAgLTAsMCArMSwyOTUgQEAKKy8qKgorICogXGZpbGUgeDUwOS5oCisgKi8KKyNpZm5kZWYgWFlTU0xfWDUwOV9ICisjZGVmaW5lIFhZU1NMX1g1MDlfSAorCisjaW5jbHVkZSAieHlzc2wvcnNhLmgiCisKKyNkZWZpbmUgWFlTU0xfRVJSX0FTTjFfT1VUX09GX0RBVEEgICAgICAgICAgICAgICAgICAgICAgLTB4MDAxNAorI2RlZmluZSBYWVNTTF9FUlJfQVNOMV9VTkVYUEVDVEVEX1RBRyAgICAgICAgICAgICAgICAgICAtMHgwMDE2CisjZGVmaW5lIFhZU1NMX0VSUl9BU04xX0lOVkFMSURfTEVOR1RIICAgICAgICAgICAgICAgICAgIC0weDAwMTgKKyNkZWZpbmUgWFlTU0xfRVJSX0FTTjFfTEVOR1RIX01JU01BVENIICAgICAgICAgICAgICAgICAgLTB4MDAxQQorI2RlZmluZSBYWVNTTF9FUlJfQVNOMV9JTlZBTElEX0RBVEEgICAgICAgICAgICAgICAgICAgICAtMHgwMDFDCisKKyNkZWZpbmUgWFlTU0xfRVJSX1g1MDlfRkVBVFVSRV9VTkFWQUlMQUJMRSAgICAgICAgICAgICAgLTB4MDAyMAorI2RlZmluZSBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfUEVNICAgICAgICAgICAgICAgICAtMHgwMDQwCisjZGVmaW5lIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9GT1JNQVQgICAgICAgICAgICAgIC0weDAwNjAKKyNkZWZpbmUgWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX1ZFUlNJT04gICAgICAgICAgICAgLTB4MDA4MAorI2RlZmluZSBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfU0VSSUFMICAgICAgICAgICAgICAtMHgwMEEwCisjZGVmaW5lIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9BTEcgICAgICAgICAgICAgICAgIC0weDAwQzAKKyNkZWZpbmUgWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX05BTUUgICAgICAgICAgICAgICAgLTB4MDBFMAorI2RlZmluZSBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfREFURSAgICAgICAgICAgICAgICAtMHgwMTAwCisjZGVmaW5lIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9QVUJLRVkgICAgICAgICAgICAgIC0weDAxMjAKKyNkZWZpbmUgWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX1NJR05BVFVSRSAgICAgICAgICAgLTB4MDE0MAorI2RlZmluZSBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfRVhURU5TSU9OUyAgICAgICAgICAtMHgwMTYwCisjZGVmaW5lIFhZU1NMX0VSUl9YNTA5X0NFUlRfVU5LTk9XTl9WRVJTSU9OICAgICAgICAgICAgIC0weDAxODAKKyNkZWZpbmUgWFlTU0xfRVJSX1g1MDlfQ0VSVF9VTktOT1dOX1NJR19BTEcgICAgICAgICAgICAgLTB4MDFBMAorI2RlZmluZSBYWVNTTF9FUlJfWDUwOV9DRVJUX1VOS05PV05fUEtfQUxHICAgICAgICAgICAgICAtMHgwMUMwCisjZGVmaW5lIFhZU1NMX0VSUl9YNTA5X0NFUlRfU0lHX01JU01BVENIICAgICAgICAgICAgICAgIC0weDAxRTAKKyNkZWZpbmUgWFlTU0xfRVJSX1g1MDlfQ0VSVF9WRVJJRllfRkFJTEVEICAgICAgICAgICAgICAgLTB4MDIwMAorI2RlZmluZSBYWVNTTF9FUlJfWDUwOV9LRVlfSU5WQUxJRF9QRU0gICAgICAgICAgICAgICAgICAtMHgwMjIwCisjZGVmaW5lIFhZU1NMX0VSUl9YNTA5X0tFWV9JTlZBTElEX1ZFUlNJT04gICAgICAgICAgICAgIC0weDAyNDAKKyNkZWZpbmUgWFlTU0xfRVJSX1g1MDlfS0VZX0lOVkFMSURfRk9STUFUICAgICAgICAgICAgICAgLTB4MDI2MAorI2RlZmluZSBYWVNTTF9FUlJfWDUwOV9LRVlfSU5WQUxJRF9FTkNfSVYgICAgICAgICAgICAgICAtMHgwMjgwCisjZGVmaW5lIFhZU1NMX0VSUl9YNTA5X0tFWV9VTktOT1dOX0VOQ19BTEcgICAgICAgICAgICAgIC0weDAyQTAKKyNkZWZpbmUgWFlTU0xfRVJSX1g1MDlfS0VZX1BBU1NXT1JEX1JFUVVJUkVEICAgICAgICAgICAgLTB4MDJDMAorI2RlZmluZSBYWVNTTF9FUlJfWDUwOV9LRVlfUEFTU1dPUkRfTUlTTUFUQ0ggICAgICAgICAgICAtMHgwMkUwCisjZGVmaW5lIFhZU1NMX0VSUl9YNTA5X1BPSU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICAgIC0weDAzMDAKKyNkZWZpbmUgWFlTU0xfRVJSX1g1MDlfVkFMVUVfVE9fTEVOR1RIICAgICAgICAgICAgICAgICAgLTB4MDMyMAorCisjZGVmaW5lIEJBRENFUlRfRVhQSVJFRCAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCQURDRVJUX1JFVk9LRUQgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQkFEQ0VSVF9DTl9NSVNNQVRDSCAgICAgICAgICAgICA0CisjZGVmaW5lIEJBRENFUlRfTk9UX1RSVVNURUQgICAgICAgICAgICAgOAorCisvKgorICogREVSIGNvbnN0YW50cworICovCisjZGVmaW5lIEFTTjFfQk9PTEVBTiAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBU04xX0lOVEVHRVIgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQVNOMV9CSVRfU1RSSU5HICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEFTTjFfT0NURVRfU1RSSU5HICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBU04xX05VTEwgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQVNOMV9PSUQgICAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIEFTTjFfVVRGOF9TVFJJTkcgICAgICAgICAgICAgMHgwQworI2RlZmluZSBBU04xX1NFUVVFTkNFICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQVNOMV9TRVQgICAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIEFTTjFfUFJJTlRBQkxFX1NUUklORyAgICAgICAgMHgxMworI2RlZmluZSBBU04xX1Q2MV9TVFJJTkcgICAgICAgICAgICAgIDB4MTQKKyNkZWZpbmUgQVNOMV9JQTVfU1RSSU5HICAgICAgICAgICAgICAweDE2CisjZGVmaW5lIEFTTjFfVVRDX1RJTUUgICAgICAgICAgICAgICAgMHgxNworI2RlZmluZSBBU04xX1VOSVZFUlNBTF9TVFJJTkcgICAgICAgIDB4MUMKKyNkZWZpbmUgQVNOMV9CTVBfU1RSSU5HICAgICAgICAgICAgICAweDFFCisjZGVmaW5lIEFTTjFfUFJJTUlUSVZFICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBU04xX0NPTlNUUlVDVEVEICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQVNOMV9DT05URVhUX1NQRUNJRklDICAgICAgICAweDgwCisKKy8qCisgKiB2YXJpb3VzIG9iamVjdCBpZGVudGlmaWVycworICovCisjZGVmaW5lIFg1MjBfQ09NTU9OX05BTUUgICAgICAgICAgICAgICAgMworI2RlZmluZSBYNTIwX0NPVU5UUlkgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWDUyMF9MT0NBTElUWSAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFg1MjBfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBYNTIwX09SR0FOSVpBVElPTiAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgWDUyMF9PUkdfVU5JVCAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFBLQ1M5X0VNQUlMICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFg1MDlfT1VUUFVUX0RFUiAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBYNTA5X09VVFBVVF9QRU0gICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUEVNX0xJTkVfTEVOR1RIICAgICAgICAgICAgICAgIDcyCisjZGVmaW5lIFg1MDlfSVNTVUVSICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBYNTA5X1NVQkpFQ1QgICAgICAgICAgICAgICAgIDB4MDIKKworI2RlZmluZSBPSURfWDUyMCAgICAgICAgICAgICAgICAiXHg1NVx4MDQiCisjZGVmaW5lIE9JRF9DTiAgICAgICAgICAgICAgICAgICJceDU1XHgwNFx4MDMiCisjZGVmaW5lIE9JRF9QS0NTMSAgICAgICAgICAgICAgICJceDJBXHg4Nlx4NDhceDg2XHhGN1x4MERceDAxXHgwMSIKKyNkZWZpbmUgT0lEX1BLQ1MxX1JTQSAgICAgICAgICAgIlx4MkFceDg2XHg0OFx4ODZceEY3XHgwRFx4MDFceDAxXHgwMSIKKyNkZWZpbmUgT0lEX1BLQ1MxX1JTQV9TSEEgICAgICAgIlx4MkFceDg2XHg0OFx4ODZceEY3XHgwRFx4MDFceDAxXHgwNSIKKyNkZWZpbmUgT0lEX1BLQ1M5ICAgICAgICAgICAgICAgIlx4MkFceDg2XHg0OFx4ODZceEY3XHgwRFx4MDFceDA5IgorI2RlZmluZSBPSURfUEtDUzlfRU1BSUwgICAgICAgICAiXHgyQVx4ODZceDQ4XHg4Nlx4RjdceDBEXHgwMVx4MDlceDAxIgorCisvKgorICogU3RydWN0dXJlcyBmb3IgcGFyc2luZyBYLjUwOSBjZXJ0aWZpY2F0ZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3g1MDlfYnVmCit7CisgICAgaW50IHRhZzsKKyAgICBpbnQgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnA7Cit9Cit4NTA5X2J1ZjsKKwordHlwZWRlZiBzdHJ1Y3QgX3g1MDlfbmFtZQoreworICAgIHg1MDlfYnVmIG9pZDsKKyAgICB4NTA5X2J1ZiB2YWw7CisgICAgc3RydWN0IF94NTA5X25hbWUgKm5leHQ7Cit9Cit4NTA5X25hbWU7CisKK3R5cGVkZWYgc3RydWN0IF94NTA5X3RpbWUKK3sKKyAgICBpbnQgeWVhciwgbW9uLCBkYXk7CisgICAgaW50IGhvdXIsIG1pbiwgc2VjOworfQoreDUwOV90aW1lOworCit0eXBlZGVmIHN0cnVjdCBfeDUwOV9jZXJ0Cit7CisgICAgeDUwOV9idWYgcmF3OworICAgIHg1MDlfYnVmIHRiczsKKworICAgIGludCB2ZXJzaW9uOworICAgIHg1MDlfYnVmIHNlcmlhbDsKKyAgICB4NTA5X2J1ZiBzaWdfb2lkMTsKKworICAgIHg1MDlfYnVmIGlzc3Vlcl9yYXc7CisgICAgeDUwOV9idWYgc3ViamVjdF9yYXc7CisKKyAgICB4NTA5X25hbWUgaXNzdWVyOworICAgIHg1MDlfbmFtZSBzdWJqZWN0OworCisgICAgeDUwOV90aW1lIHZhbGlkX2Zyb207CisgICAgeDUwOV90aW1lIHZhbGlkX3RvOworCisgICAgeDUwOV9idWYgcGtfb2lkOworICAgIHJzYV9jb250ZXh0IHJzYTsKKworICAgIHg1MDlfYnVmIGlzc3Vlcl9pZDsKKyAgICB4NTA5X2J1ZiBzdWJqZWN0X2lkOworICAgIHg1MDlfYnVmIHYzX2V4dDsKKworICAgIGludCBjYV9pc3RydWU7CisgICAgaW50IG1heF9wYXRobGVuOworCisgICAgeDUwOV9idWYgc2lnX29pZDI7CisgICAgeDUwOV9idWYgc2lnOworCisgICAgc3RydWN0IF94NTA5X2NlcnQgKm5leHQ7IAorfQoreDUwOV9jZXJ0OworCisvKgorICogU3RydWN0dXJlcyBmb3Igd3JpdGluZyBYLjUwOSBjZXJ0aWZpY2F0ZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3g1MDlfbm9kZQoreworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICB1bnNpZ25lZCBjaGFyICplbmQ7CisKKyAgICBzaXplX3QgbGVuOworfQoreDUwOV9ub2RlOworCit0eXBlZGVmIHN0cnVjdCBfeDUwOV9yYXcKK3sKKyAgICB4NTA5X25vZGUgcmF3OworICAgIHg1MDlfbm9kZSB0YnM7CisKKyAgICB4NTA5X25vZGUgdmVyc2lvbjsKKyAgICB4NTA5X25vZGUgc2VyaWFsOworICAgIHg1MDlfbm9kZSB0YnNfc2lnbmFsZzsKKyAgICB4NTA5X25vZGUgaXNzdWVyOworICAgIHg1MDlfbm9kZSB2YWxpZGl0eTsKKyAgICB4NTA5X25vZGUgc3ViamVjdDsKKyAgICB4NTA5X25vZGUgc3VicHVia2V5OworCisgICAgeDUwOV9ub2RlIHNpZ25hbGc7CisgICAgeDUwOV9ub2RlIHNpZ247Cit9Cit4NTA5X3JhdzsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxicmllZiAgICAgICAgICBQYXJzZSBvbmUgb3IgbW9yZSBjZXJ0aWZpY2F0ZXMgYW5kIGFkZCB0aGVtCisgKiAgICAgICAgICAgICAgICAgdG8gdGhlIGNoYWluZWQgbGlzdAorICoKKyAqIFxwYXJhbSBjaGFpbiAgICBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaGFpbgorICogXHBhcmFtIGJ1ZiAgICAgIGJ1ZmZlciBob2xkaW5nIHRoZSBjZXJ0aWZpY2F0ZSBkYXRhCisgKiBccGFyYW0gYnVmbGVuICAgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBzcGVjaWZpYyBYNTA5IGVycm9yIGNvZGUKKyAqLworaW50IHg1MDlwYXJzZV9jcnQoIHg1MDlfY2VydCAqY3J0LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTG9hZCBvbmUgb3IgbW9yZSBjZXJ0aWZpY2F0ZXMgYW5kIGFkZCB0aGVtCisgKiAgICAgICAgICAgICAgICAgdG8gdGhlIGNoYWluZWQgbGlzdAorICoKKyAqIFxwYXJhbSBjaGFpbiAgICBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaGFpbgorICogXHBhcmFtIHBhdGggICAgIGZpbGVuYW1lIHRvIHJlYWQgdGhlIGNlcnRpZmljYXRlcyBmcm9tCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBzcGVjaWZpYyBYNTA5IGVycm9yIGNvZGUKKyAqLworaW50IHg1MDlwYXJzZV9jcnRmaWxlKCB4NTA5X2NlcnQgKmNydCwgY2hhciAqcGF0aCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBQYXJzZSBhIHByaXZhdGUgUlNBIGtleQorICoKKyAqIFxwYXJhbSByc2EgICAgICBSU0EgY29udGV4dCB0byBiZSBpbml0aWFsaXplZAorICogXHBhcmFtIGJ1ZiAgICAgIGlucHV0IGJ1ZmZlcgorICogXHBhcmFtIGJ1ZmxlbiAgIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogXHBhcmFtIHB3ZCAgICAgIHBhc3N3b3JkIGZvciBkZWNyeXB0aW9uIChvcHRpb25hbCkKKyAqIFxwYXJhbSBwd2RsZW4gICBzaXplIG9mIHRoZSBwYXNzd29yZAorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgc3BlY2lmaWMgWDUwOSBlcnJvciBjb2RlCisgKi8KK2ludCB4NTA5cGFyc2Vfa2V5KCByc2FfY29udGV4dCAqcnNhLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwd2QsIGludCBwd2RsZW4gKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgTG9hZCBhbmQgcGFyc2UgYSBwcml2YXRlIFJTQSBrZXkKKyAqCisgKiBccGFyYW0gcnNhICAgICAgUlNBIGNvbnRleHQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqIFxwYXJhbSBwYXRoICAgICBmaWxlbmFtZSB0byByZWFkIHRoZSBwcml2YXRlIGtleSBmcm9tCisgKiBccGFyYW0gcHdkICAgICAgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgZmlsZSAoY2FuIGJlIE5VTEwpCisgKgorICogXHJldHVybiAgICAgICAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBzcGVjaWZpYyBYNTA5IGVycm9yIGNvZGUKKyAqLworaW50IHg1MDlwYXJzZV9rZXlmaWxlKCByc2FfY29udGV4dCAqcnNhLCBjaGFyICpwYXRoLCBjaGFyICpwYXNzd29yZCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBTdG9yZSB0aGUgY2VydGlmaWNhdGUgRE4gaW4gcHJpbnRhYmxlIGZvcm0gaW50byBidWY7CisgKiAgICAgICAgICAgICAgICAgbm8gbW9yZSB0aGFuIChlbmQgLSBidWYpIGNoYXJhY3RlcnMgd2lsbCBiZSB3cml0dGVuLgorICovCitpbnQgeDUwOXBhcnNlX2RuX2dldHMoIGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCB4NTA5X25hbWUgKmRuICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFJldHVybnMgYW4gaW5mb3JtYXRpb25hbCBzdHJpbmcgYWJvdXQgdGhlCisgKiAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUuCisgKi8KK2NoYXIgKng1MDlwYXJzZV9jZXJ0X2luZm8oIGNoYXIgKnByZWZpeCwgeDUwOV9jZXJ0ICpjcnQgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgUmV0dXJuIDAgaWYgdGhlIGNlcnRpZmljYXRlIGlzIHN0aWxsIHZhbGlkLAorICogICAgICAgICAgICAgICAgIG9yIEJBRENFUlRfRVhQSVJFRAorICovCitpbnQgeDUwOXBhcnNlX2V4cGlyZWQoIHg1MDlfY2VydCAqY3J0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFZlcmlmeSB0aGUgY2VydGlmaWNhdGUgc2lnbmF0dXJlCisgKgorICogXHBhcmFtIGNydCAgICAgIGEgY2VydGlmaWNhdGUgdG8gYmUgdmVyaWZpZWQKKyAqIFxwYXJhbSB0cnVzdF9jYSB0aGUgdHJ1c3RlZCBDQSBjaGFpbgorICogXHBhcmFtIGNuICAgICAgIGV4cGVjdGVkIENvbW1vbiBOYW1lIChjYW4gYmUgc2V0IHRvCisgKiAgICAgICAgICAgICAgICAgTlVMTCBpZiB0aGUgQ04gbXVzdCBub3QgYmUgdmVyaWZpZWQpCisgKiBccGFyYW0gZmxhZ3MgICAgcmVzdWx0IG9mIHRoZSB2ZXJpZmljYXRpb24KKyAqCisgKiBccmV0dXJuICAgICAgICAgMCBpZiBzdWNjZXNzZnVsIG9yIFhZU1NMX0VSUl9YNTA5X1NJR19WRVJJRllfRkFJTEVELAorICogICAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgKmZsYWdzIHdpbGwgaGF2ZSBvbmUgb3IgbW9yZSBvZgorICogICAgICAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHNldDoKKyAqICAgICAgICAgICAgICAgICAgICAgIEJBRENFUlRfRVhQSVJFRCAtLQorICogICAgICAgICAgICAgICAgICAgICAgQkFEQ0VSVF9SRVZPS0VEIC0tCisgKiAgICAgICAgICAgICAgICAgICAgICBCQURDRVJUX0NOX01JU01BVENIIC0tCisgKiAgICAgICAgICAgICAgICAgICAgICBCQURDRVJUX05PVF9UUlVTVEVECisgKgorICogXG5vdGUgICAgICAgICAgIFRPRE86IGFkZCB0d28gYXJndW1lbnRzLCBkZXB0aCBhbmQgY3JsCisgKi8KK2ludCB4NTA5cGFyc2VfdmVyaWZ5KCB4NTA5X2NlcnQgKmNydCwKKyAgICAgICAgICAgICAgICAgICAgICB4NTA5X2NlcnQgKnRydXN0X2NhLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNuLCBpbnQgKmZsYWdzICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFVuYWxsb2NhdGUgYWxsIGNlcnRpZmljYXRlIGRhdGEKKyAqLwordm9pZCB4NTA5X2ZyZWUoIHg1MDlfY2VydCAqY3J0ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIENoZWNrdXAgcm91dGluZQorICoKKyAqIFxyZXR1cm4gICAgICAgICAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgaWYgdGhlIHRlc3QgZmFpbGVkCisgKi8KK2ludCB4NTA5X3NlbGZfdGVzdCggaW50IHZlcmJvc2UgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIHg1MDkuaCAqLwpkaWZmIC0tZ2l0IGEvbGlicmFyeS9NYWtlZmlsZSBiL2xpYnJhcnkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmNjE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnJhcnkvTWFrZWZpbGUKQEAgLTAsMCArMSw1NyBAQAorCisjIEFsc28gc2VlICJpbmNsdWRlL3h5c3NsL2NvbmZpZy5oIgorCitDRkxBR1MJPSAtSS4uL2luY2x1ZGUgLURfRklMRV9PRkZTRVRfQklUUz02NAorT0ZMQUdTCT0gLU8KKworIyBNaWNyb0JsYXplIHNwZWNpZmljIG9wdGlvbnM6CisjIENGTEFHUyArPSAtbW5vLXhsLXNvZnQtbXVsIC1teGwtYmFycmVsLXNoaWZ0CisKKyMgVG8gY29tcGlsZSBvbiBQbGFuOToKKyMgQ0ZMQUdTICs9IC1EX0JTRF9FWFRFTlNJT04KKworIyBUbyBjb21waWxlIGFzIGEgc2hhcmVkIGxpYnJhcnk6CisjIENGTEFHUyArPSAtZlBJQworCitETEVYVD1zbworIyBPU1ggc2hhcmVkIGxpYnJhcnkgZXh0ZW5zaW9uOgorIyBETEVYVD1keWxpYgorCitPQkpTPQlhZXMubwkJYXJjNC5vCQliYXNlNjQubwlcCisJYmlnbnVtLm8JY2VydHMubwkJZGVidWcubwkJXAorCWRlcy5vCQlkaG0ubwkJaGF2ZWdlLm8JXAorCW1kMi5vCQltZDQubwkJbWQ1Lm8JCVwKKwluZXQubwkJcGFkbG9jay5vCXJzYS5vCQlcCisJc2hhMS5vCQlzaGEyLm8JCXNoYTQubwkJXAorCXNzbF9jbGkubwlzc2xfc3J2Lm8Jc3NsX3Rscy5vCVwKKwl0aW1pbmcubwl4NTA5cGFyc2UubworCisuU0lMRU5UOgorCithbGw6IHN0YXRpYworCitzdGF0aWM6IGxpYnh5c3NsLmEKKworc2hhcmVkOiBsaWJ4eXNzbC4kKERMRVhUKQorCitsaWJ4eXNzbC5hOiAkKE9CSlMpCisJZWNobyAiICBBUiAgICAkQCIKKwlhciByICRAICQoT0JKUykKKwllY2hvICIgIFJMICAgICRAIgorCXJhbmxpYiAkQAorCitsaWJ4eXNzbC5zbzogbGlieHlzc2wuYQorCWVjaG8gIiAgTEQgICAgJEAiCisJJChDQykgLXNoYXJlZCAtV2wsLXNvbmFtZSwkQCAtbyAkQCAkKE9CSlMpCisKK2xpYnh5c3NsLmR5bGliOiBsaWJ4eXNzbC5hCisJZWNobyAiICBMRCAgICAkQCIKKwkkKENDKSAtZHluYW1pY2xpYiAtbyAkQCAkKE9CSlMpCisKKy5jLm86CisJZWNobyAiICBDQyAgICAkPCIKKwkkKENDKSAkKENGTEFHUykgJChPRkxBR1MpIC1jICQ8CisKK2NsZWFuOgorCXJtIC1mICoubyBsaWJ4eXNzbC4qCisKZGlmZiAtLWdpdCBhL2xpYnJhcnkvYWVzLmMgYi9saWJyYXJ5L2Flcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmIwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJyYXJ5L2Flcy5jCkBAIC0wLDAgKzEsMTEzNCBAQAorLyoKKyAqICBGSVBTLTE5NyBjb21wbGlhbnQgQUVTIGltcGxlbWVudGF0aW9uCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworLyoKKyAqICBUaGUgQUVTIGJsb2NrIGNpcGhlciB3YXMgZGVzaWduZWQgYnkgVmluY2VudCBSaWptZW4gYW5kIEpvYW4gRGFlbWVuLgorICoKKyAqICBodHRwOi8vY3NyYy5uaXN0Lmdvdi9lbmNyeXB0aW9uL2Flcy9yaWpuZGFlbC9SaWpuZGFlbC5wZGYKKyAqICBodHRwOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZmlwcy9maXBzMTk3L2ZpcHMtMTk3LnBkZgorICovCisKKyNpbmNsdWRlICJ4eXNzbC9jb25maWcuaCIKKworI2lmIGRlZmluZWQoWFlTU0xfQUVTX0MpCisKKyNpbmNsdWRlICJ4eXNzbC9hZXMuaCIKKyNpbmNsdWRlICJ4eXNzbC9wYWRsb2NrLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIDMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbiBtYWNyb3MgKGxpdHRsZSBlbmRpYW4pCisgKi8KKyNpZm5kZWYgR0VUX1VMT05HX0xFCisjZGVmaW5lIEdFVF9VTE9OR19MRShuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuKSA9ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgICAgXSAgICAgICApICAgICAgICBcCisgICAgICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDFdIDw8ICA4ICkgICAgICAgIFwKKyAgICAgICAgfCAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICsgMl0gPDwgMTYgKSAgICAgICAgXAorICAgICAgICB8ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgKyAzXSA8PCAyNCApOyAgICAgICBcCit9CisjZW5kaWYKKworI2lmbmRlZiBQVVRfVUxPTkdfTEUKKyNkZWZpbmUgUFVUX1VMT05HX0xFKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGIpWyhpKSAgICBdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pICAgICAgICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgMV0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gIDggKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAxNiApOyAgICAgICBcCisgICAgKGIpWyhpKSArIDNdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+IDI0ICk7ICAgICAgIFwKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9BRVNfUk9NX1RBQkxFUykKKy8qCisgKiBGb3J3YXJkIFMtYm94CisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIEZTYlsyNTZdID0KK3sKKyAgICAweDYzLCAweDdDLCAweDc3LCAweDdCLCAweEYyLCAweDZCLCAweDZGLCAweEM1LAorICAgIDB4MzAsIDB4MDEsIDB4NjcsIDB4MkIsIDB4RkUsIDB4RDcsIDB4QUIsIDB4NzYsCisgICAgMHhDQSwgMHg4MiwgMHhDOSwgMHg3RCwgMHhGQSwgMHg1OSwgMHg0NywgMHhGMCwKKyAgICAweEFELCAweEQ0LCAweEEyLCAweEFGLCAweDlDLCAweEE0LCAweDcyLCAweEMwLAorICAgIDB4QjcsIDB4RkQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M0YsIDB4RjcsIDB4Q0MsCisgICAgMHgzNCwgMHhBNSwgMHhFNSwgMHhGMSwgMHg3MSwgMHhEOCwgMHgzMSwgMHgxNSwKKyAgICAweDA0LCAweEM3LCAweDIzLCAweEMzLCAweDE4LCAweDk2LCAweDA1LCAweDlBLAorICAgIDB4MDcsIDB4MTIsIDB4ODAsIDB4RTIsIDB4RUIsIDB4MjcsIDB4QjIsIDB4NzUsCisgICAgMHgwOSwgMHg4MywgMHgyQywgMHgxQSwgMHgxQiwgMHg2RSwgMHg1QSwgMHhBMCwKKyAgICAweDUyLCAweDNCLCAweEQ2LCAweEIzLCAweDI5LCAweEUzLCAweDJGLCAweDg0LAorICAgIDB4NTMsIDB4RDEsIDB4MDAsIDB4RUQsIDB4MjAsIDB4RkMsIDB4QjEsIDB4NUIsCisgICAgMHg2QSwgMHhDQiwgMHhCRSwgMHgzOSwgMHg0QSwgMHg0QywgMHg1OCwgMHhDRiwKKyAgICAweEQwLCAweEVGLCAweEFBLCAweEZCLCAweDQzLCAweDRELCAweDMzLCAweDg1LAorICAgIDB4NDUsIDB4RjksIDB4MDIsIDB4N0YsIDB4NTAsIDB4M0MsIDB4OUYsIDB4QTgsCisgICAgMHg1MSwgMHhBMywgMHg0MCwgMHg4RiwgMHg5MiwgMHg5RCwgMHgzOCwgMHhGNSwKKyAgICAweEJDLCAweEI2LCAweERBLCAweDIxLCAweDEwLCAweEZGLCAweEYzLCAweEQyLAorICAgIDB4Q0QsIDB4MEMsIDB4MTMsIDB4RUMsIDB4NUYsIDB4OTcsIDB4NDQsIDB4MTcsCisgICAgMHhDNCwgMHhBNywgMHg3RSwgMHgzRCwgMHg2NCwgMHg1RCwgMHgxOSwgMHg3MywKKyAgICAweDYwLCAweDgxLCAweDRGLCAweERDLCAweDIyLCAweDJBLCAweDkwLCAweDg4LAorICAgIDB4NDYsIDB4RUUsIDB4QjgsIDB4MTQsIDB4REUsIDB4NUUsIDB4MEIsIDB4REIsCisgICAgMHhFMCwgMHgzMiwgMHgzQSwgMHgwQSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1QywKKyAgICAweEMyLCAweEQzLCAweEFDLCAweDYyLCAweDkxLCAweDk1LCAweEU0LCAweDc5LAorICAgIDB4RTcsIDB4QzgsIDB4MzcsIDB4NkQsIDB4OEQsIDB4RDUsIDB4NEUsIDB4QTksCisgICAgMHg2QywgMHg1NiwgMHhGNCwgMHhFQSwgMHg2NSwgMHg3QSwgMHhBRSwgMHgwOCwKKyAgICAweEJBLCAweDc4LCAweDI1LCAweDJFLCAweDFDLCAweEE2LCAweEI0LCAweEM2LAorICAgIDB4RTgsIDB4REQsIDB4NzQsIDB4MUYsIDB4NEIsIDB4QkQsIDB4OEIsIDB4OEEsCisgICAgMHg3MCwgMHgzRSwgMHhCNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhGNiwgMHgwRSwKKyAgICAweDYxLCAweDM1LCAweDU3LCAweEI5LCAweDg2LCAweEMxLCAweDFELCAweDlFLAorICAgIDB4RTEsIDB4RjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4RDksIDB4OEUsIDB4OTQsCisgICAgMHg5QiwgMHgxRSwgMHg4NywgMHhFOSwgMHhDRSwgMHg1NSwgMHgyOCwgMHhERiwKKyAgICAweDhDLCAweEExLCAweDg5LCAweDBELCAweEJGLCAweEU2LCAweDQyLCAweDY4LAorICAgIDB4NDEsIDB4OTksIDB4MkQsIDB4MEYsIDB4QjAsIDB4NTQsIDB4QkIsIDB4MTYKK307CisKKy8qCisgKiBGb3J3YXJkIHRhYmxlcworICovCisjZGVmaW5lIEZUIFwKK1wKKyAgICBWKEE1LDYzLDYzLEM2KSwgVig4NCw3Qyw3QyxGOCksIFYoOTksNzcsNzcsRUUpLCBWKDhELDdCLDdCLEY2KSwgXAorICAgIFYoMEQsRjIsRjIsRkYpLCBWKEJELDZCLDZCLEQ2KSwgVihCMSw2Riw2RixERSksIFYoNTQsQzUsQzUsOTEpLCBcCisgICAgVig1MCwzMCwzMCw2MCksIFYoMDMsMDEsMDEsMDIpLCBWKEE5LDY3LDY3LENFKSwgVig3RCwyQiwyQiw1NiksIFwKKyAgICBWKDE5LEZFLEZFLEU3KSwgVig2MixENyxENyxCNSksIFYoRTYsQUIsQUIsNEQpLCBWKDlBLDc2LDc2LEVDKSwgXAorICAgIFYoNDUsQ0EsQ0EsOEYpLCBWKDlELDgyLDgyLDFGKSwgVig0MCxDOSxDOSw4OSksIFYoODcsN0QsN0QsRkEpLCBcCisgICAgVigxNSxGQSxGQSxFRiksIFYoRUIsNTksNTksQjIpLCBWKEM5LDQ3LDQ3LDhFKSwgVigwQixGMCxGMCxGQiksIFwKKyAgICBWKEVDLEFELEFELDQxKSwgVig2NyxENCxENCxCMyksIFYoRkQsQTIsQTIsNUYpLCBWKEVBLEFGLEFGLDQ1KSwgXAorICAgIFYoQkYsOUMsOUMsMjMpLCBWKEY3LEE0LEE0LDUzKSwgVig5Niw3Miw3MixFNCksIFYoNUIsQzAsQzAsOUIpLCBcCisgICAgVihDMixCNyxCNyw3NSksIFYoMUMsRkQsRkQsRTEpLCBWKEFFLDkzLDkzLDNEKSwgVig2QSwyNiwyNiw0QyksIFwKKyAgICBWKDVBLDM2LDM2LDZDKSwgVig0MSwzRiwzRiw3RSksIFYoMDIsRjcsRjcsRjUpLCBWKDRGLENDLENDLDgzKSwgXAorICAgIFYoNUMsMzQsMzQsNjgpLCBWKEY0LEE1LEE1LDUxKSwgVigzNCxFNSxFNSxEMSksIFYoMDgsRjEsRjEsRjkpLCBcCisgICAgVig5Myw3MSw3MSxFMiksIFYoNzMsRDgsRDgsQUIpLCBWKDUzLDMxLDMxLDYyKSwgVigzRiwxNSwxNSwyQSksIFwKKyAgICBWKDBDLDA0LDA0LDA4KSwgVig1MixDNyxDNyw5NSksIFYoNjUsMjMsMjMsNDYpLCBWKDVFLEMzLEMzLDlEKSwgXAorICAgIFYoMjgsMTgsMTgsMzApLCBWKEExLDk2LDk2LDM3KSwgVigwRiwwNSwwNSwwQSksIFYoQjUsOUEsOUEsMkYpLCBcCisgICAgVigwOSwwNywwNywwRSksIFYoMzYsMTIsMTIsMjQpLCBWKDlCLDgwLDgwLDFCKSwgVigzRCxFMixFMixERiksIFwKKyAgICBWKDI2LEVCLEVCLENEKSwgVig2OSwyNywyNyw0RSksIFYoQ0QsQjIsQjIsN0YpLCBWKDlGLDc1LDc1LEVBKSwgXAorICAgIFYoMUIsMDksMDksMTIpLCBWKDlFLDgzLDgzLDFEKSwgVig3NCwyQywyQyw1OCksIFYoMkUsMUEsMUEsMzQpLCBcCisgICAgVigyRCwxQiwxQiwzNiksIFYoQjIsNkUsNkUsREMpLCBWKEVFLDVBLDVBLEI0KSwgVihGQixBMCxBMCw1QiksIFwKKyAgICBWKEY2LDUyLDUyLEE0KSwgVig0RCwzQiwzQiw3NiksIFYoNjEsRDYsRDYsQjcpLCBWKENFLEIzLEIzLDdEKSwgXAorICAgIFYoN0IsMjksMjksNTIpLCBWKDNFLEUzLEUzLEREKSwgVig3MSwyRiwyRiw1RSksIFYoOTcsODQsODQsMTMpLCBcCisgICAgVihGNSw1Myw1MyxBNiksIFYoNjgsRDEsRDEsQjkpLCBWKDAwLDAwLDAwLDAwKSwgVigyQyxFRCxFRCxDMSksIFwKKyAgICBWKDYwLDIwLDIwLDQwKSwgVigxRixGQyxGQyxFMyksIFYoQzgsQjEsQjEsNzkpLCBWKEVELDVCLDVCLEI2KSwgXAorICAgIFYoQkUsNkEsNkEsRDQpLCBWKDQ2LENCLENCLDhEKSwgVihEOSxCRSxCRSw2NyksIFYoNEIsMzksMzksNzIpLCBcCisgICAgVihERSw0QSw0QSw5NCksIFYoRDQsNEMsNEMsOTgpLCBWKEU4LDU4LDU4LEIwKSwgVig0QSxDRixDRiw4NSksIFwKKyAgICBWKDZCLEQwLEQwLEJCKSwgVigyQSxFRixFRixDNSksIFYoRTUsQUEsQUEsNEYpLCBWKDE2LEZCLEZCLEVEKSwgXAorICAgIFYoQzUsNDMsNDMsODYpLCBWKEQ3LDRELDRELDlBKSwgVig1NSwzMywzMyw2NiksIFYoOTQsODUsODUsMTEpLCBcCisgICAgVihDRiw0NSw0NSw4QSksIFYoMTAsRjksRjksRTkpLCBWKDA2LDAyLDAyLDA0KSwgVig4MSw3Riw3RixGRSksIFwKKyAgICBWKEYwLDUwLDUwLEEwKSwgVig0NCwzQywzQyw3OCksIFYoQkEsOUYsOUYsMjUpLCBWKEUzLEE4LEE4LDRCKSwgXAorICAgIFYoRjMsNTEsNTEsQTIpLCBWKEZFLEEzLEEzLDVEKSwgVihDMCw0MCw0MCw4MCksIFYoOEEsOEYsOEYsMDUpLCBcCisgICAgVihBRCw5Miw5MiwzRiksIFYoQkMsOUQsOUQsMjEpLCBWKDQ4LDM4LDM4LDcwKSwgVigwNCxGNSxGNSxGMSksIFwKKyAgICBWKERGLEJDLEJDLDYzKSwgVihDMSxCNixCNiw3NyksIFYoNzUsREEsREEsQUYpLCBWKDYzLDIxLDIxLDQyKSwgXAorICAgIFYoMzAsMTAsMTAsMjApLCBWKDFBLEZGLEZGLEU1KSwgVigwRSxGMyxGMyxGRCksIFYoNkQsRDIsRDIsQkYpLCBcCisgICAgVig0QyxDRCxDRCw4MSksIFYoMTQsMEMsMEMsMTgpLCBWKDM1LDEzLDEzLDI2KSwgVigyRixFQyxFQyxDMyksIFwKKyAgICBWKEUxLDVGLDVGLEJFKSwgVihBMiw5Nyw5NywzNSksIFYoQ0MsNDQsNDQsODgpLCBWKDM5LDE3LDE3LDJFKSwgXAorICAgIFYoNTcsQzQsQzQsOTMpLCBWKEYyLEE3LEE3LDU1KSwgVig4Miw3RSw3RSxGQyksIFYoNDcsM0QsM0QsN0EpLCBcCisgICAgVihBQyw2NCw2NCxDOCksIFYoRTcsNUQsNUQsQkEpLCBWKDJCLDE5LDE5LDMyKSwgVig5NSw3Myw3MyxFNiksIFwKKyAgICBWKEEwLDYwLDYwLEMwKSwgVig5OCw4MSw4MSwxOSksIFYoRDEsNEYsNEYsOUUpLCBWKDdGLERDLERDLEEzKSwgXAorICAgIFYoNjYsMjIsMjIsNDQpLCBWKDdFLDJBLDJBLDU0KSwgVihBQiw5MCw5MCwzQiksIFYoODMsODgsODgsMEIpLCBcCisgICAgVihDQSw0Niw0Niw4QyksIFYoMjksRUUsRUUsQzcpLCBWKEQzLEI4LEI4LDZCKSwgVigzQywxNCwxNCwyOCksIFwKKyAgICBWKDc5LERFLERFLEE3KSwgVihFMiw1RSw1RSxCQyksIFYoMUQsMEIsMEIsMTYpLCBWKDc2LERCLERCLEFEKSwgXAorICAgIFYoM0IsRTAsRTAsREIpLCBWKDU2LDMyLDMyLDY0KSwgVig0RSwzQSwzQSw3NCksIFYoMUUsMEEsMEEsMTQpLCBcCisgICAgVihEQiw0OSw0OSw5MiksIFYoMEEsMDYsMDYsMEMpLCBWKDZDLDI0LDI0LDQ4KSwgVihFNCw1Qyw1QyxCOCksIFwKKyAgICBWKDVELEMyLEMyLDlGKSwgVig2RSxEMyxEMyxCRCksIFYoRUYsQUMsQUMsNDMpLCBWKEE2LDYyLDYyLEM0KSwgXAorICAgIFYoQTgsOTEsOTEsMzkpLCBWKEE0LDk1LDk1LDMxKSwgVigzNyxFNCxFNCxEMyksIFYoOEIsNzksNzksRjIpLCBcCisgICAgVigzMixFNyxFNyxENSksIFYoNDMsQzgsQzgsOEIpLCBWKDU5LDM3LDM3LDZFKSwgVihCNyw2RCw2RCxEQSksIFwKKyAgICBWKDhDLDhELDhELDAxKSwgVig2NCxENSxENSxCMSksIFYoRDIsNEUsNEUsOUMpLCBWKEUwLEE5LEE5LDQ5KSwgXAorICAgIFYoQjQsNkMsNkMsRDgpLCBWKEZBLDU2LDU2LEFDKSwgVigwNyxGNCxGNCxGMyksIFYoMjUsRUEsRUEsQ0YpLCBcCisgICAgVihBRiw2NSw2NSxDQSksIFYoOEUsN0EsN0EsRjQpLCBWKEU5LEFFLEFFLDQ3KSwgVigxOCwwOCwwOCwxMCksIFwKKyAgICBWKEQ1LEJBLEJBLDZGKSwgVig4OCw3OCw3OCxGMCksIFYoNkYsMjUsMjUsNEEpLCBWKDcyLDJFLDJFLDVDKSwgXAorICAgIFYoMjQsMUMsMUMsMzgpLCBWKEYxLEE2LEE2LDU3KSwgVihDNyxCNCxCNCw3MyksIFYoNTEsQzYsQzYsOTcpLCBcCisgICAgVigyMyxFOCxFOCxDQiksIFYoN0MsREQsREQsQTEpLCBWKDlDLDc0LDc0LEU4KSwgVigyMSwxRiwxRiwzRSksIFwKKyAgICBWKERELDRCLDRCLDk2KSwgVihEQyxCRCxCRCw2MSksIFYoODYsOEIsOEIsMEQpLCBWKDg1LDhBLDhBLDBGKSwgXAorICAgIFYoOTAsNzAsNzAsRTApLCBWKDQyLDNFLDNFLDdDKSwgVihDNCxCNSxCNSw3MSksIFYoQUEsNjYsNjYsQ0MpLCBcCisgICAgVihEOCw0OCw0OCw5MCksIFYoMDUsMDMsMDMsMDYpLCBWKDAxLEY2LEY2LEY3KSwgVigxMiwwRSwwRSwxQyksIFwKKyAgICBWKEEzLDYxLDYxLEMyKSwgVig1RiwzNSwzNSw2QSksIFYoRjksNTcsNTcsQUUpLCBWKEQwLEI5LEI5LDY5KSwgXAorICAgIFYoOTEsODYsODYsMTcpLCBWKDU4LEMxLEMxLDk5KSwgVigyNywxRCwxRCwzQSksIFYoQjksOUUsOUUsMjcpLCBcCisgICAgVigzOCxFMSxFMSxEOSksIFYoMTMsRjgsRjgsRUIpLCBWKEIzLDk4LDk4LDJCKSwgVigzMywxMSwxMSwyMiksIFwKKyAgICBWKEJCLDY5LDY5LEQyKSwgVig3MCxEOSxEOSxBOSksIFYoODksOEUsOEUsMDcpLCBWKEE3LDk0LDk0LDMzKSwgXAorICAgIFYoQjYsOUIsOUIsMkQpLCBWKDIyLDFFLDFFLDNDKSwgVig5Miw4Nyw4NywxNSksIFYoMjAsRTksRTksQzkpLCBcCisgICAgVig0OSxDRSxDRSw4NyksIFYoRkYsNTUsNTUsQUEpLCBWKDc4LDI4LDI4LDUwKSwgVig3QSxERixERixBNSksIFwKKyAgICBWKDhGLDhDLDhDLDAzKSwgVihGOCxBMSxBMSw1OSksIFYoODAsODksODksMDkpLCBWKDE3LDBELDBELDFBKSwgXAorICAgIFYoREEsQkYsQkYsNjUpLCBWKDMxLEU2LEU2LEQ3KSwgVihDNiw0Miw0Miw4NCksIFYoQjgsNjgsNjgsRDApLCBcCisgICAgVihDMyw0MSw0MSw4MiksIFYoQjAsOTksOTksMjkpLCBWKDc3LDJELDJELDVBKSwgVigxMSwwRiwwRiwxRSksIFwKKyAgICBWKENCLEIwLEIwLDdCKSwgVihGQyw1NCw1NCxBOCksIFYoRDYsQkIsQkIsNkQpLCBWKDNBLDE2LDE2LDJDKQorCisjZGVmaW5lIFYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIEZUMFsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBGVDFbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUgVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgRlQyWzI1Nl0gPSB7IEZUIH07CisjdW5kZWYgVgorCisjZGVmaW5lIFYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIEZUM1syNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI3VuZGVmIEZUCisKKy8qCisgKiBSZXZlcnNlIFMtYm94CisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFJTYlsyNTZdID0KK3sKKyAgICAweDUyLCAweDA5LCAweDZBLCAweEQ1LCAweDMwLCAweDM2LCAweEE1LCAweDM4LAorICAgIDB4QkYsIDB4NDAsIDB4QTMsIDB4OUUsIDB4ODEsIDB4RjMsIDB4RDcsIDB4RkIsCisgICAgMHg3QywgMHhFMywgMHgzOSwgMHg4MiwgMHg5QiwgMHgyRiwgMHhGRiwgMHg4NywKKyAgICAweDM0LCAweDhFLCAweDQzLCAweDQ0LCAweEM0LCAweERFLCAweEU5LCAweENCLAorICAgIDB4NTQsIDB4N0IsIDB4OTQsIDB4MzIsIDB4QTYsIDB4QzIsIDB4MjMsIDB4M0QsCisgICAgMHhFRSwgMHg0QywgMHg5NSwgMHgwQiwgMHg0MiwgMHhGQSwgMHhDMywgMHg0RSwKKyAgICAweDA4LCAweDJFLCAweEExLCAweDY2LCAweDI4LCAweEQ5LCAweDI0LCAweEIyLAorICAgIDB4NzYsIDB4NUIsIDB4QTIsIDB4NDksIDB4NkQsIDB4OEIsIDB4RDEsIDB4MjUsCisgICAgMHg3MiwgMHhGOCwgMHhGNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNiwKKyAgICAweEQ0LCAweEE0LCAweDVDLCAweENDLCAweDVELCAweDY1LCAweEI2LCAweDkyLAorICAgIDB4NkMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4RkQsIDB4RUQsIDB4QjksIDB4REEsCisgICAgMHg1RSwgMHgxNSwgMHg0NiwgMHg1NywgMHhBNywgMHg4RCwgMHg5RCwgMHg4NCwKKyAgICAweDkwLCAweEQ4LCAweEFCLCAweDAwLCAweDhDLCAweEJDLCAweEQzLCAweDBBLAorICAgIDB4RjcsIDB4RTQsIDB4NTgsIDB4MDUsIDB4QjgsIDB4QjMsIDB4NDUsIDB4MDYsCisgICAgMHhEMCwgMHgyQywgMHgxRSwgMHg4RiwgMHhDQSwgMHgzRiwgMHgwRiwgMHgwMiwKKyAgICAweEMxLCAweEFGLCAweEJELCAweDAzLCAweDAxLCAweDEzLCAweDhBLCAweDZCLAorICAgIDB4M0EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NEYsIDB4NjcsIDB4REMsIDB4RUEsCisgICAgMHg5NywgMHhGMiwgMHhDRiwgMHhDRSwgMHhGMCwgMHhCNCwgMHhFNiwgMHg3MywKKyAgICAweDk2LCAweEFDLCAweDc0LCAweDIyLCAweEU3LCAweEFELCAweDM1LCAweDg1LAorICAgIDB4RTIsIDB4RjksIDB4MzcsIDB4RTgsIDB4MUMsIDB4NzUsIDB4REYsIDB4NkUsCisgICAgMHg0NywgMHhGMSwgMHgxQSwgMHg3MSwgMHgxRCwgMHgyOSwgMHhDNSwgMHg4OSwKKyAgICAweDZGLCAweEI3LCAweDYyLCAweDBFLCAweEFBLCAweDE4LCAweEJFLCAweDFCLAorICAgIDB4RkMsIDB4NTYsIDB4M0UsIDB4NEIsIDB4QzYsIDB4RDIsIDB4NzksIDB4MjAsCisgICAgMHg5QSwgMHhEQiwgMHhDMCwgMHhGRSwgMHg3OCwgMHhDRCwgMHg1QSwgMHhGNCwKKyAgICAweDFGLCAweERELCAweEE4LCAweDMzLCAweDg4LCAweDA3LCAweEM3LCAweDMxLAorICAgIDB4QjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4RUMsIDB4NUYsCisgICAgMHg2MCwgMHg1MSwgMHg3RiwgMHhBOSwgMHgxOSwgMHhCNSwgMHg0QSwgMHgwRCwKKyAgICAweDJELCAweEU1LCAweDdBLCAweDlGLCAweDkzLCAweEM5LCAweDlDLCAweEVGLAorICAgIDB4QTAsIDB4RTAsIDB4M0IsIDB4NEQsIDB4QUUsIDB4MkEsIDB4RjUsIDB4QjAsCisgICAgMHhDOCwgMHhFQiwgMHhCQiwgMHgzQywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSwKKyAgICAweDE3LCAweDJCLCAweDA0LCAweDdFLCAweEJBLCAweDc3LCAweEQ2LCAweDI2LAorICAgIDB4RTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MEMsIDB4N0QKK307CisKKy8qCisgKiBSZXZlcnNlIHRhYmxlcworICovCisjZGVmaW5lIFJUIFwKK1wKKyAgICBWKDUwLEE3LEY0LDUxKSwgVig1Myw2NSw0MSw3RSksIFYoQzMsQTQsMTcsMUEpLCBWKDk2LDVFLDI3LDNBKSwgXAorICAgIFYoQ0IsNkIsQUIsM0IpLCBWKEYxLDQ1LDlELDFGKSwgVihBQiw1OCxGQSxBQyksIFYoOTMsMDMsRTMsNEIpLCBcCisgICAgVig1NSxGQSwzMCwyMCksIFYoRjYsNkQsNzYsQUQpLCBWKDkxLDc2LENDLDg4KSwgVigyNSw0QywwMixGNSksIFwKKyAgICBWKEZDLEQ3LEU1LDRGKSwgVihENyxDQiwyQSxDNSksIFYoODAsNDQsMzUsMjYpLCBWKDhGLEEzLDYyLEI1KSwgXAorICAgIFYoNDksNUEsQjEsREUpLCBWKDY3LDFCLEJBLDI1KSwgVig5OCwwRSxFQSw0NSksIFYoRTEsQzAsRkUsNUQpLCBcCisgICAgVigwMiw3NSwyRixDMyksIFYoMTIsRjAsNEMsODEpLCBWKEEzLDk3LDQ2LDhEKSwgVihDNixGOSxEMyw2QiksIFwKKyAgICBWKEU3LDVGLDhGLDAzKSwgVig5NSw5Qyw5MiwxNSksIFYoRUIsN0EsNkQsQkYpLCBWKERBLDU5LDUyLDk1KSwgXAorICAgIFYoMkQsODMsQkUsRDQpLCBWKEQzLDIxLDc0LDU4KSwgVigyOSw2OSxFMCw0OSksIFYoNDQsQzgsQzksOEUpLCBcCisgICAgVig2QSw4OSxDMiw3NSksIFYoNzgsNzksOEUsRjQpLCBWKDZCLDNFLDU4LDk5KSwgVihERCw3MSxCOSwyNyksIFwKKyAgICBWKEI2LDRGLEUxLEJFKSwgVigxNyxBRCw4OCxGMCksIFYoNjYsQUMsMjAsQzkpLCBWKEI0LDNBLENFLDdEKSwgXAorICAgIFYoMTgsNEEsREYsNjMpLCBWKDgyLDMxLDFBLEU1KSwgVig2MCwzMyw1MSw5NyksIFYoNDUsN0YsNTMsNjIpLCBcCisgICAgVihFMCw3Nyw2NCxCMSksIFYoODQsQUUsNkIsQkIpLCBWKDFDLEEwLDgxLEZFKSwgVig5NCwyQiwwOCxGOSksIFwKKyAgICBWKDU4LDY4LDQ4LDcwKSwgVigxOSxGRCw0NSw4RiksIFYoODcsNkMsREUsOTQpLCBWKEI3LEY4LDdCLDUyKSwgXAorICAgIFYoMjMsRDMsNzMsQUIpLCBWKEUyLDAyLDRCLDcyKSwgVig1Nyw4RiwxRixFMyksIFYoMkEsQUIsNTUsNjYpLCBcCisgICAgVigwNywyOCxFQixCMiksIFYoMDMsQzIsQjUsMkYpLCBWKDlBLDdCLEM1LDg2KSwgVihBNSwwOCwzNyxEMyksIFwKKyAgICBWKEYyLDg3LDI4LDMwKSwgVihCMixBNSxCRiwyMyksIFYoQkEsNkEsMDMsMDIpLCBWKDVDLDgyLDE2LEVEKSwgXAorICAgIFYoMkIsMUMsQ0YsOEEpLCBWKDkyLEI0LDc5LEE3KSwgVihGMCxGMiwwNyxGMyksIFYoQTEsRTIsNjksNEUpLCBcCisgICAgVihDRCxGNCxEQSw2NSksIFYoRDUsQkUsMDUsMDYpLCBWKDFGLDYyLDM0LEQxKSwgVig4QSxGRSxBNixDNCksIFwKKyAgICBWKDlELDUzLDJFLDM0KSwgVihBMCw1NSxGMyxBMiksIFYoMzIsRTEsOEEsMDUpLCBWKDc1LEVCLEY2LEE0KSwgXAorICAgIFYoMzksRUMsODMsMEIpLCBWKEFBLEVGLDYwLDQwKSwgVigwNiw5Riw3MSw1RSksIFYoNTEsMTAsNkUsQkQpLCBcCisgICAgVihGOSw4QSwyMSwzRSksIFYoM0QsMDYsREQsOTYpLCBWKEFFLDA1LDNFLEREKSwgVig0NixCRCxFNiw0RCksIFwKKyAgICBWKEI1LDhELDU0LDkxKSwgVigwNSw1RCxDNCw3MSksIFYoNkYsRDQsMDYsMDQpLCBWKEZGLDE1LDUwLDYwKSwgXAorICAgIFYoMjQsRkIsOTgsMTkpLCBWKDk3LEU5LEJELEQ2KSwgVihDQyw0Myw0MCw4OSksIFYoNzcsOUUsRDksNjcpLCBcCisgICAgVihCRCw0MixFOCxCMCksIFYoODgsOEIsODksMDcpLCBWKDM4LDVCLDE5LEU3KSwgVihEQixFRSxDOCw3OSksIFwKKyAgICBWKDQ3LDBBLDdDLEExKSwgVihFOSwwRiw0Miw3QyksIFYoQzksMUUsODQsRjgpLCBWKDAwLDAwLDAwLDAwKSwgXAorICAgIFYoODMsODYsODAsMDkpLCBWKDQ4LEVELDJCLDMyKSwgVihBQyw3MCwxMSwxRSksIFYoNEUsNzIsNUEsNkMpLCBcCisgICAgVihGQixGRiwwRSxGRCksIFYoNTYsMzgsODUsMEYpLCBWKDFFLEQ1LEFFLDNEKSwgVigyNywzOSwyRCwzNiksIFwKKyAgICBWKDY0LEQ5LDBGLDBBKSwgVigyMSxBNiw1Qyw2OCksIFYoRDEsNTQsNUIsOUIpLCBWKDNBLDJFLDM2LDI0KSwgXAorICAgIFYoQjEsNjcsMEEsMEMpLCBWKDBGLEU3LDU3LDkzKSwgVihEMiw5NixFRSxCNCksIFYoOUUsOTEsOUIsMUIpLCBcCisgICAgVig0RixDNSxDMCw4MCksIFYoQTIsMjAsREMsNjEpLCBWKDY5LDRCLDc3LDVBKSwgVigxNiwxQSwxMiwxQyksIFwKKyAgICBWKDBBLEJBLDkzLEUyKSwgVihFNSwyQSxBMCxDMCksIFYoNDMsRTAsMjIsM0MpLCBWKDFELDE3LDFCLDEyKSwgXAorICAgIFYoMEIsMEQsMDksMEUpLCBWKEFELEM3LDhCLEYyKSwgVihCOSxBOCxCNiwyRCksIFYoQzgsQTksMUUsMTQpLCBcCisgICAgVig4NSwxOSxGMSw1NyksIFYoNEMsMDcsNzUsQUYpLCBWKEJCLERELDk5LEVFKSwgVihGRCw2MCw3RixBMyksIFwKKyAgICBWKDlGLDI2LDAxLEY3KSwgVihCQyxGNSw3Miw1QyksIFYoQzUsM0IsNjYsNDQpLCBWKDM0LDdFLEZCLDVCKSwgXAorICAgIFYoNzYsMjksNDMsOEIpLCBWKERDLEM2LDIzLENCKSwgVig2OCxGQyxFRCxCNiksIFYoNjMsRjEsRTQsQjgpLCBcCisgICAgVihDQSxEQywzMSxENyksIFYoMTAsODUsNjMsNDIpLCBWKDQwLDIyLDk3LDEzKSwgVigyMCwxMSxDNiw4NCksIFwKKyAgICBWKDdELDI0LDRBLDg1KSwgVihGOCwzRCxCQixEMiksIFYoMTEsMzIsRjksQUUpLCBWKDZELEExLDI5LEM3KSwgXAorICAgIFYoNEIsMkYsOUUsMUQpLCBWKEYzLDMwLEIyLERDKSwgVihFQyw1Miw4NiwwRCksIFYoRDAsRTMsQzEsNzcpLCBcCisgICAgVig2QywxNixCMywyQiksIFYoOTksQjksNzAsQTkpLCBWKEZBLDQ4LDk0LDExKSwgVigyMiw2NCxFOSw0NyksIFwKKyAgICBWKEM0LDhDLEZDLEE4KSwgVigxQSwzRixGMCxBMCksIFYoRDgsMkMsN0QsNTYpLCBWKEVGLDkwLDMzLDIyKSwgXAorICAgIFYoQzcsNEUsNDksODcpLCBWKEMxLEQxLDM4LEQ5KSwgVihGRSxBMixDQSw4QyksIFYoMzYsMEIsRDQsOTgpLCBcCisgICAgVihDRiw4MSxGNSxBNiksIFYoMjgsREUsN0EsQTUpLCBWKDI2LDhFLEI3LERBKSwgVihBNCxCRixBRCwzRiksIFwKKyAgICBWKEU0LDlELDNBLDJDKSwgVigwRCw5Miw3OCw1MCksIFYoOUIsQ0MsNUYsNkEpLCBWKDYyLDQ2LDdFLDU0KSwgXAorICAgIFYoQzIsMTMsOEQsRjYpLCBWKEU4LEI4LEQ4LDkwKSwgVig1RSxGNywzOSwyRSksIFYoRjUsQUYsQzMsODIpLCBcCisgICAgVihCRSw4MCw1RCw5RiksIFYoN0MsOTMsRDAsNjkpLCBWKEE5LDJELEQ1LDZGKSwgVihCMywxMiwyNSxDRiksIFwKKyAgICBWKDNCLDk5LEFDLEM4KSwgVihBNyw3RCwxOCwxMCksIFYoNkUsNjMsOUMsRTgpLCBWKDdCLEJCLDNCLERCKSwgXAorICAgIFYoMDksNzgsMjYsQ0QpLCBWKEY0LDE4LDU5LDZFKSwgVigwMSxCNyw5QSxFQyksIFYoQTgsOUEsNEYsODMpLCBcCisgICAgVig2NSw2RSw5NSxFNiksIFYoN0UsRTYsRkYsQUEpLCBWKDA4LENGLEJDLDIxKSwgVihFNixFOCwxNSxFRiksIFwKKyAgICBWKEQ5LDlCLEU3LEJBKSwgVihDRSwzNiw2Riw0QSksIFYoRDQsMDksOUYsRUEpLCBWKEQ2LDdDLEIwLDI5KSwgXAorICAgIFYoQUYsQjIsQTQsMzEpLCBWKDMxLDIzLDNGLDJBKSwgVigzMCw5NCxBNSxDNiksIFYoQzAsNjYsQTIsMzUpLCBcCisgICAgVigzNyxCQyw0RSw3NCksIFYoQTYsQ0EsODIsRkMpLCBWKEIwLEQwLDkwLEUwKSwgVigxNSxEOCxBNywzMyksIFwKKyAgICBWKDRBLDk4LDA0LEYxKSwgVihGNyxEQSxFQyw0MSksIFYoMEUsNTAsQ0QsN0YpLCBWKDJGLEY2LDkxLDE3KSwgXAorICAgIFYoOEQsRDYsNEQsNzYpLCBWKDRELEIwLEVGLDQzKSwgVig1NCw0RCxBQSxDQyksIFYoREYsMDQsOTYsRTQpLCBcCisgICAgVihFMyxCNSxEMSw5RSksIFYoMUIsODgsNkEsNEMpLCBWKEI4LDFGLDJDLEMxKSwgVig3Riw1MSw2NSw0NiksIFwKKyAgICBWKDA0LEVBLDVFLDlEKSwgVig1RCwzNSw4QywwMSksIFYoNzMsNzQsODcsRkEpLCBWKDJFLDQxLDBCLEZCKSwgXAorICAgIFYoNUEsMUQsNjcsQjMpLCBWKDUyLEQyLERCLDkyKSwgVigzMyw1NiwxMCxFOSksIFYoMTMsNDcsRDYsNkQpLCBcCisgICAgVig4Qyw2MSxENyw5QSksIFYoN0EsMEMsQTEsMzcpLCBWKDhFLDE0LEY4LDU5KSwgVig4OSwzQywxMyxFQiksIFwKKyAgICBWKEVFLDI3LEE5LENFKSwgVigzNSxDOSw2MSxCNyksIFYoRUQsRTUsMUMsRTEpLCBWKDNDLEIxLDQ3LDdBKSwgXAorICAgIFYoNTksREYsRDIsOUMpLCBWKDNGLDczLEYyLDU1KSwgVig3OSxDRSwxNCwxOCksIFYoQkYsMzcsQzcsNzMpLCBcCisgICAgVihFQSxDRCxGNyw1MyksIFYoNUIsQUEsRkQsNUYpLCBWKDE0LDZGLDNELERGKSwgVig4NixEQiw0NCw3OCksIFwKKyAgICBWKDgxLEYzLEFGLENBKSwgVigzRSxDNCw2OCxCOSksIFYoMkMsMzQsMjQsMzgpLCBWKDVGLDQwLEEzLEMyKSwgXAorICAgIFYoNzIsQzMsMUQsMTYpLCBWKDBDLDI1LEUyLEJDKSwgVig4Qiw0OSwzQywyOCksIFYoNDEsOTUsMEQsRkYpLCBcCisgICAgVig3MSwwMSxBOCwzOSksIFYoREUsQjMsMEMsMDgpLCBWKDlDLEU0LEI0LEQ4KSwgVig5MCxDMSw1Niw2NCksIFwKKyAgICBWKDYxLDg0LENCLDdCKSwgVig3MCxCNiwzMixENSksIFYoNzQsNUMsNkMsNDgpLCBWKDQyLDU3LEI4LEQwKQorCisjZGVmaW5lIFYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIFJUMFsyNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBSVDFbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUgVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgUlQyWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lIFYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIFJUM1syNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI3VuZGVmIFJUCisKKy8qCisgKiBSb3VuZCBjb25zdGFudHMKKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgUkNPTlsxMF0gPQoreworICAgIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDgsCisgICAgMHgwMDAwMDAxMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA4MCwKKyAgICAweDAwMDAwMDFCLCAweDAwMDAwMDM2Cit9OworCisjZWxzZQorCisvKgorICogRm9yd2FyZCBTLWJveCAmIHRhYmxlcworICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBGU2JbMjU2XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEZUMFsyNTZdOyAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEZUMVsyNTZdOyAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEZUMlsyNTZdOyAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEZUM1syNTZdOyAKKworLyoKKyAqIFJldmVyc2UgUy1ib3ggJiB0YWJsZXMKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgUlNiWzI1Nl07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBSVDBbMjU2XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFJUMVsyNTZdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgUlQyWzI1Nl07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBSVDNbMjU2XTsKKworLyoKKyAqIFJvdW5kIGNvbnN0YW50cworICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBSQ09OWzEwXTsKKworLyoKKyAqIFRhYmxlcyBnZW5lcmF0aW9uIGNvZGUKKyAqLworI2RlZmluZSBST1RMOCh4KSAoICggeCA8PCA4ICkgJiAweEZGRkZGRkZGICkgfCAoIHggPj4gMjQgKQorI2RlZmluZSBYVElNRSh4KSAoICggeCA8PCAxICkgXiAoICggeCAmIDB4ODAgKSA/IDB4MUIgOiAweDAwICkgKQorI2RlZmluZSBNVUwoeCx5KSAoICggeCAmJiB5ICkgPyBwb3dbKGxvZ1t4XStsb2dbeV0pICUgMjU1XSA6IDAgKQorCitzdGF0aWMgaW50IGFlc19pbml0X2RvbmUgPSAwOworCitzdGF0aWMgdm9pZCBhZXNfZ2VuX3RhYmxlcyggdm9pZCApCit7CisgICAgaW50IGksIHgsIHksIHo7CisgICAgaW50IHBvd1syNTZdOworICAgIGludCBsb2dbMjU2XTsKKworICAgIC8qCisgICAgICogY29tcHV0ZSBwb3cgYW5kIGxvZyB0YWJsZXMgb3ZlciBHRigyXjgpCisgICAgICovCisgICAgZm9yKCBpID0gMCwgeCA9IDE7IGkgPCAyNTY7IGkrKyApCisgICAgeworICAgICAgICBwb3dbaV0gPSB4OworICAgICAgICBsb2dbeF0gPSBpOworICAgICAgICB4ID0gKCB4IF4gWFRJTUUoIHggKSApICYgMHhGRjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGNhbGN1bGF0ZSB0aGUgcm91bmQgY29uc3RhbnRzCisgICAgICovCisgICAgZm9yKCBpID0gMCwgeCA9IDE7IGkgPCAxMDsgaSsrICkKKyAgICB7CisgICAgICAgIFJDT05baV0gPSAodW5zaWduZWQgbG9uZykgeDsKKyAgICAgICAgeCA9IFhUSU1FKCB4ICkgJiAweEZGOworICAgIH0KKworICAgIC8qCisgICAgICogZ2VuZXJhdGUgdGhlIGZvcndhcmQgYW5kIHJldmVyc2UgUy1ib3hlcworICAgICAqLworICAgIEZTYlsweDAwXSA9IDB4NjM7CisgICAgUlNiWzB4NjNdID0gMHgwMDsKKworICAgIGZvciggaSA9IDE7IGkgPCAyNTY7IGkrKyApCisgICAgeworICAgICAgICB4ID0gcG93WzI1NSAtIGxvZ1tpXV07CisKKyAgICAgICAgeSAgPSB4OyB5ID0gKCAoeSA8PCAxKSB8ICh5ID4+IDcpICkgJiAweEZGOworICAgICAgICB4IF49IHk7IHkgPSAoICh5IDw8IDEpIHwgKHkgPj4gNykgKSAmIDB4RkY7CisgICAgICAgIHggXj0geTsgeSA9ICggKHkgPDwgMSkgfCAoeSA+PiA3KSApICYgMHhGRjsKKyAgICAgICAgeCBePSB5OyB5ID0gKCAoeSA8PCAxKSB8ICh5ID4+IDcpICkgJiAweEZGOworICAgICAgICB4IF49IHkgXiAweDYzOworCisgICAgICAgIEZTYltpXSA9ICh1bnNpZ25lZCBjaGFyKSB4OworICAgICAgICBSU2JbeF0gPSAodW5zaWduZWQgY2hhcikgaTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGdlbmVyYXRlIHRoZSBmb3J3YXJkIGFuZCByZXZlcnNlIHRhYmxlcworICAgICAqLworICAgIGZvciggaSA9IDA7IGkgPCAyNTY7IGkrKyApCisgICAgeworICAgICAgICB4ID0gRlNiW2ldOworICAgICAgICB5ID0gWFRJTUUoIHggKSAmIDB4RkY7CisgICAgICAgIHogPSAgKCB5IF4geCApICYgMHhGRjsKKworICAgICAgICBGVDBbaV0gPSAoICh1bnNpZ25lZCBsb25nKSB5ICAgICAgICkgXgorICAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSB4IDw8ICA4ICkgXgorICAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSB4IDw8IDE2ICkgXgorICAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSB6IDw8IDI0ICk7CisKKyAgICAgICAgRlQxW2ldID0gUk9UTDgoIEZUMFtpXSApOworICAgICAgICBGVDJbaV0gPSBST1RMOCggRlQxW2ldICk7CisgICAgICAgIEZUM1tpXSA9IFJPVEw4KCBGVDJbaV0gKTsKKworICAgICAgICB4ID0gUlNiW2ldOworCisgICAgICAgIFJUMFtpXSA9ICggKHVuc2lnbmVkIGxvbmcpIE1VTCggMHgwRSwgeCApICAgICAgICkgXgorICAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBNVUwoIDB4MDksIHggKSA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgTVVMKCAweDBELCB4ICkgPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIE1VTCggMHgwQiwgeCApIDw8IDI0ICk7CisKKyAgICAgICAgUlQxW2ldID0gUk9UTDgoIFJUMFtpXSApOworICAgICAgICBSVDJbaV0gPSBST1RMOCggUlQxW2ldICk7CisgICAgICAgIFJUM1tpXSA9IFJPVEw4KCBSVDJbaV0gKTsKKyAgICB9Cit9CisKKyNlbmRpZgorCisvKgorICogQUVTIGtleSBzY2hlZHVsZSAoZW5jcnlwdGlvbikKKyAqLwordm9pZCBhZXNfc2V0a2V5X2VuYyggYWVzX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5c2l6ZSApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgbG9uZyAqUks7CisKKyNpZiAhZGVmaW5lZChYWVNTTF9BRVNfUk9NX1RBQkxFUykKKyAgICBpZiggYWVzX2luaXRfZG9uZSA9PSAwICkKKyAgICB7CisgICAgICAgIGFlc19nZW5fdGFibGVzKCk7CisgICAgICAgIGFlc19pbml0X2RvbmUgPSAxOworICAgIH0KKyNlbmRpZgorCisgICAgc3dpdGNoKCBrZXlzaXplICkKKyAgICB7CisgICAgICAgIGNhc2UgMTI4OiBjdHgtPm5yID0gMTA7IGJyZWFrOworICAgICAgICBjYXNlIDE5MjogY3R4LT5uciA9IDEyOyBicmVhazsKKyAgICAgICAgY2FzZSAyNTY6IGN0eC0+bnIgPSAxNDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiByZXR1cm47CisgICAgfQorCisjaWYgZGVmaW5lZChQQURMT0NLX0FMSUdOMTYpCisgICAgY3R4LT5yayA9IFJLID0gUEFETE9DS19BTElHTjE2KCBjdHgtPmJ1ZiApOworI2Vsc2UKKyAgICBjdHgtPnJrID0gUksgPSBjdHgtPmJ1ZjsKKyNlbmRpZgorCisgICAgZm9yKCBpID0gMDsgaSA8IChrZXlzaXplID4+IDUpOyBpKysgKQorICAgIHsKKyAgICAgICAgR0VUX1VMT05HX0xFKCBSS1tpXSwga2V5LCBpIDw8IDIgKTsKKyAgICB9CisKKyAgICBzd2l0Y2goIGN0eC0+bnIgKQorICAgIHsKKyAgICAgICAgY2FzZSAxMDoKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDEwOyBpKyssIFJLICs9IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJLWzRdICA9IFJLWzBdIF4gUkNPTltpXSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFJLWzNdID4+ICA4ICkgJiAweEZGIF0gICAgICAgKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFJLWzNdID4+IDE2ICkgJiAweEZGIF0gPDwgIDggKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFJLWzNdID4+IDI0ICkgJiAweEZGIF0gPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFJLWzNdICAgICAgICkgJiAweEZGIF0gPDwgMjQgKTsKKworICAgICAgICAgICAgICAgIFJLWzVdICA9IFJLWzFdIF4gUktbNF07CisgICAgICAgICAgICAgICAgUktbNl0gID0gUktbMl0gXiBSS1s1XTsKKyAgICAgICAgICAgICAgICBSS1s3XSAgPSBSS1szXSBeIFJLWzZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMjoKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDg7IGkrKywgUksgKz0gNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggUktbNV0gPj4gIDggKSAmIDB4RkYgXSAgICAgICApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggUktbNV0gPj4gMTYgKSAmIDB4RkYgXSA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggUktbNV0gPj4gMjQgKSAmIDB4RkYgXSA8PCAxNiApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggUktbNV0gICAgICAgKSAmIDB4RkYgXSA8PCAyNCApOworCisgICAgICAgICAgICAgICAgUktbN10gID0gUktbMV0gXiBSS1s2XTsKKyAgICAgICAgICAgICAgICBSS1s4XSAgPSBSS1syXSBeIFJLWzddOworICAgICAgICAgICAgICAgIFJLWzldICA9IFJLWzNdIF4gUktbOF07CisgICAgICAgICAgICAgICAgUktbMTBdID0gUktbNF0gXiBSS1s5XTsKKyAgICAgICAgICAgICAgICBSS1sxMV0gPSBSS1s1XSBeIFJLWzEwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTQ6CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA3OyBpKyssIFJLICs9IDggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFJLWzddID4+ICA4ICkgJiAweEZGIF0gICAgICAgKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFJLWzddID4+IDE2ICkgJiAweEZGIF0gPDwgIDggKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFJLWzddID4+IDI0ICkgJiAweEZGIF0gPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFJLWzddICAgICAgICkgJiAweEZGIF0gPDwgMjQgKTsKKworICAgICAgICAgICAgICAgIFJLWzldICA9IFJLWzFdIF4gUktbOF07CisgICAgICAgICAgICAgICAgUktbMTBdID0gUktbMl0gXiBSS1s5XTsKKyAgICAgICAgICAgICAgICBSS1sxMV0gPSBSS1szXSBeIFJLWzEwXTsKKworICAgICAgICAgICAgICAgIFJLWzEyXSA9IFJLWzRdIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggUktbMTFdICAgICAgICkgJiAweEZGIF0gICAgICAgKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFJLWzExXSA+PiAgOCApICYgMHhGRiBdIDw8ICA4ICkgXgorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIEZTYlsgKCBSS1sxMV0gPj4gMTYgKSAmIDB4RkYgXSA8PCAxNiApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggUktbMTFdID4+IDI0ICkgJiAweEZGIF0gPDwgMjQgKTsKKworICAgICAgICAgICAgICAgIFJLWzEzXSA9IFJLWzVdIF4gUktbMTJdOworICAgICAgICAgICAgICAgIFJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOworICAgICAgICAgICAgICAgIFJLWzE1XSA9IFJLWzddIF4gUktbMTRdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKgorICogQUVTIGtleSBzY2hlZHVsZSAoZGVjcnlwdGlvbikKKyAqLwordm9pZCBhZXNfc2V0a2V5X2RlYyggYWVzX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5c2l6ZSApCit7CisgICAgaW50IGksIGo7CisgICAgYWVzX2NvbnRleHQgY3R5OworICAgIHVuc2lnbmVkIGxvbmcgKlJLOworICAgIHVuc2lnbmVkIGxvbmcgKlNLOworCisgICAgc3dpdGNoKCBrZXlzaXplICkKKyAgICB7CisgICAgICAgIGNhc2UgMTI4OiBjdHgtPm5yID0gMTA7IGJyZWFrOworICAgICAgICBjYXNlIDE5MjogY3R4LT5uciA9IDEyOyBicmVhazsKKyAgICAgICAgY2FzZSAyNTY6IGN0eC0+bnIgPSAxNDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiByZXR1cm47CisgICAgfQorCisjaWYgZGVmaW5lZChQQURMT0NLX0FMSUdOMTYpCisgICAgY3R4LT5yayA9IFJLID0gUEFETE9DS19BTElHTjE2KCBjdHgtPmJ1ZiApOworI2Vsc2UKKyAgICBjdHgtPnJrID0gUksgPSBjdHgtPmJ1ZjsKKyNlbmRpZgorCisgICAgYWVzX3NldGtleV9lbmMoICZjdHksIGtleSwga2V5c2l6ZSApOworICAgIFNLID0gY3R5LnJrICsgY3R5Lm5yICogNDsKKworICAgICpSSysrID0gKlNLKys7CisgICAgKlJLKysgPSAqU0srKzsKKyAgICAqUksrKyA9ICpTSysrOworICAgICpSSysrID0gKlNLKys7CisKKyAgICBmb3IoIGkgPSBjdHgtPm5yIC0gMSwgU0sgLT0gODsgaSA+IDA7IGktLSwgU0sgLT0gOCApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgNDsgaisrLCBTSysrICkKKyAgICAgICAgeworICAgICAgICAgICAgKlJLKysgPSBSVDBbIEZTYlsgKCAqU0sgICAgICAgKSAmIDB4RkYgXSBdIF4KKyAgICAgICAgICAgICAgICAgICAgUlQxWyBGU2JbICggKlNLID4+ICA4ICkgJiAweEZGIF0gXSBeCisgICAgICAgICAgICAgICAgICAgIFJUMlsgRlNiWyAoICpTSyA+PiAxNiApICYgMHhGRiBdIF0gXgorICAgICAgICAgICAgICAgICAgICBSVDNbIEZTYlsgKCAqU0sgPj4gMjQgKSAmIDB4RkYgXSBdOworICAgICAgICB9CisgICAgfQorCisgICAgKlJLKysgPSAqU0srKzsKKyAgICAqUksrKyA9ICpTSysrOworICAgICpSSysrID0gKlNLKys7CisgICAgKlJLKysgPSAqU0srKzsKKworICAgIG1lbXNldCggJmN0eSwgMCwgc2l6ZW9mKCBhZXNfY29udGV4dCApICk7Cit9CisKKyNkZWZpbmUgQUVTX0ZST1VORChYMCxYMSxYMixYMyxZMCxZMSxZMixZMykgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBYMCA9ICpSSysrIF4gRlQwWyAoIFkwICAgICAgICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQxWyAoIFkxID4+ICA4ICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQyWyAoIFkyID4+IDE2ICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQzWyAoIFkzID4+IDI0ICkgJiAweEZGIF07ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBYMSA9ICpSSysrIF4gRlQwWyAoIFkxICAgICAgICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQxWyAoIFkyID4+ICA4ICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQyWyAoIFkzID4+IDE2ICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQzWyAoIFkwID4+IDI0ICkgJiAweEZGIF07ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBYMiA9ICpSSysrIF4gRlQwWyAoIFkyICAgICAgICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQxWyAoIFkzID4+ICA4ICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQyWyAoIFkwID4+IDE2ICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQzWyAoIFkxID4+IDI0ICkgJiAweEZGIF07ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBYMyA9ICpSSysrIF4gRlQwWyAoIFkzICAgICAgICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQxWyAoIFkwID4+ICA4ICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQyWyAoIFkxID4+IDE2ICkgJiAweEZGIF0gXiAgIFwKKyAgICAgICAgICAgICAgICAgRlQzWyAoIFkyID4+IDI0ICkgJiAweEZGIF07ICAgIFwKK30KKworI2RlZmluZSBBRVNfUlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFgwID0gKlJLKysgXiBSVDBbICggWTAgICAgICAgKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDFbICggWTMgPj4gIDggKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDJbICggWTIgPj4gMTYgKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDNbICggWTEgPj4gMjQgKSAmIDB4RkYgXTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFgxID0gKlJLKysgXiBSVDBbICggWTEgICAgICAgKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDFbICggWTAgPj4gIDggKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDJbICggWTMgPj4gMTYgKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDNbICggWTIgPj4gMjQgKSAmIDB4RkYgXTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFgyID0gKlJLKysgXiBSVDBbICggWTIgICAgICAgKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDFbICggWTEgPj4gIDggKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDJbICggWTAgPj4gMTYgKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDNbICggWTMgPj4gMjQgKSAmIDB4RkYgXTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFgzID0gKlJLKysgXiBSVDBbICggWTMgICAgICAgKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDFbICggWTIgPj4gIDggKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDJbICggWTEgPj4gMTYgKSAmIDB4RkYgXSBeICAgXAorICAgICAgICAgICAgICAgICBSVDNbICggWTAgPj4gMjQgKSAmIDB4RkYgXTsgICAgXAorfQorCisvKgorICogQUVTLUVDQiBibG9jayBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAqLwordm9pZCBhZXNfY3J5cHRfZWNiKCBhZXNfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpbnB1dFsxNl0sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgbG9uZyAqUkssIFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMzsKKworI2lmIGRlZmluZWQoWFlTU0xfUEFETE9DS19DKSAmJiBkZWZpbmVkKFhZU1NMX0hBVkVfWDg2KQorICAgIGlmKCBwYWRsb2NrX3N1cHBvcnRzKCBQQURMT0NLX0FDRSApICkKKyAgICB7CisgICAgICAgIGlmKCBwYWRsb2NrX3hjcnlwdGVjYiggY3R4LCBtb2RlLCBpbnB1dCwgb3V0cHV0ICkgPT0gMCApCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICBSSyA9IGN0eC0+cms7CisKKyAgICBHRVRfVUxPTkdfTEUoIFgwLCBpbnB1dCwgIDAgKTsgWDAgXj0gKlJLKys7CisgICAgR0VUX1VMT05HX0xFKCBYMSwgaW5wdXQsICA0ICk7IFgxIF49ICpSSysrOworICAgIEdFVF9VTE9OR19MRSggWDIsIGlucHV0LCAgOCApOyBYMiBePSAqUksrKzsKKyAgICBHRVRfVUxPTkdfTEUoIFgzLCBpbnB1dCwgMTIgKTsgWDMgXj0gKlJLKys7CisKKyAgICBpZiggbW9kZSA9PSBBRVNfREVDUllQVCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAoY3R4LT5uciA+PiAxKSAtIDE7IGkgPiAwOyBpLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBBRVNfUlJPVU5EKCBZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMgKTsKKyAgICAgICAgICAgIEFFU19SUk9VTkQoIFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyApOworICAgICAgICB9CisKKyAgICAgICAgQUVTX1JST1VORCggWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzICk7CisKKyAgICAgICAgWDAgPSAqUksrKyBeIFwKKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBSU2JbICggWTAgICAgICAgKSAmIDB4RkYgXSAgICAgICApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBSU2JbICggWTMgPj4gIDggKSAmIDB4RkYgXSA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBSU2JbICggWTIgPj4gMTYgKSAmIDB4RkYgXSA8PCAxNiApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBSU2JbICggWTEgPj4gMjQgKSAmIDB4RkYgXSA8PCAyNCApOworCisgICAgICAgIFgxID0gKlJLKysgXiBcCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgUlNiWyAoIFkxICAgICAgICkgJiAweEZGIF0gICAgICAgKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgUlNiWyAoIFkwID4+ICA4ICkgJiAweEZGIF0gPDwgIDggKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgUlNiWyAoIFkzID4+IDE2ICkgJiAweEZGIF0gPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgUlNiWyAoIFkyID4+IDI0ICkgJiAweEZGIF0gPDwgMjQgKTsKKworICAgICAgICBYMiA9ICpSSysrIF4gXAorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIFJTYlsgKCBZMiAgICAgICApICYgMHhGRiBdICAgICAgICkgXgorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIFJTYlsgKCBZMSA+PiAgOCApICYgMHhGRiBdIDw8ICA4ICkgXgorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIFJTYlsgKCBZMCA+PiAxNiApICYgMHhGRiBdIDw8IDE2ICkgXgorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIFJTYlsgKCBZMyA+PiAyNCApICYgMHhGRiBdIDw8IDI0ICk7CisKKyAgICAgICAgWDMgPSAqUksrKyBeIFwKKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBSU2JbICggWTMgICAgICAgKSAmIDB4RkYgXSAgICAgICApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBSU2JbICggWTIgPj4gIDggKSAmIDB4RkYgXSA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBSU2JbICggWTEgPj4gMTYgKSAmIDB4RkYgXSA8PCAxNiApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBSU2JbICggWTAgPj4gMjQgKSAmIDB4RkYgXSA8PCAyNCApOworICAgIH0KKyAgICBlbHNlIC8qIEFFU19FTkNSWVBUICovCisgICAgeworICAgICAgICBmb3IoIGkgPSAoY3R4LT5uciA+PiAxKSAtIDE7IGkgPiAwOyBpLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBBRVNfRlJPVU5EKCBZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMgKTsKKyAgICAgICAgICAgIEFFU19GUk9VTkQoIFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyApOworICAgICAgICB9CisKKyAgICAgICAgQUVTX0ZST1VORCggWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzICk7CisKKyAgICAgICAgWDAgPSAqUksrKyBeIFwKKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggWTAgICAgICAgKSAmIDB4RkYgXSAgICAgICApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggWTEgPj4gIDggKSAmIDB4RkYgXSA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggWTIgPj4gMTYgKSAmIDB4RkYgXSA8PCAxNiApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggWTMgPj4gMjQgKSAmIDB4RkYgXSA8PCAyNCApOworCisgICAgICAgIFgxID0gKlJLKysgXiBcCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFkxICAgICAgICkgJiAweEZGIF0gICAgICAgKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFkyID4+ICA4ICkgJiAweEZGIF0gPDwgIDggKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFkzID4+IDE2ICkgJiAweEZGIF0gPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgRlNiWyAoIFkwID4+IDI0ICkgJiAweEZGIF0gPDwgMjQgKTsKKworICAgICAgICBYMiA9ICpSSysrIF4gXAorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIEZTYlsgKCBZMiAgICAgICApICYgMHhGRiBdICAgICAgICkgXgorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIEZTYlsgKCBZMyA+PiAgOCApICYgMHhGRiBdIDw8ICA4ICkgXgorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIEZTYlsgKCBZMCA+PiAxNiApICYgMHhGRiBdIDw8IDE2ICkgXgorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIEZTYlsgKCBZMSA+PiAyNCApICYgMHhGRiBdIDw8IDI0ICk7CisKKyAgICAgICAgWDMgPSAqUksrKyBeIFwKKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggWTMgICAgICAgKSAmIDB4RkYgXSAgICAgICApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggWTAgPj4gIDggKSAmIDB4RkYgXSA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggWTEgPj4gMTYgKSAmIDB4RkYgXSA8PCAxNiApIF4KKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBGU2JbICggWTIgPj4gMjQgKSAmIDB4RkYgXSA8PCAyNCApOworICAgIH0KKworICAgIFBVVF9VTE9OR19MRSggWDAsIG91dHB1dCwgIDAgKTsKKyAgICBQVVRfVUxPTkdfTEUoIFgxLCBvdXRwdXQsICA0ICk7CisgICAgUFVUX1VMT05HX0xFKCBYMiwgb3V0cHV0LCAgOCApOworICAgIFBVVF9VTE9OR19MRSggWDMsIG91dHB1dCwgMTIgKTsKK30KKworLyoKKyAqIEFFUy1DQkMgYnVmZmVyIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICovCit2b2lkIGFlc19jcnlwdF9jYmMoIGFlc19jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGl2WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciB0ZW1wWzE2XTsKKworI2lmIGRlZmluZWQoWFlTU0xfUEFETE9DS19DKSAmJiBkZWZpbmVkKFhZU1NMX0hBVkVfWDg2KQorICAgIGlmKCBwYWRsb2NrX3N1cHBvcnRzKCBQQURMT0NLX0FDRSApICkKKyAgICB7CisgICAgICAgIGlmKCBwYWRsb2NrX3hjcnlwdGNiYyggY3R4LCBtb2RlLCBsZW5ndGgsIGl2LCBpbnB1dCwgb3V0cHV0ICkgPT0gMCApCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggbW9kZSA9PSBBRVNfREVDUllQVCApCisgICAgeworICAgICAgICB3aGlsZSggbGVuZ3RoID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweSggdGVtcCwgaW5wdXQsIDE2ICk7CisgICAgICAgICAgICBhZXNfY3J5cHRfZWNiKCBjdHgsIG1vZGUsIGlucHV0LCBvdXRwdXQgKTsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDE2OyBpKysgKQorICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9ICh1bnNpZ25lZCBjaGFyKSggb3V0cHV0W2ldIF4gaXZbaV0gKTsKKworICAgICAgICAgICAgbWVtY3B5KCBpdiwgdGVtcCwgMTYgKTsKKworICAgICAgICAgICAgaW5wdXQgICs9IDE2OworICAgICAgICAgICAgb3V0cHV0ICs9IDE2OworICAgICAgICAgICAgbGVuZ3RoIC09IDE2OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdoaWxlKCBsZW5ndGggPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDE2OyBpKysgKQorICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9ICh1bnNpZ25lZCBjaGFyKSggaW5wdXRbaV0gXiBpdltpXSApOworCisgICAgICAgICAgICBhZXNfY3J5cHRfZWNiKCBjdHgsIG1vZGUsIG91dHB1dCwgb3V0cHV0ICk7CisgICAgICAgICAgICBtZW1jcHkoIGl2LCBvdXRwdXQsIDE2ICk7CisKKyAgICAgICAgICAgIGlucHV0ICArPSAxNjsKKyAgICAgICAgICAgIG91dHB1dCArPSAxNjsKKyAgICAgICAgICAgIGxlbmd0aCAtPSAxNjsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIEFFUy1DRkIxMjggYnVmZmVyIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICovCit2b2lkIGFlc19jcnlwdF9jZmIxMjgoIGFlc19jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKml2X29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpdlsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXQgKQoreworICAgIGludCBjLCBuID0gKml2X29mZjsKKworICAgIGlmKCBtb2RlID09IEFFU19ERUNSWVBUICkKKyAgICB7CisgICAgICAgIHdoaWxlKCBsZW5ndGgtLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBuID09IDAgKQorICAgICAgICAgICAgICAgIGFlc19jcnlwdF9lY2IoIGN0eCwgQUVTX0VOQ1JZUFQsIGl2LCBpdiApOworCisgICAgICAgICAgICBjID0gKmlucHV0Kys7CisgICAgICAgICAgICAqb3V0cHV0KysgPSAodW5zaWduZWQgY2hhcikoIGMgXiBpdltuXSApOworICAgICAgICAgICAgaXZbbl0gPSAodW5zaWduZWQgY2hhcikgYzsKKworICAgICAgICAgICAgbiA9IChuICsgMSkgJiAweDBGOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdoaWxlKCBsZW5ndGgtLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBuID09IDAgKQorICAgICAgICAgICAgICAgIGFlc19jcnlwdF9lY2IoIGN0eCwgQUVTX0VOQ1JZUFQsIGl2LCBpdiApOworCisgICAgICAgICAgICBpdltuXSA9ICpvdXRwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKSggaXZbbl0gXiAqaW5wdXQrKyApOworCisgICAgICAgICAgICBuID0gKG4gKyAxKSAmIDB4MEY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqaXZfb2ZmID0gbjsKK30KKworI2lmIGRlZmluZWQoWFlTU0xfU0VMRl9URVNUKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIEFFUyB0ZXN0IHZlY3RvcnMgZnJvbToKKyAqCisgKiBodHRwOi8vY3NyYy5uaXN0Lmdvdi9hcmNoaXZlL2Flcy9yaWpuZGFlbC9yaWpuZGFlbC12YWxzLnppcAorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhZXNfdGVzdF9lY2JfZGVjWzNdWzE2XSA9Cit7CisgICAgeyAweDQ0LCAweDQxLCAweDZBLCAweEMyLCAweEQxLCAweEY1LCAweDNDLCAweDU4LAorICAgICAgMHgzMywgMHgwMywgMHg5MSwgMHg3RSwgMHg2QiwgMHhFOSwgMHhFQiwgMHhFMCB9LAorICAgIHsgMHg0OCwgMHhFMywgMHgxRSwgMHg5RSwgMHgyNSwgMHg2NywgMHgxOCwgMHhGMiwKKyAgICAgIDB4OTIsIDB4MjksIDB4MzEsIDB4OUMsIDB4MTksIDB4RjEsIDB4NUIsIDB4QTQgfSwKKyAgICB7IDB4MDUsIDB4OEMsIDB4Q0YsIDB4RkQsIDB4QkIsIDB4Q0IsIDB4MzgsIDB4MkQsCisgICAgICAweDFGLCAweDZGLCAweDU2LCAweDU4LCAweDVELCAweDhBLCAweDRBLCAweERFIH0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFlc190ZXN0X2VjYl9lbmNbM11bMTZdID0KK3sKKyAgICB7IDB4QzMsIDB4NEMsIDB4MDUsIDB4MkMsIDB4QzAsIDB4REEsIDB4OEQsIDB4NzMsCisgICAgICAweDQ1LCAweDFBLCAweEZFLCAweDVGLCAweDAzLCAweEJFLCAweDI5LCAweDdGIH0sCisgICAgeyAweEYzLCAweEY2LCAweDc1LCAweDJBLCAweEU4LCAweEQ3LCAweDgzLCAweDExLAorICAgICAgMHgzOCwgMHhGMCwgMHg0MSwgMHg1NiwgMHgwNiwgMHgzMSwgMHhCMSwgMHgxNCB9LAorICAgIHsgMHg4QiwgMHg3OSwgMHhFRSwgMHhDQywgMHg5MywgMHhBMCwgMHhFRSwgMHg1RCwKKyAgICAgIDB4RkYsIDB4MzAsIDB4QjQsIDB4RUEsIDB4MjEsIDB4NjMsIDB4NkQsIDB4QTQgfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWVzX3Rlc3RfY2JjX2RlY1szXVsxNl0gPQoreworICAgIHsgMHhGQSwgMHhDQSwgMHgzNywgMHhFMCwgMHhCMCwgMHhDOCwgMHg1MywgMHg3MywKKyAgICAgIDB4REYsIDB4NzAsIDB4NkUsIDB4NzMsIDB4RjcsIDB4QzksIDB4QUYsIDB4ODYgfSwKKyAgICB7IDB4NUQsIDB4RjYsIDB4NzgsIDB4REQsIDB4MTcsIDB4QkEsIDB4NEUsIDB4NzUsCisgICAgICAweEI2LCAweDE3LCAweDY4LCAweEM2LCAweEFELCAweEVGLCAweDdDLCAweDdCIH0sCisgICAgeyAweDQ4LCAweDA0LCAweEUxLCAweDgxLCAweDhGLCAweEU2LCAweDI5LCAweDc1LAorICAgICAgMHgxOSwgMHhBMywgMHhFOCwgMHg4QywgMHg1NywgMHgzMSwgMHgwNCwgMHgxMyB9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhZXNfdGVzdF9jYmNfZW5jWzNdWzE2XSA9Cit7CisgICAgeyAweDhBLCAweDA1LCAweEZDLCAweDVFLCAweDA5LCAweDVBLCAweEY0LCAweDg0LAorICAgICAgMHg4QSwgMHgwOCwgMHhEMywgMHgyOCwgMHhEMywgMHg2OCwgMHg4RSwgMHgzRCB9LAorICAgIHsgMHg3QiwgMHhEOSwgMHg2NiwgMHhENSwgMHgzQSwgMHhEOCwgMHhDMSwgMHhCQiwKKyAgICAgIDB4ODUsIDB4RDIsIDB4QUQsIDB4RkEsIDB4RTgsIDB4N0IsIDB4QjEsIDB4MDQgfSwKKyAgICB7IDB4RkUsIDB4M0MsIDB4NTMsIDB4NjUsIDB4M0UsIDB4MkYsIDB4NDUsIDB4QjUsCisgICAgICAweDZGLCAweENELCAweDg4LCAweEIyLCAweENDLCAweDg5LCAweDhGLCAweEYwIH0KK307CisKKy8qCisgKiBBRVMtQ0ZCMTI4IHRlc3QgdmVjdG9ycyBmcm9tOgorICoKKyAqIGh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9uaXN0cHVicy84MDAtMzhhL3NwODAwLTM4YS5wZGYKKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWVzX3Rlc3RfY2ZiMTI4X2tleVszXVszMl0gPQoreworICAgIHsgMHgyQiwgMHg3RSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhBRSwgMHhEMiwgMHhBNiwKKyAgICAgIDB4QUIsIDB4RjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Q0YsIDB4NEYsIDB4M0MgfSwKKyAgICB7IDB4OEUsIDB4NzMsIDB4QjAsIDB4RjcsIDB4REEsIDB4MEUsIDB4NjQsIDB4NTIsCisgICAgICAweEM4LCAweDEwLCAweEYzLCAweDJCLCAweDgwLCAweDkwLCAweDc5LCAweEU1LAorICAgICAgMHg2MiwgMHhGOCwgMHhFQSwgMHhEMiwgMHg1MiwgMHgyQywgMHg2QiwgMHg3QiB9LAorICAgIHsgMHg2MCwgMHgzRCwgMHhFQiwgMHgxMCwgMHgxNSwgMHhDQSwgMHg3MSwgMHhCRSwKKyAgICAgIDB4MkIsIDB4NzMsIDB4QUUsIDB4RjAsIDB4ODUsIDB4N0QsIDB4NzcsIDB4ODEsCisgICAgICAweDFGLCAweDM1LCAweDJDLCAweDA3LCAweDNCLCAweDYxLCAweDA4LCAweEQ3LAorICAgICAgMHgyRCwgMHg5OCwgMHgxMCwgMHhBMywgMHgwOSwgMHgxNCwgMHhERiwgMHhGNCB9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhZXNfdGVzdF9jZmIxMjhfaXZbMTZdID0KK3sKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFlc190ZXN0X2NmYjEyOF9wdFs2NF0gPQoreworICAgIDB4NkIsIDB4QzEsIDB4QkUsIDB4RTIsIDB4MkUsIDB4NDAsIDB4OUYsIDB4OTYsCisgICAgMHhFOSwgMHgzRCwgMHg3RSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyQSwKKyAgICAweEFFLCAweDJELCAweDhBLCAweDU3LCAweDFFLCAweDAzLCAweEFDLCAweDlDLAorICAgIDB4OUUsIDB4QjcsIDB4NkYsIDB4QUMsIDB4NDUsIDB4QUYsIDB4OEUsIDB4NTEsCisgICAgMHgzMCwgMHhDOCwgMHgxQywgMHg0NiwgMHhBMywgMHg1QywgMHhFNCwgMHgxMSwKKyAgICAweEU1LCAweEZCLCAweEMxLCAweDE5LCAweDFBLCAweDBBLCAweDUyLCAweEVGLAorICAgIDB4RjYsIDB4OUYsIDB4MjQsIDB4NDUsIDB4REYsIDB4NEYsIDB4OUIsIDB4MTcsCisgICAgMHhBRCwgMHgyQiwgMHg0MSwgMHg3QiwgMHhFNiwgMHg2QywgMHgzNywgMHgxMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWVzX3Rlc3RfY2ZiMTI4X2N0WzNdWzY0XSA9Cit7CisgICAgeyAweDNCLCAweDNGLCAweEQ5LCAweDJFLCAweEI3LCAweDJELCAweEFELCAweDIwLAorICAgICAgMHgzMywgMHgzNCwgMHg0OSwgMHhGOCwgMHhFOCwgMHgzQywgMHhGQiwgMHg0QSwKKyAgICAgIDB4QzgsIDB4QTYsIDB4NDUsIDB4MzcsIDB4QTAsIDB4QjMsIDB4QTksIDB4M0YsCisgICAgICAweENELCAweEUzLCAweENELCAweEFELCAweDlGLCAweDFDLCAweEU1LCAweDhCLAorICAgICAgMHgyNiwgMHg3NSwgMHgxRiwgMHg2NywgMHhBMywgMHhDQiwgMHhCMSwgMHg0MCwKKyAgICAgIDB4QjEsIDB4ODAsIDB4OEMsIDB4RjEsIDB4ODcsIDB4QTQsIDB4RjQsIDB4REYsCisgICAgICAweEMwLCAweDRCLCAweDA1LCAweDM1LCAweDdDLCAweDVELCAweDFDLCAweDBFLAorICAgICAgMHhFQSwgMHhDNCwgMHhDNiwgMHg2RiwgMHg5RiwgMHhGNywgMHhGMiwgMHhFNiB9LAorICAgIHsgMHhDRCwgMHhDOCwgMHgwRCwgMHg2RiwgMHhERCwgMHhGMSwgMHg4QywgMHhBQiwKKyAgICAgIDB4MzQsIDB4QzIsIDB4NTksIDB4MDksIDB4QzksIDB4OUEsIDB4NDEsIDB4NzQsCisgICAgICAweDY3LCAweENFLCAweDdGLCAweDdGLCAweDgxLCAweDE3LCAweDM2LCAweDIxLAorICAgICAgMHg5NiwgMHgxQSwgMHgyQiwgMHg3MCwgMHgxNywgMHgxRCwgMHgzRCwgMHg3QSwKKyAgICAgIDB4MkUsIDB4MUUsIDB4OEEsIDB4MUQsIDB4RDUsIDB4OUIsIDB4ODgsIDB4QjEsCisgICAgICAweEM4LCAweEU2LCAweDBGLCAweEVELCAweDFFLCAweEZBLCAweEM0LCAweEM5LAorICAgICAgMHhDMCwgMHg1RiwgMHg5RiwgMHg5QywgMHhBOSwgMHg4MywgMHg0RiwgMHhBMCwKKyAgICAgIDB4NDIsIDB4QUUsIDB4OEYsIDB4QkEsIDB4NTgsIDB4NEIsIDB4MDksIDB4RkYgfSwKKyAgICB7IDB4REMsIDB4N0UsIDB4ODQsIDB4QkYsIDB4REEsIDB4NzksIDB4MTYsIDB4NEIsCisgICAgICAweDdFLCAweENELCAweDg0LCAweDg2LCAweDk4LCAweDVELCAweDM4LCAweDYwLAorICAgICAgMHgzOSwgMHhGRiwgMHhFRCwgMHgxNCwgMHgzQiwgMHgyOCwgMHhCMSwgMHhDOCwKKyAgICAgIDB4MzIsIDB4MTEsIDB4M0MsIDB4NjMsIDB4MzEsIDB4RTUsIDB4NDAsIDB4N0IsCisgICAgICAweERGLCAweDEwLCAweDEzLCAweDI0LCAweDE1LCAweEU1LCAweDRCLCAweDkyLAorICAgICAgMHhBMSwgMHgzRSwgMHhEMCwgMHhBOCwgMHgyNiwgMHg3QSwgMHhFMiwgMHhGOSwKKyAgICAgIDB4NzUsIDB4QTMsIDB4ODUsIDB4NzQsIDB4MUEsIDB4QjksIDB4Q0UsIDB4RjgsCisgICAgICAweDIwLCAweDMxLCAweDYyLCAweDNELCAweDU1LCAweEIxLCAweEU0LCAweDcxIH0KK307CisKKy8qCisgKiBDaGVja3VwIHJvdXRpbmUKKyAqLworaW50IGFlc19zZWxmX3Rlc3QoIGludCB2ZXJib3NlICkKK3sKKyAgICBpbnQgaSwgaiwgdSwgdiwgb2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIga2V5WzMyXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF07CisgICAgdW5zaWduZWQgY2hhciBwcnZbMTZdOworICAgIHVuc2lnbmVkIGNoYXIgaXZbMTZdOworICAgIGFlc19jb250ZXh0IGN0eDsKKworICAgIG1lbXNldCgga2V5LCAwLCAzMiApOworCisgICAgLyoKKyAgICAgKiBFQ0IgbW9kZQorICAgICAqLworICAgIGZvciggaSA9IDA7IGkgPCA2OyBpKysgKQorICAgIHsKKyAgICAgICAgdSA9IGkgPj4gMTsKKyAgICAgICAgdiA9IGkgICYgMTsKKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggIiAgQUVTLUVDQi0lM2QgKCVzKTogIiwgMTI4ICsgdSAqIDY0LAorICAgICAgICAgICAgICAgICAgICAoIHYgPT0gQUVTX0RFQ1JZUFQgKSA/ICJkZWMiIDogImVuYyIgKTsKKworICAgICAgICBtZW1zZXQoIGJ1ZiwgMCwgMTYgKTsKKworICAgICAgICBpZiggdiA9PSBBRVNfREVDUllQVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFlc19zZXRrZXlfZGVjKCAmY3R4LCBrZXksIDEyOCArIHUgKiA2NCApOworCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgMTAwMDA7IGorKyApCisgICAgICAgICAgICAgICAgYWVzX2NyeXB0X2VjYiggJmN0eCwgdiwgYnVmLCBidWYgKTsKKworICAgICAgICAgICAgaWYoIG1lbWNtcCggYnVmLCBhZXNfdGVzdF9lY2JfZGVjW3VdLCAxNiApICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoICJmYWlsZWRcbiIgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiggMSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYWVzX3NldGtleV9lbmMoICZjdHgsIGtleSwgMTI4ICsgdSAqIDY0ICk7CisKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAxMDAwMDsgaisrICkKKyAgICAgICAgICAgICAgICBhZXNfY3J5cHRfZWNiKCAmY3R4LCB2LCBidWYsIGJ1ZiApOworCisgICAgICAgICAgICBpZiggbWVtY21wKCBidWYsIGFlc190ZXN0X2VjYl9lbmNbdV0sIDE2ICkgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICAgICAgcmV0dXJuKCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggInBhc3NlZFxuIiApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJcbiIgKTsKKworICAgIC8qCisgICAgICogQ0JDIG1vZGUKKyAgICAgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgNjsgaSsrICkKKyAgICB7CisgICAgICAgIHUgPSBpID4+IDE7CisgICAgICAgIHYgPSBpICAmIDE7CisKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICIgIEFFUy1DQkMtJTNkICglcyk6ICIsIDEyOCArIHUgKiA2NCwKKyAgICAgICAgICAgICAgICAgICAgKCB2ID09IEFFU19ERUNSWVBUICkgPyAiZGVjIiA6ICJlbmMiICk7CisKKyAgICAgICAgbWVtc2V0KCBpdiAsIDAsIDE2ICk7CisgICAgICAgIG1lbXNldCggcHJ2LCAwLCAxNiApOworICAgICAgICBtZW1zZXQoIGJ1ZiwgMCwgMTYgKTsKKworICAgICAgICBpZiggdiA9PSBBRVNfREVDUllQVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFlc19zZXRrZXlfZGVjKCAmY3R4LCBrZXksIDEyOCArIHUgKiA2NCApOworCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgMTAwMDA7IGorKyApCisgICAgICAgICAgICAgICAgYWVzX2NyeXB0X2NiYyggJmN0eCwgdiwgMTYsIGl2LCBidWYsIGJ1ZiApOworCisgICAgICAgICAgICBpZiggbWVtY21wKCBidWYsIGFlc190ZXN0X2NiY19kZWNbdV0sIDE2ICkgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICAgICAgcmV0dXJuKCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhZXNfc2V0a2V5X2VuYyggJmN0eCwga2V5LCAxMjggKyB1ICogNjQgKTsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDEwMDAwOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdG1wWzE2XTsKKworICAgICAgICAgICAgICAgIGFlc19jcnlwdF9jYmMoICZjdHgsIHYsIDE2LCBpdiwgYnVmLCBidWYgKTsKKworICAgICAgICAgICAgICAgIG1lbWNweSggdG1wLCBwcnYsIDE2ICk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCBwcnYsIGJ1ZiwgMTYgKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoIGJ1ZiwgdG1wLCAxNiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggbWVtY21wKCBwcnYsIGFlc190ZXN0X2NiY19lbmNbdV0sIDE2ICkgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICAgICAgcmV0dXJuKCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggInBhc3NlZFxuIiApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJcbiIgKTsKKworICAgIC8qCisgICAgICogQ0ZCMTI4IG1vZGUKKyAgICAgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgNjsgaSsrICkKKyAgICB7CisgICAgICAgIHUgPSBpID4+IDE7CisgICAgICAgIHYgPSBpICAmIDE7CisKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICIgIEFFUy1DRkIxMjgtJTNkICglcyk6ICIsIDEyOCArIHUgKiA2NCwKKyAgICAgICAgICAgICAgICAgICAgKCB2ID09IEFFU19ERUNSWVBUICkgPyAiZGVjIiA6ICJlbmMiICk7CisKKyAgICAgICAgbWVtY3B5KCBpdiwgIGFlc190ZXN0X2NmYjEyOF9pdiwgMTYgKTsKKyAgICAgICAgbWVtY3B5KCBrZXksIGFlc190ZXN0X2NmYjEyOF9rZXlbdV0sIDE2ICsgdSAqIDggKTsKKworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICBhZXNfc2V0a2V5X2VuYyggJmN0eCwga2V5LCAxMjggKyB1ICogNjQgKTsKKworICAgICAgICBpZiggdiA9PSBBRVNfREVDUllQVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweSggYnVmLCBhZXNfdGVzdF9jZmIxMjhfY3RbdV0sIDY0ICk7CisgICAgICAgICAgICBhZXNfY3J5cHRfY2ZiMTI4KCAmY3R4LCB2LCA2NCwgJm9mZnNldCwgaXYsIGJ1ZiwgYnVmICk7CisKKyAgICAgICAgICAgIGlmKCBtZW1jbXAoIGJ1ZiwgYWVzX3Rlc3RfY2ZiMTI4X3B0LCA2NCApICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoICJmYWlsZWRcbiIgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiggMSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCBidWYsIGFlc190ZXN0X2NmYjEyOF9wdCwgNjQgKTsKKyAgICAgICAgICAgIGFlc19jcnlwdF9jZmIxMjgoICZjdHgsIHYsIDY0LCAmb2Zmc2V0LCBpdiwgYnVmLCBidWYgKTsKKworICAgICAgICAgICAgaWYoIG1lbWNtcCggYnVmLCBhZXNfdGVzdF9jZmIxMjhfY3RbdV0sIDY0ICkgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICAgICAgcmV0dXJuKCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggInBhc3NlZFxuIiApOworICAgIH0KKworCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIlxuIiApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnJhcnkvYXJjNC5jIGIvbGlicmFyeS9hcmM0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNmMwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnJhcnkvYXJjNC5jCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUkNGT1VSIGFsZ29yaXRobQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKy8qCisgKiAgVGhlIEFSQ0ZPVVIgYWxnb3JpdGhtIHdhcyBwdWJsaWNseSBkaXNjbG9zZWQgb24gOTQvMDkuCisgKgorICogIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9zY2kuY3J5cHQvbXNnLzEwYTMwMGM5ZDIxYWZjYTAKKyAqLworCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFhZU1NMX0FSQzRfQykKKworI2luY2x1ZGUgInh5c3NsL2FyYzQuaCIKKworLyoKKyAqIEFSQzQga2V5IHNjaGVkdWxlCisgKi8KK3ZvaWQgYXJjNF9zZXR1cCggYXJjNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiApCit7CisgICAgaW50IGksIGosIGssIGE7CisgICAgdW5zaWduZWQgY2hhciAqbTsKKworICAgIGN0eC0+eCA9IDA7CisgICAgY3R4LT55ID0gMDsKKyAgICBtID0gY3R4LT5tOworCisgICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrICkKKyAgICAgICAgbVtpXSA9ICh1bnNpZ25lZCBjaGFyKSBpOworCisgICAgaiA9IGsgPSAwOworCisgICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrLCBrKysgKQorICAgIHsKKyAgICAgICAgaWYoIGsgPj0ga2V5bGVuICkgayA9IDA7CisKKyAgICAgICAgYSA9IG1baV07CisgICAgICAgIGogPSAoIGogKyBhICsga2V5W2tdICkgJiAweEZGOworICAgICAgICBtW2ldID0gbVtqXTsKKyAgICAgICAgbVtqXSA9ICh1bnNpZ25lZCBjaGFyKSBhOworICAgIH0KK30KKworLyoKKyAqIEFSQzQgY2lwaGVyIGZ1bmN0aW9uCisgKi8KK3ZvaWQgYXJjNF9jcnlwdCggYXJjNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiApCit7CisgICAgaW50IGksIHgsIHksIGEsIGI7CisgICAgdW5zaWduZWQgY2hhciAqbTsKKworICAgIHggPSBjdHgtPng7CisgICAgeSA9IGN0eC0+eTsKKyAgICBtID0gY3R4LT5tOworCisgICAgZm9yKCBpID0gMDsgaSA8IGJ1ZmxlbjsgaSsrICkKKyAgICB7CisgICAgICAgIHggPSAoIHggKyAxICkgJiAweEZGOyBhID0gbVt4XTsKKyAgICAgICAgeSA9ICggeSArIGEgKSAmIDB4RkY7IGIgPSBtW3ldOworCisgICAgICAgIG1beF0gPSAodW5zaWduZWQgY2hhcikgYjsKKyAgICAgICAgbVt5XSA9ICh1bnNpZ25lZCBjaGFyKSBhOworCisgICAgICAgIGJ1ZltpXSA9ICh1bnNpZ25lZCBjaGFyKQorICAgICAgICAgICAgKCBidWZbaV0gXiBtWyh1bnNpZ25lZCBjaGFyKSggYSArIGIgKV0gKTsKKyAgICB9CisKKyAgICBjdHgtPnggPSB4OworICAgIGN0eC0+eSA9IHk7Cit9CisKKyNpZiBkZWZpbmVkKFhZU1NMX1NFTEZfVEVTVCkKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiBBUkM0IHRlc3RzIHZlY3RvcnMgYXMgcG9zdGVkIGJ5IEVyaWMgUmVzY29ybGEgaW4gc2VwLiAxOTk0OgorICoKKyAqIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9jb21wLnNlY3VyaXR5Lm1pc2MvbXNnLzEwYTMwMGM5ZDIxYWZjYTAKKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXJjNF90ZXN0X2tleVszXVs4XSA9Cit7CisgICAgeyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGIH0sCisgICAgeyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGIH0sCisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFyYzRfdGVzdF9wdFszXVs4XSA9Cit7CisgICAgeyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGIH0sCisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFyYzRfdGVzdF9jdFszXVs4XSA9Cit7CisgICAgeyAweDc1LCAweEI3LCAweDg3LCAweDgwLCAweDk5LCAweEUwLCAweEM1LCAweDk2IH0sCisgICAgeyAweDc0LCAweDk0LCAweEMyLCAweEU3LCAweDEwLCAweDRCLCAweDA4LCAweDc5IH0sCisgICAgeyAweERFLCAweDE4LCAweDg5LCAweDQxLCAweEEzLCAweDM3LCAweDVELCAweDNBIH0KK307CisKKy8qCisgKiBDaGVja3VwIHJvdXRpbmUKKyAqLworaW50IGFyYzRfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBidWZbOF07CisgICAgYXJjNF9jb250ZXh0IGN0eDsKKworICAgIGZvciggaSA9IDA7IGkgPCAzOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICIgIEFSQzQgdGVzdCAjJWQ6ICIsIGkgKyAxICk7CisKKyAgICAgICAgbWVtY3B5KCBidWYsIGFyYzRfdGVzdF9wdFtpXSwgOCApOworCisgICAgICAgIGFyYzRfc2V0dXAoICZjdHgsICh1bnNpZ25lZCBjaGFyICopIGFyYzRfdGVzdF9rZXlbaV0sIDggKTsKKyAgICAgICAgYXJjNF9jcnlwdCggJmN0eCwgYnVmLCA4ICk7CisKKyAgICAgICAgaWYoIG1lbWNtcCggYnVmLCBhcmM0X3Rlc3RfY3RbaV0sIDggKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiZmFpbGVkXG4iICk7CisKKyAgICAgICAgICAgIHJldHVybiggMSApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICJwYXNzZWRcbiIgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAiXG4iICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicmFyeS9iYXNlNjQuYyBiL2xpYnJhcnkvYmFzZTY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2YzAyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnJhcnkvYmFzZTY0LmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiAgUkZDIDE1MjEgYmFzZTY0IGVuY29kaW5nL2RlY29kaW5nCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFhZU1NMX0JBU0U2NF9DKQorCisjaW5jbHVkZSAieHlzc2wvYmFzZTY0LmgiCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGJhc2U2NF9lbmNfbWFwWzY0XSA9Cit7CisgICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLAorICAgICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywKKyAgICAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYScsICdiJywgJ2MnLCAnZCcsCisgICAgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLAorICAgICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywKKyAgICAneScsICd6JywgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCisgICAgJzgnLCAnOScsICcrJywgJy8nCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiYXNlNjRfZGVjX21hcFsxMjhdID0KK3sKKyAgICAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsCisgICAgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LAorICAgIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywKKyAgICAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsCisgICAgMTI3LCAxMjcsIDEyNywgIDYyLCAxMjcsIDEyNywgMTI3LCAgNjMsICA1MiwgIDUzLAorICAgICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAxMjcsIDEyNywKKyAgICAxMjcsICA2NCwgMTI3LCAxMjcsIDEyNywgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsCisgICAgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LAorICAgICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwKKyAgICAgMjUsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsICAyNiwgIDI3LCAgMjgsCisgICAgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LAorICAgICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsICA0OCwKKyAgICAgNDksICA1MCwgIDUxLCAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNworfTsKKworLyoKKyAqIEVuY29kZSBhIGJ1ZmZlciBpbnRvIGJhc2U2NCBmb3JtYXQKKyAqLworaW50IGJhc2U2NF9lbmNvZGUoIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50ICpkbGVuLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50ICBzbGVuICkKK3sKKyAgICBpbnQgaSwgbjsKKyAgICBpbnQgQzEsIEMyLCBDMzsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworCisgICAgaWYoIHNsZW4gPT0gMCApCisgICAgICAgIHJldHVybiggMCApOworCisgICAgbiA9IChzbGVuIDw8IDMpIC8gNjsKKworICAgIHN3aXRjaCggKHNsZW4gPDwgMykgLSAobiAqIDYpICkKKyAgICB7CisgICAgICAgIGNhc2UgIDI6IG4gKz0gMzsgYnJlYWs7CisgICAgICAgIGNhc2UgIDQ6IG4gKz0gMjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIGlmKCAqZGxlbiA8IG4gKyAxICkKKyAgICB7CisgICAgICAgICpkbGVuID0gbiArIDE7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0JBU0U2NF9CVUZGRVJfVE9PX1NNQUxMICk7CisgICAgfQorCisgICAgbiA9IChzbGVuIC8gMykgKiAzOworCisgICAgZm9yKCBpID0gMCwgcCA9IGRzdDsgaSA8IG47IGkgKz0gMyApCisgICAgeworICAgICAgICBDMSA9ICpzcmMrKzsKKyAgICAgICAgQzIgPSAqc3JjKys7CisgICAgICAgIEMzID0gKnNyYysrOworCisgICAgICAgICpwKysgPSBiYXNlNjRfZW5jX21hcFsoQzEgPj4gMikgJiAweDNGXTsKKyAgICAgICAgKnArKyA9IGJhc2U2NF9lbmNfbWFwWygoKEMxICYgIDMpIDw8IDQpICsgKEMyID4+IDQpKSAmIDB4M0ZdOworICAgICAgICAqcCsrID0gYmFzZTY0X2VuY19tYXBbKCgoQzIgJiAxNSkgPDwgMikgKyAoQzMgPj4gNikpICYgMHgzRl07CisgICAgICAgICpwKysgPSBiYXNlNjRfZW5jX21hcFtDMyAmIDB4M0ZdOworICAgIH0KKworICAgIGlmKCBpIDwgc2xlbiApCisgICAgeworICAgICAgICBDMSA9ICpzcmMrKzsKKyAgICAgICAgQzIgPSAoKGkgKyAxKSA8IHNsZW4pID8gKnNyYysrIDogMDsKKworICAgICAgICAqcCsrID0gYmFzZTY0X2VuY19tYXBbKEMxID4+IDIpICYgMHgzRl07CisgICAgICAgICpwKysgPSBiYXNlNjRfZW5jX21hcFsoKChDMSAmIDMpIDw8IDQpICsgKEMyID4+IDQpKSAmIDB4M0ZdOworCisgICAgICAgIGlmKCAoaSArIDEpIDwgc2xlbiApCisgICAgICAgICAgICAgKnArKyA9IGJhc2U2NF9lbmNfbWFwWygoQzIgJiAxNSkgPDwgMikgJiAweDNGXTsKKyAgICAgICAgZWxzZSAqcCsrID0gJz0nOworCisgICAgICAgICpwKysgPSAnPSc7CisgICAgfQorCisgICAgKmRsZW4gPSBwIC0gZHN0OworICAgICpwID0gMDsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogRGVjb2RlIGEgYmFzZTY0LWZvcm1hdHRlZCBidWZmZXIKKyAqLworaW50IGJhc2U2NF9kZWNvZGUoIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50ICpkbGVuLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50ICBzbGVuICkKK3sKKyAgICBpbnQgaSwgaiwgbjsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgdW5zaWduZWQgY2hhciAqcDsKKworICAgIGZvciggaSA9IGogPSBuID0gMDsgaSA8IHNsZW47IGkrKyApCisgICAgeworICAgICAgICBpZiggKCBzbGVuIC0gaSApID49IDIgJiYKKyAgICAgICAgICAgIHNyY1tpXSA9PSAnXHInICYmIHNyY1tpICsgMV0gPT0gJ1xuJyApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggc3JjW2ldID09ICdcbicgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoIHNyY1tpXSA9PSAnPScgJiYgKytqID4gMiApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9CQVNFNjRfSU5WQUxJRF9DSEFSQUNURVIgKTsKKworICAgICAgICBpZiggc3JjW2ldID4gMTI3IHx8IGJhc2U2NF9kZWNfbWFwW3NyY1tpXV0gPT0gMTI3ICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0JBU0U2NF9JTlZBTElEX0NIQVJBQ1RFUiApOworCisgICAgICAgIGlmKCBiYXNlNjRfZGVjX21hcFtzcmNbaV1dIDwgNjQgJiYgaiAhPSAwICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0JBU0U2NF9JTlZBTElEX0NIQVJBQ1RFUiApOworCisgICAgICAgIG4rKzsKKyAgICB9CisKKyAgICBpZiggbiA9PSAwICkKKyAgICAgICAgcmV0dXJuKCAwICk7CisKKyAgICBuID0gKChuICogNikgKyA3KSA+PiAzOworCisgICAgaWYoICpkbGVuIDwgbiApCisgICAgeworICAgICAgICAqZGxlbiA9IG47CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0JBU0U2NF9CVUZGRVJfVE9PX1NNQUxMICk7CisgICAgfQorCisgICBmb3IoIGogPSAzLCBuID0geCA9IDAsIHAgPSBkc3Q7IGkgPiAwOyBpLS0sIHNyYysrICkKKyAgIHsKKyAgICAgICAgaWYoICpzcmMgPT0gJ1xyJyB8fCAqc3JjID09ICdcbicgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaiAtPSAoIGJhc2U2NF9kZWNfbWFwWypzcmNdID09IDY0ICk7CisgICAgICAgIHggID0gKHggPDwgNikgfCAoIGJhc2U2NF9kZWNfbWFwWypzcmNdICYgMHgzRiApOworCisgICAgICAgIGlmKCArK24gPT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgaWYoIGogPiAwICkgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggeCA+PiAxNiApOworICAgICAgICAgICAgaWYoIGogPiAxICkgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggeCA+PiAgOCApOworICAgICAgICAgICAgaWYoIGogPiAyICkgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggeCAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgKmRsZW4gPSBwIC0gZHN0OworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKyNpZiBkZWZpbmVkKFhZU1NMX1NFTEZfVEVTVCkKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGJhc2U2NF90ZXN0X2RlY1s2NF0gPQoreworICAgIDB4MjQsIDB4NDgsIDB4NkUsIDB4NTYsIDB4ODcsIDB4NjIsIDB4NUEsIDB4QkQsCisgICAgMHhCRiwgMHgxNywgMHhEOSwgMHhBMiwgMHhDNCwgMHgxNywgMHgxQSwgMHgwMSwKKyAgICAweDk0LCAweEVELCAweDhGLCAweDFFLCAweDExLCAweEIzLCAweEQ3LCAweDA5LAorICAgIDB4MEMsIDB4QjYsIDB4RTksIDB4MTAsIDB4NkYsIDB4MjIsIDB4RUUsIDB4MTMsCisgICAgMHhDQSwgMHhCMywgMHgwNywgMHgwNSwgMHg3NiwgMHhDOSwgMHhGQSwgMHgzMSwKKyAgICAweDZDLCAweDA4LCAweDM0LCAweEZGLCAweDhELCAweEMyLCAweDZDLCAweDM4LAorICAgIDB4MDAsIDB4NDMsIDB4RTksIDB4NTQsIDB4OTcsIDB4QUYsIDB4NTAsIDB4NEIsCisgICAgMHhEMSwgMHg0MSwgMHhCQSwgMHg5NSwgMHgzMSwgMHg1QSwgMHgwQiwgMHg5NworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYmFzZTY0X3Rlc3RfZW5jW10gPQorICAgICJKRWh1Vm9kaVdyMi9GOW1peEJjYUFaVHRqeDRSczljSkRMYnBFRzhpN2hQSyIKKyAgICAic3djRmRzbjZNV3dJTlArTndtdzRBRVBwVkpldlVFdlJRYnFWTVZvTGx3PT0iOworCisvKgorICogQ2hlY2t1cCByb3V0aW5lCisgKi8KK2ludCBiYXNlNjRfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApCit7CisgICAgaW50IGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpzcmMsIGJ1ZmZlclsxMjhdOworCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIiAgQmFzZTY0IGVuY29kaW5nIHRlc3Q6ICIgKTsKKworICAgIGxlbiA9IHNpemVvZiggYnVmZmVyICk7CisgICAgc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgYmFzZTY0X3Rlc3RfZGVjOworCisgICAgaWYoIGJhc2U2NF9lbmNvZGUoIGJ1ZmZlciwgJmxlbiwgc3JjLCA2NCApICE9IDAgfHwKKyAgICAgICAgIG1lbWNtcCggYmFzZTY0X3Rlc3RfZW5jLCBidWZmZXIsIDg4ICkgIT0gMCApIAorICAgIHsKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICJmYWlsZWRcbiIgKTsKKworICAgICAgICByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4gIEJhc2U2NCBkZWNvZGluZyB0ZXN0OiAiICk7CisKKyAgICBsZW4gPSBzaXplb2YoIGJ1ZmZlciApOworICAgIHNyYyA9ICh1bnNpZ25lZCBjaGFyICopIGJhc2U2NF90ZXN0X2VuYzsKKworICAgIGlmKCBiYXNlNjRfZGVjb2RlKCBidWZmZXIsICZsZW4sIHNyYywgODggKSAhPSAwIHx8CisgICAgICAgICBtZW1jbXAoIGJhc2U2NF90ZXN0X2RlYywgYnVmZmVyLCA2NCApICE9IDAgKQorICAgIHsKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICJmYWlsZWRcbiIgKTsKKworICAgICAgICByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAicGFzc2VkXG5cbiIgKTsKKworICAgIHJldHVybiggMCApOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJyYXJ5L2JpZ251bS5jIGIvbGlicmFyeS9iaWdudW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjVmYzRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicmFyeS9iaWdudW0uYwpAQCAtMCwwICsxLDE5NTUgQEAKKy8qCisgKiAgTXVsdGktcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKy8qCisgKiAgVGhpcyBNUEkgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb246CisgKgorICogIGh0dHA6Ly93d3cuY2Fjci5tYXRoLnV3YXRlcmxvby5jYS9oYWMvYWJvdXQvY2hhcDE0LnBkZgorICogIGh0dHA6Ly93d3cuc3RpbGxocS5jb20vZXh0cmFjdGVkL2dudXBnLWFwaS9tcGkvCisgKiAgaHR0cDovL21hdGgubGlidG9tY3J5cHQuY29tL2ZpbGVzL3RvbW1hdGgucGRmCisgKi8KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChYWVNTTF9CSUdOVU1fQykKKworI2luY2x1ZGUgInh5c3NsL2JpZ251bS5oIgorI2luY2x1ZGUgInh5c3NsL2JuX211bC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNkZWZpbmUgY2lMICAgICgoaW50KSBzaXplb2YodF9pbnQpKSAgICAvKiBjaGFycyBpbiBsaW1iICAqLworI2RlZmluZSBiaUwgICAgKGNpTCA8PCAzKSAgICAgICAgICAgICAgIC8qIGJpdHMgIGluIGxpbWIgICovCisjZGVmaW5lIGJpSCAgICAoY2lMIDw8IDIpICAgICAgICAgICAgICAgLyogaGFsZiBsaW1iIHNpemUgKi8KKworLyoKKyAqIENvbnZlcnQgYmV0d2VlbiBiaXRzL2NoYXJzIGFuZCBudW1iZXIgb2YgbGltYnMKKyAqLworI2RlZmluZSBCSVRTX1RPX0xJTUJTKGkpICAoKChpKSArIGJpTCAtIDEpIC8gYmlMKQorI2RlZmluZSBDSEFSU19UT19MSU1CUyhpKSAoKChpKSArIGNpTCAtIDEpIC8gY2lMKQorCisvKgorICogSW5pdGlhbGl6ZSBvbmUgb3IgbW9yZSBtcGkKKyAqLwordm9pZCBtcGlfaW5pdCggbXBpICpYLCAuLi4gKQoreworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KCBhcmdzLCBYICk7CisKKyAgICB3aGlsZSggWCAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIFgtPnMgPSAxOworICAgICAgICBYLT5uID0gMDsKKyAgICAgICAgWC0+cCA9IE5VTEw7CisKKyAgICAgICAgWCA9IHZhX2FyZyggYXJncywgbXBpKiApOworICAgIH0KKworICAgIHZhX2VuZCggYXJncyApOworfQorCisvKgorICogVW5hbGxvY2F0ZSBvbmUgb3IgbW9yZSBtcGkKKyAqLwordm9pZCBtcGlfZnJlZSggbXBpICpYLCAuLi4gKQoreworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KCBhcmdzLCBYICk7CisKKyAgICB3aGlsZSggWCAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIGlmKCBYLT5wICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoIFgtPnAsIDAsIFgtPm4gKiBjaUwgKTsKKyAgICAgICAgICAgIGZyZWUoIFgtPnAgKTsKKyAgICAgICAgfQorCisgICAgICAgIFgtPnMgPSAxOworICAgICAgICBYLT5uID0gMDsKKyAgICAgICAgWC0+cCA9IE5VTEw7CisKKyAgICAgICAgWCA9IHZhX2FyZyggYXJncywgbXBpKiApOworICAgIH0KKworICAgIHZhX2VuZCggYXJncyApOworfQorCisvKgorICogRW5sYXJnZSB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBsaW1icworICovCitpbnQgbXBpX2dyb3coIG1waSAqWCwgaW50IG5ibGltYnMgKQoreworICAgIHRfaW50ICpwOworCisgICAgaWYoIFgtPm4gPCBuYmxpbWJzICkKKyAgICB7CisgICAgICAgIGlmKCAoIHAgPSAodF9pbnQgKikgbWFsbG9jKCBuYmxpbWJzICogY2lMICkgKSA9PSBOVUxMICkKKyAgICAgICAgICAgIHJldHVybiggMSApOworCisgICAgICAgIG1lbXNldCggcCwgMCwgbmJsaW1icyAqIGNpTCApOworCisgICAgICAgIGlmKCBYLT5wICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoIHAsIFgtPnAsIFgtPm4gKiBjaUwgKTsKKyAgICAgICAgICAgIG1lbXNldCggWC0+cCwgMCwgWC0+biAqIGNpTCApOworICAgICAgICAgICAgZnJlZSggWC0+cCApOworICAgICAgICB9CisKKyAgICAgICAgWC0+biA9IG5ibGltYnM7CisgICAgICAgIFgtPnAgPSBwOworICAgIH0KKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogQ29weSB0aGUgY29udGVudHMgb2YgWSBpbnRvIFgKKyAqLworaW50IG1waV9jb3B5KCBtcGkgKlgsIG1waSAqWSApCit7CisgICAgaW50IHJldCwgaTsKKworICAgIGlmKCBYID09IFkgKQorICAgICAgICByZXR1cm4oIDAgKTsKKworICAgIGZvciggaSA9IFktPm4gLSAxOyBpID4gMDsgaS0tICkKKyAgICAgICAgaWYoIFktPnBbaV0gIT0gMCApCisgICAgICAgICAgICBicmVhazsKKyAgICBpKys7CisKKyAgICBYLT5zID0gWS0+czsKKworICAgIE1QSV9DSEsoIG1waV9ncm93KCBYLCBpICkgKTsKKworICAgIG1lbXNldCggWC0+cCwgMCwgWC0+biAqIGNpTCApOworICAgIG1lbWNweSggWC0+cCwgWS0+cCwgaSAqIGNpTCApOworCitjbGVhbnVwOgorCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworLyoKKyAqIFN3YXAgdGhlIGNvbnRlbnRzIG9mIFggYW5kIFkKKyAqLwordm9pZCBtcGlfc3dhcCggbXBpICpYLCBtcGkgKlkgKQoreworICAgIG1waSBUOworCisgICAgbWVtY3B5KCAmVCwgIFgsIHNpemVvZiggbXBpICkgKTsKKyAgICBtZW1jcHkoICBYLCAgWSwgc2l6ZW9mKCBtcGkgKSApOworICAgIG1lbWNweSggIFksICZULCBzaXplb2YoIG1waSApICk7Cit9CisKKy8qCisgKiBTZXQgdmFsdWUgZnJvbSBpbnRlZ2VyCisgKi8KK2ludCBtcGlfbHNldCggbXBpICpYLCBpbnQgeiApCit7CisgICAgaW50IHJldDsKKworICAgIE1QSV9DSEsoIG1waV9ncm93KCBYLCAxICkgKTsKKyAgICBtZW1zZXQoIFgtPnAsIDAsIFgtPm4gKiBjaUwgKTsKKworICAgIFgtPnBbMF0gPSAoIHogPCAwICkgPyAteiA6IHo7CisgICAgWC0+cyAgICA9ICggeiA8IDAgKSA/IC0xIDogMTsKKworY2xlYW51cDoKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsZWFzdCBzaWduaWZpY2FudCBiaXRzCisgKi8KK2ludCBtcGlfbHNiKCBtcGkgKlggKQoreworICAgIGludCBpLCBqLCBjb3VudCA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgWC0+bjsgaSsrICkKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IChpbnQpIGJpTDsgaisrLCBjb3VudCsrICkKKyAgICAgICAgICAgIGlmKCAoICggWC0+cFtpXSA+PiBqICkgJiAxICkgIT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuKCBjb3VudCApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtb3N0IHNpZ25pZmljYW50IGJpdHMKKyAqLworaW50IG1waV9tc2IoIG1waSAqWCApCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IoIGkgPSBYLT5uIC0gMTsgaSA+IDA7IGktLSApCisgICAgICAgIGlmKCBYLT5wW2ldICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBmb3IoIGogPSBiaUwgLSAxOyBqID49IDA7IGotLSApCisgICAgICAgIGlmKCAoICggWC0+cFtpXSA+PiBqICkgJiAxICkgIT0gMCApCisgICAgICAgICAgICBicmVhazsKKworICAgIHJldHVybiggKCBpICogYmlMICkgKyBqICsgMSApOworfQorCisvKgorICogUmV0dXJuIHRoZSB0b3RhbCBzaXplIGluIGJ5dGVzCisgKi8KK2ludCBtcGlfc2l6ZSggbXBpICpYICkKK3sKKyAgICByZXR1cm4oICggbXBpX21zYiggWCApICsgNyApID4+IDMgKTsKK30KKworLyoKKyAqIENvbnZlcnQgYW4gQVNDSUkgY2hhcmFjdGVyIHRvIGRpZ2l0IHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgbXBpX2dldF9kaWdpdCggdF9pbnQgKmQsIGludCByYWRpeCwgY2hhciBjICkKK3sKKyAgICAqZCA9IDI1NTsKKworICAgIGlmKCBjID49IDB4MzAgJiYgYyA8PSAweDM5ICkgKmQgPSBjIC0gMHgzMDsKKyAgICBpZiggYyA+PSAweDQxICYmIGMgPD0gMHg0NiApICpkID0gYyAtIDB4Mzc7CisgICAgaWYoIGMgPj0gMHg2MSAmJiBjIDw9IDB4NjYgKSAqZCA9IGMgLSAweDU3OworCisgICAgaWYoICpkID49ICh0X2ludCkgcmFkaXggKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfSU5WQUxJRF9DSEFSQUNURVIgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogSW1wb3J0IGZyb20gYW4gQVNDSUkgc3RyaW5nCisgKi8KK2ludCBtcGlfcmVhZF9zdHJpbmcoIG1waSAqWCwgaW50IHJhZGl4LCBjaGFyICpzICkKK3sKKyAgICBpbnQgcmV0LCBpLCBqLCBuOworICAgIHRfaW50IGQ7CisgICAgbXBpIFQ7CisKKyAgICBpZiggcmFkaXggPCAyIHx8IHJhZGl4ID4gMTYgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfQkFEX0lOUFVUX0RBVEEgKTsKKworICAgIG1waV9pbml0KCAmVCwgTlVMTCApOworCisgICAgaWYoIHJhZGl4ID09IDE2ICkKKyAgICB7CisgICAgICAgIG4gPSBCSVRTX1RPX0xJTUJTKCBzdHJsZW4oIHMgKSA8PCAyICk7CisKKyAgICAgICAgTVBJX0NISyggbXBpX2dyb3coIFgsIG4gKSApOworICAgICAgICBNUElfQ0hLKCBtcGlfbHNldCggWCwgMCApICk7CisKKyAgICAgICAgZm9yKCBpID0gc3RybGVuKCBzICkgLSAxLCBqID0gMDsgaSA+PSAwOyBpLS0sIGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpID09IDAgJiYgc1tpXSA9PSAnLScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFgtPnMgPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTVBJX0NISyggbXBpX2dldF9kaWdpdCggJmQsIHJhZGl4LCBzW2ldICkgKTsKKyAgICAgICAgICAgIFgtPnBbaiAvICgyICogY2lMKV0gfD0gZCA8PCAoIChqICUgKDIgKiBjaUwpKSA8PCAyICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTVBJX0NISyggbXBpX2xzZXQoIFgsIDAgKSApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCAoaW50KSBzdHJsZW4oIHMgKTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGkgPT0gMCAmJiBzW2ldID09ICctJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWC0+cyA9IC0xOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfZ2V0X2RpZ2l0KCAmZCwgcmFkaXgsIHNbaV0gKSApOworICAgICAgICAgICAgTVBJX0NISyggbXBpX211bF9pbnQoICZULCBYLCByYWRpeCApICk7CisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfYWRkX2ludCggWCwgJlQsIGQgKSApOworICAgICAgICB9CisgICAgfQorCitjbGVhbnVwOgorCisgICAgbXBpX2ZyZWUoICZULCBOVUxMICk7CisKKyAgICByZXR1cm4oIHJldCApOworfQorCisvKgorICogSGVscGVyIHRvIHdyaXRlIHRoZSBkaWdpdHMgaGlnaC1vcmRlciBmaXJzdAorICovCitzdGF0aWMgaW50IG1waV93cml0ZV9obHAoIG1waSAqWCwgaW50IHJhZGl4LCBjaGFyICoqcCApCit7CisgICAgaW50IHJldDsKKyAgICB0X2ludCByOworCisgICAgaWYoIHJhZGl4IDwgMiB8fCByYWRpeCA+IDE2ICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfTVBJX0JBRF9JTlBVVF9EQVRBICk7CisKKyAgICBNUElfQ0hLKCBtcGlfbW9kX2ludCggJnIsIFgsIHJhZGl4ICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfZGl2X2ludCggWCwgTlVMTCwgWCwgcmFkaXggKSApOworCisgICAgaWYoIG1waV9jbXBfaW50KCBYLCAwICkgIT0gMCApCisgICAgICAgIE1QSV9DSEsoIG1waV93cml0ZV9obHAoIFgsIHJhZGl4LCBwICkgKTsKKworICAgIGlmKCByIDwgMTAgKQorICAgICAgICAqKCpwKSsrID0gKGNoYXIpKCByICsgMHgzMCApOworICAgIGVsc2UKKyAgICAgICAgKigqcCkrKyA9IChjaGFyKSggciArIDB4MzcgKTsKKworY2xlYW51cDoKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKy8qCisgKiBFeHBvcnQgaW50byBhbiBBU0NJSSBzdHJpbmcKKyAqLworaW50IG1waV93cml0ZV9zdHJpbmcoIG1waSAqWCwgaW50IHJhZGl4LCBjaGFyICpzLCBpbnQgKnNsZW4gKQoreworICAgIGludCByZXQgPSAwLCBuOworICAgIGNoYXIgKnA7CisgICAgbXBpIFQ7CisKKyAgICBpZiggcmFkaXggPCAyIHx8IHJhZGl4ID4gMTYgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfQkFEX0lOUFVUX0RBVEEgKTsKKworICAgIG4gPSBtcGlfbXNiKCBYICk7CisgICAgaWYoIHJhZGl4ID49ICA0ICkgbiA+Pj0gMTsKKyAgICBpZiggcmFkaXggPj0gMTYgKSBuID4+PSAxOworICAgIG4gKz0gMzsKKworICAgIGlmKCAqc2xlbiA8IG4gKQorICAgIHsKKyAgICAgICAgKnNsZW4gPSBuOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfQlVGRkVSX1RPT19TTUFMTCApOworICAgIH0KKworICAgIHAgPSBzOworICAgIG1waV9pbml0KCAmVCwgTlVMTCApOworCisgICAgaWYoIFgtPnMgPT0gLTEgKQorICAgICAgICAqcCsrID0gJy0nOworCisgICAgaWYoIHJhZGl4ID09IDE2ICkKKyAgICB7CisgICAgICAgIGludCBjLCBpLCBqLCBrOworCisgICAgICAgIGZvciggaSA9IFgtPm4gLSAxLCBrID0gMDsgaSA+PSAwOyBpLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSBjaUwgLSAxOyBqID49IDA7IGotLSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYyA9ICggWC0+cFtpXSA+PiAoaiA8PCAzKSApICYgMHhGRjsKKworICAgICAgICAgICAgICAgIGlmKCBjID09IDAgJiYgayA9PSAwICYmIChpICsgaikgIT0gMCApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgcCArPSBzcHJpbnRmKCBwLCAiJTAyWCIsIGMgKTsKKyAgICAgICAgICAgICAgICBrID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBNUElfQ0hLKCBtcGlfY29weSggJlQsIFggKSApOworICAgICAgICBNUElfQ0hLKCBtcGlfd3JpdGVfaGxwKCAmVCwgcmFkaXgsICZwICkgKTsKKyAgICB9CisKKyAgICAqcCsrID0gJ1wwJzsKKyAgICAqc2xlbiA9IHAgLSBzOworCitjbGVhbnVwOgorCisgICAgbXBpX2ZyZWUoICZULCBOVUxMICk7CisKKyAgICByZXR1cm4oIHJldCApOworfQorCisvKgorICogUmVhZCBYIGZyb20gYW4gb3BlbmVkIGZpbGUKKyAqLworaW50IG1waV9yZWFkX2ZpbGUoIG1waSAqWCwgaW50IHJhZGl4LCBGSUxFICpmaW4gKQoreworICAgIHRfaW50IGQ7CisgICAgaW50IHNsZW47CisgICAgY2hhciAqcDsKKyAgICBjaGFyIHNbMTAyNF07CisKKyAgICBtZW1zZXQoIHMsIDAsIHNpemVvZiggcyApICk7CisgICAgaWYoIGZnZXRzKCBzLCBzaXplb2YoIHMgKSAtIDEsIGZpbiApID09IE5VTEwgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfRklMRV9JT19FUlJPUiApOworCisgICAgc2xlbiA9IHN0cmxlbiggcyApOworICAgIGlmKCBzW3NsZW4gLSAxXSA9PSAnXG4nICkgeyBzbGVuLS07IHNbc2xlbl0gPSAnXDAnOyB9CisgICAgaWYoIHNbc2xlbiAtIDFdID09ICdccicgKSB7IHNsZW4tLTsgc1tzbGVuXSA9ICdcMCc7IH0KKworICAgIHAgPSBzICsgc2xlbjsKKyAgICB3aGlsZSggLS1wID49IHMgKQorICAgICAgICBpZiggbXBpX2dldF9kaWdpdCggJmQsIHJhZGl4LCAqcCApICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICByZXR1cm4oIG1waV9yZWFkX3N0cmluZyggWCwgcmFkaXgsIHAgKyAxICkgKTsKK30KKworLyoKKyAqIFdyaXRlIFggaW50byBhbiBvcGVuZWQgZmlsZSAob3Igc3Rkb3V0IGlmIGZvdXQgPT0gTlVMTCkKKyAqLworaW50IG1waV93cml0ZV9maWxlKCBjaGFyICpwLCBtcGkgKlgsIGludCByYWRpeCwgRklMRSAqZm91dCApCit7CisgICAgaW50IG4sIHJldDsKKyAgICBzaXplX3Qgc2xlbjsKKyAgICBzaXplX3QgcGxlbjsKKyAgICBjaGFyIHNbMTAyNF07CisKKyAgICBuID0gc2l6ZW9mKCBzICk7CisgICAgbWVtc2V0KCBzLCAwLCBuICk7CisgICAgbiAtPSAyOworCisgICAgTVBJX0NISyggbXBpX3dyaXRlX3N0cmluZyggWCwgcmFkaXgsIHMsIChpbnQgKikgJm4gKSApOworCisgICAgaWYoIHAgPT0gTlVMTCApIHAgPSAiIjsKKworICAgIHBsZW4gPSBzdHJsZW4oIHAgKTsKKyAgICBzbGVuID0gc3RybGVuKCBzICk7CisgICAgc1tzbGVuKytdID0gJ1xyJzsKKyAgICBzW3NsZW4rK10gPSAnXG4nOworCisgICAgaWYoIGZvdXQgIT0gTlVMTCApCisgICAgeworICAgICAgICBpZiggZndyaXRlKCBwLCAxLCBwbGVuLCBmb3V0ICkgIT0gcGxlbiB8fAorICAgICAgICAgICAgZndyaXRlKCBzLCAxLCBzbGVuLCBmb3V0ICkgIT0gc2xlbiApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfRklMRV9JT19FUlJPUiApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHByaW50ZiggIiVzJXMiLCBwLCBzICk7CisKK2NsZWFudXA6CisKKyAgICByZXR1cm4oIHJldCApOworfQorCisvKgorICogSW1wb3J0IFggZnJvbSB1bnNpZ25lZCBiaW5hcnkgZGF0YSwgYmlnIGVuZGlhbgorICovCitpbnQgbXBpX3JlYWRfYmluYXJ5KCBtcGkgKlgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiApCit7CisgICAgaW50IHJldCwgaSwgaiwgbjsKKworICAgIGZvciggbiA9IDA7IG4gPCBidWZsZW47IG4rKyApCisgICAgICAgIGlmKCBidWZbbl0gIT0gMCApCisgICAgICAgICAgICBicmVhazsKKworICAgIE1QSV9DSEsoIG1waV9ncm93KCBYLCBDSEFSU19UT19MSU1CUyggYnVmbGVuIC0gbiApICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfbHNldCggWCwgMCApICk7CisKKyAgICBmb3IoIGkgPSBidWZsZW4gLSAxLCBqID0gMDsgaSA+PSBuOyBpLS0sIGorKyApCisgICAgICAgIFgtPnBbaiAvIGNpTF0gfD0gKCh0X2ludCkgYnVmW2ldKSA8PCAoKGogJSBjaUwpIDw8IDMpOworCitjbGVhbnVwOgorCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworLyoKKyAqIEV4cG9ydCBYIGludG8gdW5zaWduZWQgYmluYXJ5IGRhdGEsIGJpZyBlbmRpYW4KKyAqLworaW50IG1waV93cml0ZV9iaW5hcnkoIG1waSAqWCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuICkKK3sKKyAgICBpbnQgaSwgaiwgbjsKKworICAgIG4gPSBtcGlfc2l6ZSggWCApOworCisgICAgaWYoIGJ1ZmxlbiA8IG4gKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfQlVGRkVSX1RPT19TTUFMTCApOworCisgICAgbWVtc2V0KCBidWYsIDAsIGJ1ZmxlbiApOworCisgICAgZm9yKCBpID0gYnVmbGVuIC0gMSwgaiA9IDA7IG4gPiAwOyBpLS0sIGorKywgbi0tICkKKyAgICAgICAgYnVmW2ldID0gKHVuc2lnbmVkIGNoYXIpKCBYLT5wW2ogLyBjaUxdID4+ICgoaiAlIGNpTCkgPDwgMykgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogTGVmdC1zaGlmdDogWCA8PD0gY291bnQKKyAqLworaW50IG1waV9zaGlmdF9sKCBtcGkgKlgsIGludCBjb3VudCApCit7CisgICAgaW50IHJldCwgaSwgdjAsIHQxOworICAgIHRfaW50IHIwID0gMCwgcjE7CisKKyAgICB2MCA9IGNvdW50IC8gKGJpTCAgICApOworICAgIHQxID0gY291bnQgJiAoYmlMIC0gMSk7CisKKyAgICBpID0gbXBpX21zYiggWCApICsgY291bnQ7CisKKyAgICBpZiggWC0+biAqIChpbnQpIGJpTCA8IGkgKQorICAgICAgICBNUElfQ0hLKCBtcGlfZ3JvdyggWCwgQklUU19UT19MSU1CUyggaSApICkgKTsKKworICAgIHJldCA9IDA7CisKKyAgICAvKgorICAgICAqIHNoaWZ0IGJ5IGNvdW50IC8gbGltYl9zaXplCisgICAgICovCisgICAgaWYoIHYwID4gMCApCisgICAgeworICAgICAgICBmb3IoIGkgPSBYLT5uIC0gMTsgaSA+PSB2MDsgaS0tICkKKyAgICAgICAgICAgIFgtPnBbaV0gPSBYLT5wW2kgLSB2MF07CisKKyAgICAgICAgZm9yKCA7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgICAgIFgtPnBbaV0gPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogc2hpZnQgYnkgY291bnQgJSBsaW1iX3NpemUKKyAgICAgKi8KKyAgICBpZiggdDEgPiAwICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IHYwOyBpIDwgWC0+bjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgcjEgPSBYLT5wW2ldID4+IChiaUwgLSB0MSk7CisgICAgICAgICAgICBYLT5wW2ldIDw8PSB0MTsKKyAgICAgICAgICAgIFgtPnBbaV0gfD0gcjA7CisgICAgICAgICAgICByMCA9IHIxOworICAgICAgICB9CisgICAgfQorCitjbGVhbnVwOgorCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworLyoKKyAqIFJpZ2h0LXNoaWZ0OiBYID4+PSBjb3VudAorICovCitpbnQgbXBpX3NoaWZ0X3IoIG1waSAqWCwgaW50IGNvdW50ICkKK3sKKyAgICBpbnQgaSwgdjAsIHYxOworICAgIHRfaW50IHIwID0gMCwgcjE7CisKKyAgICB2MCA9IGNvdW50IC8gIGJpTDsKKyAgICB2MSA9IGNvdW50ICYgKGJpTCAtIDEpOworCisgICAgLyoKKyAgICAgKiBzaGlmdCBieSBjb3VudCAvIGxpbWJfc2l6ZQorICAgICAqLworICAgIGlmKCB2MCA+IDAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IFgtPm4gLSB2MDsgaSsrICkKKyAgICAgICAgICAgIFgtPnBbaV0gPSBYLT5wW2kgKyB2MF07CisKKyAgICAgICAgZm9yKCA7IGkgPCBYLT5uOyBpKysgKQorICAgICAgICAgICAgWC0+cFtpXSA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzaGlmdCBieSBjb3VudCAlIGxpbWJfc2l6ZQorICAgICAqLworICAgIGlmKCB2MSA+IDAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gWC0+biAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgeworICAgICAgICAgICAgcjEgPSBYLT5wW2ldIDw8IChiaUwgLSB2MSk7CisgICAgICAgICAgICBYLT5wW2ldID4+PSB2MTsKKyAgICAgICAgICAgIFgtPnBbaV0gfD0gcjA7CisgICAgICAgICAgICByMCA9IHIxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBDb21wYXJlIHVuc2lnbmVkIHZhbHVlcworICovCitpbnQgbXBpX2NtcF9hYnMoIG1waSAqWCwgbXBpICpZICkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciggaSA9IFgtPm4gLSAxOyBpID49IDA7IGktLSApCisgICAgICAgIGlmKCBYLT5wW2ldICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBmb3IoIGogPSBZLT5uIC0gMTsgaiA+PSAwOyBqLS0gKQorICAgICAgICBpZiggWS0+cFtqXSAhPSAwICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgaWYoIGkgPCAwICYmIGogPCAwICkKKyAgICAgICAgcmV0dXJuKCAwICk7CisKKyAgICBpZiggaSA+IGogKSByZXR1cm4oICAxICk7CisgICAgaWYoIGogPiBpICkgcmV0dXJuKCAtMSApOworCisgICAgZm9yKCA7IGkgPj0gMDsgaS0tICkKKyAgICB7CisgICAgICAgIGlmKCBYLT5wW2ldID4gWS0+cFtpXSApIHJldHVybiggIDEgKTsKKyAgICAgICAgaWYoIFgtPnBbaV0gPCBZLT5wW2ldICkgcmV0dXJuKCAtMSApOworICAgIH0KKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogQ29tcGFyZSBzaWduZWQgdmFsdWVzCisgKi8KK2ludCBtcGlfY21wX21waSggbXBpICpYLCBtcGkgKlkgKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yKCBpID0gWC0+biAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgaWYoIFgtPnBbaV0gIT0gMCApCisgICAgICAgICAgICBicmVhazsKKworICAgIGZvciggaiA9IFktPm4gLSAxOyBqID49IDA7IGotLSApCisgICAgICAgIGlmKCBZLT5wW2pdICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBpZiggaSA8IDAgJiYgaiA8IDAgKQorICAgICAgICByZXR1cm4oIDAgKTsKKworICAgIGlmKCBpID4gaiApIHJldHVybiggIFgtPnMgKTsKKyAgICBpZiggaiA+IGkgKSByZXR1cm4oIC1YLT5zICk7CisKKyAgICBpZiggWC0+cyA+IDAgJiYgWS0+cyA8IDAgKSByZXR1cm4oICAxICk7CisgICAgaWYoIFktPnMgPiAwICYmIFgtPnMgPCAwICkgcmV0dXJuKCAtMSApOworCisgICAgZm9yKCA7IGkgPj0gMDsgaS0tICkKKyAgICB7CisgICAgICAgIGlmKCBYLT5wW2ldID4gWS0+cFtpXSApIHJldHVybiggIFgtPnMgKTsKKyAgICAgICAgaWYoIFgtPnBbaV0gPCBZLT5wW2ldICkgcmV0dXJuKCAtWC0+cyApOworICAgIH0KKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogQ29tcGFyZSBzaWduZWQgdmFsdWVzCisgKi8KK2ludCBtcGlfY21wX2ludCggbXBpICpYLCBpbnQgeiApCit7CisgICAgbXBpIFk7CisgICAgdF9pbnQgcFsxXTsKKworICAgICpwICA9ICggeiA8IDAgKSA/IC16IDogejsKKyAgICBZLnMgPSAoIHogPCAwICkgPyAtMSA6IDE7CisgICAgWS5uID0gMTsKKyAgICBZLnAgPSBwOworCisgICAgcmV0dXJuKCBtcGlfY21wX21waSggWCwgJlkgKSApOworfQorCisvKgorICogVW5zaWduZWQgYWRkaXRpb246IFggPSB8QXwgKyB8QnwgIChIQUMgMTQuNykKKyAqLworaW50IG1waV9hZGRfYWJzKCBtcGkgKlgsIG1waSAqQSwgbXBpICpCICkKK3sKKyAgICBpbnQgcmV0LCBpLCBqOworICAgIHRfaW50ICpvLCAqcCwgYzsKKworICAgIGlmKCBYID09IEIgKQorICAgIHsKKyAgICAgICAgbXBpICpUID0gQTsgQSA9IFg7IEIgPSBUOworICAgIH0KKworICAgIGlmKCBYICE9IEEgKQorICAgICAgICBNUElfQ0hLKCBtcGlfY29weSggWCwgQSApICk7CisKKyAgICBmb3IoIGogPSBCLT5uIC0gMTsgaiA+PSAwOyBqLS0gKQorICAgICAgICBpZiggQi0+cFtqXSAhPSAwICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgTVBJX0NISyggbXBpX2dyb3coIFgsIGogKyAxICkgKTsKKworICAgIG8gPSBCLT5wOyBwID0gWC0+cDsgYyA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDw9IGo7IGkrKywgbysrLCBwKysgKQorICAgIHsKKyAgICAgICAgKnAgKz0gIGM7IGMgID0gKCAqcCA8ICBjICk7CisgICAgICAgICpwICs9ICpvOyBjICs9ICggKnAgPCAqbyApOworICAgIH0KKworICAgIHdoaWxlKCBjICE9IDAgKQorICAgIHsKKyAgICAgICAgaWYoIGkgPj0gWC0+biApCisgICAgICAgIHsKKyAgICAgICAgICAgIE1QSV9DSEsoIG1waV9ncm93KCBYLCBpICsgMSApICk7CisgICAgICAgICAgICBwID0gWC0+cCArIGk7CisgICAgICAgIH0KKworICAgICAgICAqcCArPSBjOyBjID0gKCAqcCA8IGMgKTsgaSsrOworICAgIH0KKworY2xlYW51cDoKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKy8qCisgKiBIZWxwZXIgZm9yIG1waSBzdWJzdHJhY3Rpb24KKyAqLworc3RhdGljIHZvaWQgbXBpX3N1Yl9obHAoIGludCBuLCB0X2ludCAqcywgdF9pbnQgKmQgKQoreworICAgIGludCBpOworICAgIHRfaW50IGMsIHo7CisKKyAgICBmb3IoIGkgPSBjID0gMDsgaSA8IG47IGkrKywgcysrLCBkKysgKQorICAgIHsKKyAgICAgICAgeiA9ICggKmQgPCAgYyApOyAgICAgKmQgLT0gIGM7CisgICAgICAgIGMgPSAoICpkIDwgKnMgKSArIHo7ICpkIC09ICpzOworICAgIH0KKworICAgIHdoaWxlKCBjICE9IDAgKQorICAgIHsKKyAgICAgICAgeiA9ICggKmQgPCBjICk7ICpkIC09IGM7CisgICAgICAgIGMgPSB6OyBpKys7IGQrKzsKKyAgICB9Cit9CisKKy8qCisgKiBVbnNpZ25lZCBzdWJzdHJhY3Rpb246IFggPSB8QXwgLSB8QnwgIChIQUMgMTQuOSkKKyAqLworaW50IG1waV9zdWJfYWJzKCBtcGkgKlgsIG1waSAqQSwgbXBpICpCICkKK3sKKyAgICBtcGkgVEI7CisgICAgaW50IHJldCwgbjsKKworICAgIGlmKCBtcGlfY21wX2FicyggQSwgQiApIDwgMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX01QSV9ORUdBVElWRV9WQUxVRSApOworCisgICAgbXBpX2luaXQoICZUQiwgTlVMTCApOworCisgICAgaWYoIFggPT0gQiApCisgICAgeworICAgICAgICBNUElfQ0hLKCBtcGlfY29weSggJlRCLCBCICkgKTsKKyAgICAgICAgQiA9ICZUQjsKKyAgICB9CisKKyAgICBpZiggWCAhPSBBICkKKyAgICAgICAgTVBJX0NISyggbXBpX2NvcHkoIFgsIEEgKSApOworCisgICAgcmV0ID0gMDsKKworICAgIGZvciggbiA9IEItPm4gLSAxOyBuID49IDA7IG4tLSApCisgICAgICAgIGlmKCBCLT5wW25dICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBtcGlfc3ViX2hscCggbiArIDEsIEItPnAsIFgtPnAgKTsKKworY2xlYW51cDoKKworICAgIG1waV9mcmVlKCAmVEIsIE5VTEwgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKy8qCisgKiBTaWduZWQgYWRkaXRpb246IFggPSBBICsgQgorICovCitpbnQgbXBpX2FkZF9tcGkoIG1waSAqWCwgbXBpICpBLCBtcGkgKkIgKQoreworICAgIGludCByZXQsIHMgPSBBLT5zOworCisgICAgaWYoIEEtPnMgKiBCLT5zIDwgMCApCisgICAgeworICAgICAgICBpZiggbXBpX2NtcF9hYnMoIEEsIEIgKSA+PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9hYnMoIFgsIEEsIEIgKSApOworICAgICAgICAgICAgWC0+cyA9ICBzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9hYnMoIFgsIEIsIEEgKSApOworICAgICAgICAgICAgWC0+cyA9IC1zOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE1QSV9DSEsoIG1waV9hZGRfYWJzKCBYLCBBLCBCICkgKTsKKyAgICAgICAgWC0+cyA9IHM7CisgICAgfQorCitjbGVhbnVwOgorCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworLyoKKyAqIFNpZ25lZCBzdWJzdHJhY3Rpb246IFggPSBBIC0gQgorICovCitpbnQgbXBpX3N1Yl9tcGkoIG1waSAqWCwgbXBpICpBLCBtcGkgKkIgKQoreworICAgIGludCByZXQsIHMgPSBBLT5zOworCisgICAgaWYoIEEtPnMgKiBCLT5zID4gMCApCisgICAgeworICAgICAgICBpZiggbXBpX2NtcF9hYnMoIEEsIEIgKSA+PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9hYnMoIFgsIEEsIEIgKSApOworICAgICAgICAgICAgWC0+cyA9ICBzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9hYnMoIFgsIEIsIEEgKSApOworICAgICAgICAgICAgWC0+cyA9IC1zOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE1QSV9DSEsoIG1waV9hZGRfYWJzKCBYLCBBLCBCICkgKTsKKyAgICAgICAgWC0+cyA9IHM7CisgICAgfQorCitjbGVhbnVwOgorCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworLyoKKyAqIFNpZ25lZCBhZGRpdGlvbjogWCA9IEEgKyBiCisgKi8KK2ludCBtcGlfYWRkX2ludCggbXBpICpYLCBtcGkgKkEsIGludCBiICkKK3sKKyAgICBtcGkgX0I7CisgICAgdF9pbnQgcFsxXTsKKworICAgIHBbMF0gPSAoIGIgPCAwICkgPyAtYiA6IGI7CisgICAgX0IucyA9ICggYiA8IDAgKSA/IC0xIDogMTsKKyAgICBfQi5uID0gMTsKKyAgICBfQi5wID0gcDsKKworICAgIHJldHVybiggbXBpX2FkZF9tcGkoIFgsIEEsICZfQiApICk7Cit9CisKKy8qCisgKiBTaWduZWQgc3Vic3RyYWN0aW9uOiBYID0gQSAtIGIKKyAqLworaW50IG1waV9zdWJfaW50KCBtcGkgKlgsIG1waSAqQSwgaW50IGIgKQoreworICAgIG1waSBfQjsKKyAgICB0X2ludCBwWzFdOworCisgICAgcFswXSA9ICggYiA8IDAgKSA/IC1iIDogYjsKKyAgICBfQi5zID0gKCBiIDwgMCApID8gLTEgOiAxOworICAgIF9CLm4gPSAxOworICAgIF9CLnAgPSBwOworCisgICAgcmV0dXJuKCBtcGlfc3ViX21waSggWCwgQSwgJl9CICkgKTsKK30KKworLyoKKyAqIEhlbHBlciBmb3IgbXBpIG11bHRpcGxpY2F0aW9uCisgKi8gCitzdGF0aWMgdm9pZCBtcGlfbXVsX2hscCggaW50IGksIHRfaW50ICpzLCB0X2ludCAqZCwgdF9pbnQgYiApCit7CisgICAgdF9pbnQgYyA9IDAsIHQgPSAwOworCisjaWYgZGVmaW5lZChNVUxBRERDX0hVSVQpCisgICAgZm9yKCA7IGkgPj0gODsgaSAtPSA4ICkKKyAgICB7CisgICAgICAgIE1VTEFERENfSU5JVAorICAgICAgICBNVUxBRERDX0hVSVQKKyAgICAgICAgTVVMQUREQ19TVE9QCisgICAgfQorCisgICAgZm9yKCA7IGkgPiAwOyBpLS0gKQorICAgIHsKKyAgICAgICAgTVVMQUREQ19JTklUCisgICAgICAgIE1VTEFERENfQ09SRQorICAgICAgICBNVUxBRERDX1NUT1AKKyAgICB9CisjZWxzZQorICAgIGZvciggOyBpID49IDE2OyBpIC09IDE2ICkKKyAgICB7CisgICAgICAgIE1VTEFERENfSU5JVAorICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKKyAgICAgICAgTVVMQUREQ19DT1JFICAgTVVMQUREQ19DT1JFCisgICAgICAgIE1VTEFERENfQ09SRSAgIE1VTEFERENfQ09SRQorICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKKworICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKKyAgICAgICAgTVVMQUREQ19DT1JFICAgTVVMQUREQ19DT1JFCisgICAgICAgIE1VTEFERENfQ09SRSAgIE1VTEFERENfQ09SRQorICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKKyAgICAgICAgTVVMQUREQ19TVE9QCisgICAgfQorCisgICAgZm9yKCA7IGkgPj0gODsgaSAtPSA4ICkKKyAgICB7CisgICAgICAgIE1VTEFERENfSU5JVAorICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKKyAgICAgICAgTVVMQUREQ19DT1JFICAgTVVMQUREQ19DT1JFCisKKyAgICAgICAgTVVMQUREQ19DT1JFICAgTVVMQUREQ19DT1JFCisgICAgICAgIE1VTEFERENfQ09SRSAgIE1VTEFERENfQ09SRQorICAgICAgICBNVUxBRERDX1NUT1AKKyAgICB9CisKKyAgICBmb3IoIDsgaSA+IDA7IGktLSApCisgICAgeworICAgICAgICBNVUxBRERDX0lOSVQKKyAgICAgICAgTVVMQUREQ19DT1JFCisgICAgICAgIE1VTEFERENfU1RPUAorICAgIH0KKyNlbmRpZgorCisgICAgdCsrOworCisgICAgZG8geworICAgICAgICAqZCArPSBjOyBjID0gKCAqZCA8IGMgKTsgZCsrOworICAgIH0KKyAgICB3aGlsZSggYyAhPSAwICk7Cit9CisKKy8qCisgKiBCYXNlbGluZSBtdWx0aXBsaWNhdGlvbjogWCA9IEEgKiBCICAoSEFDIDE0LjEyKQorICovCitpbnQgbXBpX211bF9tcGkoIG1waSAqWCwgbXBpICpBLCBtcGkgKkIgKQoreworICAgIGludCByZXQsIGksIGo7CisgICAgbXBpIFRBLCBUQjsKKworICAgIG1waV9pbml0KCAmVEEsICZUQiwgTlVMTCApOworCisgICAgaWYoIFggPT0gQSApIHsgTVBJX0NISyggbXBpX2NvcHkoICZUQSwgQSApICk7IEEgPSAmVEE7IH0KKyAgICBpZiggWCA9PSBCICkgeyBNUElfQ0hLKCBtcGlfY29weSggJlRCLCBCICkgKTsgQiA9ICZUQjsgfQorCisgICAgZm9yKCBpID0gQS0+biAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgaWYoIEEtPnBbaV0gIT0gMCApCisgICAgICAgICAgICBicmVhazsKKworICAgIGZvciggaiA9IEItPm4gLSAxOyBqID49IDA7IGotLSApCisgICAgICAgIGlmKCBCLT5wW2pdICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBNUElfQ0hLKCBtcGlfZ3JvdyggWCwgaSArIGogKyAyICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfbHNldCggWCwgMCApICk7CisKKyAgICBmb3IoIGkrKzsgaiA+PSAwOyBqLS0gKQorICAgICAgICBtcGlfbXVsX2hscCggaSwgQS0+cCwgWC0+cCArIGosIEItPnBbal0gKTsKKworICAgIFgtPnMgPSBBLT5zICogQi0+czsKKworY2xlYW51cDoKKworICAgIG1waV9mcmVlKCAmVEIsICZUQSwgTlVMTCApOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworLyoKKyAqIEJhc2VsaW5lIG11bHRpcGxpY2F0aW9uOiBYID0gQSAqIGIKKyAqLworaW50IG1waV9tdWxfaW50KCBtcGkgKlgsIG1waSAqQSwgdF9pbnQgYiApCit7CisgICAgbXBpIF9COworICAgIHRfaW50IHBbMV07CisKKyAgICBfQi5zID0gMTsKKyAgICBfQi5uID0gMTsKKyAgICBfQi5wID0gcDsKKyAgICBwWzBdID0gYjsKKworICAgIHJldHVybiggbXBpX211bF9tcGkoIFgsIEEsICZfQiApICk7Cit9CisKKy8qCisgKiBEaXZpc2lvbiBieSBtcGk6IEEgPSBRICogQiArIFIgIChIQUMgMTQuMjApCisgKi8KK2ludCBtcGlfZGl2X21waSggbXBpICpRLCBtcGkgKlIsIG1waSAqQSwgbXBpICpCICkKK3sKKyAgICBpbnQgcmV0LCBpLCBuLCB0LCBrOworICAgIG1waSBYLCBZLCBaLCBUMSwgVDI7CisKKyAgICBpZiggbXBpX2NtcF9pbnQoIEIsIDAgKSA9PSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfTVBJX0RJVklTSU9OX0JZX1pFUk8gKTsKKworICAgIG1waV9pbml0KCAmWCwgJlksICZaLCAmVDEsICZUMiwgTlVMTCApOworCisgICAgaWYoIG1waV9jbXBfYWJzKCBBLCBCICkgPCAwICkKKyAgICB7CisgICAgICAgIGlmKCBRICE9IE5VTEwgKSBNUElfQ0hLKCBtcGlfbHNldCggUSwgMCApICk7CisgICAgICAgIGlmKCBSICE9IE5VTEwgKSBNUElfQ0hLKCBtcGlfY29weSggUiwgQSApICk7CisgICAgICAgIHJldHVybiggMCApOworICAgIH0KKworICAgIE1QSV9DSEsoIG1waV9jb3B5KCAmWCwgQSApICk7CisgICAgTVBJX0NISyggbXBpX2NvcHkoICZZLCBCICkgKTsKKyAgICBYLnMgPSBZLnMgPSAxOworCisgICAgTVBJX0NISyggbXBpX2dyb3coICZaLCBBLT5uICsgMiApICk7CisgICAgTVBJX0NISyggbXBpX2xzZXQoICZaLCAgMCApICk7CisgICAgTVBJX0NISyggbXBpX2dyb3coICZUMSwgMiApICk7CisgICAgTVBJX0NISyggbXBpX2dyb3coICZUMiwgMyApICk7CisKKyAgICBrID0gbXBpX21zYiggJlkgKSAlIGJpTDsKKyAgICBpZiggayA8IChpbnQpIGJpTCAtIDEgKQorICAgIHsKKyAgICAgICAgayA9IGJpTCAtIDEgLSBrOworICAgICAgICBNUElfQ0hLKCBtcGlfc2hpZnRfbCggJlgsIGsgKSApOworICAgICAgICBNUElfQ0hLKCBtcGlfc2hpZnRfbCggJlksIGsgKSApOworICAgIH0KKyAgICBlbHNlIGsgPSAwOworCisgICAgbiA9IFgubiAtIDE7CisgICAgdCA9IFkubiAtIDE7CisgICAgbXBpX3NoaWZ0X2woICZZLCBiaUwgKiAobiAtIHQpICk7CisKKyAgICB3aGlsZSggbXBpX2NtcF9tcGkoICZYLCAmWSApID49IDAgKQorICAgIHsKKyAgICAgICAgWi5wW24gLSB0XSsrOworICAgICAgICBtcGlfc3ViX21waSggJlgsICZYLCAmWSApOworICAgIH0KKyAgICBtcGlfc2hpZnRfciggJlksIGJpTCAqIChuIC0gdCkgKTsKKworICAgIGZvciggaSA9IG47IGkgPiB0IDsgaS0tICkKKyAgICB7CisgICAgICAgIGlmKCBYLnBbaV0gPj0gWS5wW3RdICkKKyAgICAgICAgICAgIFoucFtpIC0gdCAtIDFdID0gfjA7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmIGRlZmluZWQoWFlTU0xfSEFWRV9MT05HTE9ORykKKyAgICAgICAgICAgIHRfZGJsIHI7CisKKyAgICAgICAgICAgIHIgID0gKHRfZGJsKSBYLnBbaV0gPDwgYmlMOworICAgICAgICAgICAgciB8PSAodF9kYmwpIFgucFtpIC0gMV07CisgICAgICAgICAgICByIC89IFkucFt0XTsKKyAgICAgICAgICAgIGlmKCByID4gKCh0X2RibCkgMSA8PCBiaUwpIC0gMSkKKyAgICAgICAgICAgICAgICByID0gKCh0X2RibCkgMSA8PCBiaUwpIC0gMTsKKworICAgICAgICAgICAgWi5wW2kgLSB0IC0gMV0gPSAodF9pbnQpIHI7CisjZWxzZQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIF9fdWRpdl9xcm5uZF9jLCBmcm9tIGdtcC9sb25nbG9uZy5oCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRfaW50IHEwLCBxMSwgcjAsIHIxOworICAgICAgICAgICAgdF9pbnQgZDAsIGQxLCBkLCBtOworCisgICAgICAgICAgICBkICA9IFkucFt0XTsKKyAgICAgICAgICAgIGQwID0gKCBkIDw8IGJpSCApID4+IGJpSDsKKyAgICAgICAgICAgIGQxID0gKCBkID4+IGJpSCApOworCisgICAgICAgICAgICBxMSA9IFgucFtpXSAvIGQxOworICAgICAgICAgICAgcjEgPSBYLnBbaV0gLSBkMSAqIHExOworICAgICAgICAgICAgcjEgPDw9IGJpSDsKKyAgICAgICAgICAgIHIxIHw9ICggWC5wW2kgLSAxXSA+PiBiaUggKTsKKworICAgICAgICAgICAgbSA9IHExICogZDA7CisgICAgICAgICAgICBpZiggcjEgPCBtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBxMS0tLCByMSArPSBkOworICAgICAgICAgICAgICAgIHdoaWxlKCByMSA+PSBkICYmIHIxIDwgbSApCisgICAgICAgICAgICAgICAgICAgIHExLS0sIHIxICs9IGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByMSAtPSBtOworCisgICAgICAgICAgICBxMCA9IHIxIC8gZDE7CisgICAgICAgICAgICByMCA9IHIxIC0gZDEgKiBxMDsKKyAgICAgICAgICAgIHIwIDw8PSBiaUg7CisgICAgICAgICAgICByMCB8PSAoIFgucFtpIC0gMV0gPDwgYmlIICkgPj4gYmlIOworCisgICAgICAgICAgICBtID0gcTAgKiBkMDsKKyAgICAgICAgICAgIGlmKCByMCA8IG0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHEwLS0sIHIwICs9IGQ7CisgICAgICAgICAgICAgICAgd2hpbGUoIHIwID49IGQgJiYgcjAgPCBtICkKKyAgICAgICAgICAgICAgICAgICAgcTAtLSwgcjAgKz0gZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHIwIC09IG07CisKKyAgICAgICAgICAgIFoucFtpIC0gdCAtIDFdID0gKCBxMSA8PCBiaUggKSB8IHEwOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBaLnBbaSAtIHQgLSAxXSsrOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBaLnBbaSAtIHQgLSAxXS0tOworCisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfbHNldCggJlQxLCAwICkgKTsKKyAgICAgICAgICAgIFQxLnBbMF0gPSAodCA8IDEpID8gMCA6IFkucFt0IC0gMV07CisgICAgICAgICAgICBUMS5wWzFdID0gWS5wW3RdOworICAgICAgICAgICAgTVBJX0NISyggbXBpX211bF9pbnQoICZUMSwgJlQxLCBaLnBbaSAtIHQgLSAxXSApICk7CisKKyAgICAgICAgICAgIE1QSV9DSEsoIG1waV9sc2V0KCAmVDIsIDAgKSApOworICAgICAgICAgICAgVDIucFswXSA9IChpIDwgMikgPyAwIDogWC5wW2kgLSAyXTsKKyAgICAgICAgICAgIFQyLnBbMV0gPSAoaSA8IDEpID8gMCA6IFgucFtpIC0gMV07CisgICAgICAgICAgICBUMi5wWzJdID0gWC5wW2ldOworICAgICAgICB9CisgICAgICAgIHdoaWxlKCBtcGlfY21wX21waSggJlQxLCAmVDIgKSA+IDAgKTsKKworICAgICAgICBNUElfQ0hLKCBtcGlfbXVsX2ludCggJlQxLCAmWSwgWi5wW2kgLSB0IC0gMV0gKSApOworICAgICAgICBNUElfQ0hLKCBtcGlfc2hpZnRfbCggJlQxLCAgYmlMICogKGkgLSB0IC0gMSkgKSApOworICAgICAgICBNUElfQ0hLKCBtcGlfc3ViX21waSggJlgsICZYLCAmVDEgKSApOworCisgICAgICAgIGlmKCBtcGlfY21wX2ludCggJlgsIDAgKSA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfY29weSggJlQxLCAmWSApICk7CisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfc2hpZnRfbCggJlQxLCBiaUwgKiAoaSAtIHQgLSAxKSApICk7CisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfYWRkX21waSggJlgsICZYLCAmVDEgKSApOworICAgICAgICAgICAgWi5wW2kgLSB0IC0gMV0tLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBRICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgbXBpX2NvcHkoIFEsICZaICk7CisgICAgICAgIFEtPnMgPSBBLT5zICogQi0+czsKKyAgICB9CisKKyAgICBpZiggUiAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIG1waV9zaGlmdF9yKCAmWCwgayApOworICAgICAgICBtcGlfY29weSggUiwgJlggKTsKKworICAgICAgICBSLT5zID0gQS0+czsKKyAgICAgICAgaWYoIG1waV9jbXBfaW50KCBSLCAwICkgPT0gMCApCisgICAgICAgICAgICBSLT5zID0gMTsKKyAgICB9CisKK2NsZWFudXA6CisKKyAgICBtcGlfZnJlZSggJlgsICZZLCAmWiwgJlQxLCAmVDIsIE5VTEwgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKy8qCisgKiBEaXZpc2lvbiBieSBpbnQ6IEEgPSBRICogYiArIFIKKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bAorICogICAgICAgICAxIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAorICogICAgICAgICBYWVNTTF9FUlJfTVBJX0RJVklTSU9OX0JZX1pFUk8gaWYgYiA9PSAwCisgKi8KK2ludCBtcGlfZGl2X2ludCggbXBpICpRLCBtcGkgKlIsIG1waSAqQSwgaW50IGIgKQoreworICAgIG1waSBfQjsKKyAgICB0X2ludCBwWzFdOworCisgICAgcFswXSA9ICggYiA8IDAgKSA/IC1iIDogYjsKKyAgICBfQi5zID0gKCBiIDwgMCApID8gLTEgOiAxOworICAgIF9CLm4gPSAxOworICAgIF9CLnAgPSBwOworCisgICAgcmV0dXJuKCBtcGlfZGl2X21waSggUSwgUiwgQSwgJl9CICkgKTsKK30KKworLyoKKyAqIE1vZHVsbzogUiA9IEEgbW9kIEIKKyAqLworaW50IG1waV9tb2RfbXBpKCBtcGkgKlIsIG1waSAqQSwgbXBpICpCICkKK3sKKyAgICBpbnQgcmV0OworCisgICAgTVBJX0NISyggbXBpX2Rpdl9tcGkoIE5VTEwsIFIsIEEsIEIgKSApOworCisgICAgd2hpbGUoIG1waV9jbXBfaW50KCBSLCAwICkgPCAwICkKKyAgICAgIE1QSV9DSEsoIG1waV9hZGRfbXBpKCBSLCBSLCBCICkgKTsKKworICAgIHdoaWxlKCBtcGlfY21wX21waSggUiwgQiApID49IDAgKQorICAgICAgTVBJX0NISyggbXBpX3N1Yl9tcGkoIFIsIFIsIEIgKSApOworCitjbGVhbnVwOgorCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworLyoKKyAqIE1vZHVsbzogciA9IEEgbW9kIGIKKyAqLworaW50IG1waV9tb2RfaW50KCB0X2ludCAqciwgbXBpICpBLCBpbnQgYiApCit7CisgICAgaW50IGk7CisgICAgdF9pbnQgeCwgeSwgejsKKworICAgIGlmKCBiID09IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfRElWSVNJT05fQllfWkVSTyApOworCisgICAgaWYoIGIgPCAwICkKKyAgICAgICAgYiA9IC1iOworCisgICAgLyoKKyAgICAgKiBoYW5kbGUgdHJpdmlhbCBjYXNlcworICAgICAqLworICAgIGlmKCBiID09IDEgKQorICAgIHsKKyAgICAgICAgKnIgPSAwOworICAgICAgICByZXR1cm4oIDAgKTsKKyAgICB9CisKKyAgICBpZiggYiA9PSAyICkKKyAgICB7CisgICAgICAgICpyID0gQS0+cFswXSAmIDE7CisgICAgICAgIHJldHVybiggMCApOworICAgIH0KKworICAgIC8qCisgICAgICogZ2VuZXJhbCBjYXNlCisgICAgICovCisgICAgZm9yKCBpID0gQS0+biAtIDEsIHkgPSAwOyBpID49IDA7IGktLSApCisgICAgeworICAgICAgICB4ICA9IEEtPnBbaV07CisgICAgICAgIHkgID0gKCB5IDw8IGJpSCApIHwgKCB4ID4+IGJpSCApOworICAgICAgICB6ICA9IHkgLyBiOworICAgICAgICB5IC09IHogKiBiOworCisgICAgICAgIHggPDw9IGJpSDsKKyAgICAgICAgeSAgPSAoIHkgPDwgYmlIICkgfCAoIHggPj4gYmlIICk7CisgICAgICAgIHogID0geSAvIGI7CisgICAgICAgIHkgLT0geiAqIGI7CisgICAgfQorCisgICAgKnIgPSB5OworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBGYXN0IE1vbnRnb21lcnkgaW5pdGlhbGl6YXRpb24gKHRoYW5rcyB0byBUb20gU3QgRGVuaXMpCisgKi8KK3N0YXRpYyB2b2lkIG1waV9tb250Z19pbml0KCB0X2ludCAqbW0sIG1waSAqTiApCit7CisgICAgdF9pbnQgeCwgbTAgPSBOLT5wWzBdOworCisgICAgeCAgPSBtMDsKKyAgICB4ICs9ICggKCBtMCArIDIgKSAmIDQgKSA8PCAxOworICAgIHggKj0gKCAyIC0gKCBtMCAqIHggKSApOworCisgICAgaWYoIGJpTCA+PSAxNiApIHggKj0gKCAyIC0gKCBtMCAqIHggKSApOworICAgIGlmKCBiaUwgPj0gMzIgKSB4ICo9ICggMiAtICggbTAgKiB4ICkgKTsKKyAgICBpZiggYmlMID49IDY0ICkgeCAqPSAoIDIgLSAoIG0wICogeCApICk7CisKKyAgICAqbW0gPSB+eCArIDE7Cit9CisKKy8qCisgKiBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uOiBBID0gQSAqIEIgKiBSXi0xIG1vZCBOICAoSEFDIDE0LjM2KQorICovCitzdGF0aWMgdm9pZCBtcGlfbW9udG11bCggbXBpICpBLCBtcGkgKkIsIG1waSAqTiwgdF9pbnQgbW0sIG1waSAqVCApCit7CisgICAgaW50IGksIG4sIG07CisgICAgdF9pbnQgdTAsIHUxLCAqZDsKKworICAgIG1lbXNldCggVC0+cCwgMCwgVC0+biAqIGNpTCApOworCisgICAgZCA9IFQtPnA7CisgICAgbiA9IE4tPm47CisgICAgbSA9ICggQi0+biA8IG4gKSA/IEItPm4gOiBuOworCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBUID0gKFQgKyB1MCpCICsgdTEqTikgLyAyXmJpTAorICAgICAgICAgKi8KKyAgICAgICAgdTAgPSBBLT5wW2ldOworICAgICAgICB1MSA9ICggZFswXSArIHUwICogQi0+cFswXSApICogbW07CisKKyAgICAgICAgbXBpX211bF9obHAoIG0sIEItPnAsIGQsIHUwICk7CisgICAgICAgIG1waV9tdWxfaGxwKCBuLCBOLT5wLCBkLCB1MSApOworCisgICAgICAgICpkKysgPSB1MDsgZFtuICsgMV0gPSAwOworICAgIH0KKworICAgIG1lbWNweSggQS0+cCwgZCwgKG4gKyAxKSAqIGNpTCApOworCisgICAgaWYoIG1waV9jbXBfYWJzKCBBLCBOICkgPj0gMCApCisgICAgICAgIG1waV9zdWJfaGxwKCBuLCBOLT5wLCBBLT5wICk7CisgICAgZWxzZQorICAgICAgICAvKiBwcmV2ZW50IHRpbWluZyBhdHRhY2tzICovCisgICAgICAgIG1waV9zdWJfaGxwKCBuLCBBLT5wLCBULT5wICk7Cit9CisKKy8qCisgKiBNb250Z29tZXJ5IHJlZHVjdGlvbjogQSA9IEEgKiBSXi0xIG1vZCBOCisgKi8KK3N0YXRpYyB2b2lkIG1waV9tb250cmVkKCBtcGkgKkEsIG1waSAqTiwgdF9pbnQgbW0sIG1waSAqVCApCit7CisgICAgdF9pbnQgeiA9IDE7CisgICAgbXBpIFU7CisKKyAgICBVLm4gPSBVLnMgPSB6OworICAgIFUucCA9ICZ6OworCisgICAgbXBpX21vbnRtdWwoIEEsICZVLCBOLCBtbSwgVCApOworfQorCisvKgorICogU2xpZGluZy13aW5kb3cgZXhwb25lbnRpYXRpb246IFggPSBBXkUgbW9kIE4gIChIQUMgMTQuODUpCisgKi8KK2ludCBtcGlfZXhwX21vZCggbXBpICpYLCBtcGkgKkEsIG1waSAqRSwgbXBpICpOLCBtcGkgKl9SUiApCit7CisgICAgaW50IHJldCwgaSwgaiwgd3NpemUsIHdiaXRzOworICAgIGludCBidWZzaXplLCBuYmxpbWJzLCBuYml0czsKKyAgICB0X2ludCBlaSwgbW0sIHN0YXRlOworICAgIG1waSBSUiwgVCwgV1s2NF07CisKKyAgICBpZiggbXBpX2NtcF9pbnQoIE4sIDAgKSA8IDAgfHwgKCBOLT5wWzBdICYgMSApID09IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfQkFEX0lOUFVUX0RBVEEgKTsKKworICAgIC8qCisgICAgICogSW5pdCB0ZW1wcyBhbmQgd2luZG93IHNpemUKKyAgICAgKi8KKyAgICBtcGlfbW9udGdfaW5pdCggJm1tLCBOICk7CisgICAgbXBpX2luaXQoICZSUiwgJlQsIE5VTEwgKTsKKyAgICBtZW1zZXQoIFcsIDAsIHNpemVvZiggVyApICk7CisKKyAgICBpID0gbXBpX21zYiggRSApOworCisgICAgd3NpemUgPSAoIGkgPiA2NzEgKSA/IDYgOiAoIGkgPiAyMzkgKSA/IDUgOgorICAgICAgICAgICAgKCBpID4gIDc5ICkgPyA0IDogKCBpID4gIDIzICkgPyAzIDogMTsKKworICAgIGogPSBOLT5uICsgMTsKKyAgICBNUElfQ0hLKCBtcGlfZ3JvdyggWCwgaiApICk7CisgICAgTVBJX0NISyggbXBpX2dyb3coICZXWzFdLCAgaiApICk7CisgICAgTVBJX0NISyggbXBpX2dyb3coICZULCBqICogMiApICk7CisKKyAgICAvKgorICAgICAqIElmIDFzdCBjYWxsLCBwcmUtY29tcHV0ZSBSXjIgbW9kIE4KKyAgICAgKi8KKyAgICBpZiggX1JSID09IE5VTEwgfHwgX1JSLT5wID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgTVBJX0NISyggbXBpX2xzZXQoICZSUiwgMSApICk7CisgICAgICAgIE1QSV9DSEsoIG1waV9zaGlmdF9sKCAmUlIsIE4tPm4gKiAyICogYmlMICkgKTsKKyAgICAgICAgTVBJX0NISyggbXBpX21vZF9tcGkoICZSUiwgJlJSLCBOICkgKTsKKworICAgICAgICBpZiggX1JSICE9IE5VTEwgKQorICAgICAgICAgICAgbWVtY3B5KCBfUlIsICZSUiwgc2l6ZW9mKCBtcGkgKSApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIG1lbWNweSggJlJSLCBfUlIsIHNpemVvZiggbXBpICkgKTsKKworICAgIC8qCisgICAgICogV1sxXSA9IEEgKiBSXjIgKiBSXi0xIG1vZCBOID0gQSAqIFIgbW9kIE4KKyAgICAgKi8KKyAgICBpZiggbXBpX2NtcF9tcGkoIEEsIE4gKSA+PSAwICkKKyAgICAgICAgbXBpX21vZF9tcGkoICZXWzFdLCBBLCBOICk7CisgICAgZWxzZSAgIG1waV9jb3B5KCAmV1sxXSwgQSApOworCisgICAgbXBpX21vbnRtdWwoICZXWzFdLCAmUlIsIE4sIG1tLCAmVCApOworCisgICAgLyoKKyAgICAgKiBYID0gUl4yICogUl4tMSBtb2QgTiA9IFIgbW9kIE4KKyAgICAgKi8KKyAgICBNUElfQ0hLKCBtcGlfY29weSggWCwgJlJSICkgKTsKKyAgICBtcGlfbW9udHJlZCggWCwgTiwgbW0sICZUICk7CisKKyAgICBpZiggd3NpemUgPiAxICkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFdbMSA8PCAod3NpemUgLSAxKV0gPSBXWzFdIF4gKHdzaXplIC0gMSkKKyAgICAgICAgICovCisgICAgICAgIGogPSAgMSA8PCAod3NpemUgLSAxKTsKKworICAgICAgICBNUElfQ0hLKCBtcGlfZ3JvdyggJldbal0sIE4tPm4gKyAxICkgKTsKKyAgICAgICAgTVBJX0NISyggbXBpX2NvcHkoICZXW2pdLCAmV1sxXSAgICApICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHdzaXplIC0gMTsgaSsrICkKKyAgICAgICAgICAgIG1waV9tb250bXVsKCAmV1tqXSwgJldbal0sIE4sIG1tLCAmVCApOworICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBXW2ldID0gV1tpIC0gMV0gKiBXWzFdCisgICAgICAgICAqLworICAgICAgICBmb3IoIGkgPSBqICsgMTsgaSA8ICgxIDw8IHdzaXplKTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgTVBJX0NISyggbXBpX2dyb3coICZXW2ldLCBOLT5uICsgMSApICk7CisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfY29weSggJldbaV0sICZXW2kgLSAxXSApICk7CisKKyAgICAgICAgICAgIG1waV9tb250bXVsKCAmV1tpXSwgJldbMV0sIE4sIG1tLCAmVCApOworICAgICAgICB9CisgICAgfQorCisgICAgbmJsaW1icyA9IEUtPm47CisgICAgYnVmc2l6ZSA9IDA7CisgICAgbmJpdHMgICA9IDA7CisgICAgd2JpdHMgICA9IDA7CisgICAgc3RhdGUgICA9IDA7CisKKyAgICB3aGlsZSggMSApCisgICAgeworICAgICAgICBpZiggYnVmc2l6ZSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG5ibGltYnMtLSA9PSAwICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgYnVmc2l6ZSA9IHNpemVvZiggdF9pbnQgKSA8PCAzOworICAgICAgICB9CisKKyAgICAgICAgYnVmc2l6ZS0tOworCisgICAgICAgIGVpID0gKEUtPnBbbmJsaW1ic10gPj4gYnVmc2l6ZSkgJiAxOworCisgICAgICAgIC8qCisgICAgICAgICAqIHNraXAgbGVhZGluZyAwcworICAgICAgICAgKi8KKyAgICAgICAgaWYoIGVpID09IDAgJiYgc3RhdGUgPT0gMCApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggZWkgPT0gMCAmJiBzdGF0ZSA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIG91dCBvZiB3aW5kb3csIHNxdWFyZSBYCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1waV9tb250bXVsKCBYLCBYLCBOLCBtbSwgJlQgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogYWRkIGVpIHRvIGN1cnJlbnQgd2luZG93CisgICAgICAgICAqLworICAgICAgICBzdGF0ZSA9IDI7CisKKyAgICAgICAgbmJpdHMrKzsKKyAgICAgICAgd2JpdHMgfD0gKGVpIDw8ICh3c2l6ZSAtIG5iaXRzKSk7CisKKyAgICAgICAgaWYoIG5iaXRzID09IHdzaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFggPSBYXndzaXplIFJeLTEgbW9kIE4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHdzaXplOyBpKysgKQorICAgICAgICAgICAgICAgIG1waV9tb250bXVsKCBYLCBYLCBOLCBtbSwgJlQgKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFggPSBYICogV1t3Yml0c10gUl4tMSBtb2QgTgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtcGlfbW9udG11bCggWCwgJldbd2JpdHNdLCBOLCBtbSwgJlQgKTsKKworICAgICAgICAgICAgc3RhdGUtLTsKKyAgICAgICAgICAgIG5iaXRzID0gMDsKKyAgICAgICAgICAgIHdiaXRzID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogcHJvY2VzcyB0aGUgcmVtYWluaW5nIGJpdHMKKyAgICAgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgbmJpdHM7IGkrKyApCisgICAgeworICAgICAgICBtcGlfbW9udG11bCggWCwgWCwgTiwgbW0sICZUICk7CisKKyAgICAgICAgd2JpdHMgPDw9IDE7CisKKyAgICAgICAgaWYoICh3Yml0cyAmICgxIDw8IHdzaXplKSkgIT0gMCApCisgICAgICAgICAgICBtcGlfbW9udG11bCggWCwgJldbMV0sIE4sIG1tLCAmVCApOworICAgIH0KKworICAgIC8qCisgICAgICogWCA9IEFeRSAqIFIgKiBSXi0xIG1vZCBOID0gQV5FIG1vZCBOCisgICAgICovCisgICAgbXBpX21vbnRyZWQoIFgsIE4sIG1tLCAmVCApOworCitjbGVhbnVwOgorCisgICAgZm9yKCBpID0gKDEgPDwgKHdzaXplIC0gMSkpOyBpIDwgKDEgPDwgd3NpemUpOyBpKysgKQorICAgICAgICBtcGlfZnJlZSggJldbaV0sIE5VTEwgKTsKKworICAgIGlmKCBfUlIgIT0gTlVMTCApCisgICAgICAgICBtcGlfZnJlZSggJldbMV0sICZULCBOVUxMICk7CisgICAgZWxzZSBtcGlfZnJlZSggJldbMV0sICZULCAmUlIsIE5VTEwgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKyNpZiBkZWZpbmVkKFhZU1NMX0dFTlBSSU1FKQorCisvKgorICogR3JlYXRlc3QgY29tbW9uIGRpdmlzb3I6IEcgPSBnY2QoQSwgQikgIChIQUMgMTQuNTQpCisgKi8KK2ludCBtcGlfZ2NkKCBtcGkgKkcsIG1waSAqQSwgbXBpICpCICkKK3sKKyAgICBpbnQgcmV0OworICAgIG1waSBURywgVEEsIFRCOworCisgICAgbXBpX2luaXQoICZURywgJlRBLCAmVEIsIE5VTEwgKTsKKworICAgIE1QSV9DSEsoIG1waV9sc2V0KCAmVEcsIDEgKSApOworICAgIE1QSV9DSEsoIG1waV9jb3B5KCAmVEEsIEEgKSApOworICAgIE1QSV9DSEsoIG1waV9jb3B5KCAmVEIsIEIgKSApOworCisgICAgVEEucyA9IFRCLnMgPSAxOworCisgICAgd2hpbGUoIG1waV9jbXBfaW50KCAmVEEsIDAgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHdoaWxlKCAoIFRBLnBbMF0gJiAxICkgPT0gMCApIE1QSV9DSEsoIG1waV9zaGlmdF9yKCAmVEEsIDEgKSApOworICAgICAgICB3aGlsZSggKCBUQi5wWzBdICYgMSApID09IDAgKSBNUElfQ0hLKCBtcGlfc2hpZnRfciggJlRCLCAxICkgKTsKKworICAgICAgICBpZiggbXBpX2NtcF9tcGkoICZUQSwgJlRCICkgPj0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIE1QSV9DSEsoIG1waV9zdWJfYWJzKCAmVEEsICZUQSwgJlRCICkgKTsKKyAgICAgICAgICAgIE1QSV9DSEsoIG1waV9zaGlmdF9yKCAmVEEsIDEgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9hYnMoICZUQiwgJlRCLCAmVEEgKSApOworICAgICAgICAgICAgTVBJX0NISyggbXBpX3NoaWZ0X3IoICZUQiwgMSApICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNUElfQ0hLKCBtcGlfbXVsX21waSggRywgJlRHLCAmVEIgKSApOworCitjbGVhbnVwOgorCisgICAgbXBpX2ZyZWUoICZUQiwgJlRBLCAmVEcsIE5VTEwgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKy8qCisgKiBNb2R1bGFyIGludmVyc2U6IFggPSBBXi0xIG1vZCBOICAoSEFDIDE0LjYxIC8gMTQuNjQpCisgKi8KK2ludCBtcGlfaW52X21vZCggbXBpICpYLCBtcGkgKkEsIG1waSAqTiApCit7CisgICAgaW50IHJldDsKKyAgICBtcGkgRywgVEEsIFRVLCBVMSwgVTIsIFRCLCBUViwgVjEsIFYyOworCisgICAgaWYoIG1waV9jbXBfaW50KCBOLCAwICkgPD0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX01QSV9CQURfSU5QVVRfREFUQSApOworCisgICAgbXBpX2luaXQoICZUQSwgJlRVLCAmVTEsICZVMiwgJkcsCisgICAgICAgICAgICAgICZUQiwgJlRWLCAmVjEsICZWMiwgTlVMTCApOworCisgICAgTVBJX0NISyggbXBpX2djZCggJkcsIEEsIE4gKSApOworCisgICAgaWYoIG1waV9jbXBfaW50KCAmRywgMSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcmV0ID0gWFlTU0xfRVJSX01QSV9OT1RfQUNDRVBUQUJMRTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIE1QSV9DSEsoIG1waV9tb2RfbXBpKCAmVEEsIEEsIE4gKSApOworICAgIE1QSV9DSEsoIG1waV9jb3B5KCAmVFUsICZUQSApICk7CisgICAgTVBJX0NISyggbXBpX2NvcHkoICZUQiwgTiApICk7CisgICAgTVBJX0NISyggbXBpX2NvcHkoICZUViwgTiApICk7CisKKyAgICBNUElfQ0hLKCBtcGlfbHNldCggJlUxLCAxICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfbHNldCggJlUyLCAwICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfbHNldCggJlYxLCAwICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfbHNldCggJlYyLCAxICkgKTsKKworICAgIGRvCisgICAgeworICAgICAgICB3aGlsZSggKCBUVS5wWzBdICYgMSApID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfc2hpZnRfciggJlRVLCAxICkgKTsKKworICAgICAgICAgICAgaWYoICggVTEucFswXSAmIDEgKSAhPSAwIHx8ICggVTIucFswXSAmIDEgKSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNUElfQ0hLKCBtcGlfYWRkX21waSggJlUxLCAmVTEsICZUQiApICk7CisgICAgICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9tcGkoICZVMiwgJlUyLCAmVEEgKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfc2hpZnRfciggJlUxLCAxICkgKTsKKyAgICAgICAgICAgIE1QSV9DSEsoIG1waV9zaGlmdF9yKCAmVTIsIDEgKSApOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUoICggVFYucFswXSAmIDEgKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgTVBJX0NISyggbXBpX3NoaWZ0X3IoICZUViwgMSApICk7CisKKyAgICAgICAgICAgIGlmKCAoIFYxLnBbMF0gJiAxICkgIT0gMCB8fCAoIFYyLnBbMF0gJiAxICkgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVBJX0NISyggbXBpX2FkZF9tcGkoICZWMSwgJlYxLCAmVEIgKSApOworICAgICAgICAgICAgICAgIE1QSV9DSEsoIG1waV9zdWJfbXBpKCAmVjIsICZWMiwgJlRBICkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTVBJX0NISyggbXBpX3NoaWZ0X3IoICZWMSwgMSApICk7CisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfc2hpZnRfciggJlYyLCAxICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBtcGlfY21wX21waSggJlRVLCAmVFYgKSA+PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9tcGkoICZUVSwgJlRVLCAmVFYgKSApOworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9tcGkoICZVMSwgJlUxLCAmVjEgKSApOworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9tcGkoICZVMiwgJlUyLCAmVjIgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9tcGkoICZUViwgJlRWLCAmVFUgKSApOworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9tcGkoICZWMSwgJlYxLCAmVTEgKSApOworICAgICAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9tcGkoICZWMiwgJlYyLCAmVTIgKSApOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlKCBtcGlfY21wX2ludCggJlRVLCAwICkgIT0gMCApOworCisgICAgd2hpbGUoIG1waV9jbXBfaW50KCAmVjEsIDAgKSA8IDAgKQorICAgICAgICBNUElfQ0hLKCBtcGlfYWRkX21waSggJlYxLCAmVjEsIE4gKSApOworCisgICAgd2hpbGUoIG1waV9jbXBfbXBpKCAmVjEsIE4gKSA+PSAwICkKKyAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9tcGkoICZWMSwgJlYxLCBOICkgKTsKKworICAgIE1QSV9DSEsoIG1waV9jb3B5KCBYLCAmVjEgKSApOworCitjbGVhbnVwOgorCisgICAgbXBpX2ZyZWUoICZWMiwgJlYxLCAmVFYsICZUQiwgJkcsCisgICAgICAgICAgICAgICZVMiwgJlUxLCAmVFUsICZUQSwgTlVMTCApOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworc3RhdGljIGNvbnN0IGludCBzbWFsbF9wcmltZVtdID0KK3sKKyAgICAgICAgMywgICAgNSwgICAgNywgICAxMSwgICAxMywgICAxNywgICAxOSwgICAyMywKKyAgICAgICAyOSwgICAzMSwgICAzNywgICA0MSwgICA0MywgICA0NywgICA1MywgICA1OSwKKyAgICAgICA2MSwgICA2NywgICA3MSwgICA3MywgICA3OSwgICA4MywgICA4OSwgICA5NywKKyAgICAgIDEwMSwgIDEwMywgIDEwNywgIDEwOSwgIDExMywgIDEyNywgIDEzMSwgIDEzNywKKyAgICAgIDEzOSwgIDE0OSwgIDE1MSwgIDE1NywgIDE2MywgIDE2NywgIDE3MywgIDE3OSwKKyAgICAgIDE4MSwgIDE5MSwgIDE5MywgIDE5NywgIDE5OSwgIDIxMSwgIDIyMywgIDIyNywKKyAgICAgIDIyOSwgIDIzMywgIDIzOSwgIDI0MSwgIDI1MSwgIDI1NywgIDI2MywgIDI2OSwKKyAgICAgIDI3MSwgIDI3NywgIDI4MSwgIDI4MywgIDI5MywgIDMwNywgIDMxMSwgIDMxMywKKyAgICAgIDMxNywgIDMzMSwgIDMzNywgIDM0NywgIDM0OSwgIDM1MywgIDM1OSwgIDM2NywKKyAgICAgIDM3MywgIDM3OSwgIDM4MywgIDM4OSwgIDM5NywgIDQwMSwgIDQwOSwgIDQxOSwKKyAgICAgIDQyMSwgIDQzMSwgIDQzMywgIDQzOSwgIDQ0MywgIDQ0OSwgIDQ1NywgIDQ2MSwKKyAgICAgIDQ2MywgIDQ2NywgIDQ3OSwgIDQ4NywgIDQ5MSwgIDQ5OSwgIDUwMywgIDUwOSwKKyAgICAgIDUyMSwgIDUyMywgIDU0MSwgIDU0NywgIDU1NywgIDU2MywgIDU2OSwgIDU3MSwKKyAgICAgIDU3NywgIDU4NywgIDU5MywgIDU5OSwgIDYwMSwgIDYwNywgIDYxMywgIDYxNywKKyAgICAgIDYxOSwgIDYzMSwgIDY0MSwgIDY0MywgIDY0NywgIDY1MywgIDY1OSwgIDY2MSwKKyAgICAgIDY3MywgIDY3NywgIDY4MywgIDY5MSwgIDcwMSwgIDcwOSwgIDcxOSwgIDcyNywKKyAgICAgIDczMywgIDczOSwgIDc0MywgIDc1MSwgIDc1NywgIDc2MSwgIDc2OSwgIDc3MywKKyAgICAgIDc4NywgIDc5NywgIDgwOSwgIDgxMSwgIDgyMSwgIDgyMywgIDgyNywgIDgyOSwKKyAgICAgIDgzOSwgIDg1MywgIDg1NywgIDg1OSwgIDg2MywgIDg3NywgIDg4MSwgIDg4MywKKyAgICAgIDg4NywgIDkwNywgIDkxMSwgIDkxOSwgIDkyOSwgIDkzNywgIDk0MSwgIDk0NywKKyAgICAgIDk1MywgIDk2NywgIDk3MSwgIDk3NywgIDk4MywgIDk5MSwgIDk5NywgLTEwMworfTsKKworLyoKKyAqIE1pbGxlci1SYWJpbiBwcmltYWxpdHkgdGVzdCAgKEhBQyA0LjI0KQorICovCitpbnQgbXBpX2lzX3ByaW1lKCBtcGkgKlgsIGludCAoKmZfcm5nKSh2b2lkICopLCB2b2lkICpwX3JuZyApCit7CisgICAgaW50IHJldCwgaSwgaiwgbiwgcywgeHM7CisgICAgbXBpIFcsIFIsIFQsIEEsIFJSOworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisKKyAgICBpZiggbXBpX2NtcF9pbnQoIFgsIDAgKSA9PSAwICkKKyAgICAgICAgcmV0dXJuKCAwICk7CisKKyAgICBtcGlfaW5pdCggJlcsICZSLCAmVCwgJkEsICZSUiwgTlVMTCApOworCisgICAgeHMgPSBYLT5zOyBYLT5zID0gMTsKKworICAgIC8qCisgICAgICogdGVzdCB0cml2aWFsIGZhY3RvcnMgZmlyc3QKKyAgICAgKi8KKyAgICBpZiggKCBYLT5wWzBdICYgMSApID09IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgKTsKKworICAgIGZvciggaSA9IDA7IHNtYWxsX3ByaW1lW2ldID4gMDsgaSsrICkKKyAgICB7CisgICAgICAgIHRfaW50IHI7CisKKyAgICAgICAgaWYoIG1waV9jbXBfaW50KCBYLCBzbWFsbF9wcmltZVtpXSApIDw9IDAgKQorICAgICAgICAgICAgcmV0dXJuKCAwICk7CisKKyAgICAgICAgTVBJX0NISyggbXBpX21vZF9pbnQoICZyLCBYLCBzbWFsbF9wcmltZVtpXSApICk7CisKKyAgICAgICAgaWYoIHIgPT0gMCApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFcgPSB8WHwgLSAxCisgICAgICogUiA9IFcgPj4gbHNiKCBXICkKKyAgICAgKi8KKyAgICBzID0gbXBpX2xzYiggJlcgKTsKKyAgICBNUElfQ0hLKCBtcGlfc3ViX2ludCggJlcsIFgsIDEgKSApOworICAgIE1QSV9DSEsoIG1waV9jb3B5KCAmUiwgJlcgKSApOworICAgIE1QSV9DSEsoIG1waV9zaGlmdF9yKCAmUiwgcyApICk7CisKKyAgICBpID0gbXBpX21zYiggWCApOworICAgIC8qCisgICAgICogSEFDLCB0YWJsZSA0LjQKKyAgICAgKi8KKyAgICBuID0gKCAoIGkgPj0gMTMwMCApID8gIDIgOiAoIGkgPj0gIDg1MCApID8gIDMgOgorICAgICAgICAgICggaSA+PSAgNjUwICkgPyAgNCA6ICggaSA+PSAgMzUwICkgPyAgOCA6CisgICAgICAgICAgKCBpID49ICAyNTAgKSA/IDEyIDogKCBpID49ICAxNTAgKSA/IDE4IDogMjcgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogcGljayBhIHJhbmRvbSBBLCAxIDwgQSA8IHxYfCAtIDEKKyAgICAgICAgICovCisgICAgICAgIE1QSV9DSEsoIG1waV9ncm93KCAmQSwgWC0+biApICk7CisKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIEEucDsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IEEubiAqIGNpTDsgaisrICkKKyAgICAgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikgZl9ybmcoIHBfcm5nICk7CisKKyAgICAgICAgaiA9IG1waV9tc2IoICZBICkgLSBtcGlfbXNiKCAmVyApOworICAgICAgICBNUElfQ0hLKCBtcGlfc2hpZnRfciggJkEsIGogKyAxICkgKTsKKyAgICAgICAgQS5wWzBdIHw9IDM7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQSA9IEFeUiBtb2QgfFh8CisgICAgICAgICAqLworICAgICAgICBNUElfQ0hLKCBtcGlfZXhwX21vZCggJkEsICZBLCAmUiwgWCwgJlJSICkgKTsKKworICAgICAgICBpZiggbXBpX2NtcF9tcGkoICZBLCAmVyApID09IDAgfHwKKyAgICAgICAgICAgIG1waV9jbXBfaW50KCAmQSwgIDEgKSA9PSAwICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGogPSAxOworICAgICAgICB3aGlsZSggaiA8IHMgJiYgbXBpX2NtcF9tcGkoICZBLCAmVyApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQSA9IEEgKiBBIG1vZCB8WHwKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTVBJX0NISyggbXBpX211bF9tcGkoICZULCAmQSwgJkEgKSApOworICAgICAgICAgICAgTVBJX0NISyggbXBpX21vZF9tcGkoICZBLCAmVCwgWCAgKSApOworCisgICAgICAgICAgICBpZiggbXBpX2NtcF9pbnQoICZBLCAxICkgPT0gMCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIG5vdCBwcmltZSBpZiBBICE9IHxYfCAtIDEgb3IgQSA9PSAxCisgICAgICAgICAqLworICAgICAgICBpZiggbXBpX2NtcF9tcGkoICZBLCAmVyApICE9IDAgfHwKKyAgICAgICAgICAgIG1waV9jbXBfaW50KCAmQSwgIDEgKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gWFlTU0xfRVJSX01QSV9OT1RfQUNDRVBUQUJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCitjbGVhbnVwOgorCisgICAgWC0+cyA9IHhzOworCisgICAgbXBpX2ZyZWUoICZSUiwgJkEsICZULCAmUiwgJlcsIE5VTEwgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKy8qCisgKiBQcmltZSBudW1iZXIgZ2VuZXJhdGlvbgorICovCitpbnQgbXBpX2dlbl9wcmltZSggbXBpICpYLCBpbnQgbmJpdHMsIGludCBkaF9mbGFnLAorICAgICAgICAgICAgICAgICAgIGludCAoKmZfcm5nKSh2b2lkICopLCB2b2lkICpwX3JuZyApCit7CisgICAgaW50IHJldCwgaywgbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIG1waSBZOworCisgICAgaWYoIG5iaXRzIDwgMyApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX01QSV9CQURfSU5QVVRfREFUQSApOworCisgICAgbXBpX2luaXQoICZZLCBOVUxMICk7CisKKyAgICBuID0gQklUU19UT19MSU1CUyggbmJpdHMgKTsKKworICAgIE1QSV9DSEsoIG1waV9ncm93KCBYLCBuICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfbHNldCggWCwgMCApICk7CisKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgWC0+cDsKKyAgICBmb3IoIGsgPSAwOyBrIDwgWC0+biAqIGNpTDsgaysrICkKKyAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSBmX3JuZyggcF9ybmcgKTsKKworICAgIGsgPSBtcGlfbXNiKCBYICk7CisgICAgaWYoIGsgPCBuYml0cyApIE1QSV9DSEsoIG1waV9zaGlmdF9sKCBYLCBuYml0cyAtIGsgKSApOworICAgIGlmKCBrID4gbmJpdHMgKSBNUElfQ0hLKCBtcGlfc2hpZnRfciggWCwgayAtIG5iaXRzICkgKTsKKworICAgIFgtPnBbMF0gfD0gMzsKKworICAgIGlmKCBkaF9mbGFnID09IDAgKQorICAgIHsKKyAgICAgICAgd2hpbGUoICggcmV0ID0gbXBpX2lzX3ByaW1lKCBYLCBmX3JuZywgcF9ybmcgKSApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcmV0ICE9IFhZU1NMX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgKQorICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgICAgICAgTVBJX0NISyggbXBpX2FkZF9pbnQoIFgsIFgsIDIgKSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE1QSV9DSEsoIG1waV9zdWJfaW50KCAmWSwgWCwgMSApICk7CisgICAgICAgIE1QSV9DSEsoIG1waV9zaGlmdF9yKCAmWSwgMSApICk7CisKKyAgICAgICAgd2hpbGUoIDEgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggKCByZXQgPSBtcGlfaXNfcHJpbWUoIFgsIGZfcm5nLCBwX3JuZyApICkgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICggcmV0ID0gbXBpX2lzX3ByaW1lKCAmWSwgZl9ybmcsIHBfcm5nICkgKSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiggcmV0ICE9IFhZU1NMX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCByZXQgIT0gWFlTU0xfRVJSX01QSV9OT1RfQUNDRVBUQUJMRSApCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgICAgICAgICBNUElfQ0hLKCBtcGlfYWRkX2ludCggJlksIFgsIDEgKSApOworICAgICAgICAgICAgTVBJX0NISyggbXBpX2FkZF9pbnQoICBYLCBYLCAyICkgKTsKKyAgICAgICAgICAgIE1QSV9DSEsoIG1waV9zaGlmdF9yKCAmWSwgMSApICk7CisgICAgICAgIH0KKyAgICB9CisKK2NsZWFudXA6CisKKyAgICBtcGlfZnJlZSggJlksIE5VTEwgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9TRUxGX1RFU1QpCisKKy8qCisgKiBDaGVja3VwIHJvdXRpbmUKKyAqLworaW50IG1waV9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICkKK3sKKyAgICBpbnQgcmV0OworICAgIG1waSBBLCBFLCBOLCBYLCBZLCBVLCBWOworCisgICAgbXBpX2luaXQoICZBLCAmRSwgJk4sICZYLCAmWSwgJlUsICZWLCBOVUxMICk7CisKKyAgICBNUElfQ0hLKCBtcGlfcmVhZF9zdHJpbmcoICZBLCAxNiwKKyAgICAgICAgIkVGRTAyMUMyNjQ1RkQxREM1ODZFNjkxODRBRjRBMzFFIiBcCisgICAgICAgICJENUY1M0U5M0I1RjEyM0ZBNDE2ODA4NjdCQTExMDEzMSIgXAorICAgICAgICAiOTQ0RkU3OTUyRTI1MTczMzc3ODBDQjBEQjgwRTYxQUEiIFwKKyAgICAgICAgIkU3QzhEREM2QzVDNkFBREVCMzRFQjM4QTJGNDBENUU2IiApICk7CisKKyAgICBNUElfQ0hLKCBtcGlfcmVhZF9zdHJpbmcoICZFLCAxNiwKKyAgICAgICAgIkIyRTdFRkQzNzA3NUI5RjAzRkY5ODlDN0M1MDUxQzIwIiBcCisgICAgICAgICIzNEQyQTMyMzgxMDI1MTEyN0U3QkY4NjI1QTRGNDlBNSIgXAorICAgICAgICAiRjNFMjdGNERBOEJENTlDNDdENkRBQUJBNEM4MTI3QkQiIFwKKyAgICAgICAgIjVCNUMyNTc2MzIyMkZFRkNDRkMzOEI4MzIzNjZDMjlFIiApICk7CisKKyAgICBNUElfQ0hLKCBtcGlfcmVhZF9zdHJpbmcoICZOLCAxNiwKKyAgICAgICAgIjAwNjZBMTk4MTg2QzE4QzEwQjJGNUVEOUI1MjI3NTJBIiBcCisgICAgICAgICI5ODMwQjY5OTE2RTUzNUM4RjA0NzUxOEE4ODlBNDNBNSIgXAorICAgICAgICAiOTRCNkJFRDI3QTE2OEQzMUQ0QTUyRjg4OTI1QUE4RjUiICkgKTsKKworICAgIE1QSV9DSEsoIG1waV9tdWxfbXBpKCAmWCwgJkEsICZOICkgKTsKKworICAgIE1QSV9DSEsoIG1waV9yZWFkX3N0cmluZyggJlUsIDE2LAorICAgICAgICAiNjAyQUI3RUNBNTk3QTNENkI1NkZGOTgyOUE1RThCODUiIFwKKyAgICAgICAgIjlFODU3RUE5NUEwMzUxMkUyQkFFNzM5MTY4OEQyNjRBIiBcCisgICAgICAgICJBNTY2M0IwMzQxREI5Q0NGRDJDNEM1RjQyMUZFQzgxNCIgXAorICAgICAgICAiODAwMUI3MkU4NDhBMzhDQUUxQzY1Rjc4RTU2QUJERUYiIFwKKyAgICAgICAgIkUxMkQzQzAzOUI4QTAyRDZCRTU5M0YwQkJCREE1NkYxIiBcCisgICAgICAgICJFQ0Y2NzcxNTJFRjgwNDM3MEMxQTMwNUNBRjNCNUJGMSIgXAorICAgICAgICAiMzA4NzlCNTZDNjFERTU4NEEwRjUzQTI0NDdBNTFFIiApICk7CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAiICBNUEkgdGVzdCAjMSAobXVsX21waSk6ICIgKTsKKworICAgIGlmKCBtcGlfY21wX21waSggJlgsICZVICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJwYXNzZWRcbiIgKTsKKworICAgIE1QSV9DSEsoIG1waV9kaXZfbXBpKCAmWCwgJlksICZBLCAmTiApICk7CisKKyAgICBNUElfQ0hLKCBtcGlfcmVhZF9zdHJpbmcoICZVLCAxNiwKKyAgICAgICAgIjI1NjU2NzMzNjA1OUU1MkNBRTIyOTI1NDc0NzA1RjM5QTk0IiApICk7CisKKyAgICBNUElfQ0hLKCBtcGlfcmVhZF9zdHJpbmcoICZWLCAxNiwKKyAgICAgICAgIjY2MTNGMjYxNjIyMjNERjQ4OEU5Q0Q0OENDMTMyQzdBIiBcCisgICAgICAgICIwQUM5M0M3MDFCMDAxQjA5MkU0RTVCOUY3M0JDRDI3QiIgXAorICAgICAgICAiOUVFNTBEMDY1N0M3N0YzNzRFOTAzQ0RGQTRDNjQyIiApICk7CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAiICBNUEkgdGVzdCAjMiAoZGl2X21waSk6ICIgKTsKKworICAgIGlmKCBtcGlfY21wX21waSggJlgsICZVICkgIT0gMCB8fAorICAgICAgICBtcGlfY21wX21waSggJlksICZWICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJwYXNzZWRcbiIgKTsKKworICAgIE1QSV9DSEsoIG1waV9leHBfbW9kKCAmWCwgJkEsICZFLCAmTiwgTlVMTCApICk7CisKKyAgICBNUElfQ0hLKCBtcGlfcmVhZF9zdHJpbmcoICZVLCAxNiwKKyAgICAgICAgIjM2RTEzOUFFQTU1MjE1NjA5RDI4MTY5OThFRDAyMEJCIiBcCisgICAgICAgICJCRDk2QzM3ODkwRjY1MTcxRDk0OEU5QkM3Q0JBQTREOSIgXAorICAgICAgICAiMzI1RDI0RDZBM0MxMjcxMEYxMEEwOUZBMDhBQjg3IiApICk7CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAiICBNUEkgdGVzdCAjMyAoZXhwX21vZCk6ICIgKTsKKworICAgIGlmKCBtcGlfY21wX21waSggJlgsICZVICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJwYXNzZWRcbiIgKTsKKworICAgIE1QSV9DSEsoIG1waV9pbnZfbW9kKCAmWCwgJkEsICZOICkgKTsKKworICAgIE1QSV9DSEsoIG1waV9yZWFkX3N0cmluZyggJlUsIDE2LAorICAgICAgICAiMDAzQTBBQUVERDdFNzg0RkMwN0Q4RjlFQzZFM0JGRDUiIFwKKyAgICAgICAgIkMzREJBNzY0NTYzNjNBMTA4Njk2MjJFQUMyREQ4NEVDIiBcCisgICAgICAgICJDNUI4QTc0REFDNEQwOUUwM0I1RTBCRTc3OUYyREY2MSIgKSApOworCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIiAgTVBJIHRlc3QgIzQgKGludl9tb2QpOiAiICk7CisKKyAgICBpZiggbXBpX2NtcF9tcGkoICZYLCAmVSApICE9IDAgKQorICAgIHsKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICJmYWlsZWRcbiIgKTsKKworICAgICAgICByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4iICk7CisKK2NsZWFudXA6CisKKyAgICBpZiggcmV0ICE9IDAgJiYgdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAiVW5leHBlY3RlZCBlcnJvciwgcmV0dXJuIGNvZGUgPSAlMDhYXG4iLCByZXQgKTsKKworICAgIG1waV9mcmVlKCAmViwgJlUsICZZLCAmWCwgJk4sICZFLCAmQSwgTlVMTCApOworCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIlxuIiApOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicmFyeS9jZXJ0cy5jIGIvbGlicmFyeS9jZXJ0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMGFiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJyYXJ5L2NlcnRzLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiAgWC41MDkgdGVzdCBjZXJ0aWZpY2F0ZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlICJ4eXNzbC9jb25maWcuaCIKKworI2lmIGRlZmluZWQoWFlTU0xfQ0VSVFNfQykKKworY2hhciB0ZXN0X2NhX2NydFtdID0KKyItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cclxuIgorIk1JSURwVENDQW8yZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJGTVFzd0NRWURWUVFHRXdKR1VqRU9cclxuIgorIk1Bd0dBMVVFQnhNRlVHRnlhWE14RGpBTUJnTlZCQW9UQlZoNVUxTk1NUll3RkFZRFZRUURFdzFZZVZOVFRDQlVcclxuIgorIlpYTjBJRU5CTUI0WERUQTNNRGN3TnpBMU1EQXhPRm9YRFRFM01EY3dOekExTURBeE9Gb3dSVEVMTUFrR0ExVUVcclxuIgorIkJoTUNSbEl4RGpBTUJnTlZCQWNUQlZCaGNtbHpNUTR3REFZRFZRUUtFd1ZZZVZOVFRERVdNQlFHQTFVRUF4TU5cclxuIgorIldIbFRVMHdnVkdWemRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNK2tcclxuIgorImd0NzBmSVBpWXFtdlhyKzl1UG1Xb040MDVlb1N6eGRpUkxMQ0hxTDRWL1RzMEUvSCtKTmZIUzRESGxBZ3hySnVcclxuIgorIitaSWFkdlNKdUhrSTZlMWlNa0FoNVNVMURxYUYzanJyRmRKQ29vTTZhMDc3TTRDUmtFMXRkQWVaRGYrQllwMHFcclxuIgorIkJlTVU5WTIrajdpYnNRYVBBaXp1bmJYTGY0UWR0ZUV4Q3doWVJKOE9WWFNFYVNOdDMzOWdKelRENmtPaEVTM2JcclxuIgorImxFTjNxYng2bHFGYUo1TUxIVGl4NXVOVmMycnZiT2l6VjVvTGhKTnFtNTJBS09wMTF0djZXVGlJOGxvYWd2QWNcclxuIgorImpsaEVaUk5iOWVsNVNMNkphaS91RmNxWEt6ZlhOS1czRllQUUhGR29ibWlNZkd0MWxVU0JKM0YybXJxRUM3Z0NcclxuIgorIndIeS9GRHZBSTY0L2s1TFpBRmtDQXdFQUFhT0JuekNCbkRBTUJnTlZIUk1FQlRBREFRSC9NQjBHQTFVZERnUVdcclxuIgorIkJCUzg3aCtZNlBvcmcrU2tmVjdEZFhLVE1ka3laekJ0QmdOVkhTTUVaakJrZ0JTODdoK1k2UG9yZytTa2ZWN0RcclxuIgorImRYS1RNZGt5WjZGSnBFY3dSVEVMTUFrR0ExVUVCaE1DUmxJeERqQU1CZ05WQkFjVEJWQmhjbWx6TVE0d0RBWURcclxuIgorIlZRUUtFd1ZZZVZOVFRERVdNQlFHQTFVRUF4TU5XSGxUVTB3Z1ZHVnpkQ0JEUVlJQkFEQU5CZ2txaGtpRzl3MEJcclxuIgorIkFRVUZBQU9DQVFFQUlIZG9oME5DZzZLQUFod0RTbWZFZ1NiS1VJOC9aci9kNTZ1dzQySE8wc2ovdUtQUXpVY29cclxuIgorIjNNeDJCWUUxbTFpdGc3cTVPaHJrQjdKNFpCNzhFdE5aTTg0blYreTZvZDNZcFIwWjlWVXhDeDc5NDhNb3pZUnlcclxuIgorIlRLRjV4L2xLSFJ4MVBKS2ZFTzRjbEtkV1RGQXRXdEdoZXdYckhKUThDK0VOaDJVcDJ3VFZoM1orcEV6dVpOdjNcclxuIgorInUvSll1MUgrdmt0M2wxV0N5LzlteFVudSthblcxRHp4UFduank0bHg2TWkwQkQycWZLQldMalZTKzd2NkFMY2pcclxuIgorIlMyb1JXV3I0TFV2WFQ3ejlCQkF2dzJlSlFEK2E0dUF5YTZFVVJHN0FzQXZyNU1uV24vcjB3TFdtQko2ZkIxWXBcclxuIgorIkYxa09tYW1PRnZzdExNZjc0ckxYK0xHS2VKL253dUk1RlE9PVxyXG4iCisiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxyXG4iOworCitjaGFyIHRlc3RfY2Ffa2V5W10gPQorIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cclxuIgorIlByb2MtVHlwZTogNCxFTkNSWVBURURcclxuIgorIkRFSy1JbmZvOiBERVMtRURFMy1DQkMsN0JEQzI4MEJBNEMyRjQ1Q1xyXG4iCisiXHJcbiIKKyJLSTZybXdZMENoakYvMC9RN2QxdkUyam9qWlFUdUY4ajB3SlVPZjAyUFVVRDRlbjgvRkNMajY5UGYzL2x2T2x1XHJcbiIKKyJGOGhVNEl1Qkh4TjIrZmV1WHA2eFRtR2QvVnlLZFdoNCtOR3RLcjJWMWdYZmsyd3FIazMvUC9ZdUY3UWhPUWpaXHJcbiIKKyJCbE5GN241bzc2TnVmcjNpd0JidElBQkNHUWZOUlV3R3pydm1GWExJclNxbnM4cHB2ODNxYUQ1akhWUVFqNU1NXHJcbiIKKyJjR0lvaWR3bU5PUmRWbUJDVloxN2RRK2xNUGZxamhOMjdHQmh6WGJwOWEyRVAzdytJcXJYT3ZjbDREcVNZK0RVXHJcbiIKKyJQSWhTNkt1UVo0aWVrNGRJOTN3bXcyRDhRNjdvbWNLWU9YL0JqQ2taL3Y2b3E0ODFxT2VqNk1pY0lZL0w5THhIXHJcbiIKKyJyOTFqcUlZTEpDKzF3MjBZYXZCM2tJa1NlNXp5czMwUnpoUFRPdEc2MGo4a2dpUTRGaCtML25LQlA1bm9PWEdFXHJcbiIKKyJ1ekRCYTA1MUhDRVlmdWZPVmtYcjZ3QkNGbzlib3FNMXAvR0kwWmU1Z0NzWVkrVnp5dTk2Z3UrT0d2NTVKdHlvXHJcbiIKKyJmWTJ5RXdWS2hmcU55K3hKKzhkd2Y4ZGNjNXZRTGF0WGViRHludVNQSTJqYmFvczZNSlQ2bjBMb1kyVHBBejQ3XHJcbiIKKyJ2TkU3VXRFRWRnWlBQVndFNHhPK2RWYTBrQ3FKeHVHOGIrWlpUSFppZGxRNk1CaWViTDR2WGJlSUZpZVFSelVNXHJcbiIKKyIwNklRN1lxc2lCVkxZeGljTWxBcGRGcEo0UU0yZkZLbFpSbytmSGc4RU45SEViUnBneElmNEl3QUFGak9nc2lPXHJcbiIKKyJsbDdPbXl6U0YxMk5VSXJSc0lvMDJFNFk4WDZ4U0ZlWW5PSWlxWnFkeEc0eHovRFpLb1g2SnM4V2RZYnR6ckR2XHJcbiIKKyI3Z1lZRVp5MWN1UjlQSnpNREtYb0x6L21qQnFEc2gxMVZnbTFuQUhiaEJxRmFXU3V1ZUgvTFYycmdSaWpVQktoXHJcbiIKKyJ5TVRuR1hyejU2RGVKODViWUxqVkVPTTN4aHZqc3o2RnE1eExxWFJUQXp5UW43UXVxUmcyc3pMdENuTjhvbENoXHJcbiIKKyJyZFMxR2Q3RVY1ZzI0V25GOWdUellKNGx3TzlveE9zUEtLQ0QxWjc3QitsYlpMb3hUdTcrcmFrVHRxTGlrV012XHJcbiIKKyI3T0lMZlI0aWFJdTFuS3hoaFhwd256ZTN1KzFPV2N1azBVbkJqU25GNTE5dGxyZ1YzZG1BMFAyTEhkNmg2eHJ1XHJcbiIKKyJ2SWdVRkhiaWdDVjBpNTVwZUVQeHRjeTlKR0xHSjNXdkhBM05HU3Nxa2tCL3ltZGZFYU1tRUg3NDAzVUtxUXFxXHJcbiIKKyIrSzlaMWNZbWVabGZvWENsbWRTanN4a1llTjVyYUIwa09PU1YvTUVPeVNHK2x6dHlMVUdCNG40NkFaRzJQZ1hOXHJcbiIKKyJBOWc5dHYyZ3FjNTFWbCs1NXF3VGc1NDI5RGlnamlCeVJrY21CVTNBMWFGOHl6RDFRZXJ3b2JQbXFlTlowbVd2XHJcbiIKKyJTbGxBdmdWczJ1eTJXZjkvNWdFV20rSGpuSndTOVZQTlRvY0cvcis0Qm5ESzhYRzBKeTRvSStqU1B4ai9ZOEp0XHJcbiIKKyIwZWpGUE01QTdIR25naWFQRllIeGN3UHdvNEFhNEhabmsra2VGckErdkY5ZURkMUlPajE5NWE5VEVTTCtJR3QxXHJcbiIKKyJudU5tbXVZanlKcU05VXZpMU11dHYwVVE2Rmw2eXY0WHhhVXRNWktsNEx0ckFhTWRXMVQwUEVnVUcwdGpTSXhYXHJcbiIKKyJoQmQxVytPYjRubUsyOWFhNGl1WGFPeGVBQTNRSzdLQ1pvMThDSkZnbnAxdzk3cW9od2xLZis0RnVOWEhMNjRRXHJcbiIKKyJGZ21weWNWOW5mUDhHOWFVWUtBeHMxK3h1dE52L0I2b3BIbWZMTkw2ZDBjd2k4ZHZHc3JEZEdsY3lpOERrL1BGXHJcbiIKKyJHS1NxbFFURjVWN2w0VU9hbmVmQjUxdHV6aUVCWStMV2NYUDRYZ3FOR1BRa25QRjkwTm5iSDFFZ2xRRzJwYXFiXHJcbiIKKyI1Ykx5VDhHNmtmQ1NZNHVIeHM5bFB1dmZPams5cHRqeTJGd2Z5QmIzU2w0SytJRkVFOFhUTnVORXJoODNBS2gyXHJcbiIKKyItLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLVxyXG4iOworCitjaGFyIHRlc3RfY2FfcHdkW10gPSAidGVzdCI7CisKK2NoYXIgdGVzdF9zcnZfY3J0W10gPQorIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxyXG4iCisiTUlJRFBqQ0NBaWFnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFVRkFEQkZNUXN3Q1FZRFZRUUdFd0pHVWpFT1xyXG4iCisiTUF3R0ExVUVCeE1GVUdGeWFYTXhEakFNQmdOVkJBb1RCVmg1VTFOTU1SWXdGQVlEVlFRREV3MVllVk5UVENCVVxyXG4iCisiWlhOMElFTkJNQjRYRFRBM01EY3dOekExTURFeU9Wb1hEVEE0TURjd05qQTFNREV5T1Zvd01URUxNQWtHQTFVRVxyXG4iCisiQmhNQ1JsSXhEakFNQmdOVkJBb1RCVmg1VTFOTU1SSXdFQVlEVlFRREV3bHNiMk5oYkdodmMzUXdnZ0VpTUEwR1xyXG4iCisiQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM0MFBEY0dUZ21Ia3Q2bm9YRGZralZ1eW1qaU5ZQlxyXG4iCisiZ2p0aUw3dUExS2UzdFhTdGFjRWVjUWVrL09KeFlxWXI3ZmZjV2FsUzI5TEw2SGJLcGkweExaS0JiRDlBQ2tEaFxyXG4iCisiMVovU3ZIbHlRUElMSmRZYjlETXcra3paZHM1bXlYVWp6bjdBZW0xWWpveE1aVUFNeWMzNGkyOTAwWDJwTDB2MlxyXG4iCisiU2ZDZUo5WW00TU9uWnhZbDIxNytkWDlaYmtnSWdyVDZ1WTJJWUs0Ym9Ed3hiVGN5VDhpL05Qc1ZzaU13dFdQTVxyXG4iCisicm5RTXIrWGJnUzk4c1V6Y1pFNzBQZTFUbFY5SXk4ai84ZDJPaUZvK3FUeU11LzZVcE0yczNnZGtRa016eCtTbVxyXG4iCisiNFFpdFJVanptRVhlVWVQUlVqRWdISXY3dnowNjl4dVZCenJrczM2dzVCWGlWQWhMa2UvT1RLVlBBZ01CQUFHalxyXG4iCisiVFRCTE1Ba0dBMVVkRXdRQ01BQXdIUVlEVlIwT0JCWUVGTmtPeUNUeDY0U0RkUHlTR1dsL3R6RDcvV01TTUI4R1xyXG4iCisiQTFVZEl3UVlNQmFBRkx6dUg1am8raXVENUtSOVhzTjFjcE14MlRKbk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQlxyXG4iCisiQVFCZWxKdjV0K3N1YXF5NUxvNWJqTmVIak5aZmdnOEVpZ0RRN05xYW9zdmxRWkFzaDJOMzRHZzVZZGtHeVZkZ1xyXG4iCisiczMySS9LNWFheXd5VWJHOXFWWFF4Q00yVDk1cUJxeUs1Nmg5eUpvWktXUUQ5SC8vK3pCOGtDSy8xNld2UmZ2M1xyXG4iCisiVkE3ZVNSMTlxT0ZXbEhlKzFxR2gyWWh4ZURVZnlpK2ZtNEQzNmRHeHFDMkEzNHRaam8wUVBIS3RJZXFNMGtKeVxyXG4iCisienpMNjVUbGJKUUtreVR1UkhvZkZ2MGpXOVpGRzJ3a0d5c1ZnQ1k1Zmp1TEkxZG8vc1dVYVhkMjk4N2lORmErS1xyXG4iCisiRnJIc1RpNnVyU2ZadUdsWk54RFhESEVFN1Eyc25BdnZlditLUjdERDlYNERKR2NQWDlnQTRDR0pqKzlaenlBQVxyXG4iCisiWlRHcE96azFoSUg0NFJGczJsSk1aUmxFXHJcbiIKKyItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXHJcbiI7CisKK2NoYXIgdGVzdF9zcnZfa2V5W10gPQorIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cclxuIgorIk1JSUVvd0lCQUFLQ0FRRUF1TkR3M0JrNEpoNUxlcDZGdzM1STFic3BvNGpXQVlJN1lpKzdnTlNudDdWMHJXbkJcclxuIgorIkhuRUhwUHppY1dLbUsrMzMzRm1wVXR2U3kraDJ5cVl0TVMyU2dXdy9RQXBBNGRXZjByeDVja0R5Q3lYV0cvUXpcclxuIgorIk1QcE0yWGJPWnNsMUk4NSt3SHB0V0k2TVRHVkFETW5OK0l0dmRORjlxUzlMOWtud25pZldKdUREcDJjV0pkdGVcclxuIgorIi9uVi9XVzVJQ0lLMCtybU5pR0N1RzZBOE1XMDNNay9JdnpUN0ZiSWpNTFZqeks1MERLL2wyNEV2ZkxGTTNHUk9cclxuIgorIjlEM3RVNVZmU012SS8vSGRqb2hhUHFrOGpMditsS1ROck40SFpFSkRNOGZrcHVFSXJVVkk4NWhGM2xIajBWSXhcclxuIgorIklCeUwrNzg5T3ZjYmxRYzY1TE4rc09RVjRsUUlTNUh2emt5bFR3SURBUUFCQW9JQkFCZWFoOGgwYUJsbU1SbWRcclxuIgorIitWTjRZM0Q0a0Y3VWNSQ01RMjFNejFPcTFTaS9RZ0dMeWlCTEswREZFMTZMek5FN2VUWnBOUmpoL2xBUWhtdG5cclxuIgorIlFjcFFHYS94MVRvbWxSYkNvOERVVldaa0tRV0hkWXJvYTBsTURsaVB0ZGltemhFZXBFMk0xVDVFSm1MelkzUytcclxuIgorInFWR2U3VU1zSmpKZldnSkFlenlYdGVBTlFLKzJZU3QrQ2pQSXFJSGNoMUtleFVudmROOSsrMW9FeDZBYnVaOFRcclxuIgorIjRhdmhGWVpRUDE1dFpOR3NrMkxmUWxZUy9OZmJvd2tDc2QwL1RWdWJKQm1ER1VNTC9FNU1ieGp4THpsYU5CMk1cclxuIgorIlY1OWNCTmdzZ0EzNUNPREFVRjR4T3lvU2ZaR3FHMVJiOXFRcnYxRTZKejU2ZEc4U3NLRjNIcW5EanhpUE9WQk5cclxuIgorIkZCblZKK0VDZ1lFQTI5TWhBc0tNbTRYcUJVS3A2cElNRlRnbS9zMUU1dnhpZzcwdnFJaUwrZ3V2QmhoUTd6czFcclxuIgorIjhVTVROWFpvTUVMTm9CL2V2OWZOMENqYzFWcjQ2Yi94L3lEdzd3TWI5NmkrdnpFTk96dTRSSFdpM09XcENQYnBcclxuIgorInFCS0VpM2h6TjhNK0J1bFBYOENEUXgzYUxScmZ4dzUxSjVFdUEwTmV5Ym5nYkl0Z3hUaTB1NmtDZ1lFQTF6cjBcclxuIgorIjZQNVlkT2hZSHRTV0Rsa2VENDlNQXBjVnV6YUhuc0haVkFoVXF1M1J3aXk5TFJhSkxaZnI3ZlFEYjlEWUpiWnBcclxuIgorInN4VFJMRzZMU0Fjc1I3bXcrbStHdk5xR3QvOXBTcWJ0VytML1Z3VldTeUYrWVlrbHhaVUQzVUFBeXJEVmNERUNcclxuIgorImE1UytqYWQ0Q3NpL2xWSHQ1dWxXSWNrV0wxZkp2YWRuNXViS05EY0NnWUErNzF4VkdQUCtsc0ZnVGl5dGZyQzhcclxuIgorIjVuMnJsNE14aW5KOSt3MEkrRWJ6Q0tOTVlHdlRnaVU0ZEphc1NNRWRpQktzMUZNR283ZEY4RjBCTEhGMUlzSWFcclxuIgorIjVBaDJ0WEl0WG45MTU0bzlPaVRRWE1tSzZxbVJhbmVNNmZoT29lYUN3WUFocEd4WUlwcXgvWHI0VE9oaWFnNDZcclxuIgorImpNTWFwaEFlT3Z3NHQxSzJSRHppT1FLQmdRQ3lQQ0NVMGd4dXcvbzFqZGEyQ3hiWnk5RW1VL2VyRVgwOSswbitcclxuIgorIlRPZlFwU0VQcS96OVdheEFGWTlMZnNkWjBaa3RvZUhtYTFiTmRMM2k2QTNEV0FNM1lTUXpRTVJQbXpPV25xWHhcclxuIgorImNnb0NCbWx2emt6YWVMak81cGhNb0xRSEptbWFmdnVDRzZ1eG92M0Y4SGkzTHlIVUYyYzhrMG5MNnVjbUozdmpcclxuIgorInV6dTRBUUtCZ0JTQVNNQUpTNjNNOVVKQjFFYXp5MnYyTld3MDRDbXpOeFVmV3JIdUtwZC9DMmlrNFFLdTBzUk9cclxuIgorInI5S25rRGd4eEVoakRtN2xYaGxXMTJQVTQyeU9Sc3Q1STNFYWExQ2ZpNEtQRm4vb3p0K2lOQllyemQ4VHl2bmJcclxuIgorInFrZEVDbDArRzJGby9FUjROUkN2N2EyNFdORXNPTUd6R1JxdzVjblNKcmpiWkxZTWFJeUtcclxuIgorIi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tXHJcbiI7CisKK2NoYXIgdGVzdF9jbGlfY3J0W10gPQorIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxyXG4iCisiTUlJRFBUQ0NBaVdnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkZNUXN3Q1FZRFZRUUdFd0pHVWpFT1xyXG4iCisiTUF3R0ExVUVCeE1GVUdGeWFYTXhEakFNQmdOVkJBb1RCVmg1VTFOTU1SWXdGQVlEVlFRREV3MVllVk5UVENCVVxyXG4iCisiWlhOMElFTkJNQjRYRFRBM01EY3dOekExTURFeU1Gb1hEVEE0TURjd05qQTFNREV5TUZvd01ERUxNQWtHQTFVRVxyXG4iCisiQmhNQ1JsSXhEakFNQmdOVkJBb1RCVmg1VTFOTU1SRXdEd1lEVlFRREV3aEtiMlVnVlhObGNqQ0NBU0l3RFFZSlxyXG4iCisiS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS1prZzhBTmw2a0dtTEdxS2M2S1VIYjlJc1p3YjIrS1xyXG4iCisiakJ3ODNRYjBLdXZQVm51M016RWNYRnZPWjgzZzBQTC96OG9iNVBLcjhIUDZiVll6aHNENjVpbWNDREVFVlBrMlxyXG4iCisiOXIwWEdUZ2dHakI2MDFGZDhhVFNoVVdFNE5Mckt3NllOWFRYZ1ROZHZoSE54WHdxbWROVkxrbVpqajNad1lVY1xyXG4iCisiY0VFOGVFNWpIczhjTURYSkxNQ3dnS0lNN1NheDIyT2hTSFFIS3dpZlZPNC9GZHc1RytTdXlzOFBoTVgyakRYTVxyXG4iCisiSUNGd3E4bGQrYlpHb05VdGdwNDhGV2hBTWZKeVRFYUhoOUxDNDZLa3FHU0RSSXp4Ny80Y1BCNlFxcnB6Sk4wb1xyXG4iCisiS3I4a0g3dmRSRFRGRG1PMjNENEM1bDBCdy8yYUM3NkRoRUpwQjJiR0E0aUlzekpzK0YvUElMOENBd0VBQWFOTlxyXG4iCisiTUVzd0NRWURWUjBUQkFJd0FEQWRCZ05WSFE0RUZnUVVpV1gxSXZqUmRZR3Qweno1U3ExNngwMWswbzR3SHdZRFxyXG4iCisiVlIwakJCZ3dGb0FVdk80Zm1PajZLNFBrcEgxZXczVnlrekhaTW1jd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQlxyXG4iCisiQUdkcUQ3VlRoSm1DK29lZU1VSGsyVFFYMndaTlUrR3NDK1JManRsZW5ja255OTVLbmxqR3ZNdEN6bnlMa1M1RFxyXG4iCisiZkFqTEtmUjFObzhwazVnUmRzY3FneUl1UXg1V25ITnY0UUJabU1zbXZESUN4elJRYXh1UEZIYlM0YUxYbGRlTFxyXG4iCisieU9XbTVaNHFrTUhwQ0t2QTg2YmxZc0Vra3NHRFY0N2ZGOVprT1E4bmtoN1o0ZVk0LzVUd3FUWTcyd3c1ZzROTFxyXG4iCisiNkRadFdwY3BHYlg5OU5SYU5WemNxOUQrRWx4a2dIbkg0WVdhZk9LQmNsU2dxcnV0YlJMaTJ1WngvUXB2dUYraVxyXG4iCisic1ViZStIRlBNV3dVNWxCdi9vT2hRa3owVkQrSHVzWXRYV1MybEc4OGNUNDBhTmx5MkNrWVV1Z2RUUi9iOVVlYVxyXG4iCisicC9pODYyc0wvbE80MHFsUTB4VjVON1U9XHJcbiIKKyItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXHJcbiI7CisKK2NoYXIgdGVzdF9jbGlfa2V5W10gPQorIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cclxuIgorIk1JSUVvd0lCQUFLQ0FRRUFwbVNEd0EyWHFRYVlzYW9wem9wUWR2MGl4bkJ2YjRxTUhEemRCdlFxNjg5V2U3Y3pcclxuIgorIk1SeGNXODVuemVEUTh2L1B5aHZrOHF2d2MvcHRWak9Hd1BybUtad0lNUVJVK1RiMnZSY1pPQ0FhTUhyVFVWM3hcclxuIgorInBOS0ZSWVRnMHVzckRwZzFkTmVCTTEyK0VjM0ZmQ3FaMDFVdVNabU9QZG5CaFJ4d1FUeDRUbU1lenh3d05ja3NcclxuIgorIndMQ0FvZ3p0SnJIYlk2RklkQWNyQ0o5VTdqOFYzRGtiNUs3S3p3K0V4ZmFNTmN3Z0lYQ3J5VjM1dGthZzFTMkNcclxuIgorIm5qd1ZhRUF4OG5KTVJvZUgwc0xqb3FTb1pJTkVqUEh2L2h3OEhwQ3F1bk1rM1NncXZ5UWZ1OTFFTk1VT1k3YmNcclxuIgorIlBnTG1YUUhEL1pvTHZvT0VRbWtIWnNZRGlJaXpNbXo0WDg4Z3Z3SURBUUFCQW9JQkFFMG5Ca0FqRFZOK2o0YXhcclxuIgorIjFEakV3WktxeFZrbUFVWERCRHlEckNqeFJvV1kyZ3o3WVcxQUxVTVViZVYwZk81djF6VnJ3YmtVS0taZVZCeElcclxuIgorIlFBOXpSdzI4SDhBNnRmdm9sSGdSSWN4NGRpeE1oM2VQQytEVkRKNnpnbHZLVjJpcEF3QnVmS1lJclgwcjRJbzJcclxuIgorIlpxVXJOZzlDZUVZTmxrSFdjZWFOMTJyaFl3TzgycGdIeG5CMXA1cEk0MnBZN2x6eUxnU2RkZjVuK001VUJPSklcclxuIgorImdzTkNrdmJHZHY3V1FQVkZUUkRpUmdFbkNKM3JJOG9QU0s2TU9VV0p3M3JoMmhia3grZXg4TlB2RUtiekVYaVVcclxuIgorInA1ajFBbGJISVdQNXNZQmJBMVl2aUZ0cnlBVjRmeWZMY1dQZm9xYTMzT296b2ZqbHdvajBBaXh6KzZyZXJMalpcclxuIgorImNwVFNyQUVDZ1lFQTJvQ2ZmVW82SEgzTHE5b2VXaEZDb095RzNZalptRnJKYUp3akhudnJvWDkvcFhIcVlLb2dcclxuIgorIlRlaGNqVUpCdEZadzBrbGNldFliWkNGcVQ4djluZjB1UGxnYWlWR0N0WGYxTVNiRlhEVUZLa1lCaUZ3emRXTVRcclxuIgorIllzbXZoZmY4MmpNV1o4ZWNzWFR5RFJsODU4U1I1V1BaNTJxRXNDYzVYMnVuN1FFTm02RnRWVDhDZ1lFQXd2S1NcclxuIgorInpRTnp1b0pFVHFaWDdBYWxtSzNKTThGZGFtK1FtNUxOTWNidmhiS3dJOEhLTVMxVk11cWFSMFhkQVgvaU1YQXhcclxuIgorIlAxVmhTc21vU0Ric01weEJFWklwdHBDZW4vR2NxY3RJVHhBTlRha3JCSHhxYjJhUTVFRXU3U3pnZkhaV3NlMy9cclxuIgorInZRRXlmY0ZUQmxQSWRjWlVEems0L3c3V215aXZwWXRDV29BaDFJRUNnWUVBMFVZWisxVUpmVnBhcFJqK3N3TVBcclxuIgorIkRyUWJvN2k3dDdsVWFGWUxLTnBGWDJPUExUV0M1dHhxbmxPcnVUdTVWSERxRSs1aG5lRE5VVVRUM3VPZzRCMnFcclxuIgorIm1kbW1hTmpoMk02d3owZTBCVkZleGhOUXlucU1hcVRlMzJJT004REZzM0wweGFjZ2c3SmZWbjZQN0NlUUdPVmVcclxuIgorIndjOTZrSUN3Nlp4aHRKU3FwT0dpcHQ4Q2dZQkkvMFB3K0lYeEpLNG5OU3BlK3U0dkNZUDVtVUk5aEtFRllDYnRcclxuIgorInFLd3Z5QVVrbm4vemdpSVErci9pU0VyRk1QbWx3WGp2V2kwZ0wvcVBiK0ZwNGhDTFg4dTJ6TmhZMDhQeDRHaW5cclxuIgorIkVqK3BBTnRXeHEra0h5ZktFSTVkeVJ3Vi9zbmZ2bHF3ank0MDRKc1NGM1ZNaElNZFlEUHpiYjcyUW5uaTV3NWxcclxuIgorImpPMGVBUUtCZ0JxdDlqSk1kMUpkcGVtQzJkbTBCdXVESXoyaDMvTUgrQ01qZmFETGVuVnBLeWtuMTdCNk45MmhcclxuIgorImtsTWVzcUszUlF6REd3YXVEdzQzMUxRdzBSNjlvbm45ZkNNM3dKdzJ5RUM2d0M5c0Y4SThoc05aYnQ2NHlaaFpcclxuIgorIjRCaTJZUlRpSGhwRXVCcUtsaEhMREZIbmVvM1NNWWg4UFUvUERRUWN5V0dISFVpOXoxUkVcclxuIgorIi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tXHJcbiI7CisKK2NoYXIgeHlzc2xfY2FfY3J0W10gPQorIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxyXG4iCisiTUlJRUFEQ0NBdWlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaFxyXG4iCisiTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNUlFZHliM1Z3TENCSmJtTXVNVEV3THdZRFZRUUxFeWhIYnlCRVxyXG4iCisiWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTBNRFl5T1RFM1xyXG4iCisiTURZeU1Gb1hEVE0wTURZeU9URTNNRFl5TUZvd1l6RUxNQWtHQTFVRUJoTUNWVk14SVRBZkJnTlZCQW9UR0ZSb1xyXG4iCisiWlNCSGJ5QkVZV1JrZVNCSGNtOTFjQ3dnU1c1akxqRXhNQzhHQTFVRUN4TW9SMjhnUkdGa1pIa2dRMnhoYzNNZ1xyXG4iCisiTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNBd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFTlxyXG4iCisiQURDQ0FRZ0NnZ0VCQU42ZDErcFhHRW1oVyt2WFgwaUc2cjdkLytUdlp4ejBaV2l6VjNHZ1huZTc3WnRKNlhDQVxyXG4iCisiUFZZWVl3aHYydkxNMEQ5L0FsUWlWQkRZc29IVXdIVTlTMy9IZDhNK2VLc2FBN1VnYXk5cUs3SEZpSDdFdXg2d1xyXG4iCisid2RoRkoyK3FOMWozaHliWDJDMzJxUmUzSDNJMlRxWVhQMldZa3RzcWJsMmkvb2pnQzk1LzVZMFY0ZXZMT3RYaVxyXG4iCisiRXFJVExkaU9yMThTUGFBSUJRaTJYS1ZsT0FSRm1SNmpZR0IweFVHbGNtSWJZc1VmYjE4YVFyNENVV1dvcmlNWVxyXG4iCisiYXZ4NEE2bE5mNEREK3F0YS9LRkFwTW9aRnY2eXlPOWVjdzN1ZDcyYTlubVl2TEVIWjZJVkRkMmdXTVpFZXdvK1xyXG4iCisiWWloZnVrRUhVMWpQRVg0NGRNWDQvN1Zwa0krRWRPcVhHNjhDQVFPamdjQXdnYjB3SFFZRFZSME9CQllFRk5MRVxyXG4iCisic05LUjFFd1JjYk5oeXoyaC90Mm9hdFRqTUlHTkJnTlZIU01FZ1lVd2dZS0FGTkxFc05LUjFFd1JjYk5oeXoyaFxyXG4iCisiL3Qyb2F0VGpvV2VrWlRCak1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNVxyXG4iCisiSUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwWm1salxyXG4iCisiWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRFxyXG4iCisiZ2dFQkFESkw4N0xLUHBIOEVzYWhCNHlPZDZBekJoUmNrQjRZOXdpbVBRb1orWWVBRVc1cDVKWVhNUDgwa1dOeVxyXG4iCisiT083TUhBR2pIWlFvcERIMmVzUlUxL2JsTVZnRG9zek9ZdHVVUlhPMXYwWEpKTFhWZ2dLdEkzbHBqYmkyVGM3UFxyXG4iCisiVE1vekkrZ2NpS3FkaTBGdUZza2c1WW1lelR2YWNQZCttU1lnRkZRbHEyNXpoZWFiSVowS2JJSU9xUGpDRFBvUVxyXG4iCisiSG15Vzc0Y054QTloaTYzdWd5dVYrSTZTaEhJNTZ5RHFnKzJEelpkdUNMenJUaWEyY3l2azAvWk0vaVp4NG1FUlxyXG4iCisiZEVyL1Z4cUhEM1ZJTHM5UmFSZWdBaEpobGRYUlFMSVFUTzdFckJCRHBxV2VDdFdWWXBvTno0aUN4VElNNUN1ZlxyXG4iCisiUmVZTm55aWNzYmtxV2xldE53K3ZIWC9idlo4PVxyXG4iCisiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxyXG4iOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnJhcnkvZGVidWcuYyBiL2xpYnJhcnkvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODYyZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicmFyeS9kZWJ1Zy5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogIERlYnVnZ2luZyByb3V0aW5lcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChYWVNTTF9ERUJVR19DKQorCisjaW5jbHVkZSAieHlzc2wvZGVidWcuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiAhZGVmaW5lZCAgc25wcmludGYKKyNkZWZpbmUgIHNucHJpbnRmICBfc25wcmludGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiAhZGVmaW5lZCB2c25wcmludGYKKyNkZWZpbmUgdnNucHJpbnRmIF92c25wcmludGYKKyNlbmRpZgorCitjaGFyICpkZWJ1Z19mbXQoIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFyZ3A7CisgICAgc3RhdGljIGNoYXIgc3RyWzUxMl07CisgICAgaW50IG1heGxlbiA9IHNpemVvZiggc3RyICkgLSAxOworCisgICAgdmFfc3RhcnQoIGFyZ3AsIGZvcm1hdCApOworICAgIHZzbnByaW50Ziggc3RyLCBtYXhsZW4sIGZvcm1hdCwgYXJncCApOworICAgIHZhX2VuZCggYXJncCApOworCisgICAgc3RyW21heGxlbl0gPSAnXDAnOworICAgIHJldHVybiggc3RyICk7Cit9CisKK3ZvaWQgZGVidWdfcHJpbnRfbXNnKCBzc2xfY29udGV4dCAqc3NsLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKnRleHQgKQoreworICAgIGNoYXIgc3RyWzUxMl07CisgICAgaW50IG1heGxlbiA9IHNpemVvZiggc3RyICkgLSAxOworCisgICAgaWYoIHNzbC0+Zl9kYmcgPT0gTlVMTCApCisgICAgICAgIHJldHVybjsKKworICAgIHNucHJpbnRmKCBzdHIsIG1heGxlbiwgIiVzKCUwNGQpOiAlc1xuIiwgZmlsZSwgbGluZSwgdGV4dCApOworICAgIHN0clttYXhsZW5dID0gJ1wwJzsKKyAgICBzc2wtPmZfZGJnKCBzc2wtPnBfZGJnLCBsZXZlbCwgc3RyICk7Cit9CisKK3ZvaWQgZGVidWdfcHJpbnRfcmV0KCBzc2xfY29udGV4dCAqc3NsLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKnRleHQsIGludCByZXQgKQoreworICAgIGNoYXIgc3RyWzUxMl07CisgICAgaW50IG1heGxlbiA9IHNpemVvZiggc3RyICkgLSAxOworCisgICAgaWYoIHNzbC0+Zl9kYmcgPT0gTlVMTCApCisgICAgICAgIHJldHVybjsKKworICAgIHNucHJpbnRmKCBzdHIsIG1heGxlbiwgIiVzKCUwNGQpOiAlcygpIHJldHVybmVkICVkICgweCV4KVxuIiwKKyAgICAgICAgICAgICAgZmlsZSwgbGluZSwgdGV4dCwgcmV0LCByZXQgKTsKKworICAgIHN0clttYXhsZW5dID0gJ1wwJzsKKyAgICBzc2wtPmZfZGJnKCBzc2wtPnBfZGJnLCBsZXZlbCwgc3RyICk7Cit9CisKK3ZvaWQgZGVidWdfcHJpbnRfYnVmKCBzc2xfY29udGV4dCAqc3NsLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuICkKK3sKKyAgICBjaGFyIHN0cls1MTJdOworICAgIGludCBpLCBtYXhsZW4gPSBzaXplb2YoIHN0ciApIC0gMTsKKworICAgIGlmKCBzc2wtPmZfZGJnID09IE5VTEwgfHwgbGVuIDwgMCApCisgICAgICAgIHJldHVybjsKKworICAgIHNucHJpbnRmKCBzdHIsIG1heGxlbiwgIiVzKCUwNGQpOiBkdW1waW5nICclcycgKCVkIGJ5dGVzKVxuIiwKKyAgICAgICAgICAgICAgZmlsZSwgbGluZSwgdGV4dCwgbGVuICk7CisKKyAgICBzdHJbbWF4bGVuXSA9ICdcMCc7CisgICAgc3NsLT5mX2RiZyggc3NsLT5wX2RiZywgbGV2ZWwsIHN0ciApOworCisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBpID49IDQwOTYgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYoIGkgJSAxNiA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGkgPiAwICkKKyAgICAgICAgICAgICAgICBzc2wtPmZfZGJnKCBzc2wtPnBfZGJnLCBsZXZlbCwgIlxuIiApOworCisgICAgICAgICAgICBzbnByaW50Ziggc3RyLCBtYXhsZW4sICIlcyglMDRkKTogJTA0eDogIiwgZmlsZSwgbGluZSwgaSApOworCisgICAgICAgICAgICBzdHJbbWF4bGVuXSA9ICdcMCc7CisgICAgICAgICAgICBzc2wtPmZfZGJnKCBzc2wtPnBfZGJnLCBsZXZlbCwgc3RyICk7CisgICAgICAgIH0KKworICAgICAgICBzbnByaW50Ziggc3RyLCBtYXhsZW4sICIgJTAyeCIsICh1bnNpZ25lZCBpbnQpIGJ1ZltpXSApOworCisgICAgICAgIHN0clttYXhsZW5dID0gJ1wwJzsKKyAgICAgICAgc3NsLT5mX2RiZyggc3NsLT5wX2RiZywgbGV2ZWwsIHN0ciApOworICAgIH0KKworICAgIGlmKCBsZW4gPiAwICkKKyAgICAgICAgc3NsLT5mX2RiZyggc3NsLT5wX2RiZywgbGV2ZWwsICJcbiIgKTsKK30KKwordm9pZCBkZWJ1Z19wcmludF9tcGkoIHNzbF9jb250ZXh0ICpzc2wsIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqdGV4dCwgbXBpICpYICkKK3sKKyAgICBjaGFyIHN0cls1MTJdOworICAgIGludCBpLCBqLCBrLCBuLCBtYXhsZW4gPSBzaXplb2YoIHN0ciApIC0gMTsKKworICAgIGlmKCBzc2wtPmZfZGJnID09IE5VTEwgfHwgWCA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yKCBuID0gWC0+biAtIDE7IG4gPj0gMDsgbi0tICkKKyAgICAgICAgaWYoIFgtPnBbbl0gIT0gMCApCisgICAgICAgICAgICBicmVhazsKKworICAgIHNucHJpbnRmKCBzdHIsIG1heGxlbiwgIiVzKCUwNGQpOiB2YWx1ZSBvZiAnJXMnICglZCBiaXRzKSBpczpcbiIsCisgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIHRleHQsICgobiArIDEpICogc2l6ZW9mKCB0X2ludCApKSA8PCAzICk7CisKKyAgICBzdHJbbWF4bGVuXSA9ICdcMCc7CisgICAgc3NsLT5mX2RiZyggc3NsLT5wX2RiZywgbGV2ZWwsIHN0ciApOworCisgICAgZm9yKCBpID0gbiwgaiA9IDA7IGkgPj0gMDsgaS0tLCBqKysgKQorICAgIHsKKyAgICAgICAgaWYoIGogJSAoIDE2IC8gc2l6ZW9mKCB0X2ludCApICkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBqID4gMCApCisgICAgICAgICAgICAgICAgc3NsLT5mX2RiZyggc3NsLT5wX2RiZywgbGV2ZWwsICJcbiIgKTsKKworICAgICAgICAgICAgc25wcmludGYoIHN0ciwgbWF4bGVuLCAiJXMoJTA0ZCk6ICIsIGZpbGUsIGxpbmUgKTsKKworICAgICAgICAgICAgc3RyW21heGxlbl0gPSAnXDAnOworICAgICAgICAgICAgc3NsLT5mX2RiZyggc3NsLT5wX2RiZywgbGV2ZWwsIHN0ciApOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBrID0gc2l6ZW9mKCB0X2ludCApIC0gMTsgayA+PSAwOyBrLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Ziggc3RyLCBtYXhsZW4sICIgJTAyeCIsICh1bnNpZ25lZCBpbnQpCisgICAgICAgICAgICAgICAgICAgICAgKCBYLT5wW2ldID4+IChrIDw8IDMpICkgJiAweEZGICk7CisKKyAgICAgICAgICAgIHN0clttYXhsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIHNzbC0+Zl9kYmcoIHNzbC0+cF9kYmcsIGxldmVsLCBzdHIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNzbC0+Zl9kYmcoIHNzbC0+cF9kYmcsIGxldmVsLCAiXG4iICk7Cit9CisKK3ZvaWQgZGVidWdfcHJpbnRfY3J0KCBzc2xfY29udGV4dCAqc3NsLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKnRleHQsIHg1MDlfY2VydCAqY3J0ICkKK3sKKyAgICBjaGFyIHN0cls1MTJdLCBwcmVmaXhbNjRdLCAqcDsKKyAgICBpbnQgaSA9IDAsIG1heGxlbiA9IHNpemVvZiggcHJlZml4ICkgLSAxOworCisgICAgaWYoIHNzbC0+Zl9kYmcgPT0gTlVMTCB8fCBjcnQgPT0gTlVMTCApCisgICAgICAgIHJldHVybjsKKworICAgIHNucHJpbnRmKCBwcmVmaXgsIG1heGxlbiwgIiVzKCUwNGQpOiAiLCBmaWxlLCBsaW5lICk7CisgICAgcHJlZml4W21heGxlbl0gPSAnXDAnOworICAgIG1heGxlbiA9IHNpemVvZiggc3RyICkgLSAxOworCisgICAgd2hpbGUoIGNydCAhPSBOVUxMICYmIGNydC0+bmV4dCAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHAgPSB4NTA5cGFyc2VfY2VydF9pbmZvKCBwcmVmaXgsIGNydCApOworCisgICAgICAgIHNucHJpbnRmKCBzdHIsIG1heGxlbiwgIiVzKCUwNGQpOiAlcyAjJWQ6XG4lcyIsCisgICAgICAgICAgICAgICAgICBmaWxlLCBsaW5lLCB0ZXh0LCArK2ksIHAgKTsKKworICAgICAgICBzdHJbbWF4bGVuXSA9ICdcMCc7CisgICAgICAgIHNzbC0+Zl9kYmcoIHNzbC0+cF9kYmcsIGxldmVsLCBzdHIgKTsKKworICAgICAgICBkZWJ1Z19wcmludF9tcGkoIHNzbCwgbGV2ZWwsIGZpbGUsIGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNydC0+cnNhLk4iLCAmY3J0LT5yc2EuTiApOworCisgICAgICAgIGRlYnVnX3ByaW50X21waSggc3NsLCBsZXZlbCwgZmlsZSwgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY3J0LT5yc2EuRSIsICZjcnQtPnJzYS5FICk7CisKKyAgICAgICAgY3J0ID0gY3J0LT5uZXh0OworICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJyYXJ5L2Rlcy5jIGIvbGlicmFyeS9kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWMwMjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicmFyeS9kZXMuYwpAQCAtMCwwICsxLDg3NiBAQAorLyoKKyAqICBGSVBTLTQ2LTMgY29tcGxpYW50IFRyaXBsZS1ERVMgaW1wbGVtZW50YXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisvKgorICogIERFUywgb24gd2hpY2ggVERFUyBpcyBiYXNlZCwgd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgYnkgSG9yc3QgRmVpc3RlbAorICogIGF0IElCTSBpbiAxOTc0LCBhbmQgd2FzIGFkb3B0ZWQgYXMgYSBzdGFuZGFyZCBieSBOSVNUIChmb3JtZXJseSBOQlMpLgorICoKKyAqICBodHRwOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZmlwcy9maXBzNDYtMy9maXBzNDYtMy5wZGYKKyAqLworCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFhZU1NMX0RFU19DKQorCisjaW5jbHVkZSAieHlzc2wvZGVzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIDMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbiBtYWNyb3MgKGJpZyBlbmRpYW4pCisgKi8KKyNpZm5kZWYgR0VUX1VMT05HX0JFCisjZGVmaW5lIEdFVF9VTE9OR19CRShuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuKSA9ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgICAgXSA8PCAyNCApICAgICAgICBcCisgICAgICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDFdIDw8IDE2ICkgICAgICAgIFwKKyAgICAgICAgfCAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICsgMl0gPDwgIDggKSAgICAgICAgXAorICAgICAgICB8ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgKyAzXSAgICAgICApOyAgICAgICBcCit9CisjZW5kaWYKKworI2lmbmRlZiBQVVRfVUxPTkdfQkUKKyNkZWZpbmUgUFVUX1VMT05HX0JFKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGIpWyhpKSAgICBdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+IDI0ICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgMV0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gMTYgKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAgOCApOyAgICAgICBcCisgICAgKGIpWyhpKSArIDNdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pICAgICAgICk7ICAgICAgIFwKK30KKyNlbmRpZgorCisvKgorICogRXhwYW5kZWQgREVTIFMtYm94ZXMKKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU0IxWzY0XSA9Cit7CisgICAgMHgwMTAxMDQwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMDAwMCwgMHgwMTAxMDQwNCwKKyAgICAweDAxMDEwMDA0LCAweDAwMDEwNDA0LCAweDAwMDAwMDA0LCAweDAwMDEwMDAwLAorICAgIDB4MDAwMDA0MDAsIDB4MDEwMTA0MDAsIDB4MDEwMTA0MDQsIDB4MDAwMDA0MDAsCisgICAgMHgwMTAwMDQwNCwgMHgwMTAxMDAwNCwgMHgwMTAwMDAwMCwgMHgwMDAwMDAwNCwKKyAgICAweDAwMDAwNDA0LCAweDAxMDAwNDAwLCAweDAxMDAwNDAwLCAweDAwMDEwNDAwLAorICAgIDB4MDAwMTA0MDAsIDB4MDEwMTAwMDAsIDB4MDEwMTAwMDAsIDB4MDEwMDA0MDQsCisgICAgMHgwMDAxMDAwNCwgMHgwMTAwMDAwNCwgMHgwMTAwMDAwNCwgMHgwMDAxMDAwNCwKKyAgICAweDAwMDAwMDAwLCAweDAwMDAwNDA0LCAweDAwMDEwNDA0LCAweDAxMDAwMDAwLAorICAgIDB4MDAwMTAwMDAsIDB4MDEwMTA0MDQsIDB4MDAwMDAwMDQsIDB4MDEwMTAwMDAsCisgICAgMHgwMTAxMDQwMCwgMHgwMTAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMDAwMDQwMCwKKyAgICAweDAxMDEwMDA0LCAweDAwMDEwMDAwLCAweDAwMDEwNDAwLCAweDAxMDAwMDA0LAorICAgIDB4MDAwMDA0MDAsIDB4MDAwMDAwMDQsIDB4MDEwMDA0MDQsIDB4MDAwMTA0MDQsCisgICAgMHgwMTAxMDQwNCwgMHgwMDAxMDAwNCwgMHgwMTAxMDAwMCwgMHgwMTAwMDQwNCwKKyAgICAweDAxMDAwMDA0LCAweDAwMDAwNDA0LCAweDAwMDEwNDA0LCAweDAxMDEwNDAwLAorICAgIDB4MDAwMDA0MDQsIDB4MDEwMDA0MDAsIDB4MDEwMDA0MDAsIDB4MDAwMDAwMDAsCisgICAgMHgwMDAxMDAwNCwgMHgwMDAxMDQwMCwgMHgwMDAwMDAwMCwgMHgwMTAxMDAwNAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU0IyWzY0XSA9Cit7CisgICAgMHg4MDEwODAyMCwgMHg4MDAwODAwMCwgMHgwMDAwODAwMCwgMHgwMDEwODAyMCwKKyAgICAweDAwMTAwMDAwLCAweDAwMDAwMDIwLCAweDgwMTAwMDIwLCAweDgwMDA4MDIwLAorICAgIDB4ODAwMDAwMjAsIDB4ODAxMDgwMjAsIDB4ODAxMDgwMDAsIDB4ODAwMDAwMDAsCisgICAgMHg4MDAwODAwMCwgMHgwMDEwMDAwMCwgMHgwMDAwMDAyMCwgMHg4MDEwMDAyMCwKKyAgICAweDAwMTA4MDAwLCAweDAwMTAwMDIwLCAweDgwMDA4MDIwLCAweDAwMDAwMDAwLAorICAgIDB4ODAwMDAwMDAsIDB4MDAwMDgwMDAsIDB4MDAxMDgwMjAsIDB4ODAxMDAwMDAsCisgICAgMHgwMDEwMDAyMCwgMHg4MDAwMDAyMCwgMHgwMDAwMDAwMCwgMHgwMDEwODAwMCwKKyAgICAweDAwMDA4MDIwLCAweDgwMTA4MDAwLCAweDgwMTAwMDAwLCAweDAwMDA4MDIwLAorICAgIDB4MDAwMDAwMDAsIDB4MDAxMDgwMjAsIDB4ODAxMDAwMjAsIDB4MDAxMDAwMDAsCisgICAgMHg4MDAwODAyMCwgMHg4MDEwMDAwMCwgMHg4MDEwODAwMCwgMHgwMDAwODAwMCwKKyAgICAweDgwMTAwMDAwLCAweDgwMDA4MDAwLCAweDAwMDAwMDIwLCAweDgwMTA4MDIwLAorICAgIDB4MDAxMDgwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDgwMDAsIDB4ODAwMDAwMDAsCisgICAgMHgwMDAwODAyMCwgMHg4MDEwODAwMCwgMHgwMDEwMDAwMCwgMHg4MDAwMDAyMCwKKyAgICAweDAwMTAwMDIwLCAweDgwMDA4MDIwLCAweDgwMDAwMDIwLCAweDAwMTAwMDIwLAorICAgIDB4MDAxMDgwMDAsIDB4MDAwMDAwMDAsIDB4ODAwMDgwMDAsIDB4MDAwMDgwMjAsCisgICAgMHg4MDAwMDAwMCwgMHg4MDEwMDAyMCwgMHg4MDEwODAyMCwgMHgwMDEwODAwMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU0IzWzY0XSA9Cit7CisgICAgMHgwMDAwMDIwOCwgMHgwODAyMDIwMCwgMHgwMDAwMDAwMCwgMHgwODAyMDAwOCwKKyAgICAweDA4MDAwMjAwLCAweDAwMDAwMDAwLCAweDAwMDIwMjA4LCAweDA4MDAwMjAwLAorICAgIDB4MDAwMjAwMDgsIDB4MDgwMDAwMDgsIDB4MDgwMDAwMDgsIDB4MDAwMjAwMDAsCisgICAgMHgwODAyMDIwOCwgMHgwMDAyMDAwOCwgMHgwODAyMDAwMCwgMHgwMDAwMDIwOCwKKyAgICAweDA4MDAwMDAwLCAweDAwMDAwMDA4LCAweDA4MDIwMjAwLCAweDAwMDAwMjAwLAorICAgIDB4MDAwMjAyMDAsIDB4MDgwMjAwMDAsIDB4MDgwMjAwMDgsIDB4MDAwMjAyMDgsCisgICAgMHgwODAwMDIwOCwgMHgwMDAyMDIwMCwgMHgwMDAyMDAwMCwgMHgwODAwMDIwOCwKKyAgICAweDAwMDAwMDA4LCAweDA4MDIwMjA4LCAweDAwMDAwMjAwLCAweDA4MDAwMDAwLAorICAgIDB4MDgwMjAyMDAsIDB4MDgwMDAwMDAsIDB4MDAwMjAwMDgsIDB4MDAwMDAyMDgsCisgICAgMHgwMDAyMDAwMCwgMHgwODAyMDIwMCwgMHgwODAwMDIwMCwgMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMjAwLCAweDAwMDIwMDA4LCAweDA4MDIwMjA4LCAweDA4MDAwMjAwLAorICAgIDB4MDgwMDAwMDgsIDB4MDAwMDAyMDAsIDB4MDAwMDAwMDAsIDB4MDgwMjAwMDgsCisgICAgMHgwODAwMDIwOCwgMHgwMDAyMDAwMCwgMHgwODAwMDAwMCwgMHgwODAyMDIwOCwKKyAgICAweDAwMDAwMDA4LCAweDAwMDIwMjA4LCAweDAwMDIwMjAwLCAweDA4MDAwMDA4LAorICAgIDB4MDgwMjAwMDAsIDB4MDgwMDAyMDgsIDB4MDAwMDAyMDgsIDB4MDgwMjAwMDAsCisgICAgMHgwMDAyMDIwOCwgMHgwMDAwMDAwOCwgMHgwODAyMDAwOCwgMHgwMDAyMDIwMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU0I0WzY0XSA9Cit7CisgICAgMHgwMDgwMjAwMSwgMHgwMDAwMjA4MSwgMHgwMDAwMjA4MSwgMHgwMDAwMDA4MCwKKyAgICAweDAwODAyMDgwLCAweDAwODAwMDgxLCAweDAwODAwMDAxLCAweDAwMDAyMDAxLAorICAgIDB4MDAwMDAwMDAsIDB4MDA4MDIwMDAsIDB4MDA4MDIwMDAsIDB4MDA4MDIwODEsCisgICAgMHgwMDAwMDA4MSwgMHgwMDAwMDAwMCwgMHgwMDgwMDA4MCwgMHgwMDgwMDAwMSwKKyAgICAweDAwMDAwMDAxLCAweDAwMDAyMDAwLCAweDAwODAwMDAwLCAweDAwODAyMDAxLAorICAgIDB4MDAwMDAwODAsIDB4MDA4MDAwMDAsIDB4MDAwMDIwMDEsIDB4MDAwMDIwODAsCisgICAgMHgwMDgwMDA4MSwgMHgwMDAwMDAwMSwgMHgwMDAwMjA4MCwgMHgwMDgwMDA4MCwKKyAgICAweDAwMDAyMDAwLCAweDAwODAyMDgwLCAweDAwODAyMDgxLCAweDAwMDAwMDgxLAorICAgIDB4MDA4MDAwODAsIDB4MDA4MDAwMDEsIDB4MDA4MDIwMDAsIDB4MDA4MDIwODEsCisgICAgMHgwMDAwMDA4MSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDgwMjAwMCwKKyAgICAweDAwMDAyMDgwLCAweDAwODAwMDgwLCAweDAwODAwMDgxLCAweDAwMDAwMDAxLAorICAgIDB4MDA4MDIwMDEsIDB4MDAwMDIwODEsIDB4MDAwMDIwODEsIDB4MDAwMDAwODAsCisgICAgMHgwMDgwMjA4MSwgMHgwMDAwMDA4MSwgMHgwMDAwMDAwMSwgMHgwMDAwMjAwMCwKKyAgICAweDAwODAwMDAxLCAweDAwMDAyMDAxLCAweDAwODAyMDgwLCAweDAwODAwMDgxLAorICAgIDB4MDAwMDIwMDEsIDB4MDAwMDIwODAsIDB4MDA4MDAwMDAsIDB4MDA4MDIwMDEsCisgICAgMHgwMDAwMDA4MCwgMHgwMDgwMDAwMCwgMHgwMDAwMjAwMCwgMHgwMDgwMjA4MAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU0I1WzY0XSA9Cit7CisgICAgMHgwMDAwMDEwMCwgMHgwMjA4MDEwMCwgMHgwMjA4MDAwMCwgMHg0MjAwMDEwMCwKKyAgICAweDAwMDgwMDAwLCAweDAwMDAwMTAwLCAweDQwMDAwMDAwLCAweDAyMDgwMDAwLAorICAgIDB4NDAwODAxMDAsIDB4MDAwODAwMDAsIDB4MDIwMDAxMDAsIDB4NDAwODAxMDAsCisgICAgMHg0MjAwMDEwMCwgMHg0MjA4MDAwMCwgMHgwMDA4MDEwMCwgMHg0MDAwMDAwMCwKKyAgICAweDAyMDAwMDAwLCAweDQwMDgwMDAwLCAweDQwMDgwMDAwLCAweDAwMDAwMDAwLAorICAgIDB4NDAwMDAxMDAsIDB4NDIwODAxMDAsIDB4NDIwODAxMDAsIDB4MDIwMDAxMDAsCisgICAgMHg0MjA4MDAwMCwgMHg0MDAwMDEwMCwgMHgwMDAwMDAwMCwgMHg0MjAwMDAwMCwKKyAgICAweDAyMDgwMTAwLCAweDAyMDAwMDAwLCAweDQyMDAwMDAwLCAweDAwMDgwMTAwLAorICAgIDB4MDAwODAwMDAsIDB4NDIwMDAxMDAsIDB4MDAwMDAxMDAsIDB4MDIwMDAwMDAsCisgICAgMHg0MDAwMDAwMCwgMHgwMjA4MDAwMCwgMHg0MjAwMDEwMCwgMHg0MDA4MDEwMCwKKyAgICAweDAyMDAwMTAwLCAweDQwMDAwMDAwLCAweDQyMDgwMDAwLCAweDAyMDgwMTAwLAorICAgIDB4NDAwODAxMDAsIDB4MDAwMDAxMDAsIDB4MDIwMDAwMDAsIDB4NDIwODAwMDAsCisgICAgMHg0MjA4MDEwMCwgMHgwMDA4MDEwMCwgMHg0MjAwMDAwMCwgMHg0MjA4MDEwMCwKKyAgICAweDAyMDgwMDAwLCAweDAwMDAwMDAwLCAweDQwMDgwMDAwLCAweDQyMDAwMDAwLAorICAgIDB4MDAwODAxMDAsIDB4MDIwMDAxMDAsIDB4NDAwMDAxMDAsIDB4MDAwODAwMDAsCisgICAgMHgwMDAwMDAwMCwgMHg0MDA4MDAwMCwgMHgwMjA4MDEwMCwgMHg0MDAwMDEwMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU0I2WzY0XSA9Cit7CisgICAgMHgyMDAwMDAxMCwgMHgyMDQwMDAwMCwgMHgwMDAwNDAwMCwgMHgyMDQwNDAxMCwKKyAgICAweDIwNDAwMDAwLCAweDAwMDAwMDEwLCAweDIwNDA0MDEwLCAweDAwNDAwMDAwLAorICAgIDB4MjAwMDQwMDAsIDB4MDA0MDQwMTAsIDB4MDA0MDAwMDAsIDB4MjAwMDAwMTAsCisgICAgMHgwMDQwMDAxMCwgMHgyMDAwNDAwMCwgMHgyMDAwMDAwMCwgMHgwMDAwNDAxMCwKKyAgICAweDAwMDAwMDAwLCAweDAwNDAwMDEwLCAweDIwMDA0MDEwLCAweDAwMDA0MDAwLAorICAgIDB4MDA0MDQwMDAsIDB4MjAwMDQwMTAsIDB4MDAwMDAwMTAsIDB4MjA0MDAwMTAsCisgICAgMHgyMDQwMDAxMCwgMHgwMDAwMDAwMCwgMHgwMDQwNDAxMCwgMHgyMDQwNDAwMCwKKyAgICAweDAwMDA0MDEwLCAweDAwNDA0MDAwLCAweDIwNDA0MDAwLCAweDIwMDAwMDAwLAorICAgIDB4MjAwMDQwMDAsIDB4MDAwMDAwMTAsIDB4MjA0MDAwMTAsIDB4MDA0MDQwMDAsCisgICAgMHgyMDQwNDAxMCwgMHgwMDQwMDAwMCwgMHgwMDAwNDAxMCwgMHgyMDAwMDAxMCwKKyAgICAweDAwNDAwMDAwLCAweDIwMDA0MDAwLCAweDIwMDAwMDAwLCAweDAwMDA0MDEwLAorICAgIDB4MjAwMDAwMTAsIDB4MjA0MDQwMTAsIDB4MDA0MDQwMDAsIDB4MjA0MDAwMDAsCisgICAgMHgwMDQwNDAxMCwgMHgyMDQwNDAwMCwgMHgwMDAwMDAwMCwgMHgyMDQwMDAxMCwKKyAgICAweDAwMDAwMDEwLCAweDAwMDA0MDAwLCAweDIwNDAwMDAwLCAweDAwNDA0MDEwLAorICAgIDB4MDAwMDQwMDAsIDB4MDA0MDAwMTAsIDB4MjAwMDQwMTAsIDB4MDAwMDAwMDAsCisgICAgMHgyMDQwNDAwMCwgMHgyMDAwMDAwMCwgMHgwMDQwMDAxMCwgMHgyMDAwNDAxMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU0I3WzY0XSA9Cit7CisgICAgMHgwMDIwMDAwMCwgMHgwNDIwMDAwMiwgMHgwNDAwMDgwMiwgMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwODAwLCAweDA0MDAwODAyLCAweDAwMjAwODAyLCAweDA0MjAwODAwLAorICAgIDB4MDQyMDA4MDIsIDB4MDAyMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDQwMDAwMDIsCisgICAgMHgwMDAwMDAwMiwgMHgwNDAwMDAwMCwgMHgwNDIwMDAwMiwgMHgwMDAwMDgwMiwKKyAgICAweDA0MDAwODAwLCAweDAwMjAwODAyLCAweDAwMjAwMDAyLCAweDA0MDAwODAwLAorICAgIDB4MDQwMDAwMDIsIDB4MDQyMDAwMDAsIDB4MDQyMDA4MDAsIDB4MDAyMDAwMDIsCisgICAgMHgwNDIwMDAwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDgwMiwgMHgwNDIwMDgwMiwKKyAgICAweDAwMjAwODAwLCAweDAwMDAwMDAyLCAweDA0MDAwMDAwLCAweDAwMjAwODAwLAorICAgIDB4MDQwMDAwMDAsIDB4MDAyMDA4MDAsIDB4MDAyMDAwMDAsIDB4MDQwMDA4MDIsCisgICAgMHgwNDAwMDgwMiwgMHgwNDIwMDAwMiwgMHgwNDIwMDAwMiwgMHgwMDAwMDAwMiwKKyAgICAweDAwMjAwMDAyLCAweDA0MDAwMDAwLCAweDA0MDAwODAwLCAweDAwMjAwMDAwLAorICAgIDB4MDQyMDA4MDAsIDB4MDAwMDA4MDIsIDB4MDAyMDA4MDIsIDB4MDQyMDA4MDAsCisgICAgMHgwMDAwMDgwMiwgMHgwNDAwMDAwMiwgMHgwNDIwMDgwMiwgMHgwNDIwMDAwMCwKKyAgICAweDAwMjAwODAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAyLCAweDA0MjAwODAyLAorICAgIDB4MDAwMDAwMDAsIDB4MDAyMDA4MDIsIDB4MDQyMDAwMDAsIDB4MDAwMDA4MDAsCisgICAgMHgwNDAwMDAwMiwgMHgwNDAwMDgwMCwgMHgwMDAwMDgwMCwgMHgwMDIwMDAwMgorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU0I4WzY0XSA9Cit7CisgICAgMHgxMDAwMTA0MCwgMHgwMDAwMTAwMCwgMHgwMDA0MDAwMCwgMHgxMDA0MTA0MCwKKyAgICAweDEwMDAwMDAwLCAweDEwMDAxMDQwLCAweDAwMDAwMDQwLCAweDEwMDAwMDAwLAorICAgIDB4MDAwNDAwNDAsIDB4MTAwNDAwMDAsIDB4MTAwNDEwNDAsIDB4MDAwNDEwMDAsCisgICAgMHgxMDA0MTAwMCwgMHgwMDA0MTA0MCwgMHgwMDAwMTAwMCwgMHgwMDAwMDA0MCwKKyAgICAweDEwMDQwMDAwLCAweDEwMDAwMDQwLCAweDEwMDAxMDAwLCAweDAwMDAxMDQwLAorICAgIDB4MDAwNDEwMDAsIDB4MDAwNDAwNDAsIDB4MTAwNDAwNDAsIDB4MTAwNDEwMDAsCisgICAgMHgwMDAwMTA0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxMDA0MDA0MCwKKyAgICAweDEwMDAwMDQwLCAweDEwMDAxMDAwLCAweDAwMDQxMDQwLCAweDAwMDQwMDAwLAorICAgIDB4MDAwNDEwNDAsIDB4MDAwNDAwMDAsIDB4MTAwNDEwMDAsIDB4MDAwMDEwMDAsCisgICAgMHgwMDAwMDA0MCwgMHgxMDA0MDA0MCwgMHgwMDAwMTAwMCwgMHgwMDA0MTA0MCwKKyAgICAweDEwMDAxMDAwLCAweDAwMDAwMDQwLCAweDEwMDAwMDQwLCAweDEwMDQwMDAwLAorICAgIDB4MTAwNDAwNDAsIDB4MTAwMDAwMDAsIDB4MDAwNDAwMDAsIDB4MTAwMDEwNDAsCisgICAgMHgwMDAwMDAwMCwgMHgxMDA0MTA0MCwgMHgwMDA0MDA0MCwgMHgxMDAwMDA0MCwKKyAgICAweDEwMDQwMDAwLCAweDEwMDAxMDAwLCAweDEwMDAxMDQwLCAweDAwMDAwMDAwLAorICAgIDB4MTAwNDEwNDAsIDB4MDAwNDEwMDAsIDB4MDAwNDEwMDAsIDB4MDAwMDEwNDAsCisgICAgMHgwMDAwMTA0MCwgMHgwMDA0MDA0MCwgMHgxMDAwMDAwMCwgMHgxMDA0MTAwMAorfTsKKworLyoKKyAqIFBDMTogbGVmdCBhbmQgcmlnaHQgaGFsdmVzIGJpdC1zd2FwCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIExIc1sxNl0gPQoreworICAgIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAxMDAsIDB4MDAwMDAxMDEsCisgICAgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMSwgMHgwMDAxMDEwMCwgMHgwMDAxMDEwMSwKKyAgICAweDAxMDAwMDAwLCAweDAxMDAwMDAxLCAweDAxMDAwMTAwLCAweDAxMDAwMTAxLAorICAgIDB4MDEwMTAwMDAsIDB4MDEwMTAwMDEsIDB4MDEwMTAxMDAsIDB4MDEwMTAxMDEKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIFJIc1sxNl0gPQoreworICAgIDB4MDAwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDAwMTAwMDAsIDB4MDEwMTAwMDAsCisgICAgMHgwMDAwMDEwMCwgMHgwMTAwMDEwMCwgMHgwMDAxMDEwMCwgMHgwMTAxMDEwMCwKKyAgICAweDAwMDAwMDAxLCAweDAxMDAwMDAxLCAweDAwMDEwMDAxLCAweDAxMDEwMDAxLAorICAgIDB4MDAwMDAxMDEsIDB4MDEwMDAxMDEsIDB4MDAwMTAxMDEsIDB4MDEwMTAxMDEsCit9OworCisvKgorICogSW5pdGlhbCBQZXJtdXRhdGlvbiBtYWNybworICovCisjZGVmaW5lIERFU19JUChYLFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUID0gKChYID4+ICA0KSBeIFkpICYgMHgwRjBGMEYwRjsgWSBePSBUOyBYIF49IChUIDw8ICA0KTsgICBcCisgICAgVCA9ICgoWCA+PiAxNikgXiBZKSAmIDB4MDAwMEZGRkY7IFkgXj0gVDsgWCBePSAoVCA8PCAxNik7ICAgXAorICAgIFQgPSAoKFkgPj4gIDIpIF4gWCkgJiAweDMzMzMzMzMzOyBYIF49IFQ7IFkgXj0gKFQgPDwgIDIpOyAgIFwKKyAgICBUID0gKChZID4+ICA4KSBeIFgpICYgMHgwMEZGMDBGRjsgWCBePSBUOyBZIF49IChUIDw8ICA4KTsgICBcCisgICAgWSA9ICgoWSA8PCAxKSB8IChZID4+IDMxKSkgJiAweEZGRkZGRkZGOyAgICAgICAgICAgICAgICAgICAgXAorICAgIFQgPSAoWCBeIFkpICYgMHhBQUFBQUFBQTsgWSBePSBUOyBYIF49IFQ7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBYID0gKChYIDw8IDEpIHwgKFggPj4gMzEpKSAmIDB4RkZGRkZGRkY7ICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qCisgKiBGaW5hbCBQZXJtdXRhdGlvbiBtYWNybworICovCisjZGVmaW5lIERFU19GUChYLFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBYID0gKChYIDw8IDMxKSB8IChYID4+IDEpKSAmIDB4RkZGRkZGRkY7ICAgICAgICAgICAgICAgICAgICBcCisgICAgVCA9IChYIF4gWSkgJiAweEFBQUFBQUFBOyBYIF49IFQ7IFkgXj0gVDsgICAgICAgICAgICAgICAgICAgXAorICAgIFkgPSAoKFkgPDwgMzEpIHwgKFkgPj4gMSkpICYgMHhGRkZGRkZGRjsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUID0gKChZID4+ICA4KSBeIFgpICYgMHgwMEZGMDBGRjsgWCBePSBUOyBZIF49IChUIDw8ICA4KTsgICBcCisgICAgVCA9ICgoWSA+PiAgMikgXiBYKSAmIDB4MzMzMzMzMzM7IFggXj0gVDsgWSBePSAoVCA8PCAgMik7ICAgXAorICAgIFQgPSAoKFggPj4gMTYpIF4gWSkgJiAweDAwMDBGRkZGOyBZIF49IFQ7IFggXj0gKFQgPDwgMTYpOyAgIFwKKyAgICBUID0gKChYID4+ICA0KSBeIFkpICYgMHgwRjBGMEYwRjsgWSBePSBUOyBYIF49IChUIDw8ICA0KTsgICBcCit9CisKKy8qCisgKiBERVMgcm91bmQgbWFjcm8KKyAqLworI2RlZmluZSBERVNfUk9VTkQoWCxZKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFQgPSAqU0srKyBeIFg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFkgXj0gU0I4WyAoVCAgICAgICkgJiAweDNGIF0gXiAgICAgICAgICAgICAgXAorICAgICAgICAgU0I2WyAoVCA+PiAgOCkgJiAweDNGIF0gXiAgICAgICAgICAgICAgXAorICAgICAgICAgU0I0WyAoVCA+PiAxNikgJiAweDNGIF0gXiAgICAgICAgICAgICAgXAorICAgICAgICAgU0IyWyAoVCA+PiAyNCkgJiAweDNGIF07ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFQgPSAqU0srKyBeICgoWCA8PCAyOCkgfCAoWCA+PiA0KSk7ICAgICAgICAgXAorICAgIFkgXj0gU0I3WyAoVCAgICAgICkgJiAweDNGIF0gXiAgICAgICAgICAgICAgXAorICAgICAgICAgU0I1WyAoVCA+PiAgOCkgJiAweDNGIF0gXiAgICAgICAgICAgICAgXAorICAgICAgICAgU0IzWyAoVCA+PiAxNikgJiAweDNGIF0gXiAgICAgICAgICAgICAgXAorICAgICAgICAgU0IxWyAoVCA+PiAyNCkgJiAweDNGIF07ICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNXQVAoYSxiKSB7IHVuc2lnbmVkIGxvbmcgdCA9IGE7IGEgPSBiOyBiID0gdDsgdCA9IDA7IH0KKworc3RhdGljIHZvaWQgZGVzX3NldGtleSggdW5zaWduZWQgbG9uZyBTS1szMl0sIHVuc2lnbmVkIGNoYXIga2V5WzhdICkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBsb25nIFgsIFksIFQ7CisKKyAgICBHRVRfVUxPTkdfQkUoIFgsIGtleSwgMCApOworICAgIEdFVF9VTE9OR19CRSggWSwga2V5LCA0ICk7CisKKyAgICAvKgorICAgICAqIFBlcm11dGVkIENob2ljZSAxCisgICAgICovCisgICAgVCA9ICAoKFkgPj4gIDQpIF4gWCkgJiAweDBGMEYwRjBGOyAgWCBePSBUOyBZIF49IChUIDw8ICA0KTsKKyAgICBUID0gICgoWSAgICAgICkgXiBYKSAmIDB4MTAxMDEwMTA7ICBYIF49IFQ7IFkgXj0gKFQgICAgICApOworCisgICAgWCA9ICAgKExIc1sgKFggICAgICApICYgMHhGXSA8PCAzKSB8IChMSHNbIChYID4+ICA4KSAmIDB4RiBdIDw8IDIpCisgICAgICAgIHwgKExIc1sgKFggPj4gMTYpICYgMHhGXSA8PCAxKSB8IChMSHNbIChYID4+IDI0KSAmIDB4RiBdICAgICApCisgICAgICAgIHwgKExIc1sgKFggPj4gIDUpICYgMHhGXSA8PCA3KSB8IChMSHNbIChYID4+IDEzKSAmIDB4RiBdIDw8IDYpCisgICAgICAgIHwgKExIc1sgKFggPj4gMjEpICYgMHhGXSA8PCA1KSB8IChMSHNbIChYID4+IDI5KSAmIDB4RiBdIDw8IDQpOworCisgICAgWSA9ICAgKFJIc1sgKFkgPj4gIDEpICYgMHhGXSA8PCAzKSB8IChSSHNbIChZID4+ICA5KSAmIDB4RiBdIDw8IDIpCisgICAgICAgIHwgKFJIc1sgKFkgPj4gMTcpICYgMHhGXSA8PCAxKSB8IChSSHNbIChZID4+IDI1KSAmIDB4RiBdICAgICApCisgICAgICAgIHwgKFJIc1sgKFkgPj4gIDQpICYgMHhGXSA8PCA3KSB8IChSSHNbIChZID4+IDEyKSAmIDB4RiBdIDw8IDYpCisgICAgICAgIHwgKFJIc1sgKFkgPj4gMjApICYgMHhGXSA8PCA1KSB8IChSSHNbIChZID4+IDI4KSAmIDB4RiBdIDw8IDQpOworCisgICAgWCAmPSAweDBGRkZGRkZGOworICAgIFkgJj0gMHgwRkZGRkZGRjsKKworICAgIC8qCisgICAgICogY2FsY3VsYXRlIHN1YmtleXMKKyAgICAgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgMTY7IGkrKyApCisgICAgeworICAgICAgICBpZiggaSA8IDIgfHwgaSA9PSA4IHx8IGkgPT0gMTUgKQorICAgICAgICB7CisgICAgICAgICAgICBYID0gKChYIDw8ICAxKSB8IChYID4+IDI3KSkgJiAweDBGRkZGRkZGOworICAgICAgICAgICAgWSA9ICgoWSA8PCAgMSkgfCAoWSA+PiAyNykpICYgMHgwRkZGRkZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFggPSAoKFggPDwgIDIpIHwgKFggPj4gMjYpKSAmIDB4MEZGRkZGRkY7CisgICAgICAgICAgICBZID0gKChZIDw8ICAyKSB8IChZID4+IDI2KSkgJiAweDBGRkZGRkZGOworICAgICAgICB9CisKKyAgICAgICAgKlNLKysgPSAgICgoWCA8PCAgNCkgJiAweDI0MDAwMDAwKSB8ICgoWCA8PCAyOCkgJiAweDEwMDAwMDAwKQorICAgICAgICAgICAgICAgIHwgKChYIDw8IDE0KSAmIDB4MDgwMDAwMDApIHwgKChYIDw8IDE4KSAmIDB4MDIwODAwMDApCisgICAgICAgICAgICAgICAgfCAoKFggPDwgIDYpICYgMHgwMTAwMDAwMCkgfCAoKFggPDwgIDkpICYgMHgwMDIwMDAwMCkKKyAgICAgICAgICAgICAgICB8ICgoWCA+PiAgMSkgJiAweDAwMTAwMDAwKSB8ICgoWCA8PCAxMCkgJiAweDAwMDQwMDAwKQorICAgICAgICAgICAgICAgIHwgKChYIDw8ICAyKSAmIDB4MDAwMjAwMDApIHwgKChYID4+IDEwKSAmIDB4MDAwMTAwMDApCisgICAgICAgICAgICAgICAgfCAoKFkgPj4gMTMpICYgMHgwMDAwMjAwMCkgfCAoKFkgPj4gIDQpICYgMHgwMDAwMTAwMCkKKyAgICAgICAgICAgICAgICB8ICgoWSA8PCAgNikgJiAweDAwMDAwODAwKSB8ICgoWSA+PiAgMSkgJiAweDAwMDAwNDAwKQorICAgICAgICAgICAgICAgIHwgKChZID4+IDE0KSAmIDB4MDAwMDAyMDApIHwgKChZICAgICAgKSAmIDB4MDAwMDAxMDApCisgICAgICAgICAgICAgICAgfCAoKFkgPj4gIDUpICYgMHgwMDAwMDAyMCkgfCAoKFkgPj4gMTApICYgMHgwMDAwMDAxMCkKKyAgICAgICAgICAgICAgICB8ICgoWSA+PiAgMykgJiAweDAwMDAwMDA4KSB8ICgoWSA+PiAxOCkgJiAweDAwMDAwMDA0KQorICAgICAgICAgICAgICAgIHwgKChZID4+IDI2KSAmIDB4MDAwMDAwMDIpIHwgKChZID4+IDI0KSAmIDB4MDAwMDAwMDEpOworCisgICAgICAgICpTSysrID0gICAoKFggPDwgMTUpICYgMHgyMDAwMDAwMCkgfCAoKFggPDwgMTcpICYgMHgxMDAwMDAwMCkKKyAgICAgICAgICAgICAgICB8ICgoWCA8PCAxMCkgJiAweDA4MDAwMDAwKSB8ICgoWCA8PCAyMikgJiAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgIHwgKChYID4+ICAyKSAmIDB4MDIwMDAwMDApIHwgKChYIDw8ICAxKSAmIDB4MDEwMDAwMDApCisgICAgICAgICAgICAgICAgfCAoKFggPDwgMTYpICYgMHgwMDIwMDAwMCkgfCAoKFggPDwgMTEpICYgMHgwMDEwMDAwMCkKKyAgICAgICAgICAgICAgICB8ICgoWCA8PCAgMykgJiAweDAwMDgwMDAwKSB8ICgoWCA+PiAgNikgJiAweDAwMDQwMDAwKQorICAgICAgICAgICAgICAgIHwgKChYIDw8IDE1KSAmIDB4MDAwMjAwMDApIHwgKChYID4+ICA0KSAmIDB4MDAwMTAwMDApCisgICAgICAgICAgICAgICAgfCAoKFkgPj4gIDIpICYgMHgwMDAwMjAwMCkgfCAoKFkgPDwgIDgpICYgMHgwMDAwMTAwMCkKKyAgICAgICAgICAgICAgICB8ICgoWSA+PiAxNCkgJiAweDAwMDAwODA4KSB8ICgoWSA+PiAgOSkgJiAweDAwMDAwNDAwKQorICAgICAgICAgICAgICAgIHwgKChZICAgICAgKSAmIDB4MDAwMDAyMDApIHwgKChZIDw8ICA3KSAmIDB4MDAwMDAxMDApCisgICAgICAgICAgICAgICAgfCAoKFkgPj4gIDcpICYgMHgwMDAwMDAyMCkgfCAoKFkgPj4gIDMpICYgMHgwMDAwMDAxMSkKKyAgICAgICAgICAgICAgICB8ICgoWSA8PCAgMikgJiAweDAwMDAwMDA0KSB8ICgoWSA+PiAyMSkgJiAweDAwMDAwMDAyKTsKKyAgICB9Cit9CisKKy8qCisgKiBERVMga2V5IHNjaGVkdWxlICg1Ni1iaXQsIGVuY3J5cHRpb24pCisgKi8KK3ZvaWQgZGVzX3NldGtleV9lbmMoIGRlc19jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIga2V5WzhdICkKK3sKKyAgICBkZXNfc2V0a2V5KCBjdHgtPnNrLCBrZXkgKTsKK30KKworLyoKKyAqIERFUyBrZXkgc2NoZWR1bGUgKDU2LWJpdCwgZGVjcnlwdGlvbikKKyAqLwordm9pZCBkZXNfc2V0a2V5X2RlYyggZGVzX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBrZXlbOF0gKQoreworICAgIGludCBpOworCisgICAgZGVzX3NldGtleSggY3R4LT5zaywga2V5ICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMTY7IGkgKz0gMiApCisgICAgeworICAgICAgICBTV0FQKCBjdHgtPnNrW2kgICAgXSwgY3R4LT5za1szMCAtIGldICk7CisgICAgICAgIFNXQVAoIGN0eC0+c2tbaSArIDFdLCBjdHgtPnNrWzMxIC0gaV0gKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlczNfc2V0MmtleSggdW5zaWduZWQgbG9uZyBlc2tbOTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRza1s5Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIga2V5WzE2XSApCit7CisgICAgaW50IGk7CisKKyAgICBkZXNfc2V0a2V5KCBlc2ssIGtleSApOworICAgIGRlc19zZXRrZXkoIGRzayArIDMyLCBrZXkgKyA4ICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzI7IGkgKz0gMiApCisgICAgeworICAgICAgICBkc2tbaSAgICAgXSA9IGVza1szMCAtIGldOworICAgICAgICBkc2tbaSArICAxXSA9IGVza1szMSAtIGldOworCisgICAgICAgIGVza1tpICsgMzJdID0gZHNrWzYyIC0gaV07CisgICAgICAgIGVza1tpICsgMzNdID0gZHNrWzYzIC0gaV07CisKKyAgICAgICAgZXNrW2kgKyA2NF0gPSBlc2tbaSAgICBdOworICAgICAgICBlc2tbaSArIDY1XSA9IGVza1tpICsgMV07CisKKyAgICAgICAgZHNrW2kgKyA2NF0gPSBkc2tbaSAgICBdOworICAgICAgICBkc2tbaSArIDY1XSA9IGRza1tpICsgMV07CisgICAgfQorfQorCisvKgorICogVHJpcGxlLURFUyBrZXkgc2NoZWR1bGUgKDExMi1iaXQsIGVuY3J5cHRpb24pCisgKi8KK3ZvaWQgZGVzM19zZXQya2V5X2VuYyggZGVzM19jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIga2V5WzE2XSApCit7CisgICAgdW5zaWduZWQgbG9uZyBza1s5Nl07CisKKyAgICBkZXMzX3NldDJrZXkoIGN0eC0+c2ssIHNrLCBrZXkgKTsKKyAgICBtZW1zZXQoIHNrLCAgMCwgc2l6ZW9mKCBzayApICk7Cit9CisKKy8qCisgKiBUcmlwbGUtREVTIGtleSBzY2hlZHVsZSAoMTEyLWJpdCwgZGVjcnlwdGlvbikKKyAqLwordm9pZCBkZXMzX3NldDJrZXlfZGVjKCBkZXMzX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBrZXlbMTZdICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHNrWzk2XTsKKworICAgIGRlczNfc2V0MmtleSggc2ssIGN0eC0+c2ssIGtleSApOworICAgIG1lbXNldCggc2ssICAwLCBzaXplb2YoIHNrICkgKTsKK30KKworc3RhdGljIHZvaWQgZGVzM19zZXQza2V5KCB1bnNpZ25lZCBsb25nIGVza1s5Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZHNrWzk2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBrZXlbMjRdICkKK3sKKyAgICBpbnQgaTsKKworICAgIGRlc19zZXRrZXkoIGVzaywga2V5ICk7CisgICAgZGVzX3NldGtleSggZHNrICsgMzIsIGtleSArICA4ICk7CisgICAgZGVzX3NldGtleSggZXNrICsgNjQsIGtleSArIDE2ICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzI7IGkgKz0gMiApCisgICAgeworICAgICAgICBkc2tbaSAgICAgXSA9IGVza1s5NCAtIGldOworICAgICAgICBkc2tbaSArICAxXSA9IGVza1s5NSAtIGldOworCisgICAgICAgIGVza1tpICsgMzJdID0gZHNrWzYyIC0gaV07CisgICAgICAgIGVza1tpICsgMzNdID0gZHNrWzYzIC0gaV07CisKKyAgICAgICAgZHNrW2kgKyA2NF0gPSBlc2tbMzAgLSBpXTsKKyAgICAgICAgZHNrW2kgKyA2NV0gPSBlc2tbMzEgLSBpXTsKKyAgICB9Cit9CisKKy8qCisgKiBUcmlwbGUtREVTIGtleSBzY2hlZHVsZSAoMTY4LWJpdCwgZW5jcnlwdGlvbikKKyAqLwordm9pZCBkZXMzX3NldDNrZXlfZW5jKCBkZXMzX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBrZXlbMjRdICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHNrWzk2XTsKKworICAgIGRlczNfc2V0M2tleSggY3R4LT5zaywgc2ssIGtleSApOworICAgIG1lbXNldCggc2ssIDAsIHNpemVvZiggc2sgKSApOworfQorCisvKgorICogVHJpcGxlLURFUyBrZXkgc2NoZWR1bGUgKDE2OC1iaXQsIGRlY3J5cHRpb24pCisgKi8KK3ZvaWQgZGVzM19zZXQza2V5X2RlYyggZGVzM19jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIga2V5WzI0XSApCit7CisgICAgdW5zaWduZWQgbG9uZyBza1s5Nl07CisKKyAgICBkZXMzX3NldDNrZXkoIHNrLCBjdHgtPnNrLCBrZXkgKTsKKyAgICBtZW1zZXQoIHNrLCAwLCBzaXplb2YoIHNrICkgKTsKK30KKworLyoKKyAqIERFUy1FQ0IgYmxvY2sgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKi8KK3ZvaWQgZGVzX2NyeXB0X2VjYiggZGVzX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpbnB1dFs4XSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRwdXRbOF0gKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGxvbmcgWCwgWSwgVCwgKlNLOworCisgICAgU0sgPSBjdHgtPnNrOworCisgICAgR0VUX1VMT05HX0JFKCBYLCBpbnB1dCwgMCApOworICAgIEdFVF9VTE9OR19CRSggWSwgaW5wdXQsIDQgKTsKKworICAgIERFU19JUCggWCwgWSApOworCisgICAgZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApCisgICAgeworICAgICAgICBERVNfUk9VTkQoIFksIFggKTsKKyAgICAgICAgREVTX1JPVU5EKCBYLCBZICk7CisgICAgfQorCisgICAgREVTX0ZQKCBZLCBYICk7CisKKyAgICBQVVRfVUxPTkdfQkUoIFksIG91dHB1dCwgMCApOworICAgIFBVVF9VTE9OR19CRSggWCwgb3V0cHV0LCA0ICk7Cit9CisKKy8qCisgKiBERVMtQ0JDIGJ1ZmZlciBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAqLwordm9pZCBkZXNfY3J5cHRfY2JjKCBkZXNfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpdls4XSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciB0ZW1wWzhdOworCisgICAgaWYoIG1vZGUgPT0gREVTX0VOQ1JZUFQgKQorICAgIHsKKyAgICAgICAgd2hpbGUoIGxlbmd0aCA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkKKyAgICAgICAgICAgICAgICBvdXRwdXRbaV0gPSAodW5zaWduZWQgY2hhcikoIGlucHV0W2ldIF4gaXZbaV0gKTsKKworICAgICAgICAgICAgZGVzX2NyeXB0X2VjYiggY3R4LCBvdXRwdXQsIG91dHB1dCApOworICAgICAgICAgICAgbWVtY3B5KCBpdiwgb3V0cHV0LCA4ICk7CisKKyAgICAgICAgICAgIGlucHV0ICArPSA4OworICAgICAgICAgICAgb3V0cHV0ICs9IDg7CisgICAgICAgICAgICBsZW5ndGggLT0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIERFU19ERUNSWVBUICovCisgICAgeworICAgICAgICB3aGlsZSggbGVuZ3RoID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweSggdGVtcCwgaW5wdXQsIDggKTsKKyAgICAgICAgICAgIGRlc19jcnlwdF9lY2IoIGN0eCwgaW5wdXQsIG91dHB1dCApOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkKKyAgICAgICAgICAgICAgICBvdXRwdXRbaV0gPSAodW5zaWduZWQgY2hhcikoIG91dHB1dFtpXSBeIGl2W2ldICk7CisKKyAgICAgICAgICAgIG1lbWNweSggaXYsIHRlbXAsIDggKTsKKworICAgICAgICAgICAgaW5wdXQgICs9IDg7CisgICAgICAgICAgICBvdXRwdXQgKz0gODsKKyAgICAgICAgICAgIGxlbmd0aCAtPSA4OworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogM0RFUy1FQ0IgYmxvY2sgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKi8KK3ZvaWQgZGVzM19jcnlwdF9lY2IoIGRlczNfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpbnB1dFs4XSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzhdICkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBsb25nIFgsIFksIFQsICpTSzsKKworICAgIFNLID0gY3R4LT5zazsKKworICAgIEdFVF9VTE9OR19CRSggWCwgaW5wdXQsIDAgKTsKKyAgICBHRVRfVUxPTkdfQkUoIFksIGlucHV0LCA0ICk7CisKKyAgICBERVNfSVAoIFgsIFkgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKysgKQorICAgIHsKKyAgICAgICAgREVTX1JPVU5EKCBZLCBYICk7CisgICAgICAgIERFU19ST1VORCggWCwgWSApOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKysgKQorICAgIHsKKyAgICAgICAgREVTX1JPVU5EKCBYLCBZICk7CisgICAgICAgIERFU19ST1VORCggWSwgWCApOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKysgKQorICAgIHsKKyAgICAgICAgREVTX1JPVU5EKCBZLCBYICk7CisgICAgICAgIERFU19ST1VORCggWCwgWSApOworICAgIH0KKworICAgIERFU19GUCggWSwgWCApOworCisgICAgUFVUX1VMT05HX0JFKCBZLCBvdXRwdXQsIDAgKTsKKyAgICBQVVRfVUxPTkdfQkUoIFgsIG91dHB1dCwgNCApOworfQorCisvKgorICogM0RFUy1DQkMgYnVmZmVyIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICovCit2b2lkIGRlczNfY3J5cHRfY2JjKCBkZXMzX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaXZbOF0sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciB0ZW1wWzhdOworCisgICAgaWYoIG1vZGUgPT0gREVTX0VOQ1JZUFQgKQorICAgIHsKKyAgICAgICAgd2hpbGUoIGxlbmd0aCA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkKKyAgICAgICAgICAgICAgICBvdXRwdXRbaV0gPSAodW5zaWduZWQgY2hhcikoIGlucHV0W2ldIF4gaXZbaV0gKTsKKworICAgICAgICAgICAgZGVzM19jcnlwdF9lY2IoIGN0eCwgb3V0cHV0LCBvdXRwdXQgKTsKKyAgICAgICAgICAgIG1lbWNweSggaXYsIG91dHB1dCwgOCApOworCisgICAgICAgICAgICBpbnB1dCAgKz0gODsKKyAgICAgICAgICAgIG91dHB1dCArPSA4OworICAgICAgICAgICAgbGVuZ3RoIC09IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBERVNfREVDUllQVCAqLworICAgIHsKKyAgICAgICAgd2hpbGUoIGxlbmd0aCA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoIHRlbXAsIGlucHV0LCA4ICk7CisgICAgICAgICAgICBkZXMzX2NyeXB0X2VjYiggY3R4LCBpbnB1dCwgb3V0cHV0ICk7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKysgKQorICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9ICh1bnNpZ25lZCBjaGFyKSggb3V0cHV0W2ldIF4gaXZbaV0gKTsKKworICAgICAgICAgICAgbWVtY3B5KCBpdiwgdGVtcCwgOCApOworCisgICAgICAgICAgICBpbnB1dCAgKz0gODsKKyAgICAgICAgICAgIG91dHB1dCArPSA4OworICAgICAgICAgICAgbGVuZ3RoIC09IDg7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKFhZU1NMX1NFTEZfVEVTVCkKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiBERVMgYW5kIDNERVMgdGVzdCB2ZWN0b3JzIGZyb206CisgKgorICogaHR0cDovL2NzcmMubmlzdC5nb3YvZ3JvdXBzL1NUTS9jYXZwL2RvY3VtZW50cy9kZXMvdHJpcGxlZGVzLXZlY3RvcnMuemlwCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRlczNfdGVzdF9rZXlzWzI0XSA9Cit7CisgICAgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhFRiwKKyAgICAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGLCAweDAxLAorICAgIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4RUYsIDB4MDEsIDB4MjMKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRlczNfdGVzdF9pdls4XSA9Cit7CisgICAgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHg5MCwgMHhBQiwgMHhDRCwgMHhFRiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRlczNfdGVzdF9idWZbOF0gPQoreworICAgIDB4NEUsIDB4NkYsIDB4NzcsIDB4MjAsIDB4NjksIDB4NzMsIDB4MjAsIDB4NzQKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRlczNfdGVzdF9lY2JfZGVjWzNdWzhdID0KK3sKKyAgICB7IDB4Q0QsIDB4RDYsIDB4NEYsIDB4MkYsIDB4OTQsIDB4MjcsIDB4QzEsIDB4NUQgfSwKKyAgICB7IDB4NjksIDB4OTYsIDB4QzgsIDB4RkEsIDB4NDcsIDB4QTIsIDB4QUIsIDB4RUIgfSwKKyAgICB7IDB4ODMsIDB4MjUsIDB4MzksIDB4NzYsIDB4NDQsIDB4MDksIDB4MUEsIDB4MEEgfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGVzM190ZXN0X2VjYl9lbmNbM11bOF0gPQoreworICAgIHsgMHg2QSwgMHgyQSwgMHgxOSwgMHhGNCwgMHgxRSwgMHhDQSwgMHg4NSwgMHg0QiB9LAorICAgIHsgMHgwMywgMHhFNiwgMHg5RiwgMHg1QiwgMHhGQSwgMHg1OCwgMHhFQiwgMHg0MiB9LAorICAgIHsgMHhERCwgMHgxNywgMHhFOCwgMHhCOCwgMHhCNCwgMHgzNywgMHhEMiwgMHgzMiB9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkZXMzX3Rlc3RfY2JjX2RlY1szXVs4XSA9Cit7CisgICAgeyAweDEyLCAweDlGLCAweDQwLCAweEI5LCAweEQyLCAweDAwLCAweDU2LCAweEIzIH0sCisgICAgeyAweDQ3LCAweDBFLCAweEZDLCAweDlBLCAweDZCLCAweDhFLCAweEUzLCAweDkzIH0sCisgICAgeyAweEM1LCAweENFLCAweENGLCAweDYzLCAweEVDLCAweEVDLCAweDUxLCAweDRDIH0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRlczNfdGVzdF9jYmNfZW5jWzNdWzhdID0KK3sKKyAgICB7IDB4NTQsIDB4RjEsIDB4NUEsIDB4RjYsIDB4RUIsIDB4RTMsIDB4QTQsIDB4QjQgfSwKKyAgICB7IDB4MzUsIDB4NzYsIDB4MTEsIDB4NTYsIDB4NUYsIDB4QTEsIDB4OEUsIDB4NEQgfSwKKyAgICB7IDB4Q0IsIDB4MTksIDB4MUYsIDB4ODUsIDB4RDEsIDB4RUQsIDB4ODQsIDB4MzkgfQorfTsKKworLyoKKyAqIENoZWNrdXAgcm91dGluZQorICovCitpbnQgZGVzX3NlbGZfdGVzdCggaW50IHZlcmJvc2UgKQoreworICAgIGludCBpLCBqLCB1LCB2OworICAgIGRlc19jb250ZXh0IGN0eDsKKyAgICBkZXMzX2NvbnRleHQgY3R4MzsKKyAgICB1bnNpZ25lZCBjaGFyIGtleVsyNF07CisgICAgdW5zaWduZWQgY2hhciBidWZbOF07CisgICAgdW5zaWduZWQgY2hhciBwcnZbOF07CisgICAgdW5zaWduZWQgY2hhciBpdls4XTsKKworICAgIG1lbXNldCgga2V5LCAwLCAyNCApOworCisgICAgLyoKKyAgICAgKiBFQ0IgbW9kZQorICAgICAqLworICAgIGZvciggaSA9IDA7IGkgPCA2OyBpKysgKQorICAgIHsKKyAgICAgICAgdSA9IGkgPj4gMTsKKyAgICAgICAgdiA9IGkgICYgMTsKKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggIiAgREVTJWMtRUNCLSUzZCAoJXMpOiAiLAorICAgICAgICAgICAgICAgICAgICAoIHUgPT0gMCApID8gJyAnIDogJzMnLCA1NiArIHUgKiA1NiwKKyAgICAgICAgICAgICAgICAgICAgKCB2ID09IERFU19ERUNSWVBUICkgPyAiZGVjIiA6ICJlbmMiICk7CisKKyAgICAgICAgbWVtY3B5KCBidWYsIGRlczNfdGVzdF9idWYsIDggKTsKKworICAgICAgICBzd2l0Y2goIGkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlc19zZXRrZXlfZGVjKCAmY3R4LCAodW5zaWduZWQgY2hhciAqKSBkZXMzX3Rlc3Rfa2V5cyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZGVzX3NldGtleV9lbmMoICZjdHgsICh1bnNpZ25lZCBjaGFyICopIGRlczNfdGVzdF9rZXlzICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBkZXMzX3NldDJrZXlfZGVjKCAmY3R4MywgKHVuc2lnbmVkIGNoYXIgKikgZGVzM190ZXN0X2tleXMgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGRlczNfc2V0MmtleV9lbmMoICZjdHgzLCAodW5zaWduZWQgY2hhciAqKSBkZXMzX3Rlc3Rfa2V5cyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgZGVzM19zZXQza2V5X2RlYyggJmN0eDMsICh1bnNpZ25lZCBjaGFyICopIGRlczNfdGVzdF9rZXlzICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBkZXMzX3NldDNrZXlfZW5jKCAmY3R4MywgKHVuc2lnbmVkIGNoYXIgKikgZGVzM190ZXN0X2tleXMgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaiA9IDA7IGogPCAxMDAwMDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHUgPT0gMCApCisgICAgICAgICAgICAgICAgZGVzX2NyeXB0X2VjYiggJmN0eCwgYnVmLCBidWYgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZXMzX2NyeXB0X2VjYiggJmN0eDMsIGJ1ZiwgYnVmICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggKCB2ID09IERFU19ERUNSWVBUICYmCisgICAgICAgICAgICAgICAgbWVtY21wKCBidWYsIGRlczNfdGVzdF9lY2JfZGVjW3VdLCA4ICkgIT0gMCApIHx8CisgICAgICAgICAgICAoIHYgIT0gREVTX0RFQ1JZUFQgJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAoIGJ1ZiwgZGVzM190ZXN0X2VjYl9lbmNbdV0sIDggKSAhPSAwICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgICAgICBwcmludGYoICJmYWlsZWRcbiIgKTsKKworICAgICAgICAgICAgcmV0dXJuKCAxICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggInBhc3NlZFxuIiApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJcbiIgKTsKKworICAgIC8qCisgICAgICogQ0JDIG1vZGUKKyAgICAgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgNjsgaSsrICkKKyAgICB7CisgICAgICAgIHUgPSBpID4+IDE7CisgICAgICAgIHYgPSBpICAmIDE7CisKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICIgIERFUyVjLUNCQy0lM2QgKCVzKTogIiwKKyAgICAgICAgICAgICAgICAgICAgKCB1ID09IDAgKSA/ICcgJyA6ICczJywgNTYgKyB1ICogNTYsCisgICAgICAgICAgICAgICAgICAgICggdiA9PSBERVNfREVDUllQVCApID8gImRlYyIgOiAiZW5jIiApOworCisgICAgICAgIG1lbWNweSggaXYsICBkZXMzX3Rlc3RfaXYsICA4ICk7CisgICAgICAgIG1lbWNweSggcHJ2LCBkZXMzX3Rlc3RfaXYsICA4ICk7CisgICAgICAgIG1lbWNweSggYnVmLCBkZXMzX3Rlc3RfYnVmLCA4ICk7CisKKyAgICAgICAgc3dpdGNoKCBpICkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBkZXNfc2V0a2V5X2RlYyggJmN0eCwgKHVuc2lnbmVkIGNoYXIgKikgZGVzM190ZXN0X2tleXMgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGRlc19zZXRrZXlfZW5jKCAmY3R4LCAodW5zaWduZWQgY2hhciAqKSBkZXMzX3Rlc3Rfa2V5cyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZGVzM19zZXQya2V5X2RlYyggJmN0eDMsICh1bnNpZ25lZCBjaGFyICopIGRlczNfdGVzdF9rZXlzICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBkZXMzX3NldDJrZXlfZW5jKCAmY3R4MywgKHVuc2lnbmVkIGNoYXIgKikgZGVzM190ZXN0X2tleXMgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGRlczNfc2V0M2tleV9kZWMoICZjdHgzLCAodW5zaWduZWQgY2hhciAqKSBkZXMzX3Rlc3Rfa2V5cyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgZGVzM19zZXQza2V5X2VuYyggJmN0eDMsICh1bnNpZ25lZCBjaGFyICopIGRlczNfdGVzdF9rZXlzICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKCAxICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggdiA9PSBERVNfREVDUllQVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAxMDAwMDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggdSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgZGVzX2NyeXB0X2NiYyggJmN0eCwgdiwgOCwgaXYsIGJ1ZiwgYnVmICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZXMzX2NyeXB0X2NiYyggJmN0eDMsIHYsIDgsIGl2LCBidWYsIGJ1ZiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDEwMDAwOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdG1wWzhdOworCisgICAgICAgICAgICAgICAgaWYoIHUgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGRlc19jcnlwdF9jYmMoICZjdHgsIHYsIDgsIGl2LCBidWYsIGJ1ZiApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGVzM19jcnlwdF9jYmMoICZjdHgzLCB2LCA4LCBpdiwgYnVmLCBidWYgKTsKKworICAgICAgICAgICAgICAgIG1lbWNweSggdG1wLCBwcnYsIDggKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoIHBydiwgYnVmLCA4ICk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCBidWYsIHRtcCwgOCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1jcHkoIGJ1ZiwgcHJ2LCA4ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggKCB2ID09IERFU19ERUNSWVBUICYmCisgICAgICAgICAgICAgICAgbWVtY21wKCBidWYsIGRlczNfdGVzdF9jYmNfZGVjW3VdLCA4ICkgIT0gMCApIHx8CisgICAgICAgICAgICAoIHYgIT0gREVTX0RFQ1JZUFQgJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAoIGJ1ZiwgZGVzM190ZXN0X2NiY19lbmNbdV0sIDggKSAhPSAwICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgICAgICBwcmludGYoICJmYWlsZWRcbiIgKTsKKworICAgICAgICAgICAgcmV0dXJuKCAxICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggInBhc3NlZFxuIiApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJcbiIgKTsKKworICAgIHJldHVybiggMCApOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJyYXJ5L2RobS5jIGIvbGlicmFyeS9kaG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmZmMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicmFyeS9kaG0uYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqICBEaWZmaWUtSGVsbG1hbi1NZXJrbGUga2V5IGV4Y2hhbmdlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworLyoKKyAqICBSZWZlcmVuY2U6CisgKgorICogIGh0dHA6Ly93d3cuY2Fjci5tYXRoLnV3YXRlcmxvby5jYS9oYWMvIChjaGFwdGVyIDEyKQorICovCisKKyNpbmNsdWRlICJ4eXNzbC9jb25maWcuaCIKKworI2lmIGRlZmluZWQoWFlTU0xfREhNX0MpCisKKyNpbmNsdWRlICJ4eXNzbC9kaG0uaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKgorICogaGVscGVyIHRvIHZhbGlkYXRlIHRoZSBtcGkgc2l6ZSBhbmQgaW1wb3J0IGl0CisgKi8KK3N0YXRpYyBpbnQgZGhtX3JlYWRfYmlnbnVtKCBtcGkgKlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW5kICkKK3sKKyAgICBpbnQgcmV0LCBuOworCisgICAgaWYoIGVuZCAtICpwIDwgMiApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0RITV9CQURfSU5QVVRfREFUQSApOworCisgICAgbiA9ICggKCpwKVswXSA8PCA4ICkgfCAoKnApWzFdOworICAgICgqcCkgKz0gMjsKKworICAgIGlmKCAoaW50KSggZW5kIC0gKnAgKSA8IG4gKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ESE1fQkFEX0lOUFVUX0RBVEEgKTsKKworICAgIGlmKCAoIHJldCA9IG1waV9yZWFkX2JpbmFyeSggWCwgKnAsIG4gKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ESE1fUkVBRF9QQVJBTVNfRkFJTEVEIHwgcmV0ICk7CisKKyAgICAoKnApICs9IG47CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBTZXJ2ZXJLZXlFeGNoYW5nZSBwYXJhbWV0ZXJzCisgKi8KK2ludCBkaG1fcmVhZF9wYXJhbXMoIGRobV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqcCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuZCApCit7CisgICAgaW50IHJldCwgbjsKKworICAgIG1lbXNldCggY3R4LCAwLCBzaXplb2YoIGRobV9jb250ZXh0ICkgKTsKKworICAgIGlmKCAoIHJldCA9IGRobV9yZWFkX2JpZ251bSggJmN0eC0+UCwgIHAsIGVuZCApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IGRobV9yZWFkX2JpZ251bSggJmN0eC0+RywgIHAsIGVuZCApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IGRobV9yZWFkX2JpZ251bSggJmN0eC0+R1ksIHAsIGVuZCApICkgIT0gMCApCisgICAgICAgIHJldHVybiggcmV0ICk7CisKKyAgICBjdHgtPmxlbiA9IG1waV9zaXplKCAmY3R4LT5QICk7CisKKyAgICBpZiggZW5kIC0gKnAgPCAyICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfREhNX0JBRF9JTlBVVF9EQVRBICk7CisKKyAgICBuID0gKCAoKnApWzBdIDw8IDggKSB8ICgqcClbMV07CisgICAgKCpwKSArPSAyOworCisgICAgaWYoIGVuZCAhPSAqcCArIG4gKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ESE1fQkFEX0lOUFVUX0RBVEEgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogU2V0dXAgYW5kIHdyaXRlIHRoZSBTZXJ2ZXJLZXlFeGNoYW5nZSBwYXJhbWV0ZXJzCisgKi8KK2ludCBkaG1fbWFrZV9wYXJhbXMoIGRobV9jb250ZXh0ICpjdHgsIGludCB4X3NpemUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCAqb2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCAoKmZfcm5nKSh2b2lkICopLCB2b2lkICpwX3JuZyApCit7CisgICAgaW50IGksIHJldCwgbiwgbjEsIG4yLCBuMzsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworCisgICAgLyoKKyAgICAgKiBnZW5lcmF0ZSBYIGFuZCBjYWxjdWxhdGUgR1ggPSBHXlggbW9kIFAKKyAgICAgKi8KKyAgICBuID0geF9zaXplIC8gc2l6ZW9mKCB0X2ludCApOworICAgIE1QSV9DSEsoIG1waV9ncm93KCAmY3R4LT5YLCBuICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfbHNldCggJmN0eC0+WCwgMCApICk7CisKKyAgICBuID0geF9zaXplID4+IDM7CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIGN0eC0+WC5wOworICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpIGZfcm5nKCBwX3JuZyApOworCisgICAgd2hpbGUoIG1waV9jbXBfbXBpKCAmY3R4LT5YLCAmY3R4LT5QICkgPj0gMCApCisgICAgICAgICAgIG1waV9zaGlmdF9yKCAmY3R4LT5YLCAxICk7CisKKyAgICBNUElfQ0hLKCBtcGlfZXhwX21vZCggJmN0eC0+R1gsICZjdHgtPkcsICZjdHgtPlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPlAgLCAmY3R4LT5SUCApICk7CisKKyAgICAvKgorICAgICAqIGV4cG9ydCBQLCBHLCBHWAorICAgICAqLworI2RlZmluZSBESE1fTVBJX0VYUE9SVChYLG4pICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1QSV9DSEsoIG1waV93cml0ZV9iaW5hcnkoIFgsIHAgKyAyLCBuICkgKTsgXAorICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoIG4gPj4gOCApOyAgICAgICAgICAgXAorICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoIG4gICAgICApOyBwICs9IG47CisKKyAgICBuMSA9IG1waV9zaXplKCAmY3R4LT5QICApOworICAgIG4yID0gbXBpX3NpemUoICZjdHgtPkcgICk7CisgICAgbjMgPSBtcGlfc2l6ZSggJmN0eC0+R1ggKTsKKworICAgIHAgPSBvdXRwdXQ7CisgICAgREhNX01QSV9FWFBPUlQoICZjdHgtPlAgLCBuMSApOworICAgIERITV9NUElfRVhQT1JUKCAmY3R4LT5HICwgbjIgKTsKKyAgICBESE1fTVBJX0VYUE9SVCggJmN0eC0+R1gsIG4zICk7CisKKyAgICAqb2xlbiAgPSBwIC0gb3V0cHV0OworCisgICAgY3R4LT5sZW4gPSBuMTsKKworY2xlYW51cDoKKworICAgIGlmKCByZXQgIT0gMCApCisgICAgICAgIHJldHVybiggcmV0IHwgWFlTU0xfRVJSX0RITV9NQUtFX1BBUkFNU19GQUlMRUQgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogSW1wb3J0IHRoZSBwZWVyJ3MgcHVibGljIHZhbHVlIEdeWQorICovCitpbnQgZGhtX3JlYWRfcHVibGljKCBkaG1fY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuICkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYoIGN0eCA9PSBOVUxMIHx8IGlsZW4gPCAxIHx8IGlsZW4gPiBjdHgtPmxlbiApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0RITV9CQURfSU5QVVRfREFUQSApOworCisgICAgaWYoICggcmV0ID0gbXBpX3JlYWRfYmluYXJ5KCAmY3R4LT5HWSwgaW5wdXQsIGlsZW4gKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ESE1fUkVBRF9QVUJMSUNfRkFJTEVEIHwgcmV0ICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIENyZWF0ZSBvd24gcHJpdmF0ZSB2YWx1ZSBYIGFuZCBleHBvcnQgR15YCisgKi8KK2ludCBkaG1fbWFrZV9wdWJsaWMoIGRobV9jb250ZXh0ICpjdHgsIGludCB4X3NpemUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCBvbGVuLAorICAgICAgICAgICAgICAgICAgICAgaW50ICgqZl9ybmcpKHZvaWQgKiksIHZvaWQgKnBfcm5nICkKK3sKKyAgICBpbnQgcmV0LCBpLCBuOworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisKKyAgICBpZiggY3R4ID09IE5VTEwgfHwgb2xlbiA8IDEgfHwgb2xlbiA+IGN0eC0+bGVuICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfREhNX0JBRF9JTlBVVF9EQVRBICk7CisKKyAgICAvKgorICAgICAqIGdlbmVyYXRlIFggYW5kIGNhbGN1bGF0ZSBHWCA9IEdeWCBtb2QgUAorICAgICAqLworICAgIG4gPSB4X3NpemUgLyBzaXplb2YoIHRfaW50ICk7CisgICAgTVBJX0NISyggbXBpX2dyb3coICZjdHgtPlgsIG4gKSApOworICAgIE1QSV9DSEsoIG1waV9sc2V0KCAmY3R4LT5YLCAwICkgKTsKKworICAgIG4gPSB4X3NpemUgPj4gMzsKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgY3R4LT5YLnA7CisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikgZl9ybmcoIHBfcm5nICk7CisKKyAgICB3aGlsZSggbXBpX2NtcF9tcGkoICZjdHgtPlgsICZjdHgtPlAgKSA+PSAwICkKKyAgICAgICAgICAgbXBpX3NoaWZ0X3IoICZjdHgtPlgsIDEgKTsKKworICAgIE1QSV9DSEsoIG1waV9leHBfbW9kKCAmY3R4LT5HWCwgJmN0eC0+RywgJmN0eC0+WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+UCAsICZjdHgtPlJQICkgKTsKKworICAgIE1QSV9DSEsoIG1waV93cml0ZV9iaW5hcnkoICZjdHgtPkdYLCBvdXRwdXQsIG9sZW4gKSApOworCitjbGVhbnVwOgorCisgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfREhNX01BS0VfUFVCTElDX0ZBSUxFRCB8IHJldCApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBEZXJpdmUgYW5kIGV4cG9ydCB0aGUgc2hhcmVkIHNlY3JldCAoR15ZKV5YIG1vZCBQCisgKi8KK2ludCBkaG1fY2FsY19zZWNyZXQoIGRobV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCAqb2xlbiApCit7CisgICAgaW50IHJldDsKKworICAgIGlmKCBjdHggPT0gTlVMTCB8fCAqb2xlbiA8IGN0eC0+bGVuICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfREhNX0JBRF9JTlBVVF9EQVRBICk7CisKKyAgICBNUElfQ0hLKCBtcGlfZXhwX21vZCggJmN0eC0+SywgJmN0eC0+R1ksICZjdHgtPlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPlAsICZjdHgtPlJQICkgKTsKKworICAgICpvbGVuID0gbXBpX3NpemUoICZjdHgtPksgKTsKKworICAgIE1QSV9DSEsoIG1waV93cml0ZV9iaW5hcnkoICZjdHgtPkssIG91dHB1dCwgKm9sZW4gKSApOworCitjbGVhbnVwOgorCisgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfREhNX0NBTENfU0VDUkVUX0ZBSUxFRCB8IHJldCApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBGcmVlIHRoZSBjb21wb25lbnRzIG9mIGEgREhNIGtleQorICovCit2b2lkIGRobV9mcmVlKCBkaG1fY29udGV4dCAqY3R4ICkKK3sKKyAgICBtcGlfZnJlZSggJmN0eC0+UlAsICZjdHgtPkssICZjdHgtPkdZLAorICAgICAgICAgICAgICAmY3R4LT5HWCwgJmN0eC0+WCwgJmN0eC0+RywKKyAgICAgICAgICAgICAgJmN0eC0+UCwgTlVMTCApOyAgICAKK30KKworI2lmIGRlZmluZWQoWFlTU0xfU0VMRl9URVNUKQorCisvKgorICogQ2hlY2t1cCByb3V0aW5lCisgKi8KK2ludCBkaG1fc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApCit7CisgICAgcmV0dXJuKCB2ZXJib3NlKysgKTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicmFyeS9oYXZlZ2UuYyBiL2xpYnJhcnkvaGF2ZWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhZTdlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnJhcnkvaGF2ZWdlLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiAgSEFWRUdFOiBIQXJkd2FyZSBWb2xhdGlsZSBFbnRyb3B5IEdhdGhlcmluZyBhbmQgRXhwYW5zaW9uCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworLyoKKyAqICBUaGUgSEFWRUdFIFJORyB3YXMgZGVzaWduZWQgYnkgQW5kcmUgU2V6bmVjIGluIDIwMDIuCisgKgorICogIGh0dHA6Ly93d3cuaXJpc2EuZnIvY2Fwcy9wcm9qZWN0cy9oaXBzb3IvcHVibGkucGhwCisgKgorICogIENvbnRhY3Q6IHNlem5lYyhhdClpcmlzYV9kb3RfZnIgLSBvcm9jaGVjbyhhdClpcmlzYV9kb3RfZnIKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFhZU1NMX0hBVkVHRV9DKQorCisjaW5jbHVkZSAieHlzc2wvaGF2ZWdlLmgiCisjaW5jbHVkZSAieHlzc2wvdGltaW5nLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT24gYXZlcmFnZSwgb25lIGl0ZXJhdGlvbiBhY2Nlc3NlcyB0d28gOC13b3JkIGJsb2NrcyBpbiB0aGUgaGF2ZWdlIFdBTEsKKyAqIHRhYmxlLCBhbmQgZ2VuZXJhdGVzIDE2IHdvcmRzIGluIHRoZSBSRVMgYXJyYXkuCisgKgorICogVGhlIGRhdGEgcmVhZCBpbiB0aGUgV0FMSyB0YWJsZSBpcyB1cGRhdGVkIGFuZCBwZXJtdXRlZCBhZnRlciBlYWNoIHVzZS4KKyAqIFRoZSByZXN1bHQgb2YgdGhlIGhhcmR3YXJlIGNsb2NrIGNvdW50ZXIgcmVhZCBpcyB1c2VkICBmb3IgdGhpcyB1cGRhdGUuCisgKgorICogMjUgY29uZGl0aW9uYWwgdGVzdHMgYXJlIHByZXNlbnQuICBUaGUgY29uZGl0aW9uYWwgdGVzdHMgYXJlIGdyb3VwZWQgaW4KKyAqIHR3byBuZXN0ZWQgIGdyb3VwcyBvZiAxMiBjb25kaXRpb25hbCB0ZXN0cyBhbmQgMSB0ZXN0IHRoYXQgY29udHJvbHMgdGhlCisgKiBwZXJtdXRhdGlvbjsgb24gYXZlcmFnZSwgdGhlcmUgc2hvdWxkIGJlIDYgdGVzdHMgZXhlY3V0ZWQgYW5kIDMgb2YgdGhlbQorICogc2hvdWxkIGJlIG1pc3ByZWRpY3RlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgU1dBUChYLFkpIHsgaW50ICpUID0gWDsgWCA9IFk7IFkgPSBUOyB9CisKKyNkZWZpbmUgVFNUMV9FTlRFUiBpZiggUFRFU1QgJiAxICkgeyBQVEVTVCBePSAzOyBQVEVTVCA+Pj0gMTsKKyNkZWZpbmUgVFNUMl9FTlRFUiBpZiggUFRFU1QgJiAxICkgeyBQVEVTVCBePSAzOyBQVEVTVCA+Pj0gMTsKKworI2RlZmluZSBUU1QxX0xFQVZFIFUxKys7IH0KKyNkZWZpbmUgVFNUMl9MRUFWRSBVMisrOyB9CisKKyNkZWZpbmUgT05FX0lURVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFRFU1QgPSBQVDEgPj4gMjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRTVDFfRU5URVIgIFRTVDFfRU5URVIgIFRTVDFfRU5URVIgIFRTVDFfRU5URVIgICAgICBcCisgICAgVFNUMV9FTlRFUiAgVFNUMV9FTlRFUiAgVFNUMV9FTlRFUiAgVFNUMV9FTlRFUiAgICAgIFwKKyAgICBUU1QxX0VOVEVSICBUU1QxX0VOVEVSICBUU1QxX0VOVEVSICBUU1QxX0VOVEVSICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFNUMV9MRUFWRSAgVFNUMV9MRUFWRSAgVFNUMV9MRUFWRSAgVFNUMV9MRUFWRSAgICAgIFwKKyAgICBUU1QxX0xFQVZFICBUU1QxX0xFQVZFICBUU1QxX0xFQVZFICBUU1QxX0xFQVZFICAgICAgXAorICAgIFRTVDFfTEVBVkUgIFRTVDFfTEVBVkUgIFRTVDFfTEVBVkUgIFRTVDFfTEVBVkUgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVFggPSAoUFQxID4+IDE4KSAmIDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBUMSAmPSAweDFGRkY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFQyICY9IDB4MUZGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTEsgPSAoaW50KSBoYXJkY2xvY2soKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBID0gJldBTEtbUFQxICAgIF07IFJFU1tpKytdIF49ICpBOyAgICAgICAgICAgICAgICAgXAorICAgIEIgPSAmV0FMS1tQVDIgICAgXTsgUkVTW2krK10gXj0gKkI7ICAgICAgICAgICAgICAgICBcCisgICAgQyA9ICZXQUxLW1BUMSBeIDFdOyBSRVNbaSsrXSBePSAqQzsgICAgICAgICAgICAgICAgIFwKKyAgICBEID0gJldBTEtbUFQyIF4gNF07IFJFU1tpKytdIF49ICpEOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU4gPSAoKkEgPj4gKDEpKSBeICgqQSA8PCAoMzEpKSBeIENMSzsgICAgICAgICAgICAgIFwKKyAgICAqQSA9ICgqQiA+PiAoMikpIF4gKCpCIDw8ICgzMCkpIF4gQ0xLOyAgICAgICAgICAgICAgXAorICAgICpCID0gSU4gXiBVMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKkMgPSAoKkMgPj4gKDMpKSBeICgqQyA8PCAoMjkpKSBeIENMSzsgICAgICAgICAgICAgIFwKKyAgICAqRCA9ICgqRCA+PiAoNCkpIF4gKCpEIDw8ICgyOCkpIF4gQ0xLOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQSA9ICZXQUxLW1BUMSBeIDJdOyBSRVNbaSsrXSBePSAqQTsgICAgICAgICAgICAgICAgIFwKKyAgICBCID0gJldBTEtbUFQyIF4gMl07IFJFU1tpKytdIF49ICpCOyAgICAgICAgICAgICAgICAgXAorICAgIEMgPSAmV0FMS1tQVDEgXiAzXTsgUkVTW2krK10gXj0gKkM7ICAgICAgICAgICAgICAgICBcCisgICAgRCA9ICZXQUxLW1BUMiBeIDZdOyBSRVNbaSsrXSBePSAqRDsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBQVEVTVCAmIDEgKSBTV0FQKCBBLCBDICk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTiA9ICgqQSA+PiAoNSkpIF4gKCpBIDw8ICgyNykpIF4gQ0xLOyAgICAgICAgICAgICAgXAorICAgICpBID0gKCpCID4+ICg2KSkgXiAoKkIgPDwgKDI2KSkgXiBDTEs7ICAgICAgICAgICAgICBcCisgICAgKkIgPSBJTjsgQ0xLID0gKGludCkgaGFyZGNsb2NrKCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAqQyA9ICgqQyA+PiAoNykpIF4gKCpDIDw8ICgyNSkpIF4gQ0xLOyAgICAgICAgICAgICAgXAorICAgICpEID0gKCpEID4+ICg4KSkgXiAoKkQgPDwgKDI0KSkgXiBDTEs7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBID0gJldBTEtbUFQxIF4gNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEIgPSAmV0FMS1tQVDIgXiAxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVEVTVCA9IFBUMiA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFQyID0gKFJFU1soaSAtIDgpIF4gUFRZXSBeIFdBTEtbUFQyIF4gUFRZIF4gN10pOyAgIFwKKyAgICBQVDIgPSAoKFBUMiAmIDB4MUZGRikgJiAofjgpKSBeICgoUFQxIF4gOCkgJiAweDgpOyAgXAorICAgIFBUWSA9IChQVDIgPj4gMTApICYgNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUU1QyX0VOVEVSICBUU1QyX0VOVEVSICBUU1QyX0VOVEVSICBUU1QyX0VOVEVSICAgICAgXAorICAgIFRTVDJfRU5URVIgIFRTVDJfRU5URVIgIFRTVDJfRU5URVIgIFRTVDJfRU5URVIgICAgICBcCisgICAgVFNUMl9FTlRFUiAgVFNUMl9FTlRFUiAgVFNUMl9FTlRFUiAgVFNUMl9FTlRFUiAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRTVDJfTEVBVkUgIFRTVDJfTEVBVkUgIFRTVDJfTEVBVkUgIFRTVDJfTEVBVkUgICAgICBcCisgICAgVFNUMl9MRUFWRSAgVFNUMl9MRUFWRSAgVFNUMl9MRUFWRSAgVFNUMl9MRUFWRSAgICAgIFwKKyAgICBUU1QyX0xFQVZFICBUU1QyX0xFQVZFICBUU1QyX0xFQVZFICBUU1QyX0xFQVZFICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQyA9ICZXQUxLW1BUMSBeIDVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBEID0gJldBTEtbUFQyIF4gNV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkVTW2krK10gXj0gKkE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSRVNbaSsrXSBePSAqQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJFU1tpKytdIF49ICpDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkVTW2krK10gXj0gKkQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOID0gKCpBID4+ICggOSkpIF4gKCpBIDw8ICgyMykpIF4gQ0xLOyAgICAgICAgICAgICBcCisgICAgKkEgPSAoKkIgPj4gKDEwKSkgXiAoKkIgPDwgKDIyKSkgXiBDTEs7ICAgICAgICAgICAgIFwKKyAgICAqQiA9IElOIF4gVTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpDID0gKCpDID4+ICgxMSkpIF4gKCpDIDw8ICgyMSkpIF4gQ0xLOyAgICAgICAgICAgICBcCisgICAgKkQgPSAoKkQgPj4gKDEyKSkgXiAoKkQgPDwgKDIwKSkgXiBDTEs7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEEgPSAmV0FMS1tQVDEgXiA2XTsgUkVTW2krK10gXj0gKkE7ICAgICAgICAgICAgICAgICBcCisgICAgQiA9ICZXQUxLW1BUMiBeIDNdOyBSRVNbaSsrXSBePSAqQjsgICAgICAgICAgICAgICAgIFwKKyAgICBDID0gJldBTEtbUFQxIF4gN107IFJFU1tpKytdIF49ICpDOyAgICAgICAgICAgICAgICAgXAorICAgIEQgPSAmV0FMS1tQVDIgXiA3XTsgUkVTW2krK10gXj0gKkQ7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTiA9ICgqQSA+PiAoMTMpKSBeICgqQSA8PCAoMTkpKSBeIENMSzsgICAgICAgICAgICAgXAorICAgICpBID0gKCpCID4+ICgxNCkpIF4gKCpCIDw8ICgxOCkpIF4gQ0xLOyAgICAgICAgICAgICBcCisgICAgKkIgPSBJTjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqQyA9ICgqQyA+PiAoMTUpKSBeICgqQyA8PCAoMTcpKSBeIENMSzsgICAgICAgICAgICAgXAorICAgICpEID0gKCpEID4+ICgxNikpIF4gKCpEIDw8ICgxNikpIF4gQ0xLOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVDEgPSAoIFJFU1soaSAtIDgpIF4gUFRYXSBeICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgV0FMS1tQVDEgXiBQVFggXiA3XSApICYgKH4xKTsgICAgICAgICAgICAgICBcCisgICAgUFQxIF49IChQVDIgXiAweDEwKSAmIDB4MTA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggbisrLCBpID0gMDsgaSA8IDE2OyBpKysgKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhzLT5wb29sW24gJSBDT0xMRUNUX1NJWkVdIF49IFJFU1tpXTsKKworLyoKKyAqIEVudHJvcHkgZ2F0aGVyaW5nIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGhhdmVnZV9maWxsKCBoYXZlZ2Vfc3RhdGUgKmhzICkKK3sKKyAgICBpbnQgaSwgbiA9IDA7CisgICAgaW50ICBVMSwgIFUyLCAqQSwgKkIsICpDLCAqRDsKKyAgICBpbnQgUFQxLCBQVDIsICpXQUxLLCBSRVNbMTZdOworICAgIGludCBQVFgsIFBUWSwgQ0xLLCBQVEVTVCwgSU47CisKKyAgICBXQUxLID0gaHMtPldBTEs7CisgICAgUFQxICA9IGhzLT5QVDE7CisgICAgUFQyICA9IGhzLT5QVDI7CisKKyAgICBQVFggID0gVTEgPSAwOworICAgIFBUWSAgPSBVMiA9IDA7CisKKyAgICBtZW1zZXQoIFJFUywgMCwgc2l6ZW9mKCBSRVMgKSApOworCisgICAgd2hpbGUoIG4gPCBDT0xMRUNUX1NJWkUgKiA0ICkKKyAgICB7CisgICAgICAgIE9ORV9JVEVSQVRJT04KKyAgICAgICAgT05FX0lURVJBVElPTgorICAgICAgICBPTkVfSVRFUkFUSU9OCisgICAgICAgIE9ORV9JVEVSQVRJT04KKyAgICB9CisKKyAgICBocy0+UFQxID0gUFQxOworICAgIGhzLT5QVDIgPSBQVDI7CisKKyAgICBocy0+b2Zmc2V0WzBdID0gMDsKKyAgICBocy0+b2Zmc2V0WzFdID0gQ09MTEVDVF9TSVpFIC8gMjsKK30KKworLyoKKyAqIEhBVkVHRSBpbml0aWFsaXphdGlvbgorICovCit2b2lkIGhhdmVnZV9pbml0KCBoYXZlZ2Vfc3RhdGUgKmhzICkKK3sKKyAgICBtZW1zZXQoIGhzLCAwLCBzaXplb2YoIGhhdmVnZV9zdGF0ZSApICk7CisKKyAgICBoYXZlZ2VfZmlsbCggaHMgKTsKK30KKworLyoKKyAqIEhBVkVHRSByYW5kIGZ1bmN0aW9uCisgKi8KK2ludCBoYXZlZ2VfcmFuZCggdm9pZCAqcF9ybmcgKQoreworICAgIGludCByZXQ7CisgICAgaGF2ZWdlX3N0YXRlICpocyA9IChoYXZlZ2Vfc3RhdGUgKikgcF9ybmc7CisKKyAgICBpZiggaHMtPm9mZnNldFsxXSA+PSBDT0xMRUNUX1NJWkUgKQorICAgICAgICBoYXZlZ2VfZmlsbCggaHMgKTsKKworICAgIHJldCAgPSBocy0+cG9vbFtocy0+b2Zmc2V0WzBdKytdOworICAgIHJldCBePSBocy0+cG9vbFtocy0+b2Zmc2V0WzFdKytdOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworI2lmIGRlZmluZWQoWFlTU0xfUkFORF9URVNUKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKQoreworICAgIEZJTEUgKmY7CisgICAgdGltZV90IHQ7CisgICAgaW50IGksIGosIGs7CisgICAgaGF2ZWdlX3N0YXRlIGhzOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMjRdOworCisgICAgaWYoIGFyZ2MgPCAyICkKKyAgICB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgInVzYWdlOiAlcyA8b3V0cHV0IGZpbGVuYW1lPlxuIiwgYXJndlswXSApOworICAgICAgICByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBpZiggKCBmID0gZm9wZW4oIGFyZ3ZbMV0sICJ3YisiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHByaW50ZiggImZhaWxlZCB0byBvcGVuICclcycgZm9yIHdyaXRpbmcuXG4iLCBhcmd2WzBdICk7CisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGhhdmVnZV9pbml0KCAmaHMgKTsKKworICAgIHQgPSB0aW1lKCBOVUxMICk7CisKKyAgICBmb3IoIGkgPSAwLCBrID0gMzI3Njg7IGkgPCBrOyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemVvZiggYnVmICk7IGorKyApCisgICAgICAgICAgICBidWZbal0gPSBoYXZlZ2VfcmFuZCggJmhzICk7CisKKyAgICAgICAgZndyaXRlKCBidWYsIHNpemVvZiggYnVmICksIDEsIGYgKTsKKworICAgICAgICBwcmludGYoICJHZW5lcmF0aW5nIDMyTWIgb2YgZGF0YSBpbiBmaWxlICclcycuLi4gJTA0LjFmIiBcCisgICAgICAgICAgICAgICAgIiUlIGRvbmVcciIsIGFyZ3ZbMV0sICgxMDAgKiAoZmxvYXQpIChpICsgMSkpIC8gayApOworICAgICAgICBmZmx1c2goIHN0ZG91dCApOworICAgIH0KKworICAgIGlmKCB0ID09IHRpbWUoIE5VTEwgKSApCisgICAgICAgIHQtLTsKKworICAgIGZjbG9zZSggZiApOworICAgIHJldHVybiggMCApOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJyYXJ5L21kMi5jIGIvbGlicmFyeS9tZDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2ZjZTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicmFyeS9tZDIuYwpAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqICBSRkMgMTExNS8xMzE5IGNvbXBsaWFudCBNRDIgaW1wbGVtZW50YXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisvKgorICogIFRoZSBNRDIgYWxnb3JpdGhtIHdhcyBkZXNpZ25lZCBieSBSb24gUml2ZXN0IGluIDE5ODkuCisgKgorICogIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzExMTUudHh0CisgKiAgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTMxOS50eHQKKyAqLworCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFhZU1NMX01EMl9DKQorCisjaW5jbHVkZSAieHlzc2wvbWQyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBQSV9TVUJTVFsyNTZdID0KK3sKKyAgICAweDI5LCAweDJFLCAweDQzLCAweEM5LCAweEEyLCAweEQ4LCAweDdDLCAweDAxLCAweDNELCAweDM2LAorICAgIDB4NTQsIDB4QTEsIDB4RUMsIDB4RjAsIDB4MDYsIDB4MTMsIDB4NjIsIDB4QTcsIDB4MDUsIDB4RjMsCisgICAgMHhDMCwgMHhDNywgMHg3MywgMHg4QywgMHg5OCwgMHg5MywgMHgyQiwgMHhEOSwgMHhCQywgMHg0QywKKyAgICAweDgyLCAweENBLCAweDFFLCAweDlCLCAweDU3LCAweDNDLCAweEZELCAweEQ0LCAweEUwLCAweDE2LAorICAgIDB4NjcsIDB4NDIsIDB4NkYsIDB4MTgsIDB4OEEsIDB4MTcsIDB4RTUsIDB4MTIsIDB4QkUsIDB4NEUsCisgICAgMHhDNCwgMHhENiwgMHhEQSwgMHg5RSwgMHhERSwgMHg0OSwgMHhBMCwgMHhGQiwgMHhGNSwgMHg4RSwKKyAgICAweEJCLCAweDJGLCAweEVFLCAweDdBLCAweEE5LCAweDY4LCAweDc5LCAweDkxLCAweDE1LCAweEIyLAorICAgIDB4MDcsIDB4M0YsIDB4OTQsIDB4QzIsIDB4MTAsIDB4ODksIDB4MEIsIDB4MjIsIDB4NUYsIDB4MjEsCisgICAgMHg4MCwgMHg3RiwgMHg1RCwgMHg5QSwgMHg1QSwgMHg5MCwgMHgzMiwgMHgyNywgMHgzNSwgMHgzRSwKKyAgICAweENDLCAweEU3LCAweEJGLCAweEY3LCAweDk3LCAweDAzLCAweEZGLCAweDE5LCAweDMwLCAweEIzLAorICAgIDB4NDgsIDB4QTUsIDB4QjUsIDB4RDEsIDB4RDcsIDB4NUUsIDB4OTIsIDB4MkEsIDB4QUMsIDB4NTYsCisgICAgMHhBQSwgMHhDNiwgMHg0RiwgMHhCOCwgMHgzOCwgMHhEMiwgMHg5NiwgMHhBNCwgMHg3RCwgMHhCNiwKKyAgICAweDc2LCAweEZDLCAweDZCLCAweEUyLCAweDlDLCAweDc0LCAweDA0LCAweEYxLCAweDQ1LCAweDlELAorICAgIDB4NzAsIDB4NTksIDB4NjQsIDB4NzEsIDB4ODcsIDB4MjAsIDB4ODYsIDB4NUIsIDB4Q0YsIDB4NjUsCisgICAgMHhFNiwgMHgyRCwgMHhBOCwgMHgwMiwgMHgxQiwgMHg2MCwgMHgyNSwgMHhBRCwgMHhBRSwgMHhCMCwKKyAgICAweEI5LCAweEY2LCAweDFDLCAweDQ2LCAweDYxLCAweDY5LCAweDM0LCAweDQwLCAweDdFLCAweDBGLAorICAgIDB4NTUsIDB4NDcsIDB4QTMsIDB4MjMsIDB4REQsIDB4NTEsIDB4QUYsIDB4M0EsIDB4QzMsIDB4NUMsCisgICAgMHhGOSwgMHhDRSwgMHhCQSwgMHhDNSwgMHhFQSwgMHgyNiwgMHgyQywgMHg1MywgMHgwRCwgMHg2RSwKKyAgICAweDg1LCAweDI4LCAweDg0LCAweDA5LCAweEQzLCAweERGLCAweENELCAweEY0LCAweDQxLCAweDgxLAorICAgIDB4NEQsIDB4NTIsIDB4NkEsIDB4REMsIDB4MzcsIDB4QzgsIDB4NkMsIDB4QzEsIDB4QUIsIDB4RkEsCisgICAgMHgyNCwgMHhFMSwgMHg3QiwgMHgwOCwgMHgwQywgMHhCRCwgMHhCMSwgMHg0QSwgMHg3OCwgMHg4OCwKKyAgICAweDk1LCAweDhCLCAweEUzLCAweDYzLCAweEU4LCAweDZELCAweEU5LCAweENCLCAweEQ1LCAweEZFLAorICAgIDB4M0IsIDB4MDAsIDB4MUQsIDB4MzksIDB4RjIsIDB4RUYsIDB4QjcsIDB4MEUsIDB4NjYsIDB4NTgsCisgICAgMHhEMCwgMHhFNCwgMHhBNiwgMHg3NywgMHg3MiwgMHhGOCwgMHhFQiwgMHg3NSwgMHg0QiwgMHgwQSwKKyAgICAweDMxLCAweDQ0LCAweDUwLCAweEI0LCAweDhGLCAweEVELCAweDFGLCAweDFBLCAweERCLCAweDk5LAorICAgIDB4OEQsIDB4MzMsIDB4OUYsIDB4MTEsIDB4ODMsIDB4MTQKK307CisKKy8qCisgKiBNRDIgY29udGV4dCBzZXR1cAorICovCit2b2lkIG1kMl9zdGFydHMoIG1kMl9jb250ZXh0ICpjdHggKQoreworICAgIG1lbXNldCggY3R4LCAwLCBzaXplb2YoIG1kMl9jb250ZXh0ICkgKTsKK30KKworc3RhdGljIHZvaWQgbWQyX3Byb2Nlc3MoIG1kMl9jb250ZXh0ICpjdHggKQoreworICAgIGludCBpLCBqOworICAgIHVuc2lnbmVkIGNoYXIgdCA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMTY7IGkrKyApCisgICAgeworICAgICAgICBjdHgtPnN0YXRlW2kgKyAxNl0gPSBjdHgtPmJ1ZmZlcltpXTsKKyAgICAgICAgY3R4LT5zdGF0ZVtpICsgMzJdID0KKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSggY3R4LT5idWZmZXJbaV0gXiBjdHgtPnN0YXRlW2ldKTsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMTg7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgNDg7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0eC0+c3RhdGVbal0gPSAodW5zaWduZWQgY2hhcikKKyAgICAgICAgICAgICAgICggY3R4LT5zdGF0ZVtqXSBeIFBJX1NVQlNUW3RdICk7CisgICAgICAgICAgICB0ICA9IGN0eC0+c3RhdGVbal07CisgICAgICAgIH0KKworICAgICAgICB0ID0gKHVuc2lnbmVkIGNoYXIpKCB0ICsgaSApOworICAgIH0KKworICAgIHQgPSBjdHgtPmNrc3VtWzE1XTsKKworICAgIGZvciggaSA9IDA7IGkgPCAxNjsgaSsrICkKKyAgICB7CisgICAgICAgIGN0eC0+Y2tzdW1baV0gPSAodW5zaWduZWQgY2hhcikKKyAgICAgICAgICAgKCBjdHgtPmNrc3VtW2ldIF4gUElfU1VCU1RbY3R4LT5idWZmZXJbaV0gXiB0XSApOworICAgICAgICB0ICA9IGN0eC0+Y2tzdW1baV07CisgICAgfQorfQorCisvKgorICogTUQyIHByb2Nlc3MgYnVmZmVyCisgKi8KK3ZvaWQgbWQyX3VwZGF0ZSggbWQyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuICkKK3sKKyAgICBpbnQgZmlsbDsKKworICAgIHdoaWxlKCBpbGVuID4gMCApCisgICAgeworICAgICAgICBpZiggY3R4LT5sZWZ0ICsgaWxlbiA+IDE2ICkKKyAgICAgICAgICAgIGZpbGwgPSAxNiAtIGN0eC0+bGVmdDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmlsbCA9IGlsZW47CisKKyAgICAgICAgbWVtY3B5KCBjdHgtPmJ1ZmZlciArIGN0eC0+bGVmdCwgaW5wdXQsIGZpbGwgKTsKKworICAgICAgICBjdHgtPmxlZnQgKz0gZmlsbDsKKyAgICAgICAgaW5wdXQgKz0gZmlsbDsKKyAgICAgICAgaWxlbiAgLT0gZmlsbDsKKworICAgICAgICBpZiggY3R4LT5sZWZ0ID09IDE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgY3R4LT5sZWZ0ID0gMDsKKyAgICAgICAgICAgIG1kMl9wcm9jZXNzKCBjdHggKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIE1EMiBmaW5hbCBkaWdlc3QKKyAqLwordm9pZCBtZDJfZmluaXNoKCBtZDJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgeDsKKworICAgIHggPSAodW5zaWduZWQgY2hhcikoIDE2IC0gY3R4LT5sZWZ0ICk7CisKKyAgICBmb3IoIGkgPSBjdHgtPmxlZnQ7IGkgPCAxNjsgaSsrICkKKyAgICAgICAgY3R4LT5idWZmZXJbaV0gPSB4OworCisgICAgbWQyX3Byb2Nlc3MoIGN0eCApOworCisgICAgbWVtY3B5KCBjdHgtPmJ1ZmZlciwgY3R4LT5ja3N1bSwgMTYgKTsKKyAgICBtZDJfcHJvY2VzcyggY3R4ICk7CisKKyAgICBtZW1jcHkoIG91dHB1dCwgY3R4LT5zdGF0ZSwgMTYgKTsKK30KKworLyoKKyAqIG91dHB1dCA9IE1EMiggaW5wdXQgYnVmZmVyICkKKyAqLwordm9pZCBtZDIoIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICkKK3sKKyAgICBtZDJfY29udGV4dCBjdHg7CisKKyAgICBtZDJfc3RhcnRzKCAmY3R4ICk7CisgICAgbWQyX3VwZGF0ZSggJmN0eCwgaW5wdXQsIGlsZW4gKTsKKyAgICBtZDJfZmluaXNoKCAmY3R4LCBvdXRwdXQgKTsKKworICAgIG1lbXNldCggJmN0eCwgMCwgc2l6ZW9mKCBtZDJfY29udGV4dCApICk7Cit9CisKKy8qCisgKiBvdXRwdXQgPSBNRDIoIGZpbGUgY29udGVudHMgKQorICovCitpbnQgbWQyX2ZpbGUoIGNoYXIgKnBhdGgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApCit7CisgICAgRklMRSAqZjsKKyAgICBzaXplX3QgbjsKKyAgICBtZDJfY29udGV4dCBjdHg7CisgICAgdW5zaWduZWQgY2hhciBidWZbMTAyNF07CisKKyAgICBpZiggKCBmID0gZm9wZW4oIHBhdGgsICJyYiIgKSApID09IE5VTEwgKQorICAgICAgICByZXR1cm4oIDEgKTsKKworICAgIG1kMl9zdGFydHMoICZjdHggKTsKKworICAgIHdoaWxlKCAoIG4gPSBmcmVhZCggYnVmLCAxLCBzaXplb2YoIGJ1ZiApLCBmICkgKSA+IDAgKQorICAgICAgICBtZDJfdXBkYXRlKCAmY3R4LCBidWYsIChpbnQpIG4gKTsKKworICAgIG1kMl9maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIG1kMl9jb250ZXh0ICkgKTsKKworICAgIGlmKCBmZXJyb3IoIGYgKSAhPSAwICkKKyAgICB7CisgICAgICAgIGZjbG9zZSggZiApOworICAgICAgICByZXR1cm4oIDIgKTsKKyAgICB9CisKKyAgICBmY2xvc2UoIGYgKTsKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIE1EMiBITUFDIGNvbnRleHQgc2V0dXAKKyAqLwordm9pZCBtZDJfaG1hY19zdGFydHMoIG1kMl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBzdW1bMTZdOworCisgICAgaWYoIGtleWxlbiA+IDY0ICkKKyAgICB7CisgICAgICAgIG1kMigga2V5LCBrZXlsZW4sIHN1bSApOworICAgICAgICBrZXlsZW4gPSAxNjsKKyAgICAgICAga2V5ID0gc3VtOworICAgIH0KKworICAgIG1lbXNldCggY3R4LT5pcGFkLCAweDM2LCA2NCApOworICAgIG1lbXNldCggY3R4LT5vcGFkLCAweDVDLCA2NCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IGtleWxlbjsgaSsrICkKKyAgICB7CisgICAgICAgIGN0eC0+aXBhZFtpXSA9ICh1bnNpZ25lZCBjaGFyKSggY3R4LT5pcGFkW2ldIF4ga2V5W2ldICk7CisgICAgICAgIGN0eC0+b3BhZFtpXSA9ICh1bnNpZ25lZCBjaGFyKSggY3R4LT5vcGFkW2ldIF4ga2V5W2ldICk7CisgICAgfQorCisgICAgbWQyX3N0YXJ0cyggY3R4ICk7CisgICAgbWQyX3VwZGF0ZSggY3R4LCBjdHgtPmlwYWQsIDY0ICk7CisKKyAgICBtZW1zZXQoIHN1bSwgMCwgc2l6ZW9mKCBzdW0gKSApOworfQorCisvKgorICogTUQyIEhNQUMgcHJvY2VzcyBidWZmZXIKKyAqLwordm9pZCBtZDJfaG1hY191cGRhdGUoIG1kMl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApCit7CisgICAgbWQyX3VwZGF0ZSggY3R4LCBpbnB1dCwgaWxlbiApOworfQorCisvKgorICogTUQyIEhNQUMgZmluYWwgZGlnZXN0CisgKi8KK3ZvaWQgbWQyX2htYWNfZmluaXNoKCBtZDJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKQoreworICAgIHVuc2lnbmVkIGNoYXIgdG1wYnVmWzE2XTsKKworICAgIG1kMl9maW5pc2goIGN0eCwgdG1wYnVmICk7CisgICAgbWQyX3N0YXJ0cyggY3R4ICk7CisgICAgbWQyX3VwZGF0ZSggY3R4LCBjdHgtPm9wYWQsIDY0ICk7CisgICAgbWQyX3VwZGF0ZSggY3R4LCB0bXBidWYsIDE2ICk7CisgICAgbWQyX2ZpbmlzaCggY3R4LCBvdXRwdXQgKTsKKworICAgIG1lbXNldCggdG1wYnVmLCAwLCBzaXplb2YoIHRtcGJ1ZiApICk7Cit9CisKKy8qCisgKiBvdXRwdXQgPSBITUFDLU1EMiggaG1hYyBrZXksIGlucHV0IGJ1ZmZlciApCisgKi8KK3ZvaWQgbWQyX2htYWMoIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICkKK3sKKyAgICBtZDJfY29udGV4dCBjdHg7CisKKyAgICBtZDJfaG1hY19zdGFydHMoICZjdHgsIGtleSwga2V5bGVuICk7CisgICAgbWQyX2htYWNfdXBkYXRlKCAmY3R4LCBpbnB1dCwgaWxlbiApOworICAgIG1kMl9obWFjX2ZpbmlzaCggJmN0eCwgb3V0cHV0ICk7CisKKyAgICBtZW1zZXQoICZjdHgsIDAsIHNpemVvZiggbWQyX2NvbnRleHQgKSApOworfQorCisjaWYgZGVmaW5lZChYWVNTTF9TRUxGX1RFU1QpCisKKy8qCisgKiBSRkMgMTMxOSB0ZXN0IHZlY3RvcnMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgbWQyX3Rlc3Rfc3RyWzddWzgxXSA9Cit7CisgICAgeyAiIiB9LAorICAgIHsgImEiIH0sCisgICAgeyAiYWJjIiB9LAorICAgIHsgIm1lc3NhZ2UgZGlnZXN0IiB9LAorICAgIHsgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiB9LAorICAgIHsgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiB9LAorICAgIHsgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyIiBcCisgICAgICAiMzQ1Njc4OTAxMjM0NTY3ODkwIiB9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtZDJfdGVzdF9zdW1bN11bMTZdID0KK3sKKyAgICB7IDB4ODMsIDB4NTAsIDB4RTUsIDB4QTMsIDB4RTIsIDB4NEMsIDB4MTUsIDB4M0QsCisgICAgICAweEYyLCAweDI3LCAweDVDLCAweDlGLCAweDgwLCAweDY5LCAweDI3LCAweDczIH0sCisgICAgeyAweDMyLCAweEVDLCAweDAxLCAweEVDLCAweDRBLCAweDZELCAweEFDLCAweDcyLAorICAgICAgMHhDMCwgMHhBQiwgMHg5NiwgMHhGQiwgMHgzNCwgMHhDMCwgMHhCNSwgMHhEMSB9LAorICAgIHsgMHhEQSwgMHg4NSwgMHgzQiwgMHgwRCwgMHgzRiwgMHg4OCwgMHhEOSwgMHg5QiwKKyAgICAgIDB4MzAsIDB4MjgsIDB4M0EsIDB4NjksIDB4RTYsIDB4REUsIDB4RDYsIDB4QkIgfSwKKyAgICB7IDB4QUIsIDB4NEYsIDB4NDksIDB4NkIsIDB4RkIsIDB4MkEsIDB4NTMsIDB4MEIsCisgICAgICAweDIxLCAweDlGLCAweEYzLCAweDMwLCAweDMxLCAweEZFLCAweDA2LCAweEIwIH0sCisgICAgeyAweDRFLCAweDhELCAweERGLCAweEYzLCAweDY1LCAweDAyLCAweDkyLCAweEFCLAorICAgICAgMHg1QSwgMHg0MSwgMHgwOCwgMHhDMywgMHhBQSwgMHg0NywgMHg5NCwgMHgwQiB9LAorICAgIHsgMHhEQSwgMHgzMywgMHhERSwgMHhGMiwgMHhBNCwgMHgyRCwgMHhGMSwgMHgzOSwKKyAgICAgIDB4NzUsIDB4MzUsIDB4MjgsIDB4NDYsIDB4QzMsIDB4MDMsIDB4MzgsIDB4Q0QgfSwKKyAgICB7IDB4RDUsIDB4OTcsIDB4NkYsIDB4NzksIDB4RDgsIDB4M0QsIDB4M0EsIDB4MEQsCisgICAgICAweEM5LCAweDgwLCAweDZDLCAweDNDLCAweDY2LCAweEYzLCAweEVGLCAweEQ4IH0KK307CisKKy8qCisgKiBDaGVja3VwIHJvdXRpbmUKKyAqLworaW50IG1kMl9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIG1kMnN1bVsxNl07CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNzsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAiICBNRDIgdGVzdCAjJWQ6ICIsIGkgKyAxICk7CisKKyAgICAgICAgbWQyKCAodW5zaWduZWQgY2hhciAqKSBtZDJfdGVzdF9zdHJbaV0sCisgICAgICAgICAgICAgc3RybGVuKCBtZDJfdGVzdF9zdHJbaV0gKSwgbWQyc3VtICk7CisKKyAgICAgICAgaWYoIG1lbWNtcCggbWQyc3VtLCBtZDJfdGVzdF9zdW1baV0sIDE2ICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICByZXR1cm4oIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4iICk7CisgICAgfQorCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIlxuIiApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnJhcnkvbWQ0LmMgYi9saWJyYXJ5L21kNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZmNkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJyYXJ5L21kNC5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogIFJGQyAxMTg2LzEzMjAgY29tcGxpYW50IE1ENCBpbXBsZW1lbnRhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKy8qCisgKiAgVGhlIE1ENCBhbGdvcml0aG0gd2FzIGRlc2lnbmVkIGJ5IFJvbiBSaXZlc3QgaW4gMTk5MC4KKyAqCisgKiAgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTE4Ni50eHQKKyAqICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIwLnR4dAorICovCisKKyNpbmNsdWRlICJ4eXNzbC9jb25maWcuaCIKKworI2lmIGRlZmluZWQoWFlTU0xfTUQ0X0MpCisKKyNpbmNsdWRlICJ4eXNzbC9tZDQuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiAzMi1iaXQgaW50ZWdlciBtYW5pcHVsYXRpb24gbWFjcm9zIChsaXR0bGUgZW5kaWFuKQorICovCisjaWZuZGVmIEdFVF9VTE9OR19MRQorI2RlZmluZSBHRVRfVUxPTkdfTEUobixiLGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobikgPSAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICAgIF0gICAgICAgKSAgICAgICAgXAorICAgICAgICB8ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgKyAxXSA8PCAgOCApICAgICAgICBcCisgICAgICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDJdIDw8IDE2ICkgICAgICAgIFwKKyAgICAgICAgfCAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICsgM10gPDwgMjQgKTsgICAgICAgXAorfQorI2VuZGlmCisKKyNpZm5kZWYgUFVUX1VMT05HX0xFCisjZGVmaW5lIFBVVF9VTE9OR19MRShuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChiKVsoaSkgICAgXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSAgICAgICApOyAgICAgICBcCisgICAgKGIpWyhpKSArIDFdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+ICA4ICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgMl0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gMTYgKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAzXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAyNCApOyAgICAgICBcCit9CisjZW5kaWYKKworLyoKKyAqIE1ENCBjb250ZXh0IHNldHVwCisgKi8KK3ZvaWQgbWQ0X3N0YXJ0cyggbWQ0X2NvbnRleHQgKmN0eCApCit7CisgICAgY3R4LT50b3RhbFswXSA9IDA7CisgICAgY3R4LT50b3RhbFsxXSA9IDA7CisKKyAgICBjdHgtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKKyAgICBjdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKyAgICBjdHgtPnN0YXRlWzJdID0gMHg5OEJBRENGRTsKKyAgICBjdHgtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKK30KKworc3RhdGljIHZvaWQgbWQ0X3Byb2Nlc3MoIG1kNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgZGF0YVs2NF0gKQoreworICAgIHVuc2lnbmVkIGxvbmcgWFsxNl0sIEEsIEIsIEMsIEQ7CisKKyAgICBHRVRfVUxPTkdfTEUoIFhbIDBdLCBkYXRhLCAgMCApOworICAgIEdFVF9VTE9OR19MRSggWFsgMV0sIGRhdGEsICA0ICk7CisgICAgR0VUX1VMT05HX0xFKCBYWyAyXSwgZGF0YSwgIDggKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbIDNdLCBkYXRhLCAxMiApOworICAgIEdFVF9VTE9OR19MRSggWFsgNF0sIGRhdGEsIDE2ICk7CisgICAgR0VUX1VMT05HX0xFKCBYWyA1XSwgZGF0YSwgMjAgKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbIDZdLCBkYXRhLCAyNCApOworICAgIEdFVF9VTE9OR19MRSggWFsgN10sIGRhdGEsIDI4ICk7CisgICAgR0VUX1VMT05HX0xFKCBYWyA4XSwgZGF0YSwgMzIgKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbIDldLCBkYXRhLCAzNiApOworICAgIEdFVF9VTE9OR19MRSggWFsxMF0sIGRhdGEsIDQwICk7CisgICAgR0VUX1VMT05HX0xFKCBYWzExXSwgZGF0YSwgNDQgKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbMTJdLCBkYXRhLCA0OCApOworICAgIEdFVF9VTE9OR19MRSggWFsxM10sIGRhdGEsIDUyICk7CisgICAgR0VUX1VMT05HX0xFKCBYWzE0XSwgZGF0YSwgNTYgKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbMTVdLCBkYXRhLCA2MCApOworCisjZGVmaW5lIFMoeCxuKSAoKHggPDwgbikgfCAoKHggJiAweEZGRkZGRkZGKSA+PiAoMzIgLSBuKSkpCisKKyAgICBBID0gY3R4LT5zdGF0ZVswXTsKKyAgICBCID0gY3R4LT5zdGF0ZVsxXTsKKyAgICBDID0gY3R4LT5zdGF0ZVsyXTsKKyAgICBEID0gY3R4LT5zdGF0ZVszXTsKKworI2RlZmluZSBGKHgsIHksIHopICgoeCAmIHkpIHwgKCh+eCkgJiB6KSkKKyNkZWZpbmUgUChhLGIsYyxkLHgscykgeyBhICs9IEYoYixjLGQpICsgeDsgYSA9IFMoYSxzKTsgfQorCisgICAgUCggQSwgQiwgQywgRCwgWFsgMF0sICAzICk7CisgICAgUCggRCwgQSwgQiwgQywgWFsgMV0sICA3ICk7CisgICAgUCggQywgRCwgQSwgQiwgWFsgMl0sIDExICk7CisgICAgUCggQiwgQywgRCwgQSwgWFsgM10sIDE5ICk7CisgICAgUCggQSwgQiwgQywgRCwgWFsgNF0sICAzICk7CisgICAgUCggRCwgQSwgQiwgQywgWFsgNV0sICA3ICk7CisgICAgUCggQywgRCwgQSwgQiwgWFsgNl0sIDExICk7CisgICAgUCggQiwgQywgRCwgQSwgWFsgN10sIDE5ICk7CisgICAgUCggQSwgQiwgQywgRCwgWFsgOF0sICAzICk7CisgICAgUCggRCwgQSwgQiwgQywgWFsgOV0sICA3ICk7CisgICAgUCggQywgRCwgQSwgQiwgWFsxMF0sIDExICk7CisgICAgUCggQiwgQywgRCwgQSwgWFsxMV0sIDE5ICk7CisgICAgUCggQSwgQiwgQywgRCwgWFsxMl0sICAzICk7CisgICAgUCggRCwgQSwgQiwgQywgWFsxM10sICA3ICk7CisgICAgUCggQywgRCwgQSwgQiwgWFsxNF0sIDExICk7CisgICAgUCggQiwgQywgRCwgQSwgWFsxNV0sIDE5ICk7CisKKyN1bmRlZiBQCisjdW5kZWYgRgorCisjZGVmaW5lIEYoeCx5LHopICgoeCAmIHkpIHwgKHggJiB6KSB8ICh5ICYgeikpCisjZGVmaW5lIFAoYSxiLGMsZCx4LHMpIHsgYSArPSBGKGIsYyxkKSArIHggKyAweDVBODI3OTk5OyBhID0gUyhhLHMpOyB9CisKKyAgICBQKCBBLCBCLCBDLCBELCBYWyAwXSwgIDMgKTsKKyAgICBQKCBELCBBLCBCLCBDLCBYWyA0XSwgIDUgKTsKKyAgICBQKCBDLCBELCBBLCBCLCBYWyA4XSwgIDkgKTsKKyAgICBQKCBCLCBDLCBELCBBLCBYWzEyXSwgMTMgKTsKKyAgICBQKCBBLCBCLCBDLCBELCBYWyAxXSwgIDMgKTsKKyAgICBQKCBELCBBLCBCLCBDLCBYWyA1XSwgIDUgKTsKKyAgICBQKCBDLCBELCBBLCBCLCBYWyA5XSwgIDkgKTsKKyAgICBQKCBCLCBDLCBELCBBLCBYWzEzXSwgMTMgKTsKKyAgICBQKCBBLCBCLCBDLCBELCBYWyAyXSwgIDMgKTsKKyAgICBQKCBELCBBLCBCLCBDLCBYWyA2XSwgIDUgKTsKKyAgICBQKCBDLCBELCBBLCBCLCBYWzEwXSwgIDkgKTsKKyAgICBQKCBCLCBDLCBELCBBLCBYWzE0XSwgMTMgKTsKKyAgICBQKCBBLCBCLCBDLCBELCBYWyAzXSwgIDMgKTsKKyAgICBQKCBELCBBLCBCLCBDLCBYWyA3XSwgIDUgKTsKKyAgICBQKCBDLCBELCBBLCBCLCBYWzExXSwgIDkgKTsKKyAgICBQKCBCLCBDLCBELCBBLCBYWzE1XSwgMTMgKTsKKworI3VuZGVmIFAKKyN1bmRlZiBGCisKKyNkZWZpbmUgRih4LHkseikgKHggXiB5IF4geikKKyNkZWZpbmUgUChhLGIsYyxkLHgscykgeyBhICs9IEYoYixjLGQpICsgeCArIDB4NkVEOUVCQTE7IGEgPSBTKGEscyk7IH0KKworICAgIFAoIEEsIEIsIEMsIEQsIFhbIDBdLCAgMyApOworICAgIFAoIEQsIEEsIEIsIEMsIFhbIDhdLCAgOSApOworICAgIFAoIEMsIEQsIEEsIEIsIFhbIDRdLCAxMSApOworICAgIFAoIEIsIEMsIEQsIEEsIFhbMTJdLCAxNSApOworICAgIFAoIEEsIEIsIEMsIEQsIFhbIDJdLCAgMyApOworICAgIFAoIEQsIEEsIEIsIEMsIFhbMTBdLCAgOSApOworICAgIFAoIEMsIEQsIEEsIEIsIFhbIDZdLCAxMSApOworICAgIFAoIEIsIEMsIEQsIEEsIFhbMTRdLCAxNSApOworICAgIFAoIEEsIEIsIEMsIEQsIFhbIDFdLCAgMyApOworICAgIFAoIEQsIEEsIEIsIEMsIFhbIDldLCAgOSApOworICAgIFAoIEMsIEQsIEEsIEIsIFhbIDVdLCAxMSApOworICAgIFAoIEIsIEMsIEQsIEEsIFhbMTNdLCAxNSApOworICAgIFAoIEEsIEIsIEMsIEQsIFhbIDNdLCAgMyApOworICAgIFAoIEQsIEEsIEIsIEMsIFhbMTFdLCAgOSApOworICAgIFAoIEMsIEQsIEEsIEIsIFhbIDddLCAxMSApOworICAgIFAoIEIsIEMsIEQsIEEsIFhbMTVdLCAxNSApOworCisjdW5kZWYgRgorI3VuZGVmIFAKKworICAgIGN0eC0+c3RhdGVbMF0gKz0gQTsKKyAgICBjdHgtPnN0YXRlWzFdICs9IEI7CisgICAgY3R4LT5zdGF0ZVsyXSArPSBDOworICAgIGN0eC0+c3RhdGVbM10gKz0gRDsKK30KKworLyoKKyAqIE1ENCBwcm9jZXNzIGJ1ZmZlcgorICovCit2b2lkIG1kNF91cGRhdGUoIG1kNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApCit7CisgICAgaW50IGZpbGw7CisgICAgdW5zaWduZWQgbG9uZyBsZWZ0OworCisgICAgaWYoIGlsZW4gPD0gMCApCisgICAgICAgIHJldHVybjsKKworICAgIGxlZnQgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKKyAgICBmaWxsID0gNjQgLSBsZWZ0OworCisgICAgY3R4LT50b3RhbFswXSArPSBpbGVuOworICAgIGN0eC0+dG90YWxbMF0gJj0gMHhGRkZGRkZGRjsKKworICAgIGlmKCBjdHgtPnRvdGFsWzBdIDwgKHVuc2lnbmVkIGxvbmcpIGlsZW4gKQorICAgICAgICBjdHgtPnRvdGFsWzFdKys7CisKKyAgICBpZiggbGVmdCAmJiBpbGVuID49IGZpbGwgKQorICAgIHsKKyAgICAgICAgbWVtY3B5KCAodm9pZCAqKSAoY3R4LT5idWZmZXIgKyBsZWZ0KSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSBpbnB1dCwgZmlsbCApOworICAgICAgICBtZDRfcHJvY2VzcyggY3R4LCBjdHgtPmJ1ZmZlciApOworICAgICAgICBpbnB1dCArPSBmaWxsOworICAgICAgICBpbGVuICAtPSBmaWxsOworICAgICAgICBsZWZ0ID0gMDsKKyAgICB9CisKKyAgICB3aGlsZSggaWxlbiA+PSA2NCApCisgICAgeworICAgICAgICBtZDRfcHJvY2VzcyggY3R4LCBpbnB1dCApOworICAgICAgICBpbnB1dCArPSA2NDsKKyAgICAgICAgaWxlbiAgLT0gNjQ7CisgICAgfQorCisgICAgaWYoIGlsZW4gPiAwICkKKyAgICB7CisgICAgICAgIG1lbWNweSggKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksCisgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGlsZW4gKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1kNF9wYWRkaW5nWzY0XSA9Cit7CisgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworLyoKKyAqIE1ENCBmaW5hbCBkaWdlc3QKKyAqLwordm9pZCBtZDRfZmluaXNoKCBtZDRfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKQoreworICAgIHVuc2lnbmVkIGxvbmcgbGFzdCwgcGFkbjsKKyAgICB1bnNpZ25lZCBsb25nIGhpZ2gsIGxvdzsKKyAgICB1bnNpZ25lZCBjaGFyIG1zZ2xlbls4XTsKKworICAgIGhpZ2ggPSAoIGN0eC0+dG90YWxbMF0gPj4gMjkgKQorICAgICAgICAgfCAoIGN0eC0+dG90YWxbMV0gPDwgIDMgKTsKKyAgICBsb3cgID0gKCBjdHgtPnRvdGFsWzBdIDw8ICAzICk7CisKKyAgICBQVVRfVUxPTkdfTEUoIGxvdywgIG1zZ2xlbiwgMCApOworICAgIFBVVF9VTE9OR19MRSggaGlnaCwgbXNnbGVuLCA0ICk7CisKKyAgICBsYXN0ID0gY3R4LT50b3RhbFswXSAmIDB4M0Y7CisgICAgcGFkbiA9ICggbGFzdCA8IDU2ICkgPyAoIDU2IC0gbGFzdCApIDogKCAxMjAgLSBsYXN0ICk7CisKKyAgICBtZDRfdXBkYXRlKCBjdHgsICh1bnNpZ25lZCBjaGFyICopIG1kNF9wYWRkaW5nLCBwYWRuICk7CisgICAgbWQ0X3VwZGF0ZSggY3R4LCBtc2dsZW4sIDggKTsKKworICAgIFBVVF9VTE9OR19MRSggY3R4LT5zdGF0ZVswXSwgb3V0cHV0LCAgMCApOworICAgIFBVVF9VTE9OR19MRSggY3R4LT5zdGF0ZVsxXSwgb3V0cHV0LCAgNCApOworICAgIFBVVF9VTE9OR19MRSggY3R4LT5zdGF0ZVsyXSwgb3V0cHV0LCAgOCApOworICAgIFBVVF9VTE9OR19MRSggY3R4LT5zdGF0ZVszXSwgb3V0cHV0LCAxMiApOworfQorCisvKgorICogb3V0cHV0ID0gTUQ0KCBpbnB1dCBidWZmZXIgKQorICovCit2b2lkIG1kNCggdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKQoreworICAgIG1kNF9jb250ZXh0IGN0eDsKKworICAgIG1kNF9zdGFydHMoICZjdHggKTsKKyAgICBtZDRfdXBkYXRlKCAmY3R4LCBpbnB1dCwgaWxlbiApOworICAgIG1kNF9maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIG1kNF9jb250ZXh0ICkgKTsKK30KKworLyoKKyAqIG91dHB1dCA9IE1ENCggZmlsZSBjb250ZW50cyApCisgKi8KK2ludCBtZDRfZmlsZSggY2hhciAqcGF0aCwgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICkKK3sKKyAgICBGSUxFICpmOworICAgIHNpemVfdCBuOworICAgIG1kNF9jb250ZXh0IGN0eDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMDI0XTsKKworICAgIGlmKCAoIGYgPSBmb3BlbiggcGF0aCwgInJiIiApICkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiggMSApOworCisgICAgbWQ0X3N0YXJ0cyggJmN0eCApOworCisgICAgd2hpbGUoICggbiA9IGZyZWFkKCBidWYsIDEsIHNpemVvZiggYnVmICksIGYgKSApID4gMCApCisgICAgICAgIG1kNF91cGRhdGUoICZjdHgsIGJ1ZiwgKGludCkgbiApOworCisgICAgbWQ0X2ZpbmlzaCggJmN0eCwgb3V0cHV0ICk7CisKKyAgICBtZW1zZXQoICZjdHgsIDAsIHNpemVvZiggbWQ0X2NvbnRleHQgKSApOworCisgICAgaWYoIGZlcnJvciggZiApICE9IDAgKQorICAgIHsKKyAgICAgICAgZmNsb3NlKCBmICk7CisgICAgICAgIHJldHVybiggMiApOworICAgIH0KKworICAgIGZjbG9zZSggZiApOworICAgIHJldHVybiggMCApOworfQorCisvKgorICogTUQ0IEhNQUMgY29udGV4dCBzZXR1cAorICovCit2b2lkIG1kNF9obWFjX3N0YXJ0cyggbWQ0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuICkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIHN1bVsxNl07CisKKyAgICBpZigga2V5bGVuID4gNjQgKQorICAgIHsKKyAgICAgICAgbWQ0KCBrZXksIGtleWxlbiwgc3VtICk7CisgICAgICAgIGtleWxlbiA9IDE2OworICAgICAgICBrZXkgPSBzdW07CisgICAgfQorCisgICAgbWVtc2V0KCBjdHgtPmlwYWQsIDB4MzYsIDY0ICk7CisgICAgbWVtc2V0KCBjdHgtPm9wYWQsIDB4NUMsIDY0ICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwga2V5bGVuOyBpKysgKQorICAgIHsKKyAgICAgICAgY3R4LT5pcGFkW2ldID0gKHVuc2lnbmVkIGNoYXIpKCBjdHgtPmlwYWRbaV0gXiBrZXlbaV0gKTsKKyAgICAgICAgY3R4LT5vcGFkW2ldID0gKHVuc2lnbmVkIGNoYXIpKCBjdHgtPm9wYWRbaV0gXiBrZXlbaV0gKTsKKyAgICB9CisKKyAgICBtZDRfc3RhcnRzKCBjdHggKTsKKyAgICBtZDRfdXBkYXRlKCBjdHgsIGN0eC0+aXBhZCwgNjQgKTsKKworICAgIG1lbXNldCggc3VtLCAwLCBzaXplb2YoIHN1bSApICk7Cit9CisKKy8qCisgKiBNRDQgSE1BQyBwcm9jZXNzIGJ1ZmZlcgorICovCit2b2lkIG1kNF9obWFjX3VwZGF0ZSggbWQ0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuICkKK3sKKyAgICBtZDRfdXBkYXRlKCBjdHgsIGlucHV0LCBpbGVuICk7Cit9CisKKy8qCisgKiBNRDQgSE1BQyBmaW5hbCBkaWdlc3QKKyAqLwordm9pZCBtZDRfaG1hY19maW5pc2goIG1kNF9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApCit7CisgICAgdW5zaWduZWQgY2hhciB0bXBidWZbMTZdOworCisgICAgbWQ0X2ZpbmlzaCggY3R4LCB0bXBidWYgKTsKKyAgICBtZDRfc3RhcnRzKCBjdHggKTsKKyAgICBtZDRfdXBkYXRlKCBjdHgsIGN0eC0+b3BhZCwgNjQgKTsKKyAgICBtZDRfdXBkYXRlKCBjdHgsIHRtcGJ1ZiwgMTYgKTsKKyAgICBtZDRfZmluaXNoKCBjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCB0bXBidWYsIDAsIHNpemVvZiggdG1wYnVmICkgKTsKK30KKworLyoKKyAqIG91dHB1dCA9IEhNQUMtTUQ0KCBobWFjIGtleSwgaW5wdXQgYnVmZmVyICkKKyAqLwordm9pZCBtZDRfaG1hYyggdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKQoreworICAgIG1kNF9jb250ZXh0IGN0eDsKKworICAgIG1kNF9obWFjX3N0YXJ0cyggJmN0eCwga2V5LCBrZXlsZW4gKTsKKyAgICBtZDRfaG1hY191cGRhdGUoICZjdHgsIGlucHV0LCBpbGVuICk7CisgICAgbWQ0X2htYWNfZmluaXNoKCAmY3R4LCBvdXRwdXQgKTsKKworICAgIG1lbXNldCggJmN0eCwgMCwgc2l6ZW9mKCBtZDRfY29udGV4dCApICk7Cit9CisKKyNpZiBkZWZpbmVkKFhZU1NMX1NFTEZfVEVTVCkKKworLyoKKyAqIFJGQyAxMzIwIHRlc3QgdmVjdG9ycworICovCitzdGF0aWMgY29uc3QgY2hhciBtZDRfdGVzdF9zdHJbN11bODFdID0KK3sKKyAgICB7ICIiIH0sIAorICAgIHsgImEiIH0sCisgICAgeyAiYWJjIiB9LAorICAgIHsgIm1lc3NhZ2UgZGlnZXN0IiB9LAorICAgIHsgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiB9LAorICAgIHsgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiB9LAorICAgIHsgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyIiBcCisgICAgICAiMzQ1Njc4OTAxMjM0NTY3ODkwIiB9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtZDRfdGVzdF9zdW1bN11bMTZdID0KK3sKKyAgICB7IDB4MzEsIDB4RDYsIDB4Q0YsIDB4RTAsIDB4RDEsIDB4NkEsIDB4RTksIDB4MzEsCisgICAgICAweEI3LCAweDNDLCAweDU5LCAweEQ3LCAweEUwLCAweEMwLCAweDg5LCAweEMwIH0sCisgICAgeyAweEJELCAweEU1LCAweDJDLCAweEIzLCAweDFELCAweEUzLCAweDNFLCAweDQ2LAorICAgICAgMHgyNCwgMHg1RSwgMHgwNSwgMHhGQiwgMHhEQiwgMHhENiwgMHhGQiwgMHgyNCB9LAorICAgIHsgMHhBNCwgMHg0OCwgMHgwMSwgMHg3QSwgMHhBRiwgMHgyMSwgMHhEOCwgMHg1MiwKKyAgICAgIDB4NUYsIDB4QzEsIDB4MEEsIDB4RTgsIDB4N0EsIDB4QTYsIDB4NzIsIDB4OUQgfSwKKyAgICB7IDB4RDksIDB4MTMsIDB4MEEsIDB4ODEsIDB4NjQsIDB4NTQsIDB4OUYsIDB4RTgsCisgICAgICAweDE4LCAweDg3LCAweDQ4LCAweDA2LCAweEUxLCAweEM3LCAweDAxLCAweDRCIH0sCisgICAgeyAweEQ3LCAweDlFLCAweDFDLCAweDMwLCAweDhBLCAweEE1LCAweEJCLCAweENELAorICAgICAgMHhFRSwgMHhBOCwgMHhFRCwgMHg2MywgMHhERiwgMHg0MSwgMHgyRCwgMHhBOSB9LAorICAgIHsgMHgwNCwgMHgzRiwgMHg4NSwgMHg4MiwgMHhGMiwgMHg0MSwgMHhEQiwgMHgzNSwKKyAgICAgIDB4MUMsIDB4RTYsIDB4MjcsIDB4RTEsIDB4NTMsIDB4RTcsIDB4RjAsIDB4RTQgfSwKKyAgICB7IDB4RTMsIDB4M0IsIDB4NEQsIDB4REMsIDB4OUMsIDB4MzgsIDB4RjIsIDB4MTksCisgICAgICAweDlDLCAweDNFLCAweDdCLCAweDE2LCAweDRGLCAweENDLCAweDA1LCAweDM2IH0KK307CisKKy8qCisgKiBDaGVja3VwIHJvdXRpbmUKKyAqLworaW50IG1kNF9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIG1kNHN1bVsxNl07CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNzsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAiICBNRDQgdGVzdCAjJWQ6ICIsIGkgKyAxICk7CisKKyAgICAgICAgbWQ0KCAodW5zaWduZWQgY2hhciAqKSBtZDRfdGVzdF9zdHJbaV0sCisgICAgICAgICAgICAgc3RybGVuKCBtZDRfdGVzdF9zdHJbaV0gKSwgbWQ0c3VtICk7CisKKyAgICAgICAgaWYoIG1lbWNtcCggbWQ0c3VtLCBtZDRfdGVzdF9zdW1baV0sIDE2ICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICByZXR1cm4oIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4iICk7CisgICAgfQorCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIlxuIiApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnJhcnkvbWQ1LmMgYi9saWJyYXJ5L21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Mjk0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJyYXJ5L21kNS5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogIFJGQyAxMzIxIGNvbXBsaWFudCBNRDUgaW1wbGVtZW50YXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisvKgorICogIFRoZSBNRDUgYWxnb3JpdGhtIHdhcyBkZXNpZ25lZCBieSBSb24gUml2ZXN0IGluIDE5OTEuCisgKgorICogIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0CisgKi8KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChYWVNTTF9NRDVfQykKKworI2luY2x1ZGUgInh5c3NsL21kNS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIDMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbiBtYWNyb3MgKGxpdHRsZSBlbmRpYW4pCisgKi8KKyNpZm5kZWYgR0VUX1VMT05HX0xFCisjZGVmaW5lIEdFVF9VTE9OR19MRShuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuKSA9ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgICAgXSAgICAgICApICAgICAgICBcCisgICAgICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDFdIDw8ICA4ICkgICAgICAgIFwKKyAgICAgICAgfCAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICsgMl0gPDwgMTYgKSAgICAgICAgXAorICAgICAgICB8ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgKyAzXSA8PCAyNCApOyAgICAgICBcCit9CisjZW5kaWYKKworI2lmbmRlZiBQVVRfVUxPTkdfTEUKKyNkZWZpbmUgUFVUX1VMT05HX0xFKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGIpWyhpKSAgICBdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pICAgICAgICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgMV0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gIDggKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAxNiApOyAgICAgICBcCisgICAgKGIpWyhpKSArIDNdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+IDI0ICk7ICAgICAgIFwKK30KKyNlbmRpZgorCisvKgorICogTUQ1IGNvbnRleHQgc2V0dXAKKyAqLwordm9pZCBtZDVfc3RhcnRzKCBtZDVfY29udGV4dCAqY3R4ICkKK3sKKyAgICBjdHgtPnRvdGFsWzBdID0gMDsKKyAgICBjdHgtPnRvdGFsWzFdID0gMDsKKworICAgIGN0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworICAgIGN0eC0+c3RhdGVbMV0gPSAweEVGQ0RBQjg5OworICAgIGN0eC0+c3RhdGVbMl0gPSAweDk4QkFEQ0ZFOworICAgIGN0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OworfQorCitzdGF0aWMgdm9pZCBtZDVfcHJvY2VzcyggbWQ1X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBkYXRhWzY0XSApCit7CisgICAgdW5zaWduZWQgbG9uZyBYWzE2XSwgQSwgQiwgQywgRDsKKworICAgIEdFVF9VTE9OR19MRSggWFsgMF0sIGRhdGEsICAwICk7CisgICAgR0VUX1VMT05HX0xFKCBYWyAxXSwgZGF0YSwgIDQgKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbIDJdLCBkYXRhLCAgOCApOworICAgIEdFVF9VTE9OR19MRSggWFsgM10sIGRhdGEsIDEyICk7CisgICAgR0VUX1VMT05HX0xFKCBYWyA0XSwgZGF0YSwgMTYgKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbIDVdLCBkYXRhLCAyMCApOworICAgIEdFVF9VTE9OR19MRSggWFsgNl0sIGRhdGEsIDI0ICk7CisgICAgR0VUX1VMT05HX0xFKCBYWyA3XSwgZGF0YSwgMjggKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbIDhdLCBkYXRhLCAzMiApOworICAgIEdFVF9VTE9OR19MRSggWFsgOV0sIGRhdGEsIDM2ICk7CisgICAgR0VUX1VMT05HX0xFKCBYWzEwXSwgZGF0YSwgNDAgKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbMTFdLCBkYXRhLCA0NCApOworICAgIEdFVF9VTE9OR19MRSggWFsxMl0sIGRhdGEsIDQ4ICk7CisgICAgR0VUX1VMT05HX0xFKCBYWzEzXSwgZGF0YSwgNTIgKTsKKyAgICBHRVRfVUxPTkdfTEUoIFhbMTRdLCBkYXRhLCA1NiApOworICAgIEdFVF9VTE9OR19MRSggWFsxNV0sIGRhdGEsIDYwICk7CisKKyNkZWZpbmUgUyh4LG4pICgoeCA8PCBuKSB8ICgoeCAmIDB4RkZGRkZGRkYpID4+ICgzMiAtIG4pKSkKKworI2RlZmluZSBQKGEsYixjLGQsayxzLHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhICs9IEYoYixjLGQpICsgWFtrXSArIHQ7IGEgPSBTKGEscykgKyBiOyAgICAgICAgICAgXAorfQorCisgICAgQSA9IGN0eC0+c3RhdGVbMF07CisgICAgQiA9IGN0eC0+c3RhdGVbMV07CisgICAgQyA9IGN0eC0+c3RhdGVbMl07CisgICAgRCA9IGN0eC0+c3RhdGVbM107CisKKyNkZWZpbmUgRih4LHkseikgKHogXiAoeCAmICh5IF4geikpKQorCisgICAgUCggQSwgQiwgQywgRCwgIDAsICA3LCAweEQ3NkFBNDc4ICk7CisgICAgUCggRCwgQSwgQiwgQywgIDEsIDEyLCAweEU4QzdCNzU2ICk7CisgICAgUCggQywgRCwgQSwgQiwgIDIsIDE3LCAweDI0MjA3MERCICk7CisgICAgUCggQiwgQywgRCwgQSwgIDMsIDIyLCAweEMxQkRDRUVFICk7CisgICAgUCggQSwgQiwgQywgRCwgIDQsICA3LCAweEY1N0MwRkFGICk7CisgICAgUCggRCwgQSwgQiwgQywgIDUsIDEyLCAweDQ3ODdDNjJBICk7CisgICAgUCggQywgRCwgQSwgQiwgIDYsIDE3LCAweEE4MzA0NjEzICk7CisgICAgUCggQiwgQywgRCwgQSwgIDcsIDIyLCAweEZENDY5NTAxICk7CisgICAgUCggQSwgQiwgQywgRCwgIDgsICA3LCAweDY5ODA5OEQ4ICk7CisgICAgUCggRCwgQSwgQiwgQywgIDksIDEyLCAweDhCNDRGN0FGICk7CisgICAgUCggQywgRCwgQSwgQiwgMTAsIDE3LCAweEZGRkY1QkIxICk7CisgICAgUCggQiwgQywgRCwgQSwgMTEsIDIyLCAweDg5NUNEN0JFICk7CisgICAgUCggQSwgQiwgQywgRCwgMTIsICA3LCAweDZCOTAxMTIyICk7CisgICAgUCggRCwgQSwgQiwgQywgMTMsIDEyLCAweEZEOTg3MTkzICk7CisgICAgUCggQywgRCwgQSwgQiwgMTQsIDE3LCAweEE2Nzk0MzhFICk7CisgICAgUCggQiwgQywgRCwgQSwgMTUsIDIyLCAweDQ5QjQwODIxICk7CisKKyN1bmRlZiBGCisKKyNkZWZpbmUgRih4LHkseikgKHkgXiAoeiAmICh4IF4geSkpKQorCisgICAgUCggQSwgQiwgQywgRCwgIDEsICA1LCAweEY2MUUyNTYyICk7CisgICAgUCggRCwgQSwgQiwgQywgIDYsICA5LCAweEMwNDBCMzQwICk7CisgICAgUCggQywgRCwgQSwgQiwgMTEsIDE0LCAweDI2NUU1QTUxICk7CisgICAgUCggQiwgQywgRCwgQSwgIDAsIDIwLCAweEU5QjZDN0FBICk7CisgICAgUCggQSwgQiwgQywgRCwgIDUsICA1LCAweEQ2MkYxMDVEICk7CisgICAgUCggRCwgQSwgQiwgQywgMTAsICA5LCAweDAyNDQxNDUzICk7CisgICAgUCggQywgRCwgQSwgQiwgMTUsIDE0LCAweEQ4QTFFNjgxICk7CisgICAgUCggQiwgQywgRCwgQSwgIDQsIDIwLCAweEU3RDNGQkM4ICk7CisgICAgUCggQSwgQiwgQywgRCwgIDksICA1LCAweDIxRTFDREU2ICk7CisgICAgUCggRCwgQSwgQiwgQywgMTQsICA5LCAweEMzMzcwN0Q2ICk7CisgICAgUCggQywgRCwgQSwgQiwgIDMsIDE0LCAweEY0RDUwRDg3ICk7CisgICAgUCggQiwgQywgRCwgQSwgIDgsIDIwLCAweDQ1NUExNEVEICk7CisgICAgUCggQSwgQiwgQywgRCwgMTMsICA1LCAweEE5RTNFOTA1ICk7CisgICAgUCggRCwgQSwgQiwgQywgIDIsICA5LCAweEZDRUZBM0Y4ICk7CisgICAgUCggQywgRCwgQSwgQiwgIDcsIDE0LCAweDY3NkYwMkQ5ICk7CisgICAgUCggQiwgQywgRCwgQSwgMTIsIDIwLCAweDhEMkE0QzhBICk7CisKKyN1bmRlZiBGCisgICAgCisjZGVmaW5lIEYoeCx5LHopICh4IF4geSBeIHopCisKKyAgICBQKCBBLCBCLCBDLCBELCAgNSwgIDQsIDB4RkZGQTM5NDIgKTsKKyAgICBQKCBELCBBLCBCLCBDLCAgOCwgMTEsIDB4ODc3MUY2ODEgKTsKKyAgICBQKCBDLCBELCBBLCBCLCAxMSwgMTYsIDB4NkQ5RDYxMjIgKTsKKyAgICBQKCBCLCBDLCBELCBBLCAxNCwgMjMsIDB4RkRFNTM4MEMgKTsKKyAgICBQKCBBLCBCLCBDLCBELCAgMSwgIDQsIDB4QTRCRUVBNDQgKTsKKyAgICBQKCBELCBBLCBCLCBDLCAgNCwgMTEsIDB4NEJERUNGQTkgKTsKKyAgICBQKCBDLCBELCBBLCBCLCAgNywgMTYsIDB4RjZCQjRCNjAgKTsKKyAgICBQKCBCLCBDLCBELCBBLCAxMCwgMjMsIDB4QkVCRkJDNzAgKTsKKyAgICBQKCBBLCBCLCBDLCBELCAxMywgIDQsIDB4Mjg5QjdFQzYgKTsKKyAgICBQKCBELCBBLCBCLCBDLCAgMCwgMTEsIDB4RUFBMTI3RkEgKTsKKyAgICBQKCBDLCBELCBBLCBCLCAgMywgMTYsIDB4RDRFRjMwODUgKTsKKyAgICBQKCBCLCBDLCBELCBBLCAgNiwgMjMsIDB4MDQ4ODFEMDUgKTsKKyAgICBQKCBBLCBCLCBDLCBELCAgOSwgIDQsIDB4RDlENEQwMzkgKTsKKyAgICBQKCBELCBBLCBCLCBDLCAxMiwgMTEsIDB4RTZEQjk5RTUgKTsKKyAgICBQKCBDLCBELCBBLCBCLCAxNSwgMTYsIDB4MUZBMjdDRjggKTsKKyAgICBQKCBCLCBDLCBELCBBLCAgMiwgMjMsIDB4QzRBQzU2NjUgKTsKKworI3VuZGVmIEYKKworI2RlZmluZSBGKHgseSx6KSAoeSBeICh4IHwgfnopKQorCisgICAgUCggQSwgQiwgQywgRCwgIDAsICA2LCAweEY0MjkyMjQ0ICk7CisgICAgUCggRCwgQSwgQiwgQywgIDcsIDEwLCAweDQzMkFGRjk3ICk7CisgICAgUCggQywgRCwgQSwgQiwgMTQsIDE1LCAweEFCOTQyM0E3ICk7CisgICAgUCggQiwgQywgRCwgQSwgIDUsIDIxLCAweEZDOTNBMDM5ICk7CisgICAgUCggQSwgQiwgQywgRCwgMTIsICA2LCAweDY1NUI1OUMzICk7CisgICAgUCggRCwgQSwgQiwgQywgIDMsIDEwLCAweDhGMENDQzkyICk7CisgICAgUCggQywgRCwgQSwgQiwgMTAsIDE1LCAweEZGRUZGNDdEICk7CisgICAgUCggQiwgQywgRCwgQSwgIDEsIDIxLCAweDg1ODQ1REQxICk7CisgICAgUCggQSwgQiwgQywgRCwgIDgsICA2LCAweDZGQTg3RTRGICk7CisgICAgUCggRCwgQSwgQiwgQywgMTUsIDEwLCAweEZFMkNFNkUwICk7CisgICAgUCggQywgRCwgQSwgQiwgIDYsIDE1LCAweEEzMDE0MzE0ICk7CisgICAgUCggQiwgQywgRCwgQSwgMTMsIDIxLCAweDRFMDgxMUExICk7CisgICAgUCggQSwgQiwgQywgRCwgIDQsICA2LCAweEY3NTM3RTgyICk7CisgICAgUCggRCwgQSwgQiwgQywgMTEsIDEwLCAweEJEM0FGMjM1ICk7CisgICAgUCggQywgRCwgQSwgQiwgIDIsIDE1LCAweDJBRDdEMkJCICk7CisgICAgUCggQiwgQywgRCwgQSwgIDksIDIxLCAweEVCODZEMzkxICk7CisKKyN1bmRlZiBGCisKKyAgICBjdHgtPnN0YXRlWzBdICs9IEE7CisgICAgY3R4LT5zdGF0ZVsxXSArPSBCOworICAgIGN0eC0+c3RhdGVbMl0gKz0gQzsKKyAgICBjdHgtPnN0YXRlWzNdICs9IEQ7Cit9CisKKy8qCisgKiBNRDUgcHJvY2VzcyBidWZmZXIKKyAqLwordm9pZCBtZDVfdXBkYXRlKCBtZDVfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4gKQoreworICAgIGludCBmaWxsOworICAgIHVuc2lnbmVkIGxvbmcgbGVmdDsKKworICAgIGlmKCBpbGVuIDw9IDAgKQorICAgICAgICByZXR1cm47CisKKyAgICBsZWZ0ID0gY3R4LT50b3RhbFswXSAmIDB4M0Y7CisgICAgZmlsbCA9IDY0IC0gbGVmdDsKKworICAgIGN0eC0+dG90YWxbMF0gKz0gaWxlbjsKKyAgICBjdHgtPnRvdGFsWzBdICY9IDB4RkZGRkZGRkY7CisKKyAgICBpZiggY3R4LT50b3RhbFswXSA8ICh1bnNpZ25lZCBsb25nKSBpbGVuICkKKyAgICAgICAgY3R4LT50b3RhbFsxXSsrOworCisgICAgaWYoIGxlZnQgJiYgaWxlbiA+PSBmaWxsICkKKyAgICB7CisgICAgICAgIG1lbWNweSggKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksCisgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGZpbGwgKTsKKyAgICAgICAgbWQ1X3Byb2Nlc3MoIGN0eCwgY3R4LT5idWZmZXIgKTsKKyAgICAgICAgaW5wdXQgKz0gZmlsbDsKKyAgICAgICAgaWxlbiAgLT0gZmlsbDsKKyAgICAgICAgbGVmdCA9IDA7CisgICAgfQorCisgICAgd2hpbGUoIGlsZW4gPj0gNjQgKQorICAgIHsKKyAgICAgICAgbWQ1X3Byb2Nlc3MoIGN0eCwgaW5wdXQgKTsKKyAgICAgICAgaW5wdXQgKz0gNjQ7CisgICAgICAgIGlsZW4gIC09IDY0OworICAgIH0KKworICAgIGlmKCBpbGVuID4gMCApCisgICAgeworICAgICAgICBtZW1jcHkoICh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLAorICAgICAgICAgICAgICAgICh2b2lkICopIGlucHV0LCBpbGVuICk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtZDVfcGFkZGluZ1s2NF0gPQoreworIDB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKKy8qCisgKiBNRDUgZmluYWwgZGlnZXN0CisgKi8KK3ZvaWQgbWQ1X2ZpbmlzaCggbWQ1X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGxhc3QsIHBhZG47CisgICAgdW5zaWduZWQgbG9uZyBoaWdoLCBsb3c7CisgICAgdW5zaWduZWQgY2hhciBtc2dsZW5bOF07CisKKyAgICBoaWdoID0gKCBjdHgtPnRvdGFsWzBdID4+IDI5ICkKKyAgICAgICAgIHwgKCBjdHgtPnRvdGFsWzFdIDw8ICAzICk7CisgICAgbG93ICA9ICggY3R4LT50b3RhbFswXSA8PCAgMyApOworCisgICAgUFVUX1VMT05HX0xFKCBsb3csICBtc2dsZW4sIDAgKTsKKyAgICBQVVRfVUxPTkdfTEUoIGhpZ2gsIG1zZ2xlbiwgNCApOworCisgICAgbGFzdCA9IGN0eC0+dG90YWxbMF0gJiAweDNGOworICAgIHBhZG4gPSAoIGxhc3QgPCA1NiApID8gKCA1NiAtIGxhc3QgKSA6ICggMTIwIC0gbGFzdCApOworCisgICAgbWQ1X3VwZGF0ZSggY3R4LCAodW5zaWduZWQgY2hhciAqKSBtZDVfcGFkZGluZywgcGFkbiApOworICAgIG1kNV91cGRhdGUoIGN0eCwgbXNnbGVuLCA4ICk7CisKKyAgICBQVVRfVUxPTkdfTEUoIGN0eC0+c3RhdGVbMF0sIG91dHB1dCwgIDAgKTsKKyAgICBQVVRfVUxPTkdfTEUoIGN0eC0+c3RhdGVbMV0sIG91dHB1dCwgIDQgKTsKKyAgICBQVVRfVUxPTkdfTEUoIGN0eC0+c3RhdGVbMl0sIG91dHB1dCwgIDggKTsKKyAgICBQVVRfVUxPTkdfTEUoIGN0eC0+c3RhdGVbM10sIG91dHB1dCwgMTIgKTsKK30KKworLyoKKyAqIG91dHB1dCA9IE1ENSggaW5wdXQgYnVmZmVyICkKKyAqLwordm9pZCBtZDUoIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICkKK3sKKyAgICBtZDVfY29udGV4dCBjdHg7CisKKyAgICBtZDVfc3RhcnRzKCAmY3R4ICk7CisgICAgbWQ1X3VwZGF0ZSggJmN0eCwgaW5wdXQsIGlsZW4gKTsKKyAgICBtZDVfZmluaXNoKCAmY3R4LCBvdXRwdXQgKTsKKworICAgIG1lbXNldCggJmN0eCwgMCwgc2l6ZW9mKCBtZDVfY29udGV4dCApICk7Cit9CisKKy8qCisgKiBvdXRwdXQgPSBNRDUoIGZpbGUgY29udGVudHMgKQorICovCitpbnQgbWQ1X2ZpbGUoIGNoYXIgKnBhdGgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzE2XSApCit7CisgICAgRklMRSAqZjsKKyAgICBzaXplX3QgbjsKKyAgICBtZDVfY29udGV4dCBjdHg7CisgICAgdW5zaWduZWQgY2hhciBidWZbMTAyNF07CisKKyAgICBpZiggKCBmID0gZm9wZW4oIHBhdGgsICJyYiIgKSApID09IE5VTEwgKQorICAgICAgICByZXR1cm4oIDEgKTsKKworICAgIG1kNV9zdGFydHMoICZjdHggKTsKKworICAgIHdoaWxlKCAoIG4gPSBmcmVhZCggYnVmLCAxLCBzaXplb2YoIGJ1ZiApLCBmICkgKSA+IDAgKQorICAgICAgICBtZDVfdXBkYXRlKCAmY3R4LCBidWYsIChpbnQpIG4gKTsKKworICAgIG1kNV9maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIG1kNV9jb250ZXh0ICkgKTsKKworICAgIGlmKCBmZXJyb3IoIGYgKSAhPSAwICkKKyAgICB7CisgICAgICAgIGZjbG9zZSggZiApOworICAgICAgICByZXR1cm4oIDIgKTsKKyAgICB9CisKKyAgICBmY2xvc2UoIGYgKTsKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIE1ENSBITUFDIGNvbnRleHQgc2V0dXAKKyAqLwordm9pZCBtZDVfaG1hY19zdGFydHMoIG1kNV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBzdW1bMTZdOworCisgICAgaWYoIGtleWxlbiA+IDY0ICkKKyAgICB7CisgICAgICAgIG1kNSgga2V5LCBrZXlsZW4sIHN1bSApOworICAgICAgICBrZXlsZW4gPSAxNjsKKyAgICAgICAga2V5ID0gc3VtOworICAgIH0KKworICAgIG1lbXNldCggY3R4LT5pcGFkLCAweDM2LCA2NCApOworICAgIG1lbXNldCggY3R4LT5vcGFkLCAweDVDLCA2NCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IGtleWxlbjsgaSsrICkKKyAgICB7CisgICAgICAgIGN0eC0+aXBhZFtpXSA9ICh1bnNpZ25lZCBjaGFyKSggY3R4LT5pcGFkW2ldIF4ga2V5W2ldICk7CisgICAgICAgIGN0eC0+b3BhZFtpXSA9ICh1bnNpZ25lZCBjaGFyKSggY3R4LT5vcGFkW2ldIF4ga2V5W2ldICk7CisgICAgfQorCisgICAgbWQ1X3N0YXJ0cyggY3R4ICk7CisgICAgbWQ1X3VwZGF0ZSggY3R4LCBjdHgtPmlwYWQsIDY0ICk7CisKKyAgICBtZW1zZXQoIHN1bSwgMCwgc2l6ZW9mKCBzdW0gKSApOworfQorCisvKgorICogTUQ1IEhNQUMgcHJvY2VzcyBidWZmZXIKKyAqLwordm9pZCBtZDVfaG1hY191cGRhdGUoIG1kNV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApCit7CisgICAgbWQ1X3VwZGF0ZSggY3R4LCBpbnB1dCwgaWxlbiApOworfQorCisvKgorICogTUQ1IEhNQUMgZmluYWwgZGlnZXN0CisgKi8KK3ZvaWQgbWQ1X2htYWNfZmluaXNoKCBtZDVfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIG91dHB1dFsxNl0gKQoreworICAgIHVuc2lnbmVkIGNoYXIgdG1wYnVmWzE2XTsKKworICAgIG1kNV9maW5pc2goIGN0eCwgdG1wYnVmICk7CisgICAgbWQ1X3N0YXJ0cyggY3R4ICk7CisgICAgbWQ1X3VwZGF0ZSggY3R4LCBjdHgtPm9wYWQsIDY0ICk7CisgICAgbWQ1X3VwZGF0ZSggY3R4LCB0bXBidWYsIDE2ICk7CisgICAgbWQ1X2ZpbmlzaCggY3R4LCBvdXRwdXQgKTsKKworICAgIG1lbXNldCggdG1wYnVmLCAwLCBzaXplb2YoIHRtcGJ1ZiApICk7Cit9CisKKy8qCisgKiBvdXRwdXQgPSBITUFDLU1ENSggaG1hYyBrZXksIGlucHV0IGJ1ZmZlciApCisgKi8KK3ZvaWQgbWQ1X2htYWMoIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICkKK3sKKyAgICBtZDVfY29udGV4dCBjdHg7CisKKyAgICBtZDVfaG1hY19zdGFydHMoICZjdHgsIGtleSwga2V5bGVuICk7CisgICAgbWQ1X2htYWNfdXBkYXRlKCAmY3R4LCBpbnB1dCwgaWxlbiApOworICAgIG1kNV9obWFjX2ZpbmlzaCggJmN0eCwgb3V0cHV0ICk7CisKKyAgICBtZW1zZXQoICZjdHgsIDAsIHNpemVvZiggbWQ1X2NvbnRleHQgKSApOworfQorCisjaWYgZGVmaW5lZChYWVNTTF9TRUxGX1RFU1QpCisvKgorICogUkZDIDEzMjEgdGVzdCB2ZWN0b3JzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1kNV90ZXN0X2J1Zls3XVs4MV0gPQoreworICAgIHsgIiIgfSwgCisgICAgeyAiYSIgfSwKKyAgICB7ICJhYmMiIH0sCisgICAgeyAibWVzc2FnZSBkaWdlc3QiIH0sCisgICAgeyAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiIH0sCisgICAgeyAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiIH0sCisgICAgeyAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIiIFwKKyAgICAgICIzNDU2Nzg5MDEyMzQ1Njc4OTAiIH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgbWQ1X3Rlc3RfYnVmbGVuWzddID0KK3sKKyAgICAwLCAxLCAzLCAxNCwgMjYsIDYyLCA4MAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWQ1X3Rlc3Rfc3VtWzddWzE2XSA9Cit7CisgICAgeyAweEQ0LCAweDFELCAweDhDLCAweEQ5LCAweDhGLCAweDAwLCAweEIyLCAweDA0LAorICAgICAgMHhFOSwgMHg4MCwgMHgwOSwgMHg5OCwgMHhFQywgMHhGOCwgMHg0MiwgMHg3RSB9LAorICAgIHsgMHgwQywgMHhDMSwgMHg3NSwgMHhCOSwgMHhDMCwgMHhGMSwgMHhCNiwgMHhBOCwKKyAgICAgIDB4MzEsIDB4QzMsIDB4OTksIDB4RTIsIDB4NjksIDB4NzcsIDB4MjYsIDB4NjEgfSwKKyAgICB7IDB4OTAsIDB4MDEsIDB4NTAsIDB4OTgsIDB4M0MsIDB4RDIsIDB4NEYsIDB4QjAsCisgICAgICAweEQ2LCAweDk2LCAweDNGLCAweDdELCAweDI4LCAweEUxLCAweDdGLCAweDcyIH0sCisgICAgeyAweEY5LCAweDZCLCAweDY5LCAweDdELCAweDdDLCAweEI3LCAweDkzLCAweDhELAorICAgICAgMHg1MiwgMHg1QSwgMHgyRiwgMHgzMSwgMHhBQSwgMHhGMSwgMHg2MSwgMHhEMCB9LAorICAgIHsgMHhDMywgMHhGQywgMHhEMywgMHhENywgMHg2MSwgMHg5MiwgMHhFNCwgMHgwMCwKKyAgICAgIDB4N0QsIDB4RkIsIDB4NDksIDB4NkMsIDB4Q0EsIDB4NjcsIDB4RTEsIDB4M0IgfSwKKyAgICB7IDB4RDEsIDB4NzQsIDB4QUIsIDB4OTgsIDB4RDIsIDB4NzcsIDB4RDksIDB4RjUsCisgICAgICAweEE1LCAweDYxLCAweDFDLCAweDJDLCAweDlGLCAweDQxLCAweDlELCAweDlGIH0sCisgICAgeyAweDU3LCAweEVELCAweEY0LCAweEEyLCAweDJCLCAweEUzLCAweEM5LCAweDU1LAorICAgICAgMHhBQywgMHg0OSwgMHhEQSwgMHgyRSwgMHgyMSwgMHgwNywgMHhCNiwgMHg3QSB9Cit9OworCisvKgorICogUkZDIDIyMDIgdGVzdCB2ZWN0b3JzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1kNV9obWFjX3Rlc3Rfa2V5WzddWzI2XSA9Cit7CisgICAgeyAiXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQiIgfSwKKyAgICB7ICJKZWZlIiB9LAorICAgIHsgIlx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUEiIH0sCisgICAgeyAiXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwQVx4MEJceDBDXHgwRFx4MEVceDBGXHgxMCIKKyAgICAgICJceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTkiIH0sCisgICAgeyAiXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQyIgfSwKKyAgICB7ICIiIH0sIC8qIDB4QUEgODAgdGltZXMgKi8KKyAgICB7ICIiIH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgbWQ1X2htYWNfdGVzdF9rZXlsZW5bN10gPQoreworICAgIDE2LCA0LCAxNiwgMjUsIDE2LCA4MCwgODAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1kNV9obWFjX3Rlc3RfYnVmWzddWzc0XSA9Cit7CisgICAgeyAiSGkgVGhlcmUiIH0sCisgICAgeyAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIgfSwKKyAgICB7ICJceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREIgorICAgICAgIlx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4REQiCisgICAgICAiXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERCIKKyAgICAgICJceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREIgorICAgICAgIlx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4REQiIH0sCisgICAgeyAiXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRCIKKyAgICAgICJceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEIgorICAgICAgIlx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0QiCisgICAgICAiXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRCIKKyAgICAgICJceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEIiB9LAorICAgIHsgIlRlc3QgV2l0aCBUcnVuY2F0aW9uIiB9LAorICAgIHsgIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgLSBIYXNoIEtleSBGaXJzdCIgfSwKKyAgICB7ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IGFuZCBMYXJnZXIiCisgICAgICAiIFRoYW4gT25lIEJsb2NrLVNpemUgRGF0YSIgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBtZDVfaG1hY190ZXN0X2J1Zmxlbls3XSA9Cit7CisgICAgOCwgMjgsIDUwLCA1MCwgMjAsIDU0LCA3MworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWQ1X2htYWNfdGVzdF9zdW1bN11bMTZdID0KK3sKKyAgICB7IDB4OTIsIDB4OTQsIDB4NzIsIDB4N0EsIDB4MzYsIDB4MzgsIDB4QkIsIDB4MUMsCisgICAgICAweDEzLCAweEY0LCAweDhFLCAweEY4LCAweDE1LCAweDhCLCAweEZDLCAweDlEIH0sCisgICAgeyAweDc1LCAweDBDLCAweDc4LCAweDNFLCAweDZBLCAweEIwLCAweEI1LCAweDAzLAorICAgICAgMHhFQSwgMHhBOCwgMHg2RSwgMHgzMSwgMHgwQSwgMHg1RCwgMHhCNywgMHgzOCB9LAorICAgIHsgMHg1NiwgMHhCRSwgMHgzNCwgMHg1MiwgMHgxRCwgMHgxNCwgMHg0QywgMHg4OCwKKyAgICAgIDB4REIsIDB4QjgsIDB4QzcsIDB4MzMsIDB4RjAsIDB4RTgsIDB4QjMsIDB4RjYgfSwKKyAgICB7IDB4NjksIDB4N0UsIDB4QUYsIDB4MEEsIDB4Q0EsIDB4M0EsIDB4M0EsIDB4RUEsCisgICAgICAweDNBLCAweDc1LCAweDE2LCAweDQ3LCAweDQ2LCAweEZGLCAweEFBLCAweDc5IH0sCisgICAgeyAweDU2LCAweDQ2LCAweDFFLCAweEYyLCAweDM0LCAweDJFLCAweERDLCAweDAwLAorICAgICAgMHhGOSwgMHhCQSwgMHhCOSwgMHg5NSB9LAorICAgIHsgMHg2QiwgMHgxQSwgMHhCNywgMHhGRSwgMHg0QiwgMHhENywgMHhCRiwgMHg4RiwKKyAgICAgIDB4MEIsIDB4NjIsIDB4RTYsIDB4Q0UsIDB4NjEsIDB4QjksIDB4RDAsIDB4Q0QgfSwKKyAgICB7IDB4NkYsIDB4NjMsIDB4MEYsIDB4QUQsIDB4NjcsIDB4Q0QsIDB4QTAsIDB4RUUsCisgICAgICAweDFGLCAweEIxLCAweEY1LCAweDYyLCAweERCLCAweDNBLCAweEE1LCAweDNFIH0KK307CisKKy8qCisgKiBDaGVja3VwIHJvdXRpbmUKKyAqLworaW50IG1kNV9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICkKK3sKKyAgICBpbnQgaSwgYnVmbGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMjRdOworICAgIHVuc2lnbmVkIGNoYXIgbWQ1c3VtWzE2XTsKKyAgICBtZDVfY29udGV4dCBjdHg7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNzsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAiICBNRDUgdGVzdCAjJWQ6ICIsIGkgKyAxICk7CisKKyAgICAgICAgbWQ1KCBtZDVfdGVzdF9idWZbaV0sIG1kNV90ZXN0X2J1ZmxlbltpXSwgbWQ1c3VtICk7CisKKyAgICAgICAgaWYoIG1lbWNtcCggbWQ1c3VtLCBtZDVfdGVzdF9zdW1baV0sIDE2ICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICByZXR1cm4oIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4iICk7CisgICAgfQorCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIlxuIiApOworCisgICAgZm9yKCBpID0gMDsgaSA8IDc7IGkrKyApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggIiAgSE1BQy1NRDUgdGVzdCAjJWQ6ICIsIGkgKyAxICk7CisKKyAgICAgICAgaWYoIGkgPT0gNSB8fCBpID09IDYgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoIGJ1ZiwgJ1x4QUEnLCBidWZsZW4gPSA4MCApOworICAgICAgICAgICAgbWQ1X2htYWNfc3RhcnRzKCAmY3R4LCBidWYsIGJ1ZmxlbiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1kNV9obWFjX3N0YXJ0cyggJmN0eCwgbWQ1X2htYWNfdGVzdF9rZXlbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kNV9obWFjX3Rlc3Rfa2V5bGVuW2ldICk7CisKKyAgICAgICAgbWQ1X2htYWNfdXBkYXRlKCAmY3R4LCBtZDVfaG1hY190ZXN0X2J1ZltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZDVfaG1hY190ZXN0X2J1ZmxlbltpXSApOworCisgICAgICAgIG1kNV9obWFjX2ZpbmlzaCggJmN0eCwgbWQ1c3VtICk7CisKKyAgICAgICAgYnVmbGVuID0gKCBpID09IDQgKSA/IDEyIDogMTY7CisKKyAgICAgICAgaWYoIG1lbWNtcCggbWQ1c3VtLCBtZDVfaG1hY190ZXN0X3N1bVtpXSwgYnVmbGVuICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICByZXR1cm4oIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4iICk7CisgICAgfQorCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIlxuIiApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnJhcnkvbmV0LmMgYi9saWJyYXJ5L25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTI1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJyYXJ5L25ldC5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogIFRDUCBuZXR3b3JraW5nIGZ1bmN0aW9ucworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChYWVNTTF9ORVRfQykKKworI2luY2x1ZGUgInh5c3NsL25ldC5oIgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisjcHJhZ21hIGNvbW1lbnQoIGxpYiwgIndzMi5saWIiICkKKyNlbHNlCisjcHJhZ21hIGNvbW1lbnQoIGxpYiwgIndzMl8zMi5saWIiICkKKyNlbmRpZgorCisjZGVmaW5lIHJlYWQoZmQsYnVmLGxlbikgICAgICAgIHJlY3YoZmQsYnVmLGxlbiwwKQorI2RlZmluZSB3cml0ZShmZCxidWYsbGVuKSAgICAgICBzZW5kKGZkLGJ1ZixsZW4sMCkKKyNkZWZpbmUgY2xvc2UoZmQpICAgICAgICAgICAgICAgY2xvc2Vzb2NrZXQoZmQpCisKK3N0YXRpYyBpbnQgd3NhX2luaXRfZG9uZSA9IDA7CisKKyNlbHNlCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKy8qCisgKiBodG9ucygpIGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBuZXRfaHRvbnMoIGludCBwb3J0ICkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKworICAgIGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSggcG9ydCA+PiA4ICk7CisgICAgYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKCBwb3J0ICAgICAgKTsKKyAgICBidWZbMl0gPSBidWZbM10gPSAwOworCisgICAgcmV0dXJuKCAqKHVuc2lnbmVkIHNob3J0ICopIGJ1ZiApOworfQorCisvKgorICogSW5pdGlhdGUgYSBUQ1AgY29ubmVjdGlvbiB3aXRoIGhvc3Q6cG9ydAorICovCitpbnQgbmV0X2Nvbm5lY3QoIGludCAqZmQsIGNoYXIgKmhvc3QsIGludCBwb3J0ICkKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7CisgICAgc3RydWN0IGhvc3RlbnQgKnNlcnZlcl9ob3N0OworCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorICAgIFdTQURBVEEgd3NhRGF0YTsKKworICAgIGlmKCB3c2FfaW5pdF9kb25lID09IDAgKQorICAgIHsKKyAgICAgICAgaWYoIFdTQVN0YXJ0dXAoIE1BS0VXT1JEKDIsMCksICZ3c2FEYXRhICkgPT0gU09DS0VUX0VSUk9SICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX05FVF9TT0NLRVRfRkFJTEVEICk7CisKKyAgICAgICAgd3NhX2luaXRfZG9uZSA9IDE7CisgICAgfQorI2Vsc2UKKyAgICBzaWduYWwoIFNJR1BJUEUsIFNJR19JR04gKTsKKyNlbmRpZgorCisgICAgaWYoICggc2VydmVyX2hvc3QgPSBnZXRob3N0YnluYW1lKCBob3N0ICkgKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfTkVUX1VOS05PV05fSE9TVCApOworCisgICAgaWYoICggKmZkID0gc29ja2V0KCBBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCApICkgPCAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfTkVUX1NPQ0tFVF9GQUlMRUQgKTsKKworICAgIG1lbWNweSggKHZvaWQgKikgJnNlcnZlcl9hZGRyLnNpbl9hZGRyLAorICAgICAgICAgICAgKHZvaWQgKikgc2VydmVyX2hvc3QtPmhfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0LT5oX2xlbmd0aCApOworCisgICAgc2VydmVyX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc2VydmVyX2FkZHIuc2luX3BvcnQgICA9IG5ldF9odG9ucyggcG9ydCApOworCisgICAgaWYoIGNvbm5lY3QoICpmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyX2FkZHIsCisgICAgICAgICAgICAgICAgIHNpemVvZiggc2VydmVyX2FkZHIgKSApIDwgMCApCisgICAgeworICAgICAgICBjbG9zZSggKmZkICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX05FVF9DT05ORUNUX0ZBSUxFRCApOworICAgIH0KKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogQ3JlYXRlIGEgbGlzdGVuaW5nIHNvY2tldCBvbiBiaW5kX2lwOnBvcnQKKyAqLworaW50IG5ldF9iaW5kKCBpbnQgKmZkLCBjaGFyICpiaW5kX2lwLCBpbnQgcG9ydCApCit7CisgICAgaW50IG4sIGNbNF07CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcl9hZGRyOworCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKQorICAgIFdTQURBVEEgd3NhRGF0YTsKKworICAgIGlmKCB3c2FfaW5pdF9kb25lID09IDAgKQorICAgIHsKKyAgICAgICAgaWYoIFdTQVN0YXJ0dXAoIE1BS0VXT1JEKDIsMCksICZ3c2FEYXRhICkgPT0gU09DS0VUX0VSUk9SICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX05FVF9TT0NLRVRfRkFJTEVEICk7CisKKyAgICAgICAgd3NhX2luaXRfZG9uZSA9IDE7CisgICAgfQorI2Vsc2UKKyAgICBzaWduYWwoIFNJR1BJUEUsIFNJR19JR04gKTsKKyNlbmRpZgorCisgICAgaWYoICggKmZkID0gc29ja2V0KCBBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCApICkgPCAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfTkVUX1NPQ0tFVF9GQUlMRUQgKTsKKworICAgIG4gPSAxOworICAgIHNldHNvY2tvcHQoICpmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAorICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopICZuLCBzaXplb2YoIG4gKSApOworCisgICAgc2VydmVyX2FkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICBzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ICAgICAgPSBBRl9JTkVUOworICAgIHNlcnZlcl9hZGRyLnNpbl9wb3J0ICAgICAgICA9IG5ldF9odG9ucyggcG9ydCApOworCisgICAgaWYoIGJpbmRfaXAgIT0gTlVMTCApCisgICAgeworICAgICAgICBtZW1zZXQoIGMsIDAsIHNpemVvZiggYyApICk7CisgICAgICAgIHNzY2FuZiggYmluZF9pcCwgIiVkLiVkLiVkLiVkIiwgJmNbMF0sICZjWzFdLCAmY1syXSwgJmNbM10gKTsKKworICAgICAgICBmb3IoIG4gPSAwOyBuIDwgNDsgbisrICkKKyAgICAgICAgICAgIGlmKCBjW25dIDwgMCB8fCBjW25dID4gMjU1ICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiggbiA9PSA0ICkKKyAgICAgICAgICAgIHNlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9CisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgY1swXSA8PCAyNCApIHwKKyAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSBjWzFdIDw8IDE2ICkgfAorICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpIGNbMl0gPDwgIDggKSB8CisgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZykgY1szXSAgICAgICApOworICAgIH0KKworICAgIGlmKCBiaW5kKCAqZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlcl9hZGRyLAorICAgICAgICAgICAgICBzaXplb2YoIHNlcnZlcl9hZGRyICkgKSA8IDAgKQorICAgIHsKKyAgICAgICAgY2xvc2UoICpmZCApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ORVRfQklORF9GQUlMRUQgKTsKKyAgICB9CisKKyAgICBpZiggbGlzdGVuKCAqZmQsIDEwICkgIT0gMCApCisgICAgeworICAgICAgICBjbG9zZSggKmZkICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX05FVF9MSVNURU5fRkFJTEVEICk7CisgICAgfQorCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgY3VycmVudCBvcGVyYXRpb24gaXMgYmxvY2tpbmcKKyAqLworc3RhdGljIGludCBuZXRfaXNfYmxvY2tpbmcoIHZvaWQgKQoreworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICByZXR1cm4oIFdTQUdldExhc3RFcnJvcigpID09IFdTQUVXT1VMREJMT0NLICk7CisjZWxzZQorICAgIHN3aXRjaCggZXJybm8gKQorICAgIHsKKyNpZiBkZWZpbmVkIEVBR0FJTgorICAgICAgICBjYXNlIEVBR0FJTjoKKyNlbmRpZgorI2lmIGRlZmluZWQgRVdPVUxEQkxPQ0sgJiYgRVdPVUxEQkxPQ0sgIT0gRUFHQUlOCisgICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiggMSApOworICAgIH0KKyAgICByZXR1cm4oIDAgKTsKKyNlbmRpZgorfQorCisvKgorICogQWNjZXB0IGEgY29ubmVjdGlvbiBmcm9tIGEgcmVtb3RlIGNsaWVudAorICovCitpbnQgbmV0X2FjY2VwdCggaW50IGJpbmRfZmQsIGludCAqY2xpZW50X2ZkLCB2b2lkICpjbGllbnRfaXAgKQoreworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjbGllbnRfYWRkcjsKKworI2lmIGRlZmluZWQoX19zb2NrbGVuX3RfZGVmaW5lZCkKKyAgICBzb2NrbGVuX3QgbiA9IChzb2NrbGVuX3QpIHNpemVvZiggY2xpZW50X2FkZHIgKTsKKyNlbHNlCisgICAgaW50IG4gPSAoaW50KSBzaXplb2YoIGNsaWVudF9hZGRyICk7CisjZW5kaWYKKworICAgICpjbGllbnRfZmQgPSBhY2NlcHQoIGJpbmRfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50X2FkZHIsICZuICk7CisKKyAgICBpZiggKmNsaWVudF9mZCA8IDAgKQorICAgIHsKKyAgICAgICAgaWYoIG5ldF9pc19ibG9ja2luZygpICE9IDAgKQorICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfTkVUX1RSWV9BR0FJTiApOworCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX05FVF9BQ0NFUFRfRkFJTEVEICk7CisgICAgfQorCisgICAgaWYoIGNsaWVudF9pcCAhPSBOVUxMICkKKyAgICAgICAgbWVtY3B5KCBjbGllbnRfaXAsICZjbGllbnRfYWRkci5zaW5fYWRkci5zX2FkZHIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZiggY2xpZW50X2FkZHIuc2luX2FkZHIuc19hZGRyICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogU2V0IHRoZSBzb2NrZXQgYmxvY2tpbmcgb3Igbm9uLWJsb2NraW5nCisgKi8KK2ludCBuZXRfc2V0X2Jsb2NrKCBpbnQgZmQgKQoreworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICBsb25nIG4gPSAwOworICAgIHJldHVybiggaW9jdGxzb2NrZXQoIGZkLCBGSU9OQklPLCAmbiApICk7CisjZWxzZQorICAgIHJldHVybiggZmNudGwoIGZkLCBGX1NFVEZMLCBmY250bCggZmQsIEZfR0VURkwgKSAmIH5PX05PTkJMT0NLICkgKTsKKyNlbmRpZgorfQorCitpbnQgbmV0X3NldF9ub25ibG9jayggaW50IGZkICkKK3sKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgbG9uZyBuID0gMTsKKyAgICByZXR1cm4oIGlvY3Rsc29ja2V0KCBmZCwgRklPTkJJTywgJm4gKSApOworI2Vsc2UKKyAgICByZXR1cm4oIGZjbnRsKCBmZCwgRl9TRVRGTCwgZmNudGwoIGZkLCBGX0dFVEZMICkgfCBPX05PTkJMT0NLICkgKTsKKyNlbmRpZgorfQorCisvKgorICogUG9ydGFibGUgdXNsZWVwIGhlbHBlcgorICovCit2b2lkIG5ldF91c2xlZXAoIHVuc2lnbmVkIGxvbmcgdXNlYyApCit7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgdHYudHZfc2VjICA9IDA7CisgICAgdHYudHZfdXNlYyA9IHVzZWM7CisgICAgc2VsZWN0KCAwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYgKTsKK30KKworLyoKKyAqIFJlYWQgYXQgbW9zdCAnbGVuJyBjaGFyYWN0ZXJzCisgKi8KK2ludCBuZXRfcmVjdiggdm9pZCAqY3R4LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4gKQoreyAKKyAgICBpbnQgcmV0ID0gcmVhZCggKigoaW50ICopIGN0eCksIGJ1ZiwgbGVuICk7CisKKyAgICBpZiggbGVuID4gMCAmJiByZXQgPT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX05FVF9DT05OX1JFU0VUICk7CisKKyAgICBpZiggcmV0IDwgMCApCisgICAgeworICAgICAgICBpZiggbmV0X2lzX2Jsb2NraW5nKCkgIT0gMCApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOICk7CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgICAgIGlmKCBXU0FHZXRMYXN0RXJyb3IoKSA9PSBXU0FFQ09OTlJFU0VUICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX05FVF9DT05OX1JFU0VUICk7CisjZWxzZQorICAgICAgICBpZiggZXJybm8gPT0gRVBJUEUgfHwgZXJybm8gPT0gRUNPTk5SRVNFVCApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ORVRfQ09OTl9SRVNFVCApOworCisgICAgICAgIGlmKCBlcnJubyA9PSBFSU5UUiApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOICk7CisjZW5kaWYKKworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ORVRfUkVDVl9GQUlMRUQgKTsKKyAgICB9CisKKyAgICByZXR1cm4oIHJldCApOworfQorCisvKgorICogV3JpdGUgYXQgbW9zdCAnbGVuJyBjaGFyYWN0ZXJzCisgKi8KK2ludCBuZXRfc2VuZCggdm9pZCAqY3R4LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4gKQoreworICAgIGludCByZXQgPSB3cml0ZSggKigoaW50ICopIGN0eCksIGJ1ZiwgbGVuICk7CisKKyAgICBpZiggcmV0IDwgMCApCisgICAgeworICAgICAgICBpZiggbmV0X2lzX2Jsb2NraW5nKCkgIT0gMCApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOICk7CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgICAgIGlmKCBXU0FHZXRMYXN0RXJyb3IoKSA9PSBXU0FFQ09OTlJFU0VUICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX05FVF9DT05OX1JFU0VUICk7CisjZWxzZQorICAgICAgICBpZiggZXJybm8gPT0gRVBJUEUgfHwgZXJybm8gPT0gRUNPTk5SRVNFVCApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ORVRfQ09OTl9SRVNFVCApOworCisgICAgICAgIGlmKCBlcnJubyA9PSBFSU5UUiApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOICk7CisjZW5kaWYKKworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9ORVRfU0VORF9GQUlMRUQgKTsKKyAgICB9CisKKyAgICByZXR1cm4oIHJldCApOworfQorCisvKgorICogR3JhY2VmdWxseSBjbG9zZSB0aGUgY29ubmVjdGlvbgorICovCit2b2lkIG5ldF9jbG9zZSggaW50IGZkICkKK3sKKyAgICBzaHV0ZG93biggZmQsIDIgKTsKKyAgICBjbG9zZSggZmQgKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJyYXJ5L3BhZGxvY2suYyBiL2xpYnJhcnkvcGFkbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzYxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJyYXJ5L3BhZGxvY2suYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqICBWSUEgUGFkTG9jayBzdXBwb3J0IGZ1bmN0aW9ucworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKy8qCisgKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgVklBIFBhZExvY2sgUHJvZ3JhbW1pbmcgR3VpZGU6CisgKgorICogIGh0dHA6Ly93d3cudmlhLmNvbS50dy9lbi9kb3dubG9hZHMvd2hpdGVwYXBlcnMvaW5pdGlhdGl2ZXMvcGFkbG9jay8KKyAqICBwcm9ncmFtbWluZ19ndWlkZS5wZGYKKyAqLworCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFhZU1NMX1BBRExPQ0tfQykKKworI2luY2x1ZGUgInh5c3NsL2Flcy5oIgorI2luY2x1ZGUgInh5c3NsL3BhZGxvY2suaCIKKworI2lmIGRlZmluZWQoWFlTU0xfSEFWRV9YODYpCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIFBhZExvY2sgZGV0ZWN0aW9uIHJvdXRpbmUKKyAqLworaW50IHBhZGxvY2tfc3VwcG9ydHMoIGludCBmZWF0dXJlICkKK3sKKyAgICBzdGF0aWMgaW50IGZsYWdzID0gLTE7CisgICAgaW50IGVieCwgZWR4OworCisgICAgaWYoIGZsYWdzID09IC0xICkKKyAgICB7CisgICAgICAgIGFzbSggIm1vdmwgICUlZWJ4LCAlMCAgICAgICAgICAgXG4iICAgICBcCisgICAgICAgICAgICAgIm1vdmwgICQweEMwMDAwMDAwLCAlJWVheCAgXG4iICAgICBcCisgICAgICAgICAgICAgImNwdWlkICAgICAgICAgICAgICAgICAgICAgXG4iICAgICBcCisgICAgICAgICAgICAgImNtcGwgICQweEMwMDAwMDAxLCAlJWVheCAgXG4iICAgICBcCisgICAgICAgICAgICAgIm1vdmwgICQwLCAlJWVkeCAgICAgICAgICAgXG4iICAgICBcCisgICAgICAgICAgICAgImpiICAgIHVuc3VwcG9ydGVkICAgICAgICAgXG4iICAgICBcCisgICAgICAgICAgICAgIm1vdmwgICQweEMwMDAwMDAxLCAlJWVheCAgXG4iICAgICBcCisgICAgICAgICAgICAgImNwdWlkICAgICAgICAgICAgICAgICAgICAgXG4iICAgICBcCisgICAgICAgICAgICAgInVuc3VwcG9ydGVkOiAgICAgICAgICAgICAgXG4iICAgICBcCisgICAgICAgICAgICAgIm1vdmwgICUlZWR4LCAlMSAgICAgICAgICAgXG4iICAgICBcCisgICAgICAgICAgICAgIm1vdmwgICUyLCAlJWVieCAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgOiAiPW0iIChlYngpLCAiPW0iIChlZHgpCisgICAgICAgICAgICAgOiAgIm0iIChlYngpCisgICAgICAgICAgICAgOiAiZWF4IiwgImVjeCIsICJlZHgiICk7CisKKyAgICAgICAgZmxhZ3MgPSBlZHg7CisgICAgfQorCisgICAgcmV0dXJuKCBmbGFncyAmIGZlYXR1cmUgKTsKK30KKworLyoKKyAqIFBhZExvY2sgQUVTLUVDQiBibG9jayBlbihkZSljcnlwdGlvbgorICovCitpbnQgcGFkbG9ja194Y3J5cHRlY2IoIGFlc19jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGlucHV0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRwdXRbMTZdICkKK3sKKyAgICBpbnQgZWJ4OworICAgIHVuc2lnbmVkIGxvbmcgKnJrOworICAgIHVuc2lnbmVkIGxvbmcgKmJsazsKKyAgICB1bnNpZ25lZCBsb25nICpjdHJsOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07CisKKyAgICByayAgPSBjdHgtPnJrOworICAgIGJsayA9IFBBRExPQ0tfQUxJR04xNiggYnVmICk7CisgICAgbWVtY3B5KCBibGssIGlucHV0LCAxNiApOworCisgICAgIGN0cmwgPSBibGsgKyA0OworICAgICpjdHJsID0gMHg4MCB8IGN0eC0+bnIgfCAoICggY3R4LT5uciArICggbW9kZV4xICkgLSAxMCApIDw8IDkgKTsKKworICAgIGFzbSggInB1c2hmbDsgcG9wZmwgICAgICAgICBcbiIgICAgIFwKKyAgICAgICAgICJtb3ZsICAgICUlZWJ4LCAlMCAgICAgXG4iICAgICBcCisgICAgICAgICAibW92bCAgICAkMSwgJSVlY3ggICAgIFxuIiAgICAgXAorICAgICAgICAgIm1vdmwgICAgJTIsICUlZWR4ICAgICBcbiIgICAgIFwKKyAgICAgICAgICJtb3ZsICAgICUzLCAlJWVieCAgICAgXG4iICAgICBcCisgICAgICAgICAibW92bCAgICAlNCwgJSVlc2kgICAgIFxuIiAgICAgXAorICAgICAgICAgIm1vdmwgICAgJTQsICUlZWRpICAgICBcbiIgICAgIFwKKyAgICAgICAgICIuYnl0ZSAgMHhmMywweDBmLDB4YTcsMHhjOFxuIiBcCisgICAgICAgICAibW92bCAgICAlMSwgJSVlYnggICAgIFxuIgorICAgICAgICAgOiAiPW0iIChlYngpCisgICAgICAgICA6ICAibSIgKGVieCksICJtIiAoY3RybCksICJtIiAocmspLCAibSIgKGJsaykKKyAgICAgICAgIDogImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIgKTsKKworICAgIG1lbWNweSggb3V0cHV0LCBibGssIDE2ICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIFBhZExvY2sgQUVTLUNCQyBidWZmZXIgZW4oZGUpY3J5cHRpb24KKyAqLworaW50IHBhZGxvY2tfeGNyeXB0Y2JjKCBhZXNfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpdlsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXQgKQoreworICAgIGludCBlYngsIGNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgKnJrOworICAgIHVuc2lnbmVkIGxvbmcgKml3OworICAgIHVuc2lnbmVkIGxvbmcgKmN0cmw7CisgICAgdW5zaWduZWQgY2hhciBidWZbMjU2XTsKKworICAgIGlmKCAoIChsb25nKSBpbnB1dCAgJiAxNSApICE9IDAgfHwKKyAgICAgICAgKCAobG9uZykgb3V0cHV0ICYgMTUgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCAxICk7CisKKyAgICByayA9IGN0eC0+cms7CisgICAgaXcgPSBQQURMT0NLX0FMSUdOMTYoIGJ1ZiApOworICAgIG1lbWNweSggaXcsIGl2LCAxNiApOworCisgICAgIGN0cmwgPSBpdyArIDQ7CisgICAgKmN0cmwgPSAweDgwIHwgY3R4LT5uciB8ICggKCBjdHgtPm5yICsgKG1vZGVeMSkgLSAxMCApIDw8IDkgKTsKKworICAgIGNvdW50ID0gKGxlbmd0aCArIDE1KSA+PiA0OworCisgICAgYXNtKCAicHVzaGZsOyBwb3BmbCAgICAgICAgIFxuIiAgICAgXAorICAgICAgICAgIm1vdmwgICAgJSVlYngsICUwICAgICBcbiIgICAgIFwKKyAgICAgICAgICJtb3ZsICAgICUyLCAlJWVjeCAgICAgXG4iICAgICBcCisgICAgICAgICAibW92bCAgICAlMywgJSVlZHggICAgIFxuIiAgICAgXAorICAgICAgICAgIm1vdmwgICAgJTQsICUlZWJ4ICAgICBcbiIgICAgIFwKKyAgICAgICAgICJtb3ZsICAgICU1LCAlJWVzaSAgICAgXG4iICAgICBcCisgICAgICAgICAibW92bCAgICAlNiwgJSVlZGkgICAgIFxuIiAgICAgXAorICAgICAgICAgIm1vdmwgICAgJTcsICUlZWF4ICAgICBcbiIgICAgIFwKKyAgICAgICAgICIuYnl0ZSAgMHhmMywweDBmLDB4YTcsMHhkMFxuIiBcCisgICAgICAgICAibW92bCAgICAlMSwgJSVlYnggICAgIFxuIgorICAgICAgICAgOiAiPW0iIChlYngpCisgICAgICAgICA6ICAibSIgKGVieCksICJtIiAoY291bnQpLCAibSIgKGN0cmwpLAorICAgICAgICAgICAgIm0iICAocmspLCAibSIgKGlucHV0KSwgIm0iIChvdXRwdXQpLCAibSIgKGl3KQorICAgICAgICAgOiAiZWF4IiwgImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIgKTsKKworICAgIG1lbWNweSggaXYsIGl3LCAxNiApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnJhcnkvcnNhLmMgYi9saWJyYXJ5L3JzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTQwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJyYXJ5L3JzYS5jCkBAIC0wLDAgKzEsNzMwIEBACisvKgorICogIFRoZSBSU0EgcHVibGljLWtleSBjcnlwdG9zeXN0ZW0KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisvKgorICogIFJTQSB3YXMgZGVzaWduZWQgYnkgUm9uIFJpdmVzdCwgQWRpIFNoYW1pciBhbmQgTGVuIEFkbGVtYW4uCisgKgorICogIGh0dHA6Ly90aGVvcnkubGNzLm1pdC5lZHUvfnJpdmVzdC9yc2FwYXBlci5wZGYKKyAqICBodHRwOi8vd3d3LmNhY3IubWF0aC51d2F0ZXJsb28uY2EvaGFjL2Fib3V0L2NoYXA4LnBkZgorICovCisKKyNpbmNsdWRlICJ4eXNzbC9jb25maWcuaCIKKworI2lmIGRlZmluZWQoWFlTU0xfUlNBX0MpCisKKyNpbmNsdWRlICJ4eXNzbC9yc2EuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiBJbml0aWFsaXplIGFuIFJTQSBjb250ZXh0CisgKi8KK3ZvaWQgcnNhX2luaXQoIHJzYV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICBpbnQgcGFkZGluZywKKyAgICAgICAgICAgICAgIGludCBoYXNoX2lkLAorICAgICAgICAgICAgICAgaW50ICgqZl9ybmcpKHZvaWQgKiksCisgICAgICAgICAgICAgICB2b2lkICpwX3JuZyApCit7CisgICAgbWVtc2V0KCBjdHgsIDAsIHNpemVvZiggcnNhX2NvbnRleHQgKSApOworCisgICAgY3R4LT5wYWRkaW5nID0gcGFkZGluZzsKKyAgICBjdHgtPmhhc2hfaWQgPSBoYXNoX2lkOworCisgICAgY3R4LT5mX3JuZyA9IGZfcm5nOworICAgIGN0eC0+cF9ybmcgPSBwX3JuZzsKK30KKworI2lmIGRlZmluZWQoWFlTU0xfR0VOUFJJTUUpCisKKy8qCisgKiBHZW5lcmF0ZSBhbiBSU0Ega2V5cGFpcgorICovCitpbnQgcnNhX2dlbl9rZXkoIHJzYV9jb250ZXh0ICpjdHgsIGludCBuYml0cywgaW50IGV4cG9uZW50ICkKK3sKKyAgICBpbnQgcmV0OworICAgIG1waSBQMSwgUTEsIEgsIEc7CisKKyAgICBpZiggY3R4LT5mX3JuZyA9PSBOVUxMIHx8IG5iaXRzIDwgMTI4IHx8IGV4cG9uZW50IDwgMyApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9CQURfSU5QVVRfREFUQSApOworCisgICAgbXBpX2luaXQoICZQMSwgJlExLCAmSCwgJkcsIE5VTEwgKTsKKworICAgIC8qCisgICAgICogZmluZCBwcmltZXMgUCBhbmQgUSB3aXRoIFEgPCBQIHNvIHRoYXQ6CisgICAgICogR0NEKCBFLCAoUC0xKSooUS0xKSApID09IDEKKyAgICAgKi8KKyAgICBNUElfQ0hLKCBtcGlfbHNldCggJmN0eC0+RSwgZXhwb25lbnQgKSApOworCisgICAgZG8KKyAgICB7CisgICAgICAgIE1QSV9DSEsoIG1waV9nZW5fcHJpbWUoICZjdHgtPlAsICggbmJpdHMgKyAxICkgPj4gMSwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Zl9ybmcsIGN0eC0+cF9ybmcgKSApOworCisgICAgICAgIE1QSV9DSEsoIG1waV9nZW5fcHJpbWUoICZjdHgtPlEsICggbmJpdHMgKyAxICkgPj4gMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5mX3JuZywgY3R4LT5wX3JuZyApICk7CisKKyAgICAgICAgaWYoIG1waV9jbXBfbXBpKCAmY3R4LT5QLCAmY3R4LT5RICkgPCAwICkKKyAgICAgICAgICAgIG1waV9zd2FwKCAmY3R4LT5QLCAmY3R4LT5RICk7CisKKyAgICAgICAgaWYoIG1waV9jbXBfbXBpKCAmY3R4LT5QLCAmY3R4LT5RICkgPT0gMCApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBNUElfQ0hLKCBtcGlfbXVsX21waSggJmN0eC0+TiwgJmN0eC0+UCwgJmN0eC0+USApICk7CisgICAgICAgIGlmKCBtcGlfbXNiKCAmY3R4LT5OICkgIT0gbmJpdHMgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgTVBJX0NISyggbXBpX3N1Yl9pbnQoICZQMSwgJmN0eC0+UCwgMSApICk7CisgICAgICAgIE1QSV9DSEsoIG1waV9zdWJfaW50KCAmUTEsICZjdHgtPlEsIDEgKSApOworICAgICAgICBNUElfQ0hLKCBtcGlfbXVsX21waSggJkgsICZQMSwgJlExICkgKTsKKyAgICAgICAgTVBJX0NISyggbXBpX2djZCggJkcsICZjdHgtPkUsICZIICApICk7CisgICAgfQorICAgIHdoaWxlKCBtcGlfY21wX2ludCggJkcsIDEgKSAhPSAwICk7CisKKyAgICAvKgorICAgICAqIEQgID0gRV4tMSBtb2QgKChQLTEpKihRLTEpKQorICAgICAqIERQID0gRCBtb2QgKFAgLSAxKQorICAgICAqIERRID0gRCBtb2QgKFEgLSAxKQorICAgICAqIFFQID0gUV4tMSBtb2QgUAorICAgICAqLworICAgIE1QSV9DSEsoIG1waV9pbnZfbW9kKCAmY3R4LT5EICwgJmN0eC0+RSwgJkggICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfbW9kX21waSggJmN0eC0+RFAsICZjdHgtPkQsICZQMSApICk7CisgICAgTVBJX0NISyggbXBpX21vZF9tcGkoICZjdHgtPkRRLCAmY3R4LT5ELCAmUTEgKSApOworICAgIE1QSV9DSEsoIG1waV9pbnZfbW9kKCAmY3R4LT5RUCwgJmN0eC0+USwgJmN0eC0+UCApICk7CisKKyAgICBjdHgtPmxlbiA9ICggbXBpX21zYiggJmN0eC0+TiApICsgNyApID4+IDM7CisKK2NsZWFudXA6CisKKyAgICBtcGlfZnJlZSggJkcsICZILCAmUTEsICZQMSwgTlVMTCApOworCisgICAgaWYoIHJldCAhPSAwICkKKyAgICB7CisgICAgICAgIHJzYV9mcmVlKCBjdHggKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfUlNBX0tFWV9HRU5fRkFJTEVEIHwgcmV0ICk7CisgICAgfQorCisgICAgcmV0dXJuKCAwICk7ICAgCit9CisKKyNlbmRpZgorCisvKgorICogQ2hlY2sgYSBwdWJsaWMgUlNBIGtleQorICovCitpbnQgcnNhX2NoZWNrX3B1YmtleSggcnNhX2NvbnRleHQgKmN0eCApCit7CisgICAgaWYoICggY3R4LT5OLnBbMF0gJiAxICkgPT0gMCB8fCAKKyAgICAgICAgKCBjdHgtPkUucFswXSAmIDEgKSA9PSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfUlNBX0tFWV9DSEVDS19GQUlMRUQgKTsKKworICAgIGlmKCBtcGlfbXNiKCAmY3R4LT5OICkgPCAxMjggfHwKKyAgICAgICAgbXBpX21zYiggJmN0eC0+TiApID4gNDA5NiApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9LRVlfQ0hFQ0tfRkFJTEVEICk7CisKKyAgICBpZiggbXBpX21zYiggJmN0eC0+RSApIDwgMiB8fAorICAgICAgICBtcGlfbXNiKCAmY3R4LT5FICkgPiA2NCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9LRVlfQ0hFQ0tfRkFJTEVEICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIENoZWNrIGEgcHJpdmF0ZSBSU0Ega2V5CisgKi8KK2ludCByc2FfY2hlY2tfcHJpdmtleSggcnNhX2NvbnRleHQgKmN0eCApCit7CisgICAgaW50IHJldDsKKyAgICBtcGkgUFEsIERFLCBQMSwgUTEsIEgsIEksIEc7CisKKyAgICBpZiggKCByZXQgPSByc2FfY2hlY2tfcHVia2V5KCBjdHggKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIHJldCApOworCisgICAgbXBpX2luaXQoICZQUSwgJkRFLCAmUDEsICZRMSwgJkgsICZJLCAmRywgTlVMTCApOworCisgICAgTVBJX0NISyggbXBpX211bF9tcGkoICZQUSwgJmN0eC0+UCwgJmN0eC0+USApICk7CisgICAgTVBJX0NISyggbXBpX211bF9tcGkoICZERSwgJmN0eC0+RCwgJmN0eC0+RSApICk7CisgICAgTVBJX0NISyggbXBpX3N1Yl9pbnQoICZQMSwgJmN0eC0+UCwgMSApICk7CisgICAgTVBJX0NISyggbXBpX3N1Yl9pbnQoICZRMSwgJmN0eC0+USwgMSApICk7CisgICAgTVBJX0NISyggbXBpX211bF9tcGkoICZILCAmUDEsICZRMSApICk7CisgICAgTVBJX0NISyggbXBpX21vZF9tcGkoICZJLCAmREUsICZIICApICk7CisgICAgTVBJX0NISyggbXBpX2djZCggJkcsICZjdHgtPkUsICZIICApICk7CisKKyAgICBpZiggbXBpX2NtcF9tcGkoICZQUSwgJmN0eC0+TiApID09IDAgJiYKKyAgICAgICAgbXBpX2NtcF9pbnQoICZJLCAxICkgPT0gMCAmJgorICAgICAgICBtcGlfY21wX2ludCggJkcsIDEgKSA9PSAwICkKKyAgICB7CisgICAgICAgIG1waV9mcmVlKCAmRywgJkksICZILCAmUTEsICZQMSwgJkRFLCAmUFEsIE5VTEwgKTsKKyAgICAgICAgcmV0dXJuKCAwICk7CisgICAgfQorCitjbGVhbnVwOgorCisgICAgbXBpX2ZyZWUoICZHLCAmSSwgJkgsICZRMSwgJlAxLCAmREUsICZQUSwgTlVMTCApOworICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9LRVlfQ0hFQ0tfRkFJTEVEIHwgcmV0ICk7Cit9CisKKy8qCisgKiBEbyBhbiBSU0EgcHVibGljIGtleSBvcGVyYXRpb24KKyAqLworaW50IHJzYV9wdWJsaWMoIHJzYV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0ICkKK3sKKyAgICBpbnQgcmV0LCBvbGVuOworICAgIG1waSBUOworCisgICAgbXBpX2luaXQoICZULCBOVUxMICk7CisKKyAgICBNUElfQ0hLKCBtcGlfcmVhZF9iaW5hcnkoICZULCBpbnB1dCwgY3R4LT5sZW4gKSApOworCisgICAgaWYoIG1waV9jbXBfbXBpKCAmVCwgJmN0eC0+TiApID49IDAgKQorICAgIHsKKyAgICAgICAgbXBpX2ZyZWUoICZULCBOVUxMICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9CQURfSU5QVVRfREFUQSApOworICAgIH0KKworICAgIG9sZW4gPSBjdHgtPmxlbjsKKyAgICBNUElfQ0hLKCBtcGlfZXhwX21vZCggJlQsICZULCAmY3R4LT5FLCAmY3R4LT5OLCAmY3R4LT5STiApICk7CisgICAgTVBJX0NISyggbXBpX3dyaXRlX2JpbmFyeSggJlQsIG91dHB1dCwgb2xlbiApICk7CisKK2NsZWFudXA6CisKKyAgICBtcGlfZnJlZSggJlQsIE5VTEwgKTsKKworICAgIGlmKCByZXQgIT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9QVUJMSUNfRkFJTEVEIHwgcmV0ICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIERvIGFuIFJTQSBwcml2YXRlIGtleSBvcGVyYXRpb24KKyAqLworaW50IHJzYV9wcml2YXRlKCByc2FfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0ICkKK3sKKyAgICBpbnQgcmV0LCBvbGVuOworICAgIG1waSBULCBUMSwgVDI7CisKKyAgICBtcGlfaW5pdCggJlQsICZUMSwgJlQyLCBOVUxMICk7CisKKyAgICBNUElfQ0hLKCBtcGlfcmVhZF9iaW5hcnkoICZULCBpbnB1dCwgY3R4LT5sZW4gKSApOworCisgICAgaWYoIG1waV9jbXBfbXBpKCAmVCwgJmN0eC0+TiApID49IDAgKQorICAgIHsKKyAgICAgICAgbXBpX2ZyZWUoICZULCBOVUxMICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9CQURfSU5QVVRfREFUQSApOworICAgIH0KKworI2lmIDAKKyAgICBNUElfQ0hLKCBtcGlfZXhwX21vZCggJlQsICZULCAmY3R4LT5ELCAmY3R4LT5OLCAmY3R4LT5STiApICk7CisjZWxzZQorICAgIC8qCisgICAgICogZmFzdGVyIGRlY3J5cHRpb24gdXNpbmcgdGhlIENSVAorICAgICAqCisgICAgICogVDEgPSBpbnB1dCBeIGRQIG1vZCBQCisgICAgICogVDIgPSBpbnB1dCBeIGRRIG1vZCBRCisgICAgICovCisgICAgTVBJX0NISyggbXBpX2V4cF9tb2QoICZUMSwgJlQsICZjdHgtPkRQLCAmY3R4LT5QLCAmY3R4LT5SUCApICk7CisgICAgTVBJX0NISyggbXBpX2V4cF9tb2QoICZUMiwgJlQsICZjdHgtPkRRLCAmY3R4LT5RLCAmY3R4LT5SUSApICk7CisKKyAgICAvKgorICAgICAqIFQgPSAoVDEgLSBUMikgKiAoUV4tMSBtb2QgUCkgbW9kIFAKKyAgICAgKi8KKyAgICBNUElfQ0hLKCBtcGlfc3ViX21waSggJlQsICZUMSwgJlQyICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfbXVsX21waSggJlQxLCAmVCwgJmN0eC0+UVAgKSApOworICAgIE1QSV9DSEsoIG1waV9tb2RfbXBpKCAmVCwgJlQxLCAmY3R4LT5QICkgKTsKKworICAgIC8qCisgICAgICogb3V0cHV0ID0gVDIgKyBUICogUQorICAgICAqLworICAgIE1QSV9DSEsoIG1waV9tdWxfbXBpKCAmVDEsICZULCAmY3R4LT5RICkgKTsKKyAgICBNUElfQ0hLKCBtcGlfYWRkX21waSggJlQsICZUMiwgJlQxICkgKTsKKyNlbmRpZgorCisgICAgb2xlbiA9IGN0eC0+bGVuOworICAgIE1QSV9DSEsoIG1waV93cml0ZV9iaW5hcnkoICZULCBvdXRwdXQsIG9sZW4gKSApOworCitjbGVhbnVwOgorCisgICAgbXBpX2ZyZWUoICZULCAmVDEsICZUMiwgTlVMTCApOworCisgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfUlNBX1BSSVZBVEVfRkFJTEVEIHwgcmV0ICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIEFkZCB0aGUgbWVzc2FnZSBwYWRkaW5nLCB0aGVuIGRvIGFuIFJTQSBvcGVyYXRpb24KKyAqLworaW50IHJzYV9wa2NzMV9lbmNyeXB0KCByc2FfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50ICBpbGVuLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0ICkKK3sKKyAgICBpbnQgbmJfcGFkLCBvbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBvdXRwdXQ7CisKKyAgICBvbGVuID0gY3R4LT5sZW47CisKKyAgICBzd2l0Y2goIGN0eC0+cGFkZGluZyApCisgICAgeworICAgICAgICBjYXNlIFJTQV9QS0NTX1YxNToKKworICAgICAgICAgICAgaWYoIGlsZW4gPCAwIHx8IG9sZW4gPCBpbGVuICsgMTEgKQorICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9CQURfSU5QVVRfREFUQSApOworCisgICAgICAgICAgICBuYl9wYWQgPSBvbGVuIC0gMyAtIGlsZW47CisKKyAgICAgICAgICAgICpwKysgPSAwOworICAgICAgICAgICAgKnArKyA9IFJTQV9DUllQVDsKKworICAgICAgICAgICAgd2hpbGUoIG5iX3BhZC0tID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKSByYW5kKCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSggKnAgPT0gMCApOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwKysgPSAwOworICAgICAgICAgICAgbWVtY3B5KCBwLCBpbnB1dCwgaWxlbiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfUlNBX0lOVkFMSURfUEFERElORyApOworICAgIH0KKworICAgIHJldHVybiggKCBtb2RlID09IFJTQV9QVUJMSUMgKQorICAgICAgICAgICAgPyByc2FfcHVibGljKCAgY3R4LCBvdXRwdXQsIG91dHB1dCApCisgICAgICAgICAgICA6IHJzYV9wcml2YXRlKCBjdHgsIG91dHB1dCwgb3V0cHV0ICkgKTsKK30KKworLyoKKyAqIERvIGFuIFJTQSBvcGVyYXRpb24sIHRoZW4gcmVtb3ZlIHRoZSBtZXNzYWdlIHBhZGRpbmcKKyAqLworaW50IHJzYV9wa2NzMV9kZWNyeXB0KCByc2FfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50ICpvbGVuLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0ICkKK3sKKyAgICBpbnQgcmV0LCBpbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgdW5zaWduZWQgY2hhciBidWZbNTEyXTsKKworICAgIGlsZW4gPSBjdHgtPmxlbjsKKworICAgIGlmKCBpbGVuIDwgMTYgfHwgaWxlbiA+IChpbnQpIHNpemVvZiggYnVmICkgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9SU0FfQkFEX0lOUFVUX0RBVEEgKTsKKworICAgIHJldCA9ICggbW9kZSA9PSBSU0FfUFVCTElDICkKKyAgICAgICAgICA/IHJzYV9wdWJsaWMoICBjdHgsIGlucHV0LCBidWYgKQorICAgICAgICAgIDogcnNhX3ByaXZhdGUoIGN0eCwgaW5wdXQsIGJ1ZiApOworCisgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKworICAgIHAgPSBidWY7CisKKyAgICBzd2l0Y2goIGN0eC0+cGFkZGluZyApCisgICAgeworICAgICAgICBjYXNlIFJTQV9QS0NTX1YxNToKKworICAgICAgICAgICAgaWYoICpwKysgIT0gMCB8fCAqcCsrICE9IFJTQV9DUllQVCApCisgICAgICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfUlNBX0lOVkFMSURfUEFERElORyApOworCisgICAgICAgICAgICB3aGlsZSggKnAgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHAgPj0gYnVmICsgaWxlbiAtIDEgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9SU0FfSU5WQUxJRF9QQURESU5HICk7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfUlNBX0lOVkFMSURfUEFERElORyApOworICAgIH0KKworICAgICpvbGVuID0gaWxlbiAtIChpbnQpKHAgLSBidWYpOworICAgIG1lbWNweSggb3V0cHV0LCBwLCAqb2xlbiApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBEbyBhbiBSU0Egb3BlcmF0aW9uIHRvIHNpZ24gdGhlIG1lc3NhZ2UgZGlnZXN0CisgKi8KK2ludCByc2FfcGtjczFfc2lnbiggcnNhX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgIGludCBoYXNoX2lkLAorICAgICAgICAgICAgICAgICAgICBpbnQgaGFzaGxlbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2lnICkKK3sKKyAgICBpbnQgbmJfcGFkLCBvbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBzaWc7CisKKyAgICBvbGVuID0gY3R4LT5sZW47CisKKyAgICBzd2l0Y2goIGN0eC0+cGFkZGluZyApCisgICAgeworICAgICAgICBjYXNlIFJTQV9QS0NTX1YxNToKKworICAgICAgICAgICAgc3dpdGNoKCBoYXNoX2lkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJTQV9SQVc6CisgICAgICAgICAgICAgICAgICAgIG5iX3BhZCA9IG9sZW4gLSAzIC0gaGFzaGxlbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFJTQV9NRDI6CisgICAgICAgICAgICAgICAgY2FzZSBSU0FfTUQ0OgorICAgICAgICAgICAgICAgIGNhc2UgUlNBX01ENToKKyAgICAgICAgICAgICAgICAgICAgbmJfcGFkID0gb2xlbiAtIDMgLSAzNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFJTQV9TSEExOgorICAgICAgICAgICAgICAgICAgICBuYl9wYWQgPSBvbGVuIC0gMyAtIDM1OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9CQURfSU5QVVRfREFUQSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggbmJfcGFkIDwgOCApCisgICAgICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfUlNBX0JBRF9JTlBVVF9EQVRBICk7CisKKyAgICAgICAgICAgICpwKysgPSAwOworICAgICAgICAgICAgKnArKyA9IFJTQV9TSUdOOworICAgICAgICAgICAgbWVtc2V0KCBwLCAweEZGLCBuYl9wYWQgKTsKKyAgICAgICAgICAgIHAgKz0gbmJfcGFkOworICAgICAgICAgICAgKnArKyA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9SU0FfSU5WQUxJRF9QQURESU5HICk7CisgICAgfQorCisgICAgc3dpdGNoKCBoYXNoX2lkICkKKyAgICB7CisgICAgICAgIGNhc2UgUlNBX1JBVzoKKyAgICAgICAgICAgIG1lbWNweSggcCwgaGFzaCwgaGFzaGxlbiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU0FfTUQyOgorICAgICAgICAgICAgbWVtY3B5KCBwLCBBU04xX0hBU0hfTURYLCAxOCApOworICAgICAgICAgICAgbWVtY3B5KCBwICsgMTgsIGhhc2gsIDE2ICk7CisgICAgICAgICAgICBwWzEzXSA9IDI7IGJyZWFrOworCisgICAgICAgIGNhc2UgUlNBX01ENDoKKyAgICAgICAgICAgIG1lbWNweSggcCwgQVNOMV9IQVNIX01EWCwgMTggKTsKKyAgICAgICAgICAgIG1lbWNweSggcCArIDE4LCBoYXNoLCAxNiApOworICAgICAgICAgICAgcFsxM10gPSA0OyBicmVhazsKKworICAgICAgICBjYXNlIFJTQV9NRDU6CisgICAgICAgICAgICBtZW1jcHkoIHAsIEFTTjFfSEFTSF9NRFgsIDE4ICk7CisgICAgICAgICAgICBtZW1jcHkoIHAgKyAxOCwgaGFzaCwgMTYgKTsKKyAgICAgICAgICAgIHBbMTNdID0gNTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU0FfU0hBMToKKyAgICAgICAgICAgIG1lbWNweSggcCwgQVNOMV9IQVNIX1NIQTEsIDE1ICk7CisgICAgICAgICAgICBtZW1jcHkoIHAgKyAxNSwgaGFzaCwgMjAgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9SU0FfQkFEX0lOUFVUX0RBVEEgKTsKKyAgICB9CisKKyAgICByZXR1cm4oICggbW9kZSA9PSBSU0FfUFVCTElDICkKKyAgICAgICAgICAgID8gcnNhX3B1YmxpYyggIGN0eCwgc2lnLCBzaWcgKQorICAgICAgICAgICAgOiByc2FfcHJpdmF0ZSggY3R4LCBzaWcsIHNpZyApICk7Cit9CisKKy8qCisgKiBEbyBhbiBSU0Egb3BlcmF0aW9uIGFuZCBjaGVjayB0aGUgbWVzc2FnZSBkaWdlc3QKKyAqLworaW50IHJzYV9wa2NzMV92ZXJpZnkoIHJzYV9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc2hsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaWcgKQoreworICAgIGludCByZXQsIGxlbiwgc2lnbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnAsIGM7CisgICAgdW5zaWduZWQgY2hhciBidWZbNTEyXTsKKworICAgIHNpZ2xlbiA9IGN0eC0+bGVuOworCisgICAgaWYoIHNpZ2xlbiA8IDE2IHx8IHNpZ2xlbiA+IChpbnQpIHNpemVvZiggYnVmICkgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9SU0FfQkFEX0lOUFVUX0RBVEEgKTsKKworICAgIHJldCA9ICggbW9kZSA9PSBSU0FfUFVCTElDICkKKyAgICAgICAgICA/IHJzYV9wdWJsaWMoICBjdHgsIHNpZywgYnVmICkKKyAgICAgICAgICA6IHJzYV9wcml2YXRlKCBjdHgsIHNpZywgYnVmICk7CisKKyAgICBpZiggcmV0ICE9IDAgKQorICAgICAgICByZXR1cm4oIHJldCApOworCisgICAgcCA9IGJ1ZjsKKworICAgIHN3aXRjaCggY3R4LT5wYWRkaW5nICkKKyAgICB7CisgICAgICAgIGNhc2UgUlNBX1BLQ1NfVjE1OgorCisgICAgICAgICAgICBpZiggKnArKyAhPSAwIHx8ICpwKysgIT0gUlNBX1NJR04gKQorICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9JTlZBTElEX1BBRERJTkcgKTsKKworICAgICAgICAgICAgd2hpbGUoICpwICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBwID49IGJ1ZiArIHNpZ2xlbiAtIDEgfHwgKnAgIT0gMHhGRiApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9JTlZBTElEX1BBRERJTkcgKTsKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9SU0FfSU5WQUxJRF9QQURESU5HICk7CisgICAgfQorCisgICAgbGVuID0gc2lnbGVuIC0gKGludCkoIHAgLSBidWYgKTsKKworICAgIGlmKCBsZW4gPT0gMzQgKQorICAgIHsKKyAgICAgICAgYyA9IHBbMTNdOworICAgICAgICBwWzEzXSA9IDA7CisKKyAgICAgICAgaWYoIG1lbWNtcCggcCwgQVNOMV9IQVNIX01EWCwgMTggKSAhPSAwICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9WRVJJRllfRkFJTEVEICk7CisKKyAgICAgICAgaWYoICggYyA9PSAyICYmIGhhc2hfaWQgPT0gUlNBX01EMiApIHx8CisgICAgICAgICAgICAoIGMgPT0gNCAmJiBoYXNoX2lkID09IFJTQV9NRDQgKSB8fAorICAgICAgICAgICAgKCBjID09IDUgJiYgaGFzaF9pZCA9PSBSU0FfTUQ1ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbWVtY21wKCBwICsgMTgsIGhhc2gsIDE2ICkgPT0gMCApIAorICAgICAgICAgICAgICAgIHJldHVybiggMCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9WRVJJRllfRkFJTEVEICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggbGVuID09IDM1ICYmIGhhc2hfaWQgPT0gUlNBX1NIQTEgKQorICAgIHsKKyAgICAgICAgaWYoIG1lbWNtcCggcCwgQVNOMV9IQVNIX1NIQTEsIDE1ICkgPT0gMCAmJgorICAgICAgICAgICAgbWVtY21wKCBwICsgMTUsIGhhc2gsIDIwICkgPT0gMCApCisgICAgICAgICAgICByZXR1cm4oIDAgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfUlNBX1ZFUklGWV9GQUlMRUQgKTsKKyAgICB9CisKKyAgICBpZiggbGVuID09IGhhc2hsZW4gJiYgaGFzaF9pZCA9PSBSU0FfUkFXICkKKyAgICB7CisgICAgICAgIGlmKCBtZW1jbXAoIHAsIGhhc2gsIGhhc2hsZW4gKSA9PSAwICkKKyAgICAgICAgICAgIHJldHVybiggMCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9SU0FfVkVSSUZZX0ZBSUxFRCApOworICAgIH0KKworICAgIHJldHVybiggWFlTU0xfRVJSX1JTQV9JTlZBTElEX1BBRERJTkcgKTsKK30KKworLyoKKyAqIEZyZWUgdGhlIGNvbXBvbmVudHMgb2YgYW4gUlNBIGtleQorICovCit2b2lkIHJzYV9mcmVlKCByc2FfY29udGV4dCAqY3R4ICkKK3sKKyAgICBtcGlfZnJlZSggJmN0eC0+UlEsICZjdHgtPlJQLCAmY3R4LT5STiwKKyAgICAgICAgICAgICAgJmN0eC0+UVAsICZjdHgtPkRRLCAmY3R4LT5EUCwKKyAgICAgICAgICAgICAgJmN0eC0+USwgICZjdHgtPlAsICAmY3R4LT5ELAorICAgICAgICAgICAgICAmY3R4LT5FLCAgJmN0eC0+TiwgIE5VTEwgKTsKK30KKworI2lmIGRlZmluZWQoWFlTU0xfU0VMRl9URVNUKQorCisjaW5jbHVkZSAieHlzc2wvc2hhMS5oIgorCisvKgorICogRXhhbXBsZSBSU0EtMTAyNCBrZXlwYWlyLCBmb3IgdGVzdCBwdXJwb3NlcworICovCisjZGVmaW5lIEtFWV9MRU4gMTI4CisKKyNkZWZpbmUgUlNBX04gICAiOTI5Mjc1ODQ1MzA2M0Q4MDNERDYwM0Q1RTc3N0Q3ODgiIFwKKyAgICAgICAgICAgICAgICAiOEVEMUQ1QkYzNTc4NjE5MEZBMkYyM0VCQzA4NDhBRUEiIFwKKyAgICAgICAgICAgICAgICAiRERBOTJDQTZDM0Q4MEIzMkM0RDEwOUJFMEYzNkQ2QUUiIFwKKyAgICAgICAgICAgICAgICAiNzEzMEI5Q0VEN0FDREY1NENGQzc1NTVBQzE0RUVCQUIiIFwKKyAgICAgICAgICAgICAgICAiOTNBODk4MTNGQkYzQzRGODA2NkQyRDgwMEY3QzM4QTgiIFwKKyAgICAgICAgICAgICAgICAiMUFFMzE5NDI5MTc0MDNGRjQ5NDZCMEE4M0QzRDNFMDUiIFwKKyAgICAgICAgICAgICAgICAiRUU1N0M2RjVGNTYwNkZCNUQ0QkM2Q0QzNEVFMDgwMUEiIFwKKyAgICAgICAgICAgICAgICAiNUU5NEJCNzdCMDc1MDcyMzNBMEJDN0JBQzhGOTBGNzkiCisKKyNkZWZpbmUgUlNBX0UgICAiMTAwMDEiCisKKyNkZWZpbmUgUlNBX0QgICAiMjRCRjYxODU0Njg3ODZGREQzMDMwODNEMjVFNjRFRkMiIFwKKyAgICAgICAgICAgICAgICAiNjZDQTQ3MkJDNDREMjUzMTAyRjhCNEE5RDNCRkE3NTAiIFwKKyAgICAgICAgICAgICAgICAiOTEzODZDMDA3NzkzN0ZFMzNGQTMyNTJEMjg4NTU4MzciIFwKKyAgICAgICAgICAgICAgICAiQUUxQjQ4NEE4QTlBNDVGN0VFOEMwQzYzNEY5OUU4Q0QiIFwKKyAgICAgICAgICAgICAgICAiREY3OUM1Q0UwN0VFNzJDN0YxMjMxNDIxOTgxNjQyMzQiIFwKKyAgICAgICAgICAgICAgICAiQ0FCQjcyNENGNzhCODE3M0I5Rjg4MEZDODYzMjI0MDciIFwKKyAgICAgICAgICAgICAgICAiQUYxRkVERkRERTJCRUI2NzRDQTE1RjNFODFBMTUyMUUiIFwKKyAgICAgICAgICAgICAgICAiMDcxNTEzQTFFODVCNURGQTAzMUYyMUVDQUU5MUEzNEQiCisKKyNkZWZpbmUgUlNBX1AgICAiQzM2RDBFQjdGQ0QyODUyMjNDRkI1QUFCQTVCREEzRDgiIFwKKyAgICAgICAgICAgICAgICAiMkMwMUNBRDE5RUE0ODRBODdFQTQzNzc2MzdFNzU1MDAiIFwKKyAgICAgICAgICAgICAgICAiRkNCMjAwNUM1QzdERDZFQzRBQzAyM0NEQTI4NUQ3OTYiIFwKKyAgICAgICAgICAgICAgICAiQzNEOUU3NUUxRUZDNDI0ODhCQjRGMUQxM0FDMzBBNTciCisKKyNkZWZpbmUgUlNBX1EgICAiQzAwMERGNTFBN0M3N0FFOEQ3QzczNzBDMUZGNTVCNjkiIFwKKyAgICAgICAgICAgICAgICAiRTIxMUMyQjlFNURCMUVEMEJGNjFEMEQ5ODk5NjIwRjQiIFwKKyAgICAgICAgICAgICAgICAiOTEwRTQxNjgzODdFM0MzMEFBMUUwMEMzMzlBNzk1MDgiIFwKKyAgICAgICAgICAgICAgICAiODQ1MkREOTZBOUE1RUE1RDlEQ0E2OERBNjM2MDMyQUYiCisKKyNkZWZpbmUgUlNBX0RQICAiQzFBQ0Y1Njc1NjQyNzRGQjA3QTBCQkFENUQyNkUyOTgiIFwKKyAgICAgICAgICAgICAgICAiM0M5NEQyMjI4OEFDRDc2M0ZEOEU1NjAwRUQ0QTcwMkQiIFwKKyAgICAgICAgICAgICAgICAiRjg0MTk4QTVGMDZDMkU3MjIzNkFFNDkwQzkzRjA3RjgiIFwKKyAgICAgICAgICAgICAgICAiM0NDNTU5Q0QyN0JDMkQxQ0E0ODg4MTE3MzBCQjU3MjUiCisKKyNkZWZpbmUgUlNBX0RRICAiNDk1OUNCRjZGOEZFRjc1MEFFRTY5NzdDMTU1NTc5QzciIFwKKyAgICAgICAgICAgICAgICAiRDhBQUVBNTY3NDlFQTI4NjIzMjcyRTRGN0QwNTkyQUYiIFwKKyAgICAgICAgICAgICAgICAiN0MxRjEzMTNDQUM5NDcxQjVDNTIzQkZFNTkyRjUxN0IiIFwKKyAgICAgICAgICAgICAgICAiNDA3QTFCRDc2QzE2NEI5M0RBMkQzMkEzODNFNTgzNTciCisKKyNkZWZpbmUgUlNBX1FQICAiOUFFN0ZCQzk5NTQ2NDMyREY3MTg5NkZDMjM5RUFEQUUiIFwKKyAgICAgICAgICAgICAgICAiRjM4RDE4RDJCMkYwRTJERDI3NUFBOTc3RTJCRjQ0MTEiIFwKKyAgICAgICAgICAgICAgICAiRjVBM0IyQTVEMzM2MDVBRUJCQ0NCQTdGRUI5RjJEMkYiIFwKKyAgICAgICAgICAgICAgICAiQTc0MjA2Q0VDMTY5RDc0QkY1QThDNTBENkY0OEVBMDgiCisKKyNkZWZpbmUgUFRfTEVOICAyNAorI2RlZmluZSBSU0FfUFQgICJceEFBXHhCQlx4Q0NceDAzXHgwMlx4MDFceDAwXHhGRlx4RkZceEZGXHhGRlx4RkYiIFwKKyAgICAgICAgICAgICAgICAiXHgxMVx4MjJceDMzXHgwQVx4MEJceDBDXHhDQ1x4RERceEREXHhERFx4RERceEREIgorCisvKgorICogQ2hlY2t1cCByb3V0aW5lCisgKi8KK2ludCByc2Ffc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApCit7CisgICAgaW50IGxlbjsKKyAgICByc2FfY29udGV4dCByc2E7CisgICAgdW5zaWduZWQgY2hhciBzaGExc3VtWzIwXTsKKyAgICB1bnNpZ25lZCBjaGFyIHJzYV9wbGFpbnRleHRbUFRfTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIHJzYV9kZWNyeXB0ZWRbUFRfTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIHJzYV9jaXBoZXJ0ZXh0W0tFWV9MRU5dOworCisgICAgbWVtc2V0KCAmcnNhLCAwLCBzaXplb2YoIHJzYV9jb250ZXh0ICkgKTsKKworICAgIHJzYS5sZW4gPSBLRVlfTEVOOworICAgIG1waV9yZWFkX3N0cmluZyggJnJzYS5OICwgMTYsIFJTQV9OICApOworICAgIG1waV9yZWFkX3N0cmluZyggJnJzYS5FICwgMTYsIFJTQV9FICApOworICAgIG1waV9yZWFkX3N0cmluZyggJnJzYS5EICwgMTYsIFJTQV9EICApOworICAgIG1waV9yZWFkX3N0cmluZyggJnJzYS5QICwgMTYsIFJTQV9QICApOworICAgIG1waV9yZWFkX3N0cmluZyggJnJzYS5RICwgMTYsIFJTQV9RICApOworICAgIG1waV9yZWFkX3N0cmluZyggJnJzYS5EUCwgMTYsIFJTQV9EUCApOworICAgIG1waV9yZWFkX3N0cmluZyggJnJzYS5EUSwgMTYsIFJTQV9EUSApOworICAgIG1waV9yZWFkX3N0cmluZyggJnJzYS5RUCwgMTYsIFJTQV9RUCApOworCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIiAgUlNBIGtleSB2YWxpZGF0aW9uOiAiICk7CisKKyAgICBpZiggcnNhX2NoZWNrX3B1YmtleSggICZyc2EgKSAhPSAwIHx8CisgICAgICAgIHJzYV9jaGVja19wcml2a2V5KCAmcnNhICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJwYXNzZWRcbiAgUEtDUyMxIGVuY3J5cHRpb24gOiAiICk7CisKKyAgICBtZW1jcHkoIHJzYV9wbGFpbnRleHQsIFJTQV9QVCwgUFRfTEVOICk7CisKKyAgICBpZiggcnNhX3BrY3MxX2VuY3J5cHQoICZyc2EsIFJTQV9QVUJMSUMsIFBUX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzYV9wbGFpbnRleHQsIHJzYV9jaXBoZXJ0ZXh0ICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJwYXNzZWRcbiAgUEtDUyMxIGRlY3J5cHRpb24gOiAiICk7CisKKyAgICBpZiggcnNhX3BrY3MxX2RlY3J5cHQoICZyc2EsIFJTQV9QUklWQVRFLCAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNhX2NpcGhlcnRleHQsIHJzYV9kZWNyeXB0ZWQgKSAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAiZmFpbGVkXG4iICk7CisKKyAgICAgICAgcmV0dXJuKCAxICk7CisgICAgfQorCisgICAgaWYoIG1lbWNtcCggcnNhX2RlY3J5cHRlZCwgcnNhX3BsYWludGV4dCwgbGVuICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJwYXNzZWRcbiAgUEtDUyMxIGRhdGEgc2lnbiAgOiAiICk7CisKKyAgICBzaGExKCByc2FfcGxhaW50ZXh0LCBQVF9MRU4sIHNoYTFzdW0gKTsKKworICAgIGlmKCByc2FfcGtjczFfc2lnbiggJnJzYSwgUlNBX1BSSVZBVEUsIFJTQV9TSEExLCAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYTFzdW0sIHJzYV9jaXBoZXJ0ZXh0ICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJwYXNzZWRcbiAgUEtDUyMxIHNpZy4gdmVyaWZ5OiAiICk7CisKKyAgICBpZiggcnNhX3BrY3MxX3ZlcmlmeSggJnJzYSwgUlNBX1BVQkxJQywgUlNBX1NIQTEsIDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaGExc3VtLCByc2FfY2lwaGVydGV4dCApICE9IDAgKQorICAgIHsKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICJmYWlsZWRcbiIgKTsKKworICAgICAgICByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAicGFzc2VkXG5cbiIgKTsKKworICAgIHJzYV9mcmVlKCAmcnNhICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicmFyeS9zaGExLmMgYi9saWJyYXJ5L3NoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTVhNWJmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicmFyeS9zaGExLmMKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiAgRklQUy0xODAtMSBjb21wbGlhbnQgU0hBLTEgaW1wbGVtZW50YXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisvKgorICogIFRoZSBTSEEtMSBzdGFuZGFyZCB3YXMgcHVibGlzaGVkIGJ5IE5JU1QgaW4gMTk5My4KKyAqCisgKiAgaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZmlwc3B1YnMvZmlwMTgwLTEuaHRtCisgKi8KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChYWVNTTF9TSEExX0MpCisKKyNpbmNsdWRlICJ4eXNzbC9zaGExLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKgorICogMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uIG1hY3JvcyAoYmlnIGVuZGlhbikKKyAqLworI2lmbmRlZiBHRVRfVUxPTkdfQkUKKyNkZWZpbmUgR0VUX1VMT05HX0JFKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKG4pID0gKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSAgICBdIDw8IDI0ICkgICAgICAgIFwKKyAgICAgICAgfCAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICsgMV0gPDwgMTYgKSAgICAgICAgXAorICAgICAgICB8ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgKyAyXSA8PCAgOCApICAgICAgICBcCisgICAgICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDNdICAgICAgICk7ICAgICAgIFwKK30KKyNlbmRpZgorCisjaWZuZGVmIFBVVF9VTE9OR19CRQorI2RlZmluZSBQVVRfVUxPTkdfQkUobixiLGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYilbKGkpICAgIF0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gMjQgKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAxXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAxNiApOyAgICAgICBcCisgICAgKGIpWyhpKSArIDJdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+ICA4ICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgM10gPSAodW5zaWduZWQgY2hhcikgKCAobikgICAgICAgKTsgICAgICAgXAorfQorI2VuZGlmCisKKy8qCisgKiBTSEEtMSBjb250ZXh0IHNldHVwCisgKi8KK3ZvaWQgc2hhMV9zdGFydHMoIHNoYTFfY29udGV4dCAqY3R4ICkKK3sKKyAgICBjdHgtPnRvdGFsWzBdID0gMDsKKyAgICBjdHgtPnRvdGFsWzFdID0gMDsKKworICAgIGN0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworICAgIGN0eC0+c3RhdGVbMV0gPSAweEVGQ0RBQjg5OworICAgIGN0eC0+c3RhdGVbMl0gPSAweDk4QkFEQ0ZFOworICAgIGN0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OworICAgIGN0eC0+c3RhdGVbNF0gPSAweEMzRDJFMUYwOworfQorCitzdGF0aWMgdm9pZCBzaGExX3Byb2Nlc3MoIHNoYTFfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIGRhdGFbNjRdICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHRlbXAsIFdbMTZdLCBBLCBCLCBDLCBELCBFOworCisgICAgR0VUX1VMT05HX0JFKCBXWyAwXSwgZGF0YSwgIDAgKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbIDFdLCBkYXRhLCAgNCApOworICAgIEdFVF9VTE9OR19CRSggV1sgMl0sIGRhdGEsICA4ICk7CisgICAgR0VUX1VMT05HX0JFKCBXWyAzXSwgZGF0YSwgMTIgKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbIDRdLCBkYXRhLCAxNiApOworICAgIEdFVF9VTE9OR19CRSggV1sgNV0sIGRhdGEsIDIwICk7CisgICAgR0VUX1VMT05HX0JFKCBXWyA2XSwgZGF0YSwgMjQgKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbIDddLCBkYXRhLCAyOCApOworICAgIEdFVF9VTE9OR19CRSggV1sgOF0sIGRhdGEsIDMyICk7CisgICAgR0VUX1VMT05HX0JFKCBXWyA5XSwgZGF0YSwgMzYgKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbMTBdLCBkYXRhLCA0MCApOworICAgIEdFVF9VTE9OR19CRSggV1sxMV0sIGRhdGEsIDQ0ICk7CisgICAgR0VUX1VMT05HX0JFKCBXWzEyXSwgZGF0YSwgNDggKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbMTNdLCBkYXRhLCA1MiApOworICAgIEdFVF9VTE9OR19CRSggV1sxNF0sIGRhdGEsIDU2ICk7CisgICAgR0VUX1VMT05HX0JFKCBXWzE1XSwgZGF0YSwgNjAgKTsKKworI2RlZmluZSBTKHgsbikgKCh4IDw8IG4pIHwgKCh4ICYgMHhGRkZGRkZGRikgPj4gKDMyIC0gbikpKQorCisjZGVmaW5lIFIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAgPSBXWyh0IC0gIDMpICYgMHgwRl0gXiBXWyh0IC0gOCkgJiAweDBGXSBeICAgICBcCisgICAgICAgICAgIFdbKHQgLSAxNCkgJiAweDBGXSBeIFdbIHQgICAgICAmIDB4MEZdLCAgICAgIFwKKyAgICAoIFdbdCAmIDB4MEZdID0gUyh0ZW1wLDEpICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorKQorCisjZGVmaW5lIFAoYSxiLGMsZCxlLHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGUgKz0gUyhhLDUpICsgRihiLGMsZCkgKyBLICsgeDsgYiA9IFMoYiwzMCk7ICAgICAgICBcCit9CisKKyAgICBBID0gY3R4LT5zdGF0ZVswXTsKKyAgICBCID0gY3R4LT5zdGF0ZVsxXTsKKyAgICBDID0gY3R4LT5zdGF0ZVsyXTsKKyAgICBEID0gY3R4LT5zdGF0ZVszXTsKKyAgICBFID0gY3R4LT5zdGF0ZVs0XTsKKworI2RlZmluZSBGKHgseSx6KSAoeiBeICh4ICYgKHkgXiB6KSkpCisjZGVmaW5lIEsgMHg1QTgyNzk5OQorCisgICAgUCggQSwgQiwgQywgRCwgRSwgV1swXSAgKTsKKyAgICBQKCBFLCBBLCBCLCBDLCBELCBXWzFdICApOworICAgIFAoIEQsIEUsIEEsIEIsIEMsIFdbMl0gICk7CisgICAgUCggQywgRCwgRSwgQSwgQiwgV1szXSAgKTsKKyAgICBQKCBCLCBDLCBELCBFLCBBLCBXWzRdICApOworICAgIFAoIEEsIEIsIEMsIEQsIEUsIFdbNV0gICk7CisgICAgUCggRSwgQSwgQiwgQywgRCwgV1s2XSAgKTsKKyAgICBQKCBELCBFLCBBLCBCLCBDLCBXWzddICApOworICAgIFAoIEMsIEQsIEUsIEEsIEIsIFdbOF0gICk7CisgICAgUCggQiwgQywgRCwgRSwgQSwgV1s5XSAgKTsKKyAgICBQKCBBLCBCLCBDLCBELCBFLCBXWzEwXSApOworICAgIFAoIEUsIEEsIEIsIEMsIEQsIFdbMTFdICk7CisgICAgUCggRCwgRSwgQSwgQiwgQywgV1sxMl0gKTsKKyAgICBQKCBDLCBELCBFLCBBLCBCLCBXWzEzXSApOworICAgIFAoIEIsIEMsIEQsIEUsIEEsIFdbMTRdICk7CisgICAgUCggQSwgQiwgQywgRCwgRSwgV1sxNV0gKTsKKyAgICBQKCBFLCBBLCBCLCBDLCBELCBSKDE2KSApOworICAgIFAoIEQsIEUsIEEsIEIsIEMsIFIoMTcpICk7CisgICAgUCggQywgRCwgRSwgQSwgQiwgUigxOCkgKTsKKyAgICBQKCBCLCBDLCBELCBFLCBBLCBSKDE5KSApOworCisjdW5kZWYgSworI3VuZGVmIEYKKworI2RlZmluZSBGKHgseSx6KSAoeCBeIHkgXiB6KQorI2RlZmluZSBLIDB4NkVEOUVCQTEKKworICAgIFAoIEEsIEIsIEMsIEQsIEUsIFIoMjApICk7CisgICAgUCggRSwgQSwgQiwgQywgRCwgUigyMSkgKTsKKyAgICBQKCBELCBFLCBBLCBCLCBDLCBSKDIyKSApOworICAgIFAoIEMsIEQsIEUsIEEsIEIsIFIoMjMpICk7CisgICAgUCggQiwgQywgRCwgRSwgQSwgUigyNCkgKTsKKyAgICBQKCBBLCBCLCBDLCBELCBFLCBSKDI1KSApOworICAgIFAoIEUsIEEsIEIsIEMsIEQsIFIoMjYpICk7CisgICAgUCggRCwgRSwgQSwgQiwgQywgUigyNykgKTsKKyAgICBQKCBDLCBELCBFLCBBLCBCLCBSKDI4KSApOworICAgIFAoIEIsIEMsIEQsIEUsIEEsIFIoMjkpICk7CisgICAgUCggQSwgQiwgQywgRCwgRSwgUigzMCkgKTsKKyAgICBQKCBFLCBBLCBCLCBDLCBELCBSKDMxKSApOworICAgIFAoIEQsIEUsIEEsIEIsIEMsIFIoMzIpICk7CisgICAgUCggQywgRCwgRSwgQSwgQiwgUigzMykgKTsKKyAgICBQKCBCLCBDLCBELCBFLCBBLCBSKDM0KSApOworICAgIFAoIEEsIEIsIEMsIEQsIEUsIFIoMzUpICk7CisgICAgUCggRSwgQSwgQiwgQywgRCwgUigzNikgKTsKKyAgICBQKCBELCBFLCBBLCBCLCBDLCBSKDM3KSApOworICAgIFAoIEMsIEQsIEUsIEEsIEIsIFIoMzgpICk7CisgICAgUCggQiwgQywgRCwgRSwgQSwgUigzOSkgKTsKKworI3VuZGVmIEsKKyN1bmRlZiBGCisKKyNkZWZpbmUgRih4LHkseikgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQorI2RlZmluZSBLIDB4OEYxQkJDREMKKworICAgIFAoIEEsIEIsIEMsIEQsIEUsIFIoNDApICk7CisgICAgUCggRSwgQSwgQiwgQywgRCwgUig0MSkgKTsKKyAgICBQKCBELCBFLCBBLCBCLCBDLCBSKDQyKSApOworICAgIFAoIEMsIEQsIEUsIEEsIEIsIFIoNDMpICk7CisgICAgUCggQiwgQywgRCwgRSwgQSwgUig0NCkgKTsKKyAgICBQKCBBLCBCLCBDLCBELCBFLCBSKDQ1KSApOworICAgIFAoIEUsIEEsIEIsIEMsIEQsIFIoNDYpICk7CisgICAgUCggRCwgRSwgQSwgQiwgQywgUig0NykgKTsKKyAgICBQKCBDLCBELCBFLCBBLCBCLCBSKDQ4KSApOworICAgIFAoIEIsIEMsIEQsIEUsIEEsIFIoNDkpICk7CisgICAgUCggQSwgQiwgQywgRCwgRSwgUig1MCkgKTsKKyAgICBQKCBFLCBBLCBCLCBDLCBELCBSKDUxKSApOworICAgIFAoIEQsIEUsIEEsIEIsIEMsIFIoNTIpICk7CisgICAgUCggQywgRCwgRSwgQSwgQiwgUig1MykgKTsKKyAgICBQKCBCLCBDLCBELCBFLCBBLCBSKDU0KSApOworICAgIFAoIEEsIEIsIEMsIEQsIEUsIFIoNTUpICk7CisgICAgUCggRSwgQSwgQiwgQywgRCwgUig1NikgKTsKKyAgICBQKCBELCBFLCBBLCBCLCBDLCBSKDU3KSApOworICAgIFAoIEMsIEQsIEUsIEEsIEIsIFIoNTgpICk7CisgICAgUCggQiwgQywgRCwgRSwgQSwgUig1OSkgKTsKKworI3VuZGVmIEsKKyN1bmRlZiBGCisKKyNkZWZpbmUgRih4LHkseikgKHggXiB5IF4geikKKyNkZWZpbmUgSyAweENBNjJDMUQ2CisKKyAgICBQKCBBLCBCLCBDLCBELCBFLCBSKDYwKSApOworICAgIFAoIEUsIEEsIEIsIEMsIEQsIFIoNjEpICk7CisgICAgUCggRCwgRSwgQSwgQiwgQywgUig2MikgKTsKKyAgICBQKCBDLCBELCBFLCBBLCBCLCBSKDYzKSApOworICAgIFAoIEIsIEMsIEQsIEUsIEEsIFIoNjQpICk7CisgICAgUCggQSwgQiwgQywgRCwgRSwgUig2NSkgKTsKKyAgICBQKCBFLCBBLCBCLCBDLCBELCBSKDY2KSApOworICAgIFAoIEQsIEUsIEEsIEIsIEMsIFIoNjcpICk7CisgICAgUCggQywgRCwgRSwgQSwgQiwgUig2OCkgKTsKKyAgICBQKCBCLCBDLCBELCBFLCBBLCBSKDY5KSApOworICAgIFAoIEEsIEIsIEMsIEQsIEUsIFIoNzApICk7CisgICAgUCggRSwgQSwgQiwgQywgRCwgUig3MSkgKTsKKyAgICBQKCBELCBFLCBBLCBCLCBDLCBSKDcyKSApOworICAgIFAoIEMsIEQsIEUsIEEsIEIsIFIoNzMpICk7CisgICAgUCggQiwgQywgRCwgRSwgQSwgUig3NCkgKTsKKyAgICBQKCBBLCBCLCBDLCBELCBFLCBSKDc1KSApOworICAgIFAoIEUsIEEsIEIsIEMsIEQsIFIoNzYpICk7CisgICAgUCggRCwgRSwgQSwgQiwgQywgUig3NykgKTsKKyAgICBQKCBDLCBELCBFLCBBLCBCLCBSKDc4KSApOworICAgIFAoIEIsIEMsIEQsIEUsIEEsIFIoNzkpICk7CisKKyN1bmRlZiBLCisjdW5kZWYgRgorCisgICAgY3R4LT5zdGF0ZVswXSArPSBBOworICAgIGN0eC0+c3RhdGVbMV0gKz0gQjsKKyAgICBjdHgtPnN0YXRlWzJdICs9IEM7CisgICAgY3R4LT5zdGF0ZVszXSArPSBEOworICAgIGN0eC0+c3RhdGVbNF0gKz0gRTsKK30KKworLyoKKyAqIFNIQS0xIHByb2Nlc3MgYnVmZmVyCisgKi8KK3ZvaWQgc2hhMV91cGRhdGUoIHNoYTFfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4gKQoreworICAgIGludCBmaWxsOworICAgIHVuc2lnbmVkIGxvbmcgbGVmdDsKKworICAgIGlmKCBpbGVuIDw9IDAgKQorICAgICAgICByZXR1cm47CisKKyAgICBsZWZ0ID0gY3R4LT50b3RhbFswXSAmIDB4M0Y7CisgICAgZmlsbCA9IDY0IC0gbGVmdDsKKworICAgIGN0eC0+dG90YWxbMF0gKz0gaWxlbjsKKyAgICBjdHgtPnRvdGFsWzBdICY9IDB4RkZGRkZGRkY7CisKKyAgICBpZiggY3R4LT50b3RhbFswXSA8ICh1bnNpZ25lZCBsb25nKSBpbGVuICkKKyAgICAgICAgY3R4LT50b3RhbFsxXSsrOworCisgICAgaWYoIGxlZnQgJiYgaWxlbiA+PSBmaWxsICkKKyAgICB7CisgICAgICAgIG1lbWNweSggKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksCisgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGZpbGwgKTsKKyAgICAgICAgc2hhMV9wcm9jZXNzKCBjdHgsIGN0eC0+YnVmZmVyICk7CisgICAgICAgIGlucHV0ICs9IGZpbGw7CisgICAgICAgIGlsZW4gIC09IGZpbGw7CisgICAgICAgIGxlZnQgPSAwOworICAgIH0KKworICAgIHdoaWxlKCBpbGVuID49IDY0ICkKKyAgICB7CisgICAgICAgIHNoYTFfcHJvY2VzcyggY3R4LCBpbnB1dCApOworICAgICAgICBpbnB1dCArPSA2NDsKKyAgICAgICAgaWxlbiAgLT0gNjQ7CisgICAgfQorCisgICAgaWYoIGlsZW4gPiAwICkKKyAgICB7CisgICAgICAgIG1lbWNweSggKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksCisgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGlsZW4gKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNoYTFfcGFkZGluZ1s2NF0gPQoreworIDB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKKy8qCisgKiBTSEEtMSBmaW5hbCBkaWdlc3QKKyAqLwordm9pZCBzaGExX2ZpbmlzaCggc2hhMV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSApCit7CisgICAgdW5zaWduZWQgbG9uZyBsYXN0LCBwYWRuOworICAgIHVuc2lnbmVkIGxvbmcgaGlnaCwgbG93OworICAgIHVuc2lnbmVkIGNoYXIgbXNnbGVuWzhdOworCisgICAgaGlnaCA9ICggY3R4LT50b3RhbFswXSA+PiAyOSApCisgICAgICAgICB8ICggY3R4LT50b3RhbFsxXSA8PCAgMyApOworICAgIGxvdyAgPSAoIGN0eC0+dG90YWxbMF0gPDwgIDMgKTsKKworICAgIFBVVF9VTE9OR19CRSggaGlnaCwgbXNnbGVuLCAwICk7CisgICAgUFVUX1VMT05HX0JFKCBsb3csICBtc2dsZW4sIDQgKTsKKworICAgIGxhc3QgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKKyAgICBwYWRuID0gKCBsYXN0IDwgNTYgKSA/ICggNTYgLSBsYXN0ICkgOiAoIDEyMCAtIGxhc3QgKTsKKworICAgIHNoYTFfdXBkYXRlKCBjdHgsICh1bnNpZ25lZCBjaGFyICopIHNoYTFfcGFkZGluZywgcGFkbiApOworICAgIHNoYTFfdXBkYXRlKCBjdHgsIG1zZ2xlbiwgOCApOworCisgICAgUFVUX1VMT05HX0JFKCBjdHgtPnN0YXRlWzBdLCBvdXRwdXQsICAwICk7CisgICAgUFVUX1VMT05HX0JFKCBjdHgtPnN0YXRlWzFdLCBvdXRwdXQsICA0ICk7CisgICAgUFVUX1VMT05HX0JFKCBjdHgtPnN0YXRlWzJdLCBvdXRwdXQsICA4ICk7CisgICAgUFVUX1VMT05HX0JFKCBjdHgtPnN0YXRlWzNdLCBvdXRwdXQsIDEyICk7CisgICAgUFVUX1VMT05HX0JFKCBjdHgtPnN0YXRlWzRdLCBvdXRwdXQsIDE2ICk7Cit9CisKKy8qCisgKiBvdXRwdXQgPSBTSEEtMSggaW5wdXQgYnVmZmVyICkKKyAqLwordm9pZCBzaGExKCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSApCit7CisgICAgc2hhMV9jb250ZXh0IGN0eDsKKworICAgIHNoYTFfc3RhcnRzKCAmY3R4ICk7CisgICAgc2hhMV91cGRhdGUoICZjdHgsIGlucHV0LCBpbGVuICk7CisgICAgc2hhMV9maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIHNoYTFfY29udGV4dCApICk7Cit9CisKKy8qCisgKiBvdXRwdXQgPSBTSEEtMSggZmlsZSBjb250ZW50cyApCisgKi8KK2ludCBzaGExX2ZpbGUoIGNoYXIgKnBhdGgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSApCit7CisgICAgRklMRSAqZjsKKyAgICBzaXplX3QgbjsKKyAgICBzaGExX2NvbnRleHQgY3R4OworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMjRdOworCisgICAgaWYoICggZiA9IGZvcGVuKCBwYXRoLCAicmIiICkgKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuKCAxICk7CisKKyAgICBzaGExX3N0YXJ0cyggJmN0eCApOworCisgICAgd2hpbGUoICggbiA9IGZyZWFkKCBidWYsIDEsIHNpemVvZiggYnVmICksIGYgKSApID4gMCApCisgICAgICAgIHNoYTFfdXBkYXRlKCAmY3R4LCBidWYsIChpbnQpIG4gKTsKKworICAgIHNoYTFfZmluaXNoKCAmY3R4LCBvdXRwdXQgKTsKKworICAgIG1lbXNldCggJmN0eCwgMCwgc2l6ZW9mKCBzaGExX2NvbnRleHQgKSApOworCisgICAgaWYoIGZlcnJvciggZiApICE9IDAgKQorICAgIHsKKyAgICAgICAgZmNsb3NlKCBmICk7CisgICAgICAgIHJldHVybiggMiApOworICAgIH0KKworICAgIGZjbG9zZSggZiApOworICAgIHJldHVybiggMCApOworfQorCisvKgorICogU0hBLTEgSE1BQyBjb250ZXh0IHNldHVwCisgKi8KK3ZvaWQgc2hhMV9obWFjX3N0YXJ0cyggc2hhMV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBzdW1bMjBdOworCisgICAgaWYoIGtleWxlbiA+IDY0ICkKKyAgICB7CisgICAgICAgIHNoYTEoIGtleSwga2V5bGVuLCBzdW0gKTsKKyAgICAgICAga2V5bGVuID0gMjA7CisgICAgICAgIGtleSA9IHN1bTsKKyAgICB9CisKKyAgICBtZW1zZXQoIGN0eC0+aXBhZCwgMHgzNiwgNjQgKTsKKyAgICBtZW1zZXQoIGN0eC0+b3BhZCwgMHg1QywgNjQgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBrZXlsZW47IGkrKyApCisgICAgeworICAgICAgICBjdHgtPmlwYWRbaV0gPSAodW5zaWduZWQgY2hhcikoIGN0eC0+aXBhZFtpXSBeIGtleVtpXSApOworICAgICAgICBjdHgtPm9wYWRbaV0gPSAodW5zaWduZWQgY2hhcikoIGN0eC0+b3BhZFtpXSBeIGtleVtpXSApOworICAgIH0KKworICAgIHNoYTFfc3RhcnRzKCBjdHggKTsKKyAgICBzaGExX3VwZGF0ZSggY3R4LCBjdHgtPmlwYWQsIDY0ICk7CisKKyAgICBtZW1zZXQoIHN1bSwgMCwgc2l6ZW9mKCBzdW0gKSApOworfQorCisvKgorICogU0hBLTEgSE1BQyBwcm9jZXNzIGJ1ZmZlcgorICovCit2b2lkIHNoYTFfaG1hY191cGRhdGUoIHNoYTFfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4gKQoreworICAgIHNoYTFfdXBkYXRlKCBjdHgsIGlucHV0LCBpbGVuICk7Cit9CisKKy8qCisgKiBTSEEtMSBITUFDIGZpbmFsIGRpZ2VzdAorICovCit2b2lkIHNoYTFfaG1hY19maW5pc2goIHNoYTFfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0gKQoreworICAgIHVuc2lnbmVkIGNoYXIgdG1wYnVmWzIwXTsKKworICAgIHNoYTFfZmluaXNoKCBjdHgsIHRtcGJ1ZiApOworICAgIHNoYTFfc3RhcnRzKCBjdHggKTsKKyAgICBzaGExX3VwZGF0ZSggY3R4LCBjdHgtPm9wYWQsIDY0ICk7CisgICAgc2hhMV91cGRhdGUoIGN0eCwgdG1wYnVmLCAyMCApOworICAgIHNoYTFfZmluaXNoKCBjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCB0bXBidWYsIDAsIHNpemVvZiggdG1wYnVmICkgKTsKK30KKworLyoKKyAqIG91dHB1dCA9IEhNQUMtU0hBLTEoIGhtYWMga2V5LCBpbnB1dCBidWZmZXIgKQorICovCit2b2lkIHNoYTFfaG1hYyggdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0gKQoreworICAgIHNoYTFfY29udGV4dCBjdHg7CisKKyAgICBzaGExX2htYWNfc3RhcnRzKCAmY3R4LCBrZXksIGtleWxlbiApOworICAgIHNoYTFfaG1hY191cGRhdGUoICZjdHgsIGlucHV0LCBpbGVuICk7CisgICAgc2hhMV9obWFjX2ZpbmlzaCggJmN0eCwgb3V0cHV0ICk7CisKKyAgICBtZW1zZXQoICZjdHgsIDAsIHNpemVvZiggc2hhMV9jb250ZXh0ICkgKTsKK30KKworI2lmIGRlZmluZWQoWFlTU0xfU0VMRl9URVNUKQorLyoKKyAqIEZJUFMtMTgwLTEgdGVzdCB2ZWN0b3JzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYTFfdGVzdF9idWZbM11bNTddID0gCit7CisgICAgeyAiYWJjIiB9LAorICAgIHsgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiB9LAorICAgIHsgIiIgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBzaGExX3Rlc3RfYnVmbGVuWzNdID0KK3sKKyAgICAzLCA1NiwgMTAwMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2hhMV90ZXN0X3N1bVszXVsyMF0gPQoreworICAgIHsgMHhBOSwgMHg5OSwgMHgzRSwgMHgzNiwgMHg0NywgMHgwNiwgMHg4MSwgMHg2QSwgMHhCQSwgMHgzRSwKKyAgICAgIDB4MjUsIDB4NzEsIDB4NzgsIDB4NTAsIDB4QzIsIDB4NkMsIDB4OUMsIDB4RDAsIDB4RDgsIDB4OUQgfSwKKyAgICB7IDB4ODQsIDB4OTgsIDB4M0UsIDB4NDQsIDB4MUMsIDB4M0IsIDB4RDIsIDB4NkUsIDB4QkEsIDB4QUUsCisgICAgICAweDRBLCAweEExLCAweEY5LCAweDUxLCAweDI5LCAweEU1LCAweEU1LCAweDQ2LCAweDcwLCAweEYxIH0sCisgICAgeyAweDM0LCAweEFBLCAweDk3LCAweDNDLCAweEQ0LCAweEM0LCAweERBLCAweEE0LCAweEY2LCAweDFFLAorICAgICAgMHhFQiwgMHgyQiwgMHhEQiwgMHhBRCwgMHgyNywgMHgzMSwgMHg2NSwgMHgzNCwgMHgwMSwgMHg2RiB9Cit9OworCisvKgorICogUkZDIDIyMDIgdGVzdCB2ZWN0b3JzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYTFfaG1hY190ZXN0X2tleVs3XVsyNl0gPQoreworICAgIHsgIlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEIiCisgICAgICAiXHgwQlx4MEJceDBCXHgwQiIgfSwKKyAgICB7ICJKZWZlIiB9LAorICAgIHsgIlx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUEiCisgICAgICAiXHhBQVx4QUFceEFBXHhBQSIgfSwKKyAgICB7ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBBXHgwQlx4MENceDBEXHgwRVx4MEZceDEwIgorICAgICAgIlx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOSIgfSwKKyAgICB7ICJceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDIgorICAgICAgIlx4MENceDBDXHgwQ1x4MEMiIH0sCisgICAgeyAiIiB9LCAvKiAweEFBIDgwIHRpbWVzICovCisgICAgeyAiIiB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IHNoYTFfaG1hY190ZXN0X2tleWxlbls3XSA9Cit7CisgICAgMjAsIDQsIDIwLCAyNSwgMjAsIDgwLCA4MAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hhMV9obWFjX3Rlc3RfYnVmWzddWzc0XSA9Cit7CisgICAgeyAiSGkgVGhlcmUiIH0sCisgICAgeyAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIgfSwKKyAgICB7ICJceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREIgorICAgICAgIlx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4REQiCisgICAgICAiXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERCIKKyAgICAgICJceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREIgorICAgICAgIlx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4REQiIH0sCisgICAgeyAiXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRCIKKyAgICAgICJceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEIgorICAgICAgIlx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0QiCisgICAgICAiXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRCIKKyAgICAgICJceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEIiB9LAorICAgIHsgIlRlc3QgV2l0aCBUcnVuY2F0aW9uIiB9LAorICAgIHsgIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgLSBIYXNoIEtleSBGaXJzdCIgfSwKKyAgICB7ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IGFuZCBMYXJnZXIiCisgICAgICAiIFRoYW4gT25lIEJsb2NrLVNpemUgRGF0YSIgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBzaGExX2htYWNfdGVzdF9idWZsZW5bN10gPQoreworICAgIDgsIDI4LCA1MCwgNTAsIDIwLCA1NCwgNzMKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNoYTFfaG1hY190ZXN0X3N1bVs3XVsyMF0gPQoreworICAgIHsgMHhCNiwgMHgxNywgMHgzMSwgMHg4NiwgMHg1NSwgMHgwNSwgMHg3MiwgMHg2NCwgMHhFMiwgMHg4QiwKKyAgICAgIDB4QzAsIDB4QjYsIDB4RkIsIDB4MzcsIDB4OEMsIDB4OEUsIDB4RjEsIDB4NDYsIDB4QkUsIDB4MDAgfSwKKyAgICB7IDB4RUYsIDB4RkMsIDB4REYsIDB4NkEsIDB4RTUsIDB4RUIsIDB4MkYsIDB4QTIsIDB4RDIsIDB4NzQsCisgICAgICAweDE2LCAweEQ1LCAweEYxLCAweDg0LCAweERGLCAweDlDLCAweDI1LCAweDlBLCAweDdDLCAweDc5IH0sCisgICAgeyAweDEyLCAweDVELCAweDczLCAweDQyLCAweEI5LCAweEFDLCAweDExLCAweENELCAweDkxLCAweEEzLAorICAgICAgMHg5QSwgMHhGNCwgMHg4QSwgMHhBMSwgMHg3QiwgMHg0RiwgMHg2MywgMHhGMSwgMHg3NSwgMHhEMyB9LAorICAgIHsgMHg0QywgMHg5MCwgMHgwNywgMHhGNCwgMHgwMiwgMHg2MiwgMHg1MCwgMHhDNiwgMHhCQywgMHg4NCwKKyAgICAgIDB4MTQsIDB4RjksIDB4QkYsIDB4NTAsIDB4QzgsIDB4NkMsIDB4MkQsIDB4NzIsIDB4MzUsIDB4REEgfSwKKyAgICB7IDB4NEMsIDB4MUEsIDB4MDMsIDB4NDIsIDB4NEIsIDB4NTUsIDB4RTAsIDB4N0YsIDB4RTcsIDB4RjIsCisgICAgICAweDdCLCAweEUxIH0sCisgICAgeyAweEFBLCAweDRBLCAweEU1LCAweEUxLCAweDUyLCAweDcyLCAweEQwLCAweDBFLCAweDk1LCAweDcwLAorICAgICAgMHg1NiwgMHgzNywgMHhDRSwgMHg4QSwgMHgzQiwgMHg1NSwgMHhFRCwgMHg0MCwgMHgyMSwgMHgxMiB9LAorICAgIHsgMHhFOCwgMHhFOSwgMHg5RCwgMHgwRiwgMHg0NSwgMHgyMywgMHg3RCwgMHg3OCwgMHg2RCwgMHg2QiwKKyAgICAgIDB4QkEsIDB4QTcsIDB4OTYsIDB4NUMsIDB4NzgsIDB4MDgsIDB4QkIsIDB4RkYsIDB4MUEsIDB4OTEgfQorfTsKKworLyoKKyAqIENoZWNrdXAgcm91dGluZQorICovCitpbnQgc2hhMV9zZWxmX3Rlc3QoIGludCB2ZXJib3NlICkKK3sKKyAgICBpbnQgaSwgaiwgYnVmbGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMjRdOworICAgIHVuc2lnbmVkIGNoYXIgc2hhMXN1bVsyMF07CisgICAgc2hhMV9jb250ZXh0IGN0eDsKKworICAgIC8qCisgICAgICogU0hBLTEKKyAgICAgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAiICBTSEEtMSB0ZXN0ICMlZDogIiwgaSArIDEgKTsKKworICAgICAgICBzaGExX3N0YXJ0cyggJmN0eCApOworCisgICAgICAgIGlmKCBpID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoIGJ1ZiwgJ2EnLCBidWZsZW4gPSAxMDAwICk7CisKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAxMDAwOyBqKysgKQorICAgICAgICAgICAgICAgIHNoYTFfdXBkYXRlKCAmY3R4LCBidWYsIGJ1ZmxlbiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNoYTFfdXBkYXRlKCAmY3R4LCBzaGExX3Rlc3RfYnVmW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYTFfdGVzdF9idWZsZW5baV0gKTsKKworICAgICAgICBzaGExX2ZpbmlzaCggJmN0eCwgc2hhMXN1bSApOworCisgICAgICAgIGlmKCBtZW1jbXAoIHNoYTFzdW0sIHNoYTFfdGVzdF9zdW1baV0sIDIwICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICByZXR1cm4oIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4iICk7CisgICAgfQorCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIlxuIiApOworCisgICAgZm9yKCBpID0gMDsgaSA8IDc7IGkrKyApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggIiAgSE1BQy1TSEEtMSB0ZXN0ICMlZDogIiwgaSArIDEgKTsKKworICAgICAgICBpZiggaSA9PSA1IHx8IGkgPT0gNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldCggYnVmLCAnXHhBQScsIGJ1ZmxlbiA9IDgwICk7CisgICAgICAgICAgICBzaGExX2htYWNfc3RhcnRzKCAmY3R4LCBidWYsIGJ1ZmxlbiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNoYTFfaG1hY19zdGFydHMoICZjdHgsIHNoYTFfaG1hY190ZXN0X2tleVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYTFfaG1hY190ZXN0X2tleWxlbltpXSApOworCisgICAgICAgIHNoYTFfaG1hY191cGRhdGUoICZjdHgsIHNoYTFfaG1hY190ZXN0X2J1ZltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhMV9obWFjX3Rlc3RfYnVmbGVuW2ldICk7CisKKyAgICAgICAgc2hhMV9obWFjX2ZpbmlzaCggJmN0eCwgc2hhMXN1bSApOworCisgICAgICAgIGJ1ZmxlbiA9ICggaSA9PSA0ICkgPyAxMiA6IDIwOworCisgICAgICAgIGlmKCBtZW1jbXAoIHNoYTFzdW0sIHNoYTFfaG1hY190ZXN0X3N1bVtpXSwgYnVmbGVuICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICByZXR1cm4oIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4iICk7CisgICAgfQorCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIlxuIiApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnJhcnkvc2hhMi5jIGIvbGlicmFyeS9zaGEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlNWI3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnJhcnkvc2hhMi5jCkBAIC0wLDAgKzEsNjg4IEBACisvKgorICogIEZJUFMtMTgwLTIgY29tcGxpYW50IFNIQS0yNTYgaW1wbGVtZW50YXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisvKgorICogIFRoZSBTSEEtMjU2IFNlY3VyZSBIYXNoIFN0YW5kYXJkIHdhcyBwdWJsaXNoZWQgYnkgTklTVCBpbiAyMDAyLgorICoKKyAqICBodHRwOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZmlwcy9maXBzMTgwLTIvZmlwczE4MC0yLnBkZgorICovCisKKyNpbmNsdWRlICJ4eXNzbC9jb25maWcuaCIKKworI2lmIGRlZmluZWQoWFlTU0xfU0hBMl9DKQorCisjaW5jbHVkZSAieHlzc2wvc2hhMi5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIDMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbiBtYWNyb3MgKGJpZyBlbmRpYW4pCisgKi8KKyNpZm5kZWYgR0VUX1VMT05HX0JFCisjZGVmaW5lIEdFVF9VTE9OR19CRShuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuKSA9ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgICAgXSA8PCAyNCApICAgICAgICBcCisgICAgICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDFdIDw8IDE2ICkgICAgICAgIFwKKyAgICAgICAgfCAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICsgMl0gPDwgIDggKSAgICAgICAgXAorICAgICAgICB8ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgKyAzXSAgICAgICApOyAgICAgICBcCit9CisjZW5kaWYKKworI2lmbmRlZiBQVVRfVUxPTkdfQkUKKyNkZWZpbmUgUFVUX1VMT05HX0JFKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGIpWyhpKSAgICBdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+IDI0ICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgMV0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gMTYgKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAgOCApOyAgICAgICBcCisgICAgKGIpWyhpKSArIDNdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pICAgICAgICk7ICAgICAgIFwKK30KKyNlbmRpZgorCisvKgorICogU0hBLTI1NiBjb250ZXh0IHNldHVwCisgKi8KK3ZvaWQgc2hhMl9zdGFydHMoIHNoYTJfY29udGV4dCAqY3R4LCBpbnQgaXMyMjQgKQoreworICAgIGN0eC0+dG90YWxbMF0gPSAwOworICAgIGN0eC0+dG90YWxbMV0gPSAwOworCisgICAgaWYoIGlzMjI0ID09IDAgKQorICAgIHsKKyAgICAgICAgLyogU0hBLTI1NiAqLworICAgICAgICBjdHgtPnN0YXRlWzBdID0gMHg2QTA5RTY2NzsKKyAgICAgICAgY3R4LT5zdGF0ZVsxXSA9IDB4QkI2N0FFODU7CisgICAgICAgIGN0eC0+c3RhdGVbMl0gPSAweDNDNkVGMzcyOworICAgICAgICBjdHgtPnN0YXRlWzNdID0gMHhBNTRGRjUzQTsKKyAgICAgICAgY3R4LT5zdGF0ZVs0XSA9IDB4NTEwRTUyN0Y7CisgICAgICAgIGN0eC0+c3RhdGVbNV0gPSAweDlCMDU2ODhDOworICAgICAgICBjdHgtPnN0YXRlWzZdID0gMHgxRjgzRDlBQjsKKyAgICAgICAgY3R4LT5zdGF0ZVs3XSA9IDB4NUJFMENEMTk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNIQS0yMjQgKi8KKyAgICAgICAgY3R4LT5zdGF0ZVswXSA9IDB4QzEwNTlFRDg7CisgICAgICAgIGN0eC0+c3RhdGVbMV0gPSAweDM2N0NENTA3OworICAgICAgICBjdHgtPnN0YXRlWzJdID0gMHgzMDcwREQxNzsKKyAgICAgICAgY3R4LT5zdGF0ZVszXSA9IDB4RjcwRTU5Mzk7CisgICAgICAgIGN0eC0+c3RhdGVbNF0gPSAweEZGQzAwQjMxOworICAgICAgICBjdHgtPnN0YXRlWzVdID0gMHg2ODU4MTUxMTsKKyAgICAgICAgY3R4LT5zdGF0ZVs2XSA9IDB4NjRGOThGQTc7CisgICAgICAgIGN0eC0+c3RhdGVbN10gPSAweEJFRkE0RkE0OworICAgIH0KKworICAgIGN0eC0+aXMyMjQgPSBpczIyNDsKK30KKworc3RhdGljIHZvaWQgc2hhMl9wcm9jZXNzKCBzaGEyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBkYXRhWzY0XSApCit7CisgICAgdW5zaWduZWQgbG9uZyB0ZW1wMSwgdGVtcDIsIFdbNjRdOworICAgIHVuc2lnbmVkIGxvbmcgQSwgQiwgQywgRCwgRSwgRiwgRywgSDsKKworICAgIEdFVF9VTE9OR19CRSggV1sgMF0sIGRhdGEsICAwICk7CisgICAgR0VUX1VMT05HX0JFKCBXWyAxXSwgZGF0YSwgIDQgKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbIDJdLCBkYXRhLCAgOCApOworICAgIEdFVF9VTE9OR19CRSggV1sgM10sIGRhdGEsIDEyICk7CisgICAgR0VUX1VMT05HX0JFKCBXWyA0XSwgZGF0YSwgMTYgKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbIDVdLCBkYXRhLCAyMCApOworICAgIEdFVF9VTE9OR19CRSggV1sgNl0sIGRhdGEsIDI0ICk7CisgICAgR0VUX1VMT05HX0JFKCBXWyA3XSwgZGF0YSwgMjggKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbIDhdLCBkYXRhLCAzMiApOworICAgIEdFVF9VTE9OR19CRSggV1sgOV0sIGRhdGEsIDM2ICk7CisgICAgR0VUX1VMT05HX0JFKCBXWzEwXSwgZGF0YSwgNDAgKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbMTFdLCBkYXRhLCA0NCApOworICAgIEdFVF9VTE9OR19CRSggV1sxMl0sIGRhdGEsIDQ4ICk7CisgICAgR0VUX1VMT05HX0JFKCBXWzEzXSwgZGF0YSwgNTIgKTsKKyAgICBHRVRfVUxPTkdfQkUoIFdbMTRdLCBkYXRhLCA1NiApOworICAgIEdFVF9VTE9OR19CRSggV1sxNV0sIGRhdGEsIDYwICk7CisKKyNkZWZpbmUgIFNIUih4LG4pICgoeCAmIDB4RkZGRkZGRkYpID4+IG4pCisjZGVmaW5lIFJPVFIoeCxuKSAoU0hSKHgsbikgfCAoeCA8PCAoMzIgLSBuKSkpCisKKyNkZWZpbmUgUzAoeCkgKFJPVFIoeCwgNykgXiBST1RSKHgsMTgpIF4gIFNIUih4LCAzKSkKKyNkZWZpbmUgUzEoeCkgKFJPVFIoeCwxNykgXiBST1RSKHgsMTkpIF4gIFNIUih4LDEwKSkKKworI2RlZmluZSBTMih4KSAoUk9UUih4LCAyKSBeIFJPVFIoeCwxMykgXiBST1RSKHgsMjIpKQorI2RlZmluZSBTMyh4KSAoUk9UUih4LCA2KSBeIFJPVFIoeCwxMSkgXiBST1RSKHgsMjUpKQorCisjZGVmaW5lIEYwKHgseSx6KSAoKHggJiB5KSB8ICh6ICYgKHggfCB5KSkpCisjZGVmaW5lIEYxKHgseSx6KSAoeiBeICh4ICYgKHkgXiB6KSkpCisKKyNkZWZpbmUgUih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBXW3RdID0gUzEoV1t0IC0gIDJdKSArIFdbdCAtICA3XSArICAgICAgICAgIFwKKyAgICAgICAgICAgUzAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XSAgICAgICAgICAgIFwKKykKKworI2RlZmluZSBQKGEsYixjLGQsZSxmLGcsaCx4LEspICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxID0gaCArIFMzKGUpICsgRjEoZSxmLGcpICsgSyArIHg7ICAgICAgXAorICAgIHRlbXAyID0gUzIoYSkgKyBGMChhLGIsYyk7ICAgICAgICAgICAgICAgICAgXAorICAgIGQgKz0gdGVtcDE7IGggPSB0ZW1wMSArIHRlbXAyOyAgICAgICAgICAgICAgXAorfQorCisgICAgQSA9IGN0eC0+c3RhdGVbMF07CisgICAgQiA9IGN0eC0+c3RhdGVbMV07CisgICAgQyA9IGN0eC0+c3RhdGVbMl07CisgICAgRCA9IGN0eC0+c3RhdGVbM107CisgICAgRSA9IGN0eC0+c3RhdGVbNF07CisgICAgRiA9IGN0eC0+c3RhdGVbNV07CisgICAgRyA9IGN0eC0+c3RhdGVbNl07CisgICAgSCA9IGN0eC0+c3RhdGVbN107CisKKyAgICBQKCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBXWyAwXSwgMHg0MjhBMkY5OCApOworICAgIFAoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFdbIDFdLCAweDcxMzc0NDkxICk7CisgICAgUCggRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgV1sgMl0sIDB4QjVDMEZCQ0YgKTsKKyAgICBQKCBGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBXWyAzXSwgMHhFOUI1REJBNSApOworICAgIFAoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFdbIDRdLCAweDM5NTZDMjVCICk7CisgICAgUCggRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgV1sgNV0sIDB4NTlGMTExRjEgKTsKKyAgICBQKCBDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBXWyA2XSwgMHg5MjNGODJBNCApOworICAgIFAoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFdbIDddLCAweEFCMUM1RUQ1ICk7CisgICAgUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgV1sgOF0sIDB4RDgwN0FBOTggKTsKKyAgICBQKCBILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBXWyA5XSwgMHgxMjgzNUIwMSApOworICAgIFAoIEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFdbMTBdLCAweDI0MzE4NUJFICk7CisgICAgUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgV1sxMV0sIDB4NTUwQzdEQzMgKTsKKyAgICBQKCBFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBXWzEyXSwgMHg3MkJFNUQ3NCApOworICAgIFAoIEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFdbMTNdLCAweDgwREVCMUZFICk7CisgICAgUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgV1sxNF0sIDB4OUJEQzA2QTcgKTsKKyAgICBQKCBCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBXWzE1XSwgMHhDMTlCRjE3NCApOworICAgIFAoIEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoMTYpLCAweEU0OUI2OUMxICk7CisgICAgUCggSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUigxNyksIDB4RUZCRTQ3ODYgKTsKKyAgICBQKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDE4KSwgMHgwRkMxOURDNiApOworICAgIFAoIEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoMTkpLCAweDI0MENBMUNDICk7CisgICAgUCggRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUigyMCksIDB4MkRFOTJDNkYgKTsKKyAgICBQKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDIxKSwgMHg0QTc0ODRBQSApOworICAgIFAoIEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoMjIpLCAweDVDQjBBOURDICk7CisgICAgUCggQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUigyMyksIDB4NzZGOTg4REEgKTsKKyAgICBQKCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDI0KSwgMHg5ODNFNTE1MiApOworICAgIFAoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoMjUpLCAweEE4MzFDNjZEICk7CisgICAgUCggRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUigyNiksIDB4QjAwMzI3QzggKTsKKyAgICBQKCBGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDI3KSwgMHhCRjU5N0ZDNyApOworICAgIFAoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoMjgpLCAweEM2RTAwQkYzICk7CisgICAgUCggRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUigyOSksIDB4RDVBNzkxNDcgKTsKKyAgICBQKCBDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDMwKSwgMHgwNkNBNjM1MSApOworICAgIFAoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoMzEpLCAweDE0MjkyOTY3ICk7CisgICAgUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUigzMiksIDB4MjdCNzBBODUgKTsKKyAgICBQKCBILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDMzKSwgMHgyRTFCMjEzOCApOworICAgIFAoIEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoMzQpLCAweDREMkM2REZDICk7CisgICAgUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUigzNSksIDB4NTMzODBEMTMgKTsKKyAgICBQKCBFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDM2KSwgMHg2NTBBNzM1NCApOworICAgIFAoIEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoMzcpLCAweDc2NkEwQUJCICk7CisgICAgUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUigzOCksIDB4ODFDMkM5MkUgKTsKKyAgICBQKCBCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDM5KSwgMHg5MjcyMkM4NSApOworICAgIFAoIEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoNDApLCAweEEyQkZFOEExICk7CisgICAgUCggSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUig0MSksIDB4QTgxQTY2NEIgKTsKKyAgICBQKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDQyKSwgMHhDMjRCOEI3MCApOworICAgIFAoIEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoNDMpLCAweEM3NkM1MUEzICk7CisgICAgUCggRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUig0NCksIDB4RDE5MkU4MTkgKTsKKyAgICBQKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDQ1KSwgMHhENjk5MDYyNCApOworICAgIFAoIEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoNDYpLCAweEY0MEUzNTg1ICk7CisgICAgUCggQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUig0NyksIDB4MTA2QUEwNzAgKTsKKyAgICBQKCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDQ4KSwgMHgxOUE0QzExNiApOworICAgIFAoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoNDkpLCAweDFFMzc2QzA4ICk7CisgICAgUCggRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUig1MCksIDB4Mjc0ODc3NEMgKTsKKyAgICBQKCBGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDUxKSwgMHgzNEIwQkNCNSApOworICAgIFAoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoNTIpLCAweDM5MUMwQ0IzICk7CisgICAgUCggRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUig1MyksIDB4NEVEOEFBNEEgKTsKKyAgICBQKCBDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDU0KSwgMHg1QjlDQ0E0RiApOworICAgIFAoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoNTUpLCAweDY4MkU2RkYzICk7CisgICAgUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUig1NiksIDB4NzQ4RjgyRUUgKTsKKyAgICBQKCBILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDU3KSwgMHg3OEE1NjM2RiApOworICAgIFAoIEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoNTgpLCAweDg0Qzg3ODE0ICk7CisgICAgUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUig1OSksIDB4OENDNzAyMDggKTsKKyAgICBQKCBFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDYwKSwgMHg5MEJFRkZGQSApOworICAgIFAoIEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoNjEpLCAweEE0NTA2Q0VCICk7CisgICAgUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUig2MiksIDB4QkVGOUEzRjcgKTsKKyAgICBQKCBCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDYzKSwgMHhDNjcxNzhGMiApOworCisgICAgY3R4LT5zdGF0ZVswXSArPSBBOworICAgIGN0eC0+c3RhdGVbMV0gKz0gQjsKKyAgICBjdHgtPnN0YXRlWzJdICs9IEM7CisgICAgY3R4LT5zdGF0ZVszXSArPSBEOworICAgIGN0eC0+c3RhdGVbNF0gKz0gRTsKKyAgICBjdHgtPnN0YXRlWzVdICs9IEY7CisgICAgY3R4LT5zdGF0ZVs2XSArPSBHOworICAgIGN0eC0+c3RhdGVbN10gKz0gSDsKK30KKworLyoKKyAqIFNIQS0yNTYgcHJvY2VzcyBidWZmZXIKKyAqLwordm9pZCBzaGEyX3VwZGF0ZSggc2hhMl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApCit7CisgICAgaW50IGZpbGw7CisgICAgdW5zaWduZWQgbG9uZyBsZWZ0OworCisgICAgaWYoIGlsZW4gPD0gMCApCisgICAgICAgIHJldHVybjsKKworICAgIGxlZnQgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKKyAgICBmaWxsID0gNjQgLSBsZWZ0OworCisgICAgY3R4LT50b3RhbFswXSArPSBpbGVuOworICAgIGN0eC0+dG90YWxbMF0gJj0gMHhGRkZGRkZGRjsKKworICAgIGlmKCBjdHgtPnRvdGFsWzBdIDwgKHVuc2lnbmVkIGxvbmcpIGlsZW4gKQorICAgICAgICBjdHgtPnRvdGFsWzFdKys7CisKKyAgICBpZiggbGVmdCAmJiBpbGVuID49IGZpbGwgKQorICAgIHsKKyAgICAgICAgbWVtY3B5KCAodm9pZCAqKSAoY3R4LT5idWZmZXIgKyBsZWZ0KSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSBpbnB1dCwgZmlsbCApOworICAgICAgICBzaGEyX3Byb2Nlc3MoIGN0eCwgY3R4LT5idWZmZXIgKTsKKyAgICAgICAgaW5wdXQgKz0gZmlsbDsKKyAgICAgICAgaWxlbiAgLT0gZmlsbDsKKyAgICAgICAgbGVmdCA9IDA7CisgICAgfQorCisgICAgd2hpbGUoIGlsZW4gPj0gNjQgKQorICAgIHsKKyAgICAgICAgc2hhMl9wcm9jZXNzKCBjdHgsIGlucHV0ICk7CisgICAgICAgIGlucHV0ICs9IDY0OworICAgICAgICBpbGVuICAtPSA2NDsKKyAgICB9CisKKyAgICBpZiggaWxlbiA+IDAgKQorICAgIHsKKyAgICAgICAgbWVtY3B5KCAodm9pZCAqKSAoY3R4LT5idWZmZXIgKyBsZWZ0KSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSBpbnB1dCwgaWxlbiApOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2hhMl9wYWRkaW5nWzY0XSA9Cit7CisgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworLyoKKyAqIFNIQS0yNTYgZmluYWwgZGlnZXN0CisgKi8KK3ZvaWQgc2hhMl9maW5pc2goIHNoYTJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIG91dHB1dFszMl0gKQoreworICAgIHVuc2lnbmVkIGxvbmcgbGFzdCwgcGFkbjsKKyAgICB1bnNpZ25lZCBsb25nIGhpZ2gsIGxvdzsKKyAgICB1bnNpZ25lZCBjaGFyIG1zZ2xlbls4XTsKKworICAgIGhpZ2ggPSAoIGN0eC0+dG90YWxbMF0gPj4gMjkgKQorICAgICAgICAgfCAoIGN0eC0+dG90YWxbMV0gPDwgIDMgKTsKKyAgICBsb3cgID0gKCBjdHgtPnRvdGFsWzBdIDw8ICAzICk7CisKKyAgICBQVVRfVUxPTkdfQkUoIGhpZ2gsIG1zZ2xlbiwgMCApOworICAgIFBVVF9VTE9OR19CRSggbG93LCAgbXNnbGVuLCA0ICk7CisKKyAgICBsYXN0ID0gY3R4LT50b3RhbFswXSAmIDB4M0Y7CisgICAgcGFkbiA9ICggbGFzdCA8IDU2ICkgPyAoIDU2IC0gbGFzdCApIDogKCAxMjAgLSBsYXN0ICk7CisKKyAgICBzaGEyX3VwZGF0ZSggY3R4LCAodW5zaWduZWQgY2hhciAqKSBzaGEyX3BhZGRpbmcsIHBhZG4gKTsKKyAgICBzaGEyX3VwZGF0ZSggY3R4LCBtc2dsZW4sIDggKTsKKworICAgIFBVVF9VTE9OR19CRSggY3R4LT5zdGF0ZVswXSwgb3V0cHV0LCAgMCApOworICAgIFBVVF9VTE9OR19CRSggY3R4LT5zdGF0ZVsxXSwgb3V0cHV0LCAgNCApOworICAgIFBVVF9VTE9OR19CRSggY3R4LT5zdGF0ZVsyXSwgb3V0cHV0LCAgOCApOworICAgIFBVVF9VTE9OR19CRSggY3R4LT5zdGF0ZVszXSwgb3V0cHV0LCAxMiApOworICAgIFBVVF9VTE9OR19CRSggY3R4LT5zdGF0ZVs0XSwgb3V0cHV0LCAxNiApOworICAgIFBVVF9VTE9OR19CRSggY3R4LT5zdGF0ZVs1XSwgb3V0cHV0LCAyMCApOworICAgIFBVVF9VTE9OR19CRSggY3R4LT5zdGF0ZVs2XSwgb3V0cHV0LCAyNCApOworCisgICAgaWYoIGN0eC0+aXMyMjQgPT0gMCApCisgICAgICAgIFBVVF9VTE9OR19CRSggY3R4LT5zdGF0ZVs3XSwgb3V0cHV0LCAyOCApOworfQorCisvKgorICogb3V0cHV0ID0gU0hBLTI1NiggaW5wdXQgYnVmZmVyICkKKyAqLwordm9pZCBzaGEyKCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzMyXSwgaW50IGlzMjI0ICkKK3sKKyAgICBzaGEyX2NvbnRleHQgY3R4OworCisgICAgc2hhMl9zdGFydHMoICZjdHgsIGlzMjI0ICk7CisgICAgc2hhMl91cGRhdGUoICZjdHgsIGlucHV0LCBpbGVuICk7CisgICAgc2hhMl9maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIHNoYTJfY29udGV4dCApICk7Cit9CisKKy8qCisgKiBvdXRwdXQgPSBTSEEtMjU2KCBmaWxlIGNvbnRlbnRzICkKKyAqLworaW50IHNoYTJfZmlsZSggY2hhciAqcGF0aCwgdW5zaWduZWQgY2hhciBvdXRwdXRbMzJdLCBpbnQgaXMyMjQgKQoreworICAgIEZJTEUgKmY7CisgICAgc2l6ZV90IG47CisgICAgc2hhMl9jb250ZXh0IGN0eDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMDI0XTsKKworICAgIGlmKCAoIGYgPSBmb3BlbiggcGF0aCwgInJiIiApICkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiggMSApOworCisgICAgc2hhMl9zdGFydHMoICZjdHgsIGlzMjI0ICk7CisKKyAgICB3aGlsZSggKCBuID0gZnJlYWQoIGJ1ZiwgMSwgc2l6ZW9mKCBidWYgKSwgZiApICkgPiAwICkKKyAgICAgICAgc2hhMl91cGRhdGUoICZjdHgsIGJ1ZiwgKGludCkgbiApOworCisgICAgc2hhMl9maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIHNoYTJfY29udGV4dCApICk7CisKKyAgICBpZiggZmVycm9yKCBmICkgIT0gMCApCisgICAgeworICAgICAgICBmY2xvc2UoIGYgKTsKKyAgICAgICAgcmV0dXJuKCAyICk7CisgICAgfQorCisgICAgZmNsb3NlKCBmICk7CisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBTSEEtMjU2IEhNQUMgY29udGV4dCBzZXR1cAorICovCit2b2lkIHNoYTJfaG1hY19zdGFydHMoIHNoYTJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpczIyNCApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBzdW1bMzJdOworCisgICAgaWYoIGtleWxlbiA+IDY0ICkKKyAgICB7CisgICAgICAgIHNoYTIoIGtleSwga2V5bGVuLCBzdW0sIGlzMjI0ICk7CisgICAgICAgIGtleWxlbiA9ICggaXMyMjQgKSA/IDI4IDogMzI7CisgICAgICAgIGtleSA9IHN1bTsKKyAgICB9CisKKyAgICBtZW1zZXQoIGN0eC0+aXBhZCwgMHgzNiwgNjQgKTsKKyAgICBtZW1zZXQoIGN0eC0+b3BhZCwgMHg1QywgNjQgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBrZXlsZW47IGkrKyApCisgICAgeworICAgICAgICBjdHgtPmlwYWRbaV0gPSAodW5zaWduZWQgY2hhcikoIGN0eC0+aXBhZFtpXSBeIGtleVtpXSApOworICAgICAgICBjdHgtPm9wYWRbaV0gPSAodW5zaWduZWQgY2hhcikoIGN0eC0+b3BhZFtpXSBeIGtleVtpXSApOworICAgIH0KKworICAgIHNoYTJfc3RhcnRzKCBjdHgsIGlzMjI0ICk7CisgICAgc2hhMl91cGRhdGUoIGN0eCwgY3R4LT5pcGFkLCA2NCApOworCisgICAgbWVtc2V0KCBzdW0sIDAsIHNpemVvZiggc3VtICkgKTsKK30KKworLyoKKyAqIFNIQS0yNTYgSE1BQyBwcm9jZXNzIGJ1ZmZlcgorICovCit2b2lkIHNoYTJfaG1hY191cGRhdGUoIHNoYTJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4gKQoreworICAgIHNoYTJfdXBkYXRlKCBjdHgsIGlucHV0LCBpbGVuICk7Cit9CisKKy8qCisgKiBTSEEtMjU2IEhNQUMgZmluYWwgZGlnZXN0CisgKi8KK3ZvaWQgc2hhMl9obWFjX2ZpbmlzaCggc2hhMl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzMyXSApCit7CisgICAgaW50IGlzMjI0LCBobGVuOworICAgIHVuc2lnbmVkIGNoYXIgdG1wYnVmWzMyXTsKKworICAgIGlzMjI0ID0gY3R4LT5pczIyNDsKKyAgICBobGVuID0gKCBpczIyNCA9PSAwICkgPyAzMiA6IDI4OworCisgICAgc2hhMl9maW5pc2goIGN0eCwgdG1wYnVmICk7CisgICAgc2hhMl9zdGFydHMoIGN0eCwgaXMyMjQgKTsKKyAgICBzaGEyX3VwZGF0ZSggY3R4LCBjdHgtPm9wYWQsIDY0ICk7CisgICAgc2hhMl91cGRhdGUoIGN0eCwgdG1wYnVmLCBobGVuICk7CisgICAgc2hhMl9maW5pc2goIGN0eCwgb3V0cHV0ICk7CisKKyAgICBtZW1zZXQoIHRtcGJ1ZiwgMCwgc2l6ZW9mKCB0bXBidWYgKSApOworfQorCisvKgorICogb3V0cHV0ID0gSE1BQy1TSEEtMjU2KCBobWFjIGtleSwgaW5wdXQgYnVmZmVyICkKKyAqLwordm9pZCBzaGEyX2htYWMoIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRwdXRbMzJdLCBpbnQgaXMyMjQgKQoreworICAgIHNoYTJfY29udGV4dCBjdHg7CisKKyAgICBzaGEyX2htYWNfc3RhcnRzKCAmY3R4LCBrZXksIGtleWxlbiwgaXMyMjQgKTsKKyAgICBzaGEyX2htYWNfdXBkYXRlKCAmY3R4LCBpbnB1dCwgaWxlbiApOworICAgIHNoYTJfaG1hY19maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIHNoYTJfY29udGV4dCApICk7Cit9CisKKyNpZiBkZWZpbmVkKFhZU1NMX1NFTEZfVEVTVCkKKy8qCisgKiBGSVBTLTE4MC0yIHRlc3QgdmVjdG9ycworICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzaGEyX3Rlc3RfYnVmWzNdWzU3XSA9IAoreworICAgIHsgImFiYyIgfSwKKyAgICB7ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIgfSwKKyAgICB7ICIiIH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgc2hhMl90ZXN0X2J1ZmxlblszXSA9Cit7CisgICAgMywgNTYsIDEwMDAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNoYTJfdGVzdF9zdW1bNl1bMzJdID0KK3sKKyAgICAvKgorICAgICAqIFNIQS0yMjQgdGVzdCB2ZWN0b3JzCisgICAgICovCisgICAgeyAweDIzLCAweDA5LCAweDdELCAweDIyLCAweDM0LCAweDA1LCAweEQ4LCAweDIyLAorICAgICAgMHg4NiwgMHg0MiwgMHhBNCwgMHg3NywgMHhCRCwgMHhBMiwgMHg1NSwgMHhCMywKKyAgICAgIDB4MkEsIDB4QUQsIDB4QkMsIDB4RTQsIDB4QkQsIDB4QTAsIDB4QjMsIDB4RjcsCisgICAgICAweEUzLCAweDZDLCAweDlELCAweEE3IH0sCisgICAgeyAweDc1LCAweDM4LCAweDhCLCAweDE2LCAweDUxLCAweDI3LCAweDc2LCAweENDLAorICAgICAgMHg1RCwgMHhCQSwgMHg1RCwgMHhBMSwgMHhGRCwgMHg4OSwgMHgwMSwgMHg1MCwKKyAgICAgIDB4QjAsIDB4QzYsIDB4NDUsIDB4NUMsIDB4QjQsIDB4RjUsIDB4OEIsIDB4MTksCisgICAgICAweDUyLCAweDUyLCAweDI1LCAweDI1IH0sCisgICAgeyAweDIwLCAweDc5LCAweDQ2LCAweDU1LCAweDk4LCAweDBDLCAweDkxLCAweEQ4LAorICAgICAgMHhCQiwgMHhCNCwgMHhDMSwgMHhFQSwgMHg5NywgMHg2MSwgMHg4QSwgMHg0QiwKKyAgICAgIDB4RjAsIDB4M0YsIDB4NDIsIDB4NTgsIDB4MTksIDB4NDgsIDB4QjIsIDB4RUUsCisgICAgICAweDRFLCAweEU3LCAweEFELCAweDY3IH0sCisKKyAgICAvKgorICAgICAqIFNIQS0yNTYgdGVzdCB2ZWN0b3JzCisgICAgICovCisgICAgeyAweEJBLCAweDc4LCAweDE2LCAweEJGLCAweDhGLCAweDAxLCAweENGLCAweEVBLAorICAgICAgMHg0MSwgMHg0MSwgMHg0MCwgMHhERSwgMHg1RCwgMHhBRSwgMHgyMiwgMHgyMywKKyAgICAgIDB4QjAsIDB4MDMsIDB4NjEsIDB4QTMsIDB4OTYsIDB4MTcsIDB4N0EsIDB4OUMsCisgICAgICAweEI0LCAweDEwLCAweEZGLCAweDYxLCAweEYyLCAweDAwLCAweDE1LCAweEFEIH0sCisgICAgeyAweDI0LCAweDhELCAweDZBLCAweDYxLCAweEQyLCAweDA2LCAweDM4LCAweEI4LAorICAgICAgMHhFNSwgMHhDMCwgMHgyNiwgMHg5MywgMHgwQywgMHgzRSwgMHg2MCwgMHgzOSwKKyAgICAgIDB4QTMsIDB4M0MsIDB4RTQsIDB4NTksIDB4NjQsIDB4RkYsIDB4MjEsIDB4NjcsCisgICAgICAweEY2LCAweEVDLCAweEVELCAweEQ0LCAweDE5LCAweERCLCAweDA2LCAweEMxIH0sCisgICAgeyAweENELCAweEM3LCAweDZFLCAweDVDLCAweDk5LCAweDE0LCAweEZCLCAweDkyLAorICAgICAgMHg4MSwgMHhBMSwgMHhDNywgMHhFMiwgMHg4NCwgMHhENywgMHgzRSwgMHg2NywKKyAgICAgIDB4RjEsIDB4ODAsIDB4OUEsIDB4NDgsIDB4QTQsIDB4OTcsIDB4MjAsIDB4MEUsCisgICAgICAweDA0LCAweDZELCAweDM5LCAweENDLCAweEM3LCAweDExLCAweDJDLCAweEQwIH0KK307CisKKy8qCisgKiBSRkMgNDIzMSB0ZXN0IHZlY3RvcnMKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hhMl9obWFjX3Rlc3Rfa2V5WzddWzI2XSA9Cit7CisgICAgeyAiXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQiIKKyAgICAgICJceDBCXHgwQlx4MEJceDBCIiB9LAorICAgIHsgIkplZmUiIH0sCisgICAgeyAiXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQSIKKyAgICAgICJceEFBXHhBQVx4QUFceEFBIiB9LAorICAgIHsgIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwOVx4MEFceDBCXHgwQ1x4MERceDBFXHgwRlx4MTAiCisgICAgICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiB9LAorICAgIHsgIlx4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MEMiCisgICAgICAiXHgwQ1x4MENceDBDXHgwQyIgfSwKKyAgICB7ICIiIH0sIC8qIDB4QUEgMTMxIHRpbWVzICovCisgICAgeyAiIiB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IHNoYTJfaG1hY190ZXN0X2tleWxlbls3XSA9Cit7CisgICAgMjAsIDQsIDIwLCAyNSwgMjAsIDEzMSwgMTMxCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzaGEyX2htYWNfdGVzdF9idWZbN11bMTUzXSA9Cit7CisgICAgeyAiSGkgVGhlcmUiIH0sCisgICAgeyAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIgfSwKKyAgICB7ICJceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREIgorICAgICAgIlx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4REQiCisgICAgICAiXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERCIKKyAgICAgICJceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREIgorICAgICAgIlx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4REQiIH0sCisgICAgeyAiXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRCIKKyAgICAgICJceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEIgorICAgICAgIlx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0QiCisgICAgICAiXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRCIKKyAgICAgICJceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEIiB9LAorICAgIHsgIlRlc3QgV2l0aCBUcnVuY2F0aW9uIiB9LAorICAgIHsgIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgLSBIYXNoIEtleSBGaXJzdCIgfSwKKyAgICB7ICJUaGlzIGlzIGEgdGVzdCB1c2luZyBhIGxhcmdlciB0aGFuIGJsb2NrLXNpemUga2V5ICIKKyAgICAgICJhbmQgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGRhdGEuIFRoZSBrZXkgbmVlZHMgdG8gIgorICAgICAgImJlIGhhc2hlZCBiZWZvcmUgYmVpbmcgdXNlZCBieSB0aGUgSE1BQyBhbGdvcml0aG0uIiB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IHNoYTJfaG1hY190ZXN0X2J1Zmxlbls3XSA9Cit7CisgICAgOCwgMjgsIDUwLCA1MCwgMjAsIDU0LCAxNTIKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNoYTJfaG1hY190ZXN0X3N1bVsxNF1bMzJdID0KK3sKKyAgICAvKgorICAgICAqIEhNQUMtU0hBLTIyNCB0ZXN0IHZlY3RvcnMKKyAgICAgKi8KKyAgICB7IDB4ODksIDB4NkYsIDB4QjEsIDB4MTIsIDB4OEEsIDB4QkIsIDB4REYsIDB4MTksCisgICAgICAweDY4LCAweDMyLCAweDEwLCAweDdDLCAweEQ0LCAweDlELCAweEYzLCAweDNGLAorICAgICAgMHg0NywgMHhCNCwgMHhCMSwgMHgxNiwgMHg5OSwgMHgxMiwgMHhCQSwgMHg0RiwKKyAgICAgIDB4NTMsIDB4NjgsIDB4NEIsIDB4MjIgfSwKKyAgICB7IDB4QTMsIDB4MEUsIDB4MDEsIDB4MDksIDB4OEIsIDB4QzYsIDB4REIsIDB4QkYsCisgICAgICAweDQ1LCAweDY5LCAweDBGLCAweDNBLCAweDdFLCAweDlFLCAweDZELCAweDBGLAorICAgICAgMHg4QiwgMHhCRSwgMHhBMiwgMHhBMywgMHg5RSwgMHg2MSwgMHg0OCwgMHgwMCwKKyAgICAgIDB4OEYsIDB4RDAsIDB4NUUsIDB4NDQgfSwKKyAgICB7IDB4N0YsIDB4QjMsIDB4Q0IsIDB4MzUsIDB4ODgsIDB4QzYsIDB4QzEsIDB4RjYsCisgICAgICAweEZGLCAweEE5LCAweDY5LCAweDRELCAweDdELCAweDZBLCAweEQyLCAweDY0LAorICAgICAgMHg5MywgMHg2NSwgMHhCMCwgMHhDMSwgMHhGNiwgMHg1RCwgMHg2OSwgMHhEMSwKKyAgICAgIDB4RUMsIDB4ODMsIDB4MzMsIDB4RUEgfSwKKyAgICB7IDB4NkMsIDB4MTEsIDB4NTAsIDB4NjgsIDB4NzQsIDB4MDEsIDB4M0MsIDB4QUMsCisgICAgICAweDZBLCAweDJBLCAweEJDLCAweDFCLCAweEIzLCAweDgyLCAweDYyLCAweDdDLAorICAgICAgMHhFQywgMHg2QSwgMHg5MCwgMHhEOCwgMHg2RSwgMHhGQywgMHgwMSwgMHgyRCwKKyAgICAgIDB4RTcsIDB4QUYsIDB4RUMsIDB4NUEgfSwKKyAgICB7IDB4MEUsIDB4MkEsIDB4RUEsIDB4NjgsIDB4QTksIDB4MEMsIDB4OEQsIDB4MzcsCisgICAgICAweEM5LCAweDg4LCAweEJDLCAweERCLCAweDlGLCAweENBLCAweDZGLCAweEE4IH0sCisgICAgeyAweDk1LCAweEU5LCAweEEwLCAweERCLCAweDk2LCAweDIwLCAweDk1LCAweEFELAorICAgICAgMHhBRSwgMHhCRSwgMHg5QiwgMHgyRCwgMHg2RiwgMHgwRCwgMHhCQywgMHhFMiwKKyAgICAgIDB4RDQsIDB4OTksIDB4RjEsIDB4MTIsIDB4RjIsIDB4RDIsIDB4QjcsIDB4MjcsCisgICAgICAweDNGLCAweEE2LCAweDg3LCAweDBFIH0sCisgICAgeyAweDNBLCAweDg1LCAweDQxLCAweDY2LCAweEFDLCAweDVELCAweDlGLCAweDAyLAorICAgICAgMHgzRiwgMHg1NCwgMHhENSwgMHgxNywgMHhEMCwgMHhCMywgMHg5RCwgMHhCRCwKKyAgICAgIDB4OTQsIDB4NjcsIDB4NzAsIDB4REIsIDB4OUMsIDB4MkIsIDB4OTUsIDB4QzksCisgICAgICAweEY2LCAweEY1LCAweDY1LCAweEQxIH0sCisKKyAgICAvKgorICAgICAqIEhNQUMtU0hBLTI1NiB0ZXN0IHZlY3RvcnMKKyAgICAgKi8KKyAgICB7IDB4QjAsIDB4MzQsIDB4NEMsIDB4NjEsIDB4RDgsIDB4REIsIDB4MzgsIDB4NTMsCisgICAgICAweDVDLCAweEE4LCAweEFGLCAweENFLCAweEFGLCAweDBCLCAweEYxLCAweDJCLAorICAgICAgMHg4OCwgMHgxRCwgMHhDMiwgMHgwMCwgMHhDOSwgMHg4MywgMHgzRCwgMHhBNywKKyAgICAgIDB4MjYsIDB4RTksIDB4MzcsIDB4NkMsIDB4MkUsIDB4MzIsIDB4Q0YsIDB4RjcgfSwKKyAgICB7IDB4NUIsIDB4REMsIDB4QzEsIDB4NDYsIDB4QkYsIDB4NjAsIDB4NzUsIDB4NEUsCisgICAgICAweDZBLCAweDA0LCAweDI0LCAweDI2LCAweDA4LCAweDk1LCAweDc1LCAweEM3LAorICAgICAgMHg1QSwgMHgwMCwgMHgzRiwgMHgwOCwgMHg5RCwgMHgyNywgMHgzOSwgMHg4MywKKyAgICAgIDB4OUQsIDB4RUMsIDB4NTgsIDB4QjksIDB4NjQsIDB4RUMsIDB4MzgsIDB4NDMgfSwKKyAgICB7IDB4NzcsIDB4M0UsIDB4QTksIDB4MUUsIDB4MzYsIDB4ODAsIDB4MEUsIDB4NDYsCisgICAgICAweDg1LCAweDRELCAweEI4LCAweEVCLCAweEQwLCAweDkxLCAweDgxLCAweEE3LAorICAgICAgMHgyOSwgMHg1OSwgMHgwOSwgMHg4QiwgMHgzRSwgMHhGOCwgMHhDMSwgMHgyMiwKKyAgICAgIDB4RDksIDB4NjMsIDB4NTUsIDB4MTQsIDB4Q0UsIDB4RDUsIDB4NjUsIDB4RkUgfSwKKyAgICB7IDB4ODIsIDB4NTUsIDB4OEEsIDB4MzgsIDB4OUEsIDB4NDQsIDB4M0MsIDB4MEUsCisgICAgICAweEE0LCAweENDLCAweDgxLCAweDk4LCAweDk5LCAweEYyLCAweDA4LCAweDNBLAorICAgICAgMHg4NSwgMHhGMCwgMHhGQSwgMHhBMywgMHhFNSwgMHg3OCwgMHhGOCwgMHgwNywKKyAgICAgIDB4N0EsIDB4MkUsIDB4M0YsIDB4RjQsIDB4NjcsIDB4MjksIDB4NjYsIDB4NUIgfSwKKyAgICB7IDB4QTMsIDB4QjYsIDB4MTYsIDB4NzQsIDB4NzMsIDB4MTAsIDB4MEUsIDB4RTAsCisgICAgICAweDZFLCAweDBDLCAweDc5LCAweDZDLCAweDI5LCAweDU1LCAweDU1LCAweDJCIH0sCisgICAgeyAweDYwLCAweEU0LCAweDMxLCAweDU5LCAweDFFLCAweEUwLCAweEI2LCAweDdGLAorICAgICAgMHgwRCwgMHg4QSwgMHgyNiwgMHhBQSwgMHhDQiwgMHhGNSwgMHhCNywgMHg3RiwKKyAgICAgIDB4OEUsIDB4MEIsIDB4QzYsIDB4MjEsIDB4MzcsIDB4MjgsIDB4QzUsIDB4MTQsCisgICAgICAweDA1LCAweDQ2LCAweDA0LCAweDBGLCAweDBFLCAweEUzLCAweDdGLCAweDU0IH0sCisgICAgeyAweDlCLCAweDA5LCAweEZGLCAweEE3LCAweDFCLCAweDk0LCAweDJGLCAweENCLAorICAgICAgMHgyNywgMHg2MywgMHg1RiwgMHhCQywgMHhENSwgMHhCMCwgMHhFOSwgMHg0NCwKKyAgICAgIDB4QkYsIDB4REMsIDB4NjMsIDB4NjQsIDB4NEYsIDB4MDcsIDB4MTMsIDB4OTMsCisgICAgICAweDhBLCAweDdGLCAweDUxLCAweDUzLCAweDVDLCAweDNBLCAweDM1LCAweEUyIH0KK307CisKKy8qCisgKiBDaGVja3VwIHJvdXRpbmUKKyAqLworaW50IHNoYTJfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApCit7CisgICAgaW50IGksIGosIGssIGJ1ZmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMDI0XTsKKyAgICB1bnNpZ25lZCBjaGFyIHNoYTJzdW1bMzJdOworICAgIHNoYTJfY29udGV4dCBjdHg7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNjsgaSsrICkKKyAgICB7CisgICAgICAgIGogPSBpICUgMzsKKyAgICAgICAgayA9IGkgPCAzOworCisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAiICBTSEEtJWQgdGVzdCAjJWQ6ICIsIDI1NiAtIGsgKiAzMiwgaiArIDEgKTsKKworICAgICAgICBzaGEyX3N0YXJ0cyggJmN0eCwgayApOworCisgICAgICAgIGlmKCBqID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoIGJ1ZiwgJ2EnLCBidWZsZW4gPSAxMDAwICk7CisKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAxMDAwOyBqKysgKQorICAgICAgICAgICAgICAgIHNoYTJfdXBkYXRlKCAmY3R4LCBidWYsIGJ1ZmxlbiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNoYTJfdXBkYXRlKCAmY3R4LCBzaGEyX3Rlc3RfYnVmW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYTJfdGVzdF9idWZsZW5bal0gKTsKKworICAgICAgICBzaGEyX2ZpbmlzaCggJmN0eCwgc2hhMnN1bSApOworCisgICAgICAgIGlmKCBtZW1jbXAoIHNoYTJzdW0sIHNoYTJfdGVzdF9zdW1baV0sIDMyIC0gayAqIDQgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiZmFpbGVkXG4iICk7CisKKyAgICAgICAgICAgIHJldHVybiggMSApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICJwYXNzZWRcbiIgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAiXG4iICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMTQ7IGkrKyApCisgICAgeworICAgICAgICBqID0gaSAlIDc7CisgICAgICAgIGsgPSBpIDwgNzsKKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggIiAgSE1BQy1TSEEtJWQgdGVzdCAjJWQ6ICIsIDI1NiAtIGsgKiAzMiwgaiArIDEgKTsKKworICAgICAgICBpZiggaiA9PSA1IHx8IGogPT0gNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldCggYnVmLCAnXHhBQScsIGJ1ZmxlbiA9IDEzMSApOworICAgICAgICAgICAgc2hhMl9obWFjX3N0YXJ0cyggJmN0eCwgYnVmLCBidWZsZW4sIGsgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzaGEyX2htYWNfc3RhcnRzKCAmY3R4LCBzaGEyX2htYWNfdGVzdF9rZXlbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGEyX2htYWNfdGVzdF9rZXlsZW5bal0sIGsgKTsKKworICAgICAgICBzaGEyX2htYWNfdXBkYXRlKCAmY3R4LCBzaGEyX2htYWNfdGVzdF9idWZbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYTJfaG1hY190ZXN0X2J1ZmxlbltqXSApOworCisgICAgICAgIHNoYTJfaG1hY19maW5pc2goICZjdHgsIHNoYTJzdW0gKTsKKworICAgICAgICBidWZsZW4gPSAoIGogPT0gNCApID8gMTYgOiAzMiAtIGsgKiA0OworCisgICAgICAgIGlmKCBtZW1jbXAoIHNoYTJzdW0sIHNoYTJfaG1hY190ZXN0X3N1bVtpXSwgYnVmbGVuICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgICAgICByZXR1cm4oIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4iICk7CisgICAgfQorCisgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgIHByaW50ZiggIlxuIiApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnJhcnkvc2hhNC5jIGIvbGlicmFyeS9zaGE0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0MjJhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnJhcnkvc2hhNC5jCkBAIC0wLDAgKzEsNzQzIEBACisvKgorICogIEZJUFMtMTgwLTIgY29tcGxpYW50IFNIQS0zODQvNTEyIGltcGxlbWVudGF0aW9uCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworLyoKKyAqICBUaGUgU0hBLTUxMiBTZWN1cmUgSGFzaCBTdGFuZGFyZCB3YXMgcHVibGlzaGVkIGJ5IE5JU1QgaW4gMjAwMi4KKyAqCisgKiAgaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL2ZpcHMvZmlwczE4MC0yL2ZpcHMxODAtMi5wZGYKKyAqLworCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFhZU1NMX1NIQTRfQykKKworI2luY2x1ZGUgInh5c3NsL3NoYTQuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiA2NC1iaXQgaW50ZWdlciBtYW5pcHVsYXRpb24gbWFjcm9zIChiaWcgZW5kaWFuKQorICovCisjaWZuZGVmIEdFVF9VSU5UNjRfQkUKKyNkZWZpbmUgR0VUX1VJTlQ2NF9CRShuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKG4pID0gKCAodW5zaWduZWQgaW50NjQpIChiKVsoaSkgICAgXSA8PCA1NiApICAgICAgIFwKKyAgICAgICAgfCAoICh1bnNpZ25lZCBpbnQ2NCkgKGIpWyhpKSArIDFdIDw8IDQ4ICkgICAgICAgXAorICAgICAgICB8ICggKHVuc2lnbmVkIGludDY0KSAoYilbKGkpICsgMl0gPDwgNDAgKSAgICAgICBcCisgICAgICAgIHwgKCAodW5zaWduZWQgaW50NjQpIChiKVsoaSkgKyAzXSA8PCAzMiApICAgICAgIFwKKyAgICAgICAgfCAoICh1bnNpZ25lZCBpbnQ2NCkgKGIpWyhpKSArIDRdIDw8IDI0ICkgICAgICAgXAorICAgICAgICB8ICggKHVuc2lnbmVkIGludDY0KSAoYilbKGkpICsgNV0gPDwgMTYgKSAgICAgICBcCisgICAgICAgIHwgKCAodW5zaWduZWQgaW50NjQpIChiKVsoaSkgKyA2XSA8PCAgOCApICAgICAgIFwKKyAgICAgICAgfCAoICh1bnNpZ25lZCBpbnQ2NCkgKGIpWyhpKSArIDddICAgICAgICk7ICAgICAgXAorfQorI2VuZGlmCisKKyNpZm5kZWYgUFVUX1VJTlQ2NF9CRQorI2RlZmluZSBQVVRfVUlOVDY0X0JFKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYilbKGkpICAgIF0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gNTYgKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAxXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiA0OCApOyAgICAgICBcCisgICAgKGIpWyhpKSArIDJdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+IDQwICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgM10gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gMzIgKTsgICAgICAgXAorICAgIChiKVsoaSkgKyA0XSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAyNCApOyAgICAgICBcCisgICAgKGIpWyhpKSArIDVdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+IDE2ICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgNl0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gIDggKTsgICAgICAgXAorICAgIChiKVsoaSkgKyA3XSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSAgICAgICApOyAgICAgICBcCit9CisjZW5kaWYKKworLyoKKyAqIFJvdW5kIGNvbnN0YW50cworICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50NjQgS1s4MF0gPQoreworICAgIFVMNjQoMHg0MjhBMkY5OEQ3MjhBRTIyKSwgIFVMNjQoMHg3MTM3NDQ5MTIzRUY2NUNEKSwKKyAgICBVTDY0KDB4QjVDMEZCQ0ZFQzREM0IyRiksICBVTDY0KDB4RTlCNURCQTU4MTg5REJCQyksCisgICAgVUw2NCgweDM5NTZDMjVCRjM0OEI1MzgpLCAgVUw2NCgweDU5RjExMUYxQjYwNUQwMTkpLAorICAgIFVMNjQoMHg5MjNGODJBNEFGMTk0RjlCKSwgIFVMNjQoMHhBQjFDNUVENURBNkQ4MTE4KSwKKyAgICBVTDY0KDB4RDgwN0FBOThBMzAzMDI0MiksICBVTDY0KDB4MTI4MzVCMDE0NTcwNkZCRSksCisgICAgVUw2NCgweDI0MzE4NUJFNEVFNEIyOEMpLCAgVUw2NCgweDU1MEM3REMzRDVGRkI0RTIpLAorICAgIFVMNjQoMHg3MkJFNUQ3NEYyN0I4OTZGKSwgIFVMNjQoMHg4MERFQjFGRTNCMTY5NkIxKSwKKyAgICBVTDY0KDB4OUJEQzA2QTcyNUM3MTIzNSksICBVTDY0KDB4QzE5QkYxNzRDRjY5MjY5NCksCisgICAgVUw2NCgweEU0OUI2OUMxOUVGMTRBRDIpLCAgVUw2NCgweEVGQkU0Nzg2Mzg0RjI1RTMpLAorICAgIFVMNjQoMHgwRkMxOURDNjhCOENENUI1KSwgIFVMNjQoMHgyNDBDQTFDQzc3QUM5QzY1KSwKKyAgICBVTDY0KDB4MkRFOTJDNkY1OTJCMDI3NSksICBVTDY0KDB4NEE3NDg0QUE2RUE2RTQ4MyksCisgICAgVUw2NCgweDVDQjBBOURDQkQ0MUZCRDQpLCAgVUw2NCgweDc2Rjk4OERBODMxMTUzQjUpLAorICAgIFVMNjQoMHg5ODNFNTE1MkVFNjZERkFCKSwgIFVMNjQoMHhBODMxQzY2RDJEQjQzMjEwKSwKKyAgICBVTDY0KDB4QjAwMzI3Qzg5OEZCMjEzRiksICBVTDY0KDB4QkY1OTdGQzdCRUVGMEVFNCksCisgICAgVUw2NCgweEM2RTAwQkYzM0RBODhGQzIpLCAgVUw2NCgweEQ1QTc5MTQ3OTMwQUE3MjUpLAorICAgIFVMNjQoMHgwNkNBNjM1MUUwMDM4MjZGKSwgIFVMNjQoMHgxNDI5Mjk2NzBBMEU2RTcwKSwKKyAgICBVTDY0KDB4MjdCNzBBODU0NkQyMkZGQyksICBVTDY0KDB4MkUxQjIxMzg1QzI2QzkyNiksCisgICAgVUw2NCgweDREMkM2REZDNUFDNDJBRUQpLCAgVUw2NCgweDUzMzgwRDEzOUQ5NUIzREYpLAorICAgIFVMNjQoMHg2NTBBNzM1NDhCQUY2M0RFKSwgIFVMNjQoMHg3NjZBMEFCQjNDNzdCMkE4KSwKKyAgICBVTDY0KDB4ODFDMkM5MkU0N0VEQUVFNiksICBVTDY0KDB4OTI3MjJDODUxNDgyMzUzQiksCisgICAgVUw2NCgweEEyQkZFOEExNENGMTAzNjQpLCAgVUw2NCgweEE4MUE2NjRCQkM0MjMwMDEpLAorICAgIFVMNjQoMHhDMjRCOEI3MEQwRjg5NzkxKSwgIFVMNjQoMHhDNzZDNTFBMzA2NTRCRTMwKSwKKyAgICBVTDY0KDB4RDE5MkU4MTlENkVGNTIxOCksICBVTDY0KDB4RDY5OTA2MjQ1NTY1QTkxMCksCisgICAgVUw2NCgweEY0MEUzNTg1NTc3MTIwMkEpLCAgVUw2NCgweDEwNkFBMDcwMzJCQkQxQjgpLAorICAgIFVMNjQoMHgxOUE0QzExNkI4RDJEMEM4KSwgIFVMNjQoMHgxRTM3NkMwODUxNDFBQjUzKSwKKyAgICBVTDY0KDB4Mjc0ODc3NENERjhFRUI5OSksICBVTDY0KDB4MzRCMEJDQjVFMTlCNDhBOCksCisgICAgVUw2NCgweDM5MUMwQ0IzQzVDOTVBNjMpLCAgVUw2NCgweDRFRDhBQTRBRTM0MThBQ0IpLAorICAgIFVMNjQoMHg1QjlDQ0E0Rjc3NjNFMzczKSwgIFVMNjQoMHg2ODJFNkZGM0Q2QjJCOEEzKSwKKyAgICBVTDY0KDB4NzQ4RjgyRUU1REVGQjJGQyksICBVTDY0KDB4NzhBNTYzNkY0MzE3MkY2MCksCisgICAgVUw2NCgweDg0Qzg3ODE0QTFGMEFCNzIpLCAgVUw2NCgweDhDQzcwMjA4MUE2NDM5RUMpLAorICAgIFVMNjQoMHg5MEJFRkZGQTIzNjMxRTI4KSwgIFVMNjQoMHhBNDUwNkNFQkRFODJCREU5KSwKKyAgICBVTDY0KDB4QkVGOUEzRjdCMkM2NzkxNSksICBVTDY0KDB4QzY3MTc4RjJFMzcyNTMyQiksCisgICAgVUw2NCgweENBMjczRUNFRUEyNjYxOUMpLCAgVUw2NCgweEQxODZCOEM3MjFDMEMyMDcpLAorICAgIFVMNjQoMHhFQURBN0RENkNERTBFQjFFKSwgIFVMNjQoMHhGNTdENEY3RkVFNkVEMTc4KSwKKyAgICBVTDY0KDB4MDZGMDY3QUE3MjE3NkZCQSksICBVTDY0KDB4MEE2MzdEQzVBMkM4OThBNiksCisgICAgVUw2NCgweDExM0Y5ODA0QkVGOTBEQUUpLCAgVUw2NCgweDFCNzEwQjM1MTMxQzQ3MUIpLAorICAgIFVMNjQoMHgyOERCNzdGNTIzMDQ3RDg0KSwgIFVMNjQoMHgzMkNBQUI3QjQwQzcyNDkzKSwKKyAgICBVTDY0KDB4M0M5RUJFMEExNUM5QkVCQyksICBVTDY0KDB4NDMxRDY3QzQ5QzEwMEQ0QyksCisgICAgVUw2NCgweDRDQzVENEJFQ0IzRTQyQjYpLCAgVUw2NCgweDU5N0YyOTlDRkM2NTdFMkEpLAorICAgIFVMNjQoMHg1RkNCNkZBQjNBRDZGQUVDKSwgIFVMNjQoMHg2QzQ0MTk4QzRBNDc1ODE3KQorfTsKKworLyoKKyAqIFNIQS01MTIgY29udGV4dCBzZXR1cAorICovCit2b2lkIHNoYTRfc3RhcnRzKCBzaGE0X2NvbnRleHQgKmN0eCwgaW50IGlzMzg0ICkKK3sKKyAgICBjdHgtPnRvdGFsWzBdID0gMDsKKyAgICBjdHgtPnRvdGFsWzFdID0gMDsKKworICAgIGlmKCBpczM4NCA9PSAwICkKKyAgICB7CisgICAgICAgIC8qIFNIQS01MTIgKi8KKyAgICAgICAgY3R4LT5zdGF0ZVswXSA9IFVMNjQoMHg2QTA5RTY2N0YzQkNDOTA4KTsKKyAgICAgICAgY3R4LT5zdGF0ZVsxXSA9IFVMNjQoMHhCQjY3QUU4NTg0Q0FBNzNCKTsKKyAgICAgICAgY3R4LT5zdGF0ZVsyXSA9IFVMNjQoMHgzQzZFRjM3MkZFOTRGODJCKTsKKyAgICAgICAgY3R4LT5zdGF0ZVszXSA9IFVMNjQoMHhBNTRGRjUzQTVGMUQzNkYxKTsKKyAgICAgICAgY3R4LT5zdGF0ZVs0XSA9IFVMNjQoMHg1MTBFNTI3RkFERTY4MkQxKTsKKyAgICAgICAgY3R4LT5zdGF0ZVs1XSA9IFVMNjQoMHg5QjA1Njg4QzJCM0U2QzFGKTsKKyAgICAgICAgY3R4LT5zdGF0ZVs2XSA9IFVMNjQoMHgxRjgzRDlBQkZCNDFCRDZCKTsKKyAgICAgICAgY3R4LT5zdGF0ZVs3XSA9IFVMNjQoMHg1QkUwQ0QxOTEzN0UyMTc5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU0hBLTM4NCAqLworICAgICAgICBjdHgtPnN0YXRlWzBdID0gVUw2NCgweENCQkI5RDVEQzEwNTlFRDgpOworICAgICAgICBjdHgtPnN0YXRlWzFdID0gVUw2NCgweDYyOUEyOTJBMzY3Q0Q1MDcpOworICAgICAgICBjdHgtPnN0YXRlWzJdID0gVUw2NCgweDkxNTkwMTVBMzA3MEREMTcpOworICAgICAgICBjdHgtPnN0YXRlWzNdID0gVUw2NCgweDE1MkZFQ0Q4RjcwRTU5MzkpOworICAgICAgICBjdHgtPnN0YXRlWzRdID0gVUw2NCgweDY3MzMyNjY3RkZDMDBCMzEpOworICAgICAgICBjdHgtPnN0YXRlWzVdID0gVUw2NCgweDhFQjQ0QTg3Njg1ODE1MTEpOworICAgICAgICBjdHgtPnN0YXRlWzZdID0gVUw2NCgweERCMEMyRTBENjRGOThGQTcpOworICAgICAgICBjdHgtPnN0YXRlWzddID0gVUw2NCgweDQ3QjU0ODFEQkVGQTRGQTQpOworICAgIH0KKworICAgIGN0eC0+aXMzODQgPSBpczM4NDsKK30KKworc3RhdGljIHZvaWQgc2hhNF9wcm9jZXNzKCBzaGE0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBkYXRhWzEyOF0gKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGludDY0IHRlbXAxLCB0ZW1wMiwgV1s4MF07CisgICAgdW5zaWduZWQgaW50NjQgQSwgQiwgQywgRCwgRSwgRiwgRywgSDsKKworI2RlZmluZSAgU0hSKHgsbikgKHggPj4gbikKKyNkZWZpbmUgUk9UUih4LG4pIChTSFIoeCxuKSB8ICh4IDw8ICg2NCAtIG4pKSkKKworI2RlZmluZSBTMCh4KSAoUk9UUih4LCAxKSBeIFJPVFIoeCwgOCkgXiAgU0hSKHgsIDcpKQorI2RlZmluZSBTMSh4KSAoUk9UUih4LDE5KSBeIFJPVFIoeCw2MSkgXiAgU0hSKHgsIDYpKQorCisjZGVmaW5lIFMyKHgpIChST1RSKHgsMjgpIF4gUk9UUih4LDM0KSBeIFJPVFIoeCwzOSkpCisjZGVmaW5lIFMzKHgpIChST1RSKHgsMTQpIF4gUk9UUih4LDE4KSBeIFJPVFIoeCw0MSkpCisKKyNkZWZpbmUgRjAoeCx5LHopICgoeCAmIHkpIHwgKHogJiAoeCB8IHkpKSkKKyNkZWZpbmUgRjEoeCx5LHopICh6IF4gKHggJiAoeSBeIHopKSkKKworI2RlZmluZSBQKGEsYixjLGQsZSxmLGcsaCx4LEspICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxID0gaCArIFMzKGUpICsgRjEoZSxmLGcpICsgSyArIHg7ICAgICAgXAorICAgIHRlbXAyID0gUzIoYSkgKyBGMChhLGIsYyk7ICAgICAgICAgICAgICAgICAgXAorICAgIGQgKz0gdGVtcDE7IGggPSB0ZW1wMSArIHRlbXAyOyAgICAgICAgICAgICAgXAorfQorCisgICAgZm9yKCBpID0gMDsgaSA8IDE2OyBpKysgKQorICAgIHsKKyAgICAgICAgR0VUX1VJTlQ2NF9CRSggV1tpXSwgZGF0YSwgaSA8PCAzICk7CisgICAgfQorCisgICAgZm9yKCA7IGkgPCA4MDsgaSsrICkKKyAgICB7CisgICAgICAgIFdbaV0gPSBTMShXW2kgLSAgMl0pICsgV1tpIC0gIDddICsKKyAgICAgICAgICAgICAgIFMwKFdbaSAtIDE1XSkgKyBXW2kgLSAxNl07CisgICAgfQorCisgICAgQSA9IGN0eC0+c3RhdGVbMF07CisgICAgQiA9IGN0eC0+c3RhdGVbMV07CisgICAgQyA9IGN0eC0+c3RhdGVbMl07CisgICAgRCA9IGN0eC0+c3RhdGVbM107CisgICAgRSA9IGN0eC0+c3RhdGVbNF07CisgICAgRiA9IGN0eC0+c3RhdGVbNV07CisgICAgRyA9IGN0eC0+c3RhdGVbNl07CisgICAgSCA9IGN0eC0+c3RhdGVbN107CisgICAgaSA9IDA7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgV1tpXSwgS1tpXSApOyBpKys7CisgICAgICAgIFAoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFdbaV0sIEtbaV0gKTsgaSsrOworICAgICAgICBQKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBXW2ldLCBLW2ldICk7IGkrKzsKKyAgICAgICAgUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgV1tpXSwgS1tpXSApOyBpKys7CisgICAgICAgIFAoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFdbaV0sIEtbaV0gKTsgaSsrOworICAgICAgICBQKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBXW2ldLCBLW2ldICk7IGkrKzsKKyAgICAgICAgUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgV1tpXSwgS1tpXSApOyBpKys7CisgICAgICAgIFAoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFdbaV0sIEtbaV0gKTsgaSsrOworICAgIH0KKyAgICB3aGlsZSggaSA8IDgwICk7CisKKyAgICBjdHgtPnN0YXRlWzBdICs9IEE7CisgICAgY3R4LT5zdGF0ZVsxXSArPSBCOworICAgIGN0eC0+c3RhdGVbMl0gKz0gQzsKKyAgICBjdHgtPnN0YXRlWzNdICs9IEQ7CisgICAgY3R4LT5zdGF0ZVs0XSArPSBFOworICAgIGN0eC0+c3RhdGVbNV0gKz0gRjsKKyAgICBjdHgtPnN0YXRlWzZdICs9IEc7CisgICAgY3R4LT5zdGF0ZVs3XSArPSBIOworfQorCisvKgorICogU0hBLTUxMiBwcm9jZXNzIGJ1ZmZlcgorICovCit2b2lkIHNoYTRfdXBkYXRlKCBzaGE0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuICkKK3sKKyAgICBpbnQgZmlsbDsKKyAgICB1bnNpZ25lZCBpbnQ2NCBsZWZ0OworCisgICAgaWYoIGlsZW4gPD0gMCApCisgICAgICAgIHJldHVybjsKKworICAgIGxlZnQgPSBjdHgtPnRvdGFsWzBdICYgMHg3RjsKKyAgICBmaWxsID0gKGludCkoIDEyOCAtIGxlZnQgKTsKKworICAgIGN0eC0+dG90YWxbMF0gKz0gaWxlbjsKKworICAgIGlmKCBjdHgtPnRvdGFsWzBdIDwgKHVuc2lnbmVkIGludDY0KSBpbGVuICkKKyAgICAgICAgY3R4LT50b3RhbFsxXSsrOworCisgICAgaWYoIGxlZnQgJiYgaWxlbiA+PSBmaWxsICkKKyAgICB7CisgICAgICAgIG1lbWNweSggKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksCisgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGZpbGwgKTsKKyAgICAgICAgc2hhNF9wcm9jZXNzKCBjdHgsIGN0eC0+YnVmZmVyICk7CisgICAgICAgIGlucHV0ICs9IGZpbGw7CisgICAgICAgIGlsZW4gIC09IGZpbGw7CisgICAgICAgIGxlZnQgPSAwOworICAgIH0KKworICAgIHdoaWxlKCBpbGVuID49IDEyOCApCisgICAgeworICAgICAgICBzaGE0X3Byb2Nlc3MoIGN0eCwgaW5wdXQgKTsKKyAgICAgICAgaW5wdXQgKz0gMTI4OworICAgICAgICBpbGVuICAtPSAxMjg7CisgICAgfQorCisgICAgaWYoIGlsZW4gPiAwICkKKyAgICB7CisgICAgICAgIG1lbWNweSggKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksCisgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGlsZW4gKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNoYTRfcGFkZGluZ1sxMjhdID0KK3sKKyAweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKKy8qCisgKiBTSEEtNTEyIGZpbmFsIGRpZ2VzdAorICovCit2b2lkIHNoYTRfZmluaXNoKCBzaGE0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBvdXRwdXRbNjRdICkKK3sKKyAgICBpbnQgbGFzdCwgcGFkbjsKKyAgICB1bnNpZ25lZCBpbnQ2NCBoaWdoLCBsb3c7CisgICAgdW5zaWduZWQgY2hhciBtc2dsZW5bMTZdOworCisgICAgaGlnaCA9ICggY3R4LT50b3RhbFswXSA+PiA2MSApCisgICAgICAgICB8ICggY3R4LT50b3RhbFsxXSA8PCAgMyApOworICAgIGxvdyAgPSAoIGN0eC0+dG90YWxbMF0gPDwgIDMgKTsKKworICAgIFBVVF9VSU5UNjRfQkUoIGhpZ2gsIG1zZ2xlbiwgMCApOworICAgIFBVVF9VSU5UNjRfQkUoIGxvdywgIG1zZ2xlbiwgOCApOworCisgICAgbGFzdCA9IChpbnQpKCBjdHgtPnRvdGFsWzBdICYgMHg3RiApOworICAgIHBhZG4gPSAoIGxhc3QgPCAxMTIgKSA/ICggMTEyIC0gbGFzdCApIDogKCAyNDAgLSBsYXN0ICk7CisKKyAgICBzaGE0X3VwZGF0ZSggY3R4LCAodW5zaWduZWQgY2hhciAqKSBzaGE0X3BhZGRpbmcsIHBhZG4gKTsKKyAgICBzaGE0X3VwZGF0ZSggY3R4LCBtc2dsZW4sIDE2ICk7CisKKyAgICBQVVRfVUlOVDY0X0JFKCBjdHgtPnN0YXRlWzBdLCBvdXRwdXQsICAwICk7CisgICAgUFVUX1VJTlQ2NF9CRSggY3R4LT5zdGF0ZVsxXSwgb3V0cHV0LCAgOCApOworICAgIFBVVF9VSU5UNjRfQkUoIGN0eC0+c3RhdGVbMl0sIG91dHB1dCwgMTYgKTsKKyAgICBQVVRfVUlOVDY0X0JFKCBjdHgtPnN0YXRlWzNdLCBvdXRwdXQsIDI0ICk7CisgICAgUFVUX1VJTlQ2NF9CRSggY3R4LT5zdGF0ZVs0XSwgb3V0cHV0LCAzMiApOworICAgIFBVVF9VSU5UNjRfQkUoIGN0eC0+c3RhdGVbNV0sIG91dHB1dCwgNDAgKTsKKworICAgIGlmKCBjdHgtPmlzMzg0ID09IDAgKQorICAgIHsKKyAgICAgICAgUFVUX1VJTlQ2NF9CRSggY3R4LT5zdGF0ZVs2XSwgb3V0cHV0LCA0OCApOworICAgICAgICBQVVRfVUlOVDY0X0JFKCBjdHgtPnN0YXRlWzddLCBvdXRwdXQsIDU2ICk7CisgICAgfQorfQorCisvKgorICogb3V0cHV0ID0gU0hBLTUxMiggaW5wdXQgYnVmZmVyICkKKyAqLwordm9pZCBzaGE0KCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzY0XSwgaW50IGlzMzg0ICkKK3sKKyAgICBzaGE0X2NvbnRleHQgY3R4OworCisgICAgc2hhNF9zdGFydHMoICZjdHgsIGlzMzg0ICk7CisgICAgc2hhNF91cGRhdGUoICZjdHgsIGlucHV0LCBpbGVuICk7CisgICAgc2hhNF9maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIHNoYTRfY29udGV4dCApICk7Cit9CisKKy8qCisgKiBvdXRwdXQgPSBTSEEtNTEyKCBmaWxlIGNvbnRlbnRzICkKKyAqLworaW50IHNoYTRfZmlsZSggY2hhciAqcGF0aCwgdW5zaWduZWQgY2hhciBvdXRwdXRbNjRdLCBpbnQgaXMzODQgKQoreworICAgIEZJTEUgKmY7CisgICAgc2l6ZV90IG47CisgICAgc2hhNF9jb250ZXh0IGN0eDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMDI0XTsKKworICAgIGlmKCAoIGYgPSBmb3BlbiggcGF0aCwgInJiIiApICkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiggMSApOworCisgICAgc2hhNF9zdGFydHMoICZjdHgsIGlzMzg0ICk7CisKKyAgICB3aGlsZSggKCBuID0gZnJlYWQoIGJ1ZiwgMSwgc2l6ZW9mKCBidWYgKSwgZiApICkgPiAwICkKKyAgICAgICAgc2hhNF91cGRhdGUoICZjdHgsIGJ1ZiwgKGludCkgbiApOworCisgICAgc2hhNF9maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIHNoYTRfY29udGV4dCApICk7CisKKyAgICBpZiggZmVycm9yKCBmICkgIT0gMCApCisgICAgeworICAgICAgICBmY2xvc2UoIGYgKTsKKyAgICAgICAgcmV0dXJuKCAyICk7CisgICAgfQorCisgICAgZmNsb3NlKCBmICk7CisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBTSEEtNTEyIEhNQUMgY29udGV4dCBzZXR1cAorICovCit2b2lkIHNoYTRfaG1hY19zdGFydHMoIHNoYTRfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpczM4NCApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBzdW1bNjRdOworCisgICAgaWYoIGtleWxlbiA+IDEyOCApCisgICAgeworICAgICAgICBzaGE0KCBrZXksIGtleWxlbiwgc3VtLCBpczM4NCApOworICAgICAgICBrZXlsZW4gPSAoIGlzMzg0ICkgPyA0OCA6IDY0OworICAgICAgICBrZXkgPSBzdW07CisgICAgfQorCisgICAgbWVtc2V0KCBjdHgtPmlwYWQsIDB4MzYsIDEyOCApOworICAgIG1lbXNldCggY3R4LT5vcGFkLCAweDVDLCAxMjggKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBrZXlsZW47IGkrKyApCisgICAgeworICAgICAgICBjdHgtPmlwYWRbaV0gPSAodW5zaWduZWQgY2hhcikoIGN0eC0+aXBhZFtpXSBeIGtleVtpXSApOworICAgICAgICBjdHgtPm9wYWRbaV0gPSAodW5zaWduZWQgY2hhcikoIGN0eC0+b3BhZFtpXSBeIGtleVtpXSApOworICAgIH0KKworICAgIHNoYTRfc3RhcnRzKCBjdHgsIGlzMzg0ICk7CisgICAgc2hhNF91cGRhdGUoIGN0eCwgY3R4LT5pcGFkLCAxMjggKTsKKworICAgIG1lbXNldCggc3VtLCAwLCBzaXplb2YoIHN1bSApICk7Cit9CisKKy8qCisgKiBTSEEtNTEyIEhNQUMgcHJvY2VzcyBidWZmZXIKKyAqLwordm9pZCBzaGE0X2htYWNfdXBkYXRlKCBzaGE0X2NvbnRleHQgICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApCit7CisgICAgc2hhNF91cGRhdGUoIGN0eCwgaW5wdXQsIGlsZW4gKTsKK30KKworLyoKKyAqIFNIQS01MTIgSE1BQyBmaW5hbCBkaWdlc3QKKyAqLwordm9pZCBzaGE0X2htYWNfZmluaXNoKCBzaGE0X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBvdXRwdXRbNjRdICkKK3sKKyAgICBpbnQgaXMzODQsIGhsZW47CisgICAgdW5zaWduZWQgY2hhciB0bXBidWZbNjRdOworCisgICAgaXMzODQgPSBjdHgtPmlzMzg0OworICAgIGhsZW4gPSAoIGlzMzg0ID09IDAgKSA/IDY0IDogNDg7CisKKyAgICBzaGE0X2ZpbmlzaCggY3R4LCB0bXBidWYgKTsKKyAgICBzaGE0X3N0YXJ0cyggY3R4LCBpczM4NCApOworICAgIHNoYTRfdXBkYXRlKCBjdHgsIGN0eC0+b3BhZCwgMTI4ICk7CisgICAgc2hhNF91cGRhdGUoIGN0eCwgdG1wYnVmLCBobGVuICk7CisgICAgc2hhNF9maW5pc2goIGN0eCwgb3V0cHV0ICk7CisKKyAgICBtZW1zZXQoIHRtcGJ1ZiwgMCwgc2l6ZW9mKCB0bXBidWYgKSApOworfQorCisvKgorICogb3V0cHV0ID0gSE1BQy1TSEEtNTEyKCBobWFjIGtleSwgaW5wdXQgYnVmZmVyICkKKyAqLwordm9pZCBzaGE0X2htYWMoIHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRwdXRbNjRdLCBpbnQgaXMzODQgKQoreworICAgIHNoYTRfY29udGV4dCBjdHg7CisKKyAgICBzaGE0X2htYWNfc3RhcnRzKCAmY3R4LCBrZXksIGtleWxlbiwgaXMzODQgKTsKKyAgICBzaGE0X2htYWNfdXBkYXRlKCAmY3R4LCBpbnB1dCwgaWxlbiApOworICAgIHNoYTRfaG1hY19maW5pc2goICZjdHgsIG91dHB1dCApOworCisgICAgbWVtc2V0KCAmY3R4LCAwLCBzaXplb2YoIHNoYTRfY29udGV4dCApICk7Cit9CisKKyNpZiBkZWZpbmVkKFhZU1NMX1NFTEZfVEVTVCkKKworLyoKKyAqIEZJUFMtMTgwLTIgdGVzdCB2ZWN0b3JzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYTRfdGVzdF9idWZbM11bMTEzXSA9IAoreworICAgIHsgImFiYyIgfSwKKyAgICB7ICJhYmNkZWZnaGJjZGVmZ2hpY2RlZmdoaWpkZWZnaGlqa2VmZ2hpamtsZmdoaWprbG1naGlqa2xtbiIKKyAgICAgICJoaWprbG1ub2lqa2xtbm9wamtsbW5vcHFrbG1ub3Bxcmxtbm9wcXJzbW5vcHFyc3Rub3BxcnN0dSIgfSwKKyAgICB7ICIiIH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgc2hhNF90ZXN0X2J1ZmxlblszXSA9Cit7CisgICAgMywgMTEyLCAxMDAwCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzaGE0X3Rlc3Rfc3VtWzZdWzY0XSA9Cit7CisgICAgLyoKKyAgICAgKiBTSEEtMzg0IHRlc3QgdmVjdG9ycworICAgICAqLworICAgIHsgMHhDQiwgMHgwMCwgMHg3NSwgMHgzRiwgMHg0NSwgMHhBMywgMHg1RSwgMHg4QiwKKyAgICAgIDB4QjUsIDB4QTAsIDB4M0QsIDB4NjksIDB4OUEsIDB4QzYsIDB4NTAsIDB4MDcsCisgICAgICAweDI3LCAweDJDLCAweDMyLCAweEFCLCAweDBFLCAweERFLCAweEQxLCAweDYzLAorICAgICAgMHgxQSwgMHg4QiwgMHg2MCwgMHg1QSwgMHg0MywgMHhGRiwgMHg1QiwgMHhFRCwKKyAgICAgIDB4ODAsIDB4ODYsIDB4MDcsIDB4MkIsIDB4QTEsIDB4RTcsIDB4Q0MsIDB4MjMsCisgICAgICAweDU4LCAweEJBLCAweEVDLCAweEExLCAweDM0LCAweEM4LCAweDI1LCAweEE3IH0sCisgICAgeyAweDA5LCAweDMzLCAweDBDLCAweDMzLCAweEY3LCAweDExLCAweDQ3LCAweEU4LAorICAgICAgMHgzRCwgMHgxOSwgMHgyRiwgMHhDNywgMHg4MiwgMHhDRCwgMHgxQiwgMHg0NywKKyAgICAgIDB4NTMsIDB4MTEsIDB4MUIsIDB4MTcsIDB4M0IsIDB4M0IsIDB4MDUsIDB4RDIsCisgICAgICAweDJGLCAweEEwLCAweDgwLCAweDg2LCAweEUzLCAweEIwLCAweEY3LCAweDEyLAorICAgICAgMHhGQywgMHhDNywgMHhDNywgMHgxQSwgMHg1NSwgMHg3RSwgMHgyRCwgMHhCOSwKKyAgICAgIDB4NjYsIDB4QzMsIDB4RTksIDB4RkEsIDB4OTEsIDB4NzQsIDB4NjAsIDB4MzkgfSwKKyAgICB7IDB4OUQsIDB4MEUsIDB4MTgsIDB4MDksIDB4NzEsIDB4NjQsIDB4NzQsIDB4Q0IsCisgICAgICAweDA4LCAweDZFLCAweDgzLCAweDRFLCAweDMxLCAweDBBLCAweDRBLCAweDFDLAorICAgICAgMHhFRCwgMHgxNCwgMHg5RSwgMHg5QywgMHgwMCwgMHhGMiwgMHg0OCwgMHg1MiwKKyAgICAgIDB4NzksIDB4NzIsIDB4Q0UsIDB4QzUsIDB4NzAsIDB4NEMsIDB4MkEsIDB4NUIsCisgICAgICAweDA3LCAweEI4LCAweEIzLCAweERDLCAweDM4LCAweEVDLCAweEM0LCAweEVCLAorICAgICAgMHhBRSwgMHg5NywgMHhERCwgMHhEOCwgMHg3RiwgMHgzRCwgMHg4OSwgMHg4NSB9LAorCisgICAgLyoKKyAgICAgKiBTSEEtNTEyIHRlc3QgdmVjdG9ycworICAgICAqLworICAgIHsgMHhERCwgMHhBRiwgMHgzNSwgMHhBMSwgMHg5MywgMHg2MSwgMHg3QSwgMHhCQSwKKyAgICAgIDB4Q0MsIDB4NDEsIDB4NzMsIDB4NDksIDB4QUUsIDB4MjAsIDB4NDEsIDB4MzEsCisgICAgICAweDEyLCAweEU2LCAweEZBLCAweDRFLCAweDg5LCAweEE5LCAweDdFLCAweEEyLAorICAgICAgMHgwQSwgMHg5RSwgMHhFRSwgMHhFNiwgMHg0QiwgMHg1NSwgMHhEMywgMHg5QSwKKyAgICAgIDB4MjEsIDB4OTIsIDB4OTksIDB4MkEsIDB4MjcsIDB4NEYsIDB4QzEsIDB4QTgsCisgICAgICAweDM2LCAweEJBLCAweDNDLCAweDIzLCAweEEzLCAweEZFLCAweEVCLCAweEJELAorICAgICAgMHg0NSwgMHg0RCwgMHg0NCwgMHgyMywgMHg2NCwgMHgzQywgMHhFOCwgMHgwRSwKKyAgICAgIDB4MkEsIDB4OUEsIDB4QzksIDB4NEYsIDB4QTUsIDB4NEMsIDB4QTQsIDB4OUYgfSwKKyAgICB7IDB4OEUsIDB4OTUsIDB4OUIsIDB4NzUsIDB4REEsIDB4RTMsIDB4MTMsIDB4REEsCisgICAgICAweDhDLCAweEY0LCAweEY3LCAweDI4LCAweDE0LCAweEZDLCAweDE0LCAweDNGLAorICAgICAgMHg4RiwgMHg3NywgMHg3OSwgMHhDNiwgMHhFQiwgMHg5RiwgMHg3RiwgMHhBMSwKKyAgICAgIDB4NzIsIDB4OTksIDB4QUUsIDB4QUQsIDB4QjYsIDB4ODgsIDB4OTAsIDB4MTgsCisgICAgICAweDUwLCAweDFELCAweDI4LCAweDlFLCAweDQ5LCAweDAwLCAweEY3LCAweEU0LAorICAgICAgMHgzMywgMHgxQiwgMHg5OSwgMHhERSwgMHhDNCwgMHhCNSwgMHg0MywgMHgzQSwKKyAgICAgIDB4QzcsIDB4RDMsIDB4MjksIDB4RUUsIDB4QjYsIDB4REQsIDB4MjYsIDB4NTQsCisgICAgICAweDVFLCAweDk2LCAweEU1LCAweDVCLCAweDg3LCAweDRCLCAweEU5LCAweDA5IH0sCisgICAgeyAweEU3LCAweDE4LCAweDQ4LCAweDNELCAweDBDLCAweEU3LCAweDY5LCAweDY0LAorICAgICAgMHg0RSwgMHgyRSwgMHg0MiwgMHhDNywgMHhCQywgMHgxNSwgMHhCNCwgMHg2MywKKyAgICAgIDB4OEUsIDB4MUYsIDB4OTgsIDB4QjEsIDB4M0IsIDB4MjAsIDB4NDQsIDB4MjgsCisgICAgICAweDU2LCAweDMyLCAweEE4LCAweDAzLCAweEFGLCAweEE5LCAweDczLCAweEVCLAorICAgICAgMHhERSwgMHgwRiwgMHhGMiwgMHg0NCwgMHg4NywgMHg3RSwgMHhBNiwgMHgwQSwKKyAgICAgIDB4NEMsIDB4QjAsIDB4NDMsIDB4MkMsIDB4RTUsIDB4NzcsIDB4QzMsIDB4MUIsCisgICAgICAweEVCLCAweDAwLCAweDlDLCAweDVDLCAweDJDLCAweDQ5LCAweEFBLCAweDJFLAorICAgICAgMHg0RSwgMHhBRCwgMHhCMiwgMHgxNywgMHhBRCwgMHg4QywgMHhDMCwgMHg5QiB9Cit9OworCisvKgorICogUkZDIDQyMzEgdGVzdCB2ZWN0b3JzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYTRfaG1hY190ZXN0X2tleVs3XVsyNl0gPQoreworICAgIHsgIlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEJceDBCXHgwQlx4MEIiCisgICAgICAiXHgwQlx4MEJceDBCXHgwQiIgfSwKKyAgICB7ICJKZWZlIiB9LAorICAgIHsgIlx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUFceEFBXHhBQVx4QUEiCisgICAgICAiXHhBQVx4QUFceEFBXHhBQSIgfSwKKyAgICB7ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBBXHgwQlx4MENceDBEXHgwRVx4MEZceDEwIgorICAgICAgIlx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOSIgfSwKKyAgICB7ICJceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDXHgwQ1x4MENceDBDIgorICAgICAgIlx4MENceDBDXHgwQ1x4MEMiIH0sCisgICAgeyAiIiB9LCAvKiAweEFBIDEzMSB0aW1lcyAqLworICAgIHsgIiIgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBzaGE0X2htYWNfdGVzdF9rZXlsZW5bN10gPQoreworICAgIDIwLCA0LCAyMCwgMjUsIDIwLCAxMzEsIDEzMQorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hhNF9obWFjX3Rlc3RfYnVmWzddWzE1M10gPQoreworICAgIHsgIkhpIFRoZXJlIiB9LAorICAgIHsgIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iIH0sCisgICAgeyAiXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERCIKKyAgICAgICJceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREIgorICAgICAgIlx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4REQiCisgICAgICAiXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERCIKKyAgICAgICJceEREXHhERFx4RERceEREXHhERFx4RERceEREXHhERFx4RERceEREIiB9LAorICAgIHsgIlx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0QiCisgICAgICAiXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRCIKKyAgICAgICJceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEIgorICAgICAgIlx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0QiCisgICAgICAiXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRFx4Q0RceENEXHhDRCIgfSwKKyAgICB7ICJUZXN0IFdpdGggVHJ1bmNhdGlvbiIgfSwKKyAgICB7ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiIH0sCisgICAgeyAiVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGtleSAiCisgICAgICAiYW5kIGEgbGFyZ2VyIHRoYW4gYmxvY2stc2l6ZSBkYXRhLiBUaGUga2V5IG5lZWRzIHRvICIKKyAgICAgICJiZSBoYXNoZWQgYmVmb3JlIGJlaW5nIHVzZWQgYnkgdGhlIEhNQUMgYWxnb3JpdGhtLiIgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBzaGE0X2htYWNfdGVzdF9idWZsZW5bN10gPQoreworICAgIDgsIDI4LCA1MCwgNTAsIDIwLCA1NCwgMTUyCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzaGE0X2htYWNfdGVzdF9zdW1bMTRdWzY0XSA9Cit7CisgICAgLyoKKyAgICAgKiBITUFDLVNIQS0zODQgdGVzdCB2ZWN0b3JzCisgICAgICovCisgICAgeyAweEFGLCAweEQwLCAweDM5LCAweDQ0LCAweEQ4LCAweDQ4LCAweDk1LCAweDYyLAorICAgICAgMHg2QiwgMHgwOCwgMHgyNSwgMHhGNCwgMHhBQiwgMHg0NiwgMHg5MCwgMHg3RiwKKyAgICAgIDB4MTUsIDB4RjksIDB4REEsIDB4REIsIDB4RTQsIDB4MTAsIDB4MUUsIDB4QzYsCisgICAgICAweDgyLCAweEFBLCAweDAzLCAweDRDLCAweDdDLCAweEVCLCAweEM1LCAweDlDLAorICAgICAgMHhGQSwgMHhFQSwgMHg5RSwgMHhBOSwgMHgwNywgMHg2RSwgMHhERSwgMHg3RiwKKyAgICAgIDB4NEEsIDB4RjEsIDB4NTIsIDB4RTgsIDB4QjIsIDB4RkEsIDB4OUMsIDB4QjYgfSwKKyAgICB7IDB4QUYsIDB4NDUsIDB4RDIsIDB4RTMsIDB4NzYsIDB4NDgsIDB4NDAsIDB4MzEsCisgICAgICAweDYxLCAweDdGLCAweDc4LCAweEQyLCAweEI1LCAweDhBLCAweDZCLCAweDFCLAorICAgICAgMHg5QywgMHg3RSwgMHhGNCwgMHg2NCwgMHhGNSwgMHhBMCwgMHgxQiwgMHg0NywKKyAgICAgIDB4RTQsIDB4MkUsIDB4QzMsIDB4NzMsIDB4NjMsIDB4MjIsIDB4NDQsIDB4NUUsCisgICAgICAweDhFLCAweDIyLCAweDQwLCAweENBLCAweDVFLCAweDY5LCAweEUyLCAweEM3LAorICAgICAgMHg4QiwgMHgzMiwgMHgzOSwgMHhFQywgMHhGQSwgMHhCMiwgMHgxNiwgMHg0OSB9LAorICAgIHsgMHg4OCwgMHgwNiwgMHgyNiwgMHgwOCwgMHhEMywgMHhFNiwgMHhBRCwgMHg4QSwKKyAgICAgIDB4MEEsIDB4QTIsIDB4QUMsIDB4RTAsIDB4MTQsIDB4QzgsIDB4QTgsIDB4NkYsCisgICAgICAweDBBLCAweEE2LCAweDM1LCAweEQ5LCAweDQ3LCAweEFDLCAweDlGLCAweEVCLAorICAgICAgMHhFOCwgMHgzRSwgMHhGNCwgMHhFNSwgMHg1OSwgMHg2NiwgMHgxNCwgMHg0QiwKKyAgICAgIDB4MkEsIDB4NUEsIDB4QjMsIDB4OUQsIDB4QzEsIDB4MzgsIDB4MTQsIDB4QjksCisgICAgICAweDRFLCAweDNBLCAweEI2LCAweEUxLCAweDAxLCAweEEzLCAweDRGLCAweDI3IH0sCisgICAgeyAweDNFLCAweDhBLCAweDY5LCAweEI3LCAweDc4LCAweDNDLCAweDI1LCAweDg1LAorICAgICAgMHgxOSwgMHgzMywgMHhBQiwgMHg2MiwgMHg5MCwgMHhBRiwgMHg2QywgMHhBNywKKyAgICAgIDB4N0EsIDB4OTksIDB4ODEsIDB4NDgsIDB4MDgsIDB4NTAsIDB4MDAsIDB4OUMsCisgICAgICAweEM1LCAweDU3LCAweDdDLCAweDZFLCAweDFGLCAweDU3LCAweDNCLCAweDRFLAorICAgICAgMHg2OCwgMHgwMSwgMHhERCwgMHgyMywgMHhDNCwgMHhBNywgMHhENiwgMHg3OSwKKyAgICAgIDB4Q0MsIDB4RjgsIDB4QTMsIDB4ODYsIDB4QzYsIDB4NzQsIDB4Q0YsIDB4RkIgfSwKKyAgICB7IDB4M0EsIDB4QkYsIDB4MzQsIDB4QzMsIDB4NTAsIDB4M0IsIDB4MkEsIDB4MjMsCisgICAgICAweEE0LCAweDZFLCAweEZDLCAweDYxLCAweDlCLCAweEFFLCAweEY4LCAweDk3IH0sCisgICAgeyAweDRFLCAweENFLCAweDA4LCAweDQ0LCAweDg1LCAweDgxLCAweDNFLCAweDkwLAorICAgICAgMHg4OCwgMHhEMiwgMHhDNiwgMHgzQSwgMHgwNCwgMHgxQiwgMHhDNSwgMHhCNCwKKyAgICAgIDB4NEYsIDB4OUUsIDB4RjEsIDB4MDEsIDB4MkEsIDB4MkIsIDB4NTgsIDB4OEYsCisgICAgICAweDNDLCAweEQxLCAweDFGLCAweDA1LCAweDAzLCAweDNBLCAweEM0LCAweEM2LAorICAgICAgMHgwQywgMHgyRSwgMHhGNiwgMHhBQiwgMHg0MCwgMHgzMCwgMHhGRSwgMHg4MiwKKyAgICAgIDB4OTYsIDB4MjQsIDB4OEQsIDB4RjEsIDB4NjMsIDB4RjQsIDB4NDksIDB4NTIgfSwKKyAgICB7IDB4NjYsIDB4MTcsIDB4MTcsIDB4OEUsIDB4OTQsIDB4MUYsIDB4MDIsIDB4MEQsCisgICAgICAweDM1LCAweDFFLCAweDJGLCAweDI1LCAweDRFLCAweDhGLCAweEQzLCAweDJDLAorICAgICAgMHg2MCwgMHgyNCwgMHgyMCwgMHhGRSwgMHhCMCwgMHhCOCwgMHhGQiwgMHg5QSwKKyAgICAgIDB4REMsIDB4Q0UsIDB4QkIsIDB4ODIsIDB4NDYsIDB4MUUsIDB4OTksIDB4QzUsCisgICAgICAweEE2LCAweDc4LCAweENDLCAweDMxLCAweEU3LCAweDk5LCAweDE3LCAweDZELAorICAgICAgMHgzOCwgMHg2MCwgMHhFNiwgMHgxMSwgMHgwQywgMHg0NiwgMHg1MiwgMHgzRSB9LAorCisgICAgLyoKKyAgICAgKiBITUFDLVNIQS01MTIgdGVzdCB2ZWN0b3JzCisgICAgICovCisgICAgeyAweDg3LCAweEFBLCAweDdDLCAweERFLCAweEE1LCAweEVGLCAweDYxLCAweDlELAorICAgICAgMHg0RiwgMHhGMCwgMHhCNCwgMHgyNCwgMHgxQSwgMHgxRCwgMHg2QywgMHhCMCwKKyAgICAgIDB4MjMsIDB4NzksIDB4RjQsIDB4RTIsIDB4Q0UsIDB4NEUsIDB4QzIsIDB4NzgsCisgICAgICAweDdBLCAweEQwLCAweEIzLCAweDA1LCAweDQ1LCAweEUxLCAweDdDLCAweERFLAorICAgICAgMHhEQSwgMHhBOCwgMHgzMywgMHhCNywgMHhENiwgMHhCOCwgMHhBNywgMHgwMiwKKyAgICAgIDB4MDMsIDB4OEIsIDB4MjcsIDB4NEUsIDB4QUUsIDB4QTMsIDB4RjQsIDB4RTQsCisgICAgICAweEJFLCAweDlELCAweDkxLCAweDRFLCAweEVCLCAweDYxLCAweEYxLCAweDcwLAorICAgICAgMHgyRSwgMHg2OSwgMHg2QywgMHgyMCwgMHgzQSwgMHgxMiwgMHg2OCwgMHg1NCB9LAorICAgIHsgMHgxNiwgMHg0QiwgMHg3QSwgMHg3QiwgMHhGQywgMHhGOCwgMHgxOSwgMHhFMiwKKyAgICAgIDB4RTMsIDB4OTUsIDB4RkIsIDB4RTcsIDB4M0IsIDB4NTYsIDB4RTAsIDB4QTMsCisgICAgICAweDg3LCAweEJELCAweDY0LCAweDIyLCAweDJFLCAweDgzLCAweDFGLCAweEQ2LAorICAgICAgMHgxMCwgMHgyNywgMHgwQywgMHhENywgMHhFQSwgMHgyNSwgMHgwNSwgMHg1NCwKKyAgICAgIDB4OTcsIDB4NTgsIDB4QkYsIDB4NzUsIDB4QzAsIDB4NUEsIDB4OTksIDB4NEEsCisgICAgICAweDZELCAweDAzLCAweDRGLCAweDY1LCAweEY4LCAweEYwLCAweEU2LCAweEZELAorICAgICAgMHhDQSwgMHhFQSwgMHhCMSwgMHhBMywgMHg0RCwgMHg0QSwgMHg2QiwgMHg0QiwKKyAgICAgIDB4NjMsIDB4NkUsIDB4MDcsIDB4MEEsIDB4MzgsIDB4QkMsIDB4RTcsIDB4MzcgfSwKKyAgICB7IDB4RkEsIDB4NzMsIDB4QjAsIDB4MDgsIDB4OUQsIDB4NTYsIDB4QTIsIDB4ODQsCisgICAgICAweEVGLCAweEIwLCAweEYwLCAweDc1LCAweDZDLCAweDg5LCAweDBCLCAweEU5LAorICAgICAgMHhCMSwgMHhCNSwgMHhEQiwgMHhERCwgMHg4RSwgMHhFOCwgMHgxQSwgMHgzNiwKKyAgICAgIDB4NTUsIDB4RjgsIDB4M0UsIDB4MzMsIDB4QjIsIDB4MjcsIDB4OUQsIDB4MzksCisgICAgICAweEJGLCAweDNFLCAweDg0LCAweDgyLCAweDc5LCAweEE3LCAweDIyLCAweEM4LAorICAgICAgMHgwNiwgMHhCNCwgMHg4NSwgMHhBNCwgMHg3RSwgMHg2NywgMHhDOCwgMHgwNywKKyAgICAgIDB4QjksIDB4NDYsIDB4QTMsIDB4MzcsIDB4QkUsIDB4RTgsIDB4OTQsIDB4MjYsCisgICAgICAweDc0LCAweDI3LCAweDg4LCAweDU5LCAweEUxLCAweDMyLCAweDkyLCAweEZCIH0sCisgICAgeyAweEIwLCAweEJBLCAweDQ2LCAweDU2LCAweDM3LCAweDQ1LCAweDhDLCAweDY5LAorICAgICAgMHg5MCwgMHhFNSwgMHhBOCwgMHhDNSwgMHhGNiwgMHgxRCwgMHg0QSwgMHhGNywKKyAgICAgIDB4RTUsIDB4NzYsIDB4RDksIDB4N0YsIDB4RjksIDB4NEIsIDB4ODcsIDB4MkQsCisgICAgICAweEU3LCAweDZGLCAweDgwLCAweDUwLCAweDM2LCAweDFFLCAweEUzLCAweERCLAorICAgICAgMHhBOSwgMHgxQywgMHhBNSwgMHhDMSwgMHgxQSwgMHhBMiwgMHg1RSwgMHhCNCwKKyAgICAgIDB4RDYsIDB4NzksIDB4MjcsIDB4NUMsIDB4QzUsIDB4NzgsIDB4ODAsIDB4NjMsCisgICAgICAweEE1LCAweEYxLCAweDk3LCAweDQxLCAweDEyLCAweDBDLCAweDRGLCAweDJELAorICAgICAgMHhFMiwgMHhBRCwgMHhFQiwgMHhFQiwgMHgxMCwgMHhBMiwgMHg5OCwgMHhERCB9LAorICAgIHsgMHg0MSwgMHg1RiwgMHhBRCwgMHg2MiwgMHg3MSwgMHg1OCwgMHgwQSwgMHg1MywKKyAgICAgIDB4MUQsIDB4NDEsIDB4NzksIDB4QkMsIDB4ODksIDB4MUQsIDB4ODcsIDB4QTYgfSwKKyAgICB7IDB4ODAsIDB4QjIsIDB4NDIsIDB4NjMsIDB4QzcsIDB4QzEsIDB4QTMsIDB4RUIsCisgICAgICAweEI3LCAweDE0LCAweDkzLCAweEMxLCAweERELCAweDdCLCAweEU4LCAweEI0LAorICAgICAgMHg5QiwgMHg0NiwgMHhEMSwgMHhGNCwgMHgxQiwgMHg0QSwgMHhFRSwgMHhDMSwKKyAgICAgIDB4MTIsIDB4MUIsIDB4MDEsIDB4MzcsIDB4ODMsIDB4RjgsIDB4RjMsIDB4NTIsCisgICAgICAweDZCLCAweDU2LCAweEQwLCAweDM3LCAweEUwLCAweDVGLCAweDI1LCAweDk4LAorICAgICAgMHhCRCwgMHgwRiwgMHhEMiwgMHgyMSwgMHg1RCwgMHg2QSwgMHgxRSwgMHg1MiwKKyAgICAgIDB4OTUsIDB4RTYsIDB4NEYsIDB4NzMsIDB4RjYsIDB4M0YsIDB4MEEsIDB4RUMsCisgICAgICAweDhCLCAweDkxLCAweDVBLCAweDk4LCAweDVELCAweDc4LCAweDY1LCAweDk4IH0sCisgICAgeyAweEUzLCAweDdCLCAweDZBLCAweDc3LCAweDVELCAweEM4LCAweDdELCAweEJBLAorICAgICAgMHhBNCwgMHhERiwgMHhBOSwgMHhGOSwgMHg2RSwgMHg1RSwgMHgzRiwgMHhGRCwKKyAgICAgIDB4REUsIDB4QkQsIDB4NzEsIDB4RjgsIDB4ODYsIDB4NzIsIDB4ODksIDB4ODYsCisgICAgICAweDVELCAweEY1LCAweEEzLCAweDJELCAweDIwLCAweENELCAweEM5LCAweDQ0LAorICAgICAgMHhCNiwgMHgwMiwgMHgyQywgMHhBQywgMHgzQywgMHg0OSwgMHg4MiwgMHhCMSwKKyAgICAgIDB4MEQsIDB4NUUsIDB4RUIsIDB4NTUsIDB4QzMsIDB4RTQsIDB4REUsIDB4MTUsCisgICAgICAweDEzLCAweDQ2LCAweDc2LCAweEZCLCAweDZELCAweEUwLCAweDQ0LCAweDYwLAorICAgICAgMHg2NSwgMHhDOSwgMHg3NCwgMHg0MCwgMHhGQSwgMHg4QywgMHg2QSwgMHg1OCB9Cit9OworCisvKgorICogQ2hlY2t1cCByb3V0aW5lCisgKi8KK2ludCBzaGE0X3NlbGZfdGVzdCggaW50IHZlcmJvc2UgKQoreworICAgIGludCBpLCBqLCBrLCBidWZsZW47CisgICAgdW5zaWduZWQgY2hhciBidWZbMTAyNF07CisgICAgdW5zaWduZWQgY2hhciBzaGE0c3VtWzY0XTsKKyAgICBzaGE0X2NvbnRleHQgY3R4OworCisgICAgZm9yKCBpID0gMDsgaSA8IDY7IGkrKyApCisgICAgeworICAgICAgICBqID0gaSAlIDM7CisgICAgICAgIGsgPSBpIDwgMzsKKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggIiAgU0hBLSVkIHRlc3QgIyVkOiAiLCA1MTIgLSBrICogMTI4LCBqICsgMSApOworCisgICAgICAgIHNoYTRfc3RhcnRzKCAmY3R4LCBrICk7CisKKyAgICAgICAgaWYoIGogPT0gMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldCggYnVmLCAnYScsIGJ1ZmxlbiA9IDEwMDAgKTsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDEwMDA7IGorKyApCisgICAgICAgICAgICAgICAgc2hhNF91cGRhdGUoICZjdHgsIGJ1ZiwgYnVmbGVuICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2hhNF91cGRhdGUoICZjdHgsIHNoYTRfdGVzdF9idWZbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhNF90ZXN0X2J1ZmxlbltqXSApOworCisgICAgICAgIHNoYTRfZmluaXNoKCAmY3R4LCBzaGE0c3VtICk7CisKKyAgICAgICAgaWYoIG1lbWNtcCggc2hhNHN1bSwgc2hhNF90ZXN0X3N1bVtpXSwgNjQgLSBrICogMTYgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiZmFpbGVkXG4iICk7CisKKyAgICAgICAgICAgIHJldHVybiggMSApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICJwYXNzZWRcbiIgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAiXG4iICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMTQ7IGkrKyApCisgICAgeworICAgICAgICBqID0gaSAlIDc7CisgICAgICAgIGsgPSBpIDwgNzsKKworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggIiAgSE1BQy1TSEEtJWQgdGVzdCAjJWQ6ICIsIDUxMiAtIGsgKiAxMjgsIGogKyAxICk7CisKKyAgICAgICAgaWYoIGogPT0gNSB8fCBqID09IDYgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoIGJ1ZiwgJ1x4QUEnLCBidWZsZW4gPSAxMzEgKTsKKyAgICAgICAgICAgIHNoYTRfaG1hY19zdGFydHMoICZjdHgsIGJ1ZiwgYnVmbGVuLCBrICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2hhNF9obWFjX3N0YXJ0cyggJmN0eCwgc2hhNF9obWFjX3Rlc3Rfa2V5W2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhNF9obWFjX3Rlc3Rfa2V5bGVuW2pdLCBrICk7CisKKyAgICAgICAgc2hhNF9obWFjX3VwZGF0ZSggJmN0eCwgc2hhNF9obWFjX3Rlc3RfYnVmW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGE0X2htYWNfdGVzdF9idWZsZW5bal0gKTsKKworICAgICAgICBzaGE0X2htYWNfZmluaXNoKCAmY3R4LCBzaGE0c3VtICk7CisKKyAgICAgICAgYnVmbGVuID0gKCBqID09IDQgKSA/IDE2IDogNjQgLSBrICogMTY7CisKKyAgICAgICAgaWYoIG1lbWNtcCggc2hhNHN1bSwgc2hhNF9obWFjX3Rlc3Rfc3VtW2ldLCBidWZsZW4gKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiZmFpbGVkXG4iICk7CisKKyAgICAgICAgICAgIHJldHVybiggMSApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICJwYXNzZWRcbiIgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAiXG4iICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicmFyeS9zc2xfY2xpLmMgYi9saWJyYXJ5L3NzbF9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDkxYjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicmFyeS9zc2xfY2xpLmMKQEAgLTAsMCArMSw3NjggQEAKKy8qCisgKiAgU1NMdjMvVExTdjEgY2xpZW50LXNpZGUgZnVuY3Rpb25zCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFhZU1NMX1NTTF9DTElfQykKKworI2luY2x1ZGUgInh5c3NsL2RlYnVnLmgiCisjaW5jbHVkZSAieHlzc2wvc3NsLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworc3RhdGljIGludCBzc2xfd3JpdGVfY2xpZW50X2hlbGxvKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgcmV0LCBpLCBuOworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIHRpbWVfdCB0OworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPT4gd3JpdGUgY2xpZW50IGhlbGxvIiApICk7CisKKyAgICBzc2wtPm1ham9yX3ZlciA9IFNTTF9NQUpPUl9WRVJTSU9OXzM7CisgICAgc3NsLT5taW5vcl92ZXIgPSBTU0xfTUlOT1JfVkVSU0lPTl8wOworCisgICAgc3NsLT5tYXhfbWFqb3JfdmVyID0gU1NMX01BSk9SX1ZFUlNJT05fMzsKKyAgICBzc2wtPm1heF9taW5vcl92ZXIgPSBTU0xfTUlOT1JfVkVSU0lPTl8xOworCisgICAgLyoKKyAgICAgKiAgICAgMCAgLiAgIDAgICBoYW5kc2hha2UgdHlwZQorICAgICAqICAgICAxICAuICAgMyAgIGhhbmRzaGFrZSBsZW5ndGgKKyAgICAgKiAgICAgNCAgLiAgIDUgICBoaWdoZXN0IHZlcnNpb24gc3VwcG9ydGVkCisgICAgICogICAgIDYgIC4gICA5ICAgY3VycmVudCBVTklYIHRpbWUKKyAgICAgKiAgICAxMCAgLiAgMzcgICByYW5kb20gYnl0ZXMKKyAgICAgKi8KKyAgICBidWYgPSBzc2wtPm91dF9tc2c7CisgICAgcCA9IGJ1ZiArIDQ7CisKKyAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpIHNzbC0+bWF4X21ham9yX3ZlcjsKKyAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpIHNzbC0+bWF4X21pbm9yX3ZlcjsKKworICAgIFNTTF9ERUJVR19NU0coIDMsICggImNsaWVudCBoZWxsbywgbWF4IHZlcnNpb246IFslZDolZF0iLAorICAgICAgICAgICAgICAgICAgIGJ1Zls0XSwgYnVmWzVdICkgKTsKKworICAgIHQgPSB0aW1lKCBOVUxMICk7CisgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggdCA+PiAyNCApOworICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoIHQgPj4gMTYgKTsKKyAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpKCB0ID4+ICA4ICk7CisgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggdCAgICAgICApOworCisgICAgU1NMX0RFQlVHX01TRyggMywgKCAiY2xpZW50IGhlbGxvLCBjdXJyZW50IHRpbWU6ICVsdSIsIHQgKSApOworCisgICAgZm9yKCBpID0gMjg7IGkgPiAwOyBpLS0gKQorICAgICAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpIHNzbC0+Zl9ybmcoIHNzbC0+cF9ybmcgKTsKKworICAgIG1lbWNweSggc3NsLT5yYW5kYnl0ZXMsIGJ1ZiArIDYsIDMyICk7CisKKyAgICBTU0xfREVCVUdfQlVGKCAzLCAiY2xpZW50IGhlbGxvLCByYW5kb20gYnl0ZXMiLCBidWYgKyA2LCAzMiApOworCisgICAgLyoKKyAgICAgKiAgICAzOCAgLiAgMzggICBzZXNzaW9uIGlkIGxlbmd0aAorICAgICAqICAgIDM5ICAuIDM5K24gIHNlc3Npb24gaWQKKyAgICAgKiAgIDQwK24gLiA0MStuICBjaXBoZXJsaXN0IGxlbmd0aAorICAgICAqICAgNDIrbiAuIC4uICAgIGNpcGhlcmxpc3QKKyAgICAgKiAgIC4uICAgLiAuLiAgICBjb21wcmVzc2lvbiBhbGcuICgwKQorICAgICAqICAgLi4gICAuIC4uICAgIGV4dGVuc2lvbnMgKHVudXNlZCkKKyAgICAgKi8KKyAgICBuID0gc3NsLT5zZXNzaW9uLT5sZW5ndGg7CisKKyAgICBpZiggbiA8IDE2IHx8IG4gPiAzMiB8fCBzc2wtPnJlc3VtZSA9PSAwIHx8CisgICAgICAgIHQgLSBzc2wtPnNlc3Npb24tPnN0YXJ0ID4gc3NsLT50aW1lb3V0ICkKKyAgICAgICAgbiA9IDA7CisKKyAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpIG47CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgKnArKyA9IHNzbC0+c2Vzc2lvbi0+aWRbaV07CisKKyAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJjbGllbnQgaGVsbG8sIHNlc3Npb24gaWQgbGVuLjogJWQiLCBuICkgKTsKKyAgICBTU0xfREVCVUdfQlVGKCAzLCAgICJjbGllbnQgaGVsbG8sIHNlc3Npb24gaWQiLCBidWYgKyAzOSwgbiApOworCisgICAgZm9yKCBuID0gMDsgc3NsLT5jaXBoZXJzW25dICE9IDA7IG4rKyApOworICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoIG4gPj4gNyApOworICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoIG4gPDwgMSApOworCisgICAgU1NMX0RFQlVHX01TRyggMywgKCAiY2xpZW50IGhlbGxvLCBnb3QgJWQgY2lwaGVycyIsIG4gKSApOworCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJjbGllbnQgaGVsbG8sIGFkZCBjaXBoZXI6ICUyZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+Y2lwaGVyc1tpXSApICk7CisKKyAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggc3NsLT5jaXBoZXJzW2ldID4+IDggKTsKKyAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggc3NsLT5jaXBoZXJzW2ldICAgICAgKTsKKyAgICB9CisKKyAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJjbGllbnQgaGVsbG8sIGNvbXByZXNzIGxlbi46ICVkIiwgMSApICk7CisgICAgU1NMX0RFQlVHX01TRyggMywgKCAiY2xpZW50IGhlbGxvLCBjb21wcmVzcyBhbGcuOiAlZCIsIDAgKSApOworCisgICAgKnArKyA9IDE7CisgICAgKnArKyA9IFNTTF9DT01QUkVTU19OVUxMOworCisgICAgaWYgKCBzc2wtPmhvc3RuYW1lICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMywgKCAiY2xpZW50IGhlbGxvLCBzZXJ2ZXIgbmFtZSBleHRlbnNpb246ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5ob3N0bmFtZSApICk7CisKKyAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggKCAoc3NsLT5ob3N0bmFtZV9sZW4gKyA5KSA+PiA4ICkgJiAweEZGICk7CisgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoICggKHNzbC0+aG9zdG5hbWVfbGVuICsgOSkgICAgICApICYgMHhGRiApOworCisgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoICggVExTX0VYVF9TRVJWRVJOQU1FID4+IDggKSAmIDB4RkYgKTsKKyAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggKCBUTFNfRVhUX1NFUlZFUk5BTUUgICAgICApICYgMHhGRiApOworCisgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoICggKHNzbC0+aG9zdG5hbWVfbGVuICsgNSkgPj4gOCApICYgMHhGRiApOworICAgICAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpKCAoIChzc2wtPmhvc3RuYW1lX2xlbiArIDUpICAgICAgKSAmIDB4RkYgKTsKKworICAgICAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpKCAoIChzc2wtPmhvc3RuYW1lX2xlbiArIDMpID4+IDggKSAmIDB4RkYgKTsKKyAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggKCAoc3NsLT5ob3N0bmFtZV9sZW4gKyAzKSAgICAgICkgJiAweEZGICk7CisKKyAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggKCBUTFNfRVhUX1NFUlZFUk5BTUVfSE9TVE5BTUUgKSAmIDB4RkYgKTsKKyAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggKCBzc2wtPmhvc3RuYW1lX2xlbiA+PiA4ICkgJiAweEZGICk7CisgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoICggc3NsLT5ob3N0bmFtZV9sZW4gICAgICApICYgMHhGRiApOworCisgICAgICAgIG1lbWNweSggcCwgc3NsLT5ob3N0bmFtZSwgc3NsLT5ob3N0bmFtZV9sZW4gKTsKKworICAgICAgICBwICs9IHNzbC0+aG9zdG5hbWVfbGVuOworICAgIH0KKworICAgIHNzbC0+b3V0X21zZ2xlbiAgPSBwIC0gYnVmOworICAgIHNzbC0+b3V0X21zZ3R5cGUgPSBTU0xfTVNHX0hBTkRTSEFLRTsKKyAgICBzc2wtPm91dF9tc2dbMF0gID0gU1NMX0hTX0NMSUVOVF9IRUxMTzsKKworICAgIHNzbC0+c3RhdGUrKzsKKworICAgIGlmKCAoIHJldCA9IHNzbF93cml0ZV9yZWNvcmQoIHNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX3dyaXRlX3JlY29yZCIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IHdyaXRlIGNsaWVudCBoZWxsbyIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKK3N0YXRpYyBpbnQgc3NsX3BhcnNlX3NlcnZlcl9oZWxsbyggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgdGltZV90IHQ7CisgICAgaW50IHJldCwgaSwgbjsKKyAgICBpbnQgZXh0X2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpidWY7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiBwYXJzZSBzZXJ2ZXIgaGVsbG8iICkgKTsKKworICAgIC8qCisgICAgICogICAgIDAgIC4gICAwICAgaGFuZHNoYWtlIHR5cGUKKyAgICAgKiAgICAgMSAgLiAgIDMgICBoYW5kc2hha2UgbGVuZ3RoCisgICAgICogICAgIDQgIC4gICA1ICAgcHJvdG9jb2wgdmVyc2lvbgorICAgICAqICAgICA2ICAuICAgOSAgIFVOSVggdGltZSgpCisgICAgICogICAgMTAgIC4gIDM3ICAgcmFuZG9tIGJ5dGVzCisgICAgICovCisgICAgYnVmID0gc3NsLT5pbl9tc2c7CisKKyAgICBpZiggKCByZXQgPSBzc2xfcmVhZF9yZWNvcmQoIHNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX3JlYWRfcmVjb3JkIiwgcmV0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+aW5fbXNndHlwZSAhPSBTU0xfTVNHX0hBTkRTSEFLRSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgc2VydmVyIGhlbGxvIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX1VORVhQRUNURURfTUVTU0FHRSApOworICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDMsICggInNlcnZlciBoZWxsbywgY2hvc2VuIHZlcnNpb246IFslZDolZF0iLAorICAgICAgICAgICAgICAgICAgIGJ1Zls0XSwgYnVmWzVdICkgKTsKKworICAgIGlmKCBzc2wtPmluX2hzbGVuIDwgNDIgfHwKKyAgICAgICAgYnVmWzBdICE9IFNTTF9IU19TRVJWRVJfSEVMTE8gfHwKKyAgICAgICAgYnVmWzRdICE9IFNTTF9NQUpPUl9WRVJTSU9OXzMgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIHNlcnZlciBoZWxsbyBtZXNzYWdlIiApICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfU0VSVkVSX0hFTExPICk7CisgICAgfQorCisgICAgaWYoIGJ1Zls1XSAhPSBTU0xfTUlOT1JfVkVSU0lPTl8wICYmCisgICAgICAgIGJ1Zls1XSAhPSBTU0xfTUlOT1JfVkVSU0lPTl8xICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBzZXJ2ZXIgaGVsbG8gbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX1NFUlZFUl9IRUxMTyApOworICAgIH0KKworICAgIHNzbC0+bWlub3JfdmVyID0gYnVmWzVdOworCisgICAgdCA9ICggKHRpbWVfdCkgYnVmWzZdIDw8IDI0ICkKKyAgICAgIHwgKCAodGltZV90KSBidWZbN10gPDwgMTYgKQorICAgICAgfCAoICh0aW1lX3QpIGJ1Zls4XSA8PCAgOCApCisgICAgICB8ICggKHRpbWVfdCkgYnVmWzldICAgICAgICk7CisKKyAgICBtZW1jcHkoIHNzbC0+cmFuZGJ5dGVzICsgMzIsIGJ1ZiArIDYsIDMyICk7CisKKyAgICBuID0gYnVmWzM4XTsKKworICAgIFNTTF9ERUJVR19NU0coIDMsICggInNlcnZlciBoZWxsbywgY3VycmVudCB0aW1lOiAlbHUiLCB0ICkgKTsKKyAgICBTU0xfREVCVUdfQlVGKCAzLCAgICJzZXJ2ZXIgaGVsbG8sIHJhbmRvbSBieXRlcyIsIGJ1ZiArIDYsIDMyICk7CisKKyAgICAvKgorICAgICAqICAgIDM4ICAuICAzOCAgIHNlc3Npb24gaWQgbGVuZ3RoCisgICAgICogICAgMzkgIC4gMzgrbiAgc2Vzc2lvbiBpZAorICAgICAqICAgMzkrbiAuIDQwK24gIGNob3NlbiBjaXBoZXIKKyAgICAgKiAgIDQxK24gLiA0MStuICBjaG9zZW4gY29tcHJlc3Npb24gYWxnLgorICAgICAqICAgNDIrbiAuIDQzK24gIGV4dGVuc2lvbnMgbGVuZ3RoCisgICAgICogICA0NCtuIC4gNDQrbittIGV4dGVuc2lvbnMKKyAgICAgKi8KKyAgICBpZiggbiA8IDAgfHwgbiA+IDMyIHx8IHNzbC0+aW5faHNsZW4gPiA0MiArIG4gKQorICAgIHsKKyAgICAgICAgZXh0X2xlbiA9ICggKCBidWZbNDIgKyBuXSA8PCAgOCApCisgICAgICAgICAgICAgICAgICB8ICggYnVmWzQzICsgbl0gICAgICAgKSApICsgMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXh0X2xlbiA9IDA7CisgICAgfQorCisgICAgaWYoIG4gPCAwIHx8IG4gPiAzMiB8fCBzc2wtPmluX2hzbGVuICE9IDQyICsgbiArIGV4dF9sZW4gKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIHNlcnZlciBoZWxsbyBtZXNzYWdlIiApICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfU0VSVkVSX0hFTExPICk7CisgICAgfQorCisgICAgaSA9ICggYnVmWzM5ICsgbl0gPDwgOCApIHwgYnVmWzQwICsgbl07CisKKyAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJzZXJ2ZXIgaGVsbG8sIHNlc3Npb24gaWQgbGVuLjogJWQiLCBuICkgKTsKKyAgICBTU0xfREVCVUdfQlVGKCAzLCAgICJzZXJ2ZXIgaGVsbG8sIHNlc3Npb24gaWQiLCBidWYgKyAzOSwgbiApOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgc2Vzc2lvbiBjYW4gYmUgcmVzdW1lZAorICAgICAqLworICAgIGlmKCBzc2wtPnJlc3VtZSA9PSAwIHx8IG4gPT0gMCB8fAorICAgICAgICBzc2wtPnNlc3Npb24tPmNpcGhlciAgIT0gaSB8fAorICAgICAgICBzc2wtPnNlc3Npb24tPmxlbmd0aCAgIT0gbiB8fAorICAgICAgICBtZW1jbXAoIHNzbC0+c2Vzc2lvbi0+aWQsIGJ1ZiArIDM5LCBuICkgIT0gMCApCisgICAgeworICAgICAgICBzc2wtPnN0YXRlKys7CisgICAgICAgIHNzbC0+cmVzdW1lID0gMDsKKyAgICAgICAgc3NsLT5zZXNzaW9uLT5zdGFydCA9IHRpbWUoIE5VTEwgKTsKKyAgICAgICAgc3NsLT5zZXNzaW9uLT5jaXBoZXIgPSBpOworICAgICAgICBzc2wtPnNlc3Npb24tPmxlbmd0aCA9IG47CisgICAgICAgIG1lbWNweSggc3NsLT5zZXNzaW9uLT5pZCwgYnVmICsgMzksIG4gKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3NsLT5zdGF0ZSA9IFNTTF9TRVJWRVJfQ0hBTkdFX0NJUEhFUl9TUEVDOworICAgICAgICBzc2xfZGVyaXZlX2tleXMoIHNzbCApOworICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDMsICggIiVzIHNlc3Npb24gaGFzIGJlZW4gcmVzdW1lZCIsCisgICAgICAgICAgICAgICAgICAgc3NsLT5yZXN1bWUgPyAiYSIgOiAibm8iICkgKTsKKworICAgIFNTTF9ERUJVR19NU0coIDMsICggInNlcnZlciBoZWxsbywgY2hvc2VuIGNpcGhlcjogJWQiLCBpICkgKTsKKyAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJzZXJ2ZXIgaGVsbG8sIGNvbXByZXNzIGFsZy46ICVkIiwgYnVmWzQxICsgbl0gKSApOworCisgICAgaSA9IDA7CisgICAgd2hpbGUoIDEgKQorICAgIHsKKyAgICAgICAgaWYoIHNzbC0+Y2lwaGVyc1tpXSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIHNlcnZlciBoZWxsbyBtZXNzYWdlIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX1NFUlZFUl9IRUxMTyApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNzbC0+Y2lwaGVyc1tpKytdID09IHNzbC0+c2Vzc2lvbi0+Y2lwaGVyICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmKCBidWZbNDEgKyBuXSAhPSBTU0xfQ09NUFJFU1NfTlVMTCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgc2VydmVyIGhlbGxvIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19TRVJWRVJfSEVMTE8gKTsKKyAgICB9CisKKyAgICAvKiBUT0RPOiBQcm9jZXNzIGV4dGVuc2lvbnMgKi8KKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IHBhcnNlIHNlcnZlciBoZWxsbyIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKK3N0YXRpYyBpbnQgc3NsX3BhcnNlX3NlcnZlcl9rZXlfZXhjaGFuZ2UoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCByZXQsIG47CisgICAgdW5zaWduZWQgY2hhciAqcCwgKmVuZDsKKyAgICB1bnNpZ25lZCBjaGFyIGhhc2hbMzZdOworICAgIG1kNV9jb250ZXh0IG1kNTsKKyAgICBzaGExX2NvbnRleHQgc2hhMTsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IHBhcnNlIHNlcnZlciBrZXkgZXhjaGFuZ2UiICkgKTsKKworICAgIGlmKCBzc2wtPnNlc3Npb24tPmNpcGhlciAhPSBTU0xfRURIX1JTQV9ERVNfMTY4X1NIQSAmJgorICAgICAgICBzc2wtPnNlc3Npb24tPmNpcGhlciAhPSBTU0xfRURIX1JTQV9BRVNfMjU2X1NIQSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBza2lwIHBhcnNlIHNlcnZlciBrZXkgZXhjaGFuZ2UiICkgKTsKKyAgICAgICAgc3NsLT5zdGF0ZSsrOworICAgICAgICByZXR1cm4oIDAgKTsKKyAgICB9CisKKyNpZiAhZGVmaW5lZChYWVNTTF9ESE1fQykKKyAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJzdXBwb3J0IGZvciBkaG0gaW4gbm90IGF2YWlsYWJsZSIgKSApOworICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9GRUFUVVJFX1VOQVZBSUxBQkxFICk7CisjZWxzZQorICAgIGlmKCAoIHJldCA9IHNzbF9yZWFkX3JlY29yZCggc3NsICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfcmVhZF9yZWNvcmQiLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBpZiggc3NsLT5pbl9tc2d0eXBlICE9IFNTTF9NU0dfSEFORFNIQUtFICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBzZXJ2ZXIga2V5IGV4Y2hhbmdlIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX1VORVhQRUNURURfTUVTU0FHRSApOworICAgIH0KKworICAgIGlmKCBzc2wtPmluX21zZ1swXSAhPSBTU0xfSFNfU0VSVkVSX0tFWV9FWENIQU5HRSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgc2VydmVyIGtleSBleGNoYW5nZSBtZXNzYWdlIiApICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfU0VSVkVSX0tFWV9FWENIQU5HRSApOworICAgIH0KKworICAgIC8qCisgICAgICogRXBoZW1lcmFsIERIIHBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiBzdHJ1Y3QgeworICAgICAqICAgICBvcGFxdWUgZGhfcDwxLi4yXjE2LTE+OworICAgICAqICAgICBvcGFxdWUgZGhfZzwxLi4yXjE2LTE+OworICAgICAqICAgICBvcGFxdWUgZGhfWXM8MS4uMl4xNi0xPjsKKyAgICAgKiB9IFNlcnZlckRIUGFyYW1zOworICAgICAqLworICAgIHAgICA9IHNzbC0+aW5fbXNnICsgNDsKKyAgICBlbmQgPSBzc2wtPmluX21zZyArIHNzbC0+aW5faHNsZW47CisKKyAgICBpZiggKCByZXQgPSBkaG1fcmVhZF9wYXJhbXMoICZzc2wtPmRobV9jdHgsICZwLCBlbmQgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIHNlcnZlciBrZXkgZXhjaGFuZ2UgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX1NFUlZFUl9LRVlfRVhDSEFOR0UgKTsKKyAgICB9CisKKyAgICBpZiggKGludCkoIGVuZCAtIHAgKSAhPSBzc2wtPnBlZXJfY2VydC0+cnNhLmxlbiApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgc2VydmVyIGtleSBleGNoYW5nZSBtZXNzYWdlIiApICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfU0VSVkVSX0tFWV9FWENIQU5HRSApOworICAgIH0KKworICAgIGlmKCBzc2wtPmRobV9jdHgubGVuIDwgNjQgfHwgc3NsLT5kaG1fY3R4LmxlbiA+IDI1NiApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgc2VydmVyIGtleSBleGNoYW5nZSBtZXNzYWdlIiApICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfU0VSVkVSX0tFWV9FWENIQU5HRSApOworICAgIH0KKworICAgIFNTTF9ERUJVR19NUEkoIDMsICJESE06IFAgIiwgJnNzbC0+ZGhtX2N0eC5QICApOworICAgIFNTTF9ERUJVR19NUEkoIDMsICJESE06IEcgIiwgJnNzbC0+ZGhtX2N0eC5HICApOworICAgIFNTTF9ERUJVR19NUEkoIDMsICJESE06IEdZIiwgJnNzbC0+ZGhtX2N0eC5HWSApOworCisgICAgLyoKKyAgICAgKiBkaWdpdGFsbHktc2lnbmVkIHN0cnVjdCB7CisgICAgICogICAgIG9wYXF1ZSBtZDVfaGFzaFsxNl07CisgICAgICogICAgIG9wYXF1ZSBzaGFfaGFzaFsyMF07CisgICAgICogfTsKKyAgICAgKgorICAgICAqIG1kNV9oYXNoCisgICAgICogICAgIE1ENShDbGllbnRIZWxsby5yYW5kb20gKyBTZXJ2ZXJIZWxsby5yYW5kb20KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNlcnZlclBhcmFtcyk7CisgICAgICogc2hhX2hhc2gKKyAgICAgKiAgICAgU0hBKENsaWVudEhlbGxvLnJhbmRvbSArIFNlcnZlckhlbGxvLnJhbmRvbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU2VydmVyUGFyYW1zKTsKKyAgICAgKi8KKyAgICBuID0gc3NsLT5pbl9oc2xlbiAtICggZW5kIC0gcCApIC0gNjsKKworICAgIG1kNV9zdGFydHMoICZtZDUgKTsKKyAgICBtZDVfdXBkYXRlKCAmbWQ1LCBzc2wtPnJhbmRieXRlcywgNjQgKTsKKyAgICBtZDVfdXBkYXRlKCAmbWQ1LCBzc2wtPmluX21zZyArIDQsIG4gKTsKKyAgICBtZDVfZmluaXNoKCAmbWQ1LCBoYXNoICk7CisKKyAgICBzaGExX3N0YXJ0cyggJnNoYTEgKTsKKyAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHNzbC0+cmFuZGJ5dGVzLCA2NCApOworICAgIHNoYTFfdXBkYXRlKCAmc2hhMSwgc3NsLT5pbl9tc2cgKyA0LCBuICk7CisgICAgc2hhMV9maW5pc2goICZzaGExLCBoYXNoICsgMTYgKTsKKworICAgIFNTTF9ERUJVR19CVUYoIDMsICJwYXJhbWV0ZXJzIGhhc2giLCBoYXNoLCAzNiApOworCisgICAgaWYoICggcmV0ID0gcnNhX3BrY3MxX3ZlcmlmeSggJnNzbC0+cGVlcl9jZXJ0LT5yc2EsIFJTQV9QVUJMSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBX1JBVywgMzYsIGhhc2gsIHAgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInJzYV9wa2NzMV92ZXJpZnkiLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBzc2wtPnN0YXRlKys7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBwYXJzZSBzZXJ2ZXIga2V5IGV4Y2hhbmdlIiApICk7CisKKyAgICByZXR1cm4oIDAgKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHNzbF9wYXJzZV9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgcmV0OworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPT4gcGFyc2UgY2VydGlmaWNhdGUgcmVxdWVzdCIgKSApOworCisgICAgLyoKKyAgICAgKiAgICAgMCAgLiAgIDAgICBoYW5kc2hha2UgdHlwZQorICAgICAqICAgICAxICAuICAgMyAgIGhhbmRzaGFrZSBsZW5ndGgKKyAgICAgKiAgICAgNCAgLiAgIDUgICBTU0wgdmVyc2lvbgorICAgICAqICAgICA2ICAuICAgNiAgIGNlcnQgdHlwZSBjb3VudAorICAgICAqICAgICA3ICAuLiBuLTEgIGNlcnQgdHlwZXMKKyAgICAgKiAgICAgbiAgLi4gbisxICBsZW5ndGggb2YgYWxsIEROcworICAgICAqICAgIG4rMiAuLiBuKzMgIGxlbmd0aCBvZiBETiAxCisgICAgICogICAgbis0IC4uIC4uLiAgRGlzdGluZ3Vpc2hlZCBOYW1lICMxCisgICAgICogICAgLi4uIC4uIC4uLiAgbGVuZ3RoIG9mIEROIDIsIGV0Yy4KKyAgICAgKi8KKyAgICBpZiggKCByZXQgPSBzc2xfcmVhZF9yZWNvcmQoIHNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX3JlYWRfcmVjb3JkIiwgcmV0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+aW5fbXNndHlwZSAhPSBTU0xfTVNHX0hBTkRTSEFLRSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2VydGlmaWNhdGUgcmVxdWVzdCBtZXNzYWdlIiApICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9VTkVYUEVDVEVEX01FU1NBR0UgKTsKKyAgICB9CisKKyAgICBzc2wtPmNsaWVudF9hdXRoID0gMDsKKyAgICBzc2wtPnN0YXRlKys7CisKKyAgICBpZiggc3NsLT5pbl9tc2dbMF0gPT0gU1NMX0hTX0NFUlRJRklDQVRFX1JFUVVFU1QgKQorICAgICAgICBzc2wtPmNsaWVudF9hdXRoKys7CisKKyAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJnb3QgJXMgY2VydGlmaWNhdGUgcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmNsaWVudF9hdXRoID8gImEiIDogIm5vIiApICk7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBwYXJzZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IiApICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworc3RhdGljIGludCBzc2xfcGFyc2Vfc2VydmVyX2hlbGxvX2RvbmUoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCByZXQ7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiBwYXJzZSBzZXJ2ZXIgaGVsbG8gZG9uZSIgKSApOworCisgICAgaWYoIHNzbC0+Y2xpZW50X2F1dGggIT0gMCApCisgICAgeworICAgICAgICBpZiggKCByZXQgPSBzc2xfcmVhZF9yZWNvcmQoIHNzbCApICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfcmVhZF9yZWNvcmQiLCByZXQgKTsKKyAgICAgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggc3NsLT5pbl9tc2d0eXBlICE9IFNTTF9NU0dfSEFORFNIQUtFICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIHNlcnZlciBoZWxsbyBkb25lIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9VTkVYUEVDVEVEX01FU1NBR0UgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBzc2wtPmluX2hzbGVuICAhPSA0IHx8CisgICAgICAgIHNzbC0+aW5fbXNnWzBdICE9IFNTTF9IU19TRVJWRVJfSEVMTE9fRE9ORSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgc2VydmVyIGhlbGxvIGRvbmUgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX1NFUlZFUl9IRUxMT19ET05FICk7CisgICAgfQorCisgICAgc3NsLT5zdGF0ZSsrOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gcGFyc2Ugc2VydmVyIGhlbGxvIGRvbmUiICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCitzdGF0aWMgaW50IHNzbF93cml0ZV9jbGllbnRfa2V5X2V4Y2hhbmdlKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgcmV0LCBpLCBuOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPT4gd3JpdGUgY2xpZW50IGtleSBleGNoYW5nZSIgKSApOworCisgICAgaWYoIHNzbC0+c2Vzc2lvbi0+Y2lwaGVyID09IFNTTF9FREhfUlNBX0RFU18xNjhfU0hBIHx8CisgICAgICAgIHNzbC0+c2Vzc2lvbi0+Y2lwaGVyID09IFNTTF9FREhfUlNBX0FFU18yNTZfU0hBICkKKyAgICB7CisjaWYgIWRlZmluZWQoWFlTU0xfREhNX0MpCisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggInN1cHBvcnQgZm9yIGRobSBpbiBub3QgYXZhaWxhYmxlIiApICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9GRUFUVVJFX1VOQVZBSUxBQkxFICk7CisjZWxzZQorICAgICAgICAvKgorICAgICAgICAgKiBESE0ga2V5IGV4Y2hhbmdlIC0tIHNlbmQgR15YIG1vZCBQCisgICAgICAgICAqLworICAgICAgICBuID0gc3NsLT5kaG1fY3R4LmxlbjsKKworICAgICAgICBzc2wtPm91dF9tc2dbNF0gPSAodW5zaWduZWQgY2hhcikoIG4gPj4gOCApOworICAgICAgICBzc2wtPm91dF9tc2dbNV0gPSAodW5zaWduZWQgY2hhcikoIG4gICAgICApOworICAgICAgICBpID0gNjsKKworICAgICAgICByZXQgPSBkaG1fbWFrZV9wdWJsaWMoICZzc2wtPmRobV9jdHgsIDI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3NsLT5vdXRfbXNnW2ldLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmZfcm5nLCBzc2wtPnBfcm5nICk7CisgICAgICAgIGlmKCByZXQgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJkaG1fbWFrZV9wdWJsaWMiLCByZXQgKTsKKyAgICAgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgICAgIH0KKworICAgICAgICBTU0xfREVCVUdfTVBJKCAzLCAiREhNOiBYICIsICZzc2wtPmRobV9jdHguWCAgKTsKKyAgICAgICAgU1NMX0RFQlVHX01QSSggMywgIkRITTogR1giLCAmc3NsLT5kaG1fY3R4LkdYICk7CisKKyAgICAgICAgc3NsLT5wbXNsZW4gPSBzc2wtPmRobV9jdHgubGVuOworCisgICAgICAgIGlmKCAoIHJldCA9IGRobV9jYWxjX3NlY3JldCggJnNzbC0+ZGhtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5wcmVtYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNzbC0+cG1zbGVuICkgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgImRobV9jYWxjX3NlY3JldCIsIHJldCApOworICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIFNTTF9ERUJVR19NUEkoIDMsICJESE06IEsgIiwgJnNzbC0+ZGhtX2N0eC5LICApOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJTQSBrZXkgZXhjaGFuZ2UgLS0gc2VuZCByc2FfcHVibGljKHBrY3MxIHYxLjUocHJlbWFzdGVyKSkKKyAgICAgICAgICovCisgICAgICAgIHNzbC0+cHJlbWFzdGVyWzBdID0gKHVuc2lnbmVkIGNoYXIpIHNzbC0+bWF4X21ham9yX3ZlcjsKKyAgICAgICAgc3NsLT5wcmVtYXN0ZXJbMV0gPSAodW5zaWduZWQgY2hhcikgc3NsLT5tYXhfbWlub3JfdmVyOworICAgICAgICBzc2wtPnBtc2xlbiA9IDQ4OworCisgICAgICAgIGZvciggaSA9IDI7IGkgPCBzc2wtPnBtc2xlbjsgaSsrICkKKyAgICAgICAgICAgIHNzbC0+cHJlbWFzdGVyW2ldID0gKHVuc2lnbmVkIGNoYXIpIHNzbC0+Zl9ybmcoIHNzbC0+cF9ybmcgKTsKKworICAgICAgICBpID0gNDsKKyAgICAgICAgbiA9IHNzbC0+cGVlcl9jZXJ0LT5yc2EubGVuOworCisgICAgICAgIGlmKCBzc2wtPm1pbm9yX3ZlciAhPSBTU0xfTUlOT1JfVkVSU0lPTl8wICkKKyAgICAgICAgeworICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgc3NsLT5vdXRfbXNnWzRdID0gKHVuc2lnbmVkIGNoYXIpKCBuID4+IDggKTsKKyAgICAgICAgICAgIHNzbC0+b3V0X21zZ1s1XSA9ICh1bnNpZ25lZCBjaGFyKSggbiAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSByc2FfcGtjczFfZW5jcnlwdCggJnNzbC0+cGVlcl9jZXJ0LT5yc2EsIFJTQV9QVUJMSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5wbXNsZW4sIHNzbC0+cHJlbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+b3V0X21zZyArIGkgKTsKKyAgICAgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInJzYV9wa2NzMV9lbmNyeXB0IiwgcmV0ICk7CisgICAgICAgICAgICByZXR1cm4oIHJldCApOworICAgICAgICB9CisgICAgfQorCisgICAgc3NsX2Rlcml2ZV9rZXlzKCBzc2wgKTsKKworICAgIHNzbC0+b3V0X21zZ2xlbiAgPSBpICsgbjsKKyAgICBzc2wtPm91dF9tc2d0eXBlID0gU1NMX01TR19IQU5EU0hBS0U7CisgICAgc3NsLT5vdXRfbXNnWzBdICA9IFNTTF9IU19DTElFTlRfS0VZX0VYQ0hBTkdFOworCisgICAgc3NsLT5zdGF0ZSsrOworCisgICAgaWYoICggcmV0ID0gc3NsX3dyaXRlX3JlY29yZCggc3NsICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfd3JpdGVfcmVjb3JkIiwgcmV0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gd3JpdGUgY2xpZW50IGtleSBleGNoYW5nZSIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKK3N0YXRpYyBpbnQgc3NsX3dyaXRlX2NlcnRpZmljYXRlX3ZlcmlmeSggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgaW50IHJldCwgbjsKKyAgICB1bnNpZ25lZCBjaGFyIGhhc2hbMzZdOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPT4gd3JpdGUgY2VydGlmaWNhdGUgdmVyaWZ5IiApICk7CisKKyAgICBpZiggc3NsLT5jbGllbnRfYXV0aCA9PSAwICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IHNraXAgd3JpdGUgY2VydGlmaWNhdGUgdmVyaWZ5IiApICk7CisgICAgICAgIHNzbC0+c3RhdGUrKzsKKyAgICAgICAgcmV0dXJuKCAwICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+cnNhX2tleSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImdvdCBubyBwcml2YXRlIGtleSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfUFJJVkFURV9LRVlfUkVRVUlSRUQgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE1ha2UgYW4gUlNBIHNpZ25hdHVyZSBvZiB0aGUgaGFuZHNoYWtlIGRpZ2VzdHMKKyAgICAgKi8KKyAgICBzc2xfY2FsY192ZXJpZnkoIHNzbCwgaGFzaCApOworCisgICAgbiA9IHNzbC0+cnNhX2tleS0+bGVuOworICAgIHNzbC0+b3V0X21zZ1s0XSA9ICh1bnNpZ25lZCBjaGFyKSggbiA+PiA4ICk7CisgICAgc3NsLT5vdXRfbXNnWzVdID0gKHVuc2lnbmVkIGNoYXIpKCBuICAgICAgKTsKKworICAgIGlmKCAoIHJldCA9IHJzYV9wa2NzMV9zaWduKCBzc2wtPnJzYV9rZXksIFJTQV9QUklWQVRFLCBSU0FfUkFXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwgaGFzaCwgc3NsLT5vdXRfbXNnICsgNiApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAicnNhX3BrY3MxX3NpZ24iLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBzc2wtPm91dF9tc2dsZW4gID0gNiArIG47CisgICAgc3NsLT5vdXRfbXNndHlwZSA9IFNTTF9NU0dfSEFORFNIQUtFOworICAgIHNzbC0+b3V0X21zZ1swXSAgPSBTU0xfSFNfQ0VSVElGSUNBVEVfVkVSSUZZOworCisgICAgc3NsLT5zdGF0ZSsrOworCisgICAgaWYoICggcmV0ID0gc3NsX3dyaXRlX3JlY29yZCggc3NsICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfd3JpdGVfcmVjb3JkIiwgcmV0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gd3JpdGUgY2VydGlmaWNhdGUgdmVyaWZ5IiApICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIFNTTCBoYW5kc2hha2UgLS0gY2xpZW50IHNpZGUKKyAqLworaW50IHNzbF9oYW5kc2hha2VfY2xpZW50KCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IGhhbmRzaGFrZSBjbGllbnQiICkgKTsKKworICAgIHdoaWxlKCBzc2wtPnN0YXRlICE9IFNTTF9IQU5EU0hBS0VfT1ZFUiApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAyLCAoICJjbGllbnQgc3RhdGU6ICVkIiwgc3NsLT5zdGF0ZSApICk7CisKKyAgICAgICAgaWYoICggcmV0ID0gc3NsX2ZsdXNoX291dHB1dCggc3NsICkgKSAhPSAwICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHN3aXRjaCggc3NsLT5zdGF0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU1NMX0hFTExPX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgc3NsLT5zdGF0ZSA9IFNTTF9DTElFTlRfSEVMTE87CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgPT0+ICAgQ2xpZW50SGVsbG8KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2FzZSBTU0xfQ0xJRU5UX0hFTExPOgorICAgICAgICAgICAgICAgIHJldCA9IHNzbF93cml0ZV9jbGllbnRfaGVsbG8oIHNzbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIDw9PSAgIFNlcnZlckhlbGxvCisgICAgICAgICAgICAgKiAgICAgICAgQ2VydGlmaWNhdGUKKyAgICAgICAgICAgICAqICAgICAgKCBTZXJ2ZXJLZXlFeGNoYW5nZSAgKQorICAgICAgICAgICAgICogICAgICAoIENlcnRpZmljYXRlUmVxdWVzdCApCisgICAgICAgICAgICAgKiAgICAgICAgU2VydmVySGVsbG9Eb25lCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNhc2UgU1NMX1NFUlZFUl9IRUxMTzoKKyAgICAgICAgICAgICAgICByZXQgPSBzc2xfcGFyc2Vfc2VydmVyX2hlbGxvKCBzc2wgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTU0xfU0VSVkVSX0NFUlRJRklDQVRFOgorICAgICAgICAgICAgICAgIHJldCA9IHNzbF9wYXJzZV9jZXJ0aWZpY2F0ZSggc3NsICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1NMX1NFUlZFUl9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3BhcnNlX3NlcnZlcl9rZXlfZXhjaGFuZ2UoIHNzbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNTTF9DRVJUSUZJQ0FURV9SRVFVRVNUOgorICAgICAgICAgICAgICAgIHJldCA9IHNzbF9wYXJzZV9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KCBzc2wgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTU0xfU0VSVkVSX0hFTExPX0RPTkU6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3BhcnNlX3NlcnZlcl9oZWxsb19kb25lKCBzc2wgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICA9PT4gKCBDZXJ0aWZpY2F0ZS9BbGVydCAgKQorICAgICAgICAgICAgICogICAgICAgIENsaWVudEtleUV4Y2hhbmdlCisgICAgICAgICAgICAgKiAgICAgICggQ2VydGlmaWNhdGVWZXJpZnkgICkKKyAgICAgICAgICAgICAqICAgICAgICBDaGFuZ2VDaXBoZXJTcGVjCisgICAgICAgICAgICAgKiAgICAgICAgRmluaXNoZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2FzZSBTU0xfQ0xJRU5UX0NFUlRJRklDQVRFOgorICAgICAgICAgICAgICAgIHJldCA9IHNzbF93cml0ZV9jZXJ0aWZpY2F0ZSggc3NsICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1NMX0NMSUVOVF9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3dyaXRlX2NsaWVudF9rZXlfZXhjaGFuZ2UoIHNzbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNTTF9DRVJUSUZJQ0FURV9WRVJJRlk6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3dyaXRlX2NlcnRpZmljYXRlX3ZlcmlmeSggc3NsICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1NMX0NMSUVOVF9DSEFOR0VfQ0lQSEVSX1NQRUM6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3dyaXRlX2NoYW5nZV9jaXBoZXJfc3BlYyggc3NsICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1NMX0NMSUVOVF9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICByZXQgPSBzc2xfd3JpdGVfZmluaXNoZWQoIHNzbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIDw9PSAgIENoYW5nZUNpcGhlclNwZWMKKyAgICAgICAgICAgICAqICAgICAgICBGaW5pc2hlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYXNlIFNTTF9TRVJWRVJfQ0hBTkdFX0NJUEhFUl9TUEVDOgorICAgICAgICAgICAgICAgIHJldCA9IHNzbF9wYXJzZV9jaGFuZ2VfY2lwaGVyX3NwZWMoIHNzbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNTTF9TRVJWRVJfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3BhcnNlX2ZpbmlzaGVkKCBzc2wgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTU0xfRkxVU0hfQlVGRkVSUzoKKyAgICAgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAyLCAoICJoYW5kc2hha2U6IGRvbmUiICkgKTsKKyAgICAgICAgICAgICAgICBzc2wtPnN0YXRlID0gU1NMX0hBTkRTSEFLRV9PVkVSOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImludmFsaWQgc3RhdGUgJWQiLCBzc2wtPnN0YXRlICkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0lOUFVUX0RBVEEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCByZXQgIT0gMCApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBoYW5kc2hha2UgY2xpZW50IiApICk7CisKKyAgICByZXR1cm4oIHJldCApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnJhcnkvc3NsX3Nydi5jIGIvbGlicmFyeS9zc2xfc3J2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkZDY2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnJhcnkvc3NsX3Nydi5jCkBAIC0wLDAgKzEsOTMwIEBACisvKgorICogIFNTTHYzL1RMU3YxIHNlcnZlci1zaWRlIGZ1bmN0aW9ucworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChYWVNTTF9TU0xfU1JWX0MpCisKKyNpbmNsdWRlICJ4eXNzbC9kZWJ1Zy5oIgorI2luY2x1ZGUgInh5c3NsL3NzbC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0YXRpYyBpbnQgc3NsX3BhcnNlX2NsaWVudF9oZWxsbyggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgaW50IHJldCwgaSwgaiwgbjsKKyAgICBpbnQgY2lwaF9sZW4sIHNlc3NfbGVuOworICAgIGludCBjaGFsX2xlbiwgY29tcF9sZW47CisgICAgdW5zaWduZWQgY2hhciAqYnVmLCAqcDsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IHBhcnNlIGNsaWVudCBoZWxsbyIgKSApOworCisgICAgaWYoICggcmV0ID0gc3NsX2ZldGNoX2lucHV0KCBzc2wsIDUgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF9mZXRjaF9pbnB1dCIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIGJ1ZiA9IHNzbC0+aW5faGRyOworCisgICAgaWYoICggYnVmWzBdICYgMHg4MCApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX0JVRiggNCwgInJlY29yZCBoZWFkZXIiLCBidWYsIDUgKTsKKworICAgICAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJjbGllbnQgaGVsbG8gdjIsIG1lc3NhZ2UgdHlwZTogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBidWZbMl0gKSApOworICAgICAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJjbGllbnQgaGVsbG8gdjIsIG1lc3NhZ2UgbGVuLjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAoICggYnVmWzBdICYgMHg3RiApIDw8IDggKSB8IGJ1ZlsxXSApICk7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDMsICggImNsaWVudCBoZWxsbyB2MiwgbWF4LiB2ZXJzaW9uOiBbJWQ6JWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmWzNdLCBidWZbNF0gKSApOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNTTHYyIENsaWVudCBIZWxsbworICAgICAgICAgKgorICAgICAgICAgKiBSZWNvcmQgbGF5ZXI6CisgICAgICAgICAqICAgICAwICAuICAgMSAgIG1lc3NhZ2UgbGVuZ3RoCisgICAgICAgICAqCisgICAgICAgICAqIFNTTCBsYXllcjoKKyAgICAgICAgICogICAgIDIgIC4gICAyICAgbWVzc2FnZSB0eXBlCisgICAgICAgICAqICAgICAzICAuICAgNCAgIHByb3RvY29sIHZlcnNpb24KKyAgICAgICAgICovCisgICAgICAgIGlmKCBidWZbMl0gIT0gU1NMX0hTX0NMSUVOVF9IRUxMTyB8fAorICAgICAgICAgICAgYnVmWzNdICE9IFNTTF9NQUpPUl9WRVJTSU9OXzMgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2xpZW50IGhlbGxvIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfQ0xJRU5UX0hFTExPICk7CisgICAgICAgIH0KKworICAgICAgICBuID0gKCAoIGJ1ZlswXSA8PCA4ICkgfCBidWZbMV0gKSAmIDB4N0ZGRjsKKworICAgICAgICBpZiggbiA8IDE3IHx8IG4gPiA1MTIgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2xpZW50IGhlbGxvIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfQ0xJRU5UX0hFTExPICk7CisgICAgICAgIH0KKworICAgICAgICBzc2wtPm1heF9tYWpvcl92ZXIgPSBidWZbM107CisgICAgICAgIHNzbC0+bWF4X21pbm9yX3ZlciA9IGJ1Zls0XTsKKworICAgICAgICBzc2wtPm1ham9yX3ZlciA9IFNTTF9NQUpPUl9WRVJTSU9OXzM7CisgICAgICAgIHNzbC0+bWlub3JfdmVyID0gKCBidWZbNF0gPD0gU1NMX01JTk9SX1ZFUlNJT05fMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBidWZbNF0gIDogU1NMX01JTk9SX1ZFUlNJT05fMTsKKworICAgICAgICBpZiggKCByZXQgPSBzc2xfZmV0Y2hfaW5wdXQoIHNzbCwgMiArIG4gKSApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX2ZldGNoX2lucHV0IiwgcmV0ICk7CisgICAgICAgICAgICByZXR1cm4oIHJldCApOworICAgICAgICB9CisKKyAgICAgICAgIG1kNV91cGRhdGUoICZzc2wtPmZpbl9tZDUgLCBidWYgKyAyLCBuICk7CisgICAgICAgIHNoYTFfdXBkYXRlKCAmc3NsLT5maW5fc2hhMSwgYnVmICsgMiwgbiApOworCisgICAgICAgIGJ1ZiA9IHNzbC0+aW5fbXNnOworICAgICAgICBuID0gc3NsLT5pbl9sZWZ0IC0gNTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgICAwICAuICAgMSAgIGNpcGhlcmxpc3QgbGVuZ3RoCisgICAgICAgICAqICAgIDIgIC4gICAzICAgc2Vzc2lvbiBpZCBsZW5ndGgKKyAgICAgICAgICogICAgNCAgLiAgIDUgICBjaGFsbGVuZ2UgbGVuZ3RoCisgICAgICAgICAqICAgIDYgIC4gIC4uICAgY2lwaGVybGlzdAorICAgICAgICAgKiAgIC4uICAuICAuLiAgIHNlc3Npb24gaWQKKyAgICAgICAgICogICAuLiAgLiAgLi4gICBjaGFsbGVuZ2UKKyAgICAgICAgICovCisgICAgICAgIFNTTF9ERUJVR19CVUYoIDQsICJyZWNvcmQgY29udGVudHMiLCBidWYsIG4gKTsKKworICAgICAgICBjaXBoX2xlbiA9ICggYnVmWzBdIDw8IDggKSB8IGJ1ZlsxXTsKKyAgICAgICAgc2Vzc19sZW4gPSAoIGJ1ZlsyXSA8PCA4ICkgfCBidWZbM107CisgICAgICAgIGNoYWxfbGVuID0gKCBidWZbNF0gPDwgOCApIHwgYnVmWzVdOworCisgICAgICAgIFNTTF9ERUJVR19NU0coIDMsICggImNpcGhfbGVuOiAlZCwgc2Vzc19sZW46ICVkLCBjaGFsX2xlbjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBjaXBoX2xlbiwgc2Vzc19sZW4sIGNoYWxfbGVuICkgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYWtlIHN1cmUgZWFjaCBwYXJhbWV0ZXIgbGVuZ3RoIGlzIHZhbGlkCisgICAgICAgICAqLworICAgICAgICBpZiggY2lwaF9sZW4gPCAzIHx8ICggY2lwaF9sZW4gJSAzICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQgaGVsbG8gbWVzc2FnZSIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfSEVMTE8gKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzZXNzX2xlbiA8IDAgfHwgc2Vzc19sZW4gPiAzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQgaGVsbG8gbWVzc2FnZSIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfSEVMTE8gKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBjaGFsX2xlbiA8IDggfHwgY2hhbF9sZW4gPiAzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQgaGVsbG8gbWVzc2FnZSIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfSEVMTE8gKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBuICE9IDYgKyBjaXBoX2xlbiArIHNlc3NfbGVuICsgY2hhbF9sZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2xpZW50IGhlbGxvIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfQ0xJRU5UX0hFTExPICk7CisgICAgICAgIH0KKworICAgICAgICBTU0xfREVCVUdfQlVGKCAzLCAiY2xpZW50IGhlbGxvLCBjaXBoZXJsaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgNiwgIGNpcGhfbGVuICk7CisgICAgICAgIFNTTF9ERUJVR19CVUYoIDMsICJjbGllbnQgaGVsbG8sIHNlc3Npb24gaWQiLAorICAgICAgICAgICAgICAgICAgICAgICBidWYgKyA2ICsgY2lwaF9sZW4sICBzZXNzX2xlbiApOworICAgICAgICBTU0xfREVCVUdfQlVGKCAzLCAiY2xpZW50IGhlbGxvLCBjaGFsbGVuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICBidWYgKyA2ICsgY2lwaF9sZW4gKyBzZXNzX2xlbiwgIGNoYWxfbGVuICk7CisKKyAgICAgICAgcCA9IGJ1ZiArIDYgKyBjaXBoX2xlbjsKKyAgICAgICAgc3NsLT5zZXNzaW9uLT5sZW5ndGggPSBzZXNzX2xlbjsKKyAgICAgICAgbWVtc2V0KCBzc2wtPnNlc3Npb24tPmlkLCAwLCBzaXplb2YoIHNzbC0+c2Vzc2lvbi0+aWQgKSApOworICAgICAgICBtZW1jcHkoIHNzbC0+c2Vzc2lvbi0+aWQsIHAsIHNzbC0+c2Vzc2lvbi0+bGVuZ3RoICk7CisKKyAgICAgICAgcCArPSBzZXNzX2xlbjsKKyAgICAgICAgbWVtc2V0KCBzc2wtPnJhbmRieXRlcywgMCwgNjQgKTsKKyAgICAgICAgbWVtY3B5KCBzc2wtPnJhbmRieXRlcyArIDMyIC0gY2hhbF9sZW4sIHAsIGNoYWxfbGVuICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgc3NsLT5jaXBoZXJzW2ldICE9IDA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDAsIHAgPSBidWYgKyA2OyBqIDwgY2lwaF9sZW47IGogKz0gMywgcCArPSAzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggcFswXSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIHBbMV0gPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBwWzJdID09IHNzbC0+Y2lwaGVyc1tpXSApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gaGF2ZV9jaXBoZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX0JVRiggNCwgInJlY29yZCBoZWFkZXIiLCBidWYsIDUgKTsKKworICAgICAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJjbGllbnQgaGVsbG8gdjMsIG1lc3NhZ2UgdHlwZTogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBidWZbMF0gKSApOworICAgICAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJjbGllbnQgaGVsbG8gdjMsIG1lc3NhZ2UgbGVuLjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAoIGJ1ZlszXSA8PCA4ICkgfCBidWZbNF0gKSApOworICAgICAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJjbGllbnQgaGVsbG8gdjMsIHByb3RvY29sIHZlcjogWyVkOiVkXSIsCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlsxXSwgYnVmWzJdICkgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTU0x2MyBDbGllbnQgSGVsbG8KKyAgICAgICAgICoKKyAgICAgICAgICogUmVjb3JkIGxheWVyOgorICAgICAgICAgKiAgICAgMCAgLiAgIDAgICBtZXNzYWdlIHR5cGUKKyAgICAgICAgICogICAgIDEgIC4gICAyICAgcHJvdG9jb2wgdmVyc2lvbgorICAgICAgICAgKiAgICAgMyAgLiAgIDQgICBtZXNzYWdlIGxlbmd0aAorICAgICAgICAgKi8KKyAgICAgICAgaWYoIGJ1ZlswXSAhPSBTU0xfTVNHX0hBTkRTSEFLRSB8fAorICAgICAgICAgICAgYnVmWzFdICE9IFNTTF9NQUpPUl9WRVJTSU9OXzMgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2xpZW50IGhlbGxvIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfQ0xJRU5UX0hFTExPICk7CisgICAgICAgIH0KKworICAgICAgICBuID0gKCBidWZbM10gPDwgOCApIHwgYnVmWzRdOworCisgICAgICAgIGlmKCBuIDwgNDUgfHwgbiA+IDUxMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQgaGVsbG8gbWVzc2FnZSIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfSEVMTE8gKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAoIHJldCA9IHNzbF9mZXRjaF9pbnB1dCggc3NsLCA1ICsgbiApICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfZmV0Y2hfaW5wdXQiLCByZXQgKTsKKyAgICAgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgICAgIH0KKworICAgICAgICBidWYgPSBzc2wtPmluX21zZzsKKyAgICAgICAgbiA9IHNzbC0+aW5fbGVmdCAtIDU7CisKKyAgICAgICAgIG1kNV91cGRhdGUoICZzc2wtPmZpbl9tZDUgLCBidWYsIG4gKTsKKyAgICAgICAgc2hhMV91cGRhdGUoICZzc2wtPmZpbl9zaGExLCBidWYsIG4gKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTU0wgbGF5ZXI6CisgICAgICAgICAqICAgICAwICAuICAgMCAgIGhhbmRzaGFrZSB0eXBlCisgICAgICAgICAqICAgICAxICAuICAgMyAgIGhhbmRzaGFrZSBsZW5ndGgKKyAgICAgICAgICogICAgIDQgIC4gICA1ICAgcHJvdG9jb2wgdmVyc2lvbgorICAgICAgICAgKiAgICAgNiAgLiAgIDkgICBVTklYIHRpbWUoKQorICAgICAgICAgKiAgICAxMCAgLiAgMzcgICByYW5kb20gYnl0ZXMKKyAgICAgICAgICogICAgMzggIC4gIDM4ICAgc2Vzc2lvbiBpZCBsZW5ndGgKKyAgICAgICAgICogICAgMzkgIC4gMzgreCAgc2Vzc2lvbiBpZAorICAgICAgICAgKiAgIDM5K3ggLiA0MCt4ICBjaXBoZXJsaXN0IGxlbmd0aAorICAgICAgICAgKiAgIDQxK3ggLiAgLi4gICBjaXBoZXJsaXN0CisgICAgICAgICAqICAgIC4uICAuICAuLiAgIGNvbXByZXNzaW9uIGFsZy4KKyAgICAgICAgICogICAgLi4gIC4gIC4uICAgZXh0ZW5zaW9ucworICAgICAgICAgKi8KKyAgICAgICAgU1NMX0RFQlVHX0JVRiggNCwgInJlY29yZCBjb250ZW50cyIsIGJ1ZiwgbiApOworCisgICAgICAgIFNTTF9ERUJVR19NU0coIDMsICggImNsaWVudCBoZWxsbyB2MywgaGFuZHNoYWtlIHR5cGU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmWzBdICkgKTsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMywgKCAiY2xpZW50IGhlbGxvIHYzLCBoYW5kc2hha2UgbGVuLjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAoIGJ1ZlsxXSA8PCAxNiApIHwgKCBidWZbMl0gPDwgOCApIHwgYnVmWzNdICkgKTsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMywgKCAiY2xpZW50IGhlbGxvIHYzLCBtYXguIHZlcnNpb246IFslZDolZF0iLAorICAgICAgICAgICAgICAgICAgICAgICBidWZbNF0sIGJ1Zls1XSApICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdGhlIGhhbmRzaGFrZSB0eXBlIGFuZCBwcm90b2NvbCB2ZXJzaW9uCisgICAgICAgICAqLworICAgICAgICBpZiggYnVmWzBdICE9IFNTTF9IU19DTElFTlRfSEVMTE8gfHwKKyAgICAgICAgICAgIGJ1Zls0XSAhPSBTU0xfTUFKT1JfVkVSU0lPTl8zICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIGNsaWVudCBoZWxsbyBtZXNzYWdlIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NMSUVOVF9IRUxMTyApOworICAgICAgICB9CisKKyAgICAgICAgc3NsLT5tYWpvcl92ZXIgPSBTU0xfTUFKT1JfVkVSU0lPTl8zOworICAgICAgICBzc2wtPm1pbm9yX3ZlciA9ICggYnVmWzVdIDw9IFNTTF9NSU5PUl9WRVJTSU9OXzEgKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gYnVmWzVdICA6IFNTTF9NSU5PUl9WRVJTSU9OXzE7CisKKyAgICAgICAgc3NsLT5tYXhfbWFqb3JfdmVyID0gYnVmWzRdOworICAgICAgICBzc2wtPm1heF9taW5vcl92ZXIgPSBidWZbNV07CisKKyAgICAgICAgbWVtY3B5KCBzc2wtPnJhbmRieXRlcywgYnVmICsgNiwgMzIgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UgbGVuZ3RoCisgICAgICAgICAqLworICAgICAgICBpZiggYnVmWzFdICE9IDAgfHwgbiAhPSA0ICsgKCAoIGJ1ZlsyXSA8PCA4ICkgfCBidWZbM10gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQgaGVsbG8gbWVzc2FnZSIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfSEVMTE8gKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIHRoZSBzZXNzaW9uIGxlbmd0aAorICAgICAgICAgKi8KKyAgICAgICAgc2Vzc19sZW4gPSBidWZbMzhdOworCisgICAgICAgIGlmKCBzZXNzX2xlbiA8IDAgfHwgc2Vzc19sZW4gPiAzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQgaGVsbG8gbWVzc2FnZSIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfSEVMTE8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHNzbC0+c2Vzc2lvbi0+bGVuZ3RoID0gc2Vzc19sZW47CisgICAgICAgIG1lbXNldCggc3NsLT5zZXNzaW9uLT5pZCwgMCwgc2l6ZW9mKCBzc2wtPnNlc3Npb24tPmlkICkgKTsKKyAgICAgICAgbWVtY3B5KCBzc2wtPnNlc3Npb24tPmlkLCBidWYgKyAzOSAsIHNzbC0+c2Vzc2lvbi0+bGVuZ3RoICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdGhlIGNpcGhlcmxpc3QgbGVuZ3RoCisgICAgICAgICAqLworICAgICAgICBjaXBoX2xlbiA9ICggYnVmWzM5ICsgc2Vzc19sZW5dIDw8IDggKQorICAgICAgICAgICAgICAgICB8ICggYnVmWzQwICsgc2Vzc19sZW5dICAgICAgKTsKKworICAgICAgICBpZiggY2lwaF9sZW4gPCAyIHx8IGNpcGhfbGVuID4gMjU2IHx8ICggY2lwaF9sZW4gJSAyICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQgaGVsbG8gbWVzc2FnZSIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfSEVMTE8gKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG1zIGxlbmd0aAorICAgICAgICAgKi8KKyAgICAgICAgY29tcF9sZW4gPSBidWZbNDEgKyBzZXNzX2xlbiArIGNpcGhfbGVuXTsKKworICAgICAgICBpZiggY29tcF9sZW4gPCAxIHx8IGNvbXBfbGVuID4gMTYgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2xpZW50IGhlbGxvIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfQ0xJRU5UX0hFTExPICk7CisgICAgICAgIH0KKworICAgICAgICBTU0xfREVCVUdfQlVGKCAzLCAiY2xpZW50IGhlbGxvLCByYW5kb20gYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICBidWYgKyAgNiwgIDMyICk7CisgICAgICAgIFNTTF9ERUJVR19CVUYoIDMsICJjbGllbnQgaGVsbG8sIHNlc3Npb24gaWQiLAorICAgICAgICAgICAgICAgICAgICAgICBidWYgKyAzOCwgIHNlc3NfbGVuICk7CisgICAgICAgIFNTTF9ERUJVR19CVUYoIDMsICJjbGllbnQgaGVsbG8sIGNpcGhlcmxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICBidWYgKyA0MSArIHNlc3NfbGVuLCAgY2lwaF9sZW4gKTsKKyAgICAgICAgU1NMX0RFQlVHX0JVRiggMywgImNsaWVudCBoZWxsbywgY29tcHJlc3Npb24iLAorICAgICAgICAgICAgICAgICAgICAgICBidWYgKyA0MiArIHNlc3NfbGVuICsgY2lwaF9sZW4sIGNvbXBfbGVuICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VhcmNoIGZvciBhIG1hdGNoaW5nIGNpcGhlcgorICAgICAgICAgKi8KKyAgICAgICAgZm9yKCBpID0gMDsgc3NsLT5jaXBoZXJzW2ldICE9IDA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDAsIHAgPSBidWYgKyA0MSArIHNlc3NfbGVuOyBqIDwgY2lwaF9sZW47CisgICAgICAgICAgICAgICAgaiArPSAyLCBwICs9IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBwWzBdID09IDAgJiYgcFsxXSA9PSBzc2wtPmNpcGhlcnNbaV0gKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGhhdmVfY2lwaGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiZ290IG5vIGNpcGhlcnMgaW4gY29tbW9uIiApICk7CisKKyAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfTk9fQ0lQSEVSX0NIT1NFTiApOworCitoYXZlX2NpcGhlcjoKKworICAgIHNzbC0+c2Vzc2lvbi0+Y2lwaGVyID0gc3NsLT5jaXBoZXJzW2ldOworICAgIHNzbC0+aW5fbGVmdCA9IDA7CisgICAgc3NsLT5zdGF0ZSsrOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gcGFyc2UgY2xpZW50IGhlbGxvIiApICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworc3RhdGljIGludCBzc2xfd3JpdGVfc2VydmVyX2hlbGxvKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICB0aW1lX3QgdDsKKyAgICBpbnQgcmV0LCBpLCBuOworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgKnA7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiB3cml0ZSBzZXJ2ZXIgaGVsbG8iICkgKTsKKworICAgIC8qCisgICAgICogICAgIDAgIC4gICAwICAgaGFuZHNoYWtlIHR5cGUKKyAgICAgKiAgICAgMSAgLiAgIDMgICBoYW5kc2hha2UgbGVuZ3RoCisgICAgICogICAgIDQgIC4gICA1ICAgcHJvdG9jb2wgdmVyc2lvbgorICAgICAqICAgICA2ICAuICAgOSAgIFVOSVggdGltZSgpCisgICAgICogICAgMTAgIC4gIDM3ICAgcmFuZG9tIGJ5dGVzCisgICAgICovCisgICAgYnVmID0gc3NsLT5vdXRfbXNnOworICAgIHAgPSBidWYgKyA0OworCisgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSBzc2wtPm1ham9yX3ZlcjsKKyAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpIHNzbC0+bWlub3JfdmVyOworCisgICAgU1NMX0RFQlVHX01TRyggMywgKCAic2VydmVyIGhlbGxvLCBjaG9zZW4gdmVyc2lvbjogWyVkOiVkXSIsCisgICAgICAgICAgICAgICAgICAgYnVmWzRdLCBidWZbNV0gKSApOworCisgICAgdCA9IHRpbWUoIE5VTEwgKTsKKyAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpKCB0ID4+IDI0ICk7CisgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggdCA+PiAxNiApOworICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoIHQgPj4gIDggKTsKKyAgICAqcCsrID0gKHVuc2lnbmVkIGNoYXIpKCB0ICAgICAgICk7CisKKyAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJzZXJ2ZXIgaGVsbG8sIGN1cnJlbnQgdGltZTogJWx1IiwgdCApICk7CisKKyAgICBmb3IoIGkgPSAyODsgaSA+IDA7IGktLSApCisgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikgc3NsLT5mX3JuZyggc3NsLT5wX3JuZyApOworCisgICAgbWVtY3B5KCBzc2wtPnJhbmRieXRlcyArIDMyLCBidWYgKyA2LCAzMiApOworCisgICAgU1NMX0RFQlVHX0JVRiggMywgInNlcnZlciBoZWxsbywgcmFuZG9tIGJ5dGVzIiwgYnVmICsgNiwgMzIgKTsKKworICAgIC8qCisgICAgICogICAgMzggIC4gIDM4ICAgc2Vzc2lvbiBpZCBsZW5ndGgKKyAgICAgKiAgICAzOSAgLiAzOCtuICBzZXNzaW9uIGlkCisgICAgICogICAzOStuIC4gNDArbiAgY2hvc2VuIGNpcGhlcgorICAgICAqICAgNDErbiAuIDQxK24gIGNob3NlbiBjb21wcmVzc2lvbiBhbGcuCisgICAgICovCisgICAgc3NsLT5zZXNzaW9uLT5sZW5ndGggPSBuID0gMzI7CisgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSBzc2wtPnNlc3Npb24tPmxlbmd0aDsKKworICAgIGlmKCBzc2wtPnNfZ2V0ID09IE5VTEwgfHwKKyAgICAgICAgc3NsLT5zX2dldCggc3NsICkgIT0gMCApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBOb3QgZm91bmQsIGNyZWF0ZSBhIG5ldyBzZXNzaW9uIGlkCisgICAgICAgICAqLworICAgICAgICBzc2wtPnJlc3VtZSA9IDA7CisgICAgICAgIHNzbC0+c3RhdGUrKzsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIHNzbC0+c2Vzc2lvbi0+aWRbaV0gPQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSBzc2wtPmZfcm5nKCBzc2wtPnBfcm5nICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZvdW5kIGEgbWF0Y2hpbmcgc2Vzc2lvbiwgcmVzdW1lIGl0CisgICAgICAgICAqLworICAgICAgICBzc2wtPnJlc3VtZSA9IDE7CisgICAgICAgIHNzbC0+c3RhdGUgPSBTU0xfU0VSVkVSX0NIQU5HRV9DSVBIRVJfU1BFQzsKKyAgICAgICAgc3NsX2Rlcml2ZV9rZXlzKCBzc2wgKTsKKyAgICB9CisKKyAgICBtZW1jcHkoIHAsIHNzbC0+c2Vzc2lvbi0+aWQsIHNzbC0+c2Vzc2lvbi0+bGVuZ3RoICk7CisgICAgcCArPSBzc2wtPnNlc3Npb24tPmxlbmd0aDsKKworICAgIFNTTF9ERUJVR19NU0coIDMsICggInNlcnZlciBoZWxsbywgc2Vzc2lvbiBpZCBsZW4uOiAlZCIsIG4gKSApOworICAgIFNTTF9ERUJVR19CVUYoIDMsICAgInNlcnZlciBoZWxsbywgc2Vzc2lvbiBpZCIsIGJ1ZiArIDM5LCBuICk7CisgICAgU1NMX0RFQlVHX01TRyggMywgKCAiJXMgc2Vzc2lvbiBoYXMgYmVlbiByZXN1bWVkIiwKKyAgICAgICAgICAgICAgICAgICBzc2wtPnJlc3VtZSA/ICJhIiA6ICJubyIgKSApOworCisgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggc3NsLT5zZXNzaW9uLT5jaXBoZXIgPj4gOCApOworICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoIHNzbC0+c2Vzc2lvbi0+Y2lwaGVyICAgICAgKTsKKyAgICAqcCsrID0gU1NMX0NPTVBSRVNTX05VTEw7CisKKyAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJzZXJ2ZXIgaGVsbG8sIGNob3NlbiBjaXBoZXI6ICVkIiwKKyAgICAgICAgICAgICAgICAgICBzc2wtPnNlc3Npb24tPmNpcGhlciApICk7CisgICAgU1NMX0RFQlVHX01TRyggMywgKCAic2VydmVyIGhlbGxvLCBjb21wcmVzcyBhbGcuOiAlZCIsIDAgKSApOworCisgICAgc3NsLT5vdXRfbXNnbGVuICA9IHAgLSBidWY7CisgICAgc3NsLT5vdXRfbXNndHlwZSA9IFNTTF9NU0dfSEFORFNIQUtFOworICAgIHNzbC0+b3V0X21zZ1swXSAgPSBTU0xfSFNfU0VSVkVSX0hFTExPOworCisgICAgcmV0ID0gc3NsX3dyaXRlX3JlY29yZCggc3NsICk7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSB3cml0ZSBzZXJ2ZXIgaGVsbG8iICkgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKK3N0YXRpYyBpbnQgc3NsX3dyaXRlX2NlcnRpZmljYXRlX3JlcXVlc3QoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCByZXQsIG47CisgICAgdW5zaWduZWQgY2hhciAqYnVmLCAqcDsKKyAgICB4NTA5X2NlcnQgKmNydDsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IHdyaXRlIGNlcnRpZmljYXRlIHJlcXVlc3QiICkgKTsKKworICAgIHNzbC0+c3RhdGUrKzsKKworICAgIGlmKCBzc2wtPmF1dGhtb2RlID09IFNTTF9WRVJJRllfTk9ORSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBza2lwIHdyaXRlIGNlcnRpZmljYXRlIHJlcXVlc3QiICkgKTsKKyAgICAgICAgcmV0dXJuKCAwICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgICAgMCAgLiAgIDAgICBoYW5kc2hha2UgdHlwZQorICAgICAqICAgICAxICAuICAgMyAgIGhhbmRzaGFrZSBsZW5ndGgKKyAgICAgKiAgICAgNCAgLiAgIDQgICBjZXJ0IHR5cGUgY291bnQKKyAgICAgKiAgICAgNSAgLi4gbi0xICBjZXJ0IHR5cGVzCisgICAgICogICAgIG4gIC4uIG4rMSAgbGVuZ3RoIG9mIGFsbCBETnMKKyAgICAgKiAgICBuKzIgLi4gbiszICBsZW5ndGggb2YgRE4gMQorICAgICAqICAgIG4rNCAuLiAuLi4gIERpc3Rpbmd1aXNoZWQgTmFtZSAjMQorICAgICAqICAgIC4uLiAuLiAuLi4gIGxlbmd0aCBvZiBETiAyLCBldGMuCisgICAgICovCisgICAgYnVmID0gc3NsLT5vdXRfbXNnOworICAgIHAgPSBidWYgKyA0OworCisgICAgLyoKKyAgICAgKiBBdCB0aGUgbW9tZW50LCBvbmx5IFJTQSBjZXJ0aWZpY2F0ZXMgYXJlIHN1cHBvcnRlZAorICAgICAqLworICAgICpwKysgPSAxOworICAgICpwKysgPSAxOworCisgICAgcCArPSAyOworICAgIGNydCA9IHNzbC0+Y2FfY2hhaW47CisKKyAgICB3aGlsZSggY3J0ICE9IE5VTEwgJiYgY3J0LT5uZXh0ICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgaWYoIHAgLSBidWYgPiA0MDk2ICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG4gPSBjcnQtPnN1YmplY3RfcmF3LmxlbjsKKyAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSggbiA+PiA4ICk7CisgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoIG4gICAgICApOworICAgICAgICBtZW1jcHkoIHAsIGNydC0+c3ViamVjdF9yYXcucCwgbiApOworCisgICAgICAgIFNTTF9ERUJVR19CVUYoIDMsICJyZXF1ZXN0ZWQgRE4iLCBwLCBuICk7CisgICAgICAgIHAgKz0gbjsgY3J0ID0gY3J0LT5uZXh0OworICAgIH0KKworICAgIHNzbC0+b3V0X21zZ2xlbiAgPSBuID0gcCAtIGJ1ZjsKKyAgICBzc2wtPm91dF9tc2d0eXBlID0gU1NMX01TR19IQU5EU0hBS0U7CisgICAgc3NsLT5vdXRfbXNnWzBdICA9IFNTTF9IU19DRVJUSUZJQ0FURV9SRVFVRVNUOworICAgIHNzbC0+b3V0X21zZ1s2XSAgPSAodW5zaWduZWQgY2hhcikoICggbiAtIDggKSA+PiA4ICk7CisgICAgc3NsLT5vdXRfbXNnWzddICA9ICh1bnNpZ25lZCBjaGFyKSggKCBuIC0gOCApICAgICAgKTsKKworICAgIHJldCA9IHNzbF93cml0ZV9yZWNvcmQoIHNzbCApOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gd3JpdGUgY2VydGlmaWNhdGUgcmVxdWVzdCIgKSApOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworc3RhdGljIGludCBzc2xfd3JpdGVfc2VydmVyX2tleV9leGNoYW5nZSggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgaW50IHJldCwgbjsKKyAgICB1bnNpZ25lZCBjaGFyIGhhc2hbMzZdOworICAgIG1kNV9jb250ZXh0IG1kNTsKKyAgICBzaGExX2NvbnRleHQgc2hhMTsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IHdyaXRlIHNlcnZlciBrZXkgZXhjaGFuZ2UiICkgKTsKKworICAgIGlmKCBzc2wtPnNlc3Npb24tPmNpcGhlciAhPSBTU0xfRURIX1JTQV9ERVNfMTY4X1NIQSAmJgorICAgICAgICBzc2wtPnNlc3Npb24tPmNpcGhlciAhPSBTU0xfRURIX1JTQV9BRVNfMjU2X1NIQSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBza2lwIHdyaXRlIHNlcnZlciBrZXkgZXhjaGFuZ2UiICkgKTsKKyAgICAgICAgc3NsLT5zdGF0ZSsrOworICAgICAgICByZXR1cm4oIDAgKTsKKyAgICB9CisKKyNpZiAhZGVmaW5lZChYWVNTTF9ESE1fQykKKyAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJzdXBwb3J0IGZvciBkaG0gaXMgbm90IGF2YWlsYWJsZSIgKSApOworICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9GRUFUVVJFX1VOQVZBSUxBQkxFICk7CisjZWxzZQorICAgIC8qCisgICAgICogRXBoZW1lcmFsIERIIHBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiBzdHJ1Y3QgeworICAgICAqICAgICBvcGFxdWUgZGhfcDwxLi4yXjE2LTE+OworICAgICAqICAgICBvcGFxdWUgZGhfZzwxLi4yXjE2LTE+OworICAgICAqICAgICBvcGFxdWUgZGhfWXM8MS4uMl4xNi0xPjsKKyAgICAgKiB9IFNlcnZlckRIUGFyYW1zOworICAgICAqLworICAgIGlmKCAoIHJldCA9IGRobV9tYWtlX3BhcmFtcyggJnNzbC0+ZGhtX2N0eCwgMjU2LCBzc2wtPm91dF9tc2cgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm4sIHNzbC0+Zl9ybmcsIHNzbC0+cF9ybmcgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgImRobV9tYWtlX3BhcmFtcyIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIFNTTF9ERUJVR19NUEkoIDMsICJESE06IFggIiwgJnNzbC0+ZGhtX2N0eC5YICApOworICAgIFNTTF9ERUJVR19NUEkoIDMsICJESE06IFAgIiwgJnNzbC0+ZGhtX2N0eC5QICApOworICAgIFNTTF9ERUJVR19NUEkoIDMsICJESE06IEcgIiwgJnNzbC0+ZGhtX2N0eC5HICApOworICAgIFNTTF9ERUJVR19NUEkoIDMsICJESE06IEdYIiwgJnNzbC0+ZGhtX2N0eC5HWCApOworCisgICAgLyoKKyAgICAgKiBkaWdpdGFsbHktc2lnbmVkIHN0cnVjdCB7CisgICAgICogICAgIG9wYXF1ZSBtZDVfaGFzaFsxNl07CisgICAgICogICAgIG9wYXF1ZSBzaGFfaGFzaFsyMF07CisgICAgICogfTsKKyAgICAgKgorICAgICAqIG1kNV9oYXNoCisgICAgICogICAgIE1ENShDbGllbnRIZWxsby5yYW5kb20gKyBTZXJ2ZXJIZWxsby5yYW5kb20KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNlcnZlclBhcmFtcyk7CisgICAgICogc2hhX2hhc2gKKyAgICAgKiAgICAgU0hBKENsaWVudEhlbGxvLnJhbmRvbSArIFNlcnZlckhlbGxvLnJhbmRvbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU2VydmVyUGFyYW1zKTsKKyAgICAgKi8KKyAgICBtZDVfc3RhcnRzKCAmbWQ1ICk7CisgICAgbWQ1X3VwZGF0ZSggJm1kNSwgc3NsLT5yYW5kYnl0ZXMsICA2NCApOworICAgIG1kNV91cGRhdGUoICZtZDUsIHNzbC0+b3V0X21zZyArIDQsIG4gKTsKKyAgICBtZDVfZmluaXNoKCAmbWQ1LCBoYXNoICk7CisKKyAgICBzaGExX3N0YXJ0cyggJnNoYTEgKTsKKyAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHNzbC0+cmFuZGJ5dGVzLCAgNjQgKTsKKyAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHNzbC0+b3V0X21zZyArIDQsIG4gKTsKKyAgICBzaGExX2ZpbmlzaCggJnNoYTEsIGhhc2ggKyAxNiApOworCisgICAgU1NMX0RFQlVHX0JVRiggMywgInBhcmFtZXRlcnMgaGFzaCIsIGhhc2gsIDM2ICk7CisKKyAgICBzc2wtPm91dF9tc2dbNCArIG5dID0gKHVuc2lnbmVkIGNoYXIpKCBzc2wtPnJzYV9rZXktPmxlbiA+PiA4ICk7CisgICAgc3NsLT5vdXRfbXNnWzUgKyBuXSA9ICh1bnNpZ25lZCBjaGFyKSggc3NsLT5yc2Ffa2V5LT5sZW4gICAgICApOworCisgICAgcmV0ID0gcnNhX3BrY3MxX3NpZ24oIHNzbC0+cnNhX2tleSwgUlNBX1BSSVZBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9SQVcsIDM2LCBoYXNoLCBzc2wtPm91dF9tc2cgKyA2ICsgbiApOworICAgIGlmKCByZXQgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAicnNhX3BrY3MxX3NpZ24iLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBTU0xfREVCVUdfQlVGKCAzLCAibXkgUlNBIHNpZyIsIHNzbC0+b3V0X21zZyArIDYgKyBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5yc2Ffa2V5LT5sZW4gKTsKKworICAgIHNzbC0+b3V0X21zZ2xlbiAgPSA2ICsgbiArIHNzbC0+cnNhX2tleS0+bGVuOworICAgIHNzbC0+b3V0X21zZ3R5cGUgPSBTU0xfTVNHX0hBTkRTSEFLRTsKKyAgICBzc2wtPm91dF9tc2dbMF0gID0gU1NMX0hTX1NFUlZFUl9LRVlfRVhDSEFOR0U7CisKKyAgICBzc2wtPnN0YXRlKys7CisKKyAgICBpZiggKCByZXQgPSBzc2xfd3JpdGVfcmVjb3JkKCBzc2wgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF93cml0ZV9yZWNvcmQiLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSB3cml0ZSBzZXJ2ZXIga2V5IGV4Y2hhbmdlIiApICk7CisKKyAgICByZXR1cm4oIDAgKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHNzbF93cml0ZV9zZXJ2ZXJfaGVsbG9fZG9uZSggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgaW50IHJldDsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IHdyaXRlIHNlcnZlciBoZWxsbyBkb25lIiApICk7CisKKyAgICBzc2wtPm91dF9tc2dsZW4gID0gNDsKKyAgICBzc2wtPm91dF9tc2d0eXBlID0gU1NMX01TR19IQU5EU0hBS0U7CisgICAgc3NsLT5vdXRfbXNnWzBdICA9IFNTTF9IU19TRVJWRVJfSEVMTE9fRE9ORTsKKworICAgIHNzbC0+c3RhdGUrKzsKKworICAgIGlmKCAoIHJldCA9IHNzbF93cml0ZV9yZWNvcmQoIHNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX3dyaXRlX3JlY29yZCIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IHdyaXRlIHNlcnZlciBoZWxsbyBkb25lIiApICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworc3RhdGljIGludCBzc2xfcGFyc2VfY2xpZW50X2tleV9leGNoYW5nZSggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgaW50IHJldCwgaSwgbjsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IHBhcnNlIGNsaWVudCBrZXkgZXhjaGFuZ2UiICkgKTsKKworICAgIGlmKCAoIHJldCA9IHNzbF9yZWFkX3JlY29yZCggc3NsICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfcmVhZF9yZWNvcmQiLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBpZiggc3NsLT5pbl9tc2d0eXBlICE9IFNTTF9NU0dfSEFORFNIQUtFICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQga2V5IGV4Y2hhbmdlIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfS0VZX0VYQ0hBTkdFICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+aW5fbXNnWzBdICE9IFNTTF9IU19DTElFTlRfS0VZX0VYQ0hBTkdFICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQga2V5IGV4Y2hhbmdlIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfS0VZX0VYQ0hBTkdFICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+c2Vzc2lvbi0+Y2lwaGVyID09IFNTTF9FREhfUlNBX0RFU18xNjhfU0hBIHx8CisgICAgICAgIHNzbC0+c2Vzc2lvbi0+Y2lwaGVyID09IFNTTF9FREhfUlNBX0FFU18yNTZfU0hBICkKKyAgICB7CisjaWYgIWRlZmluZWQoWFlTU0xfREhNX0MpCisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggInN1cHBvcnQgZm9yIGRobSBpcyBub3QgYXZhaWxhYmxlIiApICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9GRUFUVVJFX1VOQVZBSUxBQkxFICk7CisjZWxzZQorICAgICAgICAvKgorICAgICAgICAgKiBSZWNlaXZlIEdeWSBtb2QgUCwgcHJlbWFzdGVyID0gKEdeWSleWCBtb2QgUAorICAgICAgICAgKi8KKyAgICAgICAgbiA9ICggc3NsLT5pbl9tc2dbNF0gPDwgOCApIHwgc3NsLT5pbl9tc2dbNV07CisKKyAgICAgICAgaWYoIG4gPCAxIHx8IG4gPiBzc2wtPmRobV9jdHgubGVuIHx8CisgICAgICAgICAgICBuICsgNiAhPSBzc2wtPmluX2hzbGVuICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIGNsaWVudCBrZXkgZXhjaGFuZ2UgbWVzc2FnZSIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DTElFTlRfS0VZX0VYQ0hBTkdFICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggKCByZXQgPSBkaG1fcmVhZF9wdWJsaWMoICZzc2wtPmRobV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+aW5fbXNnICsgNiwgbiApICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJkaG1fcmVhZF9wdWJsaWMiLCByZXQgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfQ0xJRU5UX0tFWV9FWENIQU5HRSB8IHJldCApOworICAgICAgICB9CisKKyAgICAgICAgU1NMX0RFQlVHX01QSSggMywgIkRITTogR1kiLCAmc3NsLT5kaG1fY3R4LkdZICk7CisKKyAgICAgICAgc3NsLT5wbXNsZW4gPSBzc2wtPmRobV9jdHgubGVuOworCisgICAgICAgIGlmKCAoIHJldCA9IGRobV9jYWxjX3NlY3JldCggJnNzbC0+ZGhtX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgIHNzbC0+cHJlbWFzdGVyLCAmc3NsLT5wbXNsZW4gKSApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAiZGhtX2NhbGNfc2VjcmV0IiwgcmV0ICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NMSUVOVF9LRVlfRVhDSEFOR0UgfCByZXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIFNTTF9ERUJVR19NUEkoIDMsICJESE06IEsgIiwgJnNzbC0+ZGhtX2N0eC5LICApOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIERlY3J5cHQgdGhlIHByZW1hc3RlciB1c2luZyBvd24gcHJpdmF0ZSBSU0Ega2V5CisgICAgICAgICAqLworICAgICAgICBpID0gNDsKKyAgICAgICAgbiA9IHNzbC0+cnNhX2tleS0+bGVuOworICAgICAgICBzc2wtPnBtc2xlbiA9IDQ4OworCisgICAgICAgIGlmKCBzc2wtPm1pbm9yX3ZlciAhPSBTU0xfTUlOT1JfVkVSU0lPTl8wICkKKyAgICAgICAgeworICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgaWYoIHNzbC0+aW5fbXNnWzRdICE9ICggKCBuID4+IDggKSAmIDB4RkYgKSB8fAorICAgICAgICAgICAgICAgIHNzbC0+aW5fbXNnWzVdICE9ICggKCBuICAgICAgKSAmIDB4RkYgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIGNsaWVudCBrZXkgZXhjaGFuZ2UgbWVzc2FnZSIgKSApOworICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSFNfQ0xJRU5UX0tFWV9FWENIQU5HRSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIHNzbC0+aW5faHNsZW4gIT0gaSArIG4gKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2xpZW50IGtleSBleGNoYW5nZSBtZXNzYWdlIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NMSUVOVF9LRVlfRVhDSEFOR0UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHJzYV9wa2NzMV9kZWNyeXB0KCBzc2wtPnJzYV9rZXksIFJTQV9QUklWQVRFLCAmc3NsLT5wbXNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX21zZyArIGksIHNzbC0+cHJlbWFzdGVyICk7CisKKyAgICAgICAgaWYoIHJldCAhPSAwIHx8IHNzbC0+cG1zbGVuICE9IDQ4IHx8CisgICAgICAgICAgICBzc2wtPnByZW1hc3RlclswXSAhPSBzc2wtPm1heF9tYWpvcl92ZXIgfHwKKyAgICAgICAgICAgIHNzbC0+cHJlbWFzdGVyWzFdICE9IHNzbC0+bWF4X21pbm9yX3ZlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjbGllbnQga2V5IGV4Y2hhbmdlIG1lc3NhZ2UiICkgKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFByb3RlY3Rpb24gYWdhaW5zdCBCbGVpY2hlbmJhY2hlcidzIGF0dGFjazoKKyAgICAgICAgICAgICAqIGludmFsaWQgUEtDUyMxIHYxLjUgcGFkZGluZyBtdXN0IG5vdCBjYXVzZQorICAgICAgICAgICAgICogdGhlIGNvbm5lY3Rpb24gdG8gZW5kIGltbWVkaWF0ZWx5OyBpbnN0ZWFkLAorICAgICAgICAgICAgICogc2VuZCBhIGJhZF9yZWNvcmRfbWFjIGxhdGVyIGluIHRoZSBoYW5kc2hha2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNzbC0+cG1zbGVuID0gNDg7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzc2wtPnBtc2xlbjsgaSsrICkKKyAgICAgICAgICAgICAgICBzc2wtPnByZW1hc3RlcltpXSA9ICh1bnNpZ25lZCBjaGFyKSBzc2wtPmZfcm5nKCBzc2wtPnBfcm5nICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzc2xfZGVyaXZlX2tleXMoIHNzbCApOworCisgICAgaWYoIHNzbC0+c19zZXQgIT0gTlVMTCApCisgICAgICAgIHNzbC0+c19zZXQoIHNzbCApOworCisgICAgc3NsLT5zdGF0ZSsrOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gcGFyc2UgY2xpZW50IGtleSBleGNoYW5nZSIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKK3N0YXRpYyBpbnQgc3NsX3BhcnNlX2NlcnRpZmljYXRlX3ZlcmlmeSggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgaW50IG4xLCBuMiwgcmV0OworICAgIHVuc2lnbmVkIGNoYXIgaGFzaFszNl07CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiBwYXJzZSBjZXJ0aWZpY2F0ZSB2ZXJpZnkiICkgKTsKKworICAgIGlmKCBzc2wtPnBlZXJfY2VydCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IHNraXAgcGFyc2UgY2VydGlmaWNhdGUgdmVyaWZ5IiApICk7CisgICAgICAgIHNzbC0+c3RhdGUrKzsKKyAgICAgICAgcmV0dXJuKCAwICk7CisgICAgfQorCisgICAgc3NsX2NhbGNfdmVyaWZ5KCBzc2wsIGhhc2ggKTsKKworICAgIGlmKCAoIHJldCA9IHNzbF9yZWFkX3JlY29yZCggc3NsICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfcmVhZF9yZWNvcmQiLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBzc2wtPnN0YXRlKys7CisKKyAgICBpZiggc3NsLT5pbl9tc2d0eXBlICE9IFNTTF9NU0dfSEFORFNIQUtFICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjZXJ0aWZpY2F0ZSB2ZXJpZnkgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NFUlRJRklDQVRFX1ZFUklGWSApOworICAgIH0KKworICAgIGlmKCBzc2wtPmluX21zZ1swXSAhPSBTU0xfSFNfQ0VSVElGSUNBVEVfVkVSSUZZICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjZXJ0aWZpY2F0ZSB2ZXJpZnkgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NFUlRJRklDQVRFX1ZFUklGWSApOworICAgIH0KKworICAgIG4xID0gc3NsLT5wZWVyX2NlcnQtPnJzYS5sZW47CisgICAgbjIgPSAoIHNzbC0+aW5fbXNnWzRdIDw8IDggKSB8IHNzbC0+aW5fbXNnWzVdOworCisgICAgaWYoIG4xICsgNiAhPSBzc2wtPmluX2hzbGVuIHx8IG4xICE9IG4yICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjZXJ0aWZpY2F0ZSB2ZXJpZnkgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NFUlRJRklDQVRFX1ZFUklGWSApOworICAgIH0KKworICAgIHJldCA9IHJzYV9wa2NzMV92ZXJpZnkoICZzc2wtPnBlZXJfY2VydC0+cnNhLCBSU0FfUFVCTElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9SQVcsIDM2LCBoYXNoLCBzc2wtPmluX21zZyArIDYgKTsKKyAgICBpZiggcmV0ICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInJzYV9wa2NzMV92ZXJpZnkiLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBwYXJzZSBjZXJ0aWZpY2F0ZSB2ZXJpZnkiICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogU1NMIGhhbmRzaGFrZSAtLSBzZXJ2ZXIgc2lkZQorICovCitpbnQgc3NsX2hhbmRzaGFrZV9zZXJ2ZXIoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCByZXQgPSAwOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPT4gaGFuZHNoYWtlIHNlcnZlciIgKSApOworCisgICAgd2hpbGUoIHNzbC0+c3RhdGUgIT0gU1NMX0hBTkRTSEFLRV9PVkVSICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDIsICggInNlcnZlciBzdGF0ZTogJWQiLCBzc2wtPnN0YXRlICkgKTsKKworICAgICAgICBpZiggKCByZXQgPSBzc2xfZmx1c2hfb3V0cHV0KCBzc2wgKSApICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgc3dpdGNoKCBzc2wtPnN0YXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTU0xfSEVMTE9fUkVRVUVTVDoKKyAgICAgICAgICAgICAgICBzc2wtPnN0YXRlID0gU1NMX0NMSUVOVF9IRUxMTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICA8PT0gICBDbGllbnRIZWxsbworICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYXNlIFNTTF9DTElFTlRfSEVMTE86CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3BhcnNlX2NsaWVudF9oZWxsbyggc3NsICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgPT0+ICAgU2VydmVySGVsbG8KKyAgICAgICAgICAgICAqICAgICAgICBDZXJ0aWZpY2F0ZQorICAgICAgICAgICAgICogICAgICAoIFNlcnZlcktleUV4Y2hhbmdlICApCisgICAgICAgICAgICAgKiAgICAgICggQ2VydGlmaWNhdGVSZXF1ZXN0ICkKKyAgICAgICAgICAgICAqICAgICAgICBTZXJ2ZXJIZWxsb0RvbmUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2FzZSBTU0xfU0VSVkVSX0hFTExPOgorICAgICAgICAgICAgICAgIHJldCA9IHNzbF93cml0ZV9zZXJ2ZXJfaGVsbG8oIHNzbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNTTF9TRVJWRVJfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3dyaXRlX2NlcnRpZmljYXRlKCBzc2wgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTU0xfU0VSVkVSX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgICAgICByZXQgPSBzc2xfd3JpdGVfc2VydmVyX2tleV9leGNoYW5nZSggc3NsICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1NMX0NFUlRJRklDQVRFX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3dyaXRlX2NlcnRpZmljYXRlX3JlcXVlc3QoIHNzbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNTTF9TRVJWRVJfSEVMTE9fRE9ORToKKyAgICAgICAgICAgICAgICByZXQgPSBzc2xfd3JpdGVfc2VydmVyX2hlbGxvX2RvbmUoIHNzbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIDw9PSAoIENlcnRpZmljYXRlL0FsZXJ0ICApCisgICAgICAgICAgICAgKiAgICAgICAgQ2xpZW50S2V5RXhjaGFuZ2UKKyAgICAgICAgICAgICAqICAgICAgKCBDZXJ0aWZpY2F0ZVZlcmlmeSAgKQorICAgICAgICAgICAgICogICAgICAgIENoYW5nZUNpcGhlclNwZWMKKyAgICAgICAgICAgICAqICAgICAgICBGaW5pc2hlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYXNlIFNTTF9DTElFTlRfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3BhcnNlX2NlcnRpZmljYXRlKCBzc2wgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTU0xfQ0xJRU5UX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgICAgICByZXQgPSBzc2xfcGFyc2VfY2xpZW50X2tleV9leGNoYW5nZSggc3NsICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1NMX0NFUlRJRklDQVRFX1ZFUklGWToKKyAgICAgICAgICAgICAgICByZXQgPSBzc2xfcGFyc2VfY2VydGlmaWNhdGVfdmVyaWZ5KCBzc2wgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTU0xfQ0xJRU5UX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgICAgICAgICByZXQgPSBzc2xfcGFyc2VfY2hhbmdlX2NpcGhlcl9zcGVjKCBzc2wgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTU0xfQ0xJRU5UX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgIHJldCA9IHNzbF9wYXJzZV9maW5pc2hlZCggc3NsICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgPT0+ICAgQ2hhbmdlQ2lwaGVyU3BlYworICAgICAgICAgICAgICogICAgICAgIEZpbmlzaGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNhc2UgU1NMX1NFUlZFUl9DSEFOR0VfQ0lQSEVSX1NQRUM6CisgICAgICAgICAgICAgICAgcmV0ID0gc3NsX3dyaXRlX2NoYW5nZV9jaXBoZXJfc3BlYyggc3NsICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1NMX1NFUlZFUl9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICByZXQgPSBzc2xfd3JpdGVfZmluaXNoZWQoIHNzbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNTTF9GTFVTSF9CVUZGRVJTOgorICAgICAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDIsICggImhhbmRzaGFrZTogZG9uZSIgKSApOworICAgICAgICAgICAgICAgIHNzbC0+c3RhdGUgPSBTU0xfSEFORFNIQUtFX09WRVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiaW52YWxpZCBzdGF0ZSAlZCIsIHNzbC0+c3RhdGUgKSApOworICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9CQURfSU5QVVRfREFUQSApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IGhhbmRzaGFrZSBzZXJ2ZXIiICkgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicmFyeS9zc2xfdGxzLmMgYi9saWJyYXJ5L3NzbF90bHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQ5OGI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicmFyeS9zc2xfdGxzLmMKQEAgLTAsMCArMSwxOTc3IEBACisvKgorICogIFNTTHYzL1RMU3YxIHNoYXJlZCBmdW5jdGlvbnMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisvKgorICogIFRoZSBTU0wgMy4wIHNwZWNpZmljYXRpb24gd2FzIGRyYWZ0ZWQgYnkgTmV0c2NhcGUgaW4gMTk5NiwKKyAqICBhbmQgYmVjYW1lIGFuIElFVEYgc3RhbmRhcmQgaW4gMTk5OS4KKyAqCisgKiAgaHR0cDovL3dwLm5ldHNjYXBlLmNvbS9lbmcvc3NsMy8KKyAqICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMjQ2LnR4dAorICogIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQzNDYudHh0CisgKi8KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChYWVNTTF9TU0xfVExTX0MpCisKKyNpbmNsdWRlICJ4eXNzbC9hZXMuaCIKKyNpbmNsdWRlICJ4eXNzbC9hcmM0LmgiCisjaW5jbHVkZSAieHlzc2wvZGVzLmgiCisjaW5jbHVkZSAieHlzc2wvZGVidWcuaCIKKyNpbmNsdWRlICJ4eXNzbC9zc2wuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworLyoKKyAqIEtleSBtYXRlcmlhbCBnZW5lcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgdGxzMV9wcmYoIHVuc2lnbmVkIGNoYXIgKnNlY3JldCwgaW50IHNsZW4sIGNoYXIgKmxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcmFuZG9tLCBpbnQgcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdGJ1ZiwgaW50IGRsZW4gKQoreworICAgIGludCBuYiwgaHM7CisgICAgaW50IGksIGosIGs7CisgICAgdW5zaWduZWQgY2hhciAqUzEsICpTMjsKKyAgICB1bnNpZ25lZCBjaGFyIHRtcFsxMjhdOworICAgIHVuc2lnbmVkIGNoYXIgaF9pWzIwXTsKKworICAgIGlmKCBzaXplb2YoIHRtcCApIDwgMjAgKyBzdHJsZW4oIGxhYmVsICkgKyBybGVuICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9JTlBVVF9EQVRBICk7CisKKyAgICBocyA9ICggc2xlbiArIDEgKSAvIDI7CisgICAgUzEgPSBzZWNyZXQ7CisgICAgUzIgPSBzZWNyZXQgKyBzbGVuIC0gaHM7CisKKyAgICBuYiA9IHN0cmxlbiggbGFiZWwgKTsKKyAgICBtZW1jcHkoIHRtcCArIDIwLCBsYWJlbCwgbmIgKTsKKyAgICBtZW1jcHkoIHRtcCArIDIwICsgbmIsIHJhbmRvbSwgcmxlbiApOworICAgIG5iICs9IHJsZW47CisKKyAgICAvKgorICAgICAqIEZpcnN0IGNvbXB1dGUgUF9tZDUoc2VjcmV0LGxhYmVsK3JhbmRvbSlbMC4uZGxlbl0KKyAgICAgKi8KKyAgICBtZDVfaG1hYyggUzEsIGhzLCB0bXAgKyAyMCwgbmIsIDQgKyB0bXAgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBkbGVuOyBpICs9IDE2ICkKKyAgICB7CisgICAgICAgIG1kNV9obWFjKCBTMSwgaHMsIDQgKyB0bXAsIDE2ICsgbmIsIGhfaSApOworICAgICAgICBtZDVfaG1hYyggUzEsIGhzLCA0ICsgdG1wLCAxNiwgIDQgKyB0bXAgKTsKKworICAgICAgICBrID0gKCBpICsgMTYgPiBkbGVuICkgPyBkbGVuICUgMTYgOiAxNjsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgazsgaisrICkKKyAgICAgICAgICAgIGRzdGJ1ZltpICsgal0gID0gaF9pW2pdOworICAgIH0KKworICAgIC8qCisgICAgICogWE9SIG91dCB3aXRoIFBfc2hhMShzZWNyZXQsbGFiZWwrcmFuZG9tKVswLi5kbGVuXQorICAgICAqLworICAgIHNoYTFfaG1hYyggUzIsIGhzLCB0bXAgKyAyMCwgbmIsIHRtcCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IGRsZW47IGkgKz0gMjAgKQorICAgIHsKKyAgICAgICAgc2hhMV9obWFjKCBTMiwgaHMsIHRtcCwgMjAgKyBuYiwgaF9pICk7CisgICAgICAgIHNoYTFfaG1hYyggUzIsIGhzLCB0bXAsIDIwLCAgICAgIHRtcCApOworCisgICAgICAgIGsgPSAoIGkgKyAyMCA+IGRsZW4gKSA/IGRsZW4gJSAyMCA6IDIwOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBrOyBqKysgKQorICAgICAgICAgICAgZHN0YnVmW2kgKyBqXSA9ICh1bnNpZ25lZCBjaGFyKSggZHN0YnVmW2kgKyBqXSBeIGhfaVtqXSApOworICAgIH0KKworICAgIG1lbXNldCggdG1wLCAwLCBzaXplb2YoIHRtcCApICk7CisgICAgbWVtc2V0KCBoX2ksIDAsIHNpemVvZiggaF9pICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCitpbnQgc3NsX2Rlcml2ZV9rZXlzKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgaTsKKyAgICBtZDVfY29udGV4dCBtZDU7CisgICAgc2hhMV9jb250ZXh0IHNoYTE7CisgICAgdW5zaWduZWQgY2hhciB0bXBbNjRdOworICAgIHVuc2lnbmVkIGNoYXIgcGFkZGluZ1sxNl07CisgICAgdW5zaWduZWQgY2hhciBzaGExc3VtWzIwXTsKKyAgICB1bnNpZ25lZCBjaGFyIGtleWJsa1syNTZdOworICAgIHVuc2lnbmVkIGNoYXIgKmtleTE7CisgICAgdW5zaWduZWQgY2hhciAqa2V5MjsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IGRlcml2ZSBrZXlzIiApICk7CisKKyAgICAvKgorICAgICAqIFNTTHYzOgorICAgICAqICAgbWFzdGVyID0KKyAgICAgKiAgICAgTUQ1KCBwcmVtYXN0ZXIgKyBTSEExKCAnQScgICArIHByZW1hc3RlciArIHJhbmRieXRlcyApICkgKworICAgICAqICAgICBNRDUoIHByZW1hc3RlciArIFNIQTEoICdCQicgICsgcHJlbWFzdGVyICsgcmFuZGJ5dGVzICkgKSArCisgICAgICogICAgIE1ENSggcHJlbWFzdGVyICsgU0hBMSggJ0NDQycgKyBwcmVtYXN0ZXIgKyByYW5kYnl0ZXMgKSApCisgICAgICoKKyAgICAgKiBUTFN2MToKKyAgICAgKiAgIG1hc3RlciA9IFBSRiggcHJlbWFzdGVyLCAibWFzdGVyIHNlY3JldCIsIHJhbmRieXRlcyApWzAuLjQ3XQorICAgICAqLworICAgIGlmKCBzc2wtPnJlc3VtZSA9PSAwICkKKyAgICB7CisgICAgICAgIGludCBsZW4gPSBzc2wtPnBtc2xlbjsKKworICAgICAgICBTU0xfREVCVUdfQlVGKCAzLCAicHJlbWFzdGVyIHNlY3JldCIsIHNzbC0+cHJlbWFzdGVyLCBsZW4gKTsKKworICAgICAgICBpZiggc3NsLT5taW5vcl92ZXIgPT0gU1NMX01JTk9SX1ZFUlNJT05fMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAzOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbXNldCggcGFkZGluZywgJ0EnICsgaSwgMSArIGkgKTsKKworICAgICAgICAgICAgICAgIHNoYTFfc3RhcnRzKCAmc2hhMSApOworICAgICAgICAgICAgICAgIHNoYTFfdXBkYXRlKCAmc2hhMSwgcGFkZGluZywgMSArIGkgKTsKKyAgICAgICAgICAgICAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHNzbC0+cHJlbWFzdGVyLCBsZW4gKTsKKyAgICAgICAgICAgICAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHNzbC0+cmFuZGJ5dGVzLCAgNjQgKTsKKyAgICAgICAgICAgICAgICBzaGExX2ZpbmlzaCggJnNoYTEsIHNoYTFzdW0gKTsKKworICAgICAgICAgICAgICAgIG1kNV9zdGFydHMoICZtZDUgKTsKKyAgICAgICAgICAgICAgICBtZDVfdXBkYXRlKCAmbWQ1LCBzc2wtPnByZW1hc3RlciwgbGVuICk7CisgICAgICAgICAgICAgICAgbWQ1X3VwZGF0ZSggJm1kNSwgc2hhMXN1bSwgMjAgKTsKKyAgICAgICAgICAgICAgICBtZDVfZmluaXNoKCAmbWQ1LCBzc2wtPnNlc3Npb24tPm1hc3RlciArIGkgKiAxNiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRsczFfcHJmKCBzc2wtPnByZW1hc3RlciwgbGVuLCAibWFzdGVyIHNlY3JldCIsCisgICAgICAgICAgICAgICAgICAgICAgc3NsLT5yYW5kYnl0ZXMsIDY0LCBzc2wtPnNlc3Npb24tPm1hc3RlciwgNDggKTsKKworICAgICAgICBtZW1zZXQoIHNzbC0+cHJlbWFzdGVyLCAwLCBzaXplb2YoIHNzbC0+cHJlbWFzdGVyICkgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBTU0xfREVCVUdfTVNHKCAzLCAoICJubyBwcmVtYXN0ZXIgKHNlc3Npb24gcmVzdW1lZCkiICkgKTsKKworICAgIC8qCisgICAgICogU3dhcCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgcmFuZG9tIHZhbHVlcy4KKyAgICAgKi8KKyAgICBtZW1jcHkoIHRtcCwgc3NsLT5yYW5kYnl0ZXMsIDY0ICk7CisgICAgbWVtY3B5KCBzc2wtPnJhbmRieXRlcywgdG1wICsgMzIsIDMyICk7CisgICAgbWVtY3B5KCBzc2wtPnJhbmRieXRlcyArIDMyLCB0bXAsIDMyICk7CisgICAgbWVtc2V0KCB0bXAsIDAsIHNpemVvZiggdG1wICkgKTsKKworICAgIC8qCisgICAgICogIFNTTHYzOgorICAgICAqICAgIGtleSBibG9jayA9CisgICAgICogICAgICBNRDUoIG1hc3RlciArIFNIQTEoICdBJyAgICArIG1hc3RlciArIHJhbmRieXRlcyApICkgKworICAgICAqICAgICAgTUQ1KCBtYXN0ZXIgKyBTSEExKCAnQkInICAgKyBtYXN0ZXIgKyByYW5kYnl0ZXMgKSApICsKKyAgICAgKiAgICAgIE1ENSggbWFzdGVyICsgU0hBMSggJ0NDQycgICsgbWFzdGVyICsgcmFuZGJ5dGVzICkgKSArCisgICAgICogICAgICBNRDUoIG1hc3RlciArIFNIQTEoICdEREREJyArIG1hc3RlciArIHJhbmRieXRlcyApICkgKworICAgICAqICAgICAgLi4uCisgICAgICoKKyAgICAgKiAgVExTdjE6CisgICAgICogICAga2V5IGJsb2NrID0gUFJGKCBtYXN0ZXIsICJrZXkgZXhwYW5zaW9uIiwgcmFuZGJ5dGVzICkKKyAgICAgKi8KKyAgICBpZiggc3NsLT5taW5vcl92ZXIgPT0gU1NMX01JTk9SX1ZFUlNJT05fMCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMTY7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldCggcGFkZGluZywgJ0EnICsgaSwgMSArIGkgKTsKKworICAgICAgICAgICAgc2hhMV9zdGFydHMoICZzaGExICk7CisgICAgICAgICAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHBhZGRpbmcsIDEgKyBpICk7CisgICAgICAgICAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHNzbC0+c2Vzc2lvbi0+bWFzdGVyLCA0OCApOworICAgICAgICAgICAgc2hhMV91cGRhdGUoICZzaGExLCBzc2wtPnJhbmRieXRlcywgNjQgKTsKKyAgICAgICAgICAgIHNoYTFfZmluaXNoKCAmc2hhMSwgc2hhMXN1bSApOworCisgICAgICAgICAgICBtZDVfc3RhcnRzKCAmbWQ1ICk7CisgICAgICAgICAgICBtZDVfdXBkYXRlKCAmbWQ1LCBzc2wtPnNlc3Npb24tPm1hc3RlciwgNDggKTsKKyAgICAgICAgICAgIG1kNV91cGRhdGUoICZtZDUsIHNoYTFzdW0sIDIwICk7CisgICAgICAgICAgICBtZDVfZmluaXNoKCAmbWQ1LCBrZXlibGsgKyBpICogMTYgKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCggJm1kNSwgIDAsIHNpemVvZiggbWQ1ICApICk7CisgICAgICAgIG1lbXNldCggJnNoYTEsIDAsIHNpemVvZiggc2hhMSApICk7CisKKyAgICAgICAgbWVtc2V0KCBwYWRkaW5nLCAwLCBzaXplb2YoIHBhZGRpbmcgKSApOworICAgICAgICBtZW1zZXQoIHNoYTFzdW0sIDAsIHNpemVvZiggc2hhMXN1bSApICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgdGxzMV9wcmYoIHNzbC0+c2Vzc2lvbi0+bWFzdGVyLCA0OCwgImtleSBleHBhbnNpb24iLAorICAgICAgICAgICAgICAgICAgc3NsLT5yYW5kYnl0ZXMsIDY0LCBrZXlibGssIDI1NiApOworCisgICAgU1NMX0RFQlVHX01TRyggMywgKCAiY2lwaGVyID0gJXMiLCBzc2xfZ2V0X2NpcGhlciggc3NsICkgKSApOworICAgIFNTTF9ERUJVR19CVUYoIDMsICJtYXN0ZXIgc2VjcmV0Iiwgc3NsLT5zZXNzaW9uLT5tYXN0ZXIsIDQ4ICk7CisgICAgU1NMX0RFQlVHX0JVRiggNCwgInJhbmRvbSBieXRlcyIsIHNzbC0+cmFuZGJ5dGVzLCA2NCApOworICAgIFNTTF9ERUJVR19CVUYoIDQsICJrZXkgYmxvY2siLCBrZXlibGssIDI1NiApOworCisgICAgbWVtc2V0KCBzc2wtPnJhbmRieXRlcywgMCwgc2l6ZW9mKCBzc2wtPnJhbmRieXRlcyApICk7CisKKyAgICAvKgorICAgICAqIERldGVybWluZSB0aGUgYXBwcm9wcmlhdGUga2V5LCBJViBhbmQgTUFDIGxlbmd0aC4KKyAgICAgKi8KKyAgICBzd2l0Y2goIHNzbC0+c2Vzc2lvbi0+Y2lwaGVyICkKKyAgICB7CisjaWYgZGVmaW5lZChYWVNTTF9BUkM0X0MpCisgICAgICAgIGNhc2UgU1NMX1JTQV9SQzRfMTI4X01ENToKKyAgICAgICAgICAgIHNzbC0+a2V5bGVuID0gMTY7IHNzbC0+bWlubGVuID0gMTY7CisgICAgICAgICAgICBzc2wtPml2bGVuICA9ICAwOyBzc2wtPm1hY2xlbiA9IDE2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTU0xfUlNBX1JDNF8xMjhfU0hBOgorICAgICAgICAgICAgc3NsLT5rZXlsZW4gPSAxNjsgc3NsLT5taW5sZW4gPSAyMDsKKyAgICAgICAgICAgIHNzbC0+aXZsZW4gID0gIDA7IHNzbC0+bWFjbGVuID0gMjA7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9ERVNfQykKKyAgICAgICAgY2FzZSBTU0xfUlNBX0RFU18xNjhfU0hBOgorICAgICAgICBjYXNlIFNTTF9FREhfUlNBX0RFU18xNjhfU0hBOgorICAgICAgICAgICAgc3NsLT5rZXlsZW4gPSAyNDsgc3NsLT5taW5sZW4gPSAyNDsKKyAgICAgICAgICAgIHNzbC0+aXZsZW4gID0gIDg7IHNzbC0+bWFjbGVuID0gMjA7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9BRVNfQykKKyAgICAgICAgY2FzZSBTU0xfUlNBX0FFU18xMjhfU0hBOgorICAgICAgICAgICAgc3NsLT5rZXlsZW4gPSAxNjsgc3NsLT5taW5sZW4gPSAzMjsKKyAgICAgICAgICAgIHNzbC0+aXZsZW4gID0gMTY7IHNzbC0+bWFjbGVuID0gMjA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNTTF9SU0FfQUVTXzI1Nl9TSEE6CisgICAgICAgIGNhc2UgU1NMX0VESF9SU0FfQUVTXzI1Nl9TSEE6CisgICAgICAgICAgICBzc2wtPmtleWxlbiA9IDMyOyBzc2wtPm1pbmxlbiA9IDMyOworICAgICAgICAgICAgc3NsLT5pdmxlbiAgPSAxNjsgc3NsLT5tYWNsZW4gPSAyMDsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImNpcGhlciAlcyBpcyBub3QgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9nZXRfY2lwaGVyKCBzc2wgKSApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfRkVBVFVSRV9VTkFWQUlMQUJMRSApOworICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDMsICggImtleWxlbjogJWQsIG1pbmxlbjogJWQsIGl2bGVuOiAlZCwgbWFjbGVuOiAlZCIsCisgICAgICAgICAgICAgICAgICAgc3NsLT5rZXlsZW4sIHNzbC0+bWlubGVuLCBzc2wtPml2bGVuLCBzc2wtPm1hY2xlbiApICk7CisKKyAgICAvKgorICAgICAqIEZpbmFsbHkgc2V0dXAgdGhlIGNpcGhlciBjb250ZXh0cywgSVZzIGFuZCBNQUMgc2VjcmV0cy4KKyAgICAgKi8KKyAgICBpZiggc3NsLT5lbmRwb2ludCA9PSBTU0xfSVNfQ0xJRU5UICkKKyAgICB7CisgICAgICAgIGtleTEgPSBrZXlibGsgKyBzc2wtPm1hY2xlbiAqIDI7CisgICAgICAgIGtleTIgPSBrZXlibGsgKyBzc2wtPm1hY2xlbiAqIDIgKyBzc2wtPmtleWxlbjsKKworICAgICAgICBtZW1jcHkoIHNzbC0+bWFjX2VuYywga2V5YmxrLCAgc3NsLT5tYWNsZW4gKTsKKyAgICAgICAgbWVtY3B5KCBzc2wtPm1hY19kZWMsIGtleWJsayArIHNzbC0+bWFjbGVuLCBzc2wtPm1hY2xlbiApOworCisgICAgICAgIG1lbWNweSggc3NsLT5pdl9lbmMsIGtleTIgKyBzc2wtPmtleWxlbiwgIHNzbC0+aXZsZW4gKTsKKyAgICAgICAgbWVtY3B5KCBzc2wtPml2X2RlYywga2V5MiArIHNzbC0+a2V5bGVuICsgc3NsLT5pdmxlbiwKKyAgICAgICAgICAgICAgICBzc2wtPml2bGVuICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGtleTEgPSBrZXlibGsgKyBzc2wtPm1hY2xlbiAqIDIgKyBzc2wtPmtleWxlbjsKKyAgICAgICAga2V5MiA9IGtleWJsayArIHNzbC0+bWFjbGVuICogMjsKKworICAgICAgICBtZW1jcHkoIHNzbC0+bWFjX2RlYywga2V5YmxrLCAgc3NsLT5tYWNsZW4gKTsKKyAgICAgICAgbWVtY3B5KCBzc2wtPm1hY19lbmMsIGtleWJsayArIHNzbC0+bWFjbGVuLCBzc2wtPm1hY2xlbiApOworCisgICAgICAgIG1lbWNweSggc3NsLT5pdl9kZWMsIGtleTEgKyBzc2wtPmtleWxlbiwgIHNzbC0+aXZsZW4gKTsKKyAgICAgICAgbWVtY3B5KCBzc2wtPml2X2VuYywga2V5MSArIHNzbC0+a2V5bGVuICsgc3NsLT5pdmxlbiwKKyAgICAgICAgICAgICAgICBzc2wtPml2bGVuICk7CisgICAgfQorCisgICAgc3dpdGNoKCBzc2wtPnNlc3Npb24tPmNpcGhlciApCisgICAgeworI2lmIGRlZmluZWQoWFlTU0xfQVJDNF9DKQorICAgICAgICBjYXNlIFNTTF9SU0FfUkM0XzEyOF9NRDU6CisgICAgICAgIGNhc2UgU1NMX1JTQV9SQzRfMTI4X1NIQToKKyAgICAgICAgICAgIGFyYzRfc2V0dXAoIChhcmM0X2NvbnRleHQgKikgc3NsLT5jdHhfZW5jLCBrZXkxLCBzc2wtPmtleWxlbiApOworICAgICAgICAgICAgYXJjNF9zZXR1cCggKGFyYzRfY29udGV4dCAqKSBzc2wtPmN0eF9kZWMsIGtleTIsIHNzbC0+a2V5bGVuICk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9ERVNfQykKKyAgICAgICAgY2FzZSBTU0xfUlNBX0RFU18xNjhfU0hBOgorICAgICAgICBjYXNlIFNTTF9FREhfUlNBX0RFU18xNjhfU0hBOgorICAgICAgICAgICAgZGVzM19zZXQza2V5X2VuYyggKGRlczNfY29udGV4dCAqKSBzc2wtPmN0eF9lbmMsIGtleTEgKTsKKyAgICAgICAgICAgIGRlczNfc2V0M2tleV9kZWMoIChkZXMzX2NvbnRleHQgKikgc3NsLT5jdHhfZGVjLCBrZXkyICk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9BRVNfQykKKyAgICAgICAgY2FzZSBTU0xfUlNBX0FFU18xMjhfU0hBOgorICAgICAgICAgICAgYWVzX3NldGtleV9lbmMoIChhZXNfY29udGV4dCAqKSBzc2wtPmN0eF9lbmMsIGtleTEsIDEyOCApOworICAgICAgICAgICAgYWVzX3NldGtleV9kZWMoIChhZXNfY29udGV4dCAqKSBzc2wtPmN0eF9kZWMsIGtleTIsIDEyOCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTU0xfUlNBX0FFU18yNTZfU0hBOgorICAgICAgICBjYXNlIFNTTF9FREhfUlNBX0FFU18yNTZfU0hBOgorICAgICAgICAgICAgYWVzX3NldGtleV9lbmMoIChhZXNfY29udGV4dCAqKSBzc2wtPmN0eF9lbmMsIGtleTEsIDI1NiApOworICAgICAgICAgICAgYWVzX3NldGtleV9kZWMoIChhZXNfY29udGV4dCAqKSBzc2wtPmN0eF9kZWMsIGtleTIsIDI1NiApOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0ZFQVRVUkVfVU5BVkFJTEFCTEUgKTsKKyAgICB9CisKKyAgICBtZW1zZXQoIGtleWJsaywgMCwgc2l6ZW9mKCBrZXlibGsgKSApOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gZGVyaXZlIGtleXMiICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCit2b2lkIHNzbF9jYWxjX3ZlcmlmeSggc3NsX2NvbnRleHQgKnNzbCwgdW5zaWduZWQgY2hhciBoYXNoWzM2XSApCit7CisgICAgbWQ1X2NvbnRleHQgbWQ1OworICAgIHNoYTFfY29udGV4dCBzaGExOworICAgIHVuc2lnbmVkIGNoYXIgcGFkXzFbNDhdOworICAgIHVuc2lnbmVkIGNoYXIgcGFkXzJbNDhdOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPT4gY2FsYyB2ZXJpZnkiICkgKTsKKworICAgIG1lbWNweSggJm1kNSAsICZzc2wtPmZpbl9tZDUgLCBzaXplb2YoICBtZDVfY29udGV4dCApICk7CisgICAgbWVtY3B5KCAmc2hhMSwgJnNzbC0+ZmluX3NoYTEsIHNpemVvZiggc2hhMV9jb250ZXh0ICkgKTsKKworICAgIGlmKCBzc2wtPm1pbm9yX3ZlciA9PSBTU0xfTUlOT1JfVkVSU0lPTl8wICkKKyAgICB7CisgICAgICAgIG1lbXNldCggcGFkXzEsIDB4MzYsIDQ4ICk7CisgICAgICAgIG1lbXNldCggcGFkXzIsIDB4NUMsIDQ4ICk7CisKKyAgICAgICAgbWQ1X3VwZGF0ZSggJm1kNSwgc3NsLT5zZXNzaW9uLT5tYXN0ZXIsIDQ4ICk7CisgICAgICAgIG1kNV91cGRhdGUoICZtZDUsIHBhZF8xLCA0OCApOworICAgICAgICBtZDVfZmluaXNoKCAmbWQ1LCBoYXNoICk7CisKKyAgICAgICAgbWQ1X3N0YXJ0cyggJm1kNSApOworICAgICAgICBtZDVfdXBkYXRlKCAmbWQ1LCBzc2wtPnNlc3Npb24tPm1hc3RlciwgNDggKTsKKyAgICAgICAgbWQ1X3VwZGF0ZSggJm1kNSwgcGFkXzIsIDQ4ICk7CisgICAgICAgIG1kNV91cGRhdGUoICZtZDUsIGhhc2gsICAxNiApOworICAgICAgICBtZDVfZmluaXNoKCAmbWQ1LCBoYXNoICk7CisgICAgICAgIAorICAgICAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHNzbC0+c2Vzc2lvbi0+bWFzdGVyLCA0OCApOworICAgICAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHBhZF8xLCA0MCApOworICAgICAgICBzaGExX2ZpbmlzaCggJnNoYTEsIGhhc2ggKyAxNiApOworCisgICAgICAgIHNoYTFfc3RhcnRzKCAmc2hhMSApOworICAgICAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHNzbC0+c2Vzc2lvbi0+bWFzdGVyLCA0OCApOworICAgICAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHBhZF8yLCA0MCApOworICAgICAgICBzaGExX3VwZGF0ZSggJnNoYTEsIGhhc2ggKyAxNiwgMjAgKTsKKyAgICAgICAgc2hhMV9maW5pc2goICZzaGExLCBoYXNoICsgMTYgKTsKKyAgICB9CisgICAgZWxzZSAvKiBUTFN2MSAqLworICAgIHsKKyAgICAgICAgIG1kNV9maW5pc2goICZtZDUsICBoYXNoICk7CisgICAgICAgIHNoYTFfZmluaXNoKCAmc2hhMSwgaGFzaCArIDE2ICk7CisgICAgfQorCisgICAgU1NMX0RFQlVHX0JVRiggMywgImNhbGN1bGF0ZWQgdmVyaWZ5IHJlc3VsdCIsIGhhc2gsIDM2ICk7CisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gY2FsYyB2ZXJpZnkiICkgKTsKKworICAgIHJldHVybjsKK30KKworLyoKKyAqIFNTTHYzLjAgTUFDIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCBzc2xfbWFjX21kNSggdW5zaWduZWQgY2hhciAqc2VjcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdHIsIGludCB0eXBlICkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGhlYWRlclsxMV07CisgICAgdW5zaWduZWQgY2hhciBwYWRkaW5nWzQ4XTsKKyAgICBtZDVfY29udGV4dCBtZDU7CisKKyAgICBtZW1jcHkoIGhlYWRlciwgY3RyLCA4ICk7CisgICAgaGVhZGVyWyA4XSA9ICh1bnNpZ25lZCBjaGFyKSAgdHlwZTsKKyAgICBoZWFkZXJbIDldID0gKHVuc2lnbmVkIGNoYXIpKCBsZW4gPj4gOCApOworICAgIGhlYWRlclsxMF0gPSAodW5zaWduZWQgY2hhcikoIGxlbiAgICAgICk7CisKKyAgICBtZW1zZXQoIHBhZGRpbmcsIDB4MzYsIDQ4ICk7CisgICAgbWQ1X3N0YXJ0cyggJm1kNSApOworICAgIG1kNV91cGRhdGUoICZtZDUsIHNlY3JldCwgIDE2ICk7CisgICAgbWQ1X3VwZGF0ZSggJm1kNSwgcGFkZGluZywgNDggKTsKKyAgICBtZDVfdXBkYXRlKCAmbWQ1LCBoZWFkZXIsICAxMSApOworICAgIG1kNV91cGRhdGUoICZtZDUsIGJ1ZiwgIGxlbiApOworICAgIG1kNV9maW5pc2goICZtZDUsIGJ1ZiArIGxlbiApOworCisgICAgbWVtc2V0KCBwYWRkaW5nLCAweDVDLCA0OCApOworICAgIG1kNV9zdGFydHMoICZtZDUgKTsKKyAgICBtZDVfdXBkYXRlKCAmbWQ1LCBzZWNyZXQsICAxNiApOworICAgIG1kNV91cGRhdGUoICZtZDUsIHBhZGRpbmcsIDQ4ICk7CisgICAgbWQ1X3VwZGF0ZSggJm1kNSwgYnVmICsgbGVuLCAxNiApOworICAgIG1kNV9maW5pc2goICZtZDUsIGJ1ZiArIGxlbiApOworfQorCitzdGF0aWMgdm9pZCBzc2xfbWFjX3NoYTEoIHVuc2lnbmVkIGNoYXIgKnNlY3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdHIsIGludCB0eXBlICkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGhlYWRlclsxMV07CisgICAgdW5zaWduZWQgY2hhciBwYWRkaW5nWzQwXTsKKyAgICBzaGExX2NvbnRleHQgc2hhMTsKKworICAgIG1lbWNweSggaGVhZGVyLCBjdHIsIDggKTsKKyAgICBoZWFkZXJbIDhdID0gKHVuc2lnbmVkIGNoYXIpICB0eXBlOworICAgIGhlYWRlclsgOV0gPSAodW5zaWduZWQgY2hhcikoIGxlbiA+PiA4ICk7CisgICAgaGVhZGVyWzEwXSA9ICh1bnNpZ25lZCBjaGFyKSggbGVuICAgICAgKTsKKworICAgIG1lbXNldCggcGFkZGluZywgMHgzNiwgNDAgKTsKKyAgICBzaGExX3N0YXJ0cyggJnNoYTEgKTsKKyAgICBzaGExX3VwZGF0ZSggJnNoYTEsIHNlY3JldCwgIDIwICk7CisgICAgc2hhMV91cGRhdGUoICZzaGExLCBwYWRkaW5nLCA0MCApOworICAgIHNoYTFfdXBkYXRlKCAmc2hhMSwgaGVhZGVyLCAgMTEgKTsKKyAgICBzaGExX3VwZGF0ZSggJnNoYTEsIGJ1ZiwgIGxlbiApOworICAgIHNoYTFfZmluaXNoKCAmc2hhMSwgYnVmICsgbGVuICk7CisKKyAgICBtZW1zZXQoIHBhZGRpbmcsIDB4NUMsIDQwICk7CisgICAgc2hhMV9zdGFydHMoICZzaGExICk7CisgICAgc2hhMV91cGRhdGUoICZzaGExLCBzZWNyZXQsICAyMCApOworICAgIHNoYTFfdXBkYXRlKCAmc2hhMSwgcGFkZGluZywgNDAgKTsKKyAgICBzaGExX3VwZGF0ZSggJnNoYTEsIGJ1ZiArIGxlbiwgMjAgKTsKKyAgICBzaGExX2ZpbmlzaCggJnNoYTEsIGJ1ZiArIGxlbiApOworfQorCisvKgorICogRW5jcnlwdGlvbi9kZWNyeXB0aW9uIGZ1bmN0aW9ucworICovIAorc3RhdGljIGludCBzc2xfZW5jcnlwdF9idWYoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCBpLCBwYWRsZW47CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiBlbmNyeXB0IGJ1ZiIgKSApOworCisgICAgLyoKKyAgICAgKiBBZGQgTUFDIHRoZW4gZW5jcnlwdAorICAgICAqLworICAgIGlmKCBzc2wtPm1pbm9yX3ZlciA9PSBTU0xfTUlOT1JfVkVSU0lPTl8wICkKKyAgICB7CisgICAgICAgIGlmKCBzc2wtPm1hY2xlbiA9PSAxNiApCisgICAgICAgICAgICAgc3NsX21hY19tZDUoIHNzbC0+bWFjX2VuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5vdXRfbXNnLCBzc2wtPm91dF9tc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+b3V0X2N0ciwgc3NsLT5vdXRfbXNndHlwZSApOworCisgICAgICAgIGlmKCBzc2wtPm1hY2xlbiA9PSAyMCApCisgICAgICAgICAgICBzc2xfbWFjX3NoYTEoIHNzbC0+bWFjX2VuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5vdXRfbXNnLCBzc2wtPm91dF9tc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+b3V0X2N0ciwgc3NsLT5vdXRfbXNndHlwZSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggc3NsLT5tYWNsZW4gPT0gMTYgKQorICAgICAgICAgICAgIG1kNV9obWFjKCBzc2wtPm1hY19lbmMsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICBzc2wtPm91dF9jdHIsICBzc2wtPm91dF9tc2dsZW4gKyAxMywKKyAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5vdXRfbXNnICsgc3NsLT5vdXRfbXNnbGVuICk7CisKKyAgICAgICAgaWYoIHNzbC0+bWFjbGVuID09IDIwICkKKyAgICAgICAgICAgIHNoYTFfaG1hYyggc3NsLT5tYWNfZW5jLCAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5vdXRfY3RyLCAgc3NsLT5vdXRfbXNnbGVuICsgMTMsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+b3V0X21zZyArIHNzbC0+b3V0X21zZ2xlbiApOyAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIFNTTF9ERUJVR19CVUYoIDQsICJjb21wdXRlZCBtYWMiLAorICAgICAgICAgICAgICAgICAgIHNzbC0+b3V0X21zZyArIHNzbC0+b3V0X21zZ2xlbiwgc3NsLT5tYWNsZW4gKTsKKworICAgIHNzbC0+b3V0X21zZ2xlbiArPSBzc2wtPm1hY2xlbjsKKworICAgIGZvciggaSA9IDc7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgaWYoICsrc3NsLT5vdXRfY3RyW2ldICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBpZiggc3NsLT5pdmxlbiA9PSAwICkKKyAgICB7CisjaWYgZGVmaW5lZChYWVNTTF9BUkM0X0MpCisgICAgICAgIHBhZGxlbiA9IDA7CisKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMywgKCAiYmVmb3JlIGVuY3J5cHQ6IG1zZ2xlbiA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY2x1ZGluZyAlZCBieXRlcyBvZiBwYWRkaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5vdXRfbXNnbGVuLCAwICkgKTsKKworICAgICAgICBTU0xfREVCVUdfQlVGKCA0LCAiYmVmb3JlIGVuY3J5cHQ6IG91dHB1dCBwYXlsb2FkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5vdXRfbXNnLCBzc2wtPm91dF9tc2dsZW4gKTsKKworICAgICAgICBhcmM0X2NyeXB0KCAoYXJjNF9jb250ZXh0ICopIHNzbC0+Y3R4X2VuYywKKyAgICAgICAgICAgICAgICAgICAgc3NsLT5vdXRfbXNnLCBzc2wtPm91dF9tc2dsZW4gKTsKKyNlbHNlCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9GRUFUVVJFX1VOQVZBSUxBQkxFICk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGFkbGVuID0gc3NsLT5pdmxlbiAtICggc3NsLT5vdXRfbXNnbGVuICsgMSApICUgc3NsLT5pdmxlbjsKKyAgICAgICAgaWYoIHBhZGxlbiA9PSBzc2wtPml2bGVuICkKKyAgICAgICAgICAgIHBhZGxlbiA9IDA7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBwYWRsZW47IGkrKyApCisgICAgICAgICAgICBzc2wtPm91dF9tc2dbc3NsLT5vdXRfbXNnbGVuICsgaV0gPSAodW5zaWduZWQgY2hhcikgcGFkbGVuOworCisgICAgICAgIHNzbC0+b3V0X21zZ2xlbiArPSBwYWRsZW4gKyAxOworCisgICAgICAgIFNTTF9ERUJVR19NU0coIDMsICggImJlZm9yZSBlbmNyeXB0OiBtc2dsZW4gPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRpbmcgJWQgYnl0ZXMgb2YgcGFkZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+b3V0X21zZ2xlbiwgcGFkbGVuICsgMSApICk7CisKKyAgICAgICAgU1NMX0RFQlVHX0JVRiggNCwgImJlZm9yZSBlbmNyeXB0OiBvdXRwdXQgcGF5bG9hZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+b3V0X21zZywgc3NsLT5vdXRfbXNnbGVuICk7CisKKyAgICAgICAgc3dpdGNoKCBzc2wtPml2bGVuICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAgODoKKyNpZiBkZWZpbmVkKFhZU1NMX0RFU19DKQorICAgICAgICAgICAgICAgIGRlczNfY3J5cHRfY2JjKCAoZGVzM19jb250ZXh0ICopIHNzbC0+Y3R4X2VuYywKKyAgICAgICAgICAgICAgICAgICAgREVTX0VOQ1JZUFQsIHNzbC0+b3V0X21zZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgc3NsLT5pdl9lbmMsIHNzbC0+b3V0X21zZywgc3NsLT5vdXRfbXNnICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICAgICAgY2FzZSAxNjoKKyNpZiBkZWZpbmVkKFhZU1NMX0FFU19DKQorICAgICAgICAgICAgICAgIGFlc19jcnlwdF9jYmMoIChhZXNfY29udGV4dCAqKSBzc2wtPmN0eF9lbmMsCisgICAgICAgICAgICAgICAgICAgIEFFU19FTkNSWVBULCBzc2wtPm91dF9tc2dsZW4sCisgICAgICAgICAgICAgICAgICAgIHNzbC0+aXZfZW5jLCBzc2wtPm91dF9tc2csIHNzbC0+b3V0X21zZyApOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0ZFQVRVUkVfVU5BVkFJTEFCTEUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IGVuY3J5cHQgYnVmIiApICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworc3RhdGljIGludCBzc2xfZGVjcnlwdF9idWYoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCBpLCBwYWRsZW47CisgICAgdW5zaWduZWQgY2hhciB0bXBbMjBdOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPT4gZGVjcnlwdCBidWYiICkgKTsKKworICAgIGlmKCBzc2wtPmluX21zZ2xlbiA8IHNzbC0+bWlubGVuICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImluX21zZ2xlbiAoJWQpIDwgbWlubGVuICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX21zZ2xlbiwgc3NsLT5taW5sZW4gKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfSU5WQUxJRF9NQUMgKTsKKyAgICB9CisKKyAgICBpZiggc3NsLT5pdmxlbiA9PSAwICkKKyAgICB7CisjaWYgZGVmaW5lZChYWVNTTF9BUkM0X0MpCisgICAgICAgIHBhZGxlbiA9IDA7CisgICAgICAgIGFyYzRfY3J5cHQoIChhcmM0X2NvbnRleHQgKikgc3NsLT5jdHhfZGVjLAorICAgICAgICAgICAgICAgICAgICBzc2wtPmluX21zZywgc3NsLT5pbl9tc2dsZW4gKTsKKyNlbHNlCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9GRUFUVVJFX1VOQVZBSUxBQkxFICk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRGVjcnlwdCBhbmQgY2hlY2sgdGhlIHBhZGRpbmcKKyAgICAgICAgICovCisgICAgICAgIGlmKCBzc2wtPmluX21zZ2xlbiAlIHNzbC0+aXZsZW4gIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggIm1zZ2xlbiAoJWQpICUlIGl2bGVuICglZCkgIT0gMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX21zZ2xlbiwgc3NsLT5pdmxlbiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfSU5WQUxJRF9NQUMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCggc3NsLT5pdmxlbiApCisgICAgICAgIHsKKyNpZiBkZWZpbmVkKFhZU1NMX0RFU19DKQorICAgICAgICAgICAgY2FzZSAgODoKKyAgICAgICAgICAgICAgICBkZXMzX2NyeXB0X2NiYyggKGRlczNfY29udGV4dCAqKSBzc2wtPmN0eF9kZWMsCisgICAgICAgICAgICAgICAgICAgIERFU19ERUNSWVBULCBzc2wtPmluX21zZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgc3NsLT5pdl9kZWMsIHNzbC0+aW5fbXNnLCBzc2wtPmluX21zZyApOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFhZU1NMX0FFU19DKQorICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgYWVzX2NyeXB0X2NiYyggKGFlc19jb250ZXh0ICopIHNzbC0+Y3R4X2RlYywKKyAgICAgICAgICAgICAgICAgICAgQUVTX0RFQ1JZUFQsIHNzbC0+aW5fbXNnbGVuLAorICAgICAgICAgICAgICAgICAgICBzc2wtPml2X2RlYywgc3NsLT5pbl9tc2csIHNzbC0+aW5fbXNnICk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0ZFQVRVUkVfVU5BVkFJTEFCTEUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhZGxlbiA9IDEgKyBzc2wtPmluX21zZ1tzc2wtPmluX21zZ2xlbiAtIDFdOworCisgICAgICAgIGlmKCBzc2wtPm1pbm9yX3ZlciA9PSBTU0xfTUlOT1JfVkVSU0lPTl8wICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBhZGxlbiA+IHNzbC0+aXZsZW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBwYWRkaW5nIGxlbmd0aDogaXMgJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgYmUgbm8gbW9yZSB0aGFuICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRsZW4sIHNzbC0+aXZsZW4gKSApOworICAgICAgICAgICAgICAgIHBhZGxlbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVExTdjE6IGFsd2F5cyBjaGVjayB0aGUgcGFkZGluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IoIGkgPSAxOyBpIDw9IHBhZGxlbjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggc3NsLT5pbl9tc2dbc3NsLT5pbl9tc2dsZW4gLSBpXSAhPSBwYWRsZW4gLSAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBwYWRkaW5nIGJ5dGU6IHNob3VsZCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwMngsIGJ1dCBpcyAlMDJ4IiwgcGFkbGVuIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5pbl9tc2dbc3NsLT5pbl9tc2dsZW4gLSBpXSApICk7CisgICAgICAgICAgICAgICAgICAgIHBhZGxlbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgU1NMX0RFQlVHX0JVRiggNCwgInJhdyBidWZmZXIgYWZ0ZXIgZGVjcnlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgc3NsLT5pbl9tc2csIHNzbC0+aW5fbXNnbGVuICk7CisKKyAgICAvKgorICAgICAqIEFsd2F5cyBjb21wdXRlIHRoZSBNQUMgKFJGQzQzNDYsIENCQ1RJTUUpLgorICAgICAqLworICAgIHNzbC0+aW5fbXNnbGVuIC09ICggc3NsLT5tYWNsZW4gKyBwYWRsZW4gKTsKKworICAgIHNzbC0+aW5faGRyWzNdID0gKHVuc2lnbmVkIGNoYXIpKCBzc2wtPmluX21zZ2xlbiA+PiA4ICk7CisgICAgc3NsLT5pbl9oZHJbNF0gPSAodW5zaWduZWQgY2hhcikoIHNzbC0+aW5fbXNnbGVuICAgICAgKTsKKworICAgIG1lbWNweSggdG1wLCBzc2wtPmluX21zZyArIHNzbC0+aW5fbXNnbGVuLCAyMCApOworCisgICAgaWYoIHNzbC0+bWlub3JfdmVyID09IFNTTF9NSU5PUl9WRVJTSU9OXzAgKQorICAgIHsKKyAgICAgICAgaWYoIHNzbC0+bWFjbGVuID09IDE2ICkKKyAgICAgICAgICAgICBzc2xfbWFjX21kNSggc3NsLT5tYWNfZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX21zZywgc3NsLT5pbl9tc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+aW5fY3RyLCBzc2wtPmluX21zZ3R5cGUgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3NsX21hY19zaGExKCBzc2wtPm1hY19kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+aW5fbXNnLCBzc2wtPmluX21zZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5pbl9jdHIsIHNzbC0+aW5fbXNndHlwZSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggc3NsLT5tYWNsZW4gPT0gMTYgKQorICAgICAgICAgICAgIG1kNV9obWFjKCBzc2wtPm1hY19kZWMsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX2N0ciwgIHNzbC0+aW5fbXNnbGVuICsgMTMsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+aW5fbXNnICsgc3NsLT5pbl9tc2dsZW4gKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2hhMV9obWFjKCBzc2wtPm1hY19kZWMsIDIwLAorICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX2N0ciwgIHNzbC0+aW5fbXNnbGVuICsgMTMsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+aW5fbXNnICsgc3NsLT5pbl9tc2dsZW4gKTsKKyAgICB9CisKKyAgICBTU0xfREVCVUdfQlVGKCA0LCAibWVzc2FnZSAgbWFjIiwgdG1wLCBzc2wtPm1hY2xlbiApOworICAgIFNTTF9ERUJVR19CVUYoIDQsICJjb21wdXRlZCBtYWMiLCBzc2wtPmluX21zZyArIHNzbC0+aW5fbXNnbGVuLAorICAgICAgICAgICAgICAgICAgIHNzbC0+bWFjbGVuICk7CisKKyAgICBpZiggbWVtY21wKCB0bXAsIHNzbC0+aW5fbXNnICsgc3NsLT5pbl9tc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICBzc2wtPm1hY2xlbiApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAibWVzc2FnZSBtYWMgZG9lcyBub3QgbWF0Y2giICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0lOVkFMSURfTUFDICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaW5hbGx5IGNoZWNrIHRoZSBwYWRkaW5nIGxlbmd0aDsgYmFkIHBhZGRpbmcKKyAgICAgKiB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgZXJyb3IgYXMgYW4gaW52YWxpZCBNQUMuCisgICAgICovCisgICAgaWYoIHNzbC0+aXZsZW4gIT0gMCAmJiBwYWRsZW4gPT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9JTlZBTElEX01BQyApOworCisgICAgaWYoIHNzbC0+aW5fbXNnbGVuID09IDAgKQorICAgIHsKKyAgICAgICAgc3NsLT5uYl96ZXJvKys7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhyZWUgb3IgbW9yZSBlbXB0eSBtZXNzYWdlcyBtYXkgYmUgYSBEb1MgYXR0YWNrCisgICAgICAgICAqIChleGNlc3NpdmUgQ1BVIGNvbnN1bXB0aW9uKS4KKyAgICAgICAgICovCisgICAgICAgIGlmKCBzc2wtPm5iX3plcm8gPiAzICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAicmVjZWl2ZWQgZm91ciBjb25zZWN1dGl2ZSBlbXB0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlcywgcG9zc2libGUgRG9TIGF0dGFjayIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0lOVkFMSURfTUFDICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBzc2wtPm5iX3plcm8gPSAwOworICAgICAgICAgICAgCisgICAgZm9yKCBpID0gNzsgaSA+PSAwOyBpLS0gKQorICAgICAgICBpZiggKytzc2wtPmluX2N0cltpXSAhPSAwICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gZGVjcnlwdCBidWYiICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogRmlsbCB0aGUgaW5wdXQgbWVzc2FnZSBidWZmZXIKKyAqLworaW50IHNzbF9mZXRjaF9pbnB1dCggc3NsX2NvbnRleHQgKnNzbCwgaW50IG5iX3dhbnQgKQoreworICAgIGludCByZXQsIGxlbjsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IGZldGNoIGlucHV0IiApICk7CisKKyAgICB3aGlsZSggc3NsLT5pbl9sZWZ0IDwgbmJfd2FudCApCisgICAgeworICAgICAgICBsZW4gPSBuYl93YW50IC0gc3NsLT5pbl9sZWZ0OworICAgICAgICByZXQgPSBzc2wtPmZfcmVjdiggc3NsLT5wX3JlY3YsIHNzbC0+aW5faGRyICsgc3NsLT5pbl9sZWZ0LCBsZW4gKTsKKworICAgICAgICBTU0xfREVCVUdfTVNHKCAyLCAoICJpbl9sZWZ0OiAlZCwgbmJfd2FudDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX2xlZnQsIG5iX3dhbnQgKSApOworICAgICAgICBTU0xfREVCVUdfUkVUKCAyLCAic3NsLT5mX3JlY3YiLCByZXQgKTsKKworICAgICAgICBpZiggcmV0IDwgMCApCisgICAgICAgICAgICByZXR1cm4oIHJldCApOworCisgICAgICAgIHNzbC0+aW5fbGVmdCArPSByZXQ7CisgICAgfQorCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gZmV0Y2ggaW5wdXQiICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogRmx1c2ggYW55IGRhdGEgbm90IHlldCB3cml0dGVuCisgKi8KK2ludCBzc2xfZmx1c2hfb3V0cHV0KCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IGZsdXNoIG91dHB1dCIgKSApOworCisgICAgd2hpbGUoIHNzbC0+b3V0X2xlZnQgPiAwICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDIsICggIm1lc3NhZ2UgbGVuZ3RoOiAlZCwgb3V0X2xlZnQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgNSArIHNzbC0+b3V0X21zZ2xlbiwgc3NsLT5vdXRfbGVmdCApICk7CisKKyAgICAgICAgYnVmID0gc3NsLT5vdXRfaGRyICsgNSArIHNzbC0+b3V0X21zZ2xlbiAtIHNzbC0+b3V0X2xlZnQ7CisgICAgICAgIHJldCA9IHNzbC0+Zl9zZW5kKCBzc2wtPnBfc2VuZCwgYnVmLCBzc2wtPm91dF9sZWZ0ICk7CisgICAgICAgIFNTTF9ERUJVR19SRVQoIDIsICJzc2wtPmZfc2VuZCIsIHJldCApOworCisgICAgICAgIGlmKCByZXQgPD0gMCApCisgICAgICAgICAgICByZXR1cm4oIHJldCApOworCisgICAgICAgIHNzbC0+b3V0X2xlZnQgLT0gcmV0OworICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IGZsdXNoIG91dHB1dCIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBSZWNvcmQgbGF5ZXIgZnVuY3Rpb25zCisgKi8KK2ludCBzc2xfd3JpdGVfcmVjb3JkKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgcmV0LCBsZW4gPSBzc2wtPm91dF9tc2dsZW47CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiB3cml0ZSByZWNvcmQiICkgKTsKKworICAgIHNzbC0+b3V0X2hkclswXSA9ICh1bnNpZ25lZCBjaGFyKSBzc2wtPm91dF9tc2d0eXBlOworICAgIHNzbC0+b3V0X2hkclsxXSA9ICh1bnNpZ25lZCBjaGFyKSBzc2wtPm1ham9yX3ZlcjsKKyAgICBzc2wtPm91dF9oZHJbMl0gPSAodW5zaWduZWQgY2hhcikgc3NsLT5taW5vcl92ZXI7CisgICAgc3NsLT5vdXRfaGRyWzNdID0gKHVuc2lnbmVkIGNoYXIpKCBsZW4gPj4gOCApOworICAgIHNzbC0+b3V0X2hkcls0XSA9ICh1bnNpZ25lZCBjaGFyKSggbGVuICAgICAgKTsKKworICAgIGlmKCBzc2wtPm91dF9tc2d0eXBlID09IFNTTF9NU0dfSEFORFNIQUtFICkKKyAgICB7CisgICAgICAgIHNzbC0+b3V0X21zZ1sxXSA9ICh1bnNpZ25lZCBjaGFyKSggKCBsZW4gLSA0ICkgPj4gMTYgKTsKKyAgICAgICAgc3NsLT5vdXRfbXNnWzJdID0gKHVuc2lnbmVkIGNoYXIpKCAoIGxlbiAtIDQgKSA+PiAgOCApOworICAgICAgICBzc2wtPm91dF9tc2dbM10gPSAodW5zaWduZWQgY2hhcikoICggbGVuIC0gNCApICAgICAgICk7CisKKyAgICAgICAgIG1kNV91cGRhdGUoICZzc2wtPmZpbl9tZDUgLCBzc2wtPm91dF9tc2csIGxlbiApOworICAgICAgICBzaGExX3VwZGF0ZSggJnNzbC0+ZmluX3NoYTEsIHNzbC0+b3V0X21zZywgbGVuICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+ZG9fY3J5cHQgIT0gMCApCisgICAgeworICAgICAgICBpZiggKCByZXQgPSBzc2xfZW5jcnlwdF9idWYoIHNzbCApICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfZW5jcnlwdF9idWYiLCByZXQgKTsKKyAgICAgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBzc2wtPm91dF9tc2dsZW47CisgICAgICAgIHNzbC0+b3V0X2hkclszXSA9ICh1bnNpZ25lZCBjaGFyKSggbGVuID4+IDggKTsKKyAgICAgICAgc3NsLT5vdXRfaGRyWzRdID0gKHVuc2lnbmVkIGNoYXIpKCBsZW4gICAgICApOworICAgIH0KKworICAgIHNzbC0+b3V0X2xlZnQgPSA1ICsgc3NsLT5vdXRfbXNnbGVuOworCisgICAgU1NMX0RFQlVHX01TRyggMywgKCAib3V0cHV0IHJlY29yZDogbXNndHlwZSA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiA9IFslZDolZF0sIG1zZ2xlbiA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICBzc2wtPm91dF9oZHJbMF0sIHNzbC0+b3V0X2hkclsxXSwgc3NsLT5vdXRfaGRyWzJdLAorICAgICAgICAgICAgICAgICAoIHNzbC0+b3V0X2hkclszXSA8PCA4ICkgfCBzc2wtPm91dF9oZHJbNF0gKSApOworCisgICAgU1NMX0RFQlVHX0JVRiggNCwgIm91dHB1dCByZWNvcmQgc2VudCB0byBuZXR3b3JrIiwKKyAgICAgICAgICAgICAgICAgICBzc2wtPm91dF9oZHIsIDUgKyBzc2wtPm91dF9tc2dsZW4gKTsKKworICAgIGlmKCAoIHJldCA9IHNzbF9mbHVzaF9vdXRwdXQoIHNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX2ZsdXNoX291dHB1dCIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IHdyaXRlIHJlY29yZCIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKK2ludCBzc2xfcmVhZF9yZWNvcmQoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCByZXQ7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiByZWFkIHJlY29yZCIgKSApOworCisgICAgaWYoIHNzbC0+aW5faHNsZW4gIT0gMCAmJgorICAgICAgICBzc2wtPmluX2hzbGVuIDwgc3NsLT5pbl9tc2dsZW4gKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IG5leHQgSGFuZHNoYWtlIG1lc3NhZ2UgaW4gdGhlIGN1cnJlbnQgcmVjb3JkCisgICAgICAgICAqLworICAgICAgICBzc2wtPmluX21zZ2xlbiAtPSBzc2wtPmluX2hzbGVuOworCisgICAgICAgIG1lbWNweSggc3NsLT5pbl9tc2csIHNzbC0+aW5fbXNnICsgc3NsLT5pbl9oc2xlbiwKKyAgICAgICAgICAgICAgICBzc2wtPmluX21zZ2xlbiApOworCisgICAgICAgIHNzbC0+aW5faHNsZW4gID0gNDsKKyAgICAgICAgc3NsLT5pbl9oc2xlbiArPSAoIHNzbC0+aW5fbXNnWzJdIDw8IDggKSB8IHNzbC0+aW5fbXNnWzNdOworCisgICAgICAgIFNTTF9ERUJVR19NU0coIDMsICggImhhbmRzaGFrZSBtZXNzYWdlOiBtc2dsZW4gPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVkLCB0eXBlID0gJWQsIGhzbGVuID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX21zZ2xlbiwgc3NsLT5pbl9tc2dbMF0sIHNzbC0+aW5faHNsZW4gKSApOworCisgICAgICAgIGlmKCBzc2wtPmluX21zZ2xlbiA8IDQgfHwgc3NsLT5pbl9tc2dbMV0gIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBoYW5kc2hha2UgbGVuZ3RoIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfSU5WQUxJRF9SRUNPUkQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzc2wtPmluX21zZ2xlbiA8IHNzbC0+aW5faHNsZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgaGFuZHNoYWtlIGxlbmd0aCIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0lOVkFMSURfUkVDT1JEICk7CisgICAgICAgIH0KKworICAgICAgICAgbWQ1X3VwZGF0ZSggJnNzbC0+ZmluX21kNSAsIHNzbC0+aW5fbXNnLCBzc2wtPmluX2hzbGVuICk7CisgICAgICAgIHNoYTFfdXBkYXRlKCAmc3NsLT5maW5fc2hhMSwgc3NsLT5pbl9tc2csIHNzbC0+aW5faHNsZW4gKTsKKworICAgICAgICByZXR1cm4oIDAgKTsKKyAgICB9CisKKyAgICBzc2wtPmluX2hzbGVuID0gMDsKKworICAgIC8qCisgICAgICogUmVhZCB0aGUgcmVjb3JkIGhlYWRlciBhbmQgdmFsaWRhdGUgaXQKKyAgICAgKi8KKyAgICBpZiggKCByZXQgPSBzc2xfZmV0Y2hfaW5wdXQoIHNzbCwgNSApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX2ZldGNoX2lucHV0IiwgcmV0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgc3NsLT5pbl9tc2d0eXBlID0gIHNzbC0+aW5faGRyWzBdOworICAgIHNzbC0+aW5fbXNnbGVuID0gKCBzc2wtPmluX2hkclszXSA8PCA4ICkgfCBzc2wtPmluX2hkcls0XTsKKworICAgIFNTTF9ERUJVR19NU0coIDMsICggImlucHV0IHJlY29yZDogbXNndHlwZSA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiA9IFslZDolZF0sIG1zZ2xlbiA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHNzbC0+aW5faGRyWzBdLCBzc2wtPmluX2hkclsxXSwgc3NsLT5pbl9oZHJbMl0sCisgICAgICAgICAgICAgICAgICAgKCBzc2wtPmluX2hkclszXSA8PCA4ICkgfCBzc2wtPmluX2hkcls0XSApICk7CisKKyAgICBpZiggc3NsLT5pbl9oZHJbMV0gIT0gc3NsLT5tYWpvcl92ZXIgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAibWFqb3IgdmVyc2lvbiBtaXNtYXRjaCIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfSU5WQUxJRF9SRUNPUkQgKTsKKyAgICB9CisKKyAgICBpZiggc3NsLT5pbl9oZHJbMl0gIT0gU1NMX01JTk9SX1ZFUlNJT05fMCAmJgorICAgICAgICBzc2wtPmluX2hkclsyXSAhPSBTU0xfTUlOT1JfVkVSU0lPTl8xICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggIm1pbm9yIHZlcnNpb24gbWlzbWF0Y2giICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0lOVkFMSURfUkVDT1JEICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGlzIGFjY2VwdGFibGUKKyAgICAgKi8KKyAgICBpZiggc3NsLT5kb19jcnlwdCA9PSAwICkKKyAgICB7CisgICAgICAgIGlmKCBzc2wtPmluX21zZ2xlbiA8IDEgfHwKKyAgICAgICAgICAgIHNzbC0+aW5fbXNnbGVuID4gU1NMX01BWF9DT05URU5UX0xFTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBtZXNzYWdlIGxlbmd0aCIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0lOVkFMSURfUkVDT1JEICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHNzbC0+aW5fbXNnbGVuIDwgc3NsLT5taW5sZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgbWVzc2FnZSBsZW5ndGgiICkgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9JTlZBTElEX1JFQ09SRCApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNzbC0+bWlub3JfdmVyID09IFNTTF9NSU5PUl9WRVJTSU9OXzAgJiYKKyAgICAgICAgICAgIHNzbC0+aW5fbXNnbGVuID4gc3NsLT5taW5sZW4gKyBTU0xfTUFYX0NPTlRFTlRfTEVOICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIG1lc3NhZ2UgbGVuZ3RoIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfSU5WQUxJRF9SRUNPUkQgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFRMUyBlbmNyeXB0ZWQgbWVzc2FnZXMgY2FuIGhhdmUgdXAgdG8gMjU2IGJ5dGVzIG9mIHBhZGRpbmcKKyAgICAgICAgICovCisgICAgICAgIGlmKCBzc2wtPm1pbm9yX3ZlciA9PSBTU0xfTUlOT1JfVkVSU0lPTl8xICYmCisgICAgICAgICAgICBzc2wtPmluX21zZ2xlbiA+IHNzbC0+bWlubGVuICsgU1NMX01BWF9DT05URU5UX0xFTiArIDI1NiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBtZXNzYWdlIGxlbmd0aCIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0lOVkFMSURfUkVDT1JEICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlYWQgYW5kIG9wdGlvbmFsbHkgZGVjcnlwdCB0aGUgbWVzc2FnZSBjb250ZW50cworICAgICAqLworICAgIGlmKCAoIHJldCA9IHNzbF9mZXRjaF9pbnB1dCggc3NsLCA1ICsgc3NsLT5pbl9tc2dsZW4gKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF9mZXRjaF9pbnB1dCIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIFNTTF9ERUJVR19CVUYoIDQsICJpbnB1dCByZWNvcmQgZnJvbSBuZXR3b3JrIiwKKyAgICAgICAgICAgICAgICAgICBzc2wtPmluX2hkciwgNSArIHNzbC0+aW5fbXNnbGVuICk7CisKKyAgICBpZiggc3NsLT5kb19jcnlwdCAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCAoIHJldCA9IHNzbF9kZWNyeXB0X2J1Ziggc3NsICkgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF9kZWNyeXB0X2J1ZiIsIHJldCApOworICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIFNTTF9ERUJVR19CVUYoIDQsICJpbnB1dCBwYXlsb2FkIGFmdGVyIGRlY3J5cHQiLAorICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX21zZywgc3NsLT5pbl9tc2dsZW4gKTsKKworICAgICAgICBpZiggc3NsLT5pbl9tc2dsZW4gPiBTU0xfTUFYX0NPTlRFTlRfTEVOICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIG1lc3NhZ2UgbGVuZ3RoIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfSU5WQUxJRF9SRUNPUkQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBzc2wtPmluX21zZ3R5cGUgPT0gU1NMX01TR19IQU5EU0hBS0UgKQorICAgIHsKKyAgICAgICAgc3NsLT5pbl9oc2xlbiAgPSA0OworICAgICAgICBzc2wtPmluX2hzbGVuICs9ICggc3NsLT5pbl9tc2dbMl0gPDwgOCApIHwgc3NsLT5pbl9tc2dbM107CisKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMywgKCAiaGFuZHNoYWtlIG1lc3NhZ2U6IG1zZ2xlbiA9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIHR5cGUgPSAlZCwgaHNsZW4gPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbC0+aW5fbXNnbGVuLCBzc2wtPmluX21zZ1swXSwgc3NsLT5pbl9oc2xlbiApICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQWRkaXRpb25hbCBjaGVja3MgdG8gdmFsaWRhdGUgdGhlIGhhbmRzaGFrZSBoZWFkZXIKKyAgICAgICAgICovCisgICAgICAgIGlmKCBzc2wtPmluX21zZ2xlbiA8IDQgfHwgc3NsLT5pbl9tc2dbMV0gIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBoYW5kc2hha2UgbGVuZ3RoIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfSU5WQUxJRF9SRUNPUkQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzc2wtPmluX21zZ2xlbiA8IHNzbC0+aW5faHNsZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgaGFuZHNoYWtlIGxlbmd0aCIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0lOVkFMSURfUkVDT1JEICk7CisgICAgICAgIH0KKworICAgICAgICAgbWQ1X3VwZGF0ZSggJnNzbC0+ZmluX21kNSAsIHNzbC0+aW5fbXNnLCBzc2wtPmluX2hzbGVuICk7CisgICAgICAgIHNoYTFfdXBkYXRlKCAmc3NsLT5maW5fc2hhMSwgc3NsLT5pbl9tc2csIHNzbC0+aW5faHNsZW4gKTsKKyAgICB9CisKKyAgICBpZiggc3NsLT5pbl9tc2d0eXBlID09IFNTTF9NU0dfQUxFUlQgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiZ290IGFuIGFsZXJ0IG1lc3NhZ2UsIHR5cGU6IFslZDolZF0iLAorICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmluX21zZ1swXSwgc3NsLT5pbl9tc2dbMV0gKSApOworCisgICAgICAgIC8qCisgICAgICAgICAqIElnbm9yZSBub24tZmF0YWwgYWxlcnRzLCBleGNlcHQgY2xvc2Vfbm90aWZ5CisgICAgICAgICAqLworICAgICAgICBpZiggc3NsLT5pbl9tc2dbMF0gPT0gU1NMX0FMRVJUX0ZBVEFMICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiaXMgYSBmYXRhbCBhbGVydCBtZXNzYWdlIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfRkFUQUxfQUxFUlRfTUVTU0FHRSB8IHNzbC0+aW5fbXNnWzFdICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggc3NsLT5pbl9tc2dbMF0gPT0gU1NMX0FMRVJUX1dBUk5JTkcgJiYKKyAgICAgICAgICAgIHNzbC0+aW5fbXNnWzFdID09IFNTTF9BTEVSVF9DTE9TRV9OT1RJRlkgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAyLCAoICJpcyBhIGNsb3NlIG5vdGlmeSBtZXNzYWdlIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfUEVFUl9DTE9TRV9OT1RJRlkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNzbC0+aW5fbGVmdCA9IDA7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSByZWFkIHJlY29yZCIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBIYW5kc2hha2UgZnVuY3Rpb25zCisgKi8KK2ludCBzc2xfd3JpdGVfY2VydGlmaWNhdGUoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCByZXQsIGksIG47CisgICAgeDUwOV9jZXJ0ICpjcnQ7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiB3cml0ZSBjZXJ0aWZpY2F0ZSIgKSApOworCisgICAgaWYoIHNzbC0+ZW5kcG9pbnQgPT0gU1NMX0lTX0NMSUVOVCApCisgICAgeworICAgICAgICBpZiggc3NsLT5jbGllbnRfYXV0aCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gc2tpcCB3cml0ZSBjZXJ0aWZpY2F0ZSIgKSApOworICAgICAgICAgICAgc3NsLT5zdGF0ZSsrOworICAgICAgICAgICAgcmV0dXJuKCAwICk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB1c2luZyBTU0x2MyBhbmQgZ290IG5vIGNlcnQsIHNlbmQgYW4gQWxlcnQgbWVzc2FnZQorICAgICAgICAgKiAob3RoZXJ3aXNlIGFuIGVtcHR5IENlcnRpZmljYXRlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50KS4KKyAgICAgICAgICovCisgICAgICAgIGlmKCBzc2wtPm93bl9jZXJ0ICA9PSBOVUxMICYmCisgICAgICAgICAgICBzc2wtPm1pbm9yX3ZlciA9PSBTU0xfTUlOT1JfVkVSU0lPTl8wICkKKyAgICAgICAgeworICAgICAgICAgICAgc3NsLT5vdXRfbXNnbGVuICA9IDI7CisgICAgICAgICAgICBzc2wtPm91dF9tc2d0eXBlID0gU1NMX01TR19BTEVSVDsKKyAgICAgICAgICAgIHNzbC0+b3V0X21zZ1swXSAgPSBTU0xfQUxFUlRfV0FSTklORzsKKyAgICAgICAgICAgIHNzbC0+b3V0X21zZ1sxXSAgPSBTU0xfQUxFUlRfTk9fQ0VSVElGSUNBVEU7CisKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDIsICggImdvdCBubyBjZXJ0aWZpY2F0ZSB0byBzZW5kIiApICk7CisgICAgICAgICAgICBnb3RvIHdyaXRlX21zZzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIFNTTF9JU19TRVJWRVIgKi8KKyAgICB7CisgICAgICAgIGlmKCBzc2wtPm93bl9jZXJ0ID09IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJnb3Qgbm8gY2VydGlmaWNhdGUgdG8gc2VuZCIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTU0xfREVCVUdfQ1JUKCAzLCAib3duIGNlcnRpZmljYXRlIiwgc3NsLT5vd25fY2VydCApOworCisgICAgLyoKKyAgICAgKiAgICAgMCAgLiAgMCAgICBoYW5kc2hha2UgdHlwZQorICAgICAqICAgICAxICAuICAzICAgIGhhbmRzaGFrZSBsZW5ndGgKKyAgICAgKiAgICAgNCAgLiAgNiAgICBsZW5ndGggb2YgYWxsIGNlcnRzCisgICAgICogICAgIDcgIC4gIDkgICAgbGVuZ3RoIG9mIGNlcnQuIDEKKyAgICAgKiAgICAxMCAgLiBuLTEgICBwZWVyIGNlcnRpZmljYXRlCisgICAgICogICAgIG4gIC4gbisyICAgbGVuZ3RoIG9mIGNlcnQuIDIKKyAgICAgKiAgICBuKzMgLiAuLi4gICB1cHBlciBsZXZlbCBjZXJ0LCBldGMuCisgICAgICovCisgICAgaSA9IDc7CisgICAgY3J0ID0gc3NsLT5vd25fY2VydDsKKworICAgIHdoaWxlKCBjcnQgIT0gTlVMTCAmJiBjcnQtPm5leHQgIT0gTlVMTCApCisgICAgeworICAgICAgICBuID0gY3J0LT5yYXcubGVuOworICAgICAgICBpZiggaSArIDMgKyBuID4gU1NMX01BWF9DT05URU5UX0xFTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImNlcnRpZmljYXRlIHRvbyBsYXJnZSwgJWQgPiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgMyArIG4sIFNTTF9NQVhfQ09OVEVOVF9MRU4gKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0NFUlRJRklDQVRFX1RPT19MQVJHRSApOworICAgICAgICB9CisKKyAgICAgICAgc3NsLT5vdXRfbXNnW2kgICAgXSA9ICh1bnNpZ25lZCBjaGFyKSggbiA+PiAxNiApOworICAgICAgICBzc2wtPm91dF9tc2dbaSArIDFdID0gKHVuc2lnbmVkIGNoYXIpKCBuID4+ICA4ICk7CisgICAgICAgIHNzbC0+b3V0X21zZ1tpICsgMl0gPSAodW5zaWduZWQgY2hhcikoIG4gICAgICAgKTsKKworICAgICAgICBpICs9IDM7IG1lbWNweSggc3NsLT5vdXRfbXNnICsgaSwgY3J0LT5yYXcucCwgbiApOworICAgICAgICBpICs9IG47IGNydCA9IGNydC0+bmV4dDsKKyAgICB9CisKKyAgICBzc2wtPm91dF9tc2dbNF0gID0gKHVuc2lnbmVkIGNoYXIpKCAoIGkgLSA3ICkgPj4gMTYgKTsKKyAgICBzc2wtPm91dF9tc2dbNV0gID0gKHVuc2lnbmVkIGNoYXIpKCAoIGkgLSA3ICkgPj4gIDggKTsKKyAgICBzc2wtPm91dF9tc2dbNl0gID0gKHVuc2lnbmVkIGNoYXIpKCAoIGkgLSA3ICkgICAgICAgKTsKKworICAgIHNzbC0+b3V0X21zZ2xlbiAgPSBpOworICAgIHNzbC0+b3V0X21zZ3R5cGUgPSBTU0xfTVNHX0hBTkRTSEFLRTsKKyAgICBzc2wtPm91dF9tc2dbMF0gID0gU1NMX0hTX0NFUlRJRklDQVRFOworCit3cml0ZV9tc2c6CisKKyAgICBzc2wtPnN0YXRlKys7CisKKyAgICBpZiggKCByZXQgPSBzc2xfd3JpdGVfcmVjb3JkKCBzc2wgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF93cml0ZV9yZWNvcmQiLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSB3cml0ZSBjZXJ0aWZpY2F0ZSIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKK2ludCBzc2xfcGFyc2VfY2VydGlmaWNhdGUoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCByZXQsIGksIG47CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiBwYXJzZSBjZXJ0aWZpY2F0ZSIgKSApOworCisgICAgaWYoIHNzbC0+ZW5kcG9pbnQgPT0gU1NMX0lTX1NFUlZFUiAmJgorICAgICAgICBzc2wtPmF1dGhtb2RlID09IFNTTF9WRVJJRllfTk9ORSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBza2lwIHBhcnNlIGNlcnRpZmljYXRlIiApICk7CisgICAgICAgIHNzbC0+c3RhdGUrKzsKKyAgICAgICAgcmV0dXJuKCAwICk7CisgICAgfQorCisgICAgaWYoICggcmV0ID0gc3NsX3JlYWRfcmVjb3JkKCBzc2wgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF9yZWFkX3JlY29yZCIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIHNzbC0+c3RhdGUrKzsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGNsaWVudCBzZW50IGFuIGVtcHR5IGNlcnRpZmljYXRlCisgICAgICovCisgICAgaWYoIHNzbC0+ZW5kcG9pbnQgID09IFNTTF9JU19TRVJWRVIgJiYKKyAgICAgICAgc3NsLT5taW5vcl92ZXIgPT0gU1NMX01JTk9SX1ZFUlNJT05fMCApCisgICAgeworICAgICAgICBpZiggc3NsLT5pbl9tc2dsZW4gID09IDIgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICBzc2wtPmluX21zZ3R5cGUgPT0gU1NMX01TR19BTEVSVCAgICAgICAgJiYKKyAgICAgICAgICAgIHNzbC0+aW5fbXNnWzBdICA9PSBTU0xfQUxFUlRfV0FSTklORyAgICAmJgorICAgICAgICAgICAgc3NsLT5pbl9tc2dbMV0gID09IFNTTF9BTEVSVF9OT19DRVJUSUZJQ0FURSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggIlNTTHYzIGNsaWVudCBoYXMgbm8gY2VydGlmaWNhdGUiICkgKTsKKworICAgICAgICAgICAgaWYoIHNzbC0+YXV0aG1vZGUgPT0gU1NMX1ZFUklGWV9PUFRJT05BTCApCisgICAgICAgICAgICAgICAgcmV0dXJuKCAwICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX05PX0NMSUVOVF9DRVJUSUZJQ0FURSApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIHNzbC0+ZW5kcG9pbnQgID09IFNTTF9JU19TRVJWRVIgJiYKKyAgICAgICAgc3NsLT5taW5vcl92ZXIgIT0gU1NMX01JTk9SX1ZFUlNJT05fMCApCisgICAgeworICAgICAgICBpZiggc3NsLT5pbl9oc2xlbiAgID09IDcgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICBzc2wtPmluX21zZ3R5cGUgPT0gU1NMX01TR19IQU5EU0hBS0UgICAgJiYKKyAgICAgICAgICAgIHNzbC0+aW5fbXNnWzBdICA9PSBTU0xfSFNfQ0VSVElGSUNBVEUgICAmJgorICAgICAgICAgICAgbWVtY21wKCBzc2wtPmluX21zZyArIDQsICJcMFwwXDAiLCAzICkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggIlRMU3YxIGNsaWVudCBoYXMgbm8gY2VydGlmaWNhdGUiICkgKTsKKworICAgICAgICAgICAgaWYoIHNzbC0+YXV0aG1vZGUgPT0gU1NMX1ZFUklGWV9SRVFVSVJFRCApCisgICAgICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX05PX0NMSUVOVF9DRVJUSUZJQ0FURSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiggMCApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIHNzbC0+aW5fbXNndHlwZSAhPSBTU0xfTVNHX0hBTkRTSEFLRSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2VydGlmaWNhdGUgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfVU5FWFBFQ1RFRF9NRVNTQUdFICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+aW5fbXNnWzBdICE9IFNTTF9IU19DRVJUSUZJQ0FURSB8fCBzc2wtPmluX2hzbGVuIDwgMTAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIGNlcnRpZmljYXRlIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DRVJUSUZJQ0FURSApOworICAgIH0KKworICAgIC8qCisgICAgICogU2FtZSBtZXNzYWdlIHN0cnVjdHVyZSBhcyBpbiBzc2xfd3JpdGVfY2VydGlmaWNhdGUoKQorICAgICAqLworICAgIG4gPSAoIHNzbC0+aW5fbXNnWzVdIDw8IDggKSB8IHNzbC0+aW5fbXNnWzZdOworCisgICAgaWYoIHNzbC0+aW5fbXNnWzRdICE9IDAgfHwgc3NsLT5pbl9oc2xlbiAhPSA3ICsgbiApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2VydGlmaWNhdGUgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NFUlRJRklDQVRFICk7CisgICAgfQorCisgICAgaWYoICggc3NsLT5wZWVyX2NlcnQgPSAoeDUwOV9jZXJ0ICopIG1hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB4NTA5X2NlcnQgKSApICkgPT0gTlVMTCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJtYWxsb2MoJWQgYnl0ZXMpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggeDUwOV9jZXJ0ICkgKSApOworICAgICAgICByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBtZW1zZXQoIHNzbC0+cGVlcl9jZXJ0LCAwLCBzaXplb2YoIHg1MDlfY2VydCApICk7CisKKyAgICBpID0gNzsKKworICAgIHdoaWxlKCBpIDwgc3NsLT5pbl9oc2xlbiApCisgICAgeworICAgICAgICBpZiggc3NsLT5pbl9tc2dbaV0gIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjZXJ0aWZpY2F0ZSBtZXNzYWdlIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NFUlRJRklDQVRFICk7CisgICAgICAgIH0KKworICAgICAgICBuID0gKCAodW5zaWduZWQgaW50KSBzc2wtPmluX21zZ1tpICsgMV0gPDwgOCApCisgICAgICAgICAgICB8ICh1bnNpZ25lZCBpbnQpIHNzbC0+aW5fbXNnW2kgKyAyXTsKKyAgICAgICAgaSArPSAzOworCisgICAgICAgIGlmKCBuIDwgMTI4IHx8IGkgKyBuID4gc3NsLT5pbl9oc2xlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjZXJ0aWZpY2F0ZSBtZXNzYWdlIiApICk7CisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0NFUlRJRklDQVRFICk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB4NTA5cGFyc2VfY3J0KCBzc2wtPnBlZXJfY2VydCwgc3NsLT5pbl9tc2cgKyBpLCBuICk7CisgICAgICAgIGlmKCByZXQgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICIgeDUwOXBhcnNlX2NydCIsIHJldCApOworICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGkgKz0gbjsKKyAgICB9CisKKyAgICBTU0xfREVCVUdfQ1JUKCAzLCAicGVlciBjZXJ0aWZpY2F0ZSIsIHNzbC0+cGVlcl9jZXJ0ICk7CisKKyAgICBpZiggc3NsLT5hdXRobW9kZSAhPSBTU0xfVkVSSUZZX05PTkUgKQorICAgIHsKKyAgICAgICAgaWYoIHNzbC0+Y2FfY2hhaW4gPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImdvdCBubyBDQSBjaGFpbiIgKSApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0NBX0NIQUlOX1JFUVVJUkVEICk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB4NTA5cGFyc2VfdmVyaWZ5KCBzc2wtPnBlZXJfY2VydCwgc3NsLT5jYV9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLT5wZWVyX2NuLCAgJnNzbC0+dmVyaWZ5X3Jlc3VsdCApOworCisgICAgICAgIGlmKCByZXQgIT0gMCApCisgICAgICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAieDUwOV92ZXJpZnlfY2VydCIsIHJldCApOworCisgICAgICAgIGlmKCBzc2wtPmF1dGhtb2RlICE9IFNTTF9WRVJJRllfUkVRVUlSRUQgKQorICAgICAgICAgICAgcmV0ID0gMDsKKyAgICB9CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBwYXJzZSBjZXJ0aWZpY2F0ZSIgKSApOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworaW50IHNzbF93cml0ZV9jaGFuZ2VfY2lwaGVyX3NwZWMoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCByZXQ7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiB3cml0ZSBjaGFuZ2UgY2lwaGVyIHNwZWMiICkgKTsKKworICAgIHNzbC0+b3V0X21zZ3R5cGUgPSBTU0xfTVNHX0NIQU5HRV9DSVBIRVJfU1BFQzsKKyAgICBzc2wtPm91dF9tc2dsZW4gID0gMTsKKyAgICBzc2wtPm91dF9tc2dbMF0gID0gMTsKKworICAgIHNzbC0+ZG9fY3J5cHQgPSAwOworICAgIHNzbC0+c3RhdGUrKzsKKworICAgIGlmKCAoIHJldCA9IHNzbF93cml0ZV9yZWNvcmQoIHNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX3dyaXRlX3JlY29yZCIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIjw9IHdyaXRlIGNoYW5nZSBjaXBoZXIgc3BlYyIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKK2ludCBzc2xfcGFyc2VfY2hhbmdlX2NpcGhlcl9zcGVjKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgcmV0OworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPT4gcGFyc2UgY2hhbmdlIGNpcGhlciBzcGVjIiApICk7CisKKyAgICBzc2wtPmRvX2NyeXB0ID0gMDsKKworICAgIGlmKCAoIHJldCA9IHNzbF9yZWFkX3JlY29yZCggc3NsICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfcmVhZF9yZWNvcmQiLCByZXQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBpZiggc3NsLT5pbl9tc2d0eXBlICE9IFNTTF9NU0dfQ0hBTkdFX0NJUEhFUl9TUEVDICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBjaGFuZ2UgY2lwaGVyIHNwZWMgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfVU5FWFBFQ1RFRF9NRVNTQUdFICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+aW5fbXNnbGVuICE9IDEgfHwgc3NsLT5pbl9tc2dbMF0gIT0gMSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgY2hhbmdlIGNpcGhlciBzcGVjIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19DSEFOR0VfQ0lQSEVSX1NQRUMgKTsKKyAgICB9CisKKyAgICBzc2wtPnN0YXRlKys7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBwYXJzZSBjaGFuZ2UgY2lwaGVyIHNwZWMiICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCitzdGF0aWMgdm9pZCBzc2xfY2FsY19maW5pc2hlZCgKKyAgICAgICAgICAgICAgICBzc2xfY29udGV4dCAqc3NsLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBmcm9tLAorICAgICAgICAgICAgICAgIG1kNV9jb250ZXh0ICptZDUsIHNoYTFfY29udGV4dCAqc2hhMSApCit7CisgICAgaW50IGxlbiA9IDEyOworICAgIGNoYXIgKnNlbmRlcjsKKyAgICB1bnNpZ25lZCBjaGFyIHBhZGJ1Zls0OF07CisgICAgdW5zaWduZWQgY2hhciBtZDVzdW1bMTZdOworICAgIHVuc2lnbmVkIGNoYXIgc2hhMXN1bVsyMF07CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiBjYWxjICBmaW5pc2hlZCIgKSApOworCisgICAgLyoKKyAgICAgKiBTU0x2MzoKKyAgICAgKiAgIGhhc2ggPQorICAgICAqICAgICAgTUQ1KCBtYXN0ZXIgKyBwYWQyICsKKyAgICAgKiAgICAgICAgICBNRDUoIGhhbmRzaGFrZSArIHNlbmRlciArIG1hc3RlciArIHBhZDEgKSApCisgICAgICogICArIFNIQTEoIG1hc3RlciArIHBhZDIgKworICAgICAqICAgICAgICAgU0hBMSggaGFuZHNoYWtlICsgc2VuZGVyICsgbWFzdGVyICsgcGFkMSApICkKKyAgICAgKgorICAgICAqIFRMU3YxOgorICAgICAqICAgaGFzaCA9IFBSRiggbWFzdGVyLCBmaW5pc2hlZF9sYWJlbCwKKyAgICAgKiAgICAgICAgICAgICAgIE1ENSggaGFuZHNoYWtlICkgKyBTSEExKCBoYW5kc2hha2UgKSApWzAuLjExXQorICAgICAqLworCisgICAgU1NMX0RFQlVHX0JVRiggNCwgImZpbmlzaGVkICBtZDUgc3RhdGUiLCAodW5zaWduZWQgY2hhciAqKQorICAgICAgICAgICAgICAgICAgICBtZDUtPnN0YXRlLCBzaXplb2YoICBtZDUtPnN0YXRlICkgKTsKKworICAgIFNTTF9ERUJVR19CVUYoIDQsICJmaW5pc2hlZCBzaGExIHN0YXRlIiwgKHVuc2lnbmVkIGNoYXIgKikKKyAgICAgICAgICAgICAgICAgICBzaGExLT5zdGF0ZSwgc2l6ZW9mKCBzaGExLT5zdGF0ZSApICk7CisKKyAgICBpZiggc3NsLT5taW5vcl92ZXIgPT0gU1NMX01JTk9SX1ZFUlNJT05fMCApCisgICAgeworICAgICAgICBzZW5kZXIgPSAoIGZyb20gPT0gU1NMX0lTX0NMSUVOVCApID8gKGNoYXIgKikgIkNMTlQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoY2hhciAqKSAiU1JWUiI7CisKKyAgICAgICAgbWVtc2V0KCBwYWRidWYsIDB4MzYsIDQ4ICk7CisKKyAgICAgICAgbWQ1X3VwZGF0ZSggbWQ1LCAodW5zaWduZWQgY2hhciAqKSBzZW5kZXIsIDQgKTsKKyAgICAgICAgbWQ1X3VwZGF0ZSggbWQ1LCBzc2wtPnNlc3Npb24tPm1hc3RlciwgNDggKTsKKyAgICAgICAgbWQ1X3VwZGF0ZSggbWQ1LCBwYWRidWYsIDQ4ICk7CisgICAgICAgIG1kNV9maW5pc2goIG1kNSwgbWQ1c3VtICk7CisKKyAgICAgICAgc2hhMV91cGRhdGUoIHNoYTEsICh1bnNpZ25lZCBjaGFyICopIHNlbmRlciwgNCApOworICAgICAgICBzaGExX3VwZGF0ZSggc2hhMSwgc3NsLT5zZXNzaW9uLT5tYXN0ZXIsIDQ4ICk7CisgICAgICAgIHNoYTFfdXBkYXRlKCBzaGExLCBwYWRidWYsIDQwICk7CisgICAgICAgIHNoYTFfZmluaXNoKCBzaGExLCBzaGExc3VtICk7CisKKyAgICAgICAgbWVtc2V0KCBwYWRidWYsIDB4NUMsIDQ4ICk7CisKKyAgICAgICAgbWQ1X3N0YXJ0cyggbWQ1ICk7CisgICAgICAgIG1kNV91cGRhdGUoIG1kNSwgc3NsLT5zZXNzaW9uLT5tYXN0ZXIsIDQ4ICk7CisgICAgICAgIG1kNV91cGRhdGUoIG1kNSwgcGFkYnVmLCA0OCApOworICAgICAgICBtZDVfdXBkYXRlKCBtZDUsIG1kNXN1bSwgMTYgKTsKKyAgICAgICAgbWQ1X2ZpbmlzaCggbWQ1LCBidWYgKTsKKworICAgICAgICBzaGExX3N0YXJ0cyggc2hhMSApOworICAgICAgICBzaGExX3VwZGF0ZSggc2hhMSwgc3NsLT5zZXNzaW9uLT5tYXN0ZXIsIDQ4ICk7CisgICAgICAgIHNoYTFfdXBkYXRlKCBzaGExLCBwYWRidWYgLCA0MCApOworICAgICAgICBzaGExX3VwZGF0ZSggc2hhMSwgc2hhMXN1bSwgMjAgKTsKKyAgICAgICAgc2hhMV9maW5pc2goIHNoYTEsIGJ1ZiArIDE2ICk7CisKKyAgICAgICAgbGVuICs9IDI0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZW5kZXIgPSAoIGZyb20gPT0gU1NMX0lTX0NMSUVOVCApCisgICAgICAgICAgICAgICAgID8gKGNoYXIgKikgImNsaWVudCBmaW5pc2hlZCIKKyAgICAgICAgICAgICAgICAgOiAoY2hhciAqKSAic2VydmVyIGZpbmlzaGVkIjsKKworICAgICAgICAgbWQ1X2ZpbmlzaCggIG1kNSwgcGFkYnVmICk7CisgICAgICAgIHNoYTFfZmluaXNoKCBzaGExLCBwYWRidWYgKyAxNiApOworCisgICAgICAgIHRsczFfcHJmKCBzc2wtPnNlc3Npb24tPm1hc3RlciwgNDgsIHNlbmRlciwKKyAgICAgICAgICAgICAgICAgIHBhZGJ1ZiwgMzYsIGJ1ZiwgbGVuICk7CisgICAgfQorCisgICAgU1NMX0RFQlVHX0JVRiggMywgImNhbGMgZmluaXNoZWQgcmVzdWx0IiwgYnVmLCBsZW4gKTsKKworICAgIG1lbXNldCggIG1kNSwgMCwgc2l6ZW9mKCAgbWQ1X2NvbnRleHQgKSApOworICAgIG1lbXNldCggc2hhMSwgMCwgc2l6ZW9mKCBzaGExX2NvbnRleHQgKSApOworCisgICAgbWVtc2V0KCAgcGFkYnVmLCAwLCBzaXplb2YoICBwYWRidWYgKSApOworICAgIG1lbXNldCggIG1kNXN1bSwgMCwgc2l6ZW9mKCAgbWQ1c3VtICkgKTsKKyAgICBtZW1zZXQoIHNoYTFzdW0sIDAsIHNpemVvZiggc2hhMXN1bSApICk7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBjYWxjICBmaW5pc2hlZCIgKSApOworfQorCitpbnQgc3NsX3dyaXRlX2ZpbmlzaGVkKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgcmV0LCBoYXNoX2xlbjsKKyAgICAgbWQ1X2NvbnRleHQgIG1kNTsKKyAgICBzaGExX2NvbnRleHQgc2hhMTsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IHdyaXRlIGZpbmlzaGVkIiApICk7CisKKyAgICBtZW1jcHkoICZtZDUgLCAmc3NsLT5maW5fbWQ1ICwgc2l6ZW9mKCAgbWQ1X2NvbnRleHQgKSApOworICAgIG1lbWNweSggJnNoYTEsICZzc2wtPmZpbl9zaGExLCBzaXplb2YoIHNoYTFfY29udGV4dCApICk7CisKKyAgICBzc2xfY2FsY19maW5pc2hlZCggc3NsLCBzc2wtPm91dF9tc2cgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICBzc2wtPmVuZHBvaW50LCAmbWQ1LCAmc2hhMSApOworCisgICAgaGFzaF9sZW4gPSAoIHNzbC0+bWlub3JfdmVyID09IFNTTF9NSU5PUl9WRVJTSU9OXzAgKSA/IDM2IDogMTI7CisKKyAgICBzc2wtPm91dF9tc2dsZW4gID0gNCArIGhhc2hfbGVuOworICAgIHNzbC0+b3V0X21zZ3R5cGUgPSBTU0xfTVNHX0hBTkRTSEFLRTsKKyAgICBzc2wtPm91dF9tc2dbMF0gID0gU1NMX0hTX0ZJTklTSEVEOworCisgICAgLyoKKyAgICAgKiBJbiBjYXNlIG9mIHNlc3Npb24gcmVzdW1pbmcsIGludmVydCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIKKyAgICAgKiBDaGFuZ2VDaXBoZXJTcGVjIG1lc3NhZ2VzIG9yZGVyLgorICAgICAqLworICAgIGlmKCBzc2wtPnJlc3VtZSAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCBzc2wtPmVuZHBvaW50ID09IFNTTF9JU19DTElFTlQgKQorICAgICAgICAgICAgc3NsLT5zdGF0ZSA9IFNTTF9IQU5EU0hBS0VfT1ZFUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3NsLT5zdGF0ZSA9IFNTTF9DTElFTlRfQ0hBTkdFX0NJUEhFUl9TUEVDOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHNzbC0+c3RhdGUrKzsKKworICAgIHNzbC0+ZG9fY3J5cHQgPSAxOworCisgICAgaWYoICggcmV0ID0gc3NsX3dyaXRlX3JlY29yZCggc3NsICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfd3JpdGVfcmVjb3JkIiwgcmV0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gd3JpdGUgZmluaXNoZWQiICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCitpbnQgc3NsX3BhcnNlX2ZpbmlzaGVkKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBpbnQgcmV0LCBoYXNoX2xlbjsKKyAgICAgbWQ1X2NvbnRleHQgIG1kNTsKKyAgICBzaGExX2NvbnRleHQgc2hhMTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZlszNl07CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiBwYXJzZSBmaW5pc2hlZCIgKSApOworCisgICAgbWVtY3B5KCAmbWQ1ICwgJnNzbC0+ZmluX21kNSAsIHNpemVvZiggIG1kNV9jb250ZXh0ICkgKTsKKyAgICBtZW1jcHkoICZzaGExLCAmc3NsLT5maW5fc2hhMSwgc2l6ZW9mKCBzaGExX2NvbnRleHQgKSApOworCisgICAgc3NsLT5kb19jcnlwdCA9IDE7CisKKyAgICBpZiggKCByZXQgPSBzc2xfcmVhZF9yZWNvcmQoIHNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX3JlYWRfcmVjb3JkIiwgcmV0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+aW5fbXNndHlwZSAhPSBTU0xfTVNHX0hBTkRTSEFLRSApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgZmluaXNoZWQgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfVU5FWFBFQ1RFRF9NRVNTQUdFICk7CisgICAgfQorCisgICAgaGFzaF9sZW4gPSAoIHNzbC0+bWlub3JfdmVyID09IFNTTF9NSU5PUl9WRVJTSU9OXzAgKSA/IDM2IDogMTI7CisKKyAgICBpZiggc3NsLT5pbl9tc2dbMF0gIT0gU1NMX0hTX0ZJTklTSEVEIHx8CisgICAgICAgIHNzbC0+aW5faHNsZW4gICE9IDQgKyBoYXNoX2xlbiApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJiYWQgZmluaXNoZWQgbWVzc2FnZSIgKSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9TU0xfQkFEX0hTX0ZJTklTSEVEICk7CisgICAgfQorCisgICAgc3NsX2NhbGNfZmluaXNoZWQoIHNzbCwgYnVmLCBzc2wtPmVuZHBvaW50IF4gMSwgJm1kNSwgJnNoYTEgKTsKKworICAgIGlmKCBtZW1jbXAoIHNzbC0+aW5fbXNnICsgNCwgYnVmLCBoYXNoX2xlbiApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAiYmFkIGZpbmlzaGVkIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9IU19GSU5JU0hFRCApOworICAgIH0KKworICAgIGlmKCBzc2wtPnJlc3VtZSAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCBzc2wtPmVuZHBvaW50ID09IFNTTF9JU19DTElFTlQgKQorICAgICAgICAgICAgc3NsLT5zdGF0ZSA9IFNTTF9DTElFTlRfQ0hBTkdFX0NJUEhFUl9TUEVDOworCisgICAgICAgIGlmKCBzc2wtPmVuZHBvaW50ID09IFNTTF9JU19TRVJWRVIgKQorICAgICAgICAgICAgc3NsLT5zdGF0ZSA9IFNTTF9IQU5EU0hBS0VfT1ZFUjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzc2wtPnN0YXRlKys7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBwYXJzZSBmaW5pc2hlZCIgKSApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGFuIFNTTCBjb250ZXh0CisgKi8KK2ludCBzc2xfaW5pdCggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgaW50IGxlbiA9IFNTTF9CVUZGRVJfTEVOOworCisgICAgbWVtc2V0KCBzc2wsIDAsIHNpemVvZiggc3NsX2NvbnRleHQgKSApOworCisgICAgc3NsLT5pbl9jdHIgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MoIGxlbiApOworICAgIHNzbC0+aW5faGRyID0gc3NsLT5pbl9jdHIgKyAgODsKKyAgICBzc2wtPmluX21zZyA9IHNzbC0+aW5fY3RyICsgMTM7CisKKyAgICBpZiggc3NsLT5pbl9jdHIgPT0gTlVMTCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfTVNHKCAxLCAoICJtYWxsb2MoJWQgYnl0ZXMpIGZhaWxlZCIsIGxlbiApICk7CisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIHNzbC0+b3V0X2N0ciA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyggbGVuICk7CisgICAgc3NsLT5vdXRfaGRyID0gc3NsLT5vdXRfY3RyICsgIDg7CisgICAgc3NsLT5vdXRfbXNnID0gc3NsLT5vdXRfY3RyICsgMTM7CisKKyAgICBpZiggc3NsLT5vdXRfY3RyID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX01TRyggMSwgKCAibWFsbG9jKCVkIGJ5dGVzKSBmYWlsZWQiLCBsZW4gKSApOworICAgICAgICBmcmVlKCBzc2wtPiBpbl9jdHIgKTsKKyAgICAgICAgcmV0dXJuKCAxICk7CisgICAgfQorCisgICAgbWVtc2V0KCBzc2wtPiBpbl9jdHIsIDAsIFNTTF9CVUZGRVJfTEVOICk7CisgICAgbWVtc2V0KCBzc2wtPm91dF9jdHIsIDAsIFNTTF9CVUZGRVJfTEVOICk7CisKKyAgICBzc2wtPmhvc3RuYW1lID0gTlVMTDsKKyAgICBzc2wtPmhvc3RuYW1lX2xlbiA9IDA7CisKKyAgICAgbWQ1X3N0YXJ0cyggJnNzbC0+ZmluX21kNSAgKTsKKyAgICBzaGExX3N0YXJ0cyggJnNzbC0+ZmluX3NoYTEgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogU1NMIHNldCBhY2Nlc3NvcnMKKyAqLwordm9pZCBzc2xfc2V0X2VuZHBvaW50KCBzc2xfY29udGV4dCAqc3NsLCBpbnQgZW5kcG9pbnQgKQoreworICAgIHNzbC0+ZW5kcG9pbnQgICA9IGVuZHBvaW50OworfQorCit2b2lkIHNzbF9zZXRfYXV0aG1vZGUoIHNzbF9jb250ZXh0ICpzc2wsIGludCBhdXRobW9kZSApCit7CisgICAgc3NsLT5hdXRobW9kZSAgID0gYXV0aG1vZGU7Cit9CisKK3ZvaWQgc3NsX3NldF9ybmcoIHNzbF9jb250ZXh0ICpzc2wsCisgICAgICAgICAgICAgICAgICBpbnQgKCpmX3JuZykodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKnBfcm5nICkKK3sKKyAgICBzc2wtPmZfcm5nICAgICAgPSBmX3JuZzsKKyAgICBzc2wtPnBfcm5nICAgICAgPSBwX3JuZzsKK30KKwordm9pZCBzc2xfc2V0X2RiZyggc3NsX2NvbnRleHQgKnNzbCwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKCpmX2RiZykodm9pZCAqLCBpbnQsIGNoYXIgKiksCisgICAgICAgICAgICAgICAgICB2b2lkICAqcF9kYmcgKQoreworICAgIHNzbC0+Zl9kYmcgICAgICA9IGZfZGJnOworICAgIHNzbC0+cF9kYmcgICAgICA9IHBfZGJnOworfQorCit2b2lkIHNzbF9zZXRfYmlvKCBzc2xfY29udGV4dCAqc3NsLAorICAgICAgICAgICAgaW50ICgqZl9yZWN2KSh2b2lkICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KSwgdm9pZCAqcF9yZWN2LAorICAgICAgICAgICAgaW50ICgqZl9zZW5kKSh2b2lkICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KSwgdm9pZCAqcF9zZW5kICkKK3sKKyAgICBzc2wtPmZfcmVjdiAgICAgPSBmX3JlY3Y7CisgICAgc3NsLT5mX3NlbmQgICAgID0gZl9zZW5kOworICAgIHNzbC0+cF9yZWN2ICAgICA9IHBfcmVjdjsKKyAgICBzc2wtPnBfc2VuZCAgICAgPSBwX3NlbmQ7Cit9CisKK3ZvaWQgc3NsX3NldF9zY2IoIHNzbF9jb250ZXh0ICpzc2wsCisgICAgICAgICAgICAgICAgICBpbnQgKCpzX2dldCkoc3NsX2NvbnRleHQgKiksCisgICAgICAgICAgICAgICAgICBpbnQgKCpzX3NldCkoc3NsX2NvbnRleHQgKikgKQoreworICAgIHNzbC0+c19nZXQgICAgICA9IHNfZ2V0OworICAgIHNzbC0+c19zZXQgICAgICA9IHNfc2V0OworfQorCit2b2lkIHNzbF9zZXRfc2Vzc2lvbiggc3NsX2NvbnRleHQgKnNzbCwgaW50IHJlc3VtZSwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgc3NsX3Nlc3Npb24gKnNlc3Npb24gKQoreworICAgIHNzbC0+cmVzdW1lICAgICA9IHJlc3VtZTsKKyAgICBzc2wtPnRpbWVvdXQgICAgPSB0aW1lb3V0OworICAgIHNzbC0+c2Vzc2lvbiAgICA9IHNlc3Npb247Cit9CisKK3ZvaWQgc3NsX3NldF9jaXBoZXJzKCBzc2xfY29udGV4dCAqc3NsLCBpbnQgKmNpcGhlcnMgKQoreworICAgIHNzbC0+Y2lwaGVycyAgICA9IGNpcGhlcnM7Cit9CisKK3ZvaWQgc3NsX3NldF9jYV9jaGFpbiggc3NsX2NvbnRleHQgKnNzbCwgeDUwOV9jZXJ0ICpjYV9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGVlcl9jbiApCit7CisgICAgc3NsLT5jYV9jaGFpbiAgID0gY2FfY2hhaW47CisgICAgc3NsLT5wZWVyX2NuICAgID0gcGVlcl9jbjsKK30KKwordm9pZCBzc2xfc2V0X293bl9jZXJ0KCBzc2xfY29udGV4dCAqc3NsLCB4NTA5X2NlcnQgKm93bl9jZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICByc2FfY29udGV4dCAqcnNhX2tleSApCit7CisgICAgc3NsLT5vd25fY2VydCAgID0gb3duX2NlcnQ7CisgICAgc3NsLT5yc2Ffa2V5ICAgID0gcnNhX2tleTsKK30KKworaW50IHNzbF9zZXRfZGhfcGFyYW0oIHNzbF9jb250ZXh0ICpzc2wsIGNoYXIgKmRobV9QLCBjaGFyICpkaG1fRyApCit7CisgICAgaW50IHJldDsKKworICAgIGlmKCAoIHJldCA9IG1waV9yZWFkX3N0cmluZyggJnNzbC0+ZGhtX2N0eC5QLCAxNiwgZGhtX1AgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgIm1waV9yZWFkX3N0cmluZyIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIGlmKCAoIHJldCA9IG1waV9yZWFkX3N0cmluZyggJnNzbC0+ZGhtX2N0eC5HLCAxNiwgZGhtX0cgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgIm1waV9yZWFkX3N0cmluZyIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIHJldHVybiggMCApOworfQorCitpbnQgc3NsX3NldF9ob3N0bmFtZSggc3NsX2NvbnRleHQgKnNzbCwgY2hhciAqaG9zdG5hbWUgKQoreworICAgIGlmKCBob3N0bmFtZSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfU1NMX0JBRF9JTlBVVF9EQVRBICk7CisKKyAgICBzc2wtPmhvc3RuYW1lX2xlbiA9IHN0cmxlbiggaG9zdG5hbWUgKTsKKyAgICBzc2wtPmhvc3RuYW1lID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jKCBzc2wtPmhvc3RuYW1lX2xlbiApOworCisgICAgbWVtY3B5KCBzc2wtPmhvc3RuYW1lLCAodW5zaWduZWQgY2hhciAqKSBob3N0bmFtZSwKKyAgICAgICAgICAgIHNzbC0+aG9zdG5hbWVfbGVuICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIFNTTCBnZXQgYWNjZXNzb3JzCisgKi8KK2ludCBzc2xfZ2V0X2J5dGVzX2F2YWlsKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICByZXR1cm4oIHNzbC0+aW5fb2ZmdCA9PSBOVUxMID8gMCA6IHNzbC0+aW5fbXNnbGVuICk7Cit9CisKK2ludCBzc2xfZ2V0X3ZlcmlmeV9yZXN1bHQoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIHJldHVybiggc3NsLT52ZXJpZnlfcmVzdWx0ICk7Cit9CisKK2NoYXIgKnNzbF9nZXRfY2lwaGVyKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICBzd2l0Y2goIHNzbC0+c2Vzc2lvbi0+Y2lwaGVyICkKKyAgICB7CisjaWYgZGVmaW5lZChYWVNTTF9BUkM0X0MpCisgICAgICAgIGNhc2UgU1NMX1JTQV9SQzRfMTI4X01ENToKKyAgICAgICAgICAgIHJldHVybiggIlNTTF9SU0FfUkM0XzEyOF9NRDUiICk7CisKKyAgICAgICAgY2FzZSBTU0xfUlNBX1JDNF8xMjhfU0hBOgorICAgICAgICAgICAgcmV0dXJuKCAiU1NMX1JTQV9SQzRfMTI4X1NIQSIgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9ERVNfQykKKyAgICAgICAgY2FzZSBTU0xfUlNBX0RFU18xNjhfU0hBOgorICAgICAgICAgICAgcmV0dXJuKCAiU1NMX1JTQV9ERVNfMTY4X1NIQSIgKTsKKworICAgICAgICBjYXNlIFNTTF9FREhfUlNBX0RFU18xNjhfU0hBOgorICAgICAgICAgICAgcmV0dXJuKCAiU1NMX0VESF9SU0FfREVTXzE2OF9TSEEiICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWFlTU0xfQUVTX0MpCisgICAgICAgIGNhc2UgU1NMX1JTQV9BRVNfMTI4X1NIQToKKyAgICAgICAgICAgIHJldHVybiggIlNTTF9SU0FfQUVTXzEyOF9TSEEiICk7CisKKyAgICAgICAgY2FzZSBTU0xfUlNBX0FFU18yNTZfU0hBOgorICAgICAgICAgICAgcmV0dXJuKCAiU1NMX1JTQV9BRVNfMjU2X1NIQSIgKTsKKworICAgICAgICBjYXNlIFNTTF9FREhfUlNBX0FFU18yNTZfU0hBOgorICAgICAgICAgICAgcmV0dXJuKCAiU1NMX0VESF9SU0FfQUVTXzI1Nl9TSEEiICk7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiggInVua25vd24iICk7Cit9CisKK2ludCBzc2xfZGVmYXVsdF9jaXBoZXJzW10gPQoreworI2lmIGRlZmluZWQoWFlTU0xfREhNX0MpCisjaWYgZGVmaW5lZChYWVNTTF9BRVNfQykKKyAgICBTU0xfRURIX1JTQV9BRVNfMjU2X1NIQSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFlTU0xfREVTX0MpCisgICAgU1NMX0VESF9SU0FfREVTXzE2OF9TSEEsCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9BRVNfQykKKyAgICBTU0xfUlNBX0FFU18xMjhfU0hBLAorICAgIFNTTF9SU0FfQUVTXzI1Nl9TSEEsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFhZU1NMX0RFU19DKQorICAgIFNTTF9SU0FfREVTXzE2OF9TSEEsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFhZU1NMX0FSQzRfQykKKyAgICBTU0xfUlNBX1JDNF8xMjhfU0hBLAorICAgIFNTTF9SU0FfUkM0XzEyOF9NRDUsCisjZW5kaWYKKyAgICAwCit9OworCisvKgorICogUGVyZm9ybSB0aGUgU1NMIGhhbmRzaGFrZQorICovCitpbnQgc3NsX2hhbmRzaGFrZSggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgaW50IHJldCA9IFhZU1NMX0VSUl9TU0xfRkVBVFVSRV9VTkFWQUlMQUJMRTsKKworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IGhhbmRzaGFrZSIgKSApOworCisjaWYgZGVmaW5lZChYWVNTTF9TU0xfQ0xJX0MpCisgICAgaWYoIHNzbC0+ZW5kcG9pbnQgPT0gU1NMX0lTX0NMSUVOVCApCisgICAgICAgIHJldCA9IHNzbF9oYW5kc2hha2VfY2xpZW50KCBzc2wgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9TU0xfU1JWX0MpCisgICAgaWYoIHNzbC0+ZW5kcG9pbnQgPT0gU1NMX0lTX1NFUlZFUiApCisgICAgICAgIHJldCA9IHNzbF9oYW5kc2hha2Vfc2VydmVyKCBzc2wgKTsKKyNlbmRpZgorCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gaGFuZHNoYWtlIiApICk7CisKKyAgICByZXR1cm4oIHJldCApOworfQorCisvKgorICogUmVjZWl2ZSBhcHBsaWNhdGlvbiBkYXRhIGRlY3J5cHRlZCBmcm9tIHRoZSBTU0wgbGF5ZXIKKyAqLworaW50IHNzbF9yZWFkKCBzc2xfY29udGV4dCAqc3NsLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4gKQoreworICAgIGludCByZXQsIG47CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiByZWFkIiApICk7CisKKyAgICBpZiggc3NsLT5zdGF0ZSAhPSBTU0xfSEFORFNIQUtFX09WRVIgKQorICAgIHsKKyAgICAgICAgaWYoICggcmV0ID0gc3NsX2hhbmRzaGFrZSggc3NsICkgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF9oYW5kc2hha2UiLCByZXQgKTsKKyAgICAgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggc3NsLT5pbl9vZmZ0ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgaWYoICggcmV0ID0gc3NsX3JlYWRfcmVjb3JkKCBzc2wgKSApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX3JlYWRfcmVjb3JkIiwgcmV0ICk7CisgICAgICAgICAgICByZXR1cm4oIHJldCApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNzbC0+aW5fbXNnbGVuICA9PSAwICYmCisgICAgICAgICAgICBzc2wtPmluX21zZ3R5cGUgPT0gU1NMX01TR19BUFBMSUNBVElPTl9EQVRBICkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE9wZW5TU0wgc2VuZHMgZW1wdHkgbWVzc2FnZXMgdG8gcmFuZG9taXplIHRoZSBJVgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiggKCByZXQgPSBzc2xfcmVhZF9yZWNvcmQoIHNzbCApICkgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF9yZWFkX3JlY29yZCIsIHJldCApOworICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggc3NsLT5pbl9tc2d0eXBlICE9IFNTTF9NU0dfQVBQTElDQVRJT05fREFUQSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19NU0coIDEsICggImJhZCBhcHBsaWNhdGlvbiBkYXRhIG1lc3NhZ2UiICkgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1NTTF9VTkVYUEVDVEVEX01FU1NBR0UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHNzbC0+aW5fb2ZmdCA9IHNzbC0+aW5fbXNnOworICAgIH0KKworICAgIG4gPSAoIGxlbiA8IHNzbC0+aW5fbXNnbGVuICkKKyAgICAgICAgPyBsZW4gOiBzc2wtPmluX21zZ2xlbjsKKworICAgIG1lbWNweSggYnVmLCBzc2wtPmluX29mZnQsIG4gKTsKKyAgICBzc2wtPmluX21zZ2xlbiAtPSBuOworCisgICAgaWYoIHNzbC0+aW5fbXNnbGVuID09IDAgKQorICAgICAgICAvKiBhbGwgYnl0ZXMgY29uc3VtZWQgICovCisgICAgICAgIHNzbC0+aW5fb2ZmdCA9IE5VTEw7CisgICAgZWxzZQorICAgICAgICAvKiBtb3JlIGRhdGEgYXZhaWxhYmxlICovCisgICAgICAgIHNzbC0+aW5fb2ZmdCArPSBuOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPD0gcmVhZCIgKSApOworCisgICAgcmV0dXJuKCBuICk7Cit9CisKKy8qCisgKiBTZW5kIGFwcGxpY2F0aW9uIGRhdGEgdG8gYmUgZW5jcnlwdGVkIGJ5IHRoZSBTU0wgbGF5ZXIKKyAqLworaW50IHNzbF93cml0ZSggc3NsX2NvbnRleHQgKnNzbCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuICkKK3sKKyAgICBpbnQgcmV0LCBuOworCisgICAgU1NMX0RFQlVHX01TRyggMiwgKCAiPT4gd3JpdGUiICkgKTsKKworICAgIGlmKCBzc2wtPnN0YXRlICE9IFNTTF9IQU5EU0hBS0VfT1ZFUiApCisgICAgeworICAgICAgICBpZiggKCByZXQgPSBzc2xfaGFuZHNoYWtlKCBzc2wgKSApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX2hhbmRzaGFrZSIsIHJldCApOworICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG4gPSAoIGxlbiA8IFNTTF9NQVhfQ09OVEVOVF9MRU4gKQorICAgICAgICA/IGxlbiA6IFNTTF9NQVhfQ09OVEVOVF9MRU47CisKKyAgICBpZiggc3NsLT5vdXRfbGVmdCAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCAoIHJldCA9IHNzbF9mbHVzaF9vdXRwdXQoIHNzbCApICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNTTF9ERUJVR19SRVQoIDEsICJzc2xfZmx1c2hfb3V0cHV0IiwgcmV0ICk7CisgICAgICAgICAgICByZXR1cm4oIHJldCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNzbC0+b3V0X21zZ2xlbiAgPSBuOworICAgICAgICBzc2wtPm91dF9tc2d0eXBlID0gU1NMX01TR19BUFBMSUNBVElPTl9EQVRBOworICAgICAgICBtZW1jcHkoIHNzbC0+b3V0X21zZywgYnVmLCBuICk7CisKKyAgICAgICAgaWYoICggcmV0ID0gc3NsX3dyaXRlX3JlY29yZCggc3NsICkgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF93cml0ZV9yZWNvcmQiLCByZXQgKTsKKyAgICAgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSB3cml0ZSIgKSApOworCisgICAgcmV0dXJuKCBuICk7Cit9CisKKy8qCisgKiBOb3RpZnkgdGhlIHBlZXIgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBiZWluZyBjbG9zZWQKKyAqLworaW50IHNzbF9jbG9zZV9ub3RpZnkoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIGludCByZXQ7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI9PiB3cml0ZSBjbG9zZSBub3RpZnkiICkgKTsKKworICAgIGlmKCAoIHJldCA9IHNzbF9mbHVzaF9vdXRwdXQoIHNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBTU0xfREVCVUdfUkVUKCAxLCAic3NsX2ZsdXNoX291dHB1dCIsIHJldCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIGlmKCBzc2wtPnN0YXRlID09IFNTTF9IQU5EU0hBS0VfT1ZFUiApCisgICAgeworICAgICAgICBzc2wtPm91dF9tc2d0eXBlID0gU1NMX01TR19BTEVSVDsKKyAgICAgICAgc3NsLT5vdXRfbXNnbGVuICA9IDI7CisgICAgICAgIHNzbC0+b3V0X21zZ1swXSAgPSBTU0xfQUxFUlRfV0FSTklORzsKKyAgICAgICAgc3NsLT5vdXRfbXNnWzFdICA9IFNTTF9BTEVSVF9DTE9TRV9OT1RJRlk7CisKKyAgICAgICAgaWYoICggcmV0ID0gc3NsX3dyaXRlX3JlY29yZCggc3NsICkgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgU1NMX0RFQlVHX1JFVCggMSwgInNzbF93cml0ZV9yZWNvcmQiLCByZXQgKTsKKyAgICAgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSB3cml0ZSBjbG9zZSBub3RpZnkiICkgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKy8qCisgKiBGcmVlIGFuIFNTTCBjb250ZXh0CisgKi8KK3ZvaWQgc3NsX2ZyZWUoIHNzbF9jb250ZXh0ICpzc2wgKQoreworICAgIFNTTF9ERUJVR19NU0coIDIsICggIj0+IGZyZWUiICkgKTsKKworICAgIGlmKCBzc2wtPnBlZXJfY2VydCAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHg1MDlfZnJlZSggc3NsLT5wZWVyX2NlcnQgKTsKKyAgICAgICAgbWVtc2V0KCBzc2wtPnBlZXJfY2VydCwgMCwgc2l6ZW9mKCB4NTA5X2NlcnQgKSApOworICAgICAgICAgIGZyZWUoIHNzbC0+cGVlcl9jZXJ0ICk7CisgICAgfQorCisgICAgaWYoIHNzbC0+b3V0X2N0ciAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIG1lbXNldCggc3NsLT5vdXRfY3RyLCAwLCBTU0xfQlVGRkVSX0xFTiApOworICAgICAgICAgIGZyZWUoIHNzbC0+b3V0X2N0ciApOworICAgIH0KKworICAgIGlmKCBzc2wtPmluX2N0ciAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIG1lbXNldCggc3NsLT5pbl9jdHIsIDAsIFNTTF9CVUZGRVJfTEVOICk7CisgICAgICAgICAgZnJlZSggc3NsLT5pbl9jdHIgKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFhZU1NMX0RITV9DKQorICAgIGRobV9mcmVlKCAmc3NsLT5kaG1fY3R4ICk7CisjZW5kaWYKKworICAgIGlmICggc3NsLT5ob3N0bmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCBzc2wtPmhvc3RuYW1lLCAwLCBzc2wtPmhvc3RuYW1lX2xlbiApOworICAgICAgICBmcmVlKCBzc2wtPmhvc3RuYW1lICk7CisgICAgICAgIHNzbC0+aG9zdG5hbWVfbGVuID0gMDsKKyAgICB9CisKKyAgICBtZW1zZXQoIHNzbCwgMCwgc2l6ZW9mKCBzc2xfY29udGV4dCApICk7CisKKyAgICBTU0xfREVCVUdfTVNHKCAyLCAoICI8PSBmcmVlIiApICk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicmFyeS90aW1pbmcuYyBiL2xpYnJhcnkvdGltaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmZTdmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnJhcnkvdGltaW5nLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiAgUG9ydGFibGUgaW50ZXJmYWNlIHRvIHRoZSBDUFUgY3ljbGUgY291bnRlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChYWVNTTF9USU1JTkdfQykKKworI2luY2x1ZGUgInh5c3NsL3RpbWluZy5oIgorCisjaWYgZGVmaW5lZChXSU4zMikKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5iYXNlLmg+CisKK3N0cnVjdCBfaHJfdGltZQoreworICAgIExBUkdFX0lOVEVHRVIgc3RhcnQ7Cit9OworCisjZWxzZQorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0cnVjdCBfaHJfdGltZQoreworICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OworfTsKKworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KSkgfHwgZGVmaW5lZChfX1dBVENPTUNfXykKKwordW5zaWduZWQgbG9uZyBoYXJkY2xvY2soIHZvaWQgKQoreworICAgIHVuc2lnbmVkIGxvbmcgdHNjOworICAgIF9fYXNtICAgcmR0c2MKKyAgICBfX2FzbSAgIG1vdiAgW3RzY10sIGVheAorICAgIHJldHVybiggdHNjICk7Cit9CisKKyNlbHNlCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODZfXykKKwordW5zaWduZWQgbG9uZyBoYXJkY2xvY2soIHZvaWQgKQoreworICAgIHVuc2lnbmVkIGxvbmcgdHNjOworICAgIGFzbSggInJkdHNjIiA6ICI9YSIgKHRzYykgKTsKKyAgICByZXR1cm4oIHRzYyApOworfQorCisjZWxzZQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9fYW1kNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKKwordW5zaWduZWQgbG9uZyBoYXJkY2xvY2soIHZvaWQgKQoreworICAgIHVuc2lnbmVkIGxvbmcgbG8sIGhpOworICAgIGFzbSggInJkdHNjIiA6ICI9YSIgKGxvKSwgIj1kIiAoaGkpICk7IAorICAgIHJldHVybiggbG8gfCAoaGkgPDwgMzIpICk7Cit9CisKKyNlbHNlCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19wcGNfXykpCisKK3Vuc2lnbmVkIGxvbmcgaGFyZGNsb2NrKCB2b2lkICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHRibCwgdGJ1MCwgdGJ1MTsKKworICAgIGRvCisgICAgeworICAgICAgICBhc20oICJtZnRidSAlMCIgOiAiPXIiICh0YnUwKSApOworICAgICAgICBhc20oICJtZnRiICAlMCIgOiAiPXIiICh0YmwgKSApOworICAgICAgICBhc20oICJtZnRidSAlMCIgOiAiPXIiICh0YnUxKSApOworICAgIH0KKyAgICB3aGlsZSggdGJ1MCAhPSB0YnUxICk7CisKKyAgICByZXR1cm4oIHRibCApOworfQorCisjZWxzZQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19zcGFyY19fKQorCit1bnNpZ25lZCBsb25nIGhhcmRjbG9jayggdm9pZCApCit7CisgICAgdW5zaWduZWQgbG9uZyB0aWNrOworICAgIGFzbSggIi5ieXRlIDB4ODMsIDB4NDEsIDB4MDAsIDB4MDAiICk7CisgICAgYXNtKCAibW92ICAgJSVnMSwgJTAiIDogIj1yIiAodGljaykgKTsKKyAgICByZXR1cm4oIHRpY2sgKTsKK30KKworI2Vsc2UKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYWxwaGFfXykKKwordW5zaWduZWQgbG9uZyBoYXJkY2xvY2soIHZvaWQgKQoreworICAgIHVuc2lnbmVkIGxvbmcgY2M7CisgICAgYXNtKCAicnBjYyAlMCIgOiAiPXIiIChjYykgKTsKKyAgICByZXR1cm4oIGNjICYgMHhGRkZGRkZGRiApOworfQorCisjZWxzZQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pYTY0X18pCisKK3Vuc2lnbmVkIGxvbmcgaGFyZGNsb2NrKCB2b2lkICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGl0YzsKKyAgICBhc20oICJtb3YgJTAgPSBhci5pdGMiIDogIj1yIiAoaXRjKSApOworICAgIHJldHVybiggaXRjICk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbnQgaGFyZGNsb2NrX2luaXQgPSAwOworc3RhdGljIHN0cnVjdCB0aW1ldmFsIHR2X2luaXQ7CisKK3Vuc2lnbmVkIGxvbmcgaGFyZGNsb2NrKCB2b2lkICkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0dl9jdXI7CisKKyAgICBpZiggaGFyZGNsb2NrX2luaXQgPT0gMCApCisgICAgeworICAgICAgICBnZXR0aW1lb2ZkYXkoICZ0dl9pbml0LCBOVUxMICk7CisgICAgICAgIGhhcmRjbG9ja19pbml0ID0gMTsKKyAgICB9CisKKyAgICBnZXR0aW1lb2ZkYXkoICZ0dl9jdXIsIE5VTEwgKTsKKyAgICByZXR1cm4oICggdHZfY3VyLnR2X3NlYyAgLSB0dl9pbml0LnR2X3NlYyAgKSAqIDEwMDAwMDAKKyAgICAgICAgICArICggdHZfY3VyLnR2X3VzZWMgLSB0dl9pbml0LnR2X3VzZWMgKSApOworfQorCisjZW5kaWYgLyogZ2VuZXJpYyAqLworI2VuZGlmIC8qIElBLTY0ICAgKi8KKyNlbmRpZiAvKiBBbHBoYSAgICovCisjZW5kaWYgLyogU1BBUkM4ICAqLworI2VuZGlmIC8qIFBvd2VyUEMgKi8KKyNlbmRpZiAvKiBBTUQ2NCAgICovCisjZW5kaWYgLyogaTU4NisgICAqLworCitpbnQgYWxhcm1lZCA9IDA7CisKKyNpZiBkZWZpbmVkKFdJTjMyKQorCit1bnNpZ25lZCBsb25nIGdldF90aW1lciggc3RydWN0IGhyX3RpbWUgKnZhbCwgaW50IHJlc2V0ICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGRlbHRhOworICAgIExBUkdFX0lOVEVHRVIgb2Zmc2V0LCBoZnJlcTsKKyAgICBzdHJ1Y3QgX2hyX3RpbWUgKnQgPSAoc3RydWN0IF9ocl90aW1lICopIHZhbDsKKworICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAgJm9mZnNldCApOworICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koICZoZnJlcSApOworCisgICAgZGVsdGEgPSAodW5zaWduZWQgbG9uZykoICggMTAwMCAqCisgICAgICAgICggb2Zmc2V0LlF1YWRQYXJ0IC0gdC0+c3RhcnQuUXVhZFBhcnQgKSApIC8KKyAgICAgICAgICAgaGZyZXEuUXVhZFBhcnQgKTsKKworICAgIGlmKCByZXNldCApCisgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmdC0+c3RhcnQgKTsKKworICAgIHJldHVybiggZGVsdGEgKTsKK30KKworRFdPUkQgV0lOQVBJIFRpbWVyUHJvYyggTFBWT0lEIHVFbGFwc2UgKQoreyAgIAorICAgIFNsZWVwKCAoRFdPUkQpIHVFbGFwc2UgKTsKKyAgICBhbGFybWVkID0gMTsgCisgICAgcmV0dXJuKCBUUlVFICk7Cit9CisKK3ZvaWQgc2V0X2FsYXJtKCBpbnQgc2Vjb25kcyApCit7ICAgCisgICAgRFdPUkQgVGhyZWFkSWQ7CisKKyAgICBhbGFybWVkID0gMDsgCisgICAgQ2xvc2VIYW5kbGUoIENyZWF0ZVRocmVhZCggTlVMTCwgMCwgVGltZXJQcm9jLAorICAgICAgICAoTFBWT0lEKSAoIHNlY29uZHMgKiAxMDAwICksIDAsICZUaHJlYWRJZCApICk7Cit9CisKK3ZvaWQgbV9zbGVlcCggaW50IG1pbGxpc2Vjb25kcyApCit7CisgICAgU2xlZXAoIG1pbGxpc2Vjb25kcyApOworfQorCisjZWxzZQorCit1bnNpZ25lZCBsb25nIGdldF90aW1lciggc3RydWN0IGhyX3RpbWUgKnZhbCwgaW50IHJlc2V0ICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGRlbHRhOworICAgIHN0cnVjdCB0aW1ldmFsIG9mZnNldDsKKyAgICBzdHJ1Y3QgX2hyX3RpbWUgKnQgPSAoc3RydWN0IF9ocl90aW1lICopIHZhbDsKKworICAgIGdldHRpbWVvZmRheSggJm9mZnNldCwgTlVMTCApOworCisgICAgZGVsdGEgPSAoIG9mZnNldC50dl9zZWMgIC0gdC0+c3RhcnQudHZfc2VjICApICogMTAwMAorICAgICAgICAgICsgKCBvZmZzZXQudHZfdXNlYyAtIHQtPnN0YXJ0LnR2X3VzZWMgKSAvIDEwMDA7CisKKyAgICBpZiggcmVzZXQgKQorICAgIHsKKyAgICAgICAgdC0+c3RhcnQudHZfc2VjICA9IG9mZnNldC50dl9zZWM7CisgICAgICAgIHQtPnN0YXJ0LnR2X3VzZWMgPSBvZmZzZXQudHZfdXNlYzsKKyAgICB9CisKKyAgICByZXR1cm4oIGRlbHRhICk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ2hhbmRsZXIoIGludCBzaWdudW0gKQoreyAgIAorICAgIGFsYXJtZWQgPSAxOworICAgIHNpZ25hbCggc2lnbnVtLCBzaWdoYW5kbGVyICk7Cit9CisKK3ZvaWQgc2V0X2FsYXJtKCBpbnQgc2Vjb25kcyApCit7CisgICAgYWxhcm1lZCA9IDA7CisgICAgc2lnbmFsKCBTSUdBTFJNLCBzaWdoYW5kbGVyICk7CisgICAgYWxhcm0oIHNlY29uZHMgKTsKK30KKwordm9pZCBtX3NsZWVwKCBpbnQgbWlsbGlzZWNvbmRzICkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICAgIHR2LnR2X3NlYyAgPSBtaWxsaXNlY29uZHMgLyAxMDAwOworICAgIHR2LnR2X3VzZWMgPSBtaWxsaXNlY29uZHMgKiAxMDAwOworCisgICAgc2VsZWN0KCAwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYgKTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicmFyeS94NTA5cGFyc2UuYyBiL2xpYnJhcnkveDUwOXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhYzgwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnJhcnkveDUwOXBhcnNlLmMKQEAgLTAsMCArMSwxNzQ5IEBACisvKgorICogIFguNTA5IGNlcnRpZmljYXRlIGFuZCBwcml2YXRlIGtleSBkZWNvZGluZworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKy8qCisgKiAgVGhlIElUVS1UIFguNTA5IHN0YW5kYXJkIGRlZmluZXMgYSBjZXJ0aWZpY2F0IGZvcm1hdCBmb3IgUEtJLgorICoKKyAqICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyNDU5LnR4dAorICogIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMyNzkudHh0CisgKgorICogIGZ0cDovL2Z0cC5yc2FzZWN1cml0eS5jb20vcHViL3BrY3MvYXNjaWkvcGtjcy0xdjIuYXNjCisgKgorICogIGh0dHA6Ly93d3cuaXR1LmludC9JVFUtVC9zdHVkeWdyb3Vwcy9jb20xNy9sYW5ndWFnZXMvWC42ODAtMDIwNy5wZGYKKyAqICBodHRwOi8vd3d3Lml0dS5pbnQvSVRVLVQvc3R1ZHlncm91cHMvY29tMTcvbGFuZ3VhZ2VzL1guNjkwLTAyMDcucGRmCisgKi8KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChYWVNTTF9YNTA5X1BBUlNFX0MpCisKKyNpbmNsdWRlICJ4eXNzbC94NTA5LmgiCisjaW5jbHVkZSAieHlzc2wvYmFzZTY0LmgiCisjaW5jbHVkZSAieHlzc2wvZGVzLmgiCisjaW5jbHVkZSAieHlzc2wvbWQyLmgiCisjaW5jbHVkZSAieHlzc2wvbWQ0LmgiCisjaW5jbHVkZSAieHlzc2wvbWQ1LmgiCisjaW5jbHVkZSAieHlzc2wvc2hhMS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKy8qCisgKiBBU04uMSBERVIgZGVjb2Rpbmcgcm91dGluZXMKKyAqLworc3RhdGljIGludCBhc24xX2dldF9sZW4oIHVuc2lnbmVkIGNoYXIgKipwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlbiApCit7CisgICAgaWYoICggZW5kIC0gKnAgKSA8IDEgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9BU04xX09VVF9PRl9EQVRBICk7CisKKyAgICBpZiggKCAqKnAgJiAweDgwICkgPT0gMCApCisgICAgICAgICpsZW4gPSAqKCpwKSsrOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaCggKipwICYgMHg3RiApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYoICggZW5kIC0gKnAgKSA8IDIgKQorICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0FTTjFfT1VUX09GX0RBVEEgKTsKKworICAgICAgICAgICAgKmxlbiA9ICgqcClbMV07CisgICAgICAgICAgICAoKnApICs9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiggKCBlbmQgLSAqcCApIDwgMyApCisgICAgICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfQVNOMV9PVVRfT0ZfREFUQSApOworCisgICAgICAgICAgICAqbGVuID0gKCAoKnApWzFdIDw8IDggKSB8ICgqcClbMl07CisgICAgICAgICAgICAoKnApICs9IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfQVNOMV9JTlZBTElEX0xFTkdUSCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggKmxlbiA+IChpbnQpICggZW5kIC0gKnAgKSApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0FTTjFfT1VUX09GX0RBVEEgKTsKKworICAgIHJldHVybiggMCApOworfQorCitzdGF0aWMgaW50IGFzbjFfZ2V0X3RhZyggdW5zaWduZWQgY2hhciAqKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVuLCBpbnQgdGFnICkKK3sKKyAgICBpZiggKCBlbmQgLSAqcCApIDwgMSApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0FTTjFfT1VUX09GX0RBVEEgKTsKKworICAgIGlmKCAqKnAgIT0gdGFnICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfQVNOMV9VTkVYUEVDVEVEX1RBRyApOworCisgICAgKCpwKSsrOworCisgICAgcmV0dXJuKCBhc24xX2dldF9sZW4oIHAsIGVuZCwgbGVuICkgKTsKK30KKworc3RhdGljIGludCBhc24xX2dldF9ib29sKCB1bnNpZ25lZCBjaGFyICoqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnZhbCApCit7CisgICAgaW50IHJldCwgbGVuOworCisgICAgaWYoICggcmV0ID0gYXNuMV9nZXRfdGFnKCBwLCBlbmQsICZsZW4sIEFTTjFfQk9PTEVBTiApICkgIT0gMCApCisgICAgICAgIHJldHVybiggcmV0ICk7CisKKyAgICBpZiggbGVuICE9IDEgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9BU04xX0lOVkFMSURfTEVOR1RIICk7CisKKyAgICAqdmFsID0gKCAqKnAgIT0gMCApID8gMSA6IDA7CisgICAgKCpwKSsrOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKK3N0YXRpYyBpbnQgYXNuMV9nZXRfaW50KCB1bnNpZ25lZCBjaGFyICoqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp2YWwgKQoreworICAgIGludCByZXQsIGxlbjsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X3RhZyggcCwgZW5kLCAmbGVuLCBBU04xX0lOVEVHRVIgKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIHJldCApOworCisgICAgaWYoIGxlbiA+IChpbnQpIHNpemVvZiggaW50ICkgfHwgKCAqKnAgJiAweDgwICkgIT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX0FTTjFfSU5WQUxJRF9MRU5HVEggKTsKKworICAgICp2YWwgPSAwOworCisgICAgd2hpbGUoIGxlbi0tID4gMCApCisgICAgeworICAgICAgICAqdmFsID0gKCAqdmFsIDw8IDggKSB8ICoqcDsKKyAgICAgICAgKCpwKSsrOworICAgIH0KKworICAgIHJldHVybiggMCApOworfQorCitzdGF0aWMgaW50IGFzbjFfZ2V0X21waSggdW5zaWduZWQgY2hhciAqKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1waSAqWCApCit7CisgICAgaW50IHJldCwgbGVuOworCisgICAgaWYoICggcmV0ID0gYXNuMV9nZXRfdGFnKCBwLCBlbmQsICZsZW4sIEFTTjFfSU5URUdFUiApICkgIT0gMCApCisgICAgICAgIHJldHVybiggcmV0ICk7CisKKyAgICByZXQgPSBtcGlfcmVhZF9iaW5hcnkoIFgsICpwLCBsZW4gKTsKKworICAgICpwICs9IGxlbjsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKy8qCisgKiAgVmVyc2lvbiAgOjo9ICBJTlRFR0VSICB7ICB2MSgwKSwgdjIoMSksIHYzKDIpICB9CisgKi8KK3N0YXRpYyBpbnQgeDUwOV9nZXRfdmVyc2lvbiggdW5zaWduZWQgY2hhciAqKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp2ZXIgKQoreworICAgIGludCByZXQsIGxlbjsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X3RhZyggcCwgZW5kLCAmbGVuLAorICAgICAgICAgICAgQVNOMV9DT05URVhUX1NQRUNJRklDIHwgQVNOMV9DT05TVFJVQ1RFRCB8IDAgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgaWYoIHJldCA9PSBYWVNTTF9FUlJfQVNOMV9VTkVYUEVDVEVEX1RBRyApCisgICAgICAgICAgICByZXR1cm4oICp2ZXIgPSAwICk7CisKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBlbmQgPSAqcCArIGxlbjsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X2ludCggcCwgZW5kLCB2ZXIgKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9WRVJTSU9OIHwgcmV0ICk7CisKKyAgICBpZiggKnAgIT0gZW5kICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfVkVSU0lPTiB8CisgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0FTTjFfTEVOR1RIX01JU01BVENIICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqICBDZXJ0aWZpY2F0ZVNlcmlhbE51bWJlciAgOjo9ICBJTlRFR0VSCisgKi8KK3N0YXRpYyBpbnQgeDUwOV9nZXRfc2VyaWFsKCB1bnNpZ25lZCBjaGFyICoqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDUwOV9idWYgKnNlcmlhbCApCit7CisgICAgaW50IHJldDsKKworICAgIGlmKCAoIGVuZCAtICpwICkgPCAxICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfU0VSSUFMIHwKKyAgICAgICAgICAgICAgICBYWVNTTF9FUlJfQVNOMV9PVVRfT0ZfREFUQSApOworCisgICAgaWYoICoqcCAhPSAoIEFTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IEFTTjFfUFJJTUlUSVZFIHwgMiApICYmCisgICAgICAgICoqcCAhPSAgIEFTTjFfSU5URUdFUiApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX1NFUklBTCB8CisgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0FTTjFfVU5FWFBFQ1RFRF9UQUcgKTsKKworICAgIHNlcmlhbC0+dGFnID0gKigqcCkrKzsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X2xlbiggcCwgZW5kLCAmc2VyaWFsLT5sZW4gKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9TRVJJQUwgfCByZXQgKTsKKworICAgIHNlcmlhbC0+cCA9ICpwOworICAgICpwICs9IHNlcmlhbC0+bGVuOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiAgQWxnb3JpdGhtSWRlbnRpZmllciAgOjo9ICBTRVFVRU5DRSAgeworICogICAgICAgYWxnb3JpdGhtICAgICAgICAgICAgICAgT0JKRUNUIElERU5USUZJRVIsCisgKiAgICAgICBwYXJhbWV0ZXJzICAgICAgICAgICAgICBBTlkgREVGSU5FRCBCWSBhbGdvcml0aG0gT1BUSU9OQUwgIH0KKyAqLworc3RhdGljIGludCB4NTA5X2dldF9hbGcoIHVuc2lnbmVkIGNoYXIgKipwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4NTA5X2J1ZiAqYWxnICkKK3sKKyAgICBpbnQgcmV0LCBsZW47CisKKyAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZCwgJmxlbiwKKyAgICAgICAgICAgIEFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfQUxHIHwgcmV0ICk7CisKKyAgICBlbmQgPSAqcCArIGxlbjsKKyAgICBhbGctPnRhZyA9ICoqcDsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X3RhZyggcCwgZW5kLCAmYWxnLT5sZW4sIEFTTjFfT0lEICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfQUxHIHwgcmV0ICk7CisKKyAgICBhbGctPnAgPSAqcDsKKyAgICAqcCArPSBhbGctPmxlbjsKKworICAgIGlmKCAqcCA9PSBlbmQgKQorICAgICAgICByZXR1cm4oIDAgKTsKKworICAgIC8qCisgICAgICogYXNzdW1lIHRoZSBhbGdvcml0aG0gcGFyYW1ldGVycyBtdXN0IGJlIE5VTEwKKyAgICAgKi8KKyAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZCwgJmxlbiwgQVNOMV9OVUxMICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfQUxHIHwgcmV0ICk7CisKKyAgICBpZiggKnAgIT0gZW5kICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfQUxHIHwKKyAgICAgICAgICAgICAgICBYWVNTTF9FUlJfQVNOMV9MRU5HVEhfTUlTTUFUQ0ggKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogIFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUgOjo9CisgKiAgICBTRVQgT0YgQXR0cmlidXRlVHlwZUFuZFZhbHVlCisgKgorICogIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSA6Oj0gU0VRVUVOQ0UgeworICogICAgdHlwZSAgICAgQXR0cmlidXRlVHlwZSwKKyAqICAgIHZhbHVlICAgIEF0dHJpYnV0ZVZhbHVlIH0KKyAqCisgKiAgQXR0cmlidXRlVHlwZSA6Oj0gT0JKRUNUIElERU5USUZJRVIKKyAqCisgKiAgQXR0cmlidXRlVmFsdWUgOjo9IEFOWSBERUZJTkVEIEJZIEF0dHJpYnV0ZVR5cGUKKyAqLworc3RhdGljIGludCB4NTA5X2dldF9uYW1lKCB1bnNpZ25lZCBjaGFyICoqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4NTA5X25hbWUgKmN1ciApCit7CisgICAgaW50IHJldCwgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmVuZDI7CisgICAgeDUwOV9idWYgKm9pZDsKKyAgICB4NTA5X2J1ZiAqdmFsOworCisgICAgaWYoICggcmV0ID0gYXNuMV9nZXRfdGFnKCBwLCBlbmQsICZsZW4sCisgICAgICAgICAgICBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVQgKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9OQU1FIHwgcmV0ICk7CisKKyAgICBlbmQyID0gZW5kOworICAgIGVuZCAgPSAqcCArIGxlbjsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X3RhZyggcCwgZW5kLCAmbGVuLAorICAgICAgICAgICAgQVNOMV9DT05TVFJVQ1RFRCB8IEFTTjFfU0VRVUVOQ0UgKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9OQU1FIHwgcmV0ICk7CisKKyAgICBpZiggKnAgKyBsZW4gIT0gZW5kICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfTkFNRSB8CisgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0FTTjFfTEVOR1RIX01JU01BVENIICk7CisKKyAgICBvaWQgPSAmY3VyLT5vaWQ7CisgICAgb2lkLT50YWcgPSAqKnA7CisKKyAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZCwgJm9pZC0+bGVuLCBBU04xX09JRCApICkgIT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX05BTUUgfCByZXQgKTsKKworICAgIG9pZC0+cCA9ICpwOworICAgICpwICs9IG9pZC0+bGVuOworCisgICAgaWYoICggZW5kIC0gKnAgKSA8IDEgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9OQU1FIHwKKyAgICAgICAgICAgICAgICBYWVNTTF9FUlJfQVNOMV9PVVRfT0ZfREFUQSApOworCisgICAgaWYoICoqcCAhPSBBU04xX0JNUF9TVFJJTkcgJiYgKipwICE9IEFTTjFfVVRGOF9TVFJJTkcgICAgICAmJgorICAgICAgICAqKnAgIT0gQVNOMV9UNjFfU1RSSU5HICYmICoqcCAhPSBBU04xX1BSSU5UQUJMRV9TVFJJTkcgJiYKKyAgICAgICAgKipwICE9IEFTTjFfSUE1X1NUUklORyAmJiAqKnAgIT0gQVNOMV9VTklWRVJTQUxfU1RSSU5HICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfTkFNRSB8CisgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0FTTjFfVU5FWFBFQ1RFRF9UQUcgKTsKKworICAgIHZhbCA9ICZjdXItPnZhbDsKKyAgICB2YWwtPnRhZyA9ICooKnApKys7CisKKyAgICBpZiggKCByZXQgPSBhc24xX2dldF9sZW4oIHAsIGVuZCwgJnZhbC0+bGVuICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfTkFNRSB8IHJldCApOworCisgICAgdmFsLT5wID0gKnA7CisgICAgKnAgKz0gdmFsLT5sZW47CisKKyAgICBjdXItPm5leHQgPSBOVUxMOworCisgICAgaWYoICpwICE9IGVuZCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX05BTUUgfAorICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9BU04xX0xFTkdUSF9NSVNNQVRDSCApOworCisgICAgLyoKKyAgICAgKiByZWN1cnNlIHVudGlsIGVuZCBvZiBTRVFVRU5DRSBpcyByZWFjaGVkCisgICAgICovCisgICAgaWYoICpwID09IGVuZDIgKQorICAgICAgICByZXR1cm4oIDAgKTsKKworICAgIGN1ci0+bmV4dCA9ICh4NTA5X25hbWUgKikgbWFsbG9jKAorICAgICAgICAgc2l6ZW9mKCB4NTA5X25hbWUgKSApOworCisgICAgaWYoIGN1ci0+bmV4dCA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuKCAxICk7CisKKyAgICByZXR1cm4oIHg1MDlfZ2V0X25hbWUoIHAsIGVuZDIsIGN1ci0+bmV4dCApICk7Cit9CisKKy8qCisgKiAgVmFsaWRpdHkgOjo9IFNFUVVFTkNFIHsKKyAqICAgICAgIG5vdEJlZm9yZSAgICAgIFRpbWUsCisgKiAgICAgICBub3RBZnRlciAgICAgICBUaW1lIH0KKyAqCisgKiAgVGltZSA6Oj0gQ0hPSUNFIHsKKyAqICAgICAgIHV0Y1RpbWUgICAgICAgIFVUQ1RpbWUsCisgKiAgICAgICBnZW5lcmFsVGltZSAgICBHZW5lcmFsaXplZFRpbWUgfQorICovCitzdGF0aWMgaW50IHg1MDlfZ2V0X2RhdGVzKCB1bnNpZ25lZCBjaGFyICoqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHg1MDlfdGltZSAqZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHg1MDlfdGltZSAqdG8gKQoreworICAgIGludCByZXQsIGxlbjsKKyAgICBjaGFyIGRhdGVbNjRdOworCisgICAgaWYoICggcmV0ID0gYXNuMV9nZXRfdGFnKCBwLCBlbmQsICZsZW4sCisgICAgICAgICAgICBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSApICkgIT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX0RBVEUgfCByZXQgKTsKKworICAgIGVuZCA9ICpwICsgbGVuOworCisgICAgLyoKKyAgICAgKiBUT0RPOiBhbHNvIGhhbmRsZSBHZW5lcmFsaXplZFRpbWUKKyAgICAgKi8KKyAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZCwgJmxlbiwgQVNOMV9VVENfVElNRSApICkgIT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX0RBVEUgfCByZXQgKTsKKworICAgIG1lbXNldCggZGF0ZSwgIDAsIHNpemVvZiggZGF0ZSApICk7CisgICAgbWVtY3B5KCBkYXRlLCAqcCwgKCBsZW4gPCAoaW50KSBzaXplb2YoIGRhdGUgKSAtIDEgKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gOiAoaW50KSBzaXplb2YoIGRhdGUgKSAtIDEgKTsKKworICAgIGlmKCBzc2NhbmYoIGRhdGUsICIlMmQlMmQlMmQlMmQlMmQlMmQiLAorICAgICAgICAgICAgICAgICZmcm9tLT55ZWFyLCAmZnJvbS0+bW9uLCAmZnJvbS0+ZGF5LAorICAgICAgICAgICAgICAgICZmcm9tLT5ob3VyLCAmZnJvbS0+bWluLCAmZnJvbS0+c2VjICkgPCA1ICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfREFURSApOworCisgICAgZnJvbS0+eWVhciArPSAgMTAwICogKCBmcm9tLT55ZWFyIDwgOTAgKTsKKyAgICBmcm9tLT55ZWFyICs9IDE5MDA7CisKKyAgICAqcCArPSBsZW47CisKKyAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZCwgJmxlbiwgQVNOMV9VVENfVElNRSApICkgIT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX0RBVEUgfCByZXQgKTsKKworICAgIG1lbXNldCggZGF0ZSwgIDAsIHNpemVvZiggZGF0ZSApICk7CisgICAgbWVtY3B5KCBkYXRlLCAqcCwgKCBsZW4gPCAoaW50KSBzaXplb2YoIGRhdGUgKSAtIDEgKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gOiAoaW50KSBzaXplb2YoIGRhdGUgKSAtIDEgKTsKKworICAgIGlmKCBzc2NhbmYoIGRhdGUsICIlMmQlMmQlMmQlMmQlMmQlMmQiLAorICAgICAgICAgICAgICAgICZ0by0+eWVhciwgJnRvLT5tb24sICZ0by0+ZGF5LAorICAgICAgICAgICAgICAgICZ0by0+aG91ciwgJnRvLT5taW4sICZ0by0+c2VjICkgPCA1ICkgCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX0RBVEUgKTsKKworICAgIHRvLT55ZWFyICs9ICAxMDAgKiAoIHRvLT55ZWFyIDwgOTAgKTsKKyAgICB0by0+eWVhciArPSAxOTAwOworCisgICAgKnAgKz0gbGVuOworCisgICAgaWYoICpwICE9IGVuZCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX0RBVEUgfAorICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9BU04xX0xFTkdUSF9NSVNNQVRDSCApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiAgU3ViamVjdFB1YmxpY0tleUluZm8gIDo6PSAgU0VRVUVOQ0UgIHsKKyAqICAgICAgIGFsZ29yaXRobSAgICAgICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsCisgKiAgICAgICBzdWJqZWN0UHVibGljS2V5ICAgICBCSVQgU1RSSU5HIH0KKyAqLworc3RhdGljIGludCB4NTA5X2dldF9wdWJrZXkoIHVuc2lnbmVkIGNoYXIgKipwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4NTA5X2J1ZiAqcGtfYWxnX29pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGkgKk4sIG1waSAqRSApCit7CisgICAgaW50IHJldCwgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmVuZDI7CisKKyAgICBpZiggKCByZXQgPSB4NTA5X2dldF9hbGcoIHAsIGVuZCwgcGtfYWxnX29pZCApICkgIT0gMCApCisgICAgICAgIHJldHVybiggcmV0ICk7CisKKyAgICAvKgorICAgICAqIG9ubHkgUlNBIHB1YmxpYyBrZXlzIGhhbmRsZWQgYXQgdGhpcyB0aW1lCisgICAgICovCisgICAgaWYoIHBrX2FsZ19vaWQtPmxlbiAhPSA5IHx8CisgICAgICAgIG1lbWNtcCggcGtfYWxnX29pZC0+cCwgT0lEX1BLQ1MxX1JTQSwgOSApICE9IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfVU5LTk9XTl9QS19BTEcgKTsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X3RhZyggcCwgZW5kLCAmbGVuLCBBU04xX0JJVF9TVFJJTkcgKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9QVUJLRVkgfCByZXQgKTsKKworICAgIGlmKCAoIGVuZCAtICpwICkgPCAxICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfUFVCS0VZIHwKKyAgICAgICAgICAgICAgICBYWVNTTF9FUlJfQVNOMV9PVVRfT0ZfREFUQSApOworCisgICAgZW5kMiA9ICpwICsgbGVuOworCisgICAgaWYoICooKnApKysgIT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX1BVQktFWSApOworCisgICAgLyoKKyAgICAgKiAgUlNBUHVibGljS2V5IDo6PSBTRVFVRU5DRSB7CisgICAgICogICAgICBtb2R1bHVzICAgICAgICAgICBJTlRFR0VSLCAgLS0gbgorICAgICAqICAgICAgcHVibGljRXhwb25lbnQgICAgSU5URUdFUiAgIC0tIGUKKyAgICAgKiAgfQorICAgICAqLworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X3RhZyggcCwgZW5kMiwgJmxlbiwKKyAgICAgICAgICAgIEFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfUFVCS0VZIHwgcmV0ICk7CisKKyAgICBpZiggKnAgKyBsZW4gIT0gZW5kMiApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX1BVQktFWSB8CisgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0FTTjFfTEVOR1RIX01JU01BVENIICk7CisKKyAgICBpZiggKCByZXQgPSBhc24xX2dldF9tcGkoIHAsIGVuZDIsIE4gKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBhc24xX2dldF9tcGkoIHAsIGVuZDIsIEUgKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9QVUJLRVkgfCByZXQgKTsKKworICAgIGlmKCAqcCAhPSBlbmQgKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9QVUJLRVkgfAorICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9BU04xX0xFTkdUSF9NSVNNQVRDSCApOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKK3N0YXRpYyBpbnQgeDUwOV9nZXRfc2lnKCB1bnNpZ25lZCBjaGFyICoqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDUwOV9idWYgKnNpZyApCit7CisgICAgaW50IHJldCwgbGVuOworCisgICAgc2lnLT50YWcgPSAqKnA7CisKKyAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZCwgJmxlbiwgQVNOMV9CSVRfU1RSSU5HICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfU0lHTkFUVVJFIHwgcmV0ICk7CisKKyAgICBpZiggLS1sZW4gPCAxIHx8ICooKnApKysgIT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX1NJR05BVFVSRSApOworCisgICAgc2lnLT5sZW4gPSBsZW47CisgICAgc2lnLT5wID0gKnA7CisKKyAgICAqcCArPSBsZW47CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIFguNTA5IHYyL3YzIHVuaXF1ZSBpZGVudGlmaWVyIChub3QgcGFyc2VkKQorICovCitzdGF0aWMgaW50IHg1MDlfZ2V0X3VpZCggdW5zaWduZWQgY2hhciAqKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHg1MDlfYnVmICp1aWQsIGludCBuICkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYoICpwID09IGVuZCApCisgICAgICAgIHJldHVybiggMCApOworCisgICAgdWlkLT50YWcgPSAqKnA7CisKKyAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZCwgJnVpZC0+bGVuLAorICAgICAgICAgICAgQVNOMV9DT05URVhUX1NQRUNJRklDIHwgQVNOMV9DT05TVFJVQ1RFRCB8IG4gKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgaWYoIHJldCA9PSBYWVNTTF9FUlJfQVNOMV9VTkVYUEVDVEVEX1RBRyApCisgICAgICAgICAgICByZXR1cm4oIDAgKTsKKworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIHVpZC0+cCA9ICpwOworICAgICpwICs9IHVpZC0+bGVuOworCisgICAgcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBYLjUwOSB2MyBleHRlbnNpb25zIChvbmx5IEJhc2ljQ29uc3RyYWludHMgYXJlIHBhcnNlZCkKKyAqLworc3RhdGljIGludCB4NTA5X2dldF9leHQoIHVuc2lnbmVkIGNoYXIgKipwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4NTA5X2J1ZiAqZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY2FfaXN0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWF4X3BhdGhsZW4gKQoreworICAgIGludCByZXQsIGxlbjsKKyAgICBpbnQgaXNfY3JpdGljYWwgPSAxOworICAgIGludCBpc19jYWNlcnQgICA9IDA7CisgICAgdW5zaWduZWQgY2hhciAqZW5kMjsKKworICAgIGlmKCAqcCA9PSBlbmQgKQorICAgICAgICByZXR1cm4oIDAgKTsKKworICAgIGV4dC0+dGFnID0gKipwOworCisgICAgaWYoICggcmV0ID0gYXNuMV9nZXRfdGFnKCBwLCBlbmQsICZleHQtPmxlbiwKKyAgICAgICAgICAgIEFTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IEFTTjFfQ09OU1RSVUNURUQgfCAzICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCByZXQgPT0gWFlTU0xfRVJSX0FTTjFfVU5FWFBFQ1RFRF9UQUcgKQorICAgICAgICAgICAgcmV0dXJuKCAwICk7CisKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBleHQtPnAgPSAqcDsKKyAgICBlbmQgPSAqcCArIGV4dC0+bGVuOworCisgICAgLyoKKyAgICAgKiBFeHRlbnNpb25zICA6Oj0gIFNFUVVFTkNFIFNJWkUgKDEuLk1BWCkgT0YgRXh0ZW5zaW9uCisgICAgICoKKyAgICAgKiBFeHRlbnNpb24gIDo6PSAgU0VRVUVOQ0UgIHsKKyAgICAgKiAgICAgIGV4dG5JRCAgICAgIE9CSkVDVCBJREVOVElGSUVSLAorICAgICAqICAgICAgY3JpdGljYWwgICAgQk9PTEVBTiBERUZBVUxUIEZBTFNFLAorICAgICAqICAgICAgZXh0blZhbHVlICAgT0NURVQgU1RSSU5HICB9CisgICAgICovCisgICAgaWYoICggcmV0ID0gYXNuMV9nZXRfdGFnKCBwLCBlbmQsICZsZW4sCisgICAgICAgICAgICBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSApICkgIT0gMCApCisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX0VYVEVOU0lPTlMgfCByZXQgKTsKKworICAgIGlmKCBlbmQgIT0gKnAgKyBsZW4gKQorICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9FWFRFTlNJT05TIHwKKyAgICAgICAgICAgICAgICBYWVNTTF9FUlJfQVNOMV9MRU5HVEhfTUlTTUFUQ0ggKTsKKworICAgIHdoaWxlKCAqcCA8IGVuZCApCisgICAgeworICAgICAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZCwgJmxlbiwKKyAgICAgICAgICAgICAgICBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSApICkgIT0gMCApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9FWFRFTlNJT05TIHwgcmV0ICk7CisKKyAgICAgICAgaWYoIG1lbWNtcCggKnAsICJceDA2XHgwM1x4NTVceDFEXHgxMyIsIDUgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgKnAgKz0gbGVuOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAqcCArPSA1OworCisgICAgICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X2Jvb2woIHAsIGVuZCwgJmlzX2NyaXRpY2FsICkgKSAhPSAwICYmCisgICAgICAgICAgICAoIHJldCAhPSBYWVNTTF9FUlJfQVNOMV9VTkVYUEVDVEVEX1RBRyApICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX0VYVEVOU0lPTlMgfCByZXQgKTsKKworICAgICAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZCwgJmxlbiwKKyAgICAgICAgICAgICAgICBBU04xX09DVEVUX1NUUklORyApICkgIT0gMCApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9FWFRFTlNJT05TIHwgcmV0ICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQmFzaWNDb25zdHJhaW50cyA6Oj0gU0VRVUVOQ0UgeworICAgICAgICAgKiAgICAgIGNBICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gREVGQVVMVCBGQUxTRSwKKyAgICAgICAgICogICAgICBwYXRoTGVuQ29uc3RyYWludCAgICAgICBJTlRFR0VSICgwLi5NQVgpIE9QVElPTkFMIH0KKyAgICAgICAgICovCisgICAgICAgIGVuZDIgPSAqcCArIGxlbjsKKworICAgICAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoIHAsIGVuZDIsICZsZW4sCisgICAgICAgICAgICAgICAgQVNOMV9DT05TVFJVQ1RFRCB8IEFTTjFfU0VRVUVOQ0UgKSApICE9IDAgKQorICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfRVhURU5TSU9OUyB8IHJldCApOworCisgICAgICAgIGlmKCAqcCA9PSBlbmQyICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X2Jvb2woIHAsIGVuZDIsICZpc19jYWNlcnQgKSApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcmV0ID09IFhZU1NMX0VSUl9BU04xX1VORVhQRUNURURfVEFHICkKKyAgICAgICAgICAgICAgICByZXQgPSBhc24xX2dldF9pbnQoIHAsIGVuZDIsICZpc19jYWNlcnQgKTsKKworICAgICAgICAgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9FWFRFTlNJT05TIHwgcmV0ICk7CisKKyAgICAgICAgICAgIGlmKCBpc19jYWNlcnQgIT0gMCApCisgICAgICAgICAgICAgICAgaXNfY2FjZXJ0ICA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiggKnAgPT0gZW5kMiApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggKCByZXQgPSBhc24xX2dldF9pbnQoIHAsIGVuZDIsIG1heF9wYXRobGVuICkgKSAhPSAwICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX0VYVEVOU0lPTlMgfCByZXQgKTsKKworICAgICAgICBpZiggKnAgIT0gZW5kMiApCisgICAgICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9FWFRFTlNJT05TIHwKKyAgICAgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0FTTjFfTEVOR1RIX01JU01BVENIICk7CisKKyAgICAgICAgbWF4X3BhdGhsZW4rKzsKKyAgICB9CisKKyAgICBpZiggKnAgIT0gZW5kICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfRVhURU5TSU9OUyB8CisgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0FTTjFfTEVOR1RIX01JU01BVENIICk7CisKKyAgICAqY2FfaXN0cnVlID0gaXNfY3JpdGljYWwgJiBpc19jYWNlcnQ7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIFBhcnNlIG9uZSBvciBtb3JlIGNlcnRpZmljYXRlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNoYWluZWQgbGlzdAorICovCitpbnQgeDUwOXBhcnNlX2NydCggeDUwOV9jZXJ0ICpjaGFpbiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuICkKK3sKKyAgICBpbnQgcmV0LCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqczEsICpzMjsKKyAgICB1bnNpZ25lZCBjaGFyICpwLCAqZW5kOworICAgIHg1MDlfY2VydCAqY3J0OworCisgICAgY3J0ID0gY2hhaW47CisKKyAgICB3aGlsZSggY3J0LT52ZXJzaW9uICE9IDAgKQorICAgICAgICBjcnQgPSBjcnQtPm5leHQ7CisKKyAgICAvKgorICAgICAqIGNoZWNrIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBlbmNvZGVkIGluIGJhc2U2NAorICAgICAqLworICAgIHMxID0gKHVuc2lnbmVkIGNoYXIgKikgc3Ryc3RyKCAoY2hhciAqKSBidWYsCisgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0iICk7CisKKyAgICBpZiggczEgIT0gTlVMTCApCisgICAgeworICAgICAgICBzMiA9ICh1bnNpZ25lZCBjaGFyICopIHN0cnN0ciggKGNoYXIgKikgYnVmLAorICAgICAgICAgICAgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iICk7CisKKyAgICAgICAgaWYoIHMyID09IE5VTEwgfHwgczIgPD0gczEgKQorICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfUEVNICk7CisKKyAgICAgICAgczEgKz0gMjc7CisgICAgICAgIGlmKCAqczEgPT0gJ1xyJyApIHMxKys7CisgICAgICAgIGlmKCAqczEgPT0gJ1xuJyApIHMxKys7CisgICAgICAgICAgICBlbHNlIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX1BFTSApOworCisgICAgICAgIC8qCisgICAgICAgICAqIGdldCB0aGUgREVSIGRhdGEgbGVuZ3RoIGFuZCBkZWNvZGUgdGhlIGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgbGVuID0gMDsKKyAgICAgICAgcmV0ID0gYmFzZTY0X2RlY29kZSggTlVMTCwgJmxlbiwgczEsIHMyIC0gczEgKTsKKworICAgICAgICBpZiggcmV0ID09IFhZU1NMX0VSUl9CQVNFNjRfSU5WQUxJRF9DSEFSQUNURVIgKQorICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfUEVNIHwgcmV0ICk7CisKKyAgICAgICAgaWYoICggcCA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyggbGVuICkgKSA9PSBOVUxMICkKKyAgICAgICAgICAgIHJldHVybiggMSApOworICAgICAgICAgICAgCisgICAgICAgIGlmKCAoIHJldCA9IGJhc2U2NF9kZWNvZGUoIHAsICZsZW4sIHMxLCBzMiAtIHMxICkgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlZSggcCApOworICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfUEVNIHwgcmV0ICk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiB1cGRhdGUgdGhlIGJ1ZmZlciBzaXplIGFuZCBvZmZzZXQKKyAgICAgICAgICovCisgICAgICAgIHMyICs9IDI1OworICAgICAgICBpZiggKnMyID09ICdccicgKSBzMisrOworICAgICAgICBpZiggKnMyID09ICdcbicgKSBzMisrOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyZWUoIHAgKTsKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX1BFTSApOworICAgICAgICB9CisKKyAgICAgICAgYnVmbGVuIC09IHMyIC0gYnVmOworICAgICAgICBidWYgPSBzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogbm9wZSwgY29weSB0aGUgcmF3IERFUiBkYXRhCisgICAgICAgICAqLworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jKCBsZW4gPSBidWZsZW4gKTsKKworICAgICAgICBpZiggcCA9PSBOVUxMICkKKyAgICAgICAgICAgIHJldHVybiggMSApOworCisgICAgICAgIG1lbWNweSggcCwgYnVmLCBidWZsZW4gKTsKKworICAgICAgICBidWZsZW4gPSAwOworICAgIH0KKworICAgIGNydC0+cmF3LnAgPSBwOworICAgIGNydC0+cmF3LmxlbiA9IGxlbjsKKyAgICBlbmQgPSBwICsgbGVuOworCisgICAgLyoKKyAgICAgKiBDZXJ0aWZpY2F0ZSAgOjo9ICBTRVFVRU5DRSAgeworICAgICAqICAgICAgdGJzQ2VydGlmaWNhdGUgICAgICAgVEJTQ2VydGlmaWNhdGUsCisgICAgICogICAgICBzaWduYXR1cmVBbGdvcml0aG0gICBBbGdvcml0aG1JZGVudGlmaWVyLAorICAgICAqICAgICAgc2lnbmF0dXJlVmFsdWUgICAgICAgQklUIFNUUklORyAgfQorICAgICAqLworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X3RhZyggJnAsIGVuZCwgJmxlbiwKKyAgICAgICAgICAgIEFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgICAgeDUwOV9mcmVlKCBjcnQgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfRk9STUFUICk7CisgICAgfQorCisgICAgaWYoIGxlbiAhPSAoaW50KSAoIGVuZCAtIHAgKSApCisgICAgeworICAgICAgICAgIHg1MDlfZnJlZSggY3J0ICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9JTlZBTElEX0ZPUk1BVCB8CisgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0FTTjFfTEVOR1RIX01JU01BVENIICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUQlNDZXJ0aWZpY2F0ZSAgOjo9ICBTRVFVRU5DRSAgeworICAgICAqLworICAgIGNydC0+dGJzLnAgPSBwOworCisgICAgaWYoICggcmV0ID0gYXNuMV9nZXRfdGFnKCAmcCwgZW5kLCAmbGVuLAorICAgICAgICAgICAgQVNOMV9DT05TVFJVQ1RFRCB8IEFTTjFfU0VRVUVOQ0UgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgICB4NTA5X2ZyZWUoIGNydCApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9GT1JNQVQgfCByZXQgKTsKKyAgICB9CisKKyAgICBlbmQgPSBwICsgbGVuOworICAgIGNydC0+dGJzLmxlbiA9IGVuZCAtIGNydC0+dGJzLnA7CisKKyAgICAvKgorICAgICAqIFZlcnNpb24gIDo6PSAgSU5URUdFUiAgeyAgdjEoMCksIHYyKDEpLCB2MygyKSAgfQorICAgICAqCisgICAgICogQ2VydGlmaWNhdGVTZXJpYWxOdW1iZXIgIDo6PSAgSU5URUdFUgorICAgICAqCisgICAgICogc2lnbmF0dXJlICAgICAgICAgICAgQWxnb3JpdGhtSWRlbnRpZmllcgorICAgICAqLworICAgIGlmKCAoIHJldCA9IHg1MDlfZ2V0X3ZlcnNpb24oICZwLCBlbmQsICZjcnQtPnZlcnNpb24gKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSB4NTA5X2dldF9zZXJpYWwoICAmcCwgZW5kLCAmY3J0LT5zZXJpYWwgICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0geDUwOV9nZXRfYWxnKCAgJnAsIGVuZCwgJmNydC0+c2lnX29pZDEgICApICkgIT0gMCApCisgICAgeworICAgICAgICAgIHg1MDlfZnJlZSggY3J0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgY3J0LT52ZXJzaW9uKys7CisKKyAgICBpZiggY3J0LT52ZXJzaW9uID4gMyApCisgICAgeworICAgICAgICAgIHg1MDlfZnJlZSggY3J0ICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9VTktOT1dOX1ZFUlNJT04gKTsKKyAgICB9CisKKyAgICBpZiggY3J0LT5zaWdfb2lkMS5sZW4gIT0gOSB8fAorICAgICAgICBtZW1jbXAoIGNydC0+c2lnX29pZDEucCwgT0lEX1BLQ1MxLCA4ICkgIT0gMCApCisgICAgeworICAgICAgICAgIHg1MDlfZnJlZSggY3J0ICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9VTktOT1dOX1NJR19BTEcgKTsKKyAgICB9CisKKyAgICBpZiggY3J0LT5zaWdfb2lkMS5wWzhdIDwgMiB8fAorICAgICAgICBjcnQtPnNpZ19vaWQxLnBbOF0gPiA1ICkKKyAgICB7CisgICAgICAgICAgeDUwOV9mcmVlKCBjcnQgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX1VOS05PV05fU0lHX0FMRyApOworICAgIH0KKworICAgIC8qCisgICAgICogaXNzdWVyICAgICAgICAgICAgICAgTmFtZQorICAgICAqLworICAgIGNydC0+aXNzdWVyX3Jhdy5wID0gcDsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X3RhZyggJnAsIGVuZCwgJmxlbiwKKyAgICAgICAgICAgIEFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgICAgeDUwOV9mcmVlKCBjcnQgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfRk9STUFUIHwgcmV0ICk7CisgICAgfQorCisgICAgaWYoICggcmV0ID0geDUwOV9nZXRfbmFtZSggJnAsIHAgKyBsZW4sICZjcnQtPmlzc3VlciApICkgIT0gMCApCisgICAgeworICAgICAgICAgIHg1MDlfZnJlZSggY3J0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgY3J0LT5pc3N1ZXJfcmF3LmxlbiA9IHAgLSBjcnQtPmlzc3Vlcl9yYXcucDsKKworICAgIC8qCisgICAgICogVmFsaWRpdHkgOjo9IFNFUVVFTkNFIHsKKyAgICAgKiAgICAgIG5vdEJlZm9yZSAgICAgIFRpbWUsCisgICAgICogICAgICBub3RBZnRlciAgICAgICBUaW1lIH0KKyAgICAgKgorICAgICAqLworICAgIGlmKCAoIHJldCA9IHg1MDlfZ2V0X2RhdGVzKCAmcCwgZW5kLCAmY3J0LT52YWxpZF9mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3J0LT52YWxpZF90byApICkgIT0gMCApCisgICAgeworICAgICAgICAgIHg1MDlfZnJlZSggY3J0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzdWJqZWN0ICAgICAgICAgICAgICBOYW1lCisgICAgICovCisgICAgY3J0LT5zdWJqZWN0X3Jhdy5wID0gcDsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X3RhZyggJnAsIGVuZCwgJmxlbiwKKyAgICAgICAgICAgIEFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgICAgeDUwOV9mcmVlKCBjcnQgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX0lOVkFMSURfRk9STUFUIHwgcmV0ICk7CisgICAgfQorCisgICAgaWYoICggcmV0ID0geDUwOV9nZXRfbmFtZSggJnAsIHAgKyBsZW4sICZjcnQtPnN1YmplY3QgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgICB4NTA5X2ZyZWUoIGNydCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIGNydC0+c3ViamVjdF9yYXcubGVuID0gcCAtIGNydC0+c3ViamVjdF9yYXcucDsKKworICAgIC8qCisgICAgICogU3ViamVjdFB1YmxpY0tleUluZm8gIDo6PSAgU0VRVUVOQ0UKKyAgICAgKiAgICAgIGFsZ29yaXRobSAgICAgICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsCisgICAgICogICAgICBzdWJqZWN0UHVibGljS2V5ICAgICBCSVQgU1RSSU5HICB9CisgICAgICovCisgICAgaWYoICggcmV0ID0gYXNuMV9nZXRfdGFnKCAmcCwgZW5kLCAmbGVuLAorICAgICAgICAgICAgQVNOMV9DT05TVFJVQ1RFRCB8IEFTTjFfU0VRVUVOQ0UgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgICB4NTA5X2ZyZWUoIGNydCApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9GT1JNQVQgfCByZXQgKTsKKyAgICB9CisKKyAgICBpZiggKCByZXQgPSB4NTA5X2dldF9wdWJrZXkoICZwLCBwICsgbGVuLCAmY3J0LT5wa19vaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3J0LT5yc2EuTiwgJmNydC0+cnNhLkUgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgICB4NTA5X2ZyZWUoIGNydCApOworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIGlmKCAoIHJldCA9IHJzYV9jaGVja19wdWJrZXkoICZjcnQtPnJzYSApICkgIT0gMCApCisgICAgeworICAgICAgICAgIHg1MDlfZnJlZSggY3J0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgY3J0LT5yc2EubGVuID0gbXBpX3NpemUoICZjcnQtPnJzYS5OICk7CisKKyAgICAvKgorICAgICAqICBpc3N1ZXJVbmlxdWVJRCAgWzFdICBJTVBMSUNJVCBVbmlxdWVJZGVudGlmaWVyIE9QVElPTkFMLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAtLSBJZiBwcmVzZW50LCB2ZXJzaW9uIHNoYWxsIGJlIHYyIG9yIHYzCisgICAgICogIHN1YmplY3RVbmlxdWVJRCBbMl0gIElNUExJQ0lUIFVuaXF1ZUlkZW50aWZpZXIgT1BUSU9OQUwsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIC0tIElmIHByZXNlbnQsIHZlcnNpb24gc2hhbGwgYmUgdjIgb3IgdjMKKyAgICAgKiAgZXh0ZW5zaW9ucyAgICAgIFszXSAgRVhQTElDSVQgRXh0ZW5zaW9ucyBPUFRJT05BTAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAtLSBJZiBwcmVzZW50LCB2ZXJzaW9uIHNoYWxsIGJlIHYzCisgICAgICovCisgICAgaWYoIGNydC0+dmVyc2lvbiA9PSAyIHx8IGNydC0+dmVyc2lvbiA9PSAzICkKKyAgICB7CisgICAgICAgIHJldCA9IHg1MDlfZ2V0X3VpZCggJnAsIGVuZCwgJmNydC0+aXNzdWVyX2lkLCAgMSApOworICAgICAgICBpZiggcmV0ICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAgIHg1MDlfZnJlZSggY3J0ICk7CisgICAgICAgICAgICByZXR1cm4oIHJldCApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGNydC0+dmVyc2lvbiA9PSAyIHx8IGNydC0+dmVyc2lvbiA9PSAzICkKKyAgICB7CisgICAgICAgIHJldCA9IHg1MDlfZ2V0X3VpZCggJnAsIGVuZCwgJmNydC0+c3ViamVjdF9pZCwgIDIgKTsKKyAgICAgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgICB4NTA5X2ZyZWUoIGNydCApOworICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBjcnQtPnZlcnNpb24gPT0gMyApCisgICAgeworICAgICAgICByZXQgPSB4NTA5X2dldF9leHQoICZwLCBlbmQsICZjcnQtPnYzX2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3J0LT5jYV9pc3RydWUsICZjcnQtPm1heF9wYXRobGVuICk7CisgICAgICAgIGlmKCByZXQgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgeDUwOV9mcmVlKCBjcnQgKTsKKyAgICAgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggcCAhPSBlbmQgKQorICAgIHsKKyAgICAgICAgICB4NTA5X2ZyZWUoIGNydCApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9GT1JNQVQgfAorICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9BU04xX0xFTkdUSF9NSVNNQVRDSCApOworICAgIH0KKworICAgIGVuZCA9IGNydC0+cmF3LnAgKyBjcnQtPnJhdy5sZW47CisKKyAgICAvKgorICAgICAqICBzaWduYXR1cmVBbGdvcml0aG0gICBBbGdvcml0aG1JZGVudGlmaWVyLAorICAgICAqICBzaWduYXR1cmVWYWx1ZSAgICAgICBCSVQgU1RSSU5HCisgICAgICovCisgICAgaWYoICggcmV0ID0geDUwOV9nZXRfYWxnKCAmcCwgZW5kLCAmY3J0LT5zaWdfb2lkMiApICkgIT0gMCApCisgICAgeworICAgICAgICAgIHg1MDlfZnJlZSggY3J0ICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgaWYoIG1lbWNtcCggY3J0LT5zaWdfb2lkMS5wLCBjcnQtPnNpZ19vaWQyLnAsIDkgKSAhPSAwICkKKyAgICB7CisgICAgICAgICAgeDUwOV9mcmVlKCBjcnQgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX1NJR19NSVNNQVRDSCApOworICAgIH0KKworICAgIGlmKCAoIHJldCA9IHg1MDlfZ2V0X3NpZyggJnAsIGVuZCwgJmNydC0+c2lnICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgICAgeDUwOV9mcmVlKCBjcnQgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBpZiggcCAhPSBlbmQgKQorICAgIHsKKyAgICAgICAgICB4NTA5X2ZyZWUoIGNydCApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0NFUlRfSU5WQUxJRF9GT1JNQVQgfAorICAgICAgICAgICAgICAgIFhZU1NMX0VSUl9BU04xX0xFTkdUSF9NSVNNQVRDSCApOworICAgIH0KKworICAgIGNydC0+bmV4dCA9ICh4NTA5X2NlcnQgKikgbWFsbG9jKCBzaXplb2YoIHg1MDlfY2VydCApICk7CisKKyAgICBpZiggY3J0LT5uZXh0ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgICB4NTA5X2ZyZWUoIGNydCApOworICAgICAgICByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBjcnQgPSBjcnQtPm5leHQ7CisgICAgbWVtc2V0KCBjcnQsIDAsIHNpemVvZiggeDUwOV9jZXJ0ICkgKTsKKworICAgIGlmKCBidWZsZW4gPiAwICkKKyAgICAgICAgcmV0dXJuKCB4NTA5cGFyc2VfY3J0KCBjcnQsIGJ1ZiwgYnVmbGVuICkgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogTG9hZCBvbmUgb3IgbW9yZSBjZXJ0aWZpY2F0ZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjaGFpbmVkIGxpc3QKKyAqLworaW50IHg1MDlwYXJzZV9jcnRmaWxlKCB4NTA5X2NlcnQgKmNoYWluLCBjaGFyICpwYXRoICkKK3sKKyAgICBpbnQgcmV0OworICAgIEZJTEUgKmY7CisgICAgc2l6ZV90IG47CisgICAgdW5zaWduZWQgY2hhciAqYnVmOworCisgICAgaWYoICggZiA9IGZvcGVuKCBwYXRoLCAicmIiICkgKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuKCAxICk7CisKKyAgICBmc2VlayggZiwgMCwgU0VFS19FTkQgKTsKKyAgICBuID0gKHNpemVfdCkgZnRlbGwoIGYgKTsKKyAgICBmc2VlayggZiwgMCwgU0VFS19TRVQgKTsKKworICAgIGlmKCAoIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyggbiArIDEgKSApID09IE5VTEwgKQorICAgICAgICByZXR1cm4oIDEgKTsKKworICAgIGlmKCBmcmVhZCggYnVmLCAxLCBuLCBmICkgIT0gbiApCisgICAgeworICAgICAgICBmY2xvc2UoIGYgKTsKKyAgICAgICAgZnJlZSggYnVmICk7CisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGJ1ZltuXSA9ICdcMCc7CisKKyAgICByZXQgPSB4NTA5cGFyc2VfY3J0KCBjaGFpbiwgYnVmLCAoaW50KSBuICk7CisKKyAgICBtZW1zZXQoIGJ1ZiwgMCwgbiArIDEgKTsKKyAgICBmcmVlKCBidWYgKTsKKyAgICBmY2xvc2UoIGYgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKKyNpZiBkZWZpbmVkKFhZU1NMX0RFU19DKQorLyoKKyAqIFJlYWQgYSAxNi1ieXRlIGhleCBzdHJpbmcgYW5kIGNvbnZlcnQgaXQgdG8gYmluYXJ5CisgKi8KK3N0YXRpYyBpbnQgeDUwOV9nZXRfaXYoIHVuc2lnbmVkIGNoYXIgKnMsIHVuc2lnbmVkIGNoYXIgaXZbOF0gKQoreworICAgIGludCBpLCBqLCBrOworCisgICAgbWVtc2V0KCBpdiwgMCwgOCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IDE2OyBpKyssIHMrKyApCisgICAgeworICAgICAgICBpZiggKnMgPj0gJzAnICYmICpzIDw9ICc5JyApIGogPSAqcyAtICcwJzsgZWxzZQorICAgICAgICBpZiggKnMgPj0gJ0EnICYmICpzIDw9ICdGJyApIGogPSAqcyAtICc3JzsgZWxzZQorICAgICAgICBpZiggKnMgPj0gJ2EnICYmICpzIDw9ICdmJyApIGogPSAqcyAtICdXJzsgZWxzZQorICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9LRVlfSU5WQUxJRF9FTkNfSVYgKTsKKworICAgICAgICBrID0gKCAoIGkgJiAxICkgIT0gMCApID8gaiA6IGogPDwgNDsKKworICAgICAgICBpdltpID4+IDFdID0gKHVuc2lnbmVkIGNoYXIpKCBpdltpID4+IDFdIHwgayApOworICAgIH0KKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogRGVjcnlwdCB3aXRoIDNERVMtQ0JDLCB1c2luZyBQQktERjEgZm9yIGtleSBkZXJpdmF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHg1MDlfZGVzM19kZWNyeXB0KCB1bnNpZ25lZCBjaGFyIGRlczNfaXZbOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB3ZCwgaW50IHB3ZGxlbiApCit7CisgICAgbWQ1X2NvbnRleHQgbWQ1X2N0eDsKKyAgICBkZXMzX2NvbnRleHQgZGVzM19jdHg7CisgICAgdW5zaWduZWQgY2hhciBtZDVzdW1bMTZdOworICAgIHVuc2lnbmVkIGNoYXIgZGVzM19rZXlbMjRdOworCisgICAgLyoKKyAgICAgKiAzREVTIGtleVsgMC4uMTVdID0gTUQ1KHB3ZCB8fCBJVikKKyAgICAgKiAgICAgIGtleVsxNi4uMjNdID0gTUQ1KHB3ZCB8fCBJViB8fCAzREVTIGtleVsgMC4uMTVdKQorICAgICAqLworICAgIG1kNV9zdGFydHMoICZtZDVfY3R4ICk7CisgICAgbWQ1X3VwZGF0ZSggJm1kNV9jdHgsIHB3ZCwgcHdkbGVuICk7CisgICAgbWQ1X3VwZGF0ZSggJm1kNV9jdHgsIGRlczNfaXYsICA4ICk7CisgICAgbWQ1X2ZpbmlzaCggJm1kNV9jdHgsIG1kNXN1bSApOworICAgIG1lbWNweSggZGVzM19rZXksIG1kNXN1bSwgMTYgKTsKKworICAgIG1kNV9zdGFydHMoICZtZDVfY3R4ICk7CisgICAgbWQ1X3VwZGF0ZSggJm1kNV9jdHgsIG1kNXN1bSwgIDE2ICk7CisgICAgbWQ1X3VwZGF0ZSggJm1kNV9jdHgsIHB3ZCwgcHdkbGVuICk7CisgICAgbWQ1X3VwZGF0ZSggJm1kNV9jdHgsIGRlczNfaXYsICA4ICk7CisgICAgbWQ1X2ZpbmlzaCggJm1kNV9jdHgsIG1kNXN1bSApOworICAgIG1lbWNweSggZGVzM19rZXkgKyAxNiwgbWQ1c3VtLCA4ICk7CisKKyAgICBkZXMzX3NldDNrZXlfZGVjKCAmZGVzM19jdHgsIGRlczNfa2V5ICk7CisgICAgZGVzM19jcnlwdF9jYmMoICZkZXMzX2N0eCwgREVTX0RFQ1JZUFQsIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGRlczNfaXYsIGJ1ZiwgYnVmICk7CisKKyAgICBtZW1zZXQoICAmbWQ1X2N0eCwgMCwgc2l6ZW9mKCAgbWQ1X2N0eCApICk7CisgICAgbWVtc2V0KCAmZGVzM19jdHgsIDAsIHNpemVvZiggZGVzM19jdHggKSApOworICAgIG1lbXNldCggbWQ1c3VtLCAwLCAxNiApOworICAgIG1lbXNldCggZGVzM19rZXksIDAsIDI0ICk7Cit9CisjZW5kaWYKKworLyoKKyAqIFBhcnNlIGEgcHJpdmF0ZSBSU0Ega2V5CisgKi8KK2ludCB4NTA5cGFyc2Vfa2V5KCByc2FfY29udGV4dCAqcnNhLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHdkLCBpbnQgcHdkbGVuICkKK3sKKyAgICBpbnQgcmV0LCBsZW4sIGVuYzsKKyAgICB1bnNpZ25lZCBjaGFyICpzMSwgKnMyOworICAgIHVuc2lnbmVkIGNoYXIgKnAsICplbmQ7CisgICAgdW5zaWduZWQgY2hhciBkZXMzX2l2WzhdOworCisgICAgczEgPSAodW5zaWduZWQgY2hhciAqKSBzdHJzdHIoIChjaGFyICopIGJ1ZiwKKyAgICAgICAgIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0iICk7CisKKyAgICBpZiggczEgIT0gTlVMTCApCisgICAgeworICAgICAgICBzMiA9ICh1bnNpZ25lZCBjaGFyICopIHN0cnN0ciggKGNoYXIgKikgYnVmLAorICAgICAgICAgICAgIi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tIiApOworCisgICAgICAgIGlmKCBzMiA9PSBOVUxMIHx8IHMyIDw9IHMxICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfS0VZX0lOVkFMSURfUEVNICk7CisKKyAgICAgICAgczEgKz0gMzE7CisgICAgICAgIGlmKCAqczEgPT0gJ1xyJyApIHMxKys7CisgICAgICAgIGlmKCAqczEgPT0gJ1xuJyApIHMxKys7CisgICAgICAgICAgICBlbHNlIHJldHVybiggWFlTU0xfRVJSX1g1MDlfS0VZX0lOVkFMSURfUEVNICk7CisKKyAgICAgICAgZW5jID0gMDsKKworICAgICAgICBpZiggbWVtY21wKCBzMSwgIlByb2MtVHlwZTogNCxFTkNSWVBURUQiLCAyMiApID09IDAgKQorICAgICAgICB7CisjaWYgZGVmaW5lZChYWVNTTF9ERVNfQykKKyAgICAgICAgICAgIGVuYysrOworCisgICAgICAgICAgICBzMSArPSAyMjsKKyAgICAgICAgICAgIGlmKCAqczEgPT0gJ1xyJyApIHMxKys7CisgICAgICAgICAgICBpZiggKnMxID09ICdcbicgKSBzMSsrOworICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9LRVlfSU5WQUxJRF9QRU0gKTsKKworICAgICAgICAgICAgaWYoIG1lbWNtcCggczEsICJERUstSW5mbzogREVTLUVERTMtQ0JDLCIsIDIzICkgIT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9LRVlfVU5LTk9XTl9FTkNfQUxHICk7CisKKyAgICAgICAgICAgIHMxICs9IDIzOworICAgICAgICAgICAgaWYoIHg1MDlfZ2V0X2l2KCBzMSwgZGVzM19pdiApICE9IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfS0VZX0lOVkFMSURfRU5DX0lWICk7CisKKyAgICAgICAgICAgIHMxICs9IDE2OworICAgICAgICAgICAgaWYoICpzMSA9PSAnXHInICkgczErKzsKKyAgICAgICAgICAgIGlmKCAqczEgPT0gJ1xuJyApIHMxKys7CisgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0tFWV9JTlZBTElEX1BFTSApOworI2Vsc2UKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfRkVBVFVSRV9VTkFWQUlMQUJMRSApOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBsZW4gPSAwOworICAgICAgICByZXQgPSBiYXNlNjRfZGVjb2RlKCBOVUxMLCAmbGVuLCBzMSwgczIgLSBzMSApOworCisgICAgICAgIGlmKCByZXQgPT0gWFlTU0xfRVJSX0JBU0U2NF9JTlZBTElEX0NIQVJBQ1RFUiApCisgICAgICAgICAgICByZXR1cm4oIHJldCB8IFhZU1NMX0VSUl9YNTA5X0tFWV9JTlZBTElEX1BFTSApOworCisgICAgICAgIGlmKCAoIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyggbGVuICkgKSA9PSBOVUxMICkKKyAgICAgICAgICAgIHJldHVybiggMSApOworCisgICAgICAgIGlmKCAoIHJldCA9IGJhc2U2NF9kZWNvZGUoIGJ1ZiwgJmxlbiwgczEsIHMyIC0gczEgKSApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVlKCBidWYgKTsKKyAgICAgICAgICAgIHJldHVybiggcmV0IHwgWFlTU0xfRVJSX1g1MDlfS0VZX0lOVkFMSURfUEVNICk7CisgICAgICAgIH0KKworICAgICAgICBidWZsZW4gPSBsZW47CisKKyAgICAgICAgaWYoIGVuYyAhPSAwICkKKyAgICAgICAgeworI2lmIGRlZmluZWQoWFlTU0xfREVTX0MpCisgICAgICAgICAgICBpZiggcHdkID09IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZWUoIGJ1ZiApOworICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfS0VZX1BBU1NXT1JEX1JFUVVJUkVEICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHg1MDlfZGVzM19kZWNyeXB0KCBkZXMzX2l2LCBidWYsIGJ1ZmxlbiwgcHdkLCBwd2RsZW4gKTsKKworICAgICAgICAgICAgaWYoIGJ1ZlswXSAhPSAweDMwIHx8IGJ1ZlsxXSAhPSAweDgyIHx8CisgICAgICAgICAgICAgICAgYnVmWzRdICE9IDB4MDIgfHwgYnVmWzVdICE9IDB4MDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZWUoIGJ1ZiApOworICAgICAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfS0VZX1BBU1NXT1JEX01JU01BVENIICk7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9GRUFUVVJFX1VOQVZBSUxBQkxFICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIG1lbXNldCggcnNhLCAwLCBzaXplb2YoIHJzYV9jb250ZXh0ICkgKTsKKworICAgIHAgPSBidWY7CisgICAgZW5kID0gYnVmICsgYnVmbGVuOworCisgICAgLyoKKyAgICAgKiAgUlNBUHJpdmF0ZUtleSA6Oj0gU0VRVUVOQ0UgeworICAgICAqICAgICAgdmVyc2lvbiAgICAgICAgICAgVmVyc2lvbiwKKyAgICAgKiAgICAgIG1vZHVsdXMgICAgICAgICAgIElOVEVHRVIsICAtLSBuCisgICAgICogICAgICBwdWJsaWNFeHBvbmVudCAgICBJTlRFR0VSLCAgLS0gZQorICAgICAqICAgICAgcHJpdmF0ZUV4cG9uZW50ICAgSU5URUdFUiwgIC0tIGQKKyAgICAgKiAgICAgIHByaW1lMSAgICAgICAgICAgIElOVEVHRVIsICAtLSBwCisgICAgICogICAgICBwcmltZTIgICAgICAgICAgICBJTlRFR0VSLCAgLS0gcQorICAgICAqICAgICAgZXhwb25lbnQxICAgICAgICAgSU5URUdFUiwgIC0tIGQgbW9kIChwLTEpCisgICAgICogICAgICBleHBvbmVudDIgICAgICAgICBJTlRFR0VSLCAgLS0gZCBtb2QgKHEtMSkKKyAgICAgKiAgICAgIGNvZWZmaWNpZW50ICAgICAgIElOVEVHRVIsICAtLSAoaW52ZXJzZSBvZiBxKSBtb2QgcAorICAgICAqICAgICAgb3RoZXJQcmltZUluZm9zICAgT3RoZXJQcmltZUluZm9zIE9QVElPTkFMCisgICAgICogIH0KKyAgICAgKi8KKyAgICBpZiggKCByZXQgPSBhc24xX2dldF90YWcoICZwLCBlbmQsICZsZW4sCisgICAgICAgICAgICBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSApICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggczEgIT0gTlVMTCApCisgICAgICAgICAgICBmcmVlKCBidWYgKTsKKworICAgICAgICByc2FfZnJlZSggcnNhICk7CisgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfS0VZX0lOVkFMSURfRk9STUFUIHwgcmV0ICk7CisgICAgfQorCisgICAgZW5kID0gcCArIGxlbjsKKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X2ludCggJnAsIGVuZCwgJnJzYS0+dmVyICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCBzMSAhPSBOVUxMICkKKyAgICAgICAgICAgIGZyZWUoIGJ1ZiApOworCisgICAgICAgIHJzYV9mcmVlKCByc2EgKTsKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9LRVlfSU5WQUxJRF9GT1JNQVQgfCByZXQgKTsKKyAgICB9CisKKyAgICBpZiggcnNhLT52ZXIgIT0gMCApCisgICAgeworICAgICAgICBpZiggczEgIT0gTlVMTCApCisgICAgICAgICAgICBmcmVlKCBidWYgKTsKKworICAgICAgICByc2FfZnJlZSggcnNhICk7CisgICAgICAgIHJldHVybiggcmV0IHwgWFlTU0xfRVJSX1g1MDlfS0VZX0lOVkFMSURfVkVSU0lPTiApOworICAgIH0KKworICAgIGlmKCAoIHJldCA9IGFzbjFfZ2V0X21waSggJnAsIGVuZCwgJnJzYS0+TiAgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBhc24xX2dldF9tcGkoICZwLCBlbmQsICZyc2EtPkUgICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gYXNuMV9nZXRfbXBpKCAmcCwgZW5kLCAmcnNhLT5EICApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IGFzbjFfZ2V0X21waSggJnAsIGVuZCwgJnJzYS0+UCAgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBhc24xX2dldF9tcGkoICZwLCBlbmQsICZyc2EtPlEgICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gYXNuMV9nZXRfbXBpKCAmcCwgZW5kLCAmcnNhLT5EUCApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IGFzbjFfZ2V0X21waSggJnAsIGVuZCwgJnJzYS0+RFEgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBhc24xX2dldF9tcGkoICZwLCBlbmQsICZyc2EtPlFQICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCBzMSAhPSBOVUxMICkKKyAgICAgICAgICAgIGZyZWUoIGJ1ZiApOworCisgICAgICAgIHJzYV9mcmVlKCByc2EgKTsKKyAgICAgICAgcmV0dXJuKCByZXQgfCBYWVNTTF9FUlJfWDUwOV9LRVlfSU5WQUxJRF9GT1JNQVQgKTsKKyAgICB9CisKKyAgICByc2EtPmxlbiA9IG1waV9zaXplKCAmcnNhLT5OICk7CisKKyAgICBpZiggcCAhPSBlbmQgKQorICAgIHsKKyAgICAgICAgaWYoIHMxICE9IE5VTEwgKQorICAgICAgICAgICAgZnJlZSggYnVmICk7CisKKyAgICAgICAgcnNhX2ZyZWUoIHJzYSApOworICAgICAgICByZXR1cm4oIFhZU1NMX0VSUl9YNTA5X0tFWV9JTlZBTElEX0ZPUk1BVCB8CisgICAgICAgICAgICAgICAgWFlTU0xfRVJSX0FTTjFfTEVOR1RIX01JU01BVENIICk7CisgICAgfQorCisgICAgaWYoICggcmV0ID0gcnNhX2NoZWNrX3ByaXZrZXkoIHJzYSApICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggczEgIT0gTlVMTCApCisgICAgICAgICAgICBmcmVlKCBidWYgKTsKKworICAgICAgICByc2FfZnJlZSggcnNhICk7CisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgaWYoIHMxICE9IE5VTEwgKQorICAgICAgICBmcmVlKCBidWYgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogTG9hZCBhbmQgcGFyc2UgYSBwcml2YXRlIFJTQSBrZXkKKyAqLworaW50IHg1MDlwYXJzZV9rZXlmaWxlKCByc2FfY29udGV4dCAqcnNhLCBjaGFyICpwYXRoLCBjaGFyICpwd2QgKQoreworICAgIGludCByZXQ7CisgICAgRklMRSAqZjsKKyAgICBzaXplX3QgbjsKKyAgICB1bnNpZ25lZCBjaGFyICpidWY7CisKKyAgICBpZiggKCBmID0gZm9wZW4oIHBhdGgsICJyYiIgKSApID09IE5VTEwgKQorICAgICAgICByZXR1cm4oIDEgKTsKKworICAgIGZzZWVrKCBmLCAwLCBTRUVLX0VORCApOworICAgIG4gPSAoc2l6ZV90KSBmdGVsbCggZiApOworICAgIGZzZWVrKCBmLCAwLCBTRUVLX1NFVCApOworCisgICAgaWYoICggYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jKCBuICsgMSApICkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiggMSApOworCisgICAgaWYoIGZyZWFkKCBidWYsIDEsIG4sIGYgKSAhPSBuICkKKyAgICB7CisgICAgICAgIGZjbG9zZSggZiApOworICAgICAgICBmcmVlKCBidWYgKTsKKyAgICAgICAgcmV0dXJuKCAxICk7CisgICAgfQorCisgICAgYnVmW25dID0gJ1wwJzsKKworICAgIGlmKCBwd2QgPT0gTlVMTCApCisgICAgICAgIHJldCA9IHg1MDlwYXJzZV9rZXkoIHJzYSwgYnVmLCAoaW50KSBuLCBOVUxMLCAwICk7CisgICAgZWxzZQorICAgICAgICByZXQgPSB4NTA5cGFyc2Vfa2V5KCByc2EsIGJ1ZiwgKGludCkgbiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSBwd2QsIHN0cmxlbiggcHdkICkgKTsKKworICAgIG1lbXNldCggYnVmLCAwLCBuICsgMSApOworICAgIGZyZWUoIGJ1ZiApOworICAgIGZjbG9zZSggZiApOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgIWRlZmluZWQgc25wcmludGYKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworLyoKKyAqIFN0b3JlIHRoZSBuYW1lIGluIHByaW50YWJsZSBmb3JtIGludG8gYnVmOyBubyBtb3JlCisgKiB0aGFuIChlbmQgLSBidWYpIGNoYXJhY3RlcnMgd2lsbCBiZSB3cml0dGVuCisgKi8KK2ludCB4NTA5cGFyc2VfZG5fZ2V0cyggY2hhciAqYnVmLCBjaGFyICplbmQsIHg1MDlfbmFtZSAqZG4gKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICB4NTA5X25hbWUgKm5hbWU7CisgICAgY2hhciBzWzEyOF0sICpwOworCisgICAgbWVtc2V0KCBzLCAwLCBzaXplb2YoIHMgKSApOworCisgICAgbmFtZSA9IGRuOworICAgIHAgPSBidWY7CisKKyAgICB3aGlsZSggbmFtZSAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIGlmKCBuYW1lICE9IGRuICkKKyAgICAgICAgICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICIsICIgKTsKKworICAgICAgICBpZiggbWVtY21wKCBuYW1lLT5vaWQucCwgT0lEX1g1MjAsIDIgKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKCBuYW1lLT5vaWQucFsyXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFg1MjBfQ09NTU9OX05BTUU6CisgICAgICAgICAgICAgICAgcCArPSBzbnByaW50ZiggcCwgZW5kIC0gcCwgIkNOPSIgKTsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWDUyMF9DT1VOVFJZOgorICAgICAgICAgICAgICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICJDPSIgICk7IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFg1MjBfTE9DQUxJVFk6CisgICAgICAgICAgICAgICAgcCArPSBzbnByaW50ZiggcCwgZW5kIC0gcCwgIkw9IiAgKTsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWDUyMF9TVEFURToKKyAgICAgICAgICAgICAgICBwICs9IHNucHJpbnRmKCBwLCBlbmQgLSBwLCAiU1Q9IiApOyBicmVhazsKKworICAgICAgICAgICAgY2FzZSBYNTIwX09SR0FOSVpBVElPTjoKKyAgICAgICAgICAgICAgICBwICs9IHNucHJpbnRmKCBwLCBlbmQgLSBwLCAiTz0iICApOyBicmVhazsKKworICAgICAgICAgICAgY2FzZSBYNTIwX09SR19VTklUOgorICAgICAgICAgICAgICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICJPVT0iICk7IGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICIweCUwMlg9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5vaWQucFsyXSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIG1lbWNtcCggbmFtZS0+b2lkLnAsIE9JRF9QS0NTOSwgOCApID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goIG5hbWUtPm9pZC5wWzhdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgUEtDUzlfRU1BSUw6CisgICAgICAgICAgICAgICAgcCArPSBzbnByaW50ZiggcCwgZW5kIC0gcCwgImVtYWlsQWRkcmVzcz0iICk7IGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICIweCUwMlg9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5vaWQucFs4XSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICJcP1w/PSIgKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbmFtZS0+dmFsLmxlbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGkgPj0gKGludCkgc2l6ZW9mKCBzICkgLSAxICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgYyA9IG5hbWUtPnZhbC5wW2ldOworICAgICAgICAgICAgaWYoIGMgPCAzMiB8fCBjID09IDEyNyB8fCAoIGMgPiAxMjggJiYgYyA8IDE2MCApICkKKyAgICAgICAgICAgICAgICAgc1tpXSA9ICc/JzsKKyAgICAgICAgICAgIGVsc2Ugc1tpXSA9IGM7CisgICAgICAgIH0KKyAgICAgICAgc1tpXSA9ICdcMCc7CisgICAgICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICIlcyIsIHMgKTsKKyAgICAgICAgbmFtZSA9IG5hbWUtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuKCBwIC0gYnVmICk7Cit9CisKKy8qCisgKiBSZXR1cm4gYW4gaW5mb3JtYXRpb25hbCBzdHJpbmcgYWJvdXQgdGhlCisgKiBjZXJ0aWZpY2F0ZSwgb3IgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKyAqLworY2hhciAqeDUwOXBhcnNlX2NlcnRfaW5mbyggY2hhciAqcHJlZml4LCB4NTA5X2NlcnQgKmNydCApCit7CisgICAgaW50IGksIG47CisgICAgY2hhciAqcCwgKmVuZDsKKyAgICBzdGF0aWMgY2hhciBidWZbNTEyXTsKKworICAgIHAgPSBidWY7CisgICAgZW5kID0gYnVmICsgc2l6ZW9mKCBidWYgKSAtIDE7CisKKyAgICBwICs9IHNucHJpbnRmKCBwLCBlbmQgLSBwLCAiJXNjZXJ0LiB2ZXJzaW9uIDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBjcnQtPnZlcnNpb24gKTsKKyAgICBwICs9IHNucHJpbnRmKCBwLCBlbmQgLSBwLCAiJXNzZXJpYWwgbnVtYmVyIDogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKTsKKworICAgIG4gPSAoIGNydC0+c2VyaWFsLmxlbiA8PSAzMiApCisgICAgICAgID8gY3J0LT5zZXJpYWwubGVuICA6IDMyOworCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICIlMDJYJXMiLAorICAgICAgICAgICAgICAgIGNydC0+c2VyaWFsLnBbaV0sICggaSA8IG4gLSAxICkgPyAiOiIgOiAiIiApOworCisgICAgcCArPSBzbnByaW50ZiggcCwgZW5kIC0gcCwgIlxuJXNpc3N1ZXIgIG5hbWUgIDogIiwgcHJlZml4ICk7CisgICAgcCArPSB4NTA5cGFyc2VfZG5fZ2V0cyggcCwgZW5kLCAmY3J0LT5pc3N1ZXIgICk7CisKKyAgICBwICs9IHNucHJpbnRmKCBwLCBlbmQgLSBwLCAiXG4lc3N1YmplY3QgbmFtZSAgOiAiLCBwcmVmaXggKTsKKyAgICBwICs9IHg1MDlwYXJzZV9kbl9nZXRzKCBwLCBlbmQsICZjcnQtPnN1YmplY3QgKTsKKworICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICJcbiVzaXNzdWVkICBvbiAgICA6ICIgXAorICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICBjcnQtPnZhbGlkX2Zyb20ueWVhciwgY3J0LT52YWxpZF9mcm9tLm1vbiwKKyAgICAgICAgICAgICAgICAgICBjcnQtPnZhbGlkX2Zyb20uZGF5LCAgY3J0LT52YWxpZF9mcm9tLmhvdXIsCisgICAgICAgICAgICAgICAgICAgY3J0LT52YWxpZF9mcm9tLm1pbiwgIGNydC0+dmFsaWRfZnJvbS5zZWMgKTsKKworICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICJcbiVzZXhwaXJlcyBvbiAgICA6ICIgXAorICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICBjcnQtPnZhbGlkX3RvLnllYXIsIGNydC0+dmFsaWRfdG8ubW9uLAorICAgICAgICAgICAgICAgICAgIGNydC0+dmFsaWRfdG8uZGF5LCAgY3J0LT52YWxpZF90by5ob3VyLAorICAgICAgICAgICAgICAgICAgIGNydC0+dmFsaWRfdG8ubWluLCAgY3J0LT52YWxpZF90by5zZWMgKTsKKworICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICJcbiVzc2lnbmVkIHVzaW5nICA6IFJTQSsiLCBwcmVmaXggKTsKKworICAgIHN3aXRjaCggY3J0LT5zaWdfb2lkMS5wWzhdICkKKyAgICB7CisgICAgICAgIGNhc2UgUlNBX01EMiA6IHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICJNRDIiICApOyBicmVhazsKKyAgICAgICAgY2FzZSBSU0FfTUQ0IDogcCArPSBzbnByaW50ZiggcCwgZW5kIC0gcCwgIk1ENCIgICk7IGJyZWFrOworICAgICAgICBjYXNlIFJTQV9NRDUgOiBwICs9IHNucHJpbnRmKCBwLCBlbmQgLSBwLCAiTUQ1IiAgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUlNBX1NIQTE6IHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICJTSEExIiApOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcCArPSBzbnByaW50ZiggcCwgZW5kIC0gcCwgIj8/PyIgICk7IGJyZWFrOworICAgIH0KKworICAgIHAgKz0gc25wcmludGYoIHAsIGVuZCAtIHAsICJcbiVzUlNBIGtleSBzaXplICA6ICVkIGJpdHNcbiIsIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICBjcnQtPnJzYS5OLm4gKiAoaW50KSBzaXplb2YoIHVuc2lnbmVkIGxvbmcgKSAqIDggKTsKKworICAgIHJldHVybiggYnVmICk7Cit9CisKKy8qCisgKiBSZXR1cm4gMCBpZiB0aGUgY2VydGlmaWNhdGUgaXMgc3RpbGwgdmFsaWQsIG9yIEJBRENFUlRfRVhQSVJFRAorICovCitpbnQgeDUwOXBhcnNlX2V4cGlyZWQoIHg1MDlfY2VydCAqY3J0ICkKK3sKKyAgICBzdHJ1Y3QgdG0gKmx0OworICAgIHRpbWVfdCB0dDsKKworICAgIHR0ID0gdGltZSggTlVMTCApOworICAgIGx0ID0gbG9jYWx0aW1lKCAmdHQgKTsKKworICAgIGlmKCBsdC0+dG1feWVhciAgPiBjcnQtPnZhbGlkX3RvLnllYXIgLSAxOTAwICkKKyAgICAgICAgcmV0dXJuKCBCQURDRVJUX0VYUElSRUQgKTsKKworICAgIGlmKCBsdC0+dG1feWVhciA9PSBjcnQtPnZhbGlkX3RvLnllYXIgLSAxOTAwICYmCisgICAgICAgIGx0LT50bV9tb24gICA+IGNydC0+dmFsaWRfdG8ubW9uICAtIDEgKQorICAgICAgICByZXR1cm4oIEJBRENFUlRfRVhQSVJFRCApOworCisgICAgaWYoIGx0LT50bV95ZWFyID09IGNydC0+dmFsaWRfdG8ueWVhciAtIDE5MDAgJiYKKyAgICAgICAgbHQtPnRtX21vbiAgPT0gY3J0LT52YWxpZF90by5tb24gIC0gMSAgICAmJgorICAgICAgICBsdC0+dG1fbWRheSAgPiBjcnQtPnZhbGlkX3RvLmRheSApCisgICAgICAgIHJldHVybiggQkFEQ0VSVF9FWFBJUkVEICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworc3RhdGljIHZvaWQgeDUwOV9oYXNoKCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGxlbiwgaW50IGFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0ICkKK3sKKyAgICBzd2l0Y2goIGFsZyApCisgICAgeworI2lmIGRlZmluZWQoWFlTU0xfTUQyX0MpCisgICAgICAgIGNhc2UgUlNBX01EMiAgOiAgbWQyKCBpbiwgbGVuLCBvdXQgKTsgYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFhZU1NMX01ENF9DKQorICAgICAgICBjYXNlIFJTQV9NRDQgIDogIG1kNCggaW4sIGxlbiwgb3V0ICk7IGJyZWFrOworI2VuZGlmCisgICAgICAgIGNhc2UgUlNBX01ENSAgOiAgbWQ1KCBpbiwgbGVuLCBvdXQgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUlNBX1NIQTEgOiBzaGExKCBpbiwgbGVuLCBvdXQgKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtZW1zZXQoIG91dCwgJ1x4RkYnLCBsZW4gKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoKKyAqIFZlcmlmeSB0aGUgY2VydGlmaWNhdGUgdmFsaWRpdHkKKyAqLworaW50IHg1MDlwYXJzZV92ZXJpZnkoIHg1MDlfY2VydCAqY3J0LAorICAgICAgICAgICAgICAgICAgICAgIHg1MDlfY2VydCAqdHJ1c3RfY2EsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY24sIGludCAqZmxhZ3MgKQoreworICAgIGludCBjbl9sZW47CisgICAgaW50IGhhc2hfaWQ7CisgICAgaW50IHBhdGhsZW47CisgICAgeDUwOV9jZXJ0ICpjdXI7CisgICAgeDUwOV9uYW1lICpuYW1lOworICAgIHVuc2lnbmVkIGNoYXIgaGFzaFsyMF07CisKKyAgICAqZmxhZ3MgPSB4NTA5cGFyc2VfZXhwaXJlZCggY3J0ICk7CisKKyAgICBpZiggY24gIT0gTlVMTCApCisgICAgeworICAgICAgICBuYW1lID0gJmNydC0+c3ViamVjdDsKKyAgICAgICAgY25fbGVuID0gc3RybGVuKCBjbiApOworCisgICAgICAgIHdoaWxlKCBuYW1lICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbWVtY21wKCBuYW1lLT5vaWQucCwgT0lEX0NOLCAgMyApID09IDAgJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAoIG5hbWUtPnZhbC5wLCBjbiwgY25fbGVuICkgPT0gMCAmJgorICAgICAgICAgICAgICAgIG5hbWUtPnZhbC5sZW4gPT0gY25fbGVuICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgbmFtZSA9IG5hbWUtPm5leHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiggbmFtZSA9PSBOVUxMICkKKyAgICAgICAgICAgICpmbGFncyB8PSBCQURDRVJUX0NOX01JU01BVENIOworICAgIH0KKworICAgICpmbGFncyB8PSBCQURDRVJUX05PVF9UUlVTVEVEOworCisgICAgLyoKKyAgICAgKiBJdGVyYXRlIHVwd2FyZHMgaW4gdGhlIGdpdmVuIGNlcnQgY2hhaW4sCisgICAgICogaWdub3JpbmcgYW55IHVwcGVyIGNlcnQgd2l0aCBDQSAhPSBUUlVFLgorICAgICAqLworICAgIGN1ciA9IGNydC0+bmV4dDsKKworICAgIHBhdGhsZW4gPSAxOworCisgICAgd2hpbGUoIGN1ci0+dmVyc2lvbiAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCBjdXItPmNhX2lzdHJ1ZSA9PSAwIHx8CisgICAgICAgICAgICBjcnQtPmlzc3Vlcl9yYXcubGVuICE9IGN1ci0+c3ViamVjdF9yYXcubGVuIHx8CisgICAgICAgICAgICBtZW1jbXAoIGNydC0+aXNzdWVyX3Jhdy5wLCBjdXItPnN1YmplY3RfcmF3LnAsCisgICAgICAgICAgICAgICAgICAgIGNydC0+aXNzdWVyX3Jhdy5sZW4gKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY3VyID0gY3VyLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBoYXNoX2lkID0gY3J0LT5zaWdfb2lkMS5wWzhdOworCisgICAgICAgIHg1MDlfaGFzaCggY3J0LT50YnMucCwgY3J0LT50YnMubGVuLCBoYXNoX2lkLCBoYXNoICk7CisKKyAgICAgICAgaWYoIHJzYV9wa2NzMV92ZXJpZnkoICZjdXItPnJzYSwgUlNBX1BVQkxJQywgaGFzaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGhhc2gsIGNydC0+c2lnLnAgKSAhPSAwICkKKyAgICAgICAgICAgIHJldHVybiggWFlTU0xfRVJSX1g1MDlfQ0VSVF9WRVJJRllfRkFJTEVEICk7CisKKyAgICAgICAgcGF0aGxlbisrOworCisgICAgICAgIGNydCA9IGN1cjsKKyAgICAgICAgY3VyID0gY3J0LT5uZXh0OworICAgIH0KKworICAgIC8qCisgICAgICogQXRlbXB0IHRvIHZhbGlkYXRlIHRvcG1vc3QgY2VydCB3aXRoIG91ciBDQSBjaGFpbi4KKyAgICAgKi8KKyAgICB3aGlsZSggdHJ1c3RfY2EtPnZlcnNpb24gIT0gMCApCisgICAgeworICAgICAgICBpZiggY3J0LT5pc3N1ZXJfcmF3LmxlbiAhPSB0cnVzdF9jYS0+c3ViamVjdF9yYXcubGVuIHx8CisgICAgICAgICAgICBtZW1jbXAoIGNydC0+aXNzdWVyX3Jhdy5wLCB0cnVzdF9jYS0+c3ViamVjdF9yYXcucCwKKyAgICAgICAgICAgICAgICAgICAgY3J0LT5pc3N1ZXJfcmF3LmxlbiApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICB0cnVzdF9jYSA9IHRydXN0X2NhLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiggdHJ1c3RfY2EtPm1heF9wYXRobGVuID4gMCAmJgorICAgICAgICAgICAgdHJ1c3RfY2EtPm1heF9wYXRobGVuIDwgcGF0aGxlbiApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBoYXNoX2lkID0gY3J0LT5zaWdfb2lkMS5wWzhdOworCisgICAgICAgIHg1MDlfaGFzaCggY3J0LT50YnMucCwgY3J0LT50YnMubGVuLCBoYXNoX2lkLCBoYXNoICk7CisKKyAgICAgICAgaWYoIHJzYV9wa2NzMV92ZXJpZnkoICZ0cnVzdF9jYS0+cnNhLCBSU0FfUFVCTElDLCBoYXNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgaGFzaCwgY3J0LT5zaWcucCApID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogY2VydC4gaXMgc2lnbmVkIGJ5IGEgdHJ1c3RlZCBDQQorICAgICAgICAgICAgICovCisgICAgICAgICAgICAqZmxhZ3MgJj0gfkJBRENFUlRfTk9UX1RSVVNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRydXN0X2NhID0gdHJ1c3RfY2EtPm5leHQ7CisgICAgfQorCisgICAgaWYoICpmbGFncyAhPSAwICkKKyAgICAgICAgcmV0dXJuKCBYWVNTTF9FUlJfWDUwOV9DRVJUX1ZFUklGWV9GQUlMRUQgKTsKKworICAgIHJldHVybiggMCApOworfQorCisvKgorICogVW5hbGxvY2F0ZSBhbGwgY2VydGlmaWNhdGUgZGF0YQorICovCit2b2lkIHg1MDlfZnJlZSggeDUwOV9jZXJ0ICpjcnQgKQoreworICAgIHg1MDlfY2VydCAqY2VydF9jdXIgPSBjcnQ7CisgICAgeDUwOV9jZXJ0ICpjZXJ0X3BydjsKKyAgICB4NTA5X25hbWUgKm5hbWVfY3VyOworICAgIHg1MDlfbmFtZSAqbmFtZV9wcnY7CisKKyAgICBpZiggY3J0ID09IE5VTEwgKQorICAgICAgICByZXR1cm47CisKKyAgICBkbworICAgIHsKKyAgICAgICAgcnNhX2ZyZWUoICZjZXJ0X2N1ci0+cnNhICk7CisKKyAgICAgICAgbmFtZV9jdXIgPSBjZXJ0X2N1ci0+aXNzdWVyLm5leHQ7CisgICAgICAgIHdoaWxlKCBuYW1lX2N1ciAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgbmFtZV9wcnYgPSBuYW1lX2N1cjsKKyAgICAgICAgICAgIG5hbWVfY3VyID0gbmFtZV9jdXItPm5leHQ7CisgICAgICAgICAgICBtZW1zZXQoIG5hbWVfcHJ2LCAwLCBzaXplb2YoIHg1MDlfbmFtZSApICk7CisgICAgICAgICAgICBmcmVlKCBuYW1lX3BydiApOworICAgICAgICB9CisKKyAgICAgICAgbmFtZV9jdXIgPSBjZXJ0X2N1ci0+c3ViamVjdC5uZXh0OworICAgICAgICB3aGlsZSggbmFtZV9jdXIgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hbWVfcHJ2ID0gbmFtZV9jdXI7CisgICAgICAgICAgICBuYW1lX2N1ciA9IG5hbWVfY3VyLT5uZXh0OworICAgICAgICAgICAgbWVtc2V0KCBuYW1lX3BydiwgMCwgc2l6ZW9mKCB4NTA5X25hbWUgKSApOworICAgICAgICAgICAgZnJlZSggbmFtZV9wcnYgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBjZXJ0X2N1ci0+cmF3LnAgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldCggY2VydF9jdXItPnJhdy5wLCAwLCBjZXJ0X2N1ci0+cmF3LmxlbiApOworICAgICAgICAgICAgZnJlZSggY2VydF9jdXItPnJhdy5wICk7CisgICAgICAgIH0KKworICAgICAgICBjZXJ0X2N1ciA9IGNlcnRfY3VyLT5uZXh0OworICAgIH0KKyAgICB3aGlsZSggY2VydF9jdXIgIT0gTlVMTCApOworCisgICAgY2VydF9jdXIgPSBjcnQ7CisgICAgZG8KKyAgICB7CisgICAgICAgIGNlcnRfcHJ2ID0gY2VydF9jdXI7CisgICAgICAgIGNlcnRfY3VyID0gY2VydF9jdXItPm5leHQ7CisKKyAgICAgICAgbWVtc2V0KCBjZXJ0X3BydiwgMCwgc2l6ZW9mKCB4NTA5X2NlcnQgKSApOworICAgICAgICBpZiggY2VydF9wcnYgIT0gY3J0ICkKKyAgICAgICAgICAgIGZyZWUoIGNlcnRfcHJ2ICk7CisgICAgfQorICAgIHdoaWxlKCBjZXJ0X2N1ciAhPSBOVUxMICk7Cit9CisKKyNpZiBkZWZpbmVkKFhZU1NMX1NFTEZfVEVTVCkKKworI2luY2x1ZGUgInh5c3NsL2NlcnRzLmgiCisKKy8qCisgKiBDaGVja3VwIHJvdXRpbmUKKyAqLworaW50IHg1MDlfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApCit7CisgICAgaW50IHJldCwgaSwgajsKKyAgICB4NTA5X2NlcnQgY2FjZXJ0OworICAgIHg1MDlfY2VydCBjbGljZXJ0OworICAgIHJzYV9jb250ZXh0IHJzYTsKKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICIgIFguNTA5IGNlcnRpZmljYXRlIGxvYWQ6ICIgKTsKKworICAgIG1lbXNldCggJmNsaWNlcnQsIDAsIHNpemVvZiggeDUwOV9jZXJ0ICkgKTsKKworICAgIHJldCA9IHg1MDlwYXJzZV9jcnQoICZjbGljZXJ0LCAodW5zaWduZWQgY2hhciAqKSB0ZXN0X2NsaV9jcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCB0ZXN0X2NsaV9jcnQgKSApOworICAgIGlmKCByZXQgIT0gMCApCisgICAgeworICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuIiApOworCisgICAgICAgIHJldHVybiggcmV0ICk7CisgICAgfQorCisgICAgbWVtc2V0KCAmY2FjZXJ0LCAwLCBzaXplb2YoIHg1MDlfY2VydCApICk7CisKKyAgICByZXQgPSB4NTA5cGFyc2VfY3J0KCAmY2FjZXJ0LCAodW5zaWduZWQgY2hhciAqKSB0ZXN0X2NhX2NydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oIHRlc3RfY2FfY3J0ICkgKTsKKyAgICBpZiggcmV0ICE9IDAgKQorICAgIHsKKyAgICAgICAgaWYoIHZlcmJvc2UgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICJmYWlsZWRcbiIgKTsKKworICAgICAgICByZXR1cm4oIHJldCApOworICAgIH0KKworICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICBwcmludGYoICJwYXNzZWRcbiAgWC41MDkgcHJpdmF0ZSBrZXkgbG9hZDogIiApOworCisgICAgaSA9IHN0cmxlbiggdGVzdF9jYV9rZXkgKTsKKyAgICBqID0gc3RybGVuKCB0ZXN0X2NhX3B3ZCApOworCisgICAgaWYoICggcmV0ID0geDUwOXBhcnNlX2tleSggJnJzYSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikgdGVzdF9jYV9rZXksIGksCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopIHRlc3RfY2FfcHdkLCBqICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAiZmFpbGVkXG4iICk7CisKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAicGFzc2VkXG4gIFguNTA5IHNpZ25hdHVyZSB2ZXJpZnk6ICIpOworCisgICAgcmV0ID0geDUwOXBhcnNlX3ZlcmlmeSggJmNsaWNlcnQsICZjYWNlcnQsICJKb2UgVXNlciIsICZpICk7CisgICAgaWYoIHJldCAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQorICAgICAgICAgICAgcHJpbnRmKCAiZmFpbGVkXG4iICk7CisKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICB9CisKKyAgICBpZiggdmVyYm9zZSAhPSAwICkKKyAgICAgICAgcHJpbnRmKCAicGFzc2VkXG5cbiIgKTsKKworICAgIHg1MDlfZnJlZSggJmNhY2VydCAgKTsKKyAgICB4NTA5X2ZyZWUoICZjbGljZXJ0ICk7CisgICAgcnNhX2ZyZWUoICZyc2EgKTsKKworICAgIHJldHVybiggMCApOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9NYWtlZmlsZSBiL3Byb2dyYW1zL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzFhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9NYWtlZmlsZQpAQCAtMCwwICsxLDk3IEBACisKKyMgVG8gY29tcGlsZSBvbiBTdW5PUzogYWRkICItbHNvY2tldCAtbG5zbCIgdG8gTERGTEFHUworIyBUbyBjb21waWxlIG9uIE1pbkdXOiBhZGQgIi1sd3MyXzMyIiB0byBMREZMQUdTCisKK0NGTEFHUwk9IC1JLi4vaW5jbHVkZSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0CitPRkxBR1MJPSAtTworTERGTEFHUwk9IC1MLi4vbGlicmFyeSAtbHh5c3NsCisKK0FQUFMgPQlhZXMvYWVzY3J5cHQyCQloYXNoL2hlbGxvCQlcCisJaGFzaC9tZDVzdW0JCWhhc2gvc2hhMXN1bQkJXAorCWhhc2gvc2hhMnN1bQkJcGtleS9kaF9jbGllbnQJCVwKKwlwa2V5L2RoX2dlbnByaW1lCXBrZXkvZGhfc2VydmVyCQlcCisJcGtleS9tcGlfZGVtbwkJcGtleS9yc2FfZ2Vua2V5CQlcCisJcGtleS9yc2Ffc2lnbgkJcGtleS9yc2FfdmVyaWZ5CQlcCisJc3NsL3NzbF9jbGllbnQxCQlzc2wvc3NsX2NsaWVudDIJCVwKKwlzc2wvc3NsX3NlcnZlcgkJdGVzdC9iZW5jaG1hcmsJCVwKKwl0ZXN0L3NlbGZ0ZXN0CQl0ZXN0L3NzbF90ZXN0CisKKy5TSUxFTlQ6CisKK2FsbDogJChBUFBTKQorCithZXMvYWVzY3J5cHQyOiBhZXMvYWVzY3J5cHQyLmMgLi4vbGlicmFyeS9saWJ4eXNzbC5hCisJZWNobyAgICIgIENDICAgIGFlcy9hZXNjcnlwdDIuYyIKKwkkKENDKSAkKENGTEFHUykgJChPRkxBR1MpIGFlcy9hZXNjcnlwdDIuYyAgICAkKExERkxBR1MpIC1vICRACisKK2hhc2gvaGVsbG86IGhhc2gvaGVsbG8uYyAuLi9saWJyYXJ5L2xpYnh5c3NsLmEKKwllY2hvICAgIiAgQ0MgICAgaGFzaC9oZWxsby5jIgorCSQoQ0MpICQoQ0ZMQUdTKSAkKE9GTEFHUykgaGFzaC9oZWxsby5jICAgICAgICQoTERGTEFHUykgLW8gJEAKKworaGFzaC9tZDVzdW06IGhhc2gvbWQ1c3VtLmMgLi4vbGlicmFyeS9saWJ4eXNzbC5hCisJZWNobyAgICIgIENDICAgIGhhc2gvbWQ1c3VtLmMiCisJJChDQykgJChDRkxBR1MpICQoT0ZMQUdTKSBoYXNoL21kNXN1bS5jICAgICAgJChMREZMQUdTKSAtbyAkQAorCitoYXNoL3NoYTFzdW06IGhhc2gvc2hhMXN1bS5jIC4uL2xpYnJhcnkvbGlieHlzc2wuYQorCWVjaG8gICAiICBDQyAgICBoYXNoL3NoYTFzdW0uYyIKKwkkKENDKSAkKENGTEFHUykgJChPRkxBR1MpIGhhc2gvc2hhMXN1bS5jICAgICAkKExERkxBR1MpIC1vICRACisKK2hhc2gvc2hhMnN1bTogaGFzaC9zaGEyc3VtLmMgLi4vbGlicmFyeS9saWJ4eXNzbC5hCisJZWNobyAgICIgIENDICAgIGhhc2gvc2hhMnN1bS5jIgorCSQoQ0MpICQoQ0ZMQUdTKSAkKE9GTEFHUykgaGFzaC9zaGEyc3VtLmMgICAgICQoTERGTEFHUykgLW8gJEAKKworcGtleS9kaF9jbGllbnQ6IHBrZXkvZGhfY2xpZW50LmMgLi4vbGlicmFyeS9saWJ4eXNzbC5hCisJZWNobyAgICIgIENDICAgIHBrZXkvZGhfY2xpZW50LmMiCisJJChDQykgJChDRkxBR1MpICQoT0ZMQUdTKSBwa2V5L2RoX2NsaWVudC5jICAgJChMREZMQUdTKSAtbyAkQAorCitwa2V5L2RoX2dlbnByaW1lOiBwa2V5L2RoX2dlbnByaW1lLmMgLi4vbGlicmFyeS9saWJ4eXNzbC5hCisJZWNobyAgICIgIENDICAgIHBrZXkvZGhfZ2VucHJpbWUuYyIKKwkkKENDKSAkKENGTEFHUykgJChPRkxBR1MpIHBrZXkvZGhfZ2VucHJpbWUuYyAkKExERkxBR1MpIC1vICRACisKK3BrZXkvZGhfc2VydmVyOiBwa2V5L2RoX3NlcnZlci5jIC4uL2xpYnJhcnkvbGlieHlzc2wuYQorCWVjaG8gICAiICBDQyAgICBwa2V5L2RoX3NlcnZlci5jIgorCSQoQ0MpICQoQ0ZMQUdTKSAkKE9GTEFHUykgcGtleS9kaF9zZXJ2ZXIuYyAgICQoTERGTEFHUykgLW8gJEAKKworcGtleS9tcGlfZGVtbzogcGtleS9tcGlfZGVtby5jIC4uL2xpYnJhcnkvbGlieHlzc2wuYQorCWVjaG8gICAiICBDQyAgICBwa2V5L21waV9kZW1vLmMiCisJJChDQykgJChDRkxBR1MpICQoT0ZMQUdTKSBwa2V5L21waV9kZW1vLmMgICAgJChMREZMQUdTKSAtbyAkQAorCitwa2V5L3JzYV9nZW5rZXk6IHBrZXkvcnNhX2dlbmtleS5jIC4uL2xpYnJhcnkvbGlieHlzc2wuYQorCWVjaG8gICAiICBDQyAgICBwa2V5L3JzYV9nZW5rZXkuYyIKKwkkKENDKSAkKENGTEFHUykgJChPRkxBR1MpIHBrZXkvcnNhX2dlbmtleS5jICAkKExERkxBR1MpIC1vICRACisKK3BrZXkvcnNhX3NpZ246IHBrZXkvcnNhX3NpZ24uYyAuLi9saWJyYXJ5L2xpYnh5c3NsLmEKKwllY2hvICAgIiAgQ0MgICAgcGtleS9yc2Ffc2lnbi5jIgorCSQoQ0MpICQoQ0ZMQUdTKSAkKE9GTEFHUykgcGtleS9yc2Ffc2lnbi5jICAgICQoTERGTEFHUykgLW8gJEAKKworcGtleS9yc2FfdmVyaWZ5OiBwa2V5L3JzYV92ZXJpZnkuYyAuLi9saWJyYXJ5L2xpYnh5c3NsLmEKKwllY2hvICAgIiAgQ0MgICAgcGtleS9yc2FfdmVyaWZ5LmMiCisJJChDQykgJChDRkxBR1MpICQoT0ZMQUdTKSBwa2V5L3JzYV92ZXJpZnkuYyAgJChMREZMQUdTKSAtbyAkQAorCitzc2wvc3NsX2NsaWVudDE6IHNzbC9zc2xfY2xpZW50MS5jIC4uL2xpYnJhcnkvbGlieHlzc2wuYQorCWVjaG8gICAiICBDQyAgICBzc2wvc3NsX2NsaWVudDEuYyIKKwkkKENDKSAkKENGTEFHUykgJChPRkxBR1MpIHNzbC9zc2xfY2xpZW50MS5jICAkKExERkxBR1MpIC1vICRACisKK3NzbC9zc2xfY2xpZW50Mjogc3NsL3NzbF9jbGllbnQyLmMgLi4vbGlicmFyeS9saWJ4eXNzbC5hCisJZWNobyAgICIgIENDICAgIHNzbC9zc2xfY2xpZW50Mi5jIgorCSQoQ0MpICQoQ0ZMQUdTKSAkKE9GTEFHUykgc3NsL3NzbF9jbGllbnQyLmMgICQoTERGTEFHUykgLW8gJEAKKworc3NsL3NzbF9zZXJ2ZXI6IHNzbC9zc2xfc2VydmVyLmMgLi4vbGlicmFyeS9saWJ4eXNzbC5hCisJZWNobyAgICIgIENDICAgIHNzbC9zc2xfc2VydmVyLmMiCisJJChDQykgJChDRkxBR1MpICQoT0ZMQUdTKSBzc2wvc3NsX3NlcnZlci5jICAgJChMREZMQUdTKSAtbyAkQAorCit0ZXN0L2JlbmNobWFyazogdGVzdC9iZW5jaG1hcmsuYyAuLi9saWJyYXJ5L2xpYnh5c3NsLmEKKwllY2hvICAgIiAgQ0MgICAgdGVzdC9iZW5jaG1hcmsuYyIKKwkkKENDKSAkKENGTEFHUykgJChPRkxBR1MpIHRlc3QvYmVuY2htYXJrLmMgICAkKExERkxBR1MpIC1vICRACisKK3Rlc3Qvc2VsZnRlc3Q6IHRlc3Qvc2VsZnRlc3QuYyAuLi9saWJyYXJ5L2xpYnh5c3NsLmEKKwllY2hvICAgIiAgQ0MgICAgdGVzdC9zZWxmdGVzdC5jIgorCSQoQ0MpICQoQ0ZMQUdTKSAkKE9GTEFHUykgdGVzdC9zZWxmdGVzdC5jICAgICQoTERGTEFHUykgLW8gJEAKKwordGVzdC9zc2xfdGVzdDogdGVzdC9zc2xfdGVzdC5jIC4uL2xpYnJhcnkvbGlieHlzc2wuYQorCWVjaG8gICAiICBDQyAgICB0ZXN0L3NzbF90ZXN0LmMiCisJJChDQykgJChDRkxBR1MpICQoT0ZMQUdTKSB0ZXN0L3NzbF90ZXN0LmMgICAgJChMREZMQUdTKSAtbyAkQAorCitjbGVhbjoKKwlybSAtZiAkKEFQUFMpCisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Flcy9hZXNjcnlwdDIuYyBiL3Byb2dyYW1zL2Flcy9hZXNjcnlwdDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDljMDZkCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvYWVzL2Flc2NyeXB0Mi5jCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogIEFFUy0yNTYgZmlsZSBlbmNyeXB0aW9uIHByb2dyYW0KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lOMzIpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGlvLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgInh5c3NsL2Flcy5oIgorI2luY2x1ZGUgInh5c3NsL3NoYTIuaCIKKworI2RlZmluZSBNT0RFX0VOQ1JZUFQgICAgMAorI2RlZmluZSBNT0RFX0RFQ1JZUFQgICAgMQorCisjZGVmaW5lIFVTQUdFICAgXAorICAgICJcbiAgYWVzY3J5cHQyIDxtb2RlPiA8aW5wdXQgZmlsZW5hbWU+IDxvdXRwdXQgZmlsZW5hbWU+IDxrZXk+XG4iIFwKKyAgICAiXG4gICA8bW9kZT46IDAgPSBlbmNyeXB0LCAxID0gZGVjcnlwdFxuIiBcCisgICAgIlxuICBleGFtcGxlOiBhZXNjcnlwdDIgMCBmaWxlIGZpbGUuYWVzIGhleDpFNzZCMjQxMzk1OEIwMEUxOTNcbiIgXAorICAgICJcbiIKKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKQoreworICAgIGludCByZXQgPSAxLCBpLCBuOworICAgIGludCBrZXlsZW4sIG1vZGUsIGxhc3RuOworICAgIEZJTEUgKmZrZXksICpmaW4sICpmb3V0OworCisgICAgY2hhciAqcDsKKyAgICB1bnNpZ25lZCBjaGFyIElWWzE2XTsKKyAgICB1bnNpZ25lZCBjaGFyIGtleVs1MTJdOworICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzMyXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxMDI0XTsKKworICAgIGFlc19jb250ZXh0IGFlc19jdHg7CisgICAgc2hhMl9jb250ZXh0IHNoYV9jdHg7CisKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgIExBUkdFX0lOVEVHRVIgbGlfc2l6ZTsKKyAgICBfX2ludDY0IGZpbGVzaXplLCBvZmZzZXQ7CisjZWxzZQorICAgICAgb2ZmX3QgZmlsZXNpemUsIG9mZnNldDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBQYXJzZSB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBpZiggYXJnYyAhPSA1ICkKKyAgICB7CisgICAgICAgIHByaW50ZiggVVNBR0UgKTsKKworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICAgIHByaW50ZiggIlxuICBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICAgICAgZmZsdXNoKCBzdGRvdXQgKTsgZ2V0Y2hhcigpOworI2VuZGlmCisKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIG1vZGUgPSBhdG9pKCBhcmd2WzFdICk7CisKKyAgICBpZiggbW9kZSAhPSBNT0RFX0VOQ1JZUFQgJiYgbW9kZSAhPSBNT0RFX0RFQ1JZUFQgKQorICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiaW52YWxpZGUgb3BlcmF0aW9uIG1vZGVcbiIgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmKCBzdHJjbXAoIGFyZ3ZbMl0sIGFyZ3ZbM10gKSA9PSAwICkKKyAgICB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImlucHV0IGFuZCBvdXRwdXQgZmlsZW5hbWVzIG11c3QgZGlmZmVyXG4iICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiggKCBmaW4gPSBmb3BlbiggYXJndlsyXSwgInJiIiApICkgPT0gTlVMTCApCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJmb3BlbiglcyxyYikgZmFpbGVkXG4iLCBhcmd2WzJdICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiggKCBmb3V0ID0gZm9wZW4oIGFyZ3ZbM10sICJ3YisiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImZvcGVuKCVzLHdiKykgZmFpbGVkXG4iLCBhcmd2WzNdICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlYWQgdGhlIHNlY3JldCBrZXkgYW5kIGNsZWFuIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICovCisgICAgaWYoICggZmtleSA9IGZvcGVuKCBhcmd2WzRdLCAicmIiICkgKSAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIGtleWxlbiA9IGZyZWFkKCBrZXksIDEsIHNpemVvZigga2V5ICksIGZrZXkgKTsKKyAgICAgICAgZmNsb3NlKCBma2V5ICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBtZW1jbXAoIGFyZ3ZbNF0sICJoZXg6IiwgNCApID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBwID0gJmFyZ3ZbNF1bNF07CisgICAgICAgICAgICBrZXlsZW4gPSAwOworCisgICAgICAgICAgICB3aGlsZSggc3NjYW5mKCBwLCAiJTAyWCIsICZuICkgPiAwICYmCisgICAgICAgICAgICAgICAgICAga2V5bGVuIDwgKGludCkgc2l6ZW9mKCBrZXkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2V5W2tleWxlbisrXSA9ICh1bnNpZ25lZCBjaGFyKSBuOworICAgICAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGtleWxlbiA9IHN0cmxlbiggYXJndls0XSApOworCisgICAgICAgICAgICBpZigga2V5bGVuID4gKGludCkgc2l6ZW9mKCBrZXkgKSApCisgICAgICAgICAgICAgICAga2V5bGVuID0gKGludCkgc2l6ZW9mKCBrZXkgKTsKKworICAgICAgICAgICAgbWVtY3B5KCBrZXksIGFyZ3ZbNF0sIGtleWxlbiApOworICAgICAgICB9CisgICAgfQorCisgICAgbWVtc2V0KCBhcmd2WzRdLCAwLCBzdHJsZW4oIGFyZ3ZbNF0gKSApOworCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAvKgorICAgICAqIFN1cHBvcnQgbGFyZ2UgZmlsZXMgKD4gMkdiKSBvbiBXaW4zMgorICAgICAqLworICAgIGxpX3NpemUuUXVhZFBhcnQgPSAwOworICAgIGxpX3NpemUuTG93UGFydCAgPQorICAgICAgICBTZXRGaWxlUG9pbnRlciggKEhBTkRMRSkgX2dldF9vc2ZoYW5kbGUoIF9maWxlbm8oIGZpbiApICksCisgICAgICAgICAgICAgICAgICAgICAgICBsaV9zaXplLkxvd1BhcnQsICZsaV9zaXplLkhpZ2hQYXJ0LCBGSUxFX0VORCApOworCisgICAgaWYoIGxpX3NpemUuTG93UGFydCA9PSAweEZGRkZGRkZGICYmIEdldExhc3RFcnJvcigpICE9IE5PX0VSUk9SICkKKyAgICB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlNldEZpbGVQb2ludGVyKDAsRklMRV9FTkQpIGZhaWxlZFxuIiApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgZmlsZXNpemUgPSBsaV9zaXplLlF1YWRQYXJ0OworI2Vsc2UKKyAgICBpZiggKCBmaWxlc2l6ZSA9IGxzZWVrKCBmaWxlbm8oIGZpbiApLCAwLCBTRUVLX0VORCApICkgPCAwICkKKyAgICB7CisgICAgICAgIHBlcnJvciggImxzZWVrIiApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggZnNlZWsoIGZpbiwgMCwgU0VFS19TRVQgKSA8IDAgKQorICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiZnNlZWsoMCxTRUVLX1NFVCkgZmFpbGVkXG4iICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiggbW9kZSA9PSBNT0RFX0VOQ1JZUFQgKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogR2VuZXJhdGUgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhczoKKyAgICAgICAgICogSVYgPSBTSEEtMjU2KCBmaWxlc2l6ZSB8fCBmaWxlbmFtZSApWzAuLjE1XQorICAgICAgICAgKi8KKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApCisgICAgICAgICAgICBidWZmZXJbaV0gPSAodW5zaWduZWQgY2hhcikoIGZpbGVzaXplID4+ICggaSA8PCAzICkgKTsKKworICAgICAgICBwID0gYXJndlsyXTsKKworICAgICAgICBzaGEyX3N0YXJ0cyggJnNoYV9jdHgsIDAgKTsKKyAgICAgICAgc2hhMl91cGRhdGUoICZzaGFfY3R4LCBidWZmZXIsIDggKTsKKyAgICAgICAgc2hhMl91cGRhdGUoICZzaGFfY3R4LCAodW5zaWduZWQgY2hhciAqKSBwLCBzdHJsZW4oIHAgKSApOworICAgICAgICBzaGEyX2ZpbmlzaCggJnNoYV9jdHgsIGRpZ2VzdCApOworCisgICAgICAgIG1lbWNweSggSVYsIGRpZ2VzdCwgMTYgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgbGFzdCBmb3VyIGJpdHMgaW4gdGhlIElWIGFyZSBhY3R1YWxseSB1c2VkCisgICAgICAgICAqIHRvIHN0b3JlIHRoZSBmaWxlIHNpemUgbW9kdWxvIHRoZSBBRVMgYmxvY2sgc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGxhc3RuID0gKGludCkoIGZpbGVzaXplICYgMHgwRiApOworCisgICAgICAgIElWWzE1XSA9ICh1bnNpZ25lZCBjaGFyKQorICAgICAgICAgICAgKCAoIElWWzE1XSAmIDB4RjAgKSB8IGxhc3RuICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwZW5kIHRoZSBJViBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQuCisgICAgICAgICAqLworICAgICAgICBpZiggZndyaXRlKCBJViwgMSwgMTYsIGZvdXQgKSAhPSAxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImZ3cml0ZSglZCBieXRlcykgZmFpbGVkXG4iLCAxNiApOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFzaCB0aGUgSVYgYW5kIHRoZSBzZWNyZXQga2V5IHRvZ2V0aGVyIDgxOTIgdGltZXMKKyAgICAgICAgICogdXNpbmcgdGhlIHJlc3VsdCB0byBzZXR1cCB0aGUgQUVTIGNvbnRleHQgYW5kIEhNQUMuCisgICAgICAgICAqLworICAgICAgICBtZW1zZXQoIGRpZ2VzdCwgMCwgIDMyICk7CisgICAgICAgIG1lbWNweSggZGlnZXN0LCBJViwgMTYgKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgODE5MjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc2hhMl9zdGFydHMoICZzaGFfY3R4LCAwICk7CisgICAgICAgICAgICBzaGEyX3VwZGF0ZSggJnNoYV9jdHgsIGRpZ2VzdCwgMzIgKTsKKyAgICAgICAgICAgIHNoYTJfdXBkYXRlKCAmc2hhX2N0eCwga2V5LCBrZXlsZW4gKTsKKyAgICAgICAgICAgIHNoYTJfZmluaXNoKCAmc2hhX2N0eCwgZGlnZXN0ICk7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoIGtleSwgMCwgc2l6ZW9mKCBrZXkgKSApOworICAgICAgICAgIGFlc19zZXRrZXlfZW5jKCAmYWVzX2N0eCwgZGlnZXN0LCAyNTYgKTsKKyAgICAgICAgc2hhMl9obWFjX3N0YXJ0cyggJnNoYV9jdHgsIGRpZ2VzdCwgMzIsIDAgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBFbmNyeXB0IGFuZCB3cml0ZSB0aGUgY2lwaGVydGV4dC4KKyAgICAgICAgICovCisgICAgICAgIGZvciggb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZmlsZXNpemU7IG9mZnNldCArPSAxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIG4gPSAoIGZpbGVzaXplIC0gb2Zmc2V0ID4gMTYgKSA/IDE2IDogKGludCkKKyAgICAgICAgICAgICAgICAoIGZpbGVzaXplIC0gb2Zmc2V0ICk7CisKKyAgICAgICAgICAgIGlmKCBmcmVhZCggYnVmZmVyLCAxLCBuLCBmaW4gKSAhPSAoc2l6ZV90KSBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJmcmVhZCglZCBieXRlcykgZmFpbGVkXG4iLCBuICk7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMTY7IGkrKyApCisgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gKHVuc2lnbmVkIGNoYXIpKCBidWZmZXJbaV0gXiBJVltpXSApOworCisgICAgICAgICAgICBhZXNfY3J5cHRfZWNiKCAmYWVzX2N0eCwgQUVTX0VOQ1JZUFQsIGJ1ZmZlciwgYnVmZmVyICk7CisgICAgICAgICAgICBzaGEyX2htYWNfdXBkYXRlKCAmc2hhX2N0eCwgYnVmZmVyLCAxNiApOworCisgICAgICAgICAgICBpZiggZndyaXRlKCBidWZmZXIsIDEsIDE2LCBmb3V0ICkgIT0gMTYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImZ3cml0ZSglZCBieXRlcykgZmFpbGVkXG4iLCAxNiApOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KCBJViwgYnVmZmVyLCAxNiApOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRmluYWxseSB3cml0ZSB0aGUgSE1BQy4KKyAgICAgICAgICovCisgICAgICAgIHNoYTJfaG1hY19maW5pc2goICZzaGFfY3R4LCBkaWdlc3QgKTsKKworICAgICAgICBpZiggZndyaXRlKCBkaWdlc3QsIDEsIDMyLCBmb3V0ICkgIT0gMzIgKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJmd3JpdGUoJWQgYnl0ZXMpIGZhaWxlZFxuIiwgMTYgKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBtb2RlID09IE1PREVfREVDUllQVCApCisgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHRtcFsxNl07CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIFRoZSBlbmNyeXB0ZWQgZmlsZSBtdXN0IGJlIHN0cnVjdHVyZWQgYXMgZm9sbG93czoKKyAgICAgICAgICoKKyAgICAgICAgICogICAgICAgIDAwIC4uIDE1ICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbiBWZWN0b3IKKyAgICAgICAgICogICAgICAgIDE2IC4uIDMxICAgICAgICAgICAgICBBRVMgRW5jcnlwdGVkIEJsb2NrICMxCisgICAgICAgICAqICAgICAgICAgICAuLgorICAgICAgICAgKiAgICAgIE4qMTYgLi4gKE4rMSkqMTYgLSAxICAgIEFFUyBFbmNyeXB0ZWQgQmxvY2sgI04KKyAgICAgICAgICogIChOKzEpKjE2IC4uIChOKzEpKjE2ICsgMzIgICBITUFDLVNIQS0yNTYoY2lwaGVydGV4dCkKKyAgICAgICAgICovCisgICAgICAgIGlmKCBmaWxlc2l6ZSA8IDQ4ICkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRmlsZSB0b28gc2hvcnQgdG8gYmUgZW5jcnlwdGVkLlxuIiApOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgaWYoICggZmlsZXNpemUgJiAweDBGICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkZpbGUgc2l6ZSBub3QgYSBtdWx0aXBsZSBvZiAxNi5cbiIgKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN1YnN0cmFjdCB0aGUgSVYgKyBITUFDIGxlbmd0aC4KKyAgICAgICAgICovCisgICAgICAgIGZpbGVzaXplIC09ICggMTYgKyAzMiApOworCisgICAgICAgIC8qCisgICAgICAgICAqIFJlYWQgdGhlIElWIGFuZCBvcmlnaW5hbCBmaWxlc2l6ZSBtb2R1bG8gMTYuCisgICAgICAgICAqLworICAgICAgICBpZiggZnJlYWQoIGJ1ZmZlciwgMSwgMTYsIGZpbiApICE9IDE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiZnJlYWQoJWQgYnl0ZXMpIGZhaWxlZFxuIiwgMTYgKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSggSVYsIGJ1ZmZlciwgMTYgKTsKKyAgICAgICAgbGFzdG4gPSBJVlsxNV0gJiAweDBGOworCisgICAgICAgIC8qCisgICAgICAgICAqIEhhc2ggdGhlIElWIGFuZCB0aGUgc2VjcmV0IGtleSB0b2dldGhlciA4MTkyIHRpbWVzCisgICAgICAgICAqIHVzaW5nIHRoZSByZXN1bHQgdG8gc2V0dXAgdGhlIEFFUyBjb250ZXh0IGFuZCBITUFDLgorICAgICAgICAgKi8KKyAgICAgICAgbWVtc2V0KCBkaWdlc3QsIDAsICAzMiApOworICAgICAgICBtZW1jcHkoIGRpZ2VzdCwgSVYsIDE2ICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDgxOTI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoYTJfc3RhcnRzKCAmc2hhX2N0eCwgMCApOworICAgICAgICAgICAgc2hhMl91cGRhdGUoICZzaGFfY3R4LCBkaWdlc3QsIDMyICk7CisgICAgICAgICAgICBzaGEyX3VwZGF0ZSggJnNoYV9jdHgsIGtleSwga2V5bGVuICk7CisgICAgICAgICAgICBzaGEyX2ZpbmlzaCggJnNoYV9jdHgsIGRpZ2VzdCApOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCBrZXksIDAsIHNpemVvZigga2V5ICkgKTsKKyAgICAgICAgICBhZXNfc2V0a2V5X2RlYyggJmFlc19jdHgsIGRpZ2VzdCwgMjU2ICk7CisgICAgICAgIHNoYTJfaG1hY19zdGFydHMoICZzaGFfY3R4LCBkaWdlc3QsIDMyLCAwICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGVjcnlwdCBhbmQgd3JpdGUgdGhlIHBsYWludGV4dC4KKyAgICAgICAgICovCisgICAgICAgIGZvciggb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZmlsZXNpemU7IG9mZnNldCArPSAxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBmcmVhZCggYnVmZmVyLCAxLCAxNiwgZmluICkgIT0gMTYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImZyZWFkKCVkIGJ5dGVzKSBmYWlsZWRcbiIsIDE2ICk7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1jcHkoIHRtcCwgYnVmZmVyLCAxNiApOworIAorICAgICAgICAgICAgc2hhMl9obWFjX3VwZGF0ZSggJnNoYV9jdHgsIGJ1ZmZlciwgMTYgKTsKKyAgICAgICAgICAgIGFlc19jcnlwdF9lY2IoICZhZXNfY3R4LCBBRVNfREVDUllQVCwgYnVmZmVyLCBidWZmZXIgKTsKKyAgIAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDE2OyBpKysgKQorICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9ICh1bnNpZ25lZCBjaGFyKSggYnVmZmVyW2ldIF4gSVZbaV0gKTsKKworICAgICAgICAgICAgbWVtY3B5KCBJViwgdG1wLCAxNiApOworCisgICAgICAgICAgICBuID0gKCBsYXN0biA+IDAgJiYgb2Zmc2V0ID09IGZpbGVzaXplIC0gMTYgKQorICAgICAgICAgICAgICAgID8gbGFzdG4gOiAxNjsKKworICAgICAgICAgICAgaWYoIGZ3cml0ZSggYnVmZmVyLCAxLCBuLCBmb3V0ICkgIT0gKHNpemVfdCkgbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiZndyaXRlKCVkIGJ5dGVzKSBmYWlsZWRcbiIsIG4gKTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBWZXJpZnkgdGhlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHNoYTJfaG1hY19maW5pc2goICZzaGFfY3R4LCBkaWdlc3QgKTsKKworICAgICAgICBpZiggZnJlYWQoIGJ1ZmZlciwgMSwgMzIsIGZpbiApICE9IDMyICkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiZnJlYWQoJWQgYnl0ZXMpIGZhaWxlZFxuIiwgMzIgKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBtZW1jbXAoIGRpZ2VzdCwgYnVmZmVyLCAzMiApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJITUFDIGNoZWNrIGZhaWxlZDogd3Jvbmcga2V5LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBmaWxlIGNvcnJ1cHRlZC5cbiIgKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IDA7CisKK2V4aXQ6CisKKyAgICBtZW1zZXQoIGJ1ZmZlciwgMCwgc2l6ZW9mKCBidWZmZXIgKSApOworICAgIG1lbXNldCggZGlnZXN0LCAwLCBzaXplb2YoIGRpZ2VzdCApICk7CisKKyAgICBtZW1zZXQoICZhZXNfY3R4LCAwLCBzaXplb2YoICBhZXNfY29udGV4dCApICk7CisgICAgbWVtc2V0KCAmc2hhX2N0eCwgMCwgc2l6ZW9mKCBzaGEyX2NvbnRleHQgKSApOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2hhc2gvaGVsbG8uYyBiL3Byb2dyYW1zL2hhc2gvaGVsbG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmUwMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvaGFzaC9oZWxsby5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAgQ2xhc3NpYyAiSGVsbG8sIHdvcmxkIiBkZW1vbnN0cmF0aW9uIHByb2dyYW0KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ4eXNzbC9tZDUuaCIKKworaW50IG1haW4oIHZvaWQgKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsKKyAgICBjaGFyIHN0cltdID0gIkhlbGxvLCB3b3JsZCEiOworCisgICAgcHJpbnRmKCAiXG4gIE1ENSgnJXMnKSA9ICIsIHN0ciApOworCisgICAgbWQ1KCAodW5zaWduZWQgY2hhciAqKSBzdHIsIDEzLCBkaWdlc3QgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCAxNjsgaSsrICkKKyAgICAgICAgcHJpbnRmKCAiJTAyeCIsIGRpZ2VzdFtpXSApOworCisgICAgcHJpbnRmKCAiXG5cbiIgKTsKKworI2lmZGVmIFdJTjMyCisgICAgcHJpbnRmKCAiICBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOyBnZXRjaGFyKCk7CisjZW5kaWYKKworICAgIHJldHVybiggMCApOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvaGFzaC9tZDVzdW0uYyBiL3Byb2dyYW1zL2hhc2gvbWQ1c3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlOWE3MQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2hhc2gvbWQ1c3VtLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiAgbWQ1c3VtIGRlbW9uc3RyYXRpb24gcHJvZ3JhbQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInh5c3NsL21kNS5oIgorCitzdGF0aWMgaW50IG1kNV93cmFwcGVyKCBjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgY2hhciAqc3VtICkKK3sKKyAgICBpbnQgcmV0ID0gbWQ1X2ZpbGUoIGZpbGVuYW1lLCBzdW0gKTsKKworICAgIGlmKCByZXQgPT0gMSApCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImZhaWxlZCB0byBvcGVuOiAlc1xuIiwgZmlsZW5hbWUgKTsKKworICAgIGlmKCByZXQgPT0gMiApCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImZhaWxlZCB0byByZWFkOiAlc1xuIiwgZmlsZW5hbWUgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKK3N0YXRpYyBpbnQgbWQ1X3ByaW50KCBjaGFyICpmaWxlbmFtZSApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBzdW1bMTZdOworCisgICAgaWYoIG1kNV93cmFwcGVyKCBmaWxlbmFtZSwgc3VtICkgIT0gMCApCisgICAgICAgIHJldHVybiggMSApOworCisgICAgZm9yKCBpID0gMDsgaSA8IDE2OyBpKysgKQorICAgICAgICBwcmludGYoICIlMDJ4Iiwgc3VtW2ldICk7CisKKyAgICBwcmludGYoICIgICVzXG4iLCBmaWxlbmFtZSApOworICAgIHJldHVybiggMCApOworfQorCitzdGF0aWMgaW50IG1kNV9jaGVjayggY2hhciAqZmlsZW5hbWUgKQoreworICAgIGludCBpOworICAgIHNpemVfdCBuOworICAgIEZJTEUgKmY7CisgICAgaW50IG5iX2VycjEsIG5iX2VycjI7CisgICAgaW50IG5iX3RvdDEsIG5iX3RvdDI7CisgICAgdW5zaWduZWQgY2hhciBzdW1bMTZdOworICAgIGNoYXIgYnVmWzMzXSwgbGluZVsxMDI0XTsKKworICAgIGlmKCAoIGYgPSBmb3BlbiggZmlsZW5hbWUsICJyYiIgKSApID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiZmFpbGVkIHRvIG9wZW46ICVzXG4iLCBmaWxlbmFtZSApOworICAgICAgICByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBuYl9lcnIxID0gbmJfZXJyMiA9IDA7CisgICAgbmJfdG90MSA9IG5iX3RvdDIgPSAwOworCisgICAgbWVtc2V0KCBsaW5lLCAwLCBzaXplb2YoIGxpbmUgKSApOworCisgICAgbiA9IHNpemVvZiggbGluZSApOworCisgICAgd2hpbGUoIGZnZXRzKCBsaW5lLCBuIC0gMSwgZiApICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgbiA9IHN0cmxlbiggbGluZSApOworCisgICAgICAgIGlmKCBuIDwgMzYgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoIGxpbmVbMzJdICE9ICcgJyB8fCBsaW5lWzMzXSAhPSAnICcgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoIGxpbmVbbiAtIDFdID09ICdcbicgKSB7IG4tLTsgbGluZVtuXSA9ICdcMCc7IH0KKyAgICAgICAgaWYoIGxpbmVbbiAtIDFdID09ICdccicgKSB7IG4tLTsgbGluZVtuXSA9ICdcMCc7IH0KKworICAgICAgICBuYl90b3QxKys7CisKKyAgICAgICAgaWYoIG1kNV93cmFwcGVyKCBsaW5lICsgMzQsIHN1bSApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBuYl9lcnIxKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5iX3RvdDIrKzsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMTY7IGkrKyApCisgICAgICAgICAgICBzcHJpbnRmKCBidWYgKyBpICogMiwgIiUwMngiLCBzdW1baV0gKTsKKworICAgICAgICBpZiggbWVtY21wKCBsaW5lLCBidWYsIDMyICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5iX2VycjIrKzsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIndyb25nIGNoZWNrc3VtOiAlc1xuIiwgbGluZSArIDM0ICk7CisgICAgICAgIH0KKworICAgICAgICBuID0gc2l6ZW9mKCBsaW5lICk7CisgICAgfQorCisgICAgaWYoIG5iX2VycjEgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICJXQVJOSU5HOiAlZCAob3V0IG9mICVkKSBpbnB1dCBmaWxlcyBjb3VsZCAiCisgICAgICAgICAgICAgICAgIm5vdCBiZSByZWFkXG4iLCBuYl9lcnIxLCBuYl90b3QxICk7CisgICAgfQorCisgICAgaWYoIG5iX2VycjIgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICJXQVJOSU5HOiAlZCAob3V0IG9mICVkKSBjb21wdXRlZCBjaGVja3N1bXMgZGlkICIKKyAgICAgICAgICAgICAgICAibm90IG1hdGNoXG4iLCBuYl9lcnIyLCBuYl90b3QyICk7CisgICAgfQorCisgICAgcmV0dXJuKCBuYl9lcnIxICE9IDAgfHwgbmJfZXJyMiAhPSAwICk7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKK3sKKyAgICBpbnQgcmV0LCBpOworCisgICAgaWYoIGFyZ2MgPT0gMSApCisgICAgeworICAgICAgICBwcmludGYoICJwcmludCBtb2RlOiAgbWQ1c3VtIDxmaWxlPiA8ZmlsZT4gLi4uXG4iICk7CisgICAgICAgIHByaW50ZiggImNoZWNrIG1vZGU6ICBtZDVzdW0gLWMgPGNoZWNrc3VtIGZpbGU+XG4iICk7CisKKyNpZmRlZiBXSU4zMgorICAgICAgICBwcmludGYoICJcbiAgUHJlc3MgRW50ZXIgdG8gZXhpdCB0aGlzIHByb2dyYW0uXG4iICk7CisgICAgICAgIGZmbHVzaCggc3Rkb3V0ICk7IGdldGNoYXIoKTsKKyNlbmRpZgorCisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGlmKCBhcmdjID09IDMgJiYgc3RyY21wKCAiLWMiLCBhcmd2WzFdICkgPT0gMCApCisgICAgICAgIHJldHVybiggbWQ1X2NoZWNrKCBhcmd2WzJdICkgKTsKKworICAgIHJldCA9IDA7CisgICAgZm9yKCBpID0gMTsgaSA8IGFyZ2M7IGkrKyApCisgICAgICAgIHJldCB8PSBtZDVfcHJpbnQoIGFyZ3ZbaV0gKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9oYXNoL3NoYTFzdW0uYyBiL3Byb2dyYW1zL2hhc2gvc2hhMXN1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYzMxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9oYXNoL3NoYTFzdW0uYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqICBzaGExc3VtIGRlbW9uc3RyYXRpb24gcHJvZ3JhbQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInh5c3NsL3NoYTEuaCIKKworc3RhdGljIGludCBzaGExX3dyYXBwZXIoIGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBjaGFyICpzdW0gKQoreworICAgIGludCByZXQgPSBzaGExX2ZpbGUoIGZpbGVuYW1lLCBzdW0gKTsKKworICAgIGlmKCByZXQgPT0gMSApCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImZhaWxlZCB0byBvcGVuOiAlc1xuIiwgZmlsZW5hbWUgKTsKKworICAgIGlmKCByZXQgPT0gMiApCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImZhaWxlZCB0byByZWFkOiAlc1xuIiwgZmlsZW5hbWUgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9CisKK3N0YXRpYyBpbnQgc2hhMV9wcmludCggY2hhciAqZmlsZW5hbWUgKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgc3VtWzIwXTsKKworICAgIGlmKCBzaGExX3dyYXBwZXIoIGZpbGVuYW1lLCBzdW0gKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCAxICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMjA7IGkrKyApCisgICAgICAgIHByaW50ZiggIiUwMngiLCBzdW1baV0gKTsKKworICAgIHByaW50ZiggIiAgJXNcbiIsIGZpbGVuYW1lICk7CisgICAgcmV0dXJuKCAwICk7Cit9CisKK3N0YXRpYyBpbnQgc2hhMV9jaGVjayggY2hhciAqZmlsZW5hbWUgKQoreworICAgIGludCBpOworICAgIHNpemVfdCBuOworICAgIEZJTEUgKmY7CisgICAgaW50IG5iX2VycjEsIG5iX2VycjI7CisgICAgaW50IG5iX3RvdDEsIG5iX3RvdDI7CisgICAgdW5zaWduZWQgY2hhciBzdW1bMjBdOworICAgIGNoYXIgYnVmWzQxXSwgbGluZVsxMDI0XTsKKworICAgIGlmKCAoIGYgPSBmb3BlbiggZmlsZW5hbWUsICJyYiIgKSApID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiZmFpbGVkIHRvIG9wZW46ICVzXG4iLCBmaWxlbmFtZSApOworICAgICAgICByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBuYl9lcnIxID0gbmJfZXJyMiA9IDA7CisgICAgbmJfdG90MSA9IG5iX3RvdDIgPSAwOworCisgICAgbWVtc2V0KCBsaW5lLCAwLCBzaXplb2YoIGxpbmUgKSApOworCisgICAgbiA9IHNpemVvZiggbGluZSApOworCisgICAgd2hpbGUoIGZnZXRzKCBsaW5lLCBuIC0gMSwgZiApICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgbiA9IHN0cmxlbiggbGluZSApOworCisgICAgICAgIGlmKCBuIDwgNDQgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoIGxpbmVbNDBdICE9ICcgJyB8fCBsaW5lWzQxXSAhPSAnICcgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoIGxpbmVbbiAtIDFdID09ICdcbicgKSB7IG4tLTsgbGluZVtuXSA9ICdcMCc7IH0KKyAgICAgICAgaWYoIGxpbmVbbiAtIDFdID09ICdccicgKSB7IG4tLTsgbGluZVtuXSA9ICdcMCc7IH0KKworICAgICAgICBuYl90b3QxKys7CisKKyAgICAgICAgaWYoIHNoYTFfd3JhcHBlciggbGluZSArIDQyLCBzdW0gKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbmJfZXJyMSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBuYl90b3QyKys7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDIwOyBpKysgKQorICAgICAgICAgICAgc3ByaW50ZiggYnVmICsgaSAqIDIsICIlMDJ4Iiwgc3VtW2ldICk7CisKKyAgICAgICAgaWYoIG1lbWNtcCggbGluZSwgYnVmLCA0MCApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBuYl9lcnIyKys7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJ3cm9uZyBjaGVja3N1bTogJXNcbiIsIGxpbmUgKyA0MiApOworICAgICAgICB9CisKKyAgICAgICAgbiA9IHNpemVvZiggbGluZSApOworICAgIH0KKworICAgIGlmKCBuYl9lcnIxICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiV0FSTklORzogJWQgKG91dCBvZiAlZCkgaW5wdXQgZmlsZXMgY291bGQgIgorICAgICAgICAgICAgICAgICJub3QgYmUgcmVhZFxuIiwgbmJfZXJyMSwgbmJfdG90MSApOworICAgIH0KKworICAgIGlmKCBuYl9lcnIyICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiV0FSTklORzogJWQgKG91dCBvZiAlZCkgY29tcHV0ZWQgY2hlY2tzdW1zIGRpZCAiCisgICAgICAgICAgICAgICAgIm5vdCBtYXRjaFxuIiwgbmJfZXJyMiwgbmJfdG90MiApOworICAgIH0KKworICAgIHJldHVybiggbmJfZXJyMSAhPSAwIHx8IG5iX2VycjIgIT0gMCApOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCit7CisgICAgaW50IHJldCwgaTsKKworICAgIGlmKCBhcmdjID09IDEgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAicHJpbnQgbW9kZTogIHNoYTFzdW0gPGZpbGU+IDxmaWxlPiAuLi5cbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiY2hlY2sgbW9kZTogIHNoYTFzdW0gLWMgPGNoZWNrc3VtIGZpbGU+XG4iICk7CisKKyNpZmRlZiBXSU4zMgorICAgICAgICBwcmludGYoICJcbiAgUHJlc3MgRW50ZXIgdG8gZXhpdCB0aGlzIHByb2dyYW0uXG4iICk7CisgICAgICAgIGZmbHVzaCggc3Rkb3V0ICk7IGdldGNoYXIoKTsKKyNlbmRpZgorCisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIGlmKCBhcmdjID09IDMgJiYgc3RyY21wKCAiLWMiLCBhcmd2WzFdICkgPT0gMCApCisgICAgICAgIHJldHVybiggc2hhMV9jaGVjayggYXJndlsyXSApICk7CisKKyAgICByZXQgPSAwOworICAgIGZvciggaSA9IDE7IGkgPCBhcmdjOyBpKysgKQorICAgICAgICByZXQgfD0gc2hhMV9wcmludCggYXJndltpXSApOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2hhc2gvc2hhMnN1bS5jIGIvcHJvZ3JhbXMvaGFzaC9zaGEyc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNDJhOAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2hhc2gvc2hhMnN1bS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogIHNoYTJzdW0gZGVtb25zdHJhdGlvbiBwcm9ncmFtCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAieHlzc2wvc2hhMi5oIgorCitzdGF0aWMgaW50IHNoYTJfd3JhcHBlciggY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGNoYXIgKnN1bSApCit7CisgICAgaW50IHJldCA9IHNoYTJfZmlsZSggZmlsZW5hbWUsIHN1bSwgMCApOworCisgICAgaWYoIHJldCA9PSAxICkKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW46ICVzXG4iLCBmaWxlbmFtZSApOworCisgICAgaWYoIHJldCA9PSAyICkKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiZmFpbGVkIHRvIHJlYWQ6ICVzXG4iLCBmaWxlbmFtZSApOworCisgICAgcmV0dXJuKCByZXQgKTsKK30KKworc3RhdGljIGludCBzaGEyX3ByaW50KCBjaGFyICpmaWxlbmFtZSApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBzdW1bMzJdOworCisgICAgaWYoIHNoYTJfd3JhcHBlciggZmlsZW5hbWUsIHN1bSApICE9IDAgKQorICAgICAgICByZXR1cm4oIDEgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCAzMjsgaSsrICkKKyAgICAgICAgcHJpbnRmKCAiJTAyeCIsIHN1bVtpXSApOworCisgICAgcHJpbnRmKCAiICAlc1xuIiwgZmlsZW5hbWUgKTsKKyAgICByZXR1cm4oIDAgKTsKK30KKworc3RhdGljIGludCBzaGEyX2NoZWNrKCBjaGFyICpmaWxlbmFtZSApCit7CisgICAgaW50IGk7CisgICAgc2l6ZV90IG47CisgICAgRklMRSAqZjsKKyAgICBpbnQgbmJfZXJyMSwgbmJfZXJyMjsKKyAgICBpbnQgbmJfdG90MSwgbmJfdG90MjsKKyAgICB1bnNpZ25lZCBjaGFyIHN1bVszMl07CisgICAgY2hhciBidWZbNjVdLCBsaW5lWzEwMjRdOworCisgICAgaWYoICggZiA9IGZvcGVuKCBmaWxlbmFtZSwgInJiIiApICkgPT0gTlVMTCApCisgICAgeworICAgICAgICBwcmludGYoICJmYWlsZWQgdG8gb3BlbjogJXNcbiIsIGZpbGVuYW1lICk7CisgICAgICAgIHJldHVybiggMSApOworICAgIH0KKworICAgIG5iX2VycjEgPSBuYl9lcnIyID0gMDsKKyAgICBuYl90b3QxID0gbmJfdG90MiA9IDA7CisKKyAgICBtZW1zZXQoIGxpbmUsIDAsIHNpemVvZiggbGluZSApICk7CisKKyAgICBuID0gc2l6ZW9mKCBsaW5lICk7CisKKyAgICB3aGlsZSggZmdldHMoIGxpbmUsIG4gLSAxLCBmICkgIT0gTlVMTCApCisgICAgeworICAgICAgICBuID0gc3RybGVuKCBsaW5lICk7CisKKyAgICAgICAgaWYoIG4gPCA2OCApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggbGluZVs2NF0gIT0gJyAnIHx8IGxpbmVbNjVdICE9ICcgJyApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggbGluZVtuIC0gMV0gPT0gJ1xuJyApIHsgbi0tOyBsaW5lW25dID0gJ1wwJzsgfQorICAgICAgICBpZiggbGluZVtuIC0gMV0gPT0gJ1xyJyApIHsgbi0tOyBsaW5lW25dID0gJ1wwJzsgfQorCisgICAgICAgIG5iX3RvdDErKzsKKworICAgICAgICBpZiggc2hhMl93cmFwcGVyKCBsaW5lICsgNjYsIHN1bSApICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBuYl9lcnIxKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5iX3RvdDIrKzsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMzI7IGkrKyApCisgICAgICAgICAgICBzcHJpbnRmKCBidWYgKyBpICogMiwgIiUwMngiLCBzdW1baV0gKTsKKworICAgICAgICBpZiggbWVtY21wKCBsaW5lLCBidWYsIDY0ICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5iX2VycjIrKzsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIndyb25nIGNoZWNrc3VtOiAlc1xuIiwgbGluZSArIDY2ICk7CisgICAgICAgIH0KKworICAgICAgICBuID0gc2l6ZW9mKCBsaW5lICk7CisgICAgfQorCisgICAgaWYoIG5iX2VycjEgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICJXQVJOSU5HOiAlZCAob3V0IG9mICVkKSBpbnB1dCBmaWxlcyBjb3VsZCAiCisgICAgICAgICAgICAgICAgIm5vdCBiZSByZWFkXG4iLCBuYl9lcnIxLCBuYl90b3QxICk7CisgICAgfQorCisgICAgaWYoIG5iX2VycjIgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICJXQVJOSU5HOiAlZCAob3V0IG9mICVkKSBjb21wdXRlZCBjaGVja3N1bXMgZGlkICIKKyAgICAgICAgICAgICAgICAibm90IG1hdGNoXG4iLCBuYl9lcnIyLCBuYl90b3QyICk7CisgICAgfQorCisgICAgcmV0dXJuKCBuYl9lcnIxICE9IDAgfHwgbmJfZXJyMiAhPSAwICk7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKK3sKKyAgICBpbnQgcmV0LCBpOworCisgICAgaWYoIGFyZ2MgPT0gMSApCisgICAgeworICAgICAgICBwcmludGYoICJwcmludCBtb2RlOiAgc2hhMnN1bSA8ZmlsZT4gPGZpbGU+IC4uLlxuIiApOworICAgICAgICBwcmludGYoICJjaGVjayBtb2RlOiAgc2hhMnN1bSAtYyA8Y2hlY2tzdW0gZmlsZT5cbiIgKTsKKworI2lmZGVmIFdJTjMyCisgICAgICAgIHByaW50ZiggIlxuICBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICAgICAgZmZsdXNoKCBzdGRvdXQgKTsgZ2V0Y2hhcigpOworI2VuZGlmCisKKyAgICAgICAgcmV0dXJuKCAxICk7CisgICAgfQorCisgICAgaWYoIGFyZ2MgPT0gMyAmJiBzdHJjbXAoICItYyIsIGFyZ3ZbMV0gKSA9PSAwICkKKyAgICAgICAgcmV0dXJuKCBzaGEyX2NoZWNrKCBhcmd2WzJdICkgKTsKKworICAgIHJldCA9IDA7CisgICAgZm9yKCBpID0gMTsgaSA8IGFyZ2M7IGkrKyApCisgICAgICAgIHJldCB8PSBzaGEyX3ByaW50KCBhcmd2W2ldICk7CisKKyAgICByZXR1cm4oIHJldCApOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcGtleS9kaF9jbGllbnQuYyBiL3Byb2dyYW1zL3BrZXkvZGhfY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyMjA3OAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3BrZXkvZGhfY2xpZW50LmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiAgRGlmZmllLUhlbGxtYW4tTWVya2xlIGtleSBleGNoYW5nZSAoY2xpZW50IHNpZGUpCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAieHlzc2wvbmV0LmgiCisjaW5jbHVkZSAieHlzc2wvYWVzLmgiCisjaW5jbHVkZSAieHlzc2wvZGhtLmgiCisjaW5jbHVkZSAieHlzc2wvcnNhLmgiCisjaW5jbHVkZSAieHlzc2wvc2hhMS5oIgorI2luY2x1ZGUgInh5c3NsL2hhdmVnZS5oIgorCisjZGVmaW5lIFNFUlZFUl9OQU1FICJsb2NhbGhvc3QiCisjZGVmaW5lIFNFUlZFUl9QT1JUIDExOTk5CisKK2ludCBtYWluKCB2b2lkICkKK3sKKyAgICBGSUxFICpmOworCisgICAgaW50IHJldCwgbiwgYnVmbGVuOworICAgIGludCBzZXJ2ZXJfZmQgPSAtMTsKKworICAgIHVuc2lnbmVkIGNoYXIgKnAsICplbmQ7CisgICAgdW5zaWduZWQgY2hhciBidWZbMTAyNF07CisgICAgdW5zaWduZWQgY2hhciBoYXNoWzIwXTsKKworICAgIGhhdmVnZV9zdGF0ZSBoczsKKyAgICByc2FfY29udGV4dCByc2E7CisgICAgZGhtX2NvbnRleHQgZGhtOworICAgIGFlc19jb250ZXh0IGFlczsKKworICAgIG1lbXNldCggJnJzYSwgMCwgc2l6ZW9mKCByc2EgKSApOworICAgIG1lbXNldCggJmRobSwgMCwgc2l6ZW9mKCBkaG0gKSApOworCisgICAgLyoKKyAgICAgKiAxLiBTZXR1cCB0aGUgUk5HCisgICAgICovCisgICAgcHJpbnRmKCAiXG4gIC4gU2VlZGluZyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGhhdmVnZV9pbml0KCAmaHMgKTsKKworICAgIC8qCisgICAgICogMi4gUmVhZCB0aGUgc2VydmVyJ3MgcHVibGljIFJTQSBrZXkKKyAgICAgKi8KKyAgICBwcmludGYoICJcbiAgLiBSZWFkaW5nIHB1YmxpYyBrZXkgZnJvbSByc2FfcHViLnR4dCIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgaWYoICggZiA9IGZvcGVuKCAicnNhX3B1Yi50eHQiLCAicmIiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBDb3VsZCBub3Qgb3BlbiByc2FfcHViLnR4dFxuIiBcCisgICAgICAgICAgICAgICAgIiAgISBQbGVhc2UgcnVuIHJzYV9nZW5rZXkgZmlyc3RcblxuIiApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcnNhX2luaXQoICZyc2EsIFJTQV9QS0NTX1YxNSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgaWYoICggcmV0ID0gbXBpX3JlYWRfZmlsZSggJnJzYS5OLCAxNiwgZiApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IG1waV9yZWFkX2ZpbGUoICZyc2EuRSwgMTYsIGYgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIG1waV9yZWFkX2ZpbGUgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICByc2EubGVuID0gKCBtcGlfbXNiKCAmcnNhLk4gKSArIDcgKSA+PiAzOworCisgICAgZmNsb3NlKCBmICk7CisKKyAgICAvKgorICAgICAqIDMuIEluaXRpYXRlIHRoZSBjb25uZWN0aW9uCisgICAgICovCisgICAgcHJpbnRmKCAiXG4gIC4gQ29ubmVjdGluZyB0byB0Y3AvJXMvJWQiLCBTRVJWRVJfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZFUl9QT1JUICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGlmKCAoIHJldCA9IG5ldF9jb25uZWN0KCAmc2VydmVyX2ZkLCBTRVJWRVJfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSVkVSX1BPUlQgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIG5ldF9jb25uZWN0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiA0YS4gRmlyc3QgZ2V0IHRoZSBidWZmZXIgbGVuZ3RoCisgICAgICovCisgICAgcHJpbnRmKCAiXG4gIC4gUmVjZWl2aW5nIHRoZSBzZXJ2ZXIncyBESCBwYXJhbWV0ZXJzIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBtZW1zZXQoIGJ1ZiwgMCwgc2l6ZW9mKCBidWYgKSApOworCisgICAgaWYoICggcmV0ID0gbmV0X3JlY3YoICZzZXJ2ZXJfZmQsIGJ1ZiwgMiApICkgIT0gMiApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgbmV0X3JlY3YgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBuID0gYnVmbGVuID0gKCBidWZbMF0gPDwgOCApIHwgYnVmWzFdOworICAgIGlmKCBidWZsZW4gPCAxIHx8IGJ1ZmxlbiA+IChpbnQpIHNpemVvZiggYnVmICkgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIEdvdCBhbiBpbnZhbGlkIGJ1ZmZlciBsZW5ndGhcblxuIiApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiA0Yi4gR2V0IHRoZSBESE0gcGFyYW1ldGVyczogUCwgRyBhbmQgWXMgPSBHXlhzIG1vZCBQCisgICAgICovCisgICAgbWVtc2V0KCBidWYsIDAsIHNpemVvZiggYnVmICkgKTsKKworICAgIGlmKCAoIHJldCA9IG5ldF9yZWN2KCAmc2VydmVyX2ZkLCBidWYsIG4gKSApICE9IG4gKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIG5ldF9yZWN2IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcCA9IGJ1ZiwgZW5kID0gYnVmICsgYnVmbGVuOworCisgICAgaWYoICggcmV0ID0gZGhtX3JlYWRfcGFyYW1zKCAmZGhtLCAmcCwgZW5kICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBkaG1fcmVhZF9wYXJhbXMgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiggZGhtLmxlbiA8IDY0IHx8IGRobS5sZW4gPiAyNTYgKQorICAgIHsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIEludmFsaWQgREhNIG1vZHVsdXMgc2l6ZVxuXG4iICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIDUuIENoZWNrIHRoYXQgdGhlIHNlcnZlcidzIFJTQSBzaWduYXR1cmUgbWF0Y2hlcworICAgICAqICAgIHRoZSBTSEEtMSBoYXNoIG9mIChQLEcsWXMpCisgICAgICovCisgICAgcHJpbnRmKCAiXG4gIC4gVmVyaWZ5aW5nIHRoZSBzZXJ2ZXIncyBSU0Egc2lnbmF0dXJlIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggKCBuID0gKGludCkoIGVuZCAtIHAgKSApICE9IHJzYS5sZW4gKQorICAgIHsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIEludmFsaWQgUlNBIHNpZ25hdHVyZSBzaXplXG5cbiIgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHNoYTEoIGJ1ZiwgKGludCkoIHAgLSAyIC0gYnVmICksIGhhc2ggKTsKKworICAgIGlmKCAoIHJldCA9IHJzYV9wa2NzMV92ZXJpZnkoICZyc2EsIFJTQV9QVUJMSUMsIFJTQV9TSEExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGhhc2gsIHAgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIHJzYV9wa2NzMV92ZXJpZnkgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIDYuIFNlbmQgb3VyIHB1YmxpYyB2YWx1ZTogWWMgPSBHIF4gWGMgbW9kIFAKKyAgICAgKi8KKyAgICBwcmludGYoICJcbiAgLiBTZW5kaW5nIG93biBwdWJsaWMgdmFsdWUgdG8gc2VydmVyIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBuID0gZGhtLmxlbjsKKyAgICBpZiggKCByZXQgPSBkaG1fbWFrZV9wdWJsaWMoICZkaG0sIDI1NiwgYnVmLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWdlX3JhbmQsICZocyApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgZGhtX21ha2VfcHVibGljIHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgaWYoICggcmV0ID0gbmV0X3NlbmQoICZzZXJ2ZXJfZmQsIGJ1ZiwgbiApICkgIT0gbiApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgbmV0X3NlbmQgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIDcuIERlcml2ZSB0aGUgc2hhcmVkIHNlY3JldDogSyA9IFlzIF4gWGMgbW9kIFAKKyAgICAgKi8KKyAgICBwcmludGYoICJcbiAgLiBTaGFyZWQgc2VjcmV0OiAiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIG4gPSBkaG0ubGVuOworICAgIGlmKCAoIHJldCA9IGRobV9jYWxjX3NlY3JldCggJmRobSwgYnVmLCAmbiApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgZGhtX2NhbGNfc2VjcmV0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgZm9yKCBuID0gMDsgbiA8IDE2OyBuKysgKQorICAgICAgICBwcmludGYoICIlMDJ4IiwgYnVmW25dICk7CisKKyAgICAvKgorICAgICAqIDguIFNldHVwIHRoZSBBRVMtMjU2IGRlY3J5cHRpb24ga2V5CisgICAgICoKKyAgICAgKiBUaGlzIGlzIGFuIG92ZXJseSBzaW1wbGlmaWVkIGV4YW1wbGU7IGJlc3QgcHJhY3RpY2UgaXMKKyAgICAgKiB0byBoYXNoIHRoZSBzaGFyZWQgc2VjcmV0IHdpdGggYSByYW5kb20gdmFsdWUgdG8gZGVyaXZlCisgICAgICogdGhlIGtleWluZyBtYXRlcmlhbCBmb3IgdGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBrZXlzLAorICAgICAqIElWcyBhbmQgTUFDcy4KKyAgICAgKi8KKyAgICBwcmludGYoICIuLi5cbiAgLiBSZWNlaXZpbmcgYW5kIGRlY3J5cHRpbmcgdGhlIGNpcGhlcnRleHQiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGFlc19zZXRrZXlfZGVjKCAmYWVzLCBidWYsIDI1NiApOworCisgICAgbWVtc2V0KCBidWYsIDAsIHNpemVvZiggYnVmICkgKTsKKworICAgIGlmKCAoIHJldCA9IG5ldF9yZWN2KCAmc2VydmVyX2ZkLCBidWYsIDE2ICkgKSAhPSAxNiApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgbmV0X3JlY3YgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBhZXNfY3J5cHRfZWNiKCAmYWVzLCBBRVNfREVDUllQVCwgYnVmLCBidWYgKTsKKyAgICBidWZbMTZdID0gJ1wwJzsKKyAgICBwcmludGYoICJcbiAgLiBQbGFpbnRleHQgaXMgXCIlc1wiXG5cbiIsIChjaGFyICopIGJ1ZiApOworCitleGl0OgorCisgICAgbmV0X2Nsb3NlKCBzZXJ2ZXJfZmQgKTsKKyAgICByc2FfZnJlZSggJnJzYSApOworICAgIGRobV9mcmVlKCAmZGhtICk7CisKKyNpZmRlZiBXSU4zMgorICAgIHByaW50ZiggIiAgKyBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOyBnZXRjaGFyKCk7CisjZW5kaWYKKworICAgIHJldHVybiggcmV0ICk7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wa2V5L2RoX2dlbnByaW1lLmMgYi9wcm9ncmFtcy9wa2V5L2RoX2dlbnByaW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkOWIxZAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3BrZXkvZGhfZ2VucHJpbWUuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqICBEaWZmaWUtSGVsbG1hbi1NZXJrbGUga2V5IGV4Y2hhbmdlIChwcmltZSBnZW5lcmF0aW9uKQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInh5c3NsL2JpZ251bS5oIgorI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorI2luY2x1ZGUgInh5c3NsL2hhdmVnZS5oIgorCisvKgorICogTm90ZTogRyA9IDQgaXMgYWx3YXlzIGEgcXVhZHJhdGljIHJlc2lkdWUgbW9kIFAsCisgKiBzbyBpdCBpcyBhIGdlbmVyYXRvciBvZiBvcmRlciBRICh3aXRoIFAgPSAyKlErMSkuCisgKi8KKyNkZWZpbmUgREhfUF9TSVpFIDEwMjQKKyNkZWZpbmUgR0VORVJBVE9SICI0IgorCitpbnQgbWFpbiggdm9pZCApCit7CisgICAgaW50IHJldCA9IDE7CisKKyNpZiBkZWZpbmVkKFhZU1NMX0dFTlBSSU1FKQorICAgIG1waSBHLCBQLCBROworICAgIGhhdmVnZV9zdGF0ZSBoczsKKyAgICBGSUxFICpmb3V0OworCisgICAgbXBpX2luaXQoICZHLCAmUCwgJlEsIE5VTEwgKTsKKyAgICBtcGlfcmVhZF9zdHJpbmcoICZHLCAxMCwgR0VORVJBVE9SICk7CisKKyAgICBwcmludGYoICJcbiAgLiBTZWVkaW5nIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4uLiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgaGF2ZWdlX2luaXQoICZocyApOworCisgICAgcHJpbnRmKCAiIG9rXG4gIC4gR2VuZXJhdGluZyB0aGUgbW9kdWx1cywgcGxlYXNlIHdhaXQuLi4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIC8qCisgICAgICogVGhpcyBjYW4gdGFrZSBhIGxvbmcgdGltZS4uLgorICAgICAqLworICAgIGlmKCAoIHJldCA9IG1waV9nZW5fcHJpbWUoICZQLCBESF9QX1NJWkUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWdlX3JhbmQsICZocyApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgbXBpX2dlbl9wcmltZSByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHByaW50ZiggIiBva1xuICAuIFZlcmlmeWluZyB0aGF0IFEgPSAoUC0xKS8yIGlzIHByaW1lLi4uIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggKCByZXQgPSBtcGlfc3ViX2ludCggJlEsICZQLCAxICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBtcGlfc3ViX2ludCByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmKCAoIHJldCA9IG1waV9kaXZfaW50KCAmUSwgTlVMTCwgJlEsIDIgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIG1waV9kaXZfaW50IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgaWYoICggcmV0ID0gbXBpX2lzX3ByaW1lKCAmUSwgaGF2ZWdlX3JhbmQsICZocyApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgbXBpX2lzX3ByaW1lIHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiIG9rXG4gIC4gRXhwb3J0aW5nIHRoZSB2YWx1ZSBpbiBkaF9wcmltZS50eHQuLi4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGlmKCAoIGZvdXQgPSBmb3BlbiggImRoX3ByaW1lLnR4dCIsICJ3YisiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBDb3VsZCBub3QgY3JlYXRlIGRoX3ByaW1lLnR4dFxuXG4iICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiggKCByZXQgPSBtcGlfd3JpdGVfZmlsZSggIlAgPSAiLCAmUCwgMTYsIGZvdXQgKSAhPSAwICkgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfd3JpdGVfZmlsZSggIkcgPSAiLCAmRywgMTYsIGZvdXQgKSAhPSAwICkgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIG1waV93cml0ZV9maWxlIHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiIG9rXG5cbiIgKTsKKyAgICBmY2xvc2UoIGZvdXQgKTsKKworZXhpdDoKKworICAgIG1waV9mcmVlKCAmUSwgJlAsICZHLCBOVUxMICk7CisjZWxzZQorICAgIHByaW50ZiggIlxuICAhIFByaW1lLW51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG5cbiIgKTsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyAgICBwcmludGYoICIgIFByZXNzIEVudGVyIHRvIGV4aXQgdGhpcyBwcm9ncmFtLlxuIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7IGdldGNoYXIoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuKCByZXQgKTsKK30KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3BrZXkvZGhfcHJpbWUudHh0IGIvcHJvZ3JhbXMvcGtleS9kaF9wcmltZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyYzI3OQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3BrZXkvZGhfcHJpbWUudHh0CkBAIC0wLDAgKzEsMiBAQAorUCA9IEMzQ0Y4QkNGRDlFODhCMENDMzVFQzUyNkYzRDYzRkEwMDFEQzkzOTJFNkNBODFGM0I0MTQxNzM5NTVDNTgyNzU4QjUyMDM4RkFGQkY0MDJCOEMyOURDMzJGNTIzMUIwRDJFMjVCMjUyODUwQzdEQ0RCRkY0NkQwRTc5ODlFNTFERUEwN0E1M0JDRjc5NDdENEM5NUVCQTI4RjlDQkFGQjAyNjdFQzNCQ0Y1N0IxNUE0OTk2NDIzNkI1Njc3Mzg1MUQ2NjIxRTU0NkY0MTBENTA0RjEzODI3MjE4Q0QxNEExRkRCNjk1MjJEQzcyREQ2N0Q4ODBFNTFCMkUwMDg5NEYNCitHID0gMDQNCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wa2V5L2RoX3NlcnZlci5jIGIvcHJvZ3JhbXMvcGtleS9kaF9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkwZGNmCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvcGtleS9kaF9zZXJ2ZXIuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqICBEaWZmaWUtSGVsbG1hbi1NZXJrbGUga2V5IGV4Y2hhbmdlIChzZXJ2ZXIgc2lkZSkKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ4eXNzbC9uZXQuaCIKKyNpbmNsdWRlICJ4eXNzbC9hZXMuaCIKKyNpbmNsdWRlICJ4eXNzbC9kaG0uaCIKKyNpbmNsdWRlICJ4eXNzbC9yc2EuaCIKKyNpbmNsdWRlICJ4eXNzbC9zaGExLmgiCisjaW5jbHVkZSAieHlzc2wvaGF2ZWdlLmgiCisKKyNkZWZpbmUgU0VSVkVSX1BPUlQgMTE5OTkKKyNkZWZpbmUgUExBSU5URVhUICI9PUhlbGxvIHRoZXJlIT09IgorCitpbnQgbWFpbiggdm9pZCApCit7CisgICAgRklMRSAqZjsKKworICAgIGludCByZXQsIG4sIGJ1ZmxlbjsKKyAgICBpbnQgbGlzdGVuX2ZkID0gLTE7CisgICAgaW50IGNsaWVudF9mZCA9IC0xOworCisgICAgdW5zaWduZWQgY2hhciBidWZbMTAyNF07CisgICAgdW5zaWduZWQgY2hhciBoYXNoWzIwXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZjJbMl07CisKKyAgICBoYXZlZ2Vfc3RhdGUgaHM7CisgICAgcnNhX2NvbnRleHQgcnNhOworICAgIGRobV9jb250ZXh0IGRobTsKKyAgICBhZXNfY29udGV4dCBhZXM7CisKKyAgICBtZW1zZXQoICZyc2EsIDAsIHNpemVvZiggcnNhICkgKTsKKyAgICBtZW1zZXQoICZkaG0sIDAsIHNpemVvZiggZGhtICkgKTsKKworICAgIC8qCisgICAgICogMS4gU2V0dXAgdGhlIFJORworICAgICAqLworICAgIHByaW50ZiggIlxuICAuIFNlZWRpbmcgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBoYXZlZ2VfaW5pdCggJmhzICk7CisKKyAgICAvKgorICAgICAqIDJhLiBSZWFkIHRoZSBzZXJ2ZXIncyBwcml2YXRlIFJTQSBrZXkKKyAgICAgKi8KKyAgICBwcmludGYoICJcbiAgLiBSZWFkaW5nIHByaXZhdGUga2V5IGZyb20gcnNhX3ByaXYudHh0IiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggKCBmID0gZm9wZW4oICJyc2FfcHJpdi50eHQiLCAicmIiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBDb3VsZCBub3Qgb3BlbiByc2FfcHJpdi50eHRcbiIgXAorICAgICAgICAgICAgICAgICIgICEgUGxlYXNlIHJ1biByc2FfZ2Vua2V5IGZpcnN0XG5cbiIgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHJzYV9pbml0KCAmcnNhLCBSU0FfUEtDU19WMTUsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIGlmKCAoIHJldCA9IG1waV9yZWFkX2ZpbGUoICZyc2EuTiAsIDE2LCBmICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gbXBpX3JlYWRfZmlsZSggJnJzYS5FICwgMTYsIGYgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfcmVhZF9maWxlKCAmcnNhLkQgLCAxNiwgZiApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IG1waV9yZWFkX2ZpbGUoICZyc2EuUCAsIDE2LCBmICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gbXBpX3JlYWRfZmlsZSggJnJzYS5RICwgMTYsIGYgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfcmVhZF9maWxlKCAmcnNhLkRQLCAxNiwgZiApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IG1waV9yZWFkX2ZpbGUoICZyc2EuRFEsIDE2LCBmICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gbXBpX3JlYWRfZmlsZSggJnJzYS5RUCwgMTYsIGYgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIG1waV9yZWFkX2ZpbGUgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICByc2EubGVuID0gKCBtcGlfbXNiKCAmcnNhLk4gKSArIDcgKSA+PiAzOworICAgIAorICAgIGZjbG9zZSggZiApOworCisgICAgLyoKKyAgICAgKiAyYi4gR2V0IHRoZSBESE0gbW9kdWx1cyBhbmQgZ2VuZXJhdG9yCisgICAgICovCisgICAgcHJpbnRmKCAiXG4gIC4gUmVhZGluZyBESCBwYXJhbWV0ZXJzIGZyb20gZGhfcHJpbWUudHh0IiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggKCBmID0gZm9wZW4oICJkaF9wcmltZS50eHQiLCAicmIiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBDb3VsZCBub3Qgb3BlbiBkaF9wcmltZS50eHRcbiIgXAorICAgICAgICAgICAgICAgICIgICEgUGxlYXNlIHJ1biBkaF9nZW5wcmltZSBmaXJzdFxuXG4iICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiggbXBpX3JlYWRfZmlsZSggJmRobS5QLCAxNiwgZiApICE9IDAgfHwKKyAgICAgICAgbXBpX3JlYWRfZmlsZSggJmRobS5HLCAxNiwgZiApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIEludmFsaWQgREggcGFyYW1ldGVyIGZpbGVcblxuIiApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgZmNsb3NlKCBmICk7CisKKyAgICAvKgorICAgICAqIDMuIFdhaXQgZm9yIGEgY2xpZW50IHRvIGNvbm5lY3QKKyAgICAgKi8KKyAgICBwcmludGYoICJcbiAgLiBXYWl0aW5nIGZvciBhIHJlbW90ZSBjb25uZWN0aW9uIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggKCByZXQgPSBuZXRfYmluZCggJmxpc3Rlbl9mZCwgTlVMTCwgU0VSVkVSX1BPUlQgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIG5ldF9iaW5kIHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgaWYoICggcmV0ID0gbmV0X2FjY2VwdCggbGlzdGVuX2ZkLCAmY2xpZW50X2ZkLCBOVUxMICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBuZXRfYWNjZXB0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiA0LiBTZXR1cCB0aGUgREggcGFyYW1ldGVycyAoUCxHLFlzKQorICAgICAqLworICAgIHByaW50ZiggIlxuICAuIFNlbmRpbmcgdGhlIHNlcnZlcidzIERIIHBhcmFtZXRlcnMiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIG1lbXNldCggYnVmLCAwLCBzaXplb2YoIGJ1ZiApICk7CisKKyAgICBpZiggKCByZXQgPSBkaG1fbWFrZV9wYXJhbXMoICZkaG0sIDI1NiwgYnVmLCAmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVnZV9yYW5kLCAmaHMgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIGRobV9tYWtlX3BhcmFtcyByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIC8qCisgICAgICogNS4gU2lnbiB0aGUgcGFyYW1ldGVycyBhbmQgc2VuZCB0aGVtCisgICAgICovCisgICAgc2hhMSggYnVmLCBuLCBoYXNoICk7CisKKyAgICBidWZbbiAgICBdID0gKHVuc2lnbmVkIGNoYXIpKCByc2EubGVuID4+IDggKTsKKyAgICBidWZbbiArIDFdID0gKHVuc2lnbmVkIGNoYXIpKCByc2EubGVuICAgICAgKTsKKworICAgIGlmKCAoIHJldCA9IHJzYV9wa2NzMV9zaWduKCAmcnNhLCBSU0FfUFJJVkFURSwgUlNBX1NIQTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGhhc2gsIGJ1ZiArIG4gKyAyICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISByc2FfcGtjczFfc2lnbiByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGJ1ZmxlbiA9IG4gKyAyICsgcnNhLmxlbjsKKyAgICBidWYyWzBdID0gKHVuc2lnbmVkIGNoYXIpKCBidWZsZW4gPj4gOCApOworICAgIGJ1ZjJbMV0gPSAodW5zaWduZWQgY2hhcikoIGJ1ZmxlbiAgICAgICk7CisKKyAgICBpZiggKCByZXQgPSBuZXRfc2VuZCggJmNsaWVudF9mZCwgYnVmMiwgMiApICkgIT0gMiB8fAorICAgICAgICAoIHJldCA9IG5ldF9zZW5kKCAmY2xpZW50X2ZkLCBidWYsIGJ1ZmxlbiApICkgIT0gYnVmbGVuICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBuZXRfc2VuZCByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIC8qCisgICAgICogNi4gR2V0IHRoZSBjbGllbnQncyBwdWJsaWMgdmFsdWU6IFljID0gRyBeIFhjIG1vZCBQCisgICAgICovCisgICAgcHJpbnRmKCAiXG4gIC4gUmVjZWl2aW5nIHRoZSBjbGllbnQncyBwdWJsaWMgdmFsdWUiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIG1lbXNldCggYnVmLCAwLCBzaXplb2YoIGJ1ZiApICk7CisgICAgbiA9IGRobS5sZW47CisKKyAgICBpZiggKCByZXQgPSBuZXRfcmVjdiggJmNsaWVudF9mZCwgYnVmLCBuICkgKSAhPSBuICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBuZXRfcmVjdiByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmKCAoIHJldCA9IGRobV9yZWFkX3B1YmxpYyggJmRobSwgYnVmLCBkaG0ubGVuICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBkaG1fcmVhZF9wdWJsaWMgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIDcuIERlcml2ZSB0aGUgc2hhcmVkIHNlY3JldDogSyA9IFlzIF4gWGMgbW9kIFAKKyAgICAgKi8KKyAgICBwcmludGYoICJcbiAgLiBTaGFyZWQgc2VjcmV0OiAiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGlmKCAoIHJldCA9IGRobV9jYWxjX3NlY3JldCggJmRobSwgYnVmLCAmbiApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgZGhtX2NhbGNfc2VjcmV0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgZm9yKCBuID0gMDsgbiA8IDE2OyBuKysgKQorICAgICAgICBwcmludGYoICIlMDJ4IiwgYnVmW25dICk7CisKKyAgICAvKgorICAgICAqIDguIFNldHVwIHRoZSBBRVMtMjU2IGVuY3J5cHRpb24ga2V5CisgICAgICoKKyAgICAgKiBUaGlzIGlzIGFuIG92ZXJseSBzaW1wbGlmaWVkIGV4YW1wbGU7IGJlc3QgcHJhY3RpY2UgaXMKKyAgICAgKiB0byBoYXNoIHRoZSBzaGFyZWQgc2VjcmV0IHdpdGggYSByYW5kb20gdmFsdWUgdG8gZGVyaXZlCisgICAgICogdGhlIGtleWluZyBtYXRlcmlhbCBmb3IgdGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBrZXlzCisgICAgICogYW5kIE1BQ3MuCisgICAgICovCisgICAgcHJpbnRmKCAiLi4uXG4gIC4gRW5jcnlwdGluZyBhbmQgc2VuZGluZyB0aGUgY2lwaGVydGV4dCIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgYWVzX3NldGtleV9lbmMoICZhZXMsIGJ1ZiwgMjU2ICk7CisgICAgbWVtY3B5KCBidWYsIFBMQUlOVEVYVCwgMTYgKTsKKyAgICBhZXNfY3J5cHRfZWNiKCAmYWVzLCBBRVNfRU5DUllQVCwgYnVmLCBidWYgKTsKKworICAgIGlmKCAoIHJldCA9IG5ldF9zZW5kKCAmY2xpZW50X2ZkLCBidWYsIDE2ICkgKSAhPSAxNiApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgbmV0X3NlbmQgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBwcmludGYoICJcblxuIiApOworCitleGl0OgorCisgICAgbmV0X2Nsb3NlKCBjbGllbnRfZmQgKTsKKyAgICByc2FfZnJlZSggJnJzYSApOworICAgIGRobV9mcmVlKCAmZGhtICk7CisKKyNpZmRlZiBXSU4zMgorICAgIHByaW50ZiggIiAgKyBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOyBnZXRjaGFyKCk7CisjZW5kaWYKKworICAgIHJldHVybiggcmV0ICk7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wa2V5L21waV9kZW1vLmMgYi9wcm9ncmFtcy9wa2V5L21waV9kZW1vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5ZmE1YQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3BrZXkvbXBpX2RlbW8uYwpAQCAtMCwwICsxLDc2IEBACisvKgorICogIFNpbXBsZSBNUEkgZGVtb25zdHJhdGlvbiBwcm9ncmFtCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAieHlzc2wvYmlnbnVtLmgiCisKK2ludCBtYWluKCB2b2lkICkKK3sKKyAgICBtcGkgRSwgUCwgUSwgTiwgSCwgRCwgWCwgWSwgWjsKKworICAgIG1waV9pbml0KCAmRSwgJlAsICZRLCAmTiwgJkgsCisgICAgICAgICAgICAgICZELCAmWCwgJlksICZaLCBOVUxMICk7CisKKyAgICBtcGlfcmVhZF9zdHJpbmcoICZQLCAxMCwgIjI3ODkiICk7CisgICAgbXBpX3JlYWRfc3RyaW5nKCAmUSwgMTAsICIzMjAzIiApOworICAgIG1waV9yZWFkX3N0cmluZyggJkUsIDEwLCAgIjI1NyIgKTsKKyAgICBtcGlfbXVsX21waSggJk4sICZQLCAmUSApOworCisgICAgcHJpbnRmKCAiXG4gIFB1YmxpYyBrZXk6XG5cbiIgKTsKKyAgICBtcGlfd3JpdGVfZmlsZSggIiAgTiA9ICIsICZOLCAxMCwgTlVMTCApOworICAgIG1waV93cml0ZV9maWxlKCAiICBFID0gIiwgJkUsIDEwLCBOVUxMICk7CisKKyAgICBwcmludGYoICJcbiAgUHJpdmF0ZSBrZXk6XG5cbiIgKTsKKyAgICBtcGlfd3JpdGVfZmlsZSggIiAgUCA9ICIsICZQLCAxMCwgTlVMTCApOworICAgIG1waV93cml0ZV9maWxlKCAiICBRID0gIiwgJlEsIDEwLCBOVUxMICk7CisKKyAgICBtcGlfc3ViX2ludCggJlAsICZQLCAxICk7CisgICAgbXBpX3N1Yl9pbnQoICZRLCAmUSwgMSApOworICAgIG1waV9tdWxfbXBpKCAmSCwgJlAsICZRICk7CisgICAgbXBpX2ludl9tb2QoICZELCAmRSwgJkggKTsKKworICAgIG1waV93cml0ZV9maWxlKCAiICBEID0gRV4tMSBtb2QgKFAtMSkqKFEtMSkgPSAiLAorICAgICAgICAgICAgICAgICAgICAmRCwgMTAsIE5VTEwgKTsKKworICAgIG1waV9yZWFkX3N0cmluZyggJlgsIDEwLCAiNTU1NTUiICk7CisgICAgbXBpX2V4cF9tb2QoICZZLCAmWCwgJkUsICZOLCBOVUxMICk7CisgICAgbXBpX2V4cF9tb2QoICZaLCAmWSwgJkQsICZOLCBOVUxMICk7CisKKyAgICBwcmludGYoICJcbiAgUlNBIG9wZXJhdGlvbjpcblxuIiApOworICAgIG1waV93cml0ZV9maWxlKCAiICBYIChwbGFpbnRleHQpICA9ICIsICZYLCAxMCwgTlVMTCApOworICAgIG1waV93cml0ZV9maWxlKCAiICBZIChjaXBoZXJ0ZXh0KSA9IFheRSBtb2QgTiA9ICIsICZZLCAxMCwgTlVMTCApOworICAgIG1waV93cml0ZV9maWxlKCAiICBaIChkZWNyeXB0ZWQpICA9IFleRCBtb2QgTiA9ICIsICZaLCAxMCwgTlVMTCApOworICAgIHByaW50ZiggIlxuIiApOworCisgICAgbXBpX2ZyZWUoICZaLCAmWSwgJlgsICZELCAmSCwKKyAgICAgICAgICAgICAgJk4sICZRLCAmUCwgJkUsIE5VTEwgKTsKKworI2lmZGVmIFdJTjMyCisgICAgcHJpbnRmKCAiICBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOyBnZXRjaGFyKCk7CisjZW5kaWYKKworICAgIHJldHVybiggMCApOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcGtleS9yc2FfZ2Vua2V5LmMgYi9wcm9ncmFtcy9wa2V5L3JzYV9nZW5rZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjE5ZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvcGtleS9yc2FfZ2Vua2V5LmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiAgRXhhbXBsZSBSU0Ega2V5IGdlbmVyYXRpb24gcHJvZ3JhbQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInh5c3NsL2hhdmVnZS5oIgorI2luY2x1ZGUgInh5c3NsL2JpZ251bS5oIgorI2luY2x1ZGUgInh5c3NsL3g1MDkuaCIKKyNpbmNsdWRlICJ4eXNzbC9yc2EuaCIKKworI2RlZmluZSBLRVlfU0laRSAxMDI0CisjZGVmaW5lIEVYUE9ORU5UIDY1NTM3CisKK2ludCBtYWluKCB2b2lkICkKK3sKKyAgICBpbnQgcmV0OworICAgIHJzYV9jb250ZXh0IHJzYTsKKyAgICBoYXZlZ2Vfc3RhdGUgaHM7CisgICAgRklMRSAqZnB1YiAgPSBOVUxMOworICAgIEZJTEUgKmZwcml2ID0gTlVMTDsKKyAgICB4NTA5X3JhdyBjZXJ0OworCisgICAgcHJpbnRmKCAiXG4gIC4gU2VlZGluZyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuLi4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGhhdmVnZV9pbml0KCAmaHMgKTsKKworICAgIHByaW50ZiggIiBva1xuICAuIEdlbmVyYXRpbmcgdGhlIFJTQSBrZXkgWyAlZC1iaXQgXS4uLiIsIEtFWV9TSVpFICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIHJzYV9pbml0KCAmcnNhLCBSU0FfUEtDU19WMTUsIDAsIGhhdmVnZV9yYW5kLCAmaHMgKTsKKyAgICAKKyAgICBpZiggKCByZXQgPSByc2FfZ2VuX2tleSggJnJzYSwgS0VZX1NJWkUsIEVYUE9ORU5UICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISByc2FfZ2VuX2tleSByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHByaW50ZiggIiBva1xuICAuIEV4cG9ydGluZyB0aGUgcHVibGljICBrZXkgaW4gcnNhX3B1Yi50eHQuLi4uIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggKCBmcHViID0gZm9wZW4oICJyc2FfcHViLnR4dCIsICJ3YisiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBjb3VsZCBub3Qgb3BlbiByc2FfcHViLnR4dCBmb3Igd3JpdGluZ1xuXG4iICk7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiggKCByZXQgPSBtcGlfd3JpdGVfZmlsZSggIk4gPSAiLCAmcnNhLk4sIDE2LCBmcHViICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gbXBpX3dyaXRlX2ZpbGUoICJFID0gIiwgJnJzYS5FLCAxNiwgZnB1YiApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgbXBpX3dyaXRlX2ZpbGUgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBwcmludGYoICIgb2tcbiAgLiBFeHBvcnRpbmcgdGhlIHByaXZhdGUga2V5IGluIHJzYV9wcml2LnR4dC4uLiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgaWYoICggZnByaXYgPSBmb3BlbiggInJzYV9wcml2LnR4dCIsICJ3YisiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBjb3VsZCBub3Qgb3BlbiByc2FfcHJpdi50eHQgZm9yIHdyaXRpbmdcbiIgKTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmKCAoIHJldCA9IG1waV93cml0ZV9maWxlKCAiTiA9ICIgLCAmcnNhLk4gLCAxNiwgZnByaXYgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfd3JpdGVfZmlsZSggIkUgPSAiICwgJnJzYS5FICwgMTYsIGZwcml2ICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gbXBpX3dyaXRlX2ZpbGUoICJEID0gIiAsICZyc2EuRCAsIDE2LCBmcHJpdiApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IG1waV93cml0ZV9maWxlKCAiUCA9ICIgLCAmcnNhLlAgLCAxNiwgZnByaXYgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfd3JpdGVfZmlsZSggIlEgPSAiICwgJnJzYS5RICwgMTYsIGZwcml2ICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gbXBpX3dyaXRlX2ZpbGUoICJEUCA9ICIsICZyc2EuRFAsIDE2LCBmcHJpdiApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IG1waV93cml0ZV9maWxlKCAiRFEgPSAiLCAmcnNhLkRRLCAxNiwgZnByaXYgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfd3JpdGVfZmlsZSggIlFQID0gIiwgJnJzYS5RUCwgMTYsIGZwcml2ICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBtcGlfd3JpdGVfZmlsZSByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKy8qCisgICAgcHJpbnRmKCAiIG9rXG4gIC4gR2VuZXJhdGluZyB0aGUgY2VydGlmaWNhdGUuLi4iICk7CisKKyAgICB4NTA5d3JpdGVfaW5pdF9yYXcoICZjZXJ0ICk7CisgICAgeDUwOXdyaXRlX2FkZF9wdWJrZXkoICZjZXJ0LCAmcnNhICk7CisgICAgeDUwOXdyaXRlX2FkZF9zdWJqZWN0KCAmY2VydCwgIkNOPSdsb2NhbGhvc3QnIiApOworICAgIHg1MDl3cml0ZV9hZGRfdmFsaWRpdHkoICZjZXJ0LCAiMjAwNy0wOS0wNiAxNzowMDozMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDEwLTA5LTA2IDE3OjAwOjMyIiApOworICAgIHg1MDl3cml0ZV9jcmVhdGVfc2VsZnNpZ24oICZjZXJ0LCAmcnNhICk7CisgICAgeDUwOXdyaXRlX2NydGZpbGUoICZjZXJ0LCAiY2VydC5kZXIiLCBYNTA5X09VVFBVVF9ERVIgKTsKKyAgICB4NTA5d3JpdGVfY3J0ZmlsZSggJmNlcnQsICJjZXJ0LnBlbSIsIFg1MDlfT1VUUFVUX1BFTSApOworICAgIHg1MDl3cml0ZV9mcmVlX3JhdyggJmNlcnQgKTsKKyovCisgICAgcHJpbnRmKCAiIG9rXG5cbiIgKTsKKworZXhpdDoKKworICAgIGlmKCBmcHViICAhPSBOVUxMICkKKyAgICAgICAgZmNsb3NlKCBmcHViICk7CisKKyAgICBpZiggZnByaXYgIT0gTlVMTCApCisgICAgICAgIGZjbG9zZSggZnByaXYgKTsKKworICAgIHJzYV9mcmVlKCAmcnNhICk7CisKKyNpZmRlZiBXSU4zMgorICAgIHByaW50ZiggIiAgUHJlc3MgRW50ZXIgdG8gZXhpdCB0aGlzIHByb2dyYW0uXG4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsgZ2V0Y2hhcigpOworI2VuZGlmCisKKyAgICByZXR1cm4oIHJldCApOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcGtleS9yc2FfcHJpdi50eHQgYi9wcm9ncmFtcy9wa2V5L3JzYV9wcml2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmIyZTRkCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvcGtleS9yc2FfcHJpdi50eHQKQEAgLTAsMCArMSw4IEBACitOID0gODA3RTM1MjY1NTZGQURGOEQ0Q0E2NDA3NEFEQTM2ODYyNjQ2RDVFQ0IyNEUzNjM4MjEzMDY1ODg3MjJBRjJCNTgwNThDRkI4OEU4QzBCRUE1QzcwODRGMzA1NUQyMzJGMTEwRTU5Qzg4MzdBMEQxMzJBNEI5MDdFOTFEQjRBNDkyNDEzNEE4NUU3NDQ1OTM1RTU1QTc3MkMwQjcyRTEyQzk0NTAxRDlERjY2QjcxQkEwMzBGODQyNTMxNzIxQUVGNDNBRTQ4Rjk1MDVCRjc1MDRDREVFQTNDQUE2Rjk0NTMwODM1NjQ4RDc3MEFFMkU2QzYyOERENDg0RDEwQUE1Nw0KK0UgPSAwMTAwMDENCitEID0gNTZCM0QyQUQ2MTJEMTA5OTNEMENBQzVFNzc1NUIzNDBFNjA3MUE0NkIzMzIyRjQ3QzRBRDYxNzVBNjgzRjA2RTI0ODJDOEY3NjFDODgyMjlDQkUyNjhGMzhCMDUwM0JFQjhBNTk0NTNDNkQzQ0U4QUM2MTk2MzEwRTRERUIxQ0E5MzlERjdGN0VFMjZDNDY5N0VFREQxRTUxMjI3OTVCRkM4Mzg2MURFMkUzRUM5RTNFODRGNDJCM0E5REQyNUVCMDlCMzBGRERGRkFDQ0U1MDkxNDkzQkM1NTc3NTMwQ0U5Q0Q5QzhCQTI0NEVDNUZEM0RGOTFCQ0VDRkQ3Mzk2MQ0KK1AgPSBGOERBRDZBNTY1MUNFRDkwMTFEOTc5QTA3NkQ3MEM0RkJEMDk1QUFFMkU1M0VGNTE0MTU4MzJDNjNBRDYxNjE4RjBCQjM2OUYyOUQxMzYzMzQ1RkU0ODFGRTZDMjhGMDgzMEZFMzNBMUM0MUY4NzQzQTRFMDJERDY4MkEyRTA5OQ0KK1EgPSA4NDJFQUJGMzE3MUY5NzJERTdENkI1NzFCNzBGOTY5RjhGMUMzMDU4NTE3ODVCQjA0MkNEQUUzQjc5NDAxNDY1OUE3NDRFQTdEMTZEODgxQjcxNjg0NjNDRUVBRjUyQkEwRjc4NzU1QkJFODlDRkUxMzYxMDc2Q0UzRTIwODg2Rg0KK0RQID0gQjFDNjk0MDQ3RkUxNTQ4Q0QxNTM4RDIxRTcwM0U1OTVBOTMzREY4NjAzMkU4RjBFN0IyMUU4RDNEODAwNENCNEYwNzRBREE2QjI5NkY0QTM1ODYzMzk1RjIwRDhFODk5MkY3NkM5QTdDQzk1QzE2OUJGODUyRUY5Qzk0NTU2MzENCitEUSA9IDE0M0M1NEU0OUQyODlGRUI0RTJGQzc4RDQ2MUEyM0QzRkY4M0IwM0YwNTExRThFRjdERkFBMEVFQzdFQzMwNzMzMTg3MTZCNzg4NEYzRDYzRkUyMzk5ODUyMDgxNDRBN0U5NTA2NjlGMDlGNzZEMTRBQzQzMkVGQ0Y5RjNERjBGDQorUVAgPSBDMkY5OEY0MTI0NzZCREEyQjE0RjU4ODJEOTI5MDkwQzYyQkIyNEVENzRFOEI3OEEzQkUyODdFQUJEQjNGQURDNDQ1RDA0MUYxREUwNEVCRTJEMzlBODkxM0RBRjAzQzIzRkY2MzJEMUIzRkI2Q0NCREQ2NUIyQTU3NkYxMjdGNQ0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3BrZXkvcnNhX3B1Yi50eHQgYi9wcm9ncmFtcy9wa2V5L3JzYV9wdWIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZGIyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9wa2V5L3JzYV9wdWIudHh0CkBAIC0wLDAgKzEsMiBAQAorTiA9IDgwN0UzNTI2NTU2RkFERjhENENBNjQwNzRBREEzNjg2MjY0NkQ1RUNCMjRFMzYzODIxMzA2NTg4NzIyQUYyQjU4MDU4Q0ZCODhFOEMwQkVBNUM3MDg0RjMwNTVEMjMyRjExMEU1OUM4ODM3QTBEMTMyQTRCOTA3RTkxREI0QTQ5MjQxMzRBODVFNzQ0NTkzNUU1NUE3NzJDMEI3MkUxMkM5NDUwMUQ5REY2NkI3MUJBMDMwRjg0MjUzMTcyMUFFRjQzQUU0OEY5NTA1QkY3NTA0Q0RFRUEzQ0FBNkY5NDUzMDgzNTY0OEQ3NzBBRTJFNkM2MjhERDQ4NEQxMEFBNTcNCitFID0gMDEwMDAxDQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcGtleS9yc2Ffc2lnbi5jIGIvcHJvZ3JhbXMvcGtleS9yc2Ffc2lnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzA3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9wa2V5L3JzYV9zaWduLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiAgUlNBL1NIQS0xIHNpZ25hdHVyZSBjcmVhdGlvbiBwcm9ncmFtCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAieHlzc2wvcnNhLmgiCisjaW5jbHVkZSAieHlzc2wvc2hhMS5oIgorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCit7CisgICAgRklMRSAqZjsKKyAgICBpbnQgcmV0LCBpOworICAgIHJzYV9jb250ZXh0IHJzYTsKKyAgICB1bnNpZ25lZCBjaGFyIGhhc2hbMjBdOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzUxMl07CisKKyAgICByZXQgPSAxOworCisgICAgaWYoIGFyZ2MgIT0gMiApCisgICAgeworICAgICAgICBwcmludGYoICJ1c2FnZTogcnNhX3NpZ24gPGZpbGVuYW1lPlxuIiApOworCisjaWZkZWYgV0lOMzIKKyAgICAgICAgcHJpbnRmKCAiXG4iICk7CisjZW5kaWYKKworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiXG4gIC4gUmVhZGluZyBwcml2YXRlIGtleSBmcm9tIHJzYV9wcml2LnR4dCIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgaWYoICggZiA9IGZvcGVuKCAicnNhX3ByaXYudHh0IiwgInJiIiApICkgPT0gTlVMTCApCisgICAgeworICAgICAgICByZXQgPSAxOworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgQ291bGQgbm90IG9wZW4gcnNhX3ByaXYudHh0XG4iIFwKKyAgICAgICAgICAgICAgICAiICAhIFBsZWFzZSBydW4gcnNhX2dlbmtleSBmaXJzdFxuXG4iICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICByc2FfaW5pdCggJnJzYSwgUlNBX1BLQ1NfVjE1LCAwLCBOVUxMLCBOVUxMICk7CisgICAgCisgICAgaWYoICggcmV0ID0gbXBpX3JlYWRfZmlsZSggJnJzYS5OICwgMTYsIGYgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfcmVhZF9maWxlKCAmcnNhLkUgLCAxNiwgZiApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IG1waV9yZWFkX2ZpbGUoICZyc2EuRCAsIDE2LCBmICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gbXBpX3JlYWRfZmlsZSggJnJzYS5QICwgMTYsIGYgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfcmVhZF9maWxlKCAmcnNhLlEgLCAxNiwgZiApICkgIT0gMCB8fAorICAgICAgICAoIHJldCA9IG1waV9yZWFkX2ZpbGUoICZyc2EuRFAsIDE2LCBmICkgKSAhPSAwIHx8CisgICAgICAgICggcmV0ID0gbXBpX3JlYWRfZmlsZSggJnJzYS5EUSwgMTYsIGYgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfcmVhZF9maWxlKCAmcnNhLlFQLCAxNiwgZiApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgbXBpX3JlYWRfZmlsZSByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHJzYS5sZW4gPSAoIG1waV9tc2IoICZyc2EuTiApICsgNyApID4+IDM7CisKKyAgICBmY2xvc2UoIGYgKTsKKworICAgIC8qCisgICAgICogQ29tcHV0ZSB0aGUgU0hBLTEgaGFzaCBvZiB0aGUgaW5wdXQgZmlsZSwKKyAgICAgKiB0aGVuIGNhbGN1bGF0ZSB0aGUgUlNBIHNpZ25hdHVyZSBvZiB0aGUgaGFzaC4KKyAgICAgKi8KKyAgICBwcmludGYoICJcbiAgLiBHZW5lcmF0aW5nIHRoZSBSU0EvU0hBLTEgc2lnbmF0dXJlIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggKCByZXQgPSBzaGExX2ZpbGUoIGFyZ3ZbMV0sIGhhc2ggKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIENvdWxkIG5vdCBvcGVuIG9yIHJlYWQgJXNcblxuIiwgYXJndlsxXSApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgaWYoICggcmV0ID0gcnNhX3BrY3MxX3NpZ24oICZyc2EsIFJTQV9QUklWQVRFLCBSU0FfU0hBMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGhhc2gsIGJ1ZiApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgcnNhX3BrY3MxX3NpZ24gcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdyaXRlIHRoZSBzaWduYXR1cmUgaW50byA8ZmlsZW5hbWU+LXNpZy50eHQKKyAgICAgKi8KKyAgICBtZW1jcHkoIGFyZ3ZbMV0gKyBzdHJsZW4oIGFyZ3ZbMV0gKSwgIi5zaWciLCA1ICk7CisKKyAgICBpZiggKCBmID0gZm9wZW4oIGFyZ3ZbMV0sICJ3YisiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBDb3VsZCBub3QgY3JlYXRlICVzXG5cbiIsIGFyZ3ZbMV0gKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCByc2EubGVuOyBpKysgKQorICAgICAgICBmcHJpbnRmKCBmLCAiJTAyWCVzIiwgYnVmW2ldLAorICAgICAgICAgICAgICAgICAoIGkgKyAxICkgJSAxNiA9PSAwID8gIlxyXG4iIDogIiAiICk7CisKKyAgICBmY2xvc2UoIGYgKTsKKworICAgIHByaW50ZiggIlxuICAuIERvbmUgKGNyZWF0ZWQgXCIlc1wiKVxuXG4iLCBhcmd2WzFdICk7CisKK2V4aXQ6CisKKyNpZmRlZiBXSU4zMgorICAgIHByaW50ZiggIiAgKyBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOyBnZXRjaGFyKCk7CisjZW5kaWYKKworICAgIHJldHVybiggcmV0ICk7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wa2V5L3JzYV92ZXJpZnkuYyBiL3Byb2dyYW1zL3BrZXkvcnNhX3ZlcmlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhY2M2NjQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9wa2V5L3JzYV92ZXJpZnkuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqICBSU0EvU0hBLTEgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBwcm9ncmFtCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAieHlzc2wvcnNhLmgiCisjaW5jbHVkZSAieHlzc2wvc2hhMS5oIgorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCit7CisgICAgRklMRSAqZjsKKyAgICBpbnQgcmV0LCBpLCBjOworICAgIHJzYV9jb250ZXh0IHJzYTsKKyAgICB1bnNpZ25lZCBjaGFyIGhhc2hbMjBdOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzUxMl07CisKKyAgICByZXQgPSAxOworICAgIGlmKCBhcmdjICE9IDIgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAidXNhZ2U6IHJzYV92ZXJpZnkgPGZpbGVuYW1lPlxuIiApOworCisjaWZkZWYgV0lOMzIKKyAgICAgICAgcHJpbnRmKCAiXG4iICk7CisjZW5kaWYKKworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiXG4gIC4gUmVhZGluZyBwdWJsaWMga2V5IGZyb20gcnNhX3B1Yi50eHQiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGlmKCAoIGYgPSBmb3BlbiggInJzYV9wdWIudHh0IiwgInJiIiApICkgPT0gTlVMTCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgQ291bGQgbm90IG9wZW4gcnNhX3B1Yi50eHRcbiIgXAorICAgICAgICAgICAgICAgICIgICEgUGxlYXNlIHJ1biByc2FfZ2Vua2V5IGZpcnN0XG5cbiIgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHJzYV9pbml0KCAmcnNhLCBSU0FfUEtDU19WMTUsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgIGlmKCAoIHJldCA9IG1waV9yZWFkX2ZpbGUoICZyc2EuTiwgMTYsIGYgKSApICE9IDAgfHwKKyAgICAgICAgKCByZXQgPSBtcGlfcmVhZF9maWxlKCAmcnNhLkUsIDE2LCBmICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBtcGlfcmVhZF9maWxlIHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcnNhLmxlbiA9ICggbXBpX21zYiggJnJzYS5OICkgKyA3ICkgPj4gMzsKKworICAgIGZjbG9zZSggZiApOworCisgICAgLyoKKyAgICAgKiBFeHRyYWN0IHRoZSBSU0Egc2lnbmF0dXJlIGZyb20gdGhlIHRleHQgZmlsZQorICAgICAqLworICAgIHJldCA9IDE7CisgICAgaSA9IHN0cmxlbiggYXJndlsxXSApOworICAgIG1lbWNweSggYXJndlsxXSArIGksICIuc2lnIiwgNSApOworCisgICAgaWYoICggZiA9IGZvcGVuKCBhcmd2WzFdLCAicmIiICkgKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIlxuICAhIENvdWxkIG5vdCBvcGVuICVzXG5cbiIsIGFyZ3ZbMV0gKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGFyZ3ZbMV1baV0gPSAnXDAnLCBpID0gMDsKKworICAgIHdoaWxlKCBmc2NhbmYoIGYsICIlMDJYIiwgJmMgKSA+IDAgJiYKKyAgICAgICAgICAgaSA8IChpbnQpIHNpemVvZiggYnVmICkgKQorICAgICAgICBidWZbaSsrXSA9ICh1bnNpZ25lZCBjaGFyKSBjOworCisgICAgZmNsb3NlKCBmICk7CisKKyAgICBpZiggaSAhPSByc2EubGVuICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIlxuICAhIEludmFsaWQgUlNBIHNpZ25hdHVyZSBmb3JtYXRcblxuIiApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDb21wdXRlIHRoZSBTSEEtMSBoYXNoIG9mIHRoZSBpbnB1dCBmaWxlIGFuZCBjb21wYXJlCisgICAgICogaXQgd2l0aCB0aGUgaGFzaCBkZWNyeXB0ZWQgZnJvbSB0aGUgUlNBIHNpZ25hdHVyZS4KKyAgICAgKi8KKyAgICBwcmludGYoICJcbiAgLiBWZXJpZnlpbmcgdGhlIFJTQS9TSEEtMSBzaWduYXR1cmUiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGlmKCAoIHJldCA9IHNoYTFfZmlsZSggYXJndlsxXSwgaGFzaCApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgQ291bGQgbm90IG9wZW4gb3IgcmVhZCAlc1xuXG4iLCBhcmd2WzFdICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiggKCByZXQgPSByc2FfcGtjczFfdmVyaWZ5KCAmcnNhLCBSU0FfUFVCTElDLCBSU0FfU0hBMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCwgaGFzaCwgYnVmICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISByc2FfcGtjczFfdmVyaWZ5IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiXG4gIC4gT0sgKHRoZSBkZWNyeXB0ZWQgU0hBLTEgaGFzaCBtYXRjaGVzKVxuXG4iICk7CisKKyAgICByZXQgPSAwOworCitleGl0OgorCisjaWZkZWYgV0lOMzIKKyAgICBwcmludGYoICIgICsgUHJlc3MgRW50ZXIgdG8gZXhpdCB0aGlzIHByb2dyYW0uXG4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsgZ2V0Y2hhcigpOworI2VuZGlmCisKKyAgICByZXR1cm4oIHJldCApOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL0NBLUhPV1RPLnR4dCBiL3Byb2dyYW1zL3NzbC9DQS1IT1dUTy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwNTIxMQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3NzbC9DQS1IT1dUTy50eHQKQEAgLTAsMCArMSwxNDQgQEAKKw0KKw0KKw0KKyAgICAgICAgICAgICAgICBIb3cgdG8gc2V0dXAgeW91ciBvd24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5DQorICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisNCitOb3RlOiB0aGlzIGhvd3RvIHJlcXVpcmVzIHRoZSBvcGVuc3NsIGJpbmFyeSwgYXMgd2VsbCBhcyBjbGFzc2ljDQorVU5JWCB0b29scyAoY2F0LCB0b3VjaCwgZWNobykuIElmIHlvdSB1c2UgV2luZG93cywgcGxlYXNlIGNvbnNpZGVyDQoraW5zdGFsbGluZyBDeWd3aW4gLS0gc2VlIGh0dHA6Ly9jeWd3aW4uY29tLw0KKw0KKw0KKyAgICAxLiBDb25maWd1cmUgT3BlblNTTA0KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0ZpcnN0IG9mIGFsbCwgY3JlYXRlIHNzbGNvbmYudHh0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQ0KKyhhIGJhc2ljIGV4YW1wbGUgaXMgcHJvdmlkZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUpLg0KKw0KK2NhdCA+IHNzbGNvbmYudHh0IDw8IkVPRiINCitbcGFzdGUgY29udGVudHMgaGVyZV0NCitFT0YNCisNCitUaGVuIHlvdSBuZWVkIHRvIGNyZWF0ZSB0aGUgZGF0YWJhc2UgYW5kIGEgc3RhcnRpbmcgc2VyaWFsIG51bWJlcjoNCisNCit0b3VjaCBpbmRleA0KK2VjaG8gIjAxIiA+IHNlcmlhbA0KK21rZGlyIG5ld2NlcnRzDQorDQorDQorICAgIDIuIEdlbmVyYXRlIHRoZSBDQSBjZXJ0aWZpY2F0ZQ0KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitvcGVuc3NsIHJlcSAtY29uZmlnIHNzbGNvbmYudHh0IC1kYXlzIDM2NTMgLXg1MDkgLW5ld2tleSByc2E6MjA0OCBcDQorICAgICAgICAgICAgLXNldF9zZXJpYWwgMCAtdGV4dCAta2V5b3V0IHRlc3QtY2Eua2V5IC1vdXQgdGVzdC1jYS5jcnQNCisNCisNCisgICAgMy4gR2VuZXJhdGUgdGhlIHByaXZhdGUga2V5cyBhbmQgY2VydGlmaWNhdGUgcmVxdWVzdHMNCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitvcGVuc3NsIGdlbnJzYSAtb3V0IHNlcnZlcjEua2V5IDIwNDgNCitvcGVuc3NsIGdlbnJzYSAtb3V0IHNlcnZlcjIua2V5IDIwNDgNCitvcGVuc3NsIGdlbnJzYSAtb3V0IGNsaWVudDEua2V5IDIwNDgNCitvcGVuc3NsIGdlbnJzYSAtb3V0IGNsaWVudDIua2V5IDIwNDgNCisNCitvcGVuc3NsIHJlcSAtY29uZmlnIHNzbGNvbmYudHh0IC1uZXcgLWtleSBzZXJ2ZXIxLmtleSAtb3V0IHNlcnZlcjEucmVxDQorb3BlbnNzbCByZXEgLWNvbmZpZyBzc2xjb25mLnR4dCAtbmV3IC1rZXkgc2VydmVyMi5rZXkgLW91dCBzZXJ2ZXIyLnJlcQ0KK29wZW5zc2wgcmVxIC1jb25maWcgc3NsY29uZi50eHQgLW5ldyAta2V5IGNsaWVudDEua2V5IC1vdXQgY2xpZW50MS5yZXENCitvcGVuc3NsIHJlcSAtY29uZmlnIHNzbGNvbmYudHh0IC1uZXcgLWtleSBjbGllbnQyLmtleSAtb3V0IGNsaWVudDIucmVxDQorDQorDQorICAgIDQuIElzc3VlIGFuZCBzaWduIHRoZSBjZXJ0aWZpY2F0ZXMNCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK29wZW5zc2wgY2EgLWNvbmZpZyBzc2xjb25mLnR4dCAtaW4gc2VydmVyMS5yZXEgLW91dCBzZXJ2ZXIxLmNydA0KK29wZW5zc2wgY2EgLWNvbmZpZyBzc2xjb25mLnR4dCAtaW4gc2VydmVyMi5yZXEgLW91dCBzZXJ2ZXIyLmNydA0KK29wZW5zc2wgY2EgLWNvbmZpZyBzc2xjb25mLnR4dCAtaW4gY2xpZW50MS5yZXEgLW91dCBjbGllbnQxLmNydA0KK29wZW5zc2wgY2EgLWNvbmZpZyBzc2xjb25mLnR4dCAtaW4gY2xpZW50Mi5yZXEgLW91dCBjbGllbnQyLmNydA0KKw0KKw0KKyAgICA1LiBUbyByZXZva2UgYSBjZXJ0aWZpY2F0ZSBhbmQgdXBkYXRlIHRoZSBDUkwNCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorb3BlbnNzbCBjYSAtY29uZmlnIHNzbGNvbmYudHh0IC1yZXZva2Ugc2VydmVyMS5jcnQNCitvcGVuc3NsIGNhIC1jb25maWcgc3NsY29uZi50eHQgLXJldm9rZSBjbGllbnQxLmNydA0KK29wZW5zc2wgY2EgLWNvbmZpZyBzc2xjb25mLnR4dCAtZ2VuY3JsIC1vdXQgY3JsLnBlbQ0KKw0KKw0KKyAgICA2LiBUbyBkaXNwbGF5IGEgY2VydGlmaWNhdGUgYW5kIHZlcmlmeSBpdHMgdmFsaWRpdHkNCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorb3BlbnNzbCB4NTA5IC1pbiBzZXJ2ZXIyLmNydCAtdGV4dCAtbm9vdXQNCitjYXQgdGVzdC1jYS5jcnQgY3JsLnBlbSA+IGNhX2NybC5wZW0NCitvcGVuc3NsIHZlcmlmeSAtQ0FmaWxlIGNhX2NybC5wZW0gLWNybF9jaGVjayBzZXJ2ZXIyLmNydA0KK3JtIGNhX2NybC5wZW0NCisNCisNCisgICAgNy4gVG8gZXhwb3J0IGEgY2VydGlmaWNhdGUgaW50byBhIC5wZnggZmlsZQ0KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorb3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAtaW4gY2xpZW50Mi5jcnQgLWlua2V5IGNsaWVudDIua2V5IFwNCisgICAgICAgICAgICAgICAgICAgICAgLW91dCBjbGllbnQyLnBmeA0KKw0KKw0KKyMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMjPT09PT09PT09PT09PT0gRXhhbXBsZSBPcGVuU1NMIGNvbmZpZ3VyYXRpb24gZmlsZSA9PT09PT09PT09PT09PQ0KKyMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyMgIFJlZmVyZW5jZXM6DQorIw0KKyMgIC9ldGMvc3NsL29wZW5zc2wuY29uZg0KKyMgIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9hcHBzL2NvbmZpZy5odG1sDQorIyAgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL2FwcHMveDUwOXYzX2NvbmZpZy5odG1sDQorDQorWyBjYSBdDQorZGVmYXVsdF9jYSAgICAgICAgICAgICAgPSBteV9jYQ0KKw0KK1sgbXlfY2EgXQ0KK2NlcnRpZmljYXRlICAgICAgICAgICAgID0gdGVzdC1jYS5jcnQNCitwcml2YXRlX2tleSAgICAgICAgICAgICA9IHRlc3QtY2Eua2V5DQorZGF0YWJhc2UgICAgICAgICAgICAgICAgPSBpbmRleA0KK3NlcmlhbCAgICAgICAgICAgICAgICAgID0gc2VyaWFsDQorDQorbmV3X2NlcnRzX2RpciAgICAgICAgICAgPSBuZXdjZXJ0cw0KK2RlZmF1bHRfY3JsX2RheXMgICAgICAgID0gNjANCitkZWZhdWx0X2RheXMgICAgICAgICAgICA9IDczMA0KK2RlZmF1bHRfbWQgICAgICAgICAgICAgID0gc2hhMQ0KK3BvbGljeSAgICAgICAgICAgICAgICAgID0gbXlfcG9saWN5DQoreDUwOV9leHRlbnNpb25zICAgICAgICAgPSB2M191c3INCisNCitbIG15X3BvbGljeSBdDQorY291bnRyeU5hbWUgICAgICAgICAgICAgPSBvcHRpb25hbA0KK3N0YXRlT3JQcm92aW5jZU5hbWUgICAgID0gb3B0aW9uYWwNCitvcmdhbml6YXRpb25OYW1lICAgICAgICA9IG1hdGNoDQorb3JnYW5pemF0aW9uYWxVbml0TmFtZSAgPSBvcHRpb25hbA0KK2NvbW1vbk5hbWUgICAgICAgICAgICAgID0gc3VwcGxpZWQNCitlbWFpbEFkZHJlc3MgICAgICAgICAgICA9IG9wdGlvbmFsDQorDQorWyByZXEgXQ0KK2Rpc3Rpbmd1aXNoZWRfbmFtZSAgICAgID0gbXlfcmVxX2RuDQoreDUwOV9leHRlbnNpb25zICAgICAgICAgPSB2M19jYQ0KKw0KK1sgbXlfcmVxX2RuIF0NCitjb3VudHJ5TmFtZSAgICAgICAgICAgICA9IENvdW50cnkgTmFtZS4uLi4uLi4uLi4uLi4uDQorY291bnRyeU5hbWVfbWluICAgICAgICAgPSAyDQorY291bnRyeU5hbWVfbWF4ICAgICAgICAgPSAyDQorc3RhdGVPclByb3ZpbmNlTmFtZSAgICAgPSBTdGF0ZSBvciBQcm92aW5jZSBOYW1lLi4uLg0KK2xvY2FsaXR5TmFtZSAgICAgICAgICAgID0gTG9jYWxpdHkgTmFtZS4uLi4uLi4uLi4uLi4NCiswLm9yZ2FuaXphdGlvbk5hbWUgICAgICA9IE9yZ2FuaXphdGlvbiBOYW1lLi4uLi4uLi4uDQorb3JnYW5pemF0aW9uYWxVbml0TmFtZSAgPSBPcmcuIFVuaXQgTmFtZS4uLi4uLi4uLi4uLg0KK2NvbW1vbk5hbWUgICAgICAgICAgICAgID0gQ29tbW9uIE5hbWUgKHJlcXVpcmVkKS4uLi4NCitjb21tb25OYW1lX21heCAgICAgICAgICA9IDY0DQorZW1haWxBZGRyZXNzICAgICAgICAgICAgPSBFbWFpbCBBZGRyZXNzLi4uLi4uLi4uLi4uLg0KK2VtYWlsQWRkcmVzc19tYXggICAgICAgID0gNjQNCisNCitbIHYzX2NhIF0NCitiYXNpY0NvbnN0cmFpbnRzICAgICAgICA9IENBOlRSVUUNCitzdWJqZWN0S2V5SWRlbnRpZmllciAgICA9IGhhc2gNCithdXRob3JpdHlLZXlJZGVudGlmaWVyICA9IGtleWlkOmFsd2F5cyxpc3N1ZXI6YWx3YXlzDQorDQorWyB2M191c3IgXQ0KK2Jhc2ljQ29uc3RyYWludHMgICAgICAgID0gQ0E6RkFMU0UNCitzdWJqZWN0S2V5SWRlbnRpZmllciAgICA9IGhhc2gNCithdXRob3JpdHlLZXlJZGVudGlmaWVyICA9IGtleWlkLGlzc3Vlcg0KKw0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3NzbC9zc2xfY2xpZW50MS5jIGIvcHJvZ3JhbXMvc3NsL3NzbF9jbGllbnQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1MmQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3NzbC9zc2xfY2xpZW50MS5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogIFNTTCBjbGllbnQgZGVtb25zdHJhdGlvbiBwcm9ncmFtCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAieHlzc2wvbmV0LmgiCisjaW5jbHVkZSAieHlzc2wvc3NsLmgiCisjaW5jbHVkZSAieHlzc2wvaGF2ZWdlLmgiCisKKyNkZWZpbmUgU0VSVkVSX1BPUlQgNDQzCisvKgorI2RlZmluZSBTRVJWRVJfTkFNRSAibG9jYWxob3N0IgorI2RlZmluZSBHRVRfUkVRVUVTVCAiR0VUIC8gSFRUUC8xLjBcclxuXHJcbiIKKyovCisjZGVmaW5lIFNFUlZFUl9OQU1FICJ4eXNzbC5vcmciCisjZGVmaW5lIEdFVF9SRVFVRVNUIFwKKyAgICAiR0VUIC9oZWxsby8gSFRUUC8xLjFcclxuIiBcCisgICAgIkhvc3Q6IHh5c3NsLm9yZ1xyXG5cclxuIgorCisjZGVmaW5lIERFQlVHX0xFVkVMIDAKKwordm9pZCBteV9kZWJ1Zyggdm9pZCAqY3R4LCBpbnQgbGV2ZWwsIGNoYXIgKnN0ciApCit7CisgICAgaWYoIGxldmVsIDwgREVCVUdfTEVWRUwgKQorICAgIHsKKyAgICAgICAgZnByaW50ZiggKEZJTEUgKikgY3R4LCAiJXMiLCBzdHIgKTsKKyAgICAgICAgZmZsdXNoKCAgKEZJTEUgKikgY3R4ICApOworICAgIH0KK30KKworaW50IG1haW4oIHZvaWQgKQoreworICAgIGludCByZXQsIGxlbiwgc2VydmVyX2ZkOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMjRdOworICAgIGhhdmVnZV9zdGF0ZSBoczsKKyAgICBzc2xfY29udGV4dCBzc2w7CisgICAgc3NsX3Nlc3Npb24gc3NuOworCisgICAgLyoKKyAgICAgKiAwLiBJbml0aWFsaXplIHRoZSBSTkcgYW5kIHRoZSBzZXNzaW9uIGRhdGEKKyAgICAgKi8KKyAgICBoYXZlZ2VfaW5pdCggJmhzICk7CisgICAgbWVtc2V0KCAmc3NuLCAwLCBzaXplb2YoIHNzbF9zZXNzaW9uICkgKTsKKworICAgIC8qCisgICAgICogMS4gU3RhcnQgdGhlIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBwcmludGYoICJcbiAgLiBDb25uZWN0aW5nIHRvIHRjcC8lcy8lNGQuLi4iLCBTRVJWRVJfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWRVJfUE9SVCApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggKCByZXQgPSBuZXRfY29ubmVjdCggJnNlcnZlcl9mZCwgU0VSVkVSX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZFUl9QT1JUICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBuZXRfY29ubmVjdCByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHByaW50ZiggIiBva1xuIiApOworCisgICAgLyoKKyAgICAgKiAyLiBTZXR1cCBzdHVmZgorICAgICAqLworICAgIHByaW50ZiggIiAgLiBTZXR0aW5nIHVwIHRoZSBTU0wvVExTIHN0cnVjdHVyZS4uLiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgaWYoICggcmV0ID0gc3NsX2luaXQoICZzc2wgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIHNzbF9pbml0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiIG9rXG4iICk7CisKKyAgICBzc2xfc2V0X2VuZHBvaW50KCAmc3NsLCBTU0xfSVNfQ0xJRU5UICk7CisgICAgc3NsX3NldF9hdXRobW9kZSggJnNzbCwgU1NMX1ZFUklGWV9OT05FICk7CisKKyAgICBzc2xfc2V0X3JuZyggJnNzbCwgaGF2ZWdlX3JhbmQsICZocyApOworICAgIHNzbF9zZXRfZGJnKCAmc3NsLCBteV9kZWJ1Zywgc3Rkb3V0ICk7CisgICAgc3NsX3NldF9iaW8oICZzc2wsIG5ldF9yZWN2LCAmc2VydmVyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICBuZXRfc2VuZCwgJnNlcnZlcl9mZCApOworCisgICAgc3NsX3NldF9jaXBoZXJzKCAmc3NsLCBzc2xfZGVmYXVsdF9jaXBoZXJzICk7CisgICAgc3NsX3NldF9zZXNzaW9uKCAmc3NsLCAxLCA2MDAsICZzc24gKTsKKworICAgIC8qCisgICAgICogMy4gV3JpdGUgdGhlIEdFVCByZXF1ZXN0CisgICAgICovCisgICAgcHJpbnRmKCAiICA+IFdyaXRlIHRvIHNlcnZlcjoiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGxlbiA9IHNwcmludGYoIChjaGFyICopIGJ1ZiwgR0VUX1JFUVVFU1QgKTsKKworICAgIHdoaWxlKCAoIHJldCA9IHNzbF93cml0ZSggJnNzbCwgYnVmLCBsZW4gKSApIDw9IDAgKQorICAgIHsKKyAgICAgICAgaWYoIHJldCAhPSBYWVNTTF9FUlJfTkVUX1RSWV9BR0FJTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBzc2xfd3JpdGUgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW4gPSByZXQ7CisgICAgcHJpbnRmKCAiICVkIGJ5dGVzIHdyaXR0ZW5cblxuJXMiLCBsZW4sIChjaGFyICopIGJ1ZiApOworCisgICAgLyoKKyAgICAgKiA3LiBSZWFkIHRoZSBIVFRQIHJlc3BvbnNlCisgICAgICovCisgICAgcHJpbnRmKCAiICA8IFJlYWQgZnJvbSBzZXJ2ZXI6IiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgbGVuID0gc2l6ZW9mKCBidWYgKSAtIDE7CisgICAgICAgIG1lbXNldCggYnVmLCAwLCBzaXplb2YoIGJ1ZiApICk7CisgICAgICAgIHJldCA9IHNzbF9yZWFkKCAmc3NsLCBidWYsIGxlbiApOworCisgICAgICAgIGlmKCByZXQgPT0gWFlTU0xfRVJSX05FVF9UUllfQUdBSU4gKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoIHJldCA9PSBYWVNTTF9FUlJfU1NMX1BFRVJfQ0xPU0VfTk9USUZZICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmKCByZXQgPD0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZiggImZhaWxlZFxuICAhIHNzbF9yZWFkIHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSByZXQ7CisgICAgICAgIHByaW50ZiggIiAlZCBieXRlcyByZWFkXG5cbiVzIiwgbGVuLCAoY2hhciAqKSBidWYgKTsKKyAgICB9CisgICAgd2hpbGUoIDAgKTsKKworICAgIHNzbF9jbG9zZV9ub3RpZnkoICZzc2wgKTsKKworZXhpdDoKKworICAgIG5ldF9jbG9zZSggc2VydmVyX2ZkICk7CisgICAgc3NsX2ZyZWUoICZzc2wgKTsKKworICAgIG1lbXNldCggJnNzbCwgMCwgc2l6ZW9mKCBzc2wgKSApOworCisjaWZkZWYgV0lOMzIKKyAgICBwcmludGYoICIgICsgUHJlc3MgRW50ZXIgdG8gZXhpdCB0aGlzIHByb2dyYW0uXG4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsgZ2V0Y2hhcigpOworI2VuZGlmCisKKyAgICByZXR1cm4oIHJldCApOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL3NzbF9jbGllbnQyLmMgYi9wcm9ncmFtcy9zc2wvc3NsX2NsaWVudDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTljMzdiCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3NzbF9jbGllbnQyLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiAgU1NMIGNsaWVudCB3aXRoIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAieHlzc2wvbmV0LmgiCisjaW5jbHVkZSAieHlzc2wvc3NsLmgiCisjaW5jbHVkZSAieHlzc2wvaGF2ZWdlLmgiCisjaW5jbHVkZSAieHlzc2wvY2VydHMuaCIKKyNpbmNsdWRlICJ4eXNzbC94NTA5LmgiCisKKyNkZWZpbmUgU0VSVkVSX1BPUlQgNDQzCisvKgorI2RlZmluZSBTRVJWRVJfTkFNRSAibG9jYWxob3N0IgorI2RlZmluZSBHRVRfUkVRVUVTVCAiR0VUIC8gSFRUUC8xLjBcclxuXHJcbiIKKyovCisjZGVmaW5lIFNFUlZFUl9OQU1FICJ4eXNzbC5vcmciCisjZGVmaW5lIEdFVF9SRVFVRVNUIFwKKyAgICAiR0VUIC9oZWxsby8gSFRUUC8xLjFcclxuIiBcCisgICAgIkhvc3Q6IHh5c3NsLm9yZ1xyXG5cclxuIgorCisjZGVmaW5lIERFQlVHX0xFVkVMIDAKKwordm9pZCBteV9kZWJ1Zyggdm9pZCAqY3R4LCBpbnQgbGV2ZWwsIGNoYXIgKnN0ciApCit7CisgICAgaWYoIGxldmVsIDwgREVCVUdfTEVWRUwgKQorICAgIHsKKyAgICAgICAgZnByaW50ZiggKEZJTEUgKikgY3R4LCAiJXMiLCBzdHIgKTsKKyAgICAgICAgZmZsdXNoKCAgKEZJTEUgKikgY3R4ICApOworICAgIH0KK30KKworaW50IG1haW4oIHZvaWQgKQoreworICAgIGludCByZXQsIGxlbiwgc2VydmVyX2ZkOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMjRdOworICAgIGhhdmVnZV9zdGF0ZSBoczsKKyAgICBzc2xfY29udGV4dCBzc2w7CisgICAgc3NsX3Nlc3Npb24gc3NuOworICAgIHg1MDlfY2VydCBjYWNlcnQ7CisgICAgeDUwOV9jZXJ0IGNsaWNlcnQ7CisgICAgcnNhX2NvbnRleHQgcnNhOworCisgICAgLyoKKyAgICAgKiAwLiBJbml0aWFsaXplIHRoZSBSTkcgYW5kIHRoZSBzZXNzaW9uIGRhdGEKKyAgICAgKi8KKyAgICBoYXZlZ2VfaW5pdCggJmhzICk7CisgICAgbWVtc2V0KCAmc3NuLCAwLCBzaXplb2YoIHNzbF9zZXNzaW9uICkgKTsKKworICAgIC8qCisgICAgICogMS4xLiBMb2FkIHRoZSB0cnVzdGVkIENBCisgICAgICovCisgICAgcHJpbnRmKCAiXG4gIC4gTG9hZGluZyB0aGUgQ0Egcm9vdCBjZXJ0aWZpY2F0ZSAuLi4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIG1lbXNldCggJmNhY2VydCwgMCwgc2l6ZW9mKCB4NTA5X2NlcnQgKSApOworCisgICAgLyoKKyAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGxvYWQgdGhlIENBIGNlcnRpZmljYXRlcyBmcm9tIGEgLnBlbSBvcgorICAgICAqIC5jcnQgZmlsZSBieSBjYWxsaW5nIHg1MDlwYXJzZV9jcnRmaWxlKCAmY2FjZXJ0LCAibXljYS5jcnQiICkuCisgICAgICovCisgICAgcmV0ID0geDUwOXBhcnNlX2NydCggJmNhY2VydCwgKHVuc2lnbmVkIGNoYXIgKikgeHlzc2xfY2FfY3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiggeHlzc2xfY2FfY3J0ICkgKTsKKyAgICBpZiggcmV0ICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhICB4NTA5cGFyc2VfY3J0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiIG9rXG4iICk7CisKKyAgICAvKgorICAgICAqIDEuMi4gTG9hZCBvd24gY2VydGlmaWNhdGUgYW5kIHByaXZhdGUga2V5CisgICAgICoKKyAgICAgKiAoY2FuIGJlIHNraXBwZWQgaWYgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIG5vdCByZXF1aXJlZCkKKyAgICAgKi8KKyAgICBwcmludGYoICIgIC4gTG9hZGluZyB0aGUgY2xpZW50IGNlcnQuIGFuZCBrZXkuLi4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIG1lbXNldCggJmNsaWNlcnQsIDAsIHNpemVvZiggeDUwOV9jZXJ0ICkgKTsKKworICAgIHJldCA9IHg1MDlwYXJzZV9jcnQoICZjbGljZXJ0LCAodW5zaWduZWQgY2hhciAqKSB0ZXN0X2NsaV9jcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCB0ZXN0X2NsaV9jcnQgKSApOworICAgIGlmKCByZXQgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgIHg1MDlwYXJzZV9jcnQgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICByZXQgPSB4NTA5cGFyc2Vfa2V5KCAmcnNhLCAodW5zaWduZWQgY2hhciAqKSB0ZXN0X2NsaV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCB0ZXN0X2NsaV9rZXkgKSwgTlVMTCwgMCApOworICAgIGlmKCByZXQgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgIHg1MDlwYXJzZV9rZXkgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBwcmludGYoICIgb2tcbiIgKTsKKworICAgIC8qCisgICAgICogMi4gU3RhcnQgdGhlIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBwcmludGYoICIgIC4gQ29ubmVjdGluZyB0byB0Y3AvJXMvJS00ZC4uLiIsIFNFUlZFUl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSVkVSX1BPUlQgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgaWYoICggcmV0ID0gbmV0X2Nvbm5lY3QoICZzZXJ2ZXJfZmQsIFNFUlZFUl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWRVJfUE9SVCApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgbmV0X2Nvbm5lY3QgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBwcmludGYoICIgb2tcbiIgKTsKKworICAgIC8qCisgICAgICogMy4gU2V0dXAgc3R1ZmYKKyAgICAgKi8KKyAgICBwcmludGYoICIgIC4gU2V0dGluZyB1cCB0aGUgU1NML1RMUyBzdHJ1Y3R1cmUuLi4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGhhdmVnZV9pbml0KCAmaHMgKTsKKworICAgIGlmKCAoIHJldCA9IHNzbF9pbml0KCAmc3NsICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBzc2xfaW5pdCByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHByaW50ZiggIiBva1xuIiApOworCisgICAgc3NsX3NldF9lbmRwb2ludCggJnNzbCwgU1NMX0lTX0NMSUVOVCApOworICAgIHNzbF9zZXRfYXV0aG1vZGUoICZzc2wsIFNTTF9WRVJJRllfT1BUSU9OQUwgKTsKKworICAgIHNzbF9zZXRfcm5nKCAmc3NsLCBoYXZlZ2VfcmFuZCwgJmhzICk7CisgICAgc3NsX3NldF9iaW8oICZzc2wsIG5ldF9yZWN2LCAmc2VydmVyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICBuZXRfc2VuZCwgJnNlcnZlcl9mZCApOworCisgICAgc3NsX3NldF9jaXBoZXJzKCAmc3NsLCBzc2xfZGVmYXVsdF9jaXBoZXJzICk7CisgICAgc3NsX3NldF9zZXNzaW9uKCAmc3NsLCAxLCA2MDAsICZzc24gKTsKKworICAgIHNzbF9zZXRfY2FfY2hhaW4oICZzc2wsICZjYWNlcnQsIFNFUlZFUl9OQU1FICk7CisgICAgc3NsX3NldF9vd25fY2VydCggJnNzbCwgJmNsaWNlcnQsICZyc2EgKTsKKworICAgIHNzbF9zZXRfaG9zdG5hbWUoICZzc2wsIFNFUlZFUl9OQU1FICk7CisKKyAgICAvKgorICAgICAqIDQuIEhhbmRzaGFrZQorICAgICAqLworICAgIHByaW50ZiggIiAgLiBQZXJmb3JtaW5nIHRoZSBTU0wvVExTIGhhbmRzaGFrZS4uLiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgd2hpbGUoICggcmV0ID0gc3NsX2hhbmRzaGFrZSggJnNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggcmV0ICE9IFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIHNzbF9oYW5kc2hha2UgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGYoICIgb2tcbiAgICBbIENpcGhlciBpcyAlcyBdXG4iLAorICAgICAgICAgICAgc3NsX2dldF9jaXBoZXIoICZzc2wgKSApOworCisgICAgLyoKKyAgICAgKiA1LiBWZXJpZnkgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZQorICAgICAqLworICAgIHByaW50ZiggIiAgLiBWZXJpZnlpbmcgcGVlciBYLjUwOSBjZXJ0aWZpY2F0ZS4uLiIgKTsKKworICAgIGlmKCAoIHJldCA9IHNzbF9nZXRfdmVyaWZ5X3Jlc3VsdCggJnNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4iICk7CisKKyAgICAgICAgaWYoICggcmV0ICYgQkFEQ0VSVF9FWFBJUkVEICkgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICIgICEgc2VydmVyIGNlcnRpZmljYXRlIGhhcyBleHBpcmVkXG4iICk7CisKKyAgICAgICAgaWYoICggcmV0ICYgQkFEQ0VSVF9SRVZPS0VEICkgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICIgICEgc2VydmVyIGNlcnRpZmljYXRlIGhhcyBiZWVuIHJldm9rZWRcbiIgKTsKKworICAgICAgICBpZiggKCByZXQgJiBCQURDRVJUX0NOX01JU01BVENIICkgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICIgICEgQ04gbWlzbWF0Y2ggKGV4cGVjdGVkIENOPSVzKVxuIiwgU0VSVkVSX05BTUUgKTsKKworICAgICAgICBpZiggKCByZXQgJiBCQURDRVJUX05PVF9UUlVTVEVEICkgIT0gMCApCisgICAgICAgICAgICBwcmludGYoICIgICEgc2VsZi1zaWduZWQgb3Igbm90IHNpZ25lZCBieSBhIHRydXN0ZWQgQ0FcbiIgKTsKKworICAgICAgICBwcmludGYoICJcbiIgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGYoICIgb2tcbiIgKTsKKworICAgIHByaW50ZiggIiAgLiBQZWVyIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uICAgIC4uLlxuIiApOworICAgIHByaW50ZiggeDUwOXBhcnNlX2NlcnRfaW5mbyggIiAgICAgICIsIHNzbC5wZWVyX2NlcnQgKSApOworCisgICAgLyoKKyAgICAgKiA2LiBXcml0ZSB0aGUgR0VUIHJlcXVlc3QKKyAgICAgKi8KKyAgICBwcmludGYoICIgID4gV3JpdGUgdG8gc2VydmVyOiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgbGVuID0gc3ByaW50ZiggKGNoYXIgKikgYnVmLCBHRVRfUkVRVUVTVCApOworCisgICAgd2hpbGUoICggcmV0ID0gc3NsX3dyaXRlKCAmc3NsLCBidWYsIGxlbiApICkgPD0gMCApCisgICAgeworICAgICAgICBpZiggcmV0ICE9IFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIHNzbF93cml0ZSByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxlbiA9IHJldDsKKyAgICBwcmludGYoICIgJWQgYnl0ZXMgd3JpdHRlblxuXG4lcyIsIGxlbiwgKGNoYXIgKikgYnVmICk7CisKKyAgICAvKgorICAgICAqIDcuIFJlYWQgdGhlIEhUVFAgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBwcmludGYoICIgIDwgUmVhZCBmcm9tIHNlcnZlcjoiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGRvCisgICAgeworICAgICAgICBsZW4gPSBzaXplb2YoIGJ1ZiApIC0gMTsKKyAgICAgICAgbWVtc2V0KCBidWYsIDAsIHNpemVvZiggYnVmICkgKTsKKyAgICAgICAgcmV0ID0gc3NsX3JlYWQoICZzc2wsIGJ1ZiwgbGVuICk7CisKKyAgICAgICAgaWYoIHJldCA9PSBYWVNTTF9FUlJfTkVUX1RSWV9BR0FJTiApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggcmV0ID09IFhZU1NMX0VSUl9TU0xfUEVFUl9DTE9TRV9OT1RJRlkgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYoIHJldCA8PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiZmFpbGVkXG4gICEgc3NsX3JlYWQgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHJldDsKKyAgICAgICAgcHJpbnRmKCAiICVkIGJ5dGVzIHJlYWRcblxuJXMiLCBsZW4sIChjaGFyICopIGJ1ZiApOworICAgIH0KKyAgICB3aGlsZSggMCApOworCisgICAgc3NsX2Nsb3NlX25vdGlmeSggJnNzbCApOworCitleGl0OgorCisgICAgbmV0X2Nsb3NlKCBzZXJ2ZXJfZmQgKTsKKyAgICB4NTA5X2ZyZWUoICZjbGljZXJ0ICk7CisgICAgeDUwOV9mcmVlKCAmY2FjZXJ0ICk7CisgICAgcnNhX2ZyZWUoICZyc2EgKTsKKyAgICBzc2xfZnJlZSggJnNzbCApOworCisgICAgbWVtc2V0KCAmc3NsLCAwLCBzaXplb2YoIHNzbCApICk7CisKKyNpZmRlZiBXSU4zMgorICAgIHByaW50ZiggIiAgKyBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOyBnZXRjaGFyKCk7CisjZW5kaWYKKworICAgIHJldHVybiggcmV0ICk7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9zc2wvc3NsX3NlcnZlci5jIGIvcHJvZ3JhbXMvc3NsL3NzbF9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjVmZWQyCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3NzbF9zZXJ2ZXIuYwpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqICBTU0wgc2VydmVyIGRlbW9uc3RyYXRpb24gcHJvZ3JhbQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ4eXNzbC9oYXZlZ2UuaCIKKyNpbmNsdWRlICJ4eXNzbC9jZXJ0cy5oIgorI2luY2x1ZGUgInh5c3NsL3g1MDkuaCIKKyNpbmNsdWRlICJ4eXNzbC9zc2wuaCIKKyNpbmNsdWRlICJ4eXNzbC9uZXQuaCIKKworI2RlZmluZSBIVFRQX1JFU1BPTlNFIFwKKyAgICAiSFRUUC8xLjAgMjAwIE9LXHJcbkNvbnRlbnQtVHlwZTogdGV4dC9odG1sXHJcblxyXG4iIFwKKyAgICAiPGgyPjxwPjxjZW50ZXI+U3VjY2Vzc2Z1bCBjb25uZWN0aW9uIHVzaW5nOiAlc1xyXG4iCisKKy8qCisgKiBDb21wdXRpbmcgYSAic2FmZSIgREgtMTAyNCBwcmltZSBjYW4gdGFrZSBhIHZlcnkKKyAqIGxvbmcgdGltZSwgc28gYSBwcmVjb21wdXRlZCB2YWx1ZSBpcyBwcm92aWRlZCBiZWxvdy4KKyAqIFlvdSBtYXkgcnVuIGRoX2dlbnByaW1lIHRvIGdlbmVyYXRlIGEgbmV3IHZhbHVlLgorICovCitjaGFyICpteV9kaG1fUCA9IAorICAgICJFNDAwNEMxRjk0MTgyMDAwMTAzRDg4M0E0NDhCM0Y4MCIgXAorICAgICIyQ0U0QjQ0QTgzMzAxMjcwMDAyQzIwRDAzMjFDRkQwMCIgXAorICAgICIxMUNDRUY3ODRDMjZBNDAwRjQzREZCOTAxQkNBNzUzOCIgXAorICAgICJGMkM2QjE3NjAwMUNGNUEwRkQxNkQyQzQ4QjFEMEMxQyIgXAorICAgICJGNkFDOEUxREE2QkNDM0I0RTFGOTZCMDU2NDk2NTMwMCIgXAorICAgICJGRkExRDBCNjAxRUIyODAwRjQ4OUFBNTEyQzRCMjQ4QyIgXAorICAgICIwMUY3Njk0OUE2MEJCN0YwMEE0MEIxRUFCNjRCREQ0OCIgXAorICAgICJFOEE3MDBENjBCN0YxMjAwRkE4RTc3QjBBOTc5REFCRiI7CisKK2NoYXIgKm15X2RobV9HID0gIjQiOworCisvKgorICogU29ydGVkIGJ5IG9yZGVyIG9mIHByZWZlcmVuY2UKKyAqLworaW50IG15X2NpcGhlcnNbXSA9Cit7CisgICAgU1NMX0VESF9SU0FfQUVTXzI1Nl9TSEEsCisgICAgU1NMX0VESF9SU0FfREVTXzE2OF9TSEEsCisgICAgU1NMX1JTQV9BRVNfMjU2X1NIQSwKKyAgICBTU0xfUlNBX0FFU18xMjhfU0hBLAorICAgIFNTTF9SU0FfREVTXzE2OF9TSEEsCisgICAgU1NMX1JTQV9SQzRfMTI4X1NIQSwKKyAgICBTU0xfUlNBX1JDNF8xMjhfTUQ1LAorICAgIDAKK307CisKKyNkZWZpbmUgREVCVUdfTEVWRUwgMAorCit2b2lkIG15X2RlYnVnKCB2b2lkICpjdHgsIGludCBsZXZlbCwgY2hhciAqc3RyICkKK3sKKyAgICBpZiggbGV2ZWwgPCBERUJVR19MRVZFTCApCisgICAgeworICAgICAgICBmcHJpbnRmKCAoRklMRSAqKSBjdHgsICIlcyIsIHN0ciApOworICAgICAgICBmZmx1c2goICAoRklMRSAqKSBjdHggICk7CisgICAgfQorfQorCisvKgorICogVGhlc2Ugc2Vzc2lvbiBjYWxsYmFja3MgdXNlIGEgc2ltcGxlIGNoYWluZWQgbGlzdAorICogdG8gc3RvcmUgYW5kIHJldHJpZXZlIHRoZSBzZXNzaW9uIGluZm9ybWF0aW9uLgorICovCitzc2xfc2Vzc2lvbiAqc19saXN0XzFzdCA9IE5VTEw7Citzc2xfc2Vzc2lvbiAqY3VyLCAqcHJ2OworCitzdGF0aWMgaW50IG15X2dldF9zZXNzaW9uKCBzc2xfY29udGV4dCAqc3NsICkKK3sKKyAgICB0aW1lX3QgdCA9IHRpbWUoIE5VTEwgKTsKKworICAgIGlmKCBzc2wtPnJlc3VtZSA9PSAwICkKKyAgICAgICAgcmV0dXJuKCAxICk7CisKKyAgICBjdXIgPSBzX2xpc3RfMXN0OworICAgIHBydiA9IE5VTEw7CisKKyAgICB3aGlsZSggY3VyICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgcHJ2ID0gY3VyOworICAgICAgICBjdXIgPSBjdXItPm5leHQ7CisKKyAgICAgICAgaWYoIHNzbC0+dGltZW91dCAhPSAwICYmIHQgLSBwcnYtPnN0YXJ0ID4gc3NsLT50aW1lb3V0ICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmKCBzc2wtPnNlc3Npb24tPmNpcGhlciAhPSBwcnYtPmNpcGhlciB8fAorICAgICAgICAgICAgc3NsLT5zZXNzaW9uLT5sZW5ndGggIT0gcHJ2LT5sZW5ndGggKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoIG1lbWNtcCggc3NsLT5zZXNzaW9uLT5pZCwgcHJ2LT5pZCwgcHJ2LT5sZW5ndGggKSAhPSAwICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG1lbWNweSggc3NsLT5zZXNzaW9uLT5tYXN0ZXIsIHBydi0+bWFzdGVyLCA0OCApOworICAgICAgICByZXR1cm4oIDAgKTsKKyAgICB9CisKKyAgICByZXR1cm4oIDEgKTsKK30KKworc3RhdGljIGludCBteV9zZXRfc2Vzc2lvbiggc3NsX2NvbnRleHQgKnNzbCApCit7CisgICAgdGltZV90IHQgPSB0aW1lKCBOVUxMICk7CisKKyAgICBjdXIgPSBzX2xpc3RfMXN0OworICAgIHBydiA9IE5VTEw7CisKKyAgICB3aGlsZSggY3VyICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgaWYoIHNzbC0+dGltZW91dCAhPSAwICYmIHQgLSBjdXItPnN0YXJ0ID4gc3NsLT50aW1lb3V0ICkKKyAgICAgICAgICAgIGJyZWFrOyAvKiBleHBpcmVkLCByZXVzZSB0aGlzIHNsb3QgKi8KKworICAgICAgICBpZiggbWVtY21wKCBzc2wtPnNlc3Npb24tPmlkLCBjdXItPmlkLCBjdXItPmxlbmd0aCApID09IDAgKQorICAgICAgICAgICAgYnJlYWs7IC8qIGNsaWVudCByZWNvbm5lY3RlZCAqLworCisgICAgICAgIHBydiA9IGN1cjsKKyAgICAgICAgY3VyID0gY3VyLT5uZXh0OworICAgIH0KKworICAgIGlmKCBjdXIgPT0gTlVMTCApCisgICAgeworICAgICAgICBjdXIgPSAoc3NsX3Nlc3Npb24gKikgbWFsbG9jKCBzaXplb2YoIHNzbF9zZXNzaW9uICkgKTsKKyAgICAgICAgaWYoIGN1ciA9PSBOVUxMICkKKyAgICAgICAgICAgIHJldHVybiggMSApOworCisgICAgICAgIGlmKCBwcnYgPT0gTlVMTCApCisgICAgICAgICAgICAgIHNfbGlzdF8xc3QgPSBjdXI7CisgICAgICAgIGVsc2UgIHBydi0+bmV4dCAgPSBjdXI7CisgICAgfQorCisgICAgbWVtY3B5KCBjdXIsIHNzbC0+c2Vzc2lvbiwgc2l6ZW9mKCBzc2xfc2Vzc2lvbiApICk7CisKKyAgICByZXR1cm4oIDAgKTsKK30KKworaW50IG1haW4oIHZvaWQgKQoreworICAgIGludCByZXQsIGxlbjsKKyAgICBpbnQgbGlzdGVuX2ZkOworICAgIGludCBjbGllbnRfZmQ7CisgICAgdW5zaWduZWQgY2hhciBidWZbMTAyNF07CisKKyAgICBoYXZlZ2Vfc3RhdGUgaHM7CisgICAgc3NsX2NvbnRleHQgc3NsOworICAgIHNzbF9zZXNzaW9uIHNzbjsKKyAgICB4NTA5X2NlcnQgc3J2Y2VydDsKKyAgICByc2FfY29udGV4dCByc2E7CisKKyAgICAvKgorICAgICAqIDEuIExvYWQgdGhlIGNlcnRpZmljYXRlcyBhbmQgcHJpdmF0ZSBSU0Ega2V5CisgICAgICovCisgICAgcHJpbnRmKCAiXG4gIC4gTG9hZGluZyB0aGUgc2VydmVyIGNlcnQuIGFuZCBrZXkuLi4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIG1lbXNldCggJnNydmNlcnQsIDAsIHNpemVvZiggeDUwOV9jZXJ0ICkgKTsKKworICAgIC8qCisgICAgICogVGhpcyBkZW1vbnN0cmF0aW9uIHByb2dyYW0gdXNlcyBlbWJlZGRlZCB0ZXN0IGNlcnRpZmljYXRlcy4KKyAgICAgKiBJbnN0ZWFkLCB5b3UgbWF5IHdhbnQgdG8gdXNlIHg1MDlwYXJzZV9jcnRmaWxlKCkgdG8gcmVhZCB0aGUKKyAgICAgKiBzZXJ2ZXIgYW5kIENBIGNlcnRpZmljYXRlcywgYXMgd2VsbCBhcyB4NTA5cGFyc2Vfa2V5ZmlsZSgpLgorICAgICAqLworICAgIHJldCA9IHg1MDlwYXJzZV9jcnQoICZzcnZjZXJ0LCAodW5zaWduZWQgY2hhciAqKSB0ZXN0X3Nydl9jcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCB0ZXN0X3Nydl9jcnQgKSApOworICAgIGlmKCByZXQgIT0gMCApCisgICAgeworICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgIHg1MDlwYXJzZV9jcnQgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICByZXQgPSB4NTA5cGFyc2VfY3J0KCAmc3J2Y2VydCwgKHVuc2lnbmVkIGNoYXIgKikgdGVzdF9jYV9jcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCB0ZXN0X2NhX2NydCApICk7CisgICAgaWYoIHJldCAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISAgeDUwOXBhcnNlX2NydCByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHJldCA9ICB4NTA5cGFyc2Vfa2V5KCAmcnNhLCAodW5zaWduZWQgY2hhciAqKSB0ZXN0X3Nydl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiggdGVzdF9zcnZfa2V5ICksIE5VTEwsIDAgKTsKKyAgICBpZiggcmV0ICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhICB4NTA5cGFyc2Vfa2V5IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiIG9rXG4iICk7CisKKyAgICAvKgorICAgICAqIDIuIFNldHVwIHRoZSBsaXN0ZW5pbmcgVENQIHNvY2tldAorICAgICAqLworICAgIHByaW50ZiggIiAgLiBCaW5kIG9uIGh0dHBzOi8vbG9jYWxob3N0OjQ0MzMvIC4uLiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgaWYoICggcmV0ID0gbmV0X2JpbmQoICZsaXN0ZW5fZmQsIE5VTEwsIDQ0MzMgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIG5ldF9iaW5kIHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiIG9rXG4iICk7CisKKyAgICAvKgorICAgICAqIDMuIFdhaXQgdW50aWwgYSBjbGllbnQgY29ubmVjdHMKKyAgICAgKi8KKyNpZmRlZiBXSU4zMgorICAgIFNoZWxsRXhlY3V0ZSggTlVMTCwgIm9wZW4iLCAiaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzMy8iLAorICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgU1dfU0hPV05PUk1BTCApOworI2VuZGlmCisKKyAgICBjbGllbnRfZmQgPSAtMTsKKyAgICBtZW1zZXQoICZzc2wsIDAsIHNpemVvZiggc3NsICkgKTsKKworYWNjZXB0OgorCisgICAgbmV0X2Nsb3NlKCBjbGllbnRfZmQgKTsKKyAgICBzc2xfZnJlZSggJnNzbCApOworCisgICAgcHJpbnRmKCAiICAuIFdhaXRpbmcgZm9yIGEgcmVtb3RlIGNvbm5lY3Rpb24gLi4uIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggKCByZXQgPSBuZXRfYWNjZXB0KCBsaXN0ZW5fZmQsICZjbGllbnRfZmQsIE5VTEwgKSApICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIG5ldF9hY2NlcHQgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBwcmludGYoICIgb2tcbiIgKTsKKworICAgIC8qCisgICAgICogNC4gU2V0dXAgc3R1ZmYKKyAgICAgKi8KKyAgICBwcmludGYoICIgIC4gU2V0dGluZyB1cCB0aGUgUk5HIGFuZCBTU0wgZGF0YS4uLi4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGhhdmVnZV9pbml0KCAmaHMgKTsKKworICAgIGlmKCAoIHJldCA9IHNzbF9pbml0KCAmc3NsICkgKSAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBzc2xfaW5pdCByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgZ290byBhY2NlcHQ7CisgICAgfQorCisgICAgcHJpbnRmKCAiIG9rXG4iICk7CisKKyAgICBzc2xfc2V0X2VuZHBvaW50KCAmc3NsLCBTU0xfSVNfU0VSVkVSICk7CisgICAgc3NsX3NldF9hdXRobW9kZSggJnNzbCwgU1NMX1ZFUklGWV9OT05FICk7CisKKyAgICBzc2xfc2V0X3JuZyggJnNzbCwgaGF2ZWdlX3JhbmQsICZocyApOworICAgIHNzbF9zZXRfZGJnKCAmc3NsLCBteV9kZWJ1Zywgc3Rkb3V0ICk7CisgICAgc3NsX3NldF9iaW8oICZzc2wsIG5ldF9yZWN2LCAmY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICBuZXRfc2VuZCwgJmNsaWVudF9mZCApOworICAgIHNzbF9zZXRfc2NiKCAmc3NsLCBteV9nZXRfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbXlfc2V0X3Nlc3Npb24gKTsKKworICAgIHNzbF9zZXRfY2lwaGVycyggJnNzbCwgbXlfY2lwaGVycyApOworICAgIHNzbF9zZXRfc2Vzc2lvbiggJnNzbCwgMSwgMCwgJnNzbiApOworCisgICAgbWVtc2V0KCAmc3NuLCAwLCBzaXplb2YoIHNzbF9zZXNzaW9uICkgKTsKKworICAgIHNzbF9zZXRfY2FfY2hhaW4oICZzc2wsIHNydmNlcnQubmV4dCwgTlVMTCApOworICAgIHNzbF9zZXRfb3duX2NlcnQoICZzc2wsICZzcnZjZXJ0LCAmcnNhICk7CisgICAgc3NsX3NldF9kaF9wYXJhbSggJnNzbCwgbXlfZGhtX1AsIG15X2RobV9HICk7CisKKyAgICAvKgorICAgICAqIDUuIEhhbmRzaGFrZQorICAgICAqLworICAgIHByaW50ZiggIiAgLiBQZXJmb3JtaW5nIHRoZSBTU0wvVExTIGhhbmRzaGFrZS4uLiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgd2hpbGUoICggcmV0ID0gc3NsX2hhbmRzaGFrZSggJnNzbCApICkgIT0gMCApCisgICAgeworICAgICAgICBpZiggcmV0ICE9IFhZU1NMX0VSUl9ORVRfVFJZX0FHQUlOICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiIGZhaWxlZFxuICAhIHNzbF9oYW5kc2hha2UgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgICAgICBnb3RvIGFjY2VwdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaW50ZiggIiBva1xuIiApOworCisgICAgLyoKKyAgICAgKiA2LiBSZWFkIHRoZSBIVFRQIFJlcXVlc3QKKyAgICAgKi8KKyAgICBwcmludGYoICIgIDwgUmVhZCBmcm9tIGNsaWVudDoiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIGRvCisgICAgeworICAgICAgICBsZW4gPSBzaXplb2YoIGJ1ZiApIC0gMTsKKyAgICAgICAgbWVtc2V0KCBidWYsIDAsIHNpemVvZiggYnVmICkgKTsKKyAgICAgICAgcmV0ID0gc3NsX3JlYWQoICZzc2wsIGJ1ZiwgbGVuICk7CisKKyAgICAgICAgaWYoIHJldCA9PSBYWVNTTF9FUlJfTkVUX1RSWV9BR0FJTiApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggcmV0IDw9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goIHJldCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBYWVNTTF9FUlJfU1NMX1BFRVJfQ0xPU0VfTk9USUZZOgorICAgICAgICAgICAgICAgICAgICBwcmludGYoICIgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGdyYWNlZnVsbHlcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFhZU1NMX0VSUl9ORVRfQ09OTl9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiIGNvbm5lY3Rpb24gd2FzIHJlc2V0IGJ5IHBlZXJcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwcmludGYoICIgc3NsX3JlYWQgcmV0dXJuZWQgJWRcbiIsIHJldCApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSByZXQ7CisgICAgICAgIHByaW50ZiggIiAlZCBieXRlcyByZWFkXG5cbiVzIiwgbGVuLCAoY2hhciAqKSBidWYgKTsKKyAgICB9CisgICAgd2hpbGUoIDAgKTsKKworICAgIC8qCisgICAgICogNy4gV3JpdGUgdGhlIDIwMCBSZXNwb25zZQorICAgICAqLworICAgIHByaW50ZiggIiAgPiBXcml0ZSB0byBjbGllbnQ6IiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBsZW4gPSBzcHJpbnRmKCAoY2hhciAqKSBidWYsIEhUVFBfUkVTUE9OU0UsCisgICAgICAgICAgICAgICAgICAgc3NsX2dldF9jaXBoZXIoICZzc2wgKSApOworCisgICAgd2hpbGUoICggcmV0ID0gc3NsX3dyaXRlKCAmc3NsLCBidWYsIGxlbiApICkgPD0gMCApCisgICAgeworICAgICAgICBpZiggcmV0ID09IFhZU1NMX0VSUl9ORVRfQ09OTl9SRVNFVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZiggIiBmYWlsZWRcbiAgISBwZWVyIGNsb3NlZCB0aGUgY29ubmVjdGlvblxuXG4iICk7CisgICAgICAgICAgICBnb3RvIGFjY2VwdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCByZXQgIT0gWFlTU0xfRVJSX05FVF9UUllfQUdBSU4gKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoICIgZmFpbGVkXG4gICEgc3NsX3dyaXRlIHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgfQorCisgICAgbGVuID0gcmV0OworICAgIHByaW50ZiggIiAlZCBieXRlcyB3cml0dGVuXG5cbiVzXG4iLCBsZW4sIChjaGFyICopIGJ1ZiApOworCisgICAgc3NsX2Nsb3NlX25vdGlmeSggJnNzbCApOworICAgIGdvdG8gYWNjZXB0OworCitleGl0OgorCisgICAgbmV0X2Nsb3NlKCBjbGllbnRfZmQgKTsKKyAgICB4NTA5X2ZyZWUoICZzcnZjZXJ0ICk7CisgICAgcnNhX2ZyZWUoICZyc2EgKTsKKyAgICBzc2xfZnJlZSggJnNzbCApOworCisgICAgY3VyID0gc19saXN0XzFzdDsKKyAgICB3aGlsZSggY3VyICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgcHJ2ID0gY3VyOworICAgICAgICBjdXIgPSBjdXItPm5leHQ7CisgICAgICAgIG1lbXNldCggcHJ2LCAwLCBzaXplb2YoIHNzbF9zZXNzaW9uICkgKTsKKyAgICAgICAgZnJlZSggcHJ2ICk7CisgICAgfQorCisgICAgbWVtc2V0KCAmc3NsLCAwLCBzaXplb2YoIHNzbF9jb250ZXh0ICkgKTsKKworI2lmZGVmIFdJTjMyCisgICAgcHJpbnRmKCAiICBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOyBnZXRjaGFyKCk7CisjZW5kaWYKKworICAgIHJldHVybiggcmV0ICk7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9zc2wvdGVzdC1jYS9jbGllbnQxLmNydCBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL2NsaWVudDEuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OWJiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9jbGllbnQxLmNydApAQCAtMCwwICsxLDc2IEBACitDZXJ0aWZpY2F0ZToKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDMgKDB4MykKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogTz1YeVNTTCwgQ049WHlTU0wgVGVzdCBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTm92IDI5IDE5OjUwOjQyIDIwMDcgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBOb3YgMjggMTk6NTA6NDIgMjAwOSBHTVQKKyAgICAgICAgU3ViamVjdDogTz1YeVNTTCwgQ049VGVzdCBVc2VyIDEKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmE3OjJiOmU5OmMzOmQ1OjY4OjdjOmU3OjRiOjIzOjIwOjMxOmM4OjBlOgorICAgICAgICAgICAgICAgICAgICBiZTo5ZjpjODplNjpiNjphNzowOTpjNTo1OTo2NzphYjo2ZDplOTpmMzo3ZToKKyAgICAgICAgICAgICAgICAgICAgYjI6ZTc6M2I6MWM6OTk6Mjg6MzM6ZTA6Yjg6ZTk6OGI6ZWU6NDU6YTM6ZGU6CisgICAgICAgICAgICAgICAgICAgIDkxOmY4OjAzOjU5OjM0OmYxOmI2OmUwOmIzOjYyOjMzOjQ1Ojg3OjY0OjhlOgorICAgICAgICAgICAgICAgICAgICA1OTpkMzozNDo0ZjpmOTpmYjozYzo2NDo1MzphMjpmMjo1MzoyMDo5NzphMzoKKyAgICAgICAgICAgICAgICAgICAgMmI6ZmU6NmQ6YzQ6ZjM6Mzg6ODM6MDI6OTI6Yzg6Y2I6OGY6OWU6ZDk6ZDM6CisgICAgICAgICAgICAgICAgICAgIDVlOjg3OjM2OmVjOjE3OmIzOjUwOjViOjY4OmI3OjAzOjA0OmUyOjkwOjJmOgorICAgICAgICAgICAgICAgICAgICBkNDowZTo0ODo0MDpiMTphZDoxMToyODpkZTo4YTphOTo0YzpkZjoyMDowNToKKyAgICAgICAgICAgICAgICAgICAgNDc6OGE6ZWY6YmE6MjQ6MDk6ZmE6ZWM6ZjY6ZDQ6ZjE6MGY6YTE6MzE6Yjc6CisgICAgICAgICAgICAgICAgICAgIGYwOjU0OmQ1OmQ1OjIzOjE5OjFlOjQxOjZkOmI3Ojk2OjE3OjgxOmZmOmIzOgorICAgICAgICAgICAgICAgICAgICAxZTo4Mzo5Mjo3Njo0Yjo3YzpjZTpiMTo4ZjoxODpiMDo2OToyMDo2MDpmOToKKyAgICAgICAgICAgICAgICAgICAgNDE6OGI6MDQ6YWU6ODk6ODQ6YTg6MjA6NDg6YWU6ZjM6MWY6NTA6ZWM6MWM6CisgICAgICAgICAgICAgICAgICAgIDYxOjk3OmJkOjgxOjUwOjU0OjYxOjVkOjIzOmMzOmMyOjg0OmVkOjE5OjFiOgorICAgICAgICAgICAgICAgICAgICBlZTowZjoyMjozODoyODpkZTo1MTowNDo0MTo2ZDplMTo4Mjo0Mzo3NjplNzoKKyAgICAgICAgICAgICAgICAgICAgN2I6NDA6ZmQ6ODQ6ZWE6OWU6ZTg6ZDg6ZGE6YzI6NzI6YzQ6MzE6YzY6YjA6CisgICAgICAgICAgICAgICAgICAgIGNhOmNlOmFjOjdiOjVjOmZhOjQzOjE1OjVmOjQxOjFjOjIxOmJlOmRjOjk2OgorICAgICAgICAgICAgICAgICAgICA5NTpkNjo3NzoxNjplZjoxZDo1MTo4ZDoxMDo2NTphYTpmNTo5ZTpmODo0NzoKKyAgICAgICAgICAgICAgICAgICAgNmE6NDEKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpGQUxTRQorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIEYyOkM0Ojk2OjAyOkNGOkJGOkMxOkFBOkIwOkQyOjFBOkRBOkU3OkYzOjRCOjJDOjVEOkQxOkRGOjE0CisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDpGMjo2NzpCMTo1RDo1Rjo1MTo1RTpEQTo1MTo4OTpFOTpEOTpFOTo2QjpDQTo4QjpBRjpBNToyRTo2OQorCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGNhOjI5OjNmOjQ0OjkwOjhkOjljOmM2OjBkOmY5OmUyOmE5OjUwOmQ4OmU1OmQ2OjBhOmUwOgorICAgICAgICBiZTo2ZTo0ODpmYjplODo3YTpmNDo1Zjo1MDpkYzo2YjpkMTo3NjphNTpmOTo4ODo5MTo5NjoKKyAgICAgICAgNjI6ZTU6NjY6ODk6ZGE6ZWI6MTc6MDE6Zjc6ZDA6ZDI6Zjc6M2I6MzU6Nzg6ZGQ6ODA6NDU6CisgICAgICAgIGQwOjY0OjMyOjEzOjY3OjIwOmE4OmZjOmQ4OjYyOmUxOjQ0OmQ0OmFlOjQxOjM3OjJlOmU3OgorICAgICAgICA2Mzo5NDozNzo2Njo2MTozYjozODplOTo3ZDo4YTpiNjoxODpkNDpiNzoyYzo1OTplYTo0NjoKKyAgICAgICAgYTA6ZWQ6YWI6ODQ6Nzk6MDQ6YmU6ZGE6MGY6OWU6MmQ6Njg6MzQ6YTA6MDY6NjM6ZmE6MzM6CisgICAgICAgIDYxOmJjOjhhOjAwOjA3OjYyOmMzOjgxOjExOjBkOjI4OmQ5OjgwOjhmOjUxOmEyOmRiOmJlOgorICAgICAgICAyMzoxNjphNDozNzo2NToxODo3MjozNDoxNzpjMjphOTo2MzplMzo1ZjpmNDowZTo3Yzo1ODoKKyAgICAgICAgNWU6ZTQ6YTU6NDQ6OGY6NmI6MjM6YmE6MTg6NGU6ZTM6MGM6MjU6MmE6ODY6ZWU6NWQ6YzI6CisgICAgICAgIGEyOmU3OjkyOjhkOmE4Ojg0Ojc3OmVmOmI1OjljOmFmOjJjOjUzOjVkOjRjOjFiOmViOjk2OgorICAgICAgICBhNDo1NjoyNzpmNTpiZjpjYjo4Mjo5MTo1MTo2ZTo4YTpmNDo0OTo2YTo4NDozOTo0NDphMzoKKyAgICAgICAgMjM6N2U6ZDA6ODM6Y2U6MmI6NGE6NWY6MTg6MWI6ZDE6MWY6NzQ6MTQ6NmY6OTE6ZGE6MWE6CisgICAgICAgIGVlOjk1OjFkOmVlOmM3OjllOjc3OmEyOmRmOjFjOjIyOjcyOmMyOjA4OmJjOjk4OjYwOmEwOgorICAgICAgICBkNjo1ZjplYjpkODplODphZDpiMzpmNTowNTpjNDoxYTo5YjphOTo4ZDoyOTo4Mzo3ZToyNjoKKyAgICAgICAgNjI6ZmE6ZTM6NzkKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREZqQ0NBZjZnQXdJQkFnSUJBekFOQmdrcWhraUc5dzBCQVFVRkFEQW9NUTR3REFZRFZRUUtFd1ZZZVZOVAorVERFV01CUUdBMVVFQXhNTldIbFRVMHdnVkdWemRDQkRRVEFlRncwd056RXhNamt4T1RVd05ESmFGdzB3T1RFeAorTWpneE9UVXdOREphTUNZeERqQU1CZ05WQkFvVEJWaDVVMU5NTVJRd0VnWURWUVFERXd0VVpYTjBJRlZ6WlhJZworTVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2NyNmNQVmFIem5TeU1nTWNnTwordnAvSTVyYW5DY1ZaWjZ0dDZmTitzdWM3SEprb00rQzQ2WXZ1UmFQZWtmZ0RXVFR4dHVDellqTkZoMlNPV2RNMAorVC9uN1BHUlRvdkpUSUplaksvNXR4UE00Z3dLU3lNdVBudG5UWG9jMjdCZXpVRnRvdHdNRTRwQXYxQTVJUUxHdAorRVNqZWlxbE0zeUFGUjRydnVpUUordXoyMVBFUG9URzM4RlRWMVNNWkhrRnR0NVlYZ2YrekhvT1Nka3Q4enJHUAorR0xCcElHRDVRWXNFcm9tRXFDQklydk1mVU93Y1laZTlnVkJVWVYwanc4S0U3UmtiN2c4aU9DamVVUVJCYmVHQworUTNibmUwRDloT3FlNk5qYXduTEVNY2F3eXM2c2UxejZReFZmUVJ3aHZ0eVdsZFozRnU4ZFVZMFFaYXIxbnZoSAorYWtFQ0F3RUFBYU5OTUVzd0NRWURWUjBUQkFJd0FEQWRCZ05WSFE0RUZnUVU4c1NXQXMrL3dhcXcwaHJhNS9OTAorTEYzUjN4UXdId1lEVlIwakJCZ3dGb0FVOG1leFhWOVJYdHBSaWVuWjZXdktpNitsTG1rd0RRWUpLb1pJaHZjTgorQVFFRkJRQURnZ0VCQU1vcFAwU1FqWnpHRGZuaXFWRFk1ZFlLNEw1dVNQdm9ldlJmVU54cjBYYWwrWWlSbG1MbAorWm9uYTZ4Y0I5OURTOXpzMWVOMkFSZEJrTWhObklLajgyR0xoUk5TdVFUY3U1Mk9VTjJaaE96anBmWXEyR05TMworTEZucVJxRHRxNFI1Qkw3YUQ1NHRhRFNnQm1QNk0yRzhpZ0FIWXNPQkVRMG8yWUNQVWFMYnZpTVdwRGRsR0hJMAorRjhLcFkrTmY5QTU4V0Y3a3BVU1BheU82R0U3akRDVXFodTVkd3FMbmtvMm9oSGZ2dFp5dkxGTmRUQnZybHFSVworSi9XL3k0S1JVVzZLOUVscWhEbEVveU4rMElQT0swcGZHQnZSSDNRVWI1SGFHdTZWSGU3SG5uZWkzeHdpY3NJSQordkpoZ29OWmY2OWpvcmJQMUJjUWFtNm1OS1lOK0ptTDY0M2s9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9zc2wvdGVzdC1jYS9jbGllbnQxLmtleSBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL2NsaWVudDEua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzg0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9jbGllbnQxLmtleQpAQCAtMCwwICsxLDI3IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlFb3dJQkFBS0NBUUVBcHl2cHc5Vm9mT2RMSXlBeHlBNituOGptdHFjSnhWbG5xMjNwODM2eTV6c2NtU2d6Cis0TGpwaSs1Rm85NlIrQU5aTlBHMjRMTmlNMFdIWkk1WjB6UlArZnM4WkZPaThsTWdsNk1yL20zRTh6aURBcExJCit5NCtlMmROZWh6YnNGN05RVzJpM0F3VGlrQy9VRGtoQXNhMFJLTjZLcVV6ZklBVkhpdSs2SkFuNjdQYlU4UStoCitNYmZ3Vk5YVkl4a2VRVzIzbGhlQi83TWVnNUoyUzN6T3NZOFlzR2tnWVBsQml3U3VpWVNvSUVpdTh4OVE3QnhoCitsNzJCVUZSaFhTUER3b1R0R1J2dUR5STRLTjVSQkVGdDRZSkRkdWQ3UVAyRTZwN28yTnJDY3NReHhyREt6cXg3CitYUHBERlY5QkhDRyszSmFWMW5jVzd4MVJqUkJscXZXZStFZHFRUUlEQVFBQkFvSUJBUUNtZ2lIVU1uTmh2WXRrCitrRU9sYmJKSE92YzZSUVNCY2p6RlRyUnhHT2lmVW94NHJNZUhkUWNDbnJEMHVOTVJnbHhQVk5iLzF3emYzc2d0Cit5M0FDNDU4cGNpbkVFRjVFR2JKajkxM3hqV3BYakJsSjdlUmNoVkFHelBiaG5UM3BtV3hYcitSaCtIS21oVTBsCitjS2dua1NkL1dySW9VVzRJMmRsWnRNL2w1NTdzZUkzTXozNE1kV2ZQZ01SZEhVRmhPYTBpSmFrSHRZdDEvbzQvCithZHhqb0lkd0FqZXJydTBnOTE4ZnJLYjN2aTEzaXI2N1VNcmgvQTB1VVBzVk1pL2hTWnZ1VDBjMkMrS2QreHRICitlMHR0V1o2eDhlQkV6c2ltZ2h6Mll1YVFzNE95UHdaSFAwdW5SUnBOK0FtNDUzYjJWam5LUEYvUzJxRkNOT01xCitqV254eUtyQkFvR0JBTng5M2lmNHBUVHdZZVFvcDRFdFlXbWZyMk9FWDlzeVp6SWJ2NGkxY1BRVFFvN3N0REdBCit3WDMyeXRGWXZRd203R1ptbUhwMWJ1UHJmT3JZZ21ENVQyOXdmakVUTnF0dEt4em1KK2FYYTMwdDdVblRIMDRICitOQ1U3TzR4QVZyRmNOZVo0KzdvNkN3YmpIS3pmbGFKWGVXbGtsL1g4aFdYVWlNQUd6Nm5PS2NmcEFvR0JBTUlYCisxY0NSVFlxZk04MDRZcWwxRjIzYjJuWDhmRnk2VnFiV2svVmlGV0t3YW1kbjArQzNmZkx1VUxuSzBzNlh5YTNHCisvNkVjci82LytIK0tsU05SaGVuT0hIYXNkaEEwMlF3bEVnSEZYSEc1M05TQ0xMVFhqZi9MQVVOeU92amxuTDhQCit0V0RxQk9XSmc0TTlhTXZzeGR2N0FMUGEvcGQ3ZDdrb2REdmNjWENaQW9HQUkxNnBrWDNvZW9xSkdZR1FCVC9UCitYWTg1SWx5c3g4dlpGQWV4Zk91bU4vRVMvenhuVjMyUkRIVFhhaWV6QTgwR3BSS1dLU2JIYUJaeGpuYTJ5M21TCit6WXlkSWFBMForRjJSZ2VCcFJMck1rUjR5UnZ0N0tWcEx3UEdkS1FwaEFBSHdYWHM0NTNHQVEvVG5NT3RERUs5Cisvak1kMFY3MXd6VUp6c3dJNmZOaGJta0NnWUJ5SWlYMTZQdmFDaWdpQTRndzhjUG5QQ05Jd2tJM0hQUWJnNDdaCisrdVZzZFNUOHpaZFFTMVpxNWl6ZU5DQ21qNmR1NHRnclczMDZwcFJ3RzRQN2t0TFdXL2RzNlprN2luZ2ZwaVRpCittYlgwd2tEVFRnRVFEcmxYczM1NHRORnN6MGpQS1dPVks4ZlpXblhWVk9VdEZYeDhFU3VtbDU2aVlWNVRxVEJBCitpeTdCOFFLQmdGcm1mdEtLVnljUTNFb2Z1aFZ6MlRseEJLK1NMbmhqTnlHeUxtNm1JZ3luMDlnODM3T2J4TWtDCitzL3prVU5vWlZFVzFxY0ZnMTB5eXFCNUY1cjk0aDFxd3lUUkZQUW9CSFU4OEpITUJBa3lXTXkzeVI5ei9jYStyCitBeksrb1l3dFJjUnNMZFdhTU4rbkhrSkVTUlpnOFFQdlQ2WUpsdlJITUVFeFluZHFvdlJKCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvY2xpZW50Mi5jcnQgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9jbGllbnQyLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGE5MGNhCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvY2xpZW50Mi5jcnQKQEAgLTAsMCArMSw3NiBAQAorQ2VydGlmaWNhdGU6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA0ICgweDQpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IE89WHlTU0wsIENOPVh5U1NMIFRlc3QgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE5vdiAyOSAxOTo1MDo0OCAyMDA3IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTm92IDI4IDE5OjUwOjQ4IDIwMDkgR01UCisgICAgICAgIFN1YmplY3Q6IE89WHlTU0wsIENOPVRlc3QgVXNlciAyCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDplNTo3YjplMTo5NDowNjplNTpkZDoyMDowYTowZDo2YTo0Zjo5ZToyYzoKKyAgICAgICAgICAgICAgICAgICAgNDM6ZWE6NzQ6Zjg6YWY6OTA6YWI6NjA6N2U6NDU6MTc6Mjc6ZDk6MWI6MWQ6CisgICAgICAgICAgICAgICAgICAgIDkwOjQ0Ojk3OjQyOjQ1OjY3OjIyOjMyOmQ1OmViOjk3OjRlOjc2OmVmOjQ1OgorICAgICAgICAgICAgICAgICAgICA5OTozZjo4MDoyOTpjNTo0NTo5NDo3ZDo0MzpjMDowYjowMTpiZDphYzo5YzoKKyAgICAgICAgICAgICAgICAgICAgOWQ6Y2Y6ZmY6M2Y6ZWE6MWU6MDQ6MWM6MmE6NzA6OTQ6ZmY6NmI6ZDE6NjM6CisgICAgICAgICAgICAgICAgICAgIDZmOmNkOmIwOjVmOjFkOmJmOmQ2OjQ1OmYyOmUxOjMyOjE3OjE4Ojg3OmI0OgorICAgICAgICAgICAgICAgICAgICA3OTozOTo1MjowMToyMzo1MDo1ZDo4ZDoxMDo4OTowMjpjNzplODphODo2NzoKKyAgICAgICAgICAgICAgICAgICAgYTU6MTQ6NDE6MGY6MWE6ZDc6MjU6MmI6OTE6Zjg6NmE6YzY6NWQ6ZTM6YjA6CisgICAgICAgICAgICAgICAgICAgIGZlOjMwOjdjOjQ3OjU2Ojk1OjkzOmUxOmU4OmU0Ojc0OmU1OjFmOmJmOjAwOgorICAgICAgICAgICAgICAgICAgICAzMjo0OTo4ZTpmNzoxZDoyOTowNzo2ODo0Yzo4ZTpjYTo2Zjo4NDo5NjozNzoKKyAgICAgICAgICAgICAgICAgICAgMzc6M2Q6ZWU6OTI6MWQ6MTU6YjM6MTg6MzA6ZWY6YTA6NDY6YjE6NmU6N2I6CisgICAgICAgICAgICAgICAgICAgIGVjOmQ0OmE2OjI3OjhkOjExOmY5OjM1OjMxOjljOjkxOjA0OmM4OmUyOjhhOgorICAgICAgICAgICAgICAgICAgICBhYzo0ZjpjYjpiNDo0OTpiMDo5MjoyYjo4Mjo1OTo0ZTo2OTowMDo2Mjo1MToKKyAgICAgICAgICAgICAgICAgICAgNGY6NWQ6MTA6NzI6NTQ6MDM6NWM6MjQ6Mzk6OGE6ZmI6Mzk6NmI6YzE6ZGE6CisgICAgICAgICAgICAgICAgICAgIDg0OjEwOjE1OmMzOjA0OmNiOjMxOjI2OjkxOmI4OjBhOmIxOmI1OjMyOjY5OgorICAgICAgICAgICAgICAgICAgICBlYzowZjo2NDphNzo1MTo1MzpkYzo2NDoxMzpiMTpjMjplYzpmYzo1NTowYToKKyAgICAgICAgICAgICAgICAgICAgZDg6ZjU6MjI6ZTc6YzQ6ZDk6NGY6NzM6OGQ6ODU6YjY6Y2M6OGI6MmE6NTE6CisgICAgICAgICAgICAgICAgICAgIDc2OmUzCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6RkFMU0UKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA3MjpBOTo1NTowOToxMzpBNjo2MToxRToxRDo5RjowMDpCQTpBRjo5MzpEOTo4RDo2OTo4NjoxRDoyMAorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6RjI6Njc6QjE6NUQ6NUY6NTE6NUU6REE6NTE6ODk6RTk6RDk6RTk6NkI6Q0E6OEI6QUY6QTU6MkU6NjkKKworICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2ODozMjo5YzpjNTplYToxNTowMzphMzoyYTo1YjplMDozYjplZjowMjo3Mjo3Mjo1ZTo1ZjoKKyAgICAgICAgNTc6YjM6MzI6MWY6YTg6NDY6OTM6MzM6Mzg6NzU6OTI6NWY6NDE6ZTM6OTk6OTc6M2E6ZjI6CisgICAgICAgIDBkOjdkOjJiOjcxOjgxOjMxOmE3OmZmOjE1OjI4OmU4OmYxOmZlOmQ0OmMxOjgzOjJiOjBiOgorICAgICAgICAxYToxYjo2YzpiMzo4MTowMTplMTo0Yzo3Nzo1MTo4YjowOToyZDo3ZjpkYTo1MjoyYzpmNToKKyAgICAgICAgOWU6Mzg6YTc6NTk6Yjg6Y2M6ZGM6ZjU6NDI6ZDQ6M2Y6N2Y6MjI6OTY6N2U6NGE6ODk6ZjA6CisgICAgICAgIGNjOjZlOjc3OmYwOmVlOjc5OmQzOjgyOjIwOjdhOjBjOjE3OmUyOmM4OjE0Ojc3OjgxOmNkOgorICAgICAgICBiZjozNDoyNzo3Njo3YzpjMjplYjo0Zjo5MzpkZDowYTphMzplZToyZTpiOTpmNjo4YTpkMjoKKyAgICAgICAgN2Y6MGI6ZjA6Njk6MGY6OTA6MDU6NmU6ZDY6Y2E6MjM6OTE6NmQ6Mzg6Njg6Mjg6MmI6Yzc6CisgICAgICAgIDJkOjk5OjE3OmM3OjJhOjFiOmE2OjFiOjc4OmVhOjY4OjU2OmNiOjJlOjgzOmQ0Ojk4OjU0OgorICAgICAgICAxZjphNTo3NzpjZDo4ODo1OTo5YzpiZDphMjo4ODo3MDo0ZTpmNDo2ODpmMDowZTo3MDo0NToKKyAgICAgICAgOWM6YzA6ZWY6ZDQ6NDg6ZjA6MTQ6Y2M6MjQ6YjU6NDc6NDA6MDg6MDc6MmY6ZGY6Nzg6MGI6CisgICAgICAgIDBiOjUwOmY2OjQ5Ojg1OjQxOjhjOjQ4OjEyOjc4OjNhOjY3OjY3OmQ5OjgyOjA5OjBmOjU0OgorICAgICAgICBhNTpmZToxNDo3YzpkNDoyMTo2MDphMjo0NToyYjplYTo5NzpkZjozODpjYzpmNTo1YTpjZDoKKyAgICAgICAgNGQ6NjI6NWE6YTE6Y2Y6NTE6Y2I6OTM6MzY6MmU6Yzc6MTc6ZWM6Nzc6ODk6MDY6ZjI6Yzk6CisgICAgICAgIDU1OjcwOjk2OmYzCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURGakNDQWY2Z0F3SUJBZ0lCQkRBTkJna3Foa2lHOXcwQkFRVUZBREFvTVE0d0RBWURWUVFLRXdWWWVWTlQKK1RERVdNQlFHQTFVRUF4TU5XSGxUVTB3Z1ZHVnpkQ0JEUVRBZUZ3MHdOekV4TWpreE9UVXdORGhhRncwd09URXgKK01qZ3hPVFV3TkRoYU1DWXhEakFNQmdOVkJBb1RCVmg1VTFOTU1SUXdFZ1lEVlFRREV3dFVaWE4wSUZWelpYSWcKK01qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9WNzRaUUc1ZDBnQ2cxcVQ1NHMKK1ErcDArSytRcTJCK1JSY24yUnNka0VTWFFrVm5JakxWNjVkT2R1OUZtVCtBS2NWRmxIMUR3QXNCdmF5Y25jLy8KK1Arb2VCQndxY0pUL2E5RmpiODJ3WHgyLzFrWHk0VElYR0llMGVUbFNBU05RWFkwUWlRTEg2S2hucFJSQkR4clgKK0pTdVIrR3JHWGVPdy9qQjhSMWFWaytIbzVIVGxINzhBTWttTzl4MHBCMmhNanNwdmhKWTNOejN1a2gwVnN4Z3cKKzc2QkdzVzU3N05TbUo0MFIrVFV4bkpFRXlPS0tyRS9MdEVtd2tpdUNXVTVwQUdKUlQxMFFjbFFEWENRNWl2czUKK2E4SGFoQkFWd3dUTE1TYVJ1QXF4dFRKcDdBOWtwMUZUM0dRVHNjTHMvRlVLMlBVaTU4VFpUM09OaGJiTWl5cFIKK2R1TUNBd0VBQWFOTk1Fc3dDUVlEVlIwVEJBSXdBREFkQmdOVkhRNEVGZ1FVY3FsVkNST21ZUjRkbndDNnI1UFoKK2pXbUdIU0F3SHdZRFZSMGpCQmd3Rm9BVThtZXhYVjlSWHRwUmllblo2V3ZLaTYrbExta3dEUVlKS29aSWh2Y04KK0FRRUZCUUFEZ2dFQkFHZ3luTVhxRlFPaktsdmdPKzhDY25KZVgxZXpNaCtvUnBNek9IV1NYMEhqbVpjNjhnMTkKK0szR0JNYWYvRlNqbzhmN1V3WU1yQ3hvYmJMT0JBZUZNZDFHTENTMS8ybElzOVo0NHAxbTR6TnoxUXRRL2Z5S1cKK2ZrcUo4TXh1ZC9EdWVkT0NJSG9NRitMSUZIZUJ6YjgwSjNaOHd1dFBrOTBLbys0dXVmYUswbjhMOEdrUGtBVnUKKzFzb2prVzA0YUNncnh5MlpGOGNxRzZZYmVPcG9Wc3N1ZzlTWVZCK2xkODJJV1p5OW9vaHdUdlJvOEE1d1JaekEKKzc5Ukk4QlRNSkxWSFFBZ0hMOTk0Q3d0UTlrbUZRWXhJRW5nNloyZlpnZ2tQVktYK0ZIelVJV0NpUlN2cWw5ODQKK3pQVmF6VTFpV3FIUFVjdVROaTdIRit4M2lRYnl5VlZ3bHZNPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvY2xpZW50Mi5rZXkgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9jbGllbnQyLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njk2ZTEwCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvY2xpZW50Mi5rZXkKQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJRXBRSUJBQUtDQVFFQTVYdmhsQWJsM1NBS0RXcFBuaXhENm5UNHI1Q3JZSDVGRnlmWkd4MlFSSmRDUldjaQorTXRYcmwwNTI3MFdaUDRBcHhVV1VmVVBBQ3dHOXJKeWR6LzgvNmg0RUhDcHdsUDlyMFdOdnpiQmZIYi9XUmZMaAorTWhjWWg3UjVPVklCSTFCZGpSQ0pBc2ZvcUdlbEZFRVBHdGNsSzVINGFzWmQ0N0QrTUh4SFZwV1Q0ZWprZE9VZgordndBeVNZNzNIU2tIYUV5T3ltK0VsamMzUGU2U0hSV3pHRER2b0VheGJudnMxS1lualJINU5UR2NrUVRJNG9xcworVDh1MFNiQ1NLNEpaVG1rQVlsRlBYUkJ5VkFOY0pEbUsremxyd2RxRUVCWERCTXN4SnBHNENyRzFNbW5zRDJTbgorVVZQY1pCT3h3dXo4VlFyWTlTTG54TmxQYzQyRnRzeUxLbEYyNHdJREFRQUJBb0lCQUVOb3YxdVBKeWhzUitlbQorNmRwSm9HMlhqSkZ0eXBtZW5jYnVncHl2YzNoaWdpb0c0SW5VUXM4QVVubDRsVXFNNkRnMWR5ZlFwZkhWd2hTWgorTU5ZdllXUHhDejRHeldsSEdqRzRwdGZoemg3Y0FpSXI5VENVampVV3MyRStFRzJDSnVqUUNaOFNmK292LzlMUworUlpDWjBDWmJTNEI1NG95R3FqUXQzWHEybDJrTlJPRGRLYmFTSzN6WldwOW5NTnl1MGlVcG1BdGdoNkZsaUFSSQorcFByN29VSE54bm1rRjVKSHlMRmFHQnRyMzNGWm5taDhxOS9nR25xRXVqa2Q2eW5Od0VSQ0RWQlppQm9sVm9DbQorc0lvQzVrQlpqYVkvL0krMGRab0JxRHNTT0dVdXBkSUNpeTFkSGVDOE5jMEdJWDc5cFZMTkxhYkNlUWJ4eE9CZworUVROMjVGRUNnWUVBOHZuUnZyNkhxNTNvdHJlUk81UldGUm5wR0MwUVMrblpBckx4dXZhMzNJSzVzck44Q0JiRAorcU15c3pVaUc3VVJIdFF1ZHZHOXVubzJYOGZabXZSeFJwNDJOVG8zeENVWDZIUW1ibzdvMkIxUnZRbkovaytORgorQTlJanFXUzBqem5lS283anBvUmhLUFZvbHViQURHWmg3RTlJUkYrSTBhanlPYXR2NmVPQjBSa0NnWUVBOGNqcgorOUxnODBUU2lZNHYxejBLekZWUm1Zc1VqMk9sa1lxU0Y5WE1USVFHTzJtR244QXBEaC9PenBueENTSzBSakxlUgorV1V1My82cEN4VWpNNGRkT2k4MWhpWDUxZ2t4NlRDMFNaNWpYUFVtK05aVmZrbG44dVltdlhFLzRxU01aVnZubAoraUpuaE9WOHdOZndocmlIUXYyMitPa29ERDFVbDVDdjBHWlppbTFzQ2dZRUE4QkRFbTZIRWlsdkt3ajA4MFpFTworUEdzTlUwV3pCRTVZaThJaDlJZ3Z3VCtvR2xnY0JDSDV6NTNxWGlsNnBwTUFCbkVqdURxaElTYmxLYnc2Wmo3RQorcnJlOUZoQklSdEZNL2NPd2MyUllYWVdmS0JmWTFWV0hxdTdGTFdqQ3ZZQi9jYTBjWURvTGhWeHpxaVR6TzAwdAorRXo2Q09JdnJzcnNxR0xDNk1tMEdwb0VDZ1lFQTIyUVFUdGRhUUE2OWh3eDV1RjV5ZDFsRktqeHVBYVlOczhCTAorMldOWXFTdHJ2MWE3ZHdFcE05UjdZQWNDY2tXd1Zmby9oa0pCckZpSEM5SzZMZmNiUzVuSjltUHNKcFpVcG9pRAorV2NPREV4YTE1Sk1zekhTZzhJNHhzOWJROEZCcjd0TUVad1lTS3VmbnJDU2pQd2xxRERsOVVoRFVZL1pFVXAxYgorZWxoT0UxOENnWUVBcHJrVUdTeThKSEIvWTIzVS9EVUVmSEx2VXk5VzFIak9ZWGUvU09MK3ozVFFWM3ZnL0ZWcgorVkpKK1BJVW9TYUhrQ205Vm01SjR1WmFSZjVOaGFqZ0xQS2lJRHh2UjZvZWVVN2tDNFBpNTV2b0o2c3BuQ1MwKworeHA3aGpDTGlGZVdOcU5sRjl5NllDbWFFTStVTFZmdzVXZXJOZWVaczM2VDZpVnU1Q0lpVmdzWT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9zc2wvdGVzdC1jYS9jbGllbnQyLnBmeCBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL2NsaWVudDIucGZ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkN2MyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9jbGllbnQyLnBmeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9zc2wvdGVzdC1jYS9jcmwucGVtIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvY3JsLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2I0MmJhCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvY3JsLnBlbQpAQCAtMCwwICsxLDExIEBACistLS0tLUJFR0lOIFg1MDkgQ1JMLS0tLS0KK01JSUJtRENCZ1RBTkJna3Foa2lHOXcwQkFRVUZBREFvTVE0d0RBWURWUVFLRXdWWWVWTlRUREVXTUJRR0ExVUUKK0F4TU5XSGxUVTB3Z1ZHVnpkQ0JEUVJjTk1EY3hNVEk1TVRrMU1UQTRXaGNOTURnd01USTRNVGsxTVRBNFdqQW8KK01CSUNBUUVYRFRBM01URXlPVEU1TlRBMU4xb3dFZ0lCQXhjTk1EY3hNVEk1TVRrMU1UQXhXakFOQmdrcWhraUcKKzl3MEJBUVVGQUFPQ0FRRUFUb3M3ZHpXeFR4bTUxWmJJNDhMUnNlSGd6Lzk3Nm10L0UxVVo1V29lb0ZNbVc5cUcKK29HbVJleHJmZ3pBQnoxczBTK2ZqdW5TaWJINWxQTjRXTFRUUTV2WS93emJMRkUveXNYTUI4MmI3RVZmMGZkVkMKKzlWMTgwNVhWT2ZTcjVDQllUZFRrMVhROC9paEtIaStURUpNR2dYakM0VjA5cVZyS1ZYTzNkbUQ3MU1BcjRCY3YKK245WlNXblh1QUlFTHlHZlphSHJQalFmOWNHYzFhd3NGZmRCYmttRnJFT3VMM1E3b0tMYWUyb0VOa25TV2NNaHkKK2NKVGtRdXpOSTJId0N6UjJVMVRBNFlVclB1TlRMYVE1OEZpSTBoRUZqVGp0Z3JlTWlycW45TFJPSmpLemIveHMKK0FmaTZwYnJHZWZwa1RaRVpzbmJ2WHhDS2NlajF0UllqQ2Znb0lRPT0KKy0tLS0tRU5EIFg1MDkgQ1JMLS0tLS0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3NzbC90ZXN0LWNhL2luZGV4IGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvaW5kZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0ZjJlZgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL2luZGV4CkBAIC0wLDAgKzEsNCBAQAorUgkwOTExMjgxOTUwMzBaCTA3MTEyOTE5NTA1N1oJMDEJdW5rbm93bgkvTz1YeVNTTC9DTj1zZXJ2ZXIxLnRlc3QKK1YJMDkxMTI4MTk1MDM4WgkJMDIJdW5rbm93bgkvTz1YeVNTTC9DTj1sb2NhbGhvc3QKK1IJMDkxMTI4MTk1MDQyWgkwNzExMjkxOTUxMDFaCTAzCXVua25vd24JL089WHlTU0wvQ049VGVzdCBVc2VyIDEKK1YJMDkxMTI4MTk1MDQ4WgkJMDQJdW5rbm93bgkvTz1YeVNTTC9DTj1UZXN0IFVzZXIgMgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvaW5kZXguYXR0ciBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL2luZGV4LmF0dHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3ZTM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL2luZGV4LmF0dHIKQEAgLTAsMCArMSBAQAordW5pcXVlX3N1YmplY3QgPSBubwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvbmV3Y2VydHMvMDEucGVtIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvbmV3Y2VydHMvMDEucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiN2RjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9uZXdjZXJ0cy8wMS5wZW0KQEAgLTAsMCArMSw3NiBAQAorQ2VydGlmaWNhdGU6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxICgweDEpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IE89WHlTU0wsIENOPVh5U1NMIFRlc3QgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE5vdiAyOSAxOTo1MDozMCAyMDA3IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTm92IDI4IDE5OjUwOjMwIDIwMDkgR01UCisgICAgICAgIFN1YmplY3Q6IE89WHlTU0wsIENOPXNlcnZlcjEudGVzdAorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YzY6Y2E6NDg6NWU6MmI6ZjI6Nzk6NGI6MzI6MGM6Mzg6MDE6ZTE6NGM6CisgICAgICAgICAgICAgICAgICAgIDFjOmQxOjI0OmJiOmVhOmRlOmI4OjJmOmZiOjdhOjAxOmRhOjRiOjNjOjEzOgorICAgICAgICAgICAgICAgICAgICAwYjpkMToxMjpjMDo2OTpkYzpmMzozNzoyYjpmZDpiNzphMzpiNzo0OTpmMjoKKyAgICAgICAgICAgICAgICAgICAgNTc6YzI6NmQ6Zjg6YmU6OTA6ZjY6N2U6ZmE6ODA6Mzc6ODk6MTc6Yjg6NGM6CisgICAgICAgICAgICAgICAgICAgIDg1OjIyOjM2OmY0OjM2OjUxOjlmOjkxOjZiOjQ4OjAxOjllOmJiOmU2OjhlOgorICAgICAgICAgICAgICAgICAgICA5OTpiZTphYjo0NTowMTpjMjo2ZjpmMDowZjphZDoyMjpiYTo4MzowNjozODoKKyAgICAgICAgICAgICAgICAgICAgYWE6YjI6M2M6ZTc6ZjQ6YWE6Yzk6MzI6MzA6MzI6ZGI6MWM6MWE6OTY6ODc6CisgICAgICAgICAgICAgICAgICAgIGViOjJmOjUzOjBkOjk3OjJkOjc1OjNjOmJjOjc1Ojc0OmU1OjA0OjUxOjY3OgorICAgICAgICAgICAgICAgICAgICA0ZTo0ZTo4MTpkMDowMDo0YzpmZjo0NzplNzpjMzpjYToxZjo1ZDoxYzo2NToKKyAgICAgICAgICAgICAgICAgICAgMDA6ODk6MGI6ZDI6Nzg6YTU6ZDM6ZDI6OGY6NWM6Zjg6ZmU6ZTU6NTQ6OWQ6CisgICAgICAgICAgICAgICAgICAgIDY0OjgzOmJjOjEyOmRjOjM4OmNjOmI0OjY4OjNlOjJiOmM2OmI5OmQwOmVmOgorICAgICAgICAgICAgICAgICAgICBiMTplODpiYzpjZjo1YTpiNTpiMzoxZjo0NzowYTpiMTowZjo3OTowNjo5NzoKKyAgICAgICAgICAgICAgICAgICAgNzM6M2I6NzU6ZjA6NmU6MjY6MWQ6MzY6ODg6NGE6ZTk6NjQ6YjY6ZTY6NTg6CisgICAgICAgICAgICAgICAgICAgIGY4OjkyOjEyOmE2OjdjOjA4OmNjOjdiOjY5OjQ3OjZlOmM2OjY1OmFlOmQ4OgorICAgICAgICAgICAgICAgICAgICAzMTozOTozMDozZDpjYTowYTo0YjoyYzpjMjowMTozZTplOTowNTpjNjo2ZToKKyAgICAgICAgICAgICAgICAgICAgMWY6Y2U6Mzg6MjE6MjI6ZjQ6ZjU6MDA6MWU6MTg6MGU6ZDU6NDg6MWE6NmU6CisgICAgICAgICAgICAgICAgICAgIGQ1OjIyOjgyOmFmOmJlOjA5OmE3OjQ3OjAzOjBiOmQzOjRkOjUyOjVlOjM0OgorICAgICAgICAgICAgICAgICAgICBkMToxNQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOkZBTFNFCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgRjc6QUI6RTc6QzA6NTg6NUY6RTA6MDE6QzU6QTQ6MjY6ODM6NDQ6Q0M6MUU6N0E6OTE6Qzk6NDQ6NjUKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOkYyOjY3OkIxOjVEOjVGOjUxOjVFOkRBOjUxOjg5OkU5OkQ5OkU5OjZCOkNBOjhCOkFGOkE1OjJFOjY5CisKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMDY6OWI6OGQ6NjM6OGM6YmI6OGE6MmI6MWE6ODc6YWU6M2E6Mjc6MzQ6YmM6MjQ6NjA6ZjA6CisgICAgICAgIDk1OjEyOjBlOmY1OjRjOmU2OmU0OjFmOmJkOmUyOjgzOmEzOmQ0OjFlOmRkOmVkOjhlOmMxOgorICAgICAgICA5MzpiYzplNjoyMDo5NjozNDo2NTo3MzphYzpiYjo4NTo2NDo1NDo0OTo1Mzo4MjpkYToyNzoKKyAgICAgICAgOGQ6ODY6ZTU6YTM6MTI6YTU6YjY6OGU6YzY6NDA6ODc6MGI6MWE6YTQ6MDI6ZmU6NDc6YTk6CisgICAgICAgIGJmOjM2OjM5OmIxOjU0OmE3OjYzOjFmOjkyOmIyOjFhOjRmOjllOjA1Ojk4OmU2OmY1OmIxOgorICAgICAgICAxNjpmYjo0NzpiYjo1NzoxZjozMTozNTo4ZTpmODozNjpkMTozNjo0ODo2YToyNTpjODowZToKKyAgICAgICAgMWM6M2Q6MDI6OTA6Y2Q6Y2Q6MWU6Njg6ZDI6YWY6MDk6ZTI6Njk6NTE6Y2U6M2E6MTE6Njc6CisgICAgICAgIDIwOjQwOjQ0OmM5OjlhOjRkOjljOjNjOmFmOjA3OjIyOmRjOjk5Ojc3OjcxOjQwOjQ2OmQ3OgorICAgICAgICBmZTozYzowMDozMDpmYzo2Nzo1MDo4OTo3MzphYTowNDo0YzplZjplMjo0NDpjMToyZTo4ODoKKyAgICAgICAgODM6ODk6ODM6ODA6NDc6ODg6NDc6Y2E6MWI6ZGI6Njc6N2U6ZTc6YTg6MGE6NTQ6Yjg6NzI6CisgICAgICAgIGY0Ojk2OjNmOmViOmMxOmJhOjIxOmMxOmZlOjA3OmViOmNlOjRkOmIwOjgwOmQ2OmQ5OmNmOgorICAgICAgICAyZDplOTo4ZTpjMjoyZjo2ZjpjYzo4YjphOToxMzpmZDo0ODo1MDo1ZToyZjo4NjpjZDo5ZToKKyAgICAgICAgOGI6YWQ6MTY6N2Y6Njk6YWI6Yjc6N2I6N2Y6YzY6ZDg6NDk6Zjg6MDY6ZDA6OGE6Mzc6NzE6CisgICAgICAgIDc1OmQ4OjRmOjNmOjAyOjI5OjNlOjllOjI5OmNjOmY2OmU3OmMzOjEwOjQyOjc3OjZjOjM0OgorICAgICAgICA2MzpmMzpiZTo1NworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlERnpDQ0FmK2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURBb01RNHdEQVlEVlFRS0V3VlllVk5UCitUREVXTUJRR0ExVUVBeE1OV0hsVFUwd2dWR1Z6ZENCRFFUQWVGdzB3TnpFeE1qa3hPVFV3TXpCYUZ3MHdPVEV4CitNamd4T1RVd016QmFNQ2N4RGpBTUJnTlZCQW9UQlZoNVUxTk1NUlV3RXdZRFZRUURFd3h6WlhKMlpYSXhMblJsCitjM1F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREd5a2hlSy9KNVN6SU1PQUhoCitUQnpSSkx2cTNyZ3YrM29CMmtzOEV3dlJFc0JwM1BNM0svMjNvN2RKOGxmQ2JmaStrUForK29BM2lSZTRUSVVpCitOdlEyVVorUmEwZ0JucnZtanBtK3EwVUJ3bS93RDYwaXVvTUdPS3F5UE9mMHFza3lNRExiSEJxV2grc3ZVdzJYCitMWFU4dkhWMDVRUlJaMDVPZ2RBQVRQOUg1OFBLSDEwY1pRQ0pDOUo0cGRQU2oxejQvdVZVbldTRHZCTGNPTXkwCithRDRyeHJuUTc3SG92TTlhdGJNZlJ3cXhEM2tHbDNNN2RmQnVKaDAyaUVycFpMYm1XUGlTRXFaOENNeDdhVWR1Cit4bVd1MkRFNU1EM0tDa3Nzd2dFKzZRWEdiaC9PT0NFaTlQVUFIaGdPMVVnYWJ0VWlncSsrQ2FkSEF3dlRUVkplCitOTkVWQWdNQkFBR2pUVEJMTUFrR0ExVWRFd1FDTUFBd0hRWURWUjBPQkJZRUZQZXI1OEJZWCtBQnhhUW1nMFRNCitIbnFSeVVSbE1COEdBMVVkSXdRWU1CYUFGUEpuc1YxZlVWN2FVWW5wMmVscnlvdXZwUzVwTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0SUJBUUFHbTQxampMdUtLeHFIcmpvbk5Md2tZUENWRWc3MVRPYmtINzNpZzZQVUh0M3Rqc0dUCit2T1lnbGpSbGM2eTdoV1JVU1ZPQzJpZU5odVdqRXFXMmpzWkFod3NhcEFMK1I2bS9Oam14Vktkakg1S3lHaytlCitCWmptOWJFVyswZTdWeDh4Tlk3NE50RTJTR29seUE0Y1BRS1F6YzBlYU5LdkNlSnBVYzQ2RVdjZ1FFVEptazJjCitQSzhISXR5WmQzRkFSdGYrUEFBdy9HZFFpWE9xQkV6djRrVEJMb2lEaVlPQVI0aEh5aHZiWjM3bnFBcFV1SEwwCitsai9yd2JvaHdmNEg2ODVOc0lEVzJjOHQ2WTdDTDIvTWk2a1QvVWhRWGkrR3paNkxyUlovYWF1M2UzL0cyRW40CitCdENLTjNGMTJFOC9BaWsrbmluTTl1ZkRFRUozYkRSajg3NVgKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3NzbC90ZXN0LWNhL25ld2NlcnRzLzAyLnBlbSBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL25ld2NlcnRzLzAyLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmIwNmY3Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvbmV3Y2VydHMvMDIucGVtCkBAIC0wLDAgKzEsNzYgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMiAoMHgyKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBPPVh5U1NMLCBDTj1YeVNTTCBUZXN0IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBOb3YgMjkgMTk6NTA6MzggMjAwNyBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE5vdiAyOCAxOTo1MDozOCAyMDA5IEdNVAorICAgICAgICBTdWJqZWN0OiBPPVh5U1NMLCBDTj1sb2NhbGhvc3QKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmNjOmQ0OjU2OjM4OjQ5OmU2OmQ2OjdmOjUwOmU3OmQyOjA1OmM4Ojk5OgorICAgICAgICAgICAgICAgICAgICAyNTozMjo0NTo3MTpkZDoxYzplMTo3MjozZDo2ODo5NDpjMDo2ODplMjoyZToKKyAgICAgICAgICAgICAgICAgICAgOTU6OTQ6ODc6MDM6NWI6ZmM6NzA6Njk6YzQ6YjM6YTA6OTQ6ZTY6NzE6MDI6CisgICAgICAgICAgICAgICAgICAgIDE4OmIxOjAwOjViOmJkOjkwOmVlOjA4OmQwOmNkOjMzOmQyOmZiOjVlOmNhOgorICAgICAgICAgICAgICAgICAgICBkNjpjMjo1ODplZDpmMDo1MTpiNzo1NDphYzphNDo5OToyMjo4YjphMzowNzoKKyAgICAgICAgICAgICAgICAgICAgYmI6ZDc6NDE6MTQ6ZGU6MGE6NWE6OTI6OWQ6MmQ6MDg6MWM6NWY6YmY6OWI6CisgICAgICAgICAgICAgICAgICAgIGRjOjAyOmJiOmMyOmNhOjA2OmI4OmYyOjhkOjA0OjY3OjUyOmNhOjljOjNhOgorICAgICAgICAgICAgICAgICAgICAxNTphMzpiYTozMDoyZjo1MTowNzo0ZDo4Yzo2OTo1Yzo4Yzo5Zjo0MTo1NjoKKyAgICAgICAgICAgICAgICAgICAgMDM6Y2E6YjQ6ODg6Yjg6Y2U6MGY6ZjA6Mjg6Njc6MTk6ZGQ6NGM6OTY6NjQ6CisgICAgICAgICAgICAgICAgICAgIDhkOjFjOjA3OmIyOmM2OmNiOjU4OmJmOmQ5OjJiOjQyOjM5OmVkOjI4OjgwOgorICAgICAgICAgICAgICAgICAgICAzMDo2MToyMzowZTo5NTpkNzoyNzoxMTo2Zjo3ZTpiYzpiYzo3Yjo3MzowMToKKyAgICAgICAgICAgICAgICAgICAgYzM6OWE6NTY6ZmI6ZTY6YWU6ODg6YTg6OTY6NWE6MGY6YmI6YTU6YjE6OWQ6CisgICAgICAgICAgICAgICAgICAgIGQ1OjRhOjc0OjAwOjI2OjY4OjA4OjNkOjY3OjkyOjQ5OjU4OmFiOmUyOjZhOgorICAgICAgICAgICAgICAgICAgICAwMDo0NTo4MzozYjplMTplMzplNjpjNzoyYzpjMDo0MDpiOTpjYTo2ODowYjoKKyAgICAgICAgICAgICAgICAgICAgYTQ6OGY6YmE6NmQ6NTM6YWY6NmY6N2E6NTc6ODQ6NGY6ZDg6YjA6YWU6MGM6CisgICAgICAgICAgICAgICAgICAgIGNlOjIzOjFiOjI1OjMyOjEzOmI2OjNhOjk3Ojc0OmNhOmFmOjJjOjk2Ojc2OgorICAgICAgICAgICAgICAgICAgICAzNDpiMjoyNDo2ZTozOTo0NToxMzplYzpiZToxNjpkYjpiODo0MTo3MTowNjoKKyAgICAgICAgICAgICAgICAgICAgMDA6ZWQKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpGQUxTRQorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIEIxOkIwOkVBOjMxOjlEOjVDOjRGOjAwOjdGOkNEOjBEOjFGOjc4OkE5OjE4OjVEOjk2OkRFOkFBOkIxCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDpGMjo2NzpCMTo1RDo1Rjo1MTo1RTpEQTo1MTo4OTpFOTpEOTpFOTo2QjpDQTo4QjpBRjpBNToyRTo2OQorCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDJiOjlmOjVkOmY3OjhjOjQyOjg5OjQ1OmQ5OjE5OjZmOmQxOjg3OjcxOmM3Ojc0OmVjOjEzOgorICAgICAgICBjMTpjMzo3ZDo1MTpiNTo2ZDpjMzpmODpmNDpjYzo4YTpkNTozYjplZTo1OTowZTowYjpiODoKKyAgICAgICAgYmY6N2Y6YTM6NGE6Njk6Y2I6ZWE6NTQ6ZmM6NTg6OTg6MzQ6MDU6MGE6NjI6YWE6NzM6NjE6CisgICAgICAgIGYyOjE1OjhjOjIwOjkzOjYxOjBiOjlmOmZkOjY0OmQxOjdkOjg3OmIzOmU1OjQzOjFiOjcxOgorICAgICAgICAzNjpiNDo0YzpiMToxOTozODowNDozNTplNzpmNjo1MjplNTozYzpkMDphNToyZDo1NTo5OToKKyAgICAgICAgOWU6NWI6ZGY6ZDU6NjA6NmM6NTk6YWM6ZTQ6Zjc6NGU6Zjc6NTU6Y2U6ZGE6MWM6OWM6NWU6CisgICAgICAgIDM1OmE4OmQ1OjQxOjQ3OjA5OmUwOmRmOjdkOjc1OjdlOjhlOjQxOjJjOjkzOjM0OmJmOmQyOgorICAgICAgICA1ZTo1YjoxNToxNTowNTowMjo0ZDoyNDoxZTpjNDo1YjowMzo1MjphYjowYTphYzo2ZDo3MjoKKyAgICAgICAgMDA6M2M6ZGU6Zjk6MGY6ODQ6NzM6ZGM6YjI6ZTY6NTI6NmM6ODI6YWY6MjY6OTc6NWE6NTg6CisgICAgICAgIDUwOjg5OmEzOmM3OmQ5OjVkOmE1OjhhOjNjOmUwOmU4OjNlOjYzOmViOjRmOmZmOmZkOjQ1OgorICAgICAgICBiMjplYzphMTpmYjo0NTowMzowZjozNzpkMDphMTo4ZDo0MjpiZjoyMzo5MTo2NjoyZTowOToKKyAgICAgICAgNjE6MTg6M2U6NWI6ZTc6Yjc6ZTQ6NmU6ZTA6MmQ6ODg6MGQ6YzI6MmE6ZTY6MTk6ZmE6MzU6CisgICAgICAgIDA1OjBkOjhiOmE0OmYzOmZiOjA1OjU0Ojk4Ojg3OjY2OjVhOmEyOmYzOjU2OmI1OjM5OjdjOgorICAgICAgICAxYzoyODo1MDowNjo0YTozYzo2MDo1YTplODplYzoxOTo0ZTo3ZTpjZDpiMTo1Njo1ZTphMzoKKyAgICAgICAgNGQ6Zjg6NmM6NzIKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREZEQ0NBZnlnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFVRkFEQW9NUTR3REFZRFZRUUtFd1ZZZVZOVAorVERFV01CUUdBMVVFQXhNTldIbFRVMHdnVkdWemRDQkRRVEFlRncwd056RXhNamt4T1RVd016aGFGdzB3T1RFeAorTWpneE9UVXdNemhhTUNReERqQU1CZ05WQkFvVEJWaDVVMU5NTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2YzNRdworZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRE0xRlk0U2ViV2YxRG4wZ1hJbVNVeQorUlhIZEhPRnlQV2lVd0dqaUxwV1Vod05iL0hCcHhMT2dsT1p4QWhpeEFGdTlrTzRJME0wejB2dGV5dGJDV08zdworVWJkVXJLU1pJb3VqQjd2WFFSVGVDbHFTblMwSUhGKy9tOXdDdThMS0JyanlqUVJuVXNxY09oV2p1akF2VVFkTgorakdsY2pKOUJWZ1BLdElpNHpnL3dLR2NaM1V5V1pJMGNCN0xHeTFpLzJTdENPZTBvZ0RCaEl3NlYxeWNSYjM2OAordkh0ekFjT2FWdnZtcm9pb2xsb1B1Nld4bmRWS2RBQW1hQWc5WjVKSldLdmlhZ0JGZ3p2aDQrYkhMTUJBdWNwbworQzZTUHVtMVRyMjk2VjRSUDJMQ3VETTRqR3lVeUU3WTZsM1RLcnl5V2RqU3lKRzQ1UlJQc3ZoYmJ1RUZ4QmdEdAorQWdNQkFBR2pUVEJMTUFrR0ExVWRFd1FDTUFBd0hRWURWUjBPQkJZRUZMR3c2akdkWEU4QWY4ME5IM2lwR0YyVworM3FxeE1COEdBMVVkSXdRWU1CYUFGUEpuc1YxZlVWN2FVWW5wMmVscnlvdXZwUzVwTUEwR0NTcUdTSWIzRFFFQgorQlFVQUE0SUJBUUFybjEzM2pFS0pSZGtaYjlHSGNjZDA3QlBCdzMxUnRXM0QrUFRNaXRVNzdsa09DN2kvZjZOSworYWN2cVZQeFltRFFGQ21LcWMySHlGWXdnazJFTG4vMWswWDJIcytWREczRTJ0RXl4R1RnRU5lZjJVdVU4MEtVdAorVlptZVc5L1ZZR3hack9UM1R2ZFZ6dG9jbkY0MXFOVkJSd25nMzMxMWZvNUJMSk0wdjlKZVd4VVZCUUpOSkI3RQorV3dOU3F3cXNiWElBUE43NUQ0UnozTExtVW15Q3J5YVhXbGhRaWFQSDJWMmxpanpnNkQ1ajYwLy8vVVd5N0tINworUlFNUE45Q2hqVUsvSTVGbUxnbGhHRDViNTdma2J1QXRpQTNDS3VZWitqVUZEWXVrOC9zRlZKaUhabHFpODFhMQorT1h3Y0tGQUdTanhnV3Vqc0dVNSt6YkZXWHFOTitHeHkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3NzbC90ZXN0LWNhL25ld2NlcnRzLzAzLnBlbSBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL25ld2NlcnRzLzAzLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzliYmVhCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvbmV3Y2VydHMvMDMucGVtCkBAIC0wLDAgKzEsNzYgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMyAoMHgzKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBPPVh5U1NMLCBDTj1YeVNTTCBUZXN0IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBOb3YgMjkgMTk6NTA6NDIgMjAwNyBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE5vdiAyOCAxOTo1MDo0MiAyMDA5IEdNVAorICAgICAgICBTdWJqZWN0OiBPPVh5U1NMLCBDTj1UZXN0IFVzZXIgMQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YTc6MmI6ZTk6YzM6ZDU6Njg6N2M6ZTc6NGI6MjM6MjA6MzE6Yzg6MGU6CisgICAgICAgICAgICAgICAgICAgIGJlOjlmOmM4OmU2OmI2OmE3OjA5OmM1OjU5OjY3OmFiOjZkOmU5OmYzOjdlOgorICAgICAgICAgICAgICAgICAgICBiMjplNzozYjoxYzo5OToyODozMzplMDpiODplOTo4YjplZTo0NTphMzpkZToKKyAgICAgICAgICAgICAgICAgICAgOTE6Zjg6MDM6NTk6MzQ6ZjE6YjY6ZTA6YjM6NjI6MzM6NDU6ODc6NjQ6OGU6CisgICAgICAgICAgICAgICAgICAgIDU5OmQzOjM0OjRmOmY5OmZiOjNjOjY0OjUzOmEyOmYyOjUzOjIwOjk3OmEzOgorICAgICAgICAgICAgICAgICAgICAyYjpmZTo2ZDpjNDpmMzozODo4MzowMjo5MjpjODpjYjo4Zjo5ZTpkOTpkMzoKKyAgICAgICAgICAgICAgICAgICAgNWU6ODc6MzY6ZWM6MTc6YjM6NTA6NWI6Njg6Yjc6MDM6MDQ6ZTI6OTA6MmY6CisgICAgICAgICAgICAgICAgICAgIGQ0OjBlOjQ4OjQwOmIxOmFkOjExOjI4OmRlOjhhOmE5OjRjOmRmOjIwOjA1OgorICAgICAgICAgICAgICAgICAgICA0Nzo4YTplZjpiYToyNDowOTpmYTplYzpmNjpkNDpmMTowZjphMTozMTpiNzoKKyAgICAgICAgICAgICAgICAgICAgZjA6NTQ6ZDU6ZDU6MjM6MTk6MWU6NDE6NmQ6Yjc6OTY6MTc6ODE6ZmY6YjM6CisgICAgICAgICAgICAgICAgICAgIDFlOjgzOjkyOjc2OjRiOjdjOmNlOmIxOjhmOjE4OmIwOjY5OjIwOjYwOmY5OgorICAgICAgICAgICAgICAgICAgICA0MTo4YjowNDphZTo4OTo4NDphODoyMDo0ODphZTpmMzoxZjo1MDplYzoxYzoKKyAgICAgICAgICAgICAgICAgICAgNjE6OTc6YmQ6ODE6NTA6NTQ6NjE6NWQ6MjM6YzM6YzI6ODQ6ZWQ6MTk6MWI6CisgICAgICAgICAgICAgICAgICAgIGVlOjBmOjIyOjM4OjI4OmRlOjUxOjA0OjQxOjZkOmUxOjgyOjQzOjc2OmU3OgorICAgICAgICAgICAgICAgICAgICA3Yjo0MDpmZDo4NDplYTo5ZTplODpkODpkYTpjMjo3MjpjNDozMTpjNjpiMDoKKyAgICAgICAgICAgICAgICAgICAgY2E6Y2U6YWM6N2I6NWM6ZmE6NDM6MTU6NWY6NDE6MWM6MjE6YmU6ZGM6OTY6CisgICAgICAgICAgICAgICAgICAgIDk1OmQ2Ojc3OjE2OmVmOjFkOjUxOjhkOjEwOjY1OmFhOmY1OjllOmY4OjQ3OgorICAgICAgICAgICAgICAgICAgICA2YTo0MQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOkZBTFNFCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgRjI6QzQ6OTY6MDI6Q0Y6QkY6QzE6QUE6QjA6RDI6MUE6REE6RTc6RjM6NEI6MkM6NUQ6RDE6REY6MTQKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOkYyOjY3OkIxOjVEOjVGOjUxOjVFOkRBOjUxOjg5OkU5OkQ5OkU5OjZCOkNBOjhCOkFGOkE1OjJFOjY5CisKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgY2E6Mjk6M2Y6NDQ6OTA6OGQ6OWM6YzY6MGQ6Zjk6ZTI6YTk6NTA6ZDg6ZTU6ZDY6MGE6ZTA6CisgICAgICAgIGJlOjZlOjQ4OmZiOmU4OjdhOmY0OjVmOjUwOmRjOjZiOmQxOjc2OmE1OmY5Ojg4OjkxOjk2OgorICAgICAgICA2MjplNTo2Njo4OTpkYTplYjoxNzowMTpmNzpkMDpkMjpmNzozYjozNTo3ODpkZDo4MDo0NToKKyAgICAgICAgZDA6NjQ6MzI6MTM6Njc6MjA6YTg6ZmM6ZDg6NjI6ZTE6NDQ6ZDQ6YWU6NDE6Mzc6MmU6ZTc6CisgICAgICAgIDYzOjk0OjM3OjY2OjYxOjNiOjM4OmU5OjdkOjhhOmI2OjE4OmQ0OmI3OjJjOjU5OmVhOjQ2OgorICAgICAgICBhMDplZDphYjo4NDo3OTowNDpiZTpkYTowZjo5ZToyZDo2ODozNDphMDowNjo2MzpmYTozMzoKKyAgICAgICAgNjE6YmM6OGE6MDA6MDc6NjI6YzM6ODE6MTE6MGQ6Mjg6ZDk6ODA6OGY6NTE6YTI6ZGI6YmU6CisgICAgICAgIDIzOjE2OmE0OjM3OjY1OjE4OjcyOjM0OjE3OmMyOmE5OjYzOmUzOjVmOmY0OjBlOjdjOjU4OgorICAgICAgICA1ZTplNDphNTo0NDo4Zjo2YjoyMzpiYToxODo0ZTplMzowYzoyNToyYTo4NjplZTo1ZDpjMjoKKyAgICAgICAgYTI6ZTc6OTI6OGQ6YTg6ODQ6Nzc6ZWY6YjU6OWM6YWY6MmM6NTM6NWQ6NGM6MWI6ZWI6OTY6CisgICAgICAgIGE0OjU2OjI3OmY1OmJmOmNiOjgyOjkxOjUxOjZlOjhhOmY0OjQ5OjZhOjg0OjM5OjQ0OmEzOgorICAgICAgICAyMzo3ZTpkMDo4MzpjZToyYjo0YTo1ZjoxODoxYjpkMToxZjo3NDoxNDo2Zjo5MTpkYToxYToKKyAgICAgICAgZWU6OTU6MWQ6ZWU6Yzc6OWU6Nzc6YTI6ZGY6MWM6MjI6NzI6YzI6MDg6YmM6OTg6NjA6YTA6CisgICAgICAgIGQ2OjVmOmViOmQ4OmU4OmFkOmIzOmY1OjA1OmM0OjFhOjliOmE5OjhkOjI5OjgzOjdlOjI2OgorICAgICAgICA2MjpmYTplMzo3OQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlERmpDQ0FmNmdBd0lCQWdJQkF6QU5CZ2txaGtpRzl3MEJBUVVGQURBb01RNHdEQVlEVlFRS0V3VlllVk5UCitUREVXTUJRR0ExVUVBeE1OV0hsVFUwd2dWR1Z6ZENCRFFUQWVGdzB3TnpFeE1qa3hPVFV3TkRKYUZ3MHdPVEV4CitNamd4T1RVd05ESmFNQ1l4RGpBTUJnTlZCQW9UQlZoNVUxTk1NUlF3RWdZRFZRUURFd3RVWlhOMElGVnpaWElnCitNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLY3I2Y1BWYUh6blN5TWdNY2dPCit2cC9JNXJhbkNjVlpaNnR0NmZOK3N1YzdISmtvTStDNDZZdnVSYVBla2ZnRFdUVHh0dUN6WWpORmgyU09XZE0wCitUL243UEdSVG92SlRJSmVqSy81dHhQTTRnd0tTeU11UG50blRYb2MyN0JlelVGdG90d01FNHBBdjFBNUlRTEd0CitFU2plaXFsTTN5QUZSNHJ2dWlRSit1ejIxUEVQb1RHMzhGVFYxU01aSGtGdHQ1WVhnZit6SG9PU2RrdDh6ckdQCitHTEJwSUdENVFZc0Vyb21FcUNCSXJ2TWZVT3djWVplOWdWQlVZVjBqdzhLRTdSa2I3ZzhpT0NqZVVRUkJiZUdDCitRM2JuZTBEOWhPcWU2Tmphd25MRU1jYXd5czZzZTF6NlF4VmZRUndodnR5V2xkWjNGdThkVVkwUVphcjFudmhICitha0VDQXdFQUFhTk5NRXN3Q1FZRFZSMFRCQUl3QURBZEJnTlZIUTRFRmdRVThzU1dBcysvd2FxdzBocmE1L05MCitMRjNSM3hRd0h3WURWUjBqQkJnd0ZvQVU4bWV4WFY5Ulh0cFJpZW5aNld2S2k2K2xMbWt3RFFZSktvWklodmNOCitBUUVGQlFBRGdnRUJBTW9wUDBTUWpaekdEZm5pcVZEWTVkWUs0TDV1U1B2b2V2UmZVTnhyMFhhbCtZaVJsbUxsCitab25hNnhjQjk5RFM5enMxZU4yQVJkQmtNaE5uSUtqODJHTGhSTlN1UVRjdTUyT1VOMlpoT3pqcGZZcTJHTlMzCitMRm5xUnFEdHE0UjVCTDdhRDU0dGFEU2dCbVA2TTJHOGlnQUhZc09CRVEwbzJZQ1BVYUxidmlNV3BEZGxHSEkwCitGOEtwWStOZjlBNThXRjdrcFVTUGF5TzZHRTdqRENVcWh1NWR3cUxua28yb2hIZnZ0Wnl2TEZOZFRCdnJscVJXCitKL1cveTRLUlVXNks5RWxxaERsRW95TiswSVBPSzBwZkdCdlJIM1FVYjVIYUd1NlZIZTdIbm5laTN4d2ljc0lJCit2Smhnb05aZjY5am9yYlAxQmNRYW02bU5LWU4rSm1MNjQzaz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3NzbC90ZXN0LWNhL25ld2NlcnRzLzA0LnBlbSBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL25ld2NlcnRzLzA0LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGE5MGNhCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvbmV3Y2VydHMvMDQucGVtCkBAIC0wLDAgKzEsNzYgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNCAoMHg0KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBPPVh5U1NMLCBDTj1YeVNTTCBUZXN0IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBOb3YgMjkgMTk6NTA6NDggMjAwNyBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE5vdiAyOCAxOTo1MDo0OCAyMDA5IEdNVAorICAgICAgICBTdWJqZWN0OiBPPVh5U1NMLCBDTj1UZXN0IFVzZXIgMgorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZTU6N2I6ZTE6OTQ6MDY6ZTU6ZGQ6MjA6MGE6MGQ6NmE6NGY6OWU6MmM6CisgICAgICAgICAgICAgICAgICAgIDQzOmVhOjc0OmY4OmFmOjkwOmFiOjYwOjdlOjQ1OjE3OjI3OmQ5OjFiOjFkOgorICAgICAgICAgICAgICAgICAgICA5MDo0NDo5Nzo0Mjo0NTo2NzoyMjozMjpkNTplYjo5Nzo0ZTo3NjplZjo0NToKKyAgICAgICAgICAgICAgICAgICAgOTk6M2Y6ODA6Mjk6YzU6NDU6OTQ6N2Q6NDM6YzA6MGI6MDE6YmQ6YWM6OWM6CisgICAgICAgICAgICAgICAgICAgIDlkOmNmOmZmOjNmOmVhOjFlOjA0OjFjOjJhOjcwOjk0OmZmOjZiOmQxOjYzOgorICAgICAgICAgICAgICAgICAgICA2ZjpjZDpiMDo1ZjoxZDpiZjpkNjo0NTpmMjplMTozMjoxNzoxODo4NzpiNDoKKyAgICAgICAgICAgICAgICAgICAgNzk6Mzk6NTI6MDE6MjM6NTA6NWQ6OGQ6MTA6ODk6MDI6Yzc6ZTg6YTg6Njc6CisgICAgICAgICAgICAgICAgICAgIGE1OjE0OjQxOjBmOjFhOmQ3OjI1OjJiOjkxOmY4OjZhOmM2OjVkOmUzOmIwOgorICAgICAgICAgICAgICAgICAgICBmZTozMDo3Yzo0Nzo1Njo5NTo5MzplMTplODplNDo3NDplNToxZjpiZjowMDoKKyAgICAgICAgICAgICAgICAgICAgMzI6NDk6OGU6Zjc6MWQ6Mjk6MDc6Njg6NGM6OGU6Y2E6NmY6ODQ6OTY6Mzc6CisgICAgICAgICAgICAgICAgICAgIDM3OjNkOmVlOjkyOjFkOjE1OmIzOjE4OjMwOmVmOmEwOjQ2OmIxOjZlOjdiOgorICAgICAgICAgICAgICAgICAgICBlYzpkNDphNjoyNzo4ZDoxMTpmOTozNTozMTo5Yzo5MTowNDpjODplMjo4YToKKyAgICAgICAgICAgICAgICAgICAgYWM6NGY6Y2I6YjQ6NDk6YjA6OTI6MmI6ODI6NTk6NGU6Njk6MDA6NjI6NTE6CisgICAgICAgICAgICAgICAgICAgIDRmOjVkOjEwOjcyOjU0OjAzOjVjOjI0OjM5OjhhOmZiOjM5OjZiOmMxOmRhOgorICAgICAgICAgICAgICAgICAgICA4NDoxMDoxNTpjMzowNDpjYjozMToyNjo5MTpiODowYTpiMTpiNTozMjo2OToKKyAgICAgICAgICAgICAgICAgICAgZWM6MGY6NjQ6YTc6NTE6NTM6ZGM6NjQ6MTM6YjE6YzI6ZWM6ZmM6NTU6MGE6CisgICAgICAgICAgICAgICAgICAgIGQ4OmY1OjIyOmU3OmM0OmQ5OjRmOjczOjhkOjg1OmI2OmNjOjhiOjJhOjUxOgorICAgICAgICAgICAgICAgICAgICA3NjplMworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOkZBTFNFCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNzI6QTk6NTU6MDk6MTM6QTY6NjE6MUU6MUQ6OUY6MDA6QkE6QUY6OTM6RDk6OEQ6Njk6ODY6MUQ6MjAKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOkYyOjY3OkIxOjVEOjVGOjUxOjVFOkRBOjUxOjg5OkU5OkQ5OkU5OjZCOkNBOjhCOkFGOkE1OjJFOjY5CisKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNjg6MzI6OWM6YzU6ZWE6MTU6MDM6YTM6MmE6NWI6ZTA6M2I6ZWY6MDI6NzI6NzI6NWU6NWY6CisgICAgICAgIDU3OmIzOjMyOjFmOmE4OjQ2OjkzOjMzOjM4Ojc1OjkyOjVmOjQxOmUzOjk5Ojk3OjNhOmYyOgorICAgICAgICAwZDo3ZDoyYjo3MTo4MTozMTphNzpmZjoxNToyODplODpmMTpmZTpkNDpjMTo4MzoyYjowYjoKKyAgICAgICAgMWE6MWI6NmM6YjM6ODE6MDE6ZTE6NGM6Nzc6NTE6OGI6MDk6MmQ6N2Y6ZGE6NTI6MmM6ZjU6CisgICAgICAgIDllOjM4OmE3OjU5OmI4OmNjOmRjOmY1OjQyOmQ0OjNmOjdmOjIyOjk2OjdlOjRhOjg5OmYwOgorICAgICAgICBjYzo2ZTo3NzpmMDplZTo3OTpkMzo4MjoyMDo3YTowYzoxNzplMjpjODoxNDo3Nzo4MTpjZDoKKyAgICAgICAgYmY6MzQ6Mjc6NzY6N2M6YzI6ZWI6NGY6OTM6ZGQ6MGE6YTM6ZWU6MmU6Yjk6ZjY6OGE6ZDI6CisgICAgICAgIDdmOjBiOmYwOjY5OjBmOjkwOjA1OjZlOmQ2OmNhOjIzOjkxOjZkOjM4OjY4OjI4OjJiOmM3OgorICAgICAgICAyZDo5OToxNzpjNzoyYToxYjphNjoxYjo3ODplYTo2ODo1NjpjYjoyZTo4MzpkNDo5ODo1NDoKKyAgICAgICAgMWY6YTU6Nzc6Y2Q6ODg6NTk6OWM6YmQ6YTI6ODg6NzA6NGU6ZjQ6Njg6ZjA6MGU6NzA6NDU6CisgICAgICAgIDljOmMwOmVmOmQ0OjQ4OmYwOjE0OmNjOjI0OmI1OjQ3OjQwOjA4OjA3OjJmOmRmOjc4OjBiOgorICAgICAgICAwYjo1MDpmNjo0OTo4NTo0MTo4Yzo0ODoxMjo3ODozYTo2Nzo2NzpkOTo4MjowOTowZjo1NDoKKyAgICAgICAgYTU6ZmU6MTQ6N2M6ZDQ6MjE6NjA6YTI6NDU6MmI6ZWE6OTc6ZGY6Mzg6Y2M6ZjU6NWE6Y2Q6CisgICAgICAgIDRkOjYyOjVhOmExOmNmOjUxOmNiOjkzOjM2OjJlOmM3OjE3OmVjOjc3Ojg5OjA2OmYyOmM5OgorICAgICAgICA1NTo3MDo5NjpmMworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlERmpDQ0FmNmdBd0lCQWdJQkJEQU5CZ2txaGtpRzl3MEJBUVVGQURBb01RNHdEQVlEVlFRS0V3VlllVk5UCitUREVXTUJRR0ExVUVBeE1OV0hsVFUwd2dWR1Z6ZENCRFFUQWVGdzB3TnpFeE1qa3hPVFV3TkRoYUZ3MHdPVEV4CitNamd4T1RVd05EaGFNQ1l4RGpBTUJnTlZCQW9UQlZoNVUxTk1NUlF3RWdZRFZRUURFd3RVWlhOMElGVnpaWElnCitNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPVjc0WlFHNWQwZ0NnMXFUNTRzCitRK3AwK0srUXEyQitSUmNuMlJzZGtFU1hRa1ZuSWpMVjY1ZE9kdTlGbVQrQUtjVkZsSDFEd0FzQnZheWNuYy8vCitQK29lQkJ3cWNKVC9hOUZqYjgyd1h4Mi8xa1h5NFRJWEdJZTBlVGxTQVNOUVhZMFFpUUxINktobnBSUkJEeHJYCitKU3VSK0dyR1hlT3cvakI4UjFhVmsrSG81SFRsSDc4QU1rbU85eDBwQjJoTWpzcHZoSlkzTnozdWtoMFZzeGd3Cis3NkJHc1c1NzdOU21KNDBSK1RVeG5KRUV5T0tLckUvTHRFbXdraXVDV1U1cEFHSlJUMTBRY2xRRFhDUTVpdnM1CithOEhhaEJBVnd3VExNU2FSdUFxeHRUSnA3QTlrcDFGVDNHUVRzY0xzL0ZVSzJQVWk1OFRaVDNPTmhiYk1peXBSCitkdU1DQXdFQUFhTk5NRXN3Q1FZRFZSMFRCQUl3QURBZEJnTlZIUTRFRmdRVWNxbFZDUk9tWVI0ZG53QzZyNVBaCitqV21HSFNBd0h3WURWUjBqQkJnd0ZvQVU4bWV4WFY5Ulh0cFJpZW5aNld2S2k2K2xMbWt3RFFZSktvWklodmNOCitBUUVGQlFBRGdnRUJBR2d5bk1YcUZRT2pLbHZnTys4Q2NuSmVYMWV6TWgrb1JwTXpPSFdTWDBIam1aYzY4ZzE5CitLM0dCTWFmL0ZTam84ZjdVd1lNckN4b2JiTE9CQWVGTWQxR0xDUzEvMmxJczlaNDRwMW00ek56MVF0US9meUtXCitma3FKOE14dWQvRHVlZE9DSUhvTUYrTElGSGVCemI4MEozWjh3dXRQazkwS28rNHV1ZmFLMG44TDhHa1BrQVZ1Cisxc29qa1cwNGFDZ3J4eTJaRjhjcUc2WWJlT3BvVnNzdWc5U1lWQitsZDgySVdaeTlvb2h3VHZSbzhBNXdSWnpBCis3OVJJOEJUTUpMVkhRQWdITDk5NEN3dFE5a21GUVl4SUVuZzZaMmZaZ2drUFZLWCtGSHpVSVdDaVJTdnFsOTg0Cit6UFZhelUxaVdxSFBVY3VUTmk3SEYreDNpUWJ5eVZWd2x2TT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3NzbC90ZXN0LWNhL3NlcmlhbCBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL3NlcmlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWVlNjVlCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2Evc2VyaWFsCkBAIC0wLDAgKzEgQEAKKzA1CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9zc2wvdGVzdC1jYS9zZXJ2ZXIxLmNydCBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL3NlcnZlcjEuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiN2RjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9zZXJ2ZXIxLmNydApAQCAtMCwwICsxLDc2IEBACitDZXJ0aWZpY2F0ZToKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDEgKDB4MSkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogTz1YeVNTTCwgQ049WHlTU0wgVGVzdCBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTm92IDI5IDE5OjUwOjMwIDIwMDcgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBOb3YgMjggMTk6NTA6MzAgMjAwOSBHTVQKKyAgICAgICAgU3ViamVjdDogTz1YeVNTTCwgQ049c2VydmVyMS50ZXN0CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjNjpjYTo0ODo1ZToyYjpmMjo3OTo0YjozMjowYzozODowMTplMTo0YzoKKyAgICAgICAgICAgICAgICAgICAgMWM6ZDE6MjQ6YmI6ZWE6ZGU6Yjg6MmY6ZmI6N2E6MDE6ZGE6NGI6M2M6MTM6CisgICAgICAgICAgICAgICAgICAgIDBiOmQxOjEyOmMwOjY5OmRjOmYzOjM3OjJiOmZkOmI3OmEzOmI3OjQ5OmYyOgorICAgICAgICAgICAgICAgICAgICA1NzpjMjo2ZDpmODpiZTo5MDpmNjo3ZTpmYTo4MDozNzo4OToxNzpiODo0YzoKKyAgICAgICAgICAgICAgICAgICAgODU6MjI6MzY6ZjQ6MzY6NTE6OWY6OTE6NmI6NDg6MDE6OWU6YmI6ZTY6OGU6CisgICAgICAgICAgICAgICAgICAgIDk5OmJlOmFiOjQ1OjAxOmMyOjZmOmYwOjBmOmFkOjIyOmJhOjgzOjA2OjM4OgorICAgICAgICAgICAgICAgICAgICBhYTpiMjozYzplNzpmNDphYTpjOTozMjozMDozMjpkYjoxYzoxYTo5Njo4NzoKKyAgICAgICAgICAgICAgICAgICAgZWI6MmY6NTM6MGQ6OTc6MmQ6NzU6M2M6YmM6NzU6NzQ6ZTU6MDQ6NTE6Njc6CisgICAgICAgICAgICAgICAgICAgIDRlOjRlOjgxOmQwOjAwOjRjOmZmOjQ3OmU3OmMzOmNhOjFmOjVkOjFjOjY1OgorICAgICAgICAgICAgICAgICAgICAwMDo4OTowYjpkMjo3ODphNTpkMzpkMjo4Zjo1YzpmODpmZTplNTo1NDo5ZDoKKyAgICAgICAgICAgICAgICAgICAgNjQ6ODM6YmM6MTI6ZGM6Mzg6Y2M6YjQ6Njg6M2U6MmI6YzY6Yjk6ZDA6ZWY6CisgICAgICAgICAgICAgICAgICAgIGIxOmU4OmJjOmNmOjVhOmI1OmIzOjFmOjQ3OjBhOmIxOjBmOjc5OjA2Ojk3OgorICAgICAgICAgICAgICAgICAgICA3MzozYjo3NTpmMDo2ZToyNjoxZDozNjo4ODo0YTplOTo2NDpiNjplNjo1ODoKKyAgICAgICAgICAgICAgICAgICAgZjg6OTI6MTI6YTY6N2M6MDg6Y2M6N2I6Njk6NDc6NmU6YzY6NjU6YWU6ZDg6CisgICAgICAgICAgICAgICAgICAgIDMxOjM5OjMwOjNkOmNhOjBhOjRiOjJjOmMyOjAxOjNlOmU5OjA1OmM2OjZlOgorICAgICAgICAgICAgICAgICAgICAxZjpjZTozODoyMToyMjpmNDpmNTowMDoxZToxODowZTpkNTo0ODoxYTo2ZToKKyAgICAgICAgICAgICAgICAgICAgZDU6MjI6ODI6YWY6YmU6MDk6YTc6NDc6MDM6MGI6ZDM6NGQ6NTI6NWU6MzQ6CisgICAgICAgICAgICAgICAgICAgIGQxOjE1CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6RkFMU0UKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBGNzpBQjpFNzpDMDo1ODo1RjpFMDowMTpDNTpBNDoyNjo4Mzo0NDpDQzoxRTo3QTo5MTpDOTo0NDo2NQorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6RjI6Njc6QjE6NUQ6NUY6NTE6NUU6REE6NTE6ODk6RTk6RDk6RTk6NkI6Q0E6OEI6QUY6QTU6MkU6NjkKKworICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAwNjo5Yjo4ZDo2Mzo4YzpiYjo4YToyYjoxYTo4NzphZTozYToyNzozNDpiYzoyNDo2MDpmMDoKKyAgICAgICAgOTU6MTI6MGU6ZjU6NGM6ZTY6ZTQ6MWY6YmQ6ZTI6ODM6YTM6ZDQ6MWU6ZGQ6ZWQ6OGU6YzE6CisgICAgICAgIDkzOmJjOmU2OjIwOjk2OjM0OjY1OjczOmFjOmJiOjg1OjY0OjU0OjQ5OjUzOjgyOmRhOjI3OgorICAgICAgICA4ZDo4NjplNTphMzoxMjphNTpiNjo4ZTpjNjo0MDo4NzowYjoxYTphNDowMjpmZTo0NzphOToKKyAgICAgICAgYmY6MzY6Mzk6YjE6NTQ6YTc6NjM6MWY6OTI6YjI6MWE6NGY6OWU6MDU6OTg6ZTY6ZjU6YjE6CisgICAgICAgIDE2OmZiOjQ3OmJiOjU3OjFmOjMxOjM1OjhlOmY4OjM2OmQxOjM2OjQ4OjZhOjI1OmM4OjBlOgorICAgICAgICAxYzozZDowMjo5MDpjZDpjZDoxZTo2ODpkMjphZjowOTplMjo2OTo1MTpjZTozYToxMTo2NzoKKyAgICAgICAgMjA6NDA6NDQ6Yzk6OWE6NGQ6OWM6M2M6YWY6MDc6MjI6ZGM6OTk6Nzc6NzE6NDA6NDY6ZDc6CisgICAgICAgIGZlOjNjOjAwOjMwOmZjOjY3OjUwOjg5OjczOmFhOjA0OjRjOmVmOmUyOjQ0OmMxOjJlOjg4OgorICAgICAgICA4Mzo4OTo4Mzo4MDo0Nzo4ODo0NzpjYToxYjpkYjo2Nzo3ZTplNzphODowYTo1NDpiODo3MjoKKyAgICAgICAgZjQ6OTY6M2Y6ZWI6YzE6YmE6MjE6YzE6ZmU6MDc6ZWI6Y2U6NGQ6YjA6ODA6ZDY6ZDk6Y2Y6CisgICAgICAgIDJkOmU5OjhlOmMyOjJmOjZmOmNjOjhiOmE5OjEzOmZkOjQ4OjUwOjVlOjJmOjg2OmNkOjllOgorICAgICAgICA4YjphZDoxNjo3Zjo2OTphYjpiNzo3Yjo3ZjpjNjpkODo0OTpmODowNjpkMDo4YTozNzo3MToKKyAgICAgICAgNzU6ZDg6NGY6M2Y6MDI6Mjk6M2U6OWU6Mjk6Y2M6ZjY6ZTc6YzM6MTA6NDI6Nzc6NmM6MzQ6CisgICAgICAgIDYzOmYzOmJlOjU3CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURGekNDQWYrZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREFvTVE0d0RBWURWUVFLRXdWWWVWTlQKK1RERVdNQlFHQTFVRUF4TU5XSGxUVTB3Z1ZHVnpkQ0JEUVRBZUZ3MHdOekV4TWpreE9UVXdNekJhRncwd09URXgKK01qZ3hPVFV3TXpCYU1DY3hEakFNQmdOVkJBb1RCVmg1VTFOTU1SVXdFd1lEVlFRREV3eHpaWEoyWlhJeExuUmwKK2MzUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFER3lraGVLL0o1U3pJTU9BSGgKK1RCelJKTHZxM3Jndiszb0Iya3M4RXd2UkVzQnAzUE0zSy8yM283ZEo4bGZDYmZpK2tQWisrb0EzaVJlNFRJVWkKK052UTJVWitSYTBnQm5ydm1qcG0rcTBVQndtL3dENjBpdW9NR09LcXlQT2YwcXNreU1ETGJIQnFXaCtzdlV3MlgKK0xYVTh2SFYwNVFSUlowNU9nZEFBVFA5SDU4UEtIMTBjWlFDSkM5SjRwZFBTajF6NC91VlVuV1NEdkJMY09NeTAKK2FENHJ4cm5RNzdIb3ZNOWF0Yk1mUndxeEQza0dsM003ZGZCdUpoMDJpRXJwWkxibVdQaVNFcVo4Q014N2FVZHUKK3htV3UyREU1TUQzS0Nrc3N3Z0UrNlFYR2JoL09PQ0VpOVBVQUhoZ08xVWdhYnRVaWdxKytDYWRIQXd2VFRWSmUKK05ORVZBZ01CQUFHalRUQkxNQWtHQTFVZEV3UUNNQUF3SFFZRFZSME9CQllFRlBlcjU4QllYK0FCeGFRbWcwVE0KK0hucVJ5VVJsTUI4R0ExVWRJd1FZTUJhQUZQSm5zVjFmVVY3YVVZbnAyZWxyeW91dnBTNXBNQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQUdtNDFqakx1S0t4cUhyam9uTkx3a1lQQ1ZFZzcxVE9ia0g3M2lnNlBVSHQzdGpzR1QKK3ZPWWdsalJsYzZ5N2hXUlVTVk9DMmllTmh1V2pFcVcyanNaQWh3c2FwQUwrUjZtL05qbXhWS2RqSDVLeUdrK2UKK0Jaam05YkVXKzBlN1Z4OHhOWTc0TnRFMlNHb2x5QTRjUFFLUXpjMGVhTkt2Q2VKcFVjNDZFV2NnUUVUSm1rMmMKK1BLOEhJdHlaZDNGQVJ0ZitQQUF3L0dkUWlYT3FCRXp2NGtUQkxvaURpWU9BUjRoSHlodmJaMzducUFwVXVITDAKK2xqL3J3Ym9od2Y0SDY4NU5zSURXMmM4dDZZN0NMMi9NaTZrVC9VaFFYaStHelo2THJSWi9hYXUzZTMvRzJFbjQKK0J0Q0tOM0YxMkU4L0FpaytuaW5NOXVmREVFSjNiRFJqODc1WAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL3Rlc3QtY2Evc2VydmVyMS5rZXkgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9zZXJ2ZXIxLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE4YzZkCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2Evc2VydmVyMS5rZXkKQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJRXBBSUJBQUtDQVFFQXhzcElYaXZ5ZVVzeUREZ0I0VXdjMFNTNzZ0NjRML3Q2QWRwTFBCTUwwUkxBYWR6egorTnl2OXQ2TzNTZkpYd20zNHZwRDJmdnFBTjRrWHVFeUZJamIwTmxHZmtXdElBWjY3NW82WnZxdEZBY0p2OEErdAorSXJxREJqaXFzanpuOUtySk1qQXkyeHdhbG9mckwxTU5seTExUEx4MWRPVUVVV2RPVG9IUUFFei9SK2ZEeWg5ZAorSEdVQWlRdlNlS1hUMG85YytQN2xWSjFrZzd3UzNEak10R2crSzhhNTBPK3g2THpQV3JXekgwY0tzUTk1QnBkegorTzNYd2JpWWROb2hLNldTMjVsajRraEttZkFqTWUybEhic1pscnRneE9UQTl5Z3BMTE1JQlB1a0Z4bTRmempnaAorSXZUMUFCNFlEdFZJR203VklvS3Z2Z21uUndNTDAwMVNYalRSRlFJREFRQUJBb0lCQUh3MG40clhncVR1cXRLZgorbSswZEZWUkgwM0lvdm9TY1o5c0lmY0dIVlBiSTlKZ3dpWGFMY2ZkdnYzSGdqWnphQVhWd05kT1l5TXZxU0h2SworczlSdzZaMlcybENONjJ1M3RrZVVDZFBzUnkyV1EwS0hTUEpOL3RmQVNFY2Rid0NjUlNHcW85dnJiMkZtZ3pnSworZUk5Z3c4T3pMT0JneDVYbEtqUTdQNjh3Yk1DTG9RNHo3VVpRa3FXUmhCck82cjJ5UjYvK3k5MU9nckZpeHAvRAorcnBzV3Z2VzQrRW1QaWhZY2VBOENUcXFaU3o3REtjTnZOeVBxQ0ZSYXYrODU2bS85b0J4S09rdXV2b1IzODExYworR1NuK2M4TnAvYmJLUXhaNllBOTRRdWpvS01YTzhpOFpFblJmTUthL05iQk1wYTFqU1JUZC81dUE2L0NJK2JVQgoraW8xbkxnRUNnWUVBNGVWdWV6TjdTdk1OOGloQjYxSGc2Zkd3YTJZaVRQa0NwN1dXZVJIQjhmKzJpcTBoRkNBbgoreXU5WXN5YWZWTVZQd29lYkVNQ2txYUlybHJLZEwwdzN4VWpETndoZ1N5QVF5WFVuU1FGd2EzSWtoTFdOa2o1UAorcFFDQWVaeTlQRUd3b2xQUUtCTlZhVStKN3A3aXBPdjlWQXlCbXlxVXE0WFh3cFljZHlINk5iVUNnWUVBNFVnZAorS3QzL2lPSnB2MVBNSVFwWEk5MjZsWGJINmhxdXFsUWJwYjM1WWxOZ0M0TjhlQy9yNFEveVc3Rkkwa0Q3MmlwTworRVVsU0ZuZThGSkhQbHVOZTZHYWhGOW5wNk00OG9nbXY2UWhpT0ZmNVQrNmtWWGRKK2FrcVloY1dDNW0vaEFyVAorL3EyNytQd1RwWUJ3SXdmNTRQYU0vazlpT3owekg5YnFZM1R2U2VFQ2dZRUFtQ2hpY3JvS29rRjFjMWVLajJkbgoraUMwMEdDT0RselZqaEhQY0YxRE93cUxyNGgwYjJ1S042ek90RzM4NGMzRTBlR08vSDFtamtGK2IzTFlUQ25qYworV0JiYTU0Yk0xYzJUZ1I5WWh1UmhSUDV0ZXJhUDFhSURJN0ZpMkllckw1dFB6d2VGZm5rSFh4Z2tZSWJGUXpGeQorUWRycXNnbk1lbng5Q0tUMEo0ckxic0VDZ1lBNWEyZ0R4Ukdja2hqaDZ6bmNNZ2FEM2IvdzJKV2IxYkV2T01EVAorUGRpU2R5M0R3WCs0SW42OG5wUG5Td2lFam91aXo2V1dRbG5wNEJyUUkxb0YyMjRWVGhOQlFRbWRqUE5uV1pDOAorbEtaME5mZ1ZwMzI3U3V4UDlnNFhja3JzS2dQbVk5d2t6YU5ia3VSdkNvMktZRDRRV01jWENxUys5SnBUUXpQNgorcFpOWUFRS0JnUUM1bXZTQzl6eFFZWDlJYTlQREw0cTZBamRHMFh3ZVp1WUhrMi9iUTFMUWpNN3FJMW1lc2NvbAorQ1hiTlhVeGh3MlhBWGt3OEJGQWZQSjNucElMN0ZYMGh0RWlZeDdLcXBDWU43SVhTcFE2eGV4Wm42bkVtK21CegorVk1XTzhSb2o5NVMzdHlaT1R6Ym11VU5iUXNmTFpsUTJoVWVVQnZKNVVIK0xCRml2anh5MHB3PT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9zc2wvdGVzdC1jYS9zZXJ2ZXIyLmNydCBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL3NlcnZlcjIuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYjA2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9zZXJ2ZXIyLmNydApAQCAtMCwwICsxLDc2IEBACitDZXJ0aWZpY2F0ZToKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDIgKDB4MikKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogTz1YeVNTTCwgQ049WHlTU0wgVGVzdCBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTm92IDI5IDE5OjUwOjM4IDIwMDcgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBOb3YgMjggMTk6NTA6MzggMjAwOSBHTVQKKyAgICAgICAgU3ViamVjdDogTz1YeVNTTCwgQ049bG9jYWxob3N0CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjYzpkNDo1NjozODo0OTplNjpkNjo3Zjo1MDplNzpkMjowNTpjODo5OToKKyAgICAgICAgICAgICAgICAgICAgMjU6MzI6NDU6NzE6ZGQ6MWM6ZTE6NzI6M2Q6Njg6OTQ6YzA6Njg6ZTI6MmU6CisgICAgICAgICAgICAgICAgICAgIDk1Ojk0Ojg3OjAzOjViOmZjOjcwOjY5OmM0OmIzOmEwOjk0OmU2OjcxOjAyOgorICAgICAgICAgICAgICAgICAgICAxODpiMTowMDo1YjpiZDo5MDplZTowODpkMDpjZDozMzpkMjpmYjo1ZTpjYToKKyAgICAgICAgICAgICAgICAgICAgZDY6YzI6NTg6ZWQ6ZjA6NTE6Yjc6NTQ6YWM6YTQ6OTk6MjI6OGI6YTM6MDc6CisgICAgICAgICAgICAgICAgICAgIGJiOmQ3OjQxOjE0OmRlOjBhOjVhOjkyOjlkOjJkOjA4OjFjOjVmOmJmOjliOgorICAgICAgICAgICAgICAgICAgICBkYzowMjpiYjpjMjpjYTowNjpiODpmMjo4ZDowNDo2Nzo1MjpjYTo5YzozYToKKyAgICAgICAgICAgICAgICAgICAgMTU6YTM6YmE6MzA6MmY6NTE6MDc6NGQ6OGM6Njk6NWM6OGM6OWY6NDE6NTY6CisgICAgICAgICAgICAgICAgICAgIDAzOmNhOmI0Ojg4OmI4OmNlOjBmOmYwOjI4OjY3OjE5OmRkOjRjOjk2OjY0OgorICAgICAgICAgICAgICAgICAgICA4ZDoxYzowNzpiMjpjNjpjYjo1ODpiZjpkOToyYjo0MjozOTplZDoyODo4MDoKKyAgICAgICAgICAgICAgICAgICAgMzA6NjE6MjM6MGU6OTU6ZDc6Mjc6MTE6NmY6N2U6YmM6YmM6N2I6NzM6MDE6CisgICAgICAgICAgICAgICAgICAgIGMzOjlhOjU2OmZiOmU2OmFlOjg4OmE4Ojk2OjVhOjBmOmJiOmE1OmIxOjlkOgorICAgICAgICAgICAgICAgICAgICBkNTo0YTo3NDowMDoyNjo2ODowODozZDo2Nzo5Mjo0OTo1ODphYjplMjo2YToKKyAgICAgICAgICAgICAgICAgICAgMDA6NDU6ODM6M2I6ZTE6ZTM6ZTY6Yzc6MmM6YzA6NDA6Yjk6Y2E6Njg6MGI6CisgICAgICAgICAgICAgICAgICAgIGE0OjhmOmJhOjZkOjUzOmFmOjZmOjdhOjU3Ojg0OjRmOmQ4OmIwOmFlOjBjOgorICAgICAgICAgICAgICAgICAgICBjZToyMzoxYjoyNTozMjoxMzpiNjozYTo5Nzo3NDpjYTphZjoyYzo5Njo3NjoKKyAgICAgICAgICAgICAgICAgICAgMzQ6YjI6MjQ6NmU6Mzk6NDU6MTM6ZWM6YmU6MTY6ZGI6Yjg6NDE6NzE6MDY6CisgICAgICAgICAgICAgICAgICAgIDAwOmVkCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6RkFMU0UKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBCMTpCMDpFQTozMTo5RDo1Qzo0RjowMDo3RjpDRDowRDoxRjo3ODpBOToxODo1RDo5NjpERTpBQTpCMQorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6RjI6Njc6QjE6NUQ6NUY6NTE6NUU6REE6NTE6ODk6RTk6RDk6RTk6NkI6Q0E6OEI6QUY6QTU6MkU6NjkKKworICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAyYjo5Zjo1ZDpmNzo4Yzo0Mjo4OTo0NTpkOToxOTo2ZjpkMTo4Nzo3MTpjNzo3NDplYzoxMzoKKyAgICAgICAgYzE6YzM6N2Q6NTE6YjU6NmQ6YzM6Zjg6ZjQ6Y2M6OGE6ZDU6M2I6ZWU6NTk6MGU6MGI6Yjg6CisgICAgICAgIGJmOjdmOmEzOjRhOjY5OmNiOmVhOjU0OmZjOjU4Ojk4OjM0OjA1OjBhOjYyOmFhOjczOjYxOgorICAgICAgICBmMjoxNTo4YzoyMDo5Mzo2MTowYjo5ZjpmZDo2NDpkMTo3ZDo4NzpiMzplNTo0MzoxYjo3MToKKyAgICAgICAgMzY6YjQ6NGM6YjE6MTk6Mzg6MDQ6MzU6ZTc6ZjY6NTI6ZTU6M2M6ZDA6YTU6MmQ6NTU6OTk6CisgICAgICAgIDllOjViOmRmOmQ1OjYwOjZjOjU5OmFjOmU0OmY3OjRlOmY3OjU1OmNlOmRhOjFjOjljOjVlOgorICAgICAgICAzNTphODpkNTo0MTo0NzowOTplMDpkZjo3ZDo3NTo3ZTo4ZTo0MToyYzo5MzozNDpiZjpkMjoKKyAgICAgICAgNWU6NWI6MTU6MTU6MDU6MDI6NGQ6MjQ6MWU6YzQ6NWI6MDM6NTI6YWI6MGE6YWM6NmQ6NzI6CisgICAgICAgIDAwOjNjOmRlOmY5OjBmOjg0OjczOmRjOmIyOmU2OjUyOjZjOjgyOmFmOjI2Ojk3OjVhOjU4OgorICAgICAgICA1MDo4OTphMzpjNzpkOTo1ZDphNTo4YTozYzplMDplODozZTo2MzplYjo0ZjpmZjpmZDo0NToKKyAgICAgICAgYjI6ZWM6YTE6ZmI6NDU6MDM6MGY6Mzc6ZDA6YTE6OGQ6NDI6YmY6MjM6OTE6NjY6MmU6MDk6CisgICAgICAgIDYxOjE4OjNlOjViOmU3OmI3OmU0OjZlOmUwOjJkOjg4OjBkOmMyOjJhOmU2OjE5OmZhOjM1OgorICAgICAgICAwNTowZDo4YjphNDpmMzpmYjowNTo1NDo5ODo4Nzo2Njo1YTphMjpmMzo1NjpiNTozOTo3YzoKKyAgICAgICAgMWM6Mjg6NTA6MDY6NGE6M2M6NjA6NWE6ZTg6ZWM6MTk6NGU6N2U6Y2Q6YjE6NTY6NWU6YTM6CisgICAgICAgIDRkOmY4OjZjOjcyCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURGRENDQWZ5Z0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRVUZBREFvTVE0d0RBWURWUVFLRXdWWWVWTlQKK1RERVdNQlFHQTFVRUF4TU5XSGxUVTB3Z1ZHVnpkQ0JEUVRBZUZ3MHdOekV4TWpreE9UVXdNemhhRncwd09URXgKK01qZ3hPVFV3TXpoYU1DUXhEakFNQmdOVkJBb1RCVmg1VTFOTU1SSXdFQVlEVlFRREV3bHNiMk5oYkdodmMzUXcKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURNMUZZNFNlYldmMURuMGdYSW1TVXkKK1JYSGRIT0Z5UFdpVXdHamlMcFdVaHdOYi9IQnB4TE9nbE9aeEFoaXhBRnU5a080STBNMHowdnRleXRiQ1dPM3cKK1ViZFVyS1NaSW91akI3dlhRUlRlQ2xxU25TMElIRisvbTl3Q3U4TEtCcmp5alFSblVzcWNPaFdqdWpBdlVRZE4KK2pHbGNqSjlCVmdQS3RJaTR6Zy93S0djWjNVeVdaSTBjQjdMR3kxaS8yU3RDT2Uwb2dEQmhJdzZWMXljUmIzNjgKK3ZIdHpBY09hVnZ2bXJvaW9sbG9QdTZXeG5kVktkQUFtYUFnOVo1SkpXS3ZpYWdCRmd6dmg0K2JITE1CQXVjcG8KK0M2U1B1bTFUcjI5NlY0UlAyTEN1RE00akd5VXlFN1k2bDNUS3J5eVdkalN5Skc0NVJSUHN2aGJidUVGeEJnRHQKK0FnTUJBQUdqVFRCTE1Ba0dBMVVkRXdRQ01BQXdIUVlEVlIwT0JCWUVGTEd3NmpHZFhFOEFmODBOSDNpcEdGMlcKKzNxcXhNQjhHQTFVZEl3UVlNQmFBRlBKbnNWMWZVVjdhVVlucDJlbHJ5b3V2cFM1cE1BMEdDU3FHU0liM0RRRUIKK0JRVUFBNElCQVFBcm4xMzNqRUtKUmRrWmI5R0hjY2QwN0JQQnczMVJ0VzNEK1BUTWl0VTc3bGtPQzdpL2Y2TksKK2FjdnFWUHhZbURRRkNtS3FjMkh5Rll3Z2syRUxuLzFrMFgySHMrVkRHM0UydEV5eEdUZ0VOZWYyVXVVODBLVXQKK1ZabWVXOS9WWUd4WnJPVDNUdmRWenRvY25GNDFxTlZCUnduZzMzMTFmbzVCTEpNMHY5SmVXeFVWQlFKTkpCN0UKK1d3TlNxd3FzYlhJQVBONzVENFJ6M0xMbVVteUNyeWFYV2xoUWlhUEgyVjJsaWp6ZzZENWo2MC8vL1VXeTdLSDcKK1JRTVBOOUNoalVLL0k1Rm1MZ2xoR0Q1YjU3ZmtidUF0aUEzQ0t1WVoralVGRFl1azgvc0ZWSmlIWmxxaTgxYTEKK09Yd2NLRkFHU2p4Z1d1anNHVTUremJGV1hxTk4rR3h5CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9zc2wvdGVzdC1jYS9zZXJ2ZXIyLmtleSBiL3Byb2dyYW1zL3NzbC90ZXN0LWNhL3NlcnZlcjIua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYTM1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9zZXJ2ZXIyLmtleQpAQCAtMCwwICsxLDI3IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlFb3dJQkFBS0NBUUVBek5SV09Fbm0xbjlRNTlJRnlKa2xNa1Z4M1J6aGNqMW9sTUJvNGk2VmxJY0RXL3h3CithY1N6b0pUbWNRSVlzUUJidlpEdUNORE5NOUw3WHNyV3dsanQ4RkczVkt5a21TS0xvd2U3MTBFVTNncGFrcDB0CitDQnhmdjV2Y0FydkN5Z2E0OG8wRVoxTEtuRG9Wbzdvd0wxRUhUWXhwWEl5ZlFWWUR5clNJdU00UDhDaG5HZDFNCitsbVNOSEFleXhzdFl2OWtyUWpudEtJQXdZU01PbGRjbkVXOSt2THg3Y3dIRG1sYjc1cTZJcUpaYUQ3dWxzWjNWCitTblFBSm1nSVBXZVNTVmlyNG1vQVJZTTc0ZVBteHl6QVFMbkthQXVrajdwdFU2OXZlbGVFVDlpd3Jnek9JeHNsCitNaE8yT3BkMHlxOHNsblkwc2lSdU9VVVQ3TDRXMjdoQmNRWUE3UUlEQVFBQkFvSUJBRlNTeUJidHpMWjhVemVrCis3R1pyZFlSUVVEZHdHVlpHTE14ZXRlL09ORXpqZ211VXpBV2dCbHNqb0JMQlB0aTJ3U3FBa1FocXpvKzdhYmMyCitJWDZWb1lrODlHbXQ3emlibnZSdDJRMkQvYzNBa0sxQTRMc2NuQnhOaW9aR2FLTnFLeXRiTnBwREFRMkluaTdBCitUZXo3ay94ZElaUHBMRWlaNzI3ZkpDVEtVS0prRGhZMFdseEZUNGJ0TUxKTlo0U3lXNkhHTytoS0Z6eGRBdHVyCitRb05RY1dmeTJGQklDUGVJNFpvcFZ5TVVhUjNza0lVSlFXREFpMmRxU2tTZXZvRDY3bzQvZkY0bkR4czdEWldWCitaUVY2L1dRM0laSGdURmMxNWc1cUkxNjkzdHRtZ2d5dFhYWTJLcDQxcU96R0ZOeXJBZ2ZqNUlaZWY4U01FMmNKCiticC82UUlFQ2dZRUEvMFRXRFVkNnU3WjF2UlJQcXpYUXRtR2ZzTHJ5KzBuWWQxUTAvSXZQd3NWRHRMeGFYR2NsCitya2hxVmd4WTd2UDRyelUxUHZqTkVXS3RXbEQrcXB2K09LN25WV2VHVmxtZWIwWkViK216K3FObTBpbnVtNjRrCitWRVlEUWFkVlgzVUhMUCtVcXV2N2lVb3d0ck9yUHJSVmtGZG9vN1M4ZHpJUnVVM09Oa0x2WGVVQ2dZRUF6V3FFCitzQWgrS093MFlXWmRBajlIRk9qQ09BMWdhRHJjUUYxM0N5b2gzWkVJRkswSjduTmtoOENaVkZ4N0Q1VzF1NkIwCitmQW1vb2xNTzNJNFBmamJ1d2F5TUVMakxkcGlpN2ExMC9EQzZCbXRWQ00zK3NmcEp0QjdMbUwxM01Wa1BwTkV2Cis0QktGQURUYXhoYmZsZW15ZFhxVUEvQ3g0S0JmN09oWksxNitwbWtDZ1lBOUt1bC8xUmo3MGdUMGdlRjFUVGZ0CisvQWFmK3F3dXVzczhETm1GaXBzR09PNjRhRW5leW5pbEFvVTRpVXptTlYvcDIvNGVVTkFTMG1wbnNmRFVRUHp4Cis2RGRXcDYveEVSaDk0WUNVc0pPSUE0K24zSlJvaVpuNjk2dmdGNURGaHUxcFF2VUUzL2N1TnJEbGxyZjZGb3hLCitRaWU0MHA0MmtiRGRqbDlUY1VhYVlRS0JnQWRmTzBQV0NqRU55Uk4xeVFDN3BLRnJlUXpwN2Z2UG9QZnVZc2RUCit5OE5YNFNKYzAyNXJWY0JKZVRjOTJtekV3ckRwSVVVU1U2ci9zQmphUUZRWFJKcE94dmdTcWJxbjM3RUgrSnJVCitaTmkySVdjZmZYU0Z0djl2MjM2dnpnZEhXdmhmU1lpUklaVFFVTW1yS0hzSTJBNi9SM0Njd3NWOCsvUlVvbDZjCitGOXVCQW9HQkFPVjN4SDV4OW5WRWVjV08wdkdDMy9rVFBZZ294NXBMRWhDdjI5OExjWVJWZ2Z0N2FqWlM3QzlBCisvaW5rc2lYR0t0SXV2NmpDR2JRVUx1ekJkQ0dPUWZBT0luUTlIc3RYMDFjQytrSnFUZGI3L2c4ZS9xV05BYUlVCisvU3lYYXA3d1k2TncwVmxvVEJObWFFbzRaRXJSbDF5dHpiWUNTYTlWWnJ6T1BJbDhMVU1uCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL3Rlc3QtY2Evc3NsY29uZi50eHQgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS9zc2xjb25mLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDY4ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2Evc3NsY29uZi50eHQKQEAgLTAsMCArMSw2MCBAQAorIyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyM9PT09PT09PT09PT09PSBFeGFtcGxlIE9wZW5TU0wgY29uZmlndXJhdGlvbiBmaWxlID09PT09PT09PT09PT09DQorIyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorIyAgUmVmZXJlbmNlczoNCisjDQorIyAgL2V0Yy9zc2wvb3BlbnNzbC5jb25mDQorIyAgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL2FwcHMvY29uZmlnLmh0bWwNCisjICBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvYXBwcy94NTA5djNfY29uZmlnLmh0bWwNCisNCitbIGNhIF0NCitkZWZhdWx0X2NhICAgICAgICAgICAgICA9IG15X2NhDQorDQorWyBteV9jYSBdDQorY2VydGlmaWNhdGUgICAgICAgICAgICAgPSB0ZXN0LWNhLmNydA0KK3ByaXZhdGVfa2V5ICAgICAgICAgICAgID0gdGVzdC1jYS5rZXkNCitkYXRhYmFzZSAgICAgICAgICAgICAgICA9IGluZGV4DQorc2VyaWFsICAgICAgICAgICAgICAgICAgPSBzZXJpYWwNCisNCituZXdfY2VydHNfZGlyICAgICAgICAgICA9IG5ld2NlcnRzDQorZGVmYXVsdF9jcmxfZGF5cyAgICAgICAgPSA2MA0KK2RlZmF1bHRfZGF5cyAgICAgICAgICAgID0gNzMwDQorZGVmYXVsdF9tZCAgICAgICAgICAgICAgPSBzaGExDQorcG9saWN5ICAgICAgICAgICAgICAgICAgPSBteV9wb2xpY3kNCit4NTA5X2V4dGVuc2lvbnMgICAgICAgICA9IHYzX3Vzcg0KKw0KK1sgbXlfcG9saWN5IF0NCitjb3VudHJ5TmFtZSAgICAgICAgICAgICA9IG9wdGlvbmFsDQorc3RhdGVPclByb3ZpbmNlTmFtZSAgICAgPSBvcHRpb25hbA0KK29yZ2FuaXphdGlvbk5hbWUgICAgICAgID0gbWF0Y2gNCitvcmdhbml6YXRpb25hbFVuaXROYW1lICA9IG9wdGlvbmFsDQorY29tbW9uTmFtZSAgICAgICAgICAgICAgPSBzdXBwbGllZA0KK2VtYWlsQWRkcmVzcyAgICAgICAgICAgID0gb3B0aW9uYWwNCisNCitbIHJlcSBdDQorZGlzdGluZ3Vpc2hlZF9uYW1lICAgICAgPSBteV9yZXFfZG4NCit4NTA5X2V4dGVuc2lvbnMgICAgICAgICA9IHYzX2NhDQorDQorWyBteV9yZXFfZG4gXQ0KK2NvdW50cnlOYW1lICAgICAgICAgICAgID0gQ291bnRyeSBOYW1lLi4uLi4uLi4uLi4uLi4NCitjb3VudHJ5TmFtZV9taW4gICAgICAgICA9IDINCitjb3VudHJ5TmFtZV9tYXggICAgICAgICA9IDINCitzdGF0ZU9yUHJvdmluY2VOYW1lICAgICA9IFN0YXRlIG9yIFByb3ZpbmNlIE5hbWUuLi4uDQorbG9jYWxpdHlOYW1lICAgICAgICAgICAgPSBMb2NhbGl0eSBOYW1lLi4uLi4uLi4uLi4uLg0KKzAub3JnYW5pemF0aW9uTmFtZSAgICAgID0gT3JnYW5pemF0aW9uIE5hbWUuLi4uLi4uLi4NCitvcmdhbml6YXRpb25hbFVuaXROYW1lICA9IE9yZy4gVW5pdCBOYW1lLi4uLi4uLi4uLi4uDQorY29tbW9uTmFtZSAgICAgICAgICAgICAgPSBDb21tb24gTmFtZSAocmVxdWlyZWQpLi4uLg0KK2NvbW1vbk5hbWVfbWF4ICAgICAgICAgID0gNjQNCitlbWFpbEFkZHJlc3MgICAgICAgICAgICA9IEVtYWlsIEFkZHJlc3MuLi4uLi4uLi4uLi4uDQorZW1haWxBZGRyZXNzX21heCAgICAgICAgPSA2NA0KKw0KK1sgdjNfY2EgXQ0KK2Jhc2ljQ29uc3RyYWludHMgICAgICAgID0gQ0E6VFJVRQ0KK3N1YmplY3RLZXlJZGVudGlmaWVyICAgID0gaGFzaA0KK2F1dGhvcml0eUtleUlkZW50aWZpZXIgID0ga2V5aWQ6YWx3YXlzLGlzc3VlcjphbHdheXMNCisNCitbIHYzX3VzciBdDQorYmFzaWNDb25zdHJhaW50cyAgICAgICAgPSBDQTpGQUxTRQ0KK3N1YmplY3RLZXlJZGVudGlmaWVyICAgID0gaGFzaA0KK2F1dGhvcml0eUtleUlkZW50aWZpZXIgID0ga2V5aWQsaXNzdWVyDQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvdGVzdC1jYS5jcnQgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS90ZXN0LWNhLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGIzZDExCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvdGVzdC1jYS5jcnQKQEAgLTAsMCArMSw3OSBAQAorQ2VydGlmaWNhdGU6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IE89WHlTU0wsIENOPVh5U1NMIFRlc3QgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE5vdiAyOSAxOTo0OToxNCAyMDA3IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTm92IDI5IDE5OjQ5OjE0IDIwMTcgR01UCisgICAgICAgIFN1YmplY3Q6IE89WHlTU0wsIENOPVh5U1NMIFRlc3QgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmQxOmY0OjhjOjQ4Ojg1OmUxOjE1OmE4OjkyOmY0OjQzOmU0OmU0OmY4OgorICAgICAgICAgICAgICAgICAgICBlZTplNzo2MzpiYjowYTo1MDozOTowOTowYjoyZjowOTpiZTo0YzpkYTo5ZDoKKyAgICAgICAgICAgICAgICAgICAgZjk6MzA6NDA6MDM6NzY6Mjc6OTQ6ZGI6NzM6OGE6YWY6Nzc6YmY6NzM6M2E6CisgICAgICAgICAgICAgICAgICAgIGUyOmE1OjliOmFhOjBkOmZkOjI2OmIzOmQxOjM3Ojk4OmU4OmJjOjIxOjgyOgorICAgICAgICAgICAgICAgICAgICA4NjoxNzo5Mjo5MDpiZjo0ZDpkMTo3Mzo5NTpmNDphMzphODowNzpiZTo1MToKKyAgICAgICAgICAgICAgICAgICAgMTU6MmE6NDA6M2I6Mjk6ZDc6NDM6YzA6ZjM6NWU6MWM6NGE6Mzc6MzQ6ZjM6CisgICAgICAgICAgICAgICAgICAgIDM0OjFmOjA2OmQzOjczOjhhOjRmOjgwOmExOmU3Ojc0OjAzOmUzOmI1Ojc3OgorICAgICAgICAgICAgICAgICAgICAxZjo2Mzo1NDplZjo5Yjo5Yjo2NTo2YjpkMzpiNTowZjo1Zjo2YTo4NTpkYzoKKyAgICAgICAgICAgICAgICAgICAgZWE6NGY6NWI6MTk6NTk6NGQ6ZTE6Mjk6ZjU6YWM6YTc6OGQ6MzI6YjM6ODM6CisgICAgICAgICAgICAgICAgICAgIDBjOjdmOmY1OjdkOjQ0OmJhOmQ0OjgyOmVkOjIzOmJlOmFlOjUxOmM1OmE4OgorICAgICAgICAgICAgICAgICAgICA1NzoxZDpkOTo1MzpmMDozMzoyZjozNjozYzoyMToyYzpjYzoxODpjNDo2YjoKKyAgICAgICAgICAgICAgICAgICAgNGY6NTc6YWQ6MDM6MWU6ODA6OTI6YTc6Yzg6MTU6OGQ6MWM6ZTA6MDM6MTg6CisgICAgICAgICAgICAgICAgICAgIGFlOmQ5OjA4OjA2OjQ1OjlhOmFmOjcyOjY4OmY3OjAyOjY5OmU2OjAxOmU3OgorICAgICAgICAgICAgICAgICAgICA5MTozNDo1ZjpiYTplNzo3ZDoyZTo0Zjo3OTpkNzpjNDozOTo1MjpjYzozYjoKKyAgICAgICAgICAgICAgICAgICAgZGM6OGQ6ZDk6MmY6ZjM6Njc6OTQ6NWU6ZWQ6M2E6Zjg6MWU6YWQ6Mzk6ZTE6CisgICAgICAgICAgICAgICAgICAgIGI0OmRmOmYwOmZiOjVjOjRkOjRlOjk4OjYyOmFjOjVkOmU1OjQ1OmFlOjNhOgorICAgICAgICAgICAgICAgICAgICBiNDoxYTphNzowNzpiZDo0MDpjNDo0MzpiYTo2NDo1ODpjMzphMDplMTo1YjoKKyAgICAgICAgICAgICAgICAgICAgOTM6NzcKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgRjI6Njc6QjE6NUQ6NUY6NTE6NUU6REE6NTE6ODk6RTk6RDk6RTk6NkI6Q0E6OEI6QUY6QTU6MkU6NjkKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOkYyOjY3OkIxOjVEOjVGOjUxOjVFOkRBOjUxOjg5OkU5OkQ5OkU5OjZCOkNBOjhCOkFGOkE1OjJFOjY5CisgICAgICAgICAgICAgICAgRGlyTmFtZTovTz1YeVNTTC9DTj1YeVNTTCBUZXN0IENBCisgICAgICAgICAgICAgICAgc2VyaWFsOjAwCisKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMzA6Y2Y6MTc6OWU6OTM6M2I6MGQ6ZWM6M2E6Mzc6YzM6ZmU6NjY6YjI6ZWI6OTI6NTY6YTQ6CisgICAgICAgIGRhOmY2OmM3OmIxOjk1OmU2OmE1OmExOjg4OmU1OmIzOmZkOmQ3OmEzOmFlOjQ4OjQ0Ojg5OgorICAgICAgICA0YjozZTphZDo3MDoyNDo5MzpjODo1Zjo4ODo4NjpiMDpjNTo4OTo3NTpkNzoxNDo4Njo5ZDoKKyAgICAgICAgYWY6NjY6ZDU6MWM6ZGU6Y2I6MWQ6NDU6MTI6ZmQ6YmE6NjE6NjE6YTM6ZjA6Zjg6ZmE6OGI6CisgICAgICAgIDEyOjJlOmIyOjc1OjYyOjhjOjkzOjcxOjM3OjA0OmJhOmNlOjVlOjBkOmViOmJkOmMyOjQxOgorICAgICAgICBiNTpkOTo1OTpjODpkMDowOTozMjpjNDo1ODpiYjo3MTo4ZDowYzo3ODplZTpiMTpiMDo5YToKKyAgICAgICAgZjE6NWM6MDU6NDk6Nzk6ODI6ODQ6YmY6YzI6MTk6ZmE6NDM6NGI6ZTc6NDA6MGE6MjA6ODY6CisgICAgICAgIDU4OjJkOmE4OjZlOjlkOmQ0OjE2OmQ4OmU4Ojg4OjVmOjg0OjU5OjBiOmZiOjUwOjhiOjQwOgorICAgICAgICA3ZDo3Yjo4YTplNToyNzo1ZDpjNjoxYzo1MTozYzo4Njo1MDo4ZjoyMjoxYTpmYTpjNDo5YjoKKyAgICAgICAgYzI6ODQ6Njg6OWY6N2Q6OTY6MTU6NDc6OTQ6ZGU6M2E6NWM6Y2Y6MzM6NDU6YmE6OTI6NDQ6CisgICAgICAgIDQ2OjljOmExOmY1OjQyOjRhOmRiOmMxOmU1OjI3OjJhOjFmOjlmOmNjOjI4OjRjOjk0OjUzOgorICAgICAgICBlNjpiNDpjNjowZjpkYjpmNTo2NToxOTplNjo3NTpmMjplYzoxMDpkMTo5OToyNzo5NDo5YToKKyAgICAgICAgZmM6YTE6MGM6MzE6MTE6YTg6Mjg6NGM6NGM6ODg6MTA6NTg6NjA6MDU6ODM6MzM6ZTI6YTk6CisgICAgICAgIDI2OjJkOjVlOjI0OmE1Ojc2OjYzOjEyOjIzOjRmOmYxOjZhOjYwOmJkOjM4OmZhOjY1OmY0OgorICAgICAgICBhOTpkYTpmMTo3NQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEVFRDQ0FqV2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURBb01RNHdEQVlEVlFRS0V3VlllVk5UCitUREVXTUJRR0ExVUVBeE1OV0hsVFUwd2dWR1Z6ZENCRFFUQWVGdzB3TnpFeE1qa3hPVFE1TVRSYUZ3MHhOekV4CitNamt4T1RRNU1UUmFNQ2d4RGpBTUJnTlZCQW9UQlZoNVUxTk1NUll3RkFZRFZRUURFdzFZZVZOVFRDQlVaWE4wCitJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEwZlNNU0lYaEZhaVM5RVBrCis1UGp1NTJPN0NsQTVDUXN2Q2I1TTJwMzVNRUFEZGllVTIzT0tyM2UvY3pyaXBadXFEZjBtczlFM21PaThJWUtHCitGNUtRdjAzUmM1WDBvNmdIdmxFVktrQTdLZGREd1BOZUhFbzNOUE0wSHdiVGM0cFBnS0huZEFQanRYY2ZZMVR2CittNXRsYTlPMUQxOXFoZHpxVDFzWldVM2hLZldzcDQweXM0TU1mL1Y5UkxyVWd1MGp2cTVSeGFoWEhkbFQ4RE12CitOandoTE13WXhHdFBWNjBESG9DU3A4Z1ZqUnpnQXhpdTJRZ0dSWnF2Y21qM0Ftbm1BZWVSTkYrNjUzMHVUM25YCit4RGxTekR2Y2pka3Y4MmVVWHUwNitCNnRPZUcwMy9EN1hFMU9tR0tzWGVWRnJqcTBHcWNIdlVERVE3cGtXTU9nCis0VnVUZHdJREFRQUJvNEdCTUg4d0RBWURWUjBUQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVOG1leFhWOVJYdHBSCitpZW5aNld2S2k2K2xMbWt3VUFZRFZSMGpCRWt3UjRBVThtZXhYVjlSWHRwUmllblo2V3ZLaTYrbExtbWhMS1FxCitNQ2d4RGpBTUJnTlZCQW9UQlZoNVUxTk1NUll3RkFZRFZRUURFdzFZZVZOVFRDQlVaWE4wSUVOQmdnRUFNQTBHCitDU3FHU0liM0RRRUJCUVVBQTRJQkFRQXd6eGVla3pzTjdEbzN3LzVtc3V1U1ZxVGE5c2V4bGVhbG9ZamxzLzNYCitvNjVJUklsTFBxMXdKSlBJWDRpR3NNV0pkZGNVaHAydlp0VWMzc3NkUlJMOXVtRmhvL0Q0K29zU0xySjFZb3lUCitjVGNFdXM1ZURldTl3a0cxMlZuSTBBa3l4Rmk3Y1kwTWVPNnhzSnJ4WEFWSmVZS0V2OElaK2tOTDUwQUtJSVpZCitMYWh1bmRRVzJPaUlYNFJaQy90UWkwQjllNHJsSjEzR0hGRThobENQSWhyNnhKdkNoR2lmZlpZVlI1VGVPbHpQCitNMFc2a2tSR25LSDFRa3Jid2VVbktoK2Z6Q2hNbEZQbXRNWVAyL1ZsR2VaMTh1d1EwWmtubEpyOG9Rd3hFYWdvCitURXlJRUZoZ0JZTXo0cWttTFY0a3BYWmpFaU5QOFdwZ3ZUajZaZlNwMnZGMQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvdGVzdC1jYS5rZXkgYi9wcm9ncmFtcy9zc2wvdGVzdC1jYS90ZXN0LWNhLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODE0YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvc3NsL3Rlc3QtY2EvdGVzdC1jYS5rZXkKQEAgLTAsMCArMSwzMCBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRAorREVLLUluZm86IERFUy1FREUzLUNCQyxGRUQyMjIyMTVFQTVGRDI0CisKK2pQODc3TWNkRisrajNYQmJrUXRTeU5jNFc4ZFE0b3VlT0hzNW9MTjA0SERnZzNicmJmdm0wbTVHeVpDbU1hM0MKK0I5cnAyQnFYOWFnUjd6ZnpQVmkzYzlEUy9waVlGaTI2Z2FEQ3d1Y3NCcTZqUFRGdUlDQUpZbk1hWFJtWlBydnoKK0RQemxMNWhyRE9WcERXSmw1bDJWdjNUMUFnNEN0RUZhUDZEUmNmd0dOeVVlTjhQNkFwaTJpL1htSVhOdjQ3Z2wKK1FzVk5ReC9yTCt2ZU9qL2F5RkIwODRDYnh6bE9YNlNUTXNML1RWUHVGalA0dnZCVHlWQmVzZUZSV0F3OTdib2cKK25ycGhqSzZlT0JNbkYyNVhiRitjZzV2emFnUHNQWWgvM3dPdVpmTEZBd2NLclRtOEtNNDkzeFlSYWNCbVJjb24KK0NqVXJ4QW9vN1FtZFRTQkJ6ZDRrUmFsTlMrTWo5UWFJcWdGQlpTRkNpZVlnZXpVNDYwM0dUUHBZS0RJZjk5M1AKK3hIVHFHTWxuNzhVaytKVDk1TWRmVVdvamsvclBhSjVYcHJMYU9raG5BUEVlVGNZd0g1a1lzYm1uM3RCZnBmZE0KK2k0c1c2SVNEY0JMREh2TTlKRWJVQ2FDY1BQOGZJaU53QUNyWmcyNVJCbU1BeCtaZFE2ZlFwaVEvSzJLbUJ5eWwKKzAxVmg1VkMrbW5VUTJXL0drcDVHNlNTL1JPa2JUd1FJSmh6QUFab2RLKzgxOHg2bHoyclJnNXNyRUVXaTFSV3AKK2wzMDQzbk5jU01kbXhKNkJjZC9FcnhXZVdhNVA4cms0VWxhcEpRRjRmOVo2SnhBajlrZHMrZ0JGNE9NZjlXdkIKK2Q2djJJNnUza1gvaXdYTi9TTFRGM3lyRFBJaEl5UXNKVDA2VXVvWHRLSno0dnUvSWpZMmxNSzFERmVGL2RxOXMKK2tLeXFaOU55aW1pdXhUVjhPMmRaZTB4ams2MFhEaDF2a0htaGZud0FNVjhYSFJxamNsZ1lkY1pnUU0xK1plNTAKK3NjTHgzUG1xd1dsTFo2cllNa2VNL2VraUxtUGtuejM3L3czR25zMnB3SE5JQ2xJaW1INHpra3hTT0NYWEgrOWkKK2dWZ2p0Y2o5bmhmOE1wSklhTllBN1EyaG05a2ZBMlZ1bDJFQVI4YXV2MXN0cjQxaGFDTXJrVkxtNmMvZW9tSlAKK1NjTENScjYxREdZTTRuMDg0ZW5raVdHNml5SXdMY1o3b2NUVHp1eEtVS1dyMzQrSlF5NEV4MTF0VmJBaWNQbUUKKzdNejNKVHN1UjliMnRYckxRYU5oN1BsWHRiczU2dmNYcVE0U2NhSnU1OGtjR2lBZERaa2VLUnlvMGliZWVyK2UKK3FkMVZHTWhySTBTdDVPSk94TXVzUkpUK2hsak9mNGs5Nk91Z0kydDM5QldOOGZRVkxBS1dZTEpaRGtEcTJrU2wKK3kvSHoxaUt4VjAxTTYwbHVIREFvajNBaHNOOXA3SW9jVjlqUHprK2p4WFZxakF6SmF3bDR4eUJSUGxTLzJiU3cKK3JPZStaZ0tkemhsVVI5T29VNC9aaUd1MzVYSkhaUFpmMnJ4TEFoWGZnbkFUKzNBOUZ0L1dWWHAvZDlONGhKdVUKK1F6MUxuNkh5b2hqTU9jUGpyejcwT1hycTdrcmE0Q2V2czdybUs3NzNMeER0dytwUGZEV01hc3V5OWxTZUl1bFIKKytyaVNOTHJmZllXWEdQSU5uaFZocW15ajZTd2NLWlVZL2Vvc0V3dm9yV0FDNWtydCtqdVZ6SmpLVE96Y3pUdlgKK0VUUUNTWG1MRzVNK29paVl6SDB6cUxWVWtxSHZXNGZsTllzdmtRdzRWMkJMYXJ6d01OcTJsRjM1V0FVNlZBOUoKK2JZdy8zaUFsN3paRUp1RTcrZTVPYkwvc1d0Nkd3RmY3OFFWTWdzS29ub3h0RFE0QjdEalZHdy9XVEtsb245ZlYKKzRqU1pobHc4MW5YNUdobnZybmtZaGlEMlkrNlpFemNVSW9CNFdqekJMUTJCNHJmNmp5Njg2VGw1Mnl1eWRacFUKK3MxMGRYOHlEYnFVUEJremkzdXZvY0ZPS1pkODBoSHErM2N5NElLUDQwZkIxZndVY1FsQWoyYktnT1BZZytvR0IKKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9wcm9ncmFtcy90ZXN0L2JlbmNobWFyay5jIGIvcHJvZ3JhbXMvdGVzdC9iZW5jaG1hcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODY5Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvdGVzdC9iZW5jaG1hcmsuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqICBCZW5jaG1hcmsgZGVtb25zdHJhdGlvbiBwcm9ncmFtCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBDaHJpc3RvcGhlIERldmluZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAieHlzc2wvY29uZmlnLmgiCisKKyNpbmNsdWRlICJ4eXNzbC9tZDQuaCIKKyNpbmNsdWRlICJ4eXNzbC9tZDUuaCIKKyNpbmNsdWRlICJ4eXNzbC9zaGExLmgiCisjaW5jbHVkZSAieHlzc2wvc2hhMi5oIgorI2luY2x1ZGUgInh5c3NsL2FyYzQuaCIKKyNpbmNsdWRlICJ4eXNzbC9kZXMuaCIKKyNpbmNsdWRlICJ4eXNzbC9hZXMuaCIKKyNpbmNsdWRlICJ4eXNzbC9yc2EuaCIKKyNpbmNsdWRlICJ4eXNzbC90aW1pbmcuaCIKKworI2RlZmluZSBCVUZTSVpFIDEwMjQKKworc3RhdGljIGludCBteXJhbmQoIHZvaWQgKnJuZ19zdGF0ZSApCit7CisgICAgaWYoIHJuZ19zdGF0ZSAhPSBOVUxMICkKKyAgICAgICAgcm5nX3N0YXRlICA9IE5VTEw7CisKKyAgICByZXR1cm4oIHJhbmQoKSApOworfQorCit1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpFXTsKKworaW50IG1haW4oIHZvaWQgKQoreworICAgIGludCBrZXlzaXplOworICAgIHVuc2lnbmVkIGxvbmcgaSwgaiwgdHNjOworICAgIHVuc2lnbmVkIGNoYXIgdG1wWzMyXTsKKyNpZiBkZWZpbmVkKFhZU1NMX0FSQzRfQykKKyAgICBhcmM0X2NvbnRleHQgYXJjNDsKKyNlbmRpZgorI2lmIGRlZmluZWQoWFlTU0xfREVTX0MpCisgICAgZGVzM19jb250ZXh0IGRlczM7CisgICAgZGVzX2NvbnRleHQgZGVzOworI2VuZGlmCisjaWYgZGVmaW5lZChYWVNTTF9BRVNfQykKKyAgICBhZXNfY29udGV4dCBhZXM7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFhZU1NMX1JTQV9DKQorICAgIHJzYV9jb250ZXh0IHJzYTsKKyNlbmRpZgorCisgICAgbWVtc2V0KCBidWYsIDB4QUEsIHNpemVvZiggYnVmICkgKTsKKworICAgIHByaW50ZiggIlxuIiApOworCisjaWYgZGVmaW5lZChYWVNTTF9NRDRfQykKKyAgICBwcmludGYoICIgIE1ENCAgICAgICA6ICAiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIHNldF9hbGFybSggMSApOworICAgIGZvciggaSA9IDE7ICEgYWxhcm1lZDsgaSsrICkKKyAgICAgICAgbWQ0KCBidWYsIEJVRlNJWkUsIHRtcCApOworCisgICAgdHNjID0gaGFyZGNsb2NrKCk7CisgICAgZm9yKCBqID0gMDsgaiA8IDEwMjQ7IGorKyApCisgICAgICAgIG1kNCggYnVmLCBCVUZTSVpFLCB0bXAgKTsKKworICAgIHByaW50ZiggIiU5bHUgS2IvcywgICU5bHUgY3ljbGVzL2J5dGVcbiIsIGkgKiBCVUZTSVpFIC8gMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgKCBoYXJkY2xvY2soKSAtIHRzYyApIC8gKCBqICogQlVGU0laRSApICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWFlTU0xfTUQ1X0MpCisgICAgcHJpbnRmKCAiICBNRDUgICAgICAgOiAgIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBzZXRfYWxhcm0oIDEgKTsKKyAgICBmb3IoIGkgPSAxOyAhIGFsYXJtZWQ7IGkrKyApCisgICAgICAgIG1kNSggYnVmLCBCVUZTSVpFLCB0bXAgKTsKKworICAgIHRzYyA9IGhhcmRjbG9jaygpOworICAgIGZvciggaiA9IDA7IGogPCAxMDI0OyBqKysgKQorICAgICAgICBtZDUoIGJ1ZiwgQlVGU0laRSwgdG1wICk7CisKKyAgICBwcmludGYoICIlOWx1IEtiL3MsICAlOWx1IGN5Y2xlcy9ieXRlXG4iLCBpICogQlVGU0laRSAvIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICggaGFyZGNsb2NrKCkgLSB0c2MgKSAvICggaiAqIEJVRlNJWkUgKSApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFhZU1NMX1NIQTFfQykKKyAgICBwcmludGYoICIgIFNIQS0xICAgICA6ICAiICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgIHNldF9hbGFybSggMSApOworICAgIGZvciggaSA9IDE7ICEgYWxhcm1lZDsgaSsrICkKKyAgICAgICAgc2hhMSggYnVmLCBCVUZTSVpFLCB0bXAgKTsKKworICAgIHRzYyA9IGhhcmRjbG9jaygpOworICAgIGZvciggaiA9IDA7IGogPCAxMDI0OyBqKysgKQorICAgICAgICBzaGExKCBidWYsIEJVRlNJWkUsIHRtcCApOworCisgICAgcHJpbnRmKCAiJTlsdSBLYi9zLCAgJTlsdSBjeWNsZXMvYnl0ZVxuIiwgaSAqIEJVRlNJWkUgLyAxMDI0LAorICAgICAgICAgICAgICAgICAgICAoIGhhcmRjbG9jaygpIC0gdHNjICkgLyAoIGogKiBCVUZTSVpFICkgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9TSEEyX0MpCisgICAgcHJpbnRmKCAiICBTSEEtMjU2ICAgOiAgIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBzZXRfYWxhcm0oIDEgKTsKKyAgICBmb3IoIGkgPSAxOyAhIGFsYXJtZWQ7IGkrKyApCisgICAgICAgIHNoYTIoIGJ1ZiwgQlVGU0laRSwgdG1wLCAwICk7CisKKyAgICB0c2MgPSBoYXJkY2xvY2soKTsKKyAgICBmb3IoIGogPSAwOyBqIDwgMTAyNDsgaisrICkKKyAgICAgICAgc2hhMiggYnVmLCBCVUZTSVpFLCB0bXAsIDAgKTsKKworICAgIHByaW50ZiggIiU5bHUgS2IvcywgICU5bHUgY3ljbGVzL2J5dGVcbiIsIGkgKiBCVUZTSVpFIC8gMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgKCBoYXJkY2xvY2soKSAtIHRzYyApIC8gKCBqICogQlVGU0laRSApICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWFlTU0xfQVJDNF9DKQorICAgIHByaW50ZiggIiAgQVJDNCAgICAgIDogICIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworCisgICAgYXJjNF9zZXR1cCggJmFyYzQsIHRtcCwgMzIgKTsKKworICAgIHNldF9hbGFybSggMSApOworICAgIGZvciggaSA9IDE7ICEgYWxhcm1lZDsgaSsrICkKKyAgICAgICAgYXJjNF9jcnlwdCggJmFyYzQsIGJ1ZiwgQlVGU0laRSApOworCisgICAgdHNjID0gaGFyZGNsb2NrKCk7CisgICAgZm9yKCBqID0gMDsgaiA8IDEwMjQ7IGorKyApCisgICAgICAgIGFyYzRfY3J5cHQoICZhcmM0LCBidWYsIEJVRlNJWkUgKTsKKworICAgIHByaW50ZiggIiU5bHUgS2IvcywgICU5bHUgY3ljbGVzL2J5dGVcbiIsIGkgKiBCVUZTSVpFIC8gMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgKCBoYXJkY2xvY2soKSAtIHRzYyApIC8gKCBqICogQlVGU0laRSApICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWFlTU0xfREVTX0MpCisgICAgcHJpbnRmKCAiICAzREVTICAgICAgOiAgIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBkZXMzX3NldDNrZXlfZW5jKCAmZGVzMywgdG1wICk7CisKKyAgICBzZXRfYWxhcm0oIDEgKTsKKyAgICBmb3IoIGkgPSAxOyAhIGFsYXJtZWQ7IGkrKyApCisgICAgICAgIGRlczNfY3J5cHRfY2JjKCAmZGVzMywgREVTX0VOQ1JZUFQsIEJVRlNJWkUsIHRtcCwgYnVmLCBidWYgKTsKKworICAgIHRzYyA9IGhhcmRjbG9jaygpOworICAgIGZvciggaiA9IDA7IGogPCAxMDI0OyBqKysgKQorICAgICAgICBkZXMzX2NyeXB0X2NiYyggJmRlczMsIERFU19FTkNSWVBULCBCVUZTSVpFLCB0bXAsIGJ1ZiwgYnVmICk7CisKKyAgICBwcmludGYoICIlOWx1IEtiL3MsICAlOWx1IGN5Y2xlcy9ieXRlXG4iLCBpICogQlVGU0laRSAvIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICggaGFyZGNsb2NrKCkgLSB0c2MgKSAvICggaiAqIEJVRlNJWkUgKSApOworCisgICAgcHJpbnRmKCAiICBERVMgICAgICAgOiAgIiApOworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBkZXNfc2V0a2V5X2VuYyggJmRlcywgdG1wICk7CisKKyAgICBzZXRfYWxhcm0oIDEgKTsKKyAgICBmb3IoIGkgPSAxOyAhIGFsYXJtZWQ7IGkrKyApCisgICAgICAgIGRlc19jcnlwdF9jYmMoICZkZXMsIERFU19FTkNSWVBULCBCVUZTSVpFLCB0bXAsIGJ1ZiwgYnVmICk7CisKKyAgICB0c2MgPSBoYXJkY2xvY2soKTsKKyAgICBmb3IoIGogPSAwOyBqIDwgMTAyNDsgaisrICkKKyAgICAgICAgZGVzX2NyeXB0X2NiYyggJmRlcywgREVTX0VOQ1JZUFQsIEJVRlNJWkUsIHRtcCwgYnVmLCBidWYgKTsKKworICAgIHByaW50ZiggIiU5bHUgS2IvcywgICU5bHUgY3ljbGVzL2J5dGVcbiIsIGkgKiBCVUZTSVpFIC8gMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgKCBoYXJkY2xvY2soKSAtIHRzYyApIC8gKCBqICogQlVGU0laRSApICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWFlTU0xfQUVTX0MpCisgICAgZm9yKCBrZXlzaXplID0gMTI4OyBrZXlzaXplIDw9IDI1Njsga2V5c2l6ZSArPSA2NCApCisgICAgeworICAgICAgICBwcmludGYoICIgIEFFUy0lZCAgIDogICIsIGtleXNpemUgKTsKKyAgICAgICAgZmZsdXNoKCBzdGRvdXQgKTsKKworICAgICAgICBtZW1zZXQoIGJ1ZiwgMCwgc2l6ZW9mKCBidWYgKSApOworICAgICAgICBtZW1zZXQoIHRtcCwgMCwgc2l6ZW9mKCB0bXAgKSApOworICAgICAgICBhZXNfc2V0a2V5X2VuYyggJmFlcywgdG1wLCBrZXlzaXplICk7CisKKyAgICAgICAgc2V0X2FsYXJtKCAxICk7CisKKyAgICAgICAgZm9yKCBpID0gMTsgISBhbGFybWVkOyBpKysgKQorICAgICAgICAgICAgYWVzX2NyeXB0X2NiYyggJmFlcywgQUVTX0VOQ1JZUFQsIEJVRlNJWkUsIHRtcCwgYnVmLCBidWYgKTsKKworICAgICAgICB0c2MgPSBoYXJkY2xvY2soKTsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IDQwOTY7IGorKyApCisgICAgICAgICAgICBhZXNfY3J5cHRfY2JjKCAmYWVzLCBBRVNfRU5DUllQVCwgQlVGU0laRSwgdG1wLCBidWYsIGJ1ZiApOworCisgICAgICAgIHByaW50ZiggIiU5bHUgS2IvcywgICU5bHUgY3ljbGVzL2J5dGVcbiIsIGkgKiBCVUZTSVpFIC8gMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICggaGFyZGNsb2NrKCkgLSB0c2MgKSAvICggaiAqIEJVRlNJWkUgKSApOworICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9SU0FfQykKKyAgICByc2FfaW5pdCggJnJzYSwgUlNBX1BLQ1NfVjE1LCAwLCBteXJhbmQsIE5VTEwgKTsKKyAgICByc2FfZ2VuX2tleSggJnJzYSwgMTAyNCwgNjU1MzcgKTsKKworICAgIHByaW50ZiggIiAgUlNBLTEwMjQgIDogICIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworICAgIHNldF9hbGFybSggMyApOworCisgICAgZm9yKCBpID0gMTsgISBhbGFybWVkOyBpKysgKQorICAgIHsKKyAgICAgICAgYnVmWzBdID0gMDsKKyAgICAgICAgcnNhX3B1YmxpYyggJnJzYSwgYnVmLCBidWYgKTsKKyAgICB9CisKKyAgICBwcmludGYoICIlOWx1ICBwdWJsaWMvc1xuIiwgaSAvIDMgKTsKKworICAgIHByaW50ZiggIiAgUlNBLTEwMjQgIDogICIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOworICAgIHNldF9hbGFybSggMyApOworCisgICAgZm9yKCBpID0gMTsgISBhbGFybWVkOyBpKysgKQorICAgIHsKKyAgICAgICAgYnVmWzBdID0gMDsKKyAgICAgICAgcnNhX3ByaXZhdGUoICZyc2EsIGJ1ZiwgYnVmICk7CisgICAgfQorCisgICAgcHJpbnRmKCAiJTlsdSBwcml2YXRlL3NcblxuIiwgaSAvIDMgKTsKKworICAgIHJzYV9mcmVlKCAmcnNhICk7CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisgICAgcHJpbnRmKCAiICBQcmVzcyBFbnRlciB0byBleGl0IHRoaXMgcHJvZ3JhbS5cbiIgKTsKKyAgICBmZmx1c2goIHN0ZG91dCApOyBnZXRjaGFyKCk7CisjZW5kaWYKKworICAgIHJldHVybiggMCApOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvdGVzdC9zZWxmdGVzdC5jIGIvcHJvZ3JhbXMvdGVzdC9zZWxmdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzBlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy90ZXN0L3NlbGZ0ZXN0LmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAgU2VsZi10ZXN0IGRlbW9uc3RyYXRpb24gcHJvZ3JhbQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInh5c3NsL2NvbmZpZy5oIgorCisjaW5jbHVkZSAieHlzc2wvbWQyLmgiCisjaW5jbHVkZSAieHlzc2wvbWQ0LmgiCisjaW5jbHVkZSAieHlzc2wvbWQ1LmgiCisjaW5jbHVkZSAieHlzc2wvc2hhMS5oIgorI2luY2x1ZGUgInh5c3NsL3NoYTIuaCIKKyNpbmNsdWRlICJ4eXNzbC9zaGE0LmgiCisjaW5jbHVkZSAieHlzc2wvYXJjNC5oIgorI2luY2x1ZGUgInh5c3NsL2Rlcy5oIgorI2luY2x1ZGUgInh5c3NsL2Flcy5oIgorI2luY2x1ZGUgInh5c3NsL2Jhc2U2NC5oIgorI2luY2x1ZGUgInh5c3NsL2JpZ251bS5oIgorI2luY2x1ZGUgInh5c3NsL3JzYS5oIgorI2luY2x1ZGUgInh5c3NsL3g1MDkuaCIKKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKQoreworICAgIGludCByZXQsIHY7CisKKyAgICBpZiggYXJnYyA9PSAyICYmIHN0cmNtcCggYXJndlsxXSwgIi1xdWlldCIgKSA9PSAwICkKKyAgICAgICAgdiA9IDA7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdiA9IDE7CisgICAgICAgIHByaW50ZiggIlxuIiApOworICAgIH0KKworI2lmIGRlZmluZWQoWFlTU0xfTUQyX0MpCisgICAgaWYoICggcmV0ID0gbWQyX3NlbGZfdGVzdCggdiApICkgIT0gMCApCisgICAgICAgIHJldHVybiggcmV0ICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWFlTU0xfTUQ0X0MpCisgICAgaWYoICggcmV0ID0gbWQ0X3NlbGZfdGVzdCggdiApICkgIT0gMCApCisgICAgICAgIHJldHVybiggcmV0ICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWFlTU0xfTUQ1X0MpCisgICAgaWYoICggcmV0ID0gbWQ1X3NlbGZfdGVzdCggdiApICkgIT0gMCApCisgICAgICAgIHJldHVybiggcmV0ICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWFlTU0xfU0hBMV9DKQorICAgIGlmKCAoIHJldCA9IHNoYTFfc2VsZl90ZXN0KCB2ICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9TSEEyX0MpCisgICAgaWYoICggcmV0ID0gc2hhMl9zZWxmX3Rlc3QoIHYgKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIHJldCApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFhZU1NMX1NIQTRfQykKKyAgICBpZiggKCByZXQgPSBzaGE0X3NlbGZfdGVzdCggdiApICkgIT0gMCApCisgICAgICAgIHJldHVybiggcmV0ICk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWFlTU0xfQVJDNF9DKQorICAgIGlmKCAoIHJldCA9IGFyYzRfc2VsZl90ZXN0KCB2ICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9ERVNfQykKKyAgICBpZiggKCByZXQgPSBkZXNfc2VsZl90ZXN0KCB2ICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9BRVNfQykKKyAgICBpZiggKCByZXQgPSBhZXNfc2VsZl90ZXN0KCB2ICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9CQVNFNjRfQykKKyAgICBpZiggKCByZXQgPSBiYXNlNjRfc2VsZl90ZXN0KCB2ICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9CSUdOVU1fQykKKyAgICBpZiggKCByZXQgPSBtcGlfc2VsZl90ZXN0KCB2ICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9SU0FfQykKKyAgICBpZiggKCByZXQgPSByc2Ffc2VsZl90ZXN0KCB2ICkgKSAhPSAwICkKKyAgICAgICAgcmV0dXJuKCByZXQgKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYWVNTTF9YNTA5X0MpCisgICAgaWYoICggcmV0ID0geDUwOV9zZWxmX3Rlc3QoIHYgKSApICE9IDAgKQorICAgICAgICByZXR1cm4oIHJldCApOworI2VuZGlmCisKKyAgICBpZiggdiAhPSAwICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIiAgWyBBbGwgdGVzdHMgcGFzc2VkIF1cblxuIiApOworI2lmZGVmIFdJTjMyCisgICAgICAgIHByaW50ZiggIiAgUHJlc3MgRW50ZXIgdG8gZXhpdCB0aGlzIHByb2dyYW0uXG4iICk7CisgICAgICAgIGZmbHVzaCggc3Rkb3V0ICk7IGdldGNoYXIoKTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiggcmV0ICk7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy90ZXN0L3NzbF90ZXN0LmMgYi9wcm9ncmFtcy90ZXN0L3NzbF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmZjdkOAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3Rlc3Qvc3NsX3Rlc3QuYwpAQCAtMCwwICsxLDU4MCBAQAorLyoKKyAqICBTU0wvVExTIHN0cmVzcyB0ZXN0aW5nIHByb2dyYW0KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ4eXNzbC9uZXQuaCIKKyNpbmNsdWRlICJ4eXNzbC9zc2wuaCIKKyNpbmNsdWRlICJ4eXNzbC9oYXZlZ2UuaCIKKyNpbmNsdWRlICJ4eXNzbC90aW1pbmcuaCIKKyNpbmNsdWRlICJ4eXNzbC9jZXJ0cy5oIgorCisjZGVmaW5lIE9QTU9ERV9OT05FICAgICAgICAgICAgIDAKKyNkZWZpbmUgT1BNT0RFX0NMSUVOVCAgICAgICAgICAgMQorI2RlZmluZSBPUE1PREVfU0VSVkVSICAgICAgICAgICAyCisKKyNkZWZpbmUgSU9NT0RFX0JMT0NLICAgICAgICAgICAgMAorI2RlZmluZSBJT01PREVfTk9OQkxPQ0sgICAgICAgICAxCisKKyNkZWZpbmUgQ09NTUFORF9SRUFEICAgICAgICAgICAgMQorI2RlZmluZSBDT01NQU5EX1dSSVRFICAgICAgICAgICAyCisjZGVmaW5lIENPTU1BTkRfQk9USCAgICAgICAgICAgIDMKKworI2RlZmluZSBERkxfT1BNT0RFICAgICAgICAgICAgICBPUE1PREVfTk9ORQorI2RlZmluZSBERkxfSU9NT0RFICAgICAgICAgICAgICBJT01PREVfQkxPQ0sKKyNkZWZpbmUgREZMX1NFUlZFUl9OQU1FICAgICAgICAgImxvY2FsaG9zdCIKKyNkZWZpbmUgREZMX1NFUlZFUl9QT1JUICAgICAgICAgNDQzMworI2RlZmluZSBERkxfQ09NTUFORCAgICAgICAgICAgICBDT01NQU5EX1JFQUQKKyNkZWZpbmUgREZMX0JVRkZFUl9TSVpFICAgICAgICAgMTAyNAorI2RlZmluZSBERkxfTUFYX0JZVEVTICAgICAgICAgICAwCisjZGVmaW5lIERGTF9ERUJVR19MRVZFTCAgICAgICAgIDAKKyNkZWZpbmUgREZMX0NPTk5fVElNRU9VVCAgICAgICAgMAorI2RlZmluZSBERkxfTUFYX0NPTk5FQ1RJT05TICAgICAwCisjZGVmaW5lIERGTF9TRVNTSU9OX1JFVVNFICAgICAgIDEKKyNkZWZpbmUgREZMX1NFU1NJT05fTElGRVRJTUUgICAgODY0MDAKKyNkZWZpbmUgREZMX0ZPUkNFX0NJUEhFUiAgICAgICAgMAorCisvKgorICogc2VydmVyLXNwZWNpZmljIGRhdGEKKyAqLworY2hhciAqZGhtX0cgPSAiNCI7CitjaGFyICpkaG1fUCA9IAorIkU0MDA0QzFGOTQxODIwMDAxMDNEODgzQTQ0OEIzRjgwMkNFNEI0NEE4MzMwMTI3MDAwMkMyMEQwMzIxQ0ZEMDAiIFwKKyIxMUNDRUY3ODRDMjZBNDAwRjQzREZCOTAxQkNBNzUzOEYyQzZCMTc2MDAxQ0Y1QTBGRDE2RDJDNDhCMUQwQzFDIiBcCisiRjZBQzhFMURBNkJDQzNCNEUxRjk2QjA1NjQ5NjUzMDBGRkExRDBCNjAxRUIyODAwRjQ4OUFBNTEyQzRCMjQ4QyIgXAorIjAxRjc2OTQ5QTYwQkI3RjAwQTQwQjFFQUI2NEJERDQ4RThBNzAwRDYwQjdGMTIwMEZBOEU3N0IwQTk3OURBQkYiOworCitpbnQgc2VydmVyX2ZkID0gLTE7CisKKy8qCisgKiBnbG9iYWwgb3B0aW9ucworICovCitzdHJ1Y3Qgb3B0aW9ucworeworICAgIGludCBvcG1vZGU7ICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gbW9kZSAoY2xpZW50IG9yIHNlcnZlcikgICAgKi8KKyAgICBpbnQgaW9tb2RlOyAgICAgICAgICAgICAgICAgLyogSS9PIG1vZGUgKGJsb2NraW5nIG9yIG5vbi1ibG9ja2luZykgICovCisgICAgY2hhciAqc2VydmVyX25hbWU7ICAgICAgICAgIC8qIGhvc3RuYW1lIG9mIHRoZSBzZXJ2ZXIgKGNsaWVudCBvbmx5KSAqLworICAgIGludCBzZXJ2ZXJfcG9ydDsgICAgICAgICAgICAvKiBwb3J0IG9uIHdoaWNoIHRoZSBzc2wgc2VydmljZSBydW5zICAgKi8KKyAgICBpbnQgY29tbWFuZDsgICAgICAgICAgICAgICAgLyogd2hhdCB0byBkbzogcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gICovCisgICAgaW50IGJ1ZmZlcl9zaXplOyAgICAgICAgICAgIC8qIHNpemUgb2YgdGhlIHNlbmQvcmVjZWl2ZSBidWZmZXIgICAgICAqLworICAgIGludCBtYXhfYnl0ZXM7ICAgICAgICAgICAgICAvKiBtYXguICMgb2YgYnl0ZXMgYmVmb3JlIGEgcmVjb25uZWN0ICAgKi8KKyAgICBpbnQgZGVidWdfbGV2ZWw7ICAgICAgICAgICAgLyogbGV2ZWwgb2YgZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGNvbm5fdGltZW91dDsgICAgICAgICAgIC8qIG1heC4gZGVsYXkgYmVmb3JlIGEgcmVjb25uZWN0ICAgICAgICAqLworICAgIGludCBtYXhfY29ubmVjdGlvbnM7ICAgICAgICAvKiBtYXguIG51bWJlciBvZiByZWNvbm5lY3Rpb25zICAgICAgICAgKi8KKyAgICBpbnQgc2Vzc2lvbl9yZXVzZTsgICAgICAgICAgLyogZmxhZyB0byByZXVzZSB0aGUga2V5aW5nIG1hdGVyaWFsICAgICovCisgICAgaW50IHNlc3Npb25fbGlmZXRpbWU7ICAgICAgIC8qIGlmIHJlYWNoZWQsIHNlc3Npb24gZGF0YSBpcyBleHBpcmVkICAqLworICAgIGludCBmb3JjZV9jaXBoZXJbMl07ICAgICAgICAvKiBwcm90b2NvbC9jaXBoZXIgdG8gdXNlLCBvciBhbGwgICAgICAgKi8KK307CisKKy8qCisgKiBBbHRob3VnaCB0aGlzIFBSTkcgaGFzIGdvb2Qgc3RhdGlzdGljYWwgcHJvcGVydGllcyAoZWcuIHBhc3NlcworICogRElFSEFSRCksIGl0IGlzIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgaW50IGxjcHBtNSggdW5zaWduZWQgbG9uZyBpbnQgKnN0YXRlICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGludCB1LCB2OworCisgICAgdSA9IHYgPSBzdGF0ZVs0XSBeIDE7CisgICAgc3RhdGVbdSAmIDNdIF49IHU7CisgICAgdSBePSAodiA8PCAxMikgXiAodiA+PiAxMik7CisgICAgdSBePSB2ICogc3RhdGVbMF07IHYgPj49IDg7CisgICAgdSBePSB2ICogc3RhdGVbMV07IHYgPj49IDg7CisgICAgdSBePSB2ICogc3RhdGVbMl07IHYgPj49IDg7CisgICAgdSBePSB2ICogc3RhdGVbM107CisgICAgdSAmPSAweEZGRkZGRkZGOworICAgIHN0YXRlWzRdID0gdTsKKworICAgIHJldHVybiggdSApOworfQorCit2b2lkIG15X2RlYnVnKCB2b2lkICpjdHgsIGludCBsZXZlbCwgY2hhciAqc3RyICkKK3sKKyAgICBpZiggbGV2ZWwgPCAoKHN0cnVjdCBvcHRpb25zICopIGN0eCktPmRlYnVnX2xldmVsICkKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJXMiLCBzdHIgKTsKK30KKworLyoKKyAqIHBlcmZvcm0gYSBzaW5nbGUgU1NMIGNvbm5lY3Rpb24KKyAqLworc3RhdGljIGludCBzc2xfdGVzdCggc3RydWN0IG9wdGlvbnMgKm9wdCApCit7CisgICAgaW50IHJldCwgaTsKKyAgICBpbnQgY2xpZW50X2ZkOworICAgIGludCBieXRlc190b19yZWFkOworICAgIGludCBieXRlc190b193cml0ZTsKKyAgICBpbnQgb2Zmc2V0X3RvX3JlYWQ7CisgICAgaW50IG9mZnNldF90b193cml0ZTsKKworICAgIGxvbmcgaW50IG5iX3JlYWQ7CisgICAgbG9uZyBpbnQgbmJfd3JpdHRlbjsKKworICAgIHVuc2lnbmVkIGxvbmcgcmVhZF9zdGF0ZVs1XTsKKyAgICB1bnNpZ25lZCBsb25nIHdyaXRlX3N0YXRlWzVdOworCisgICAgdW5zaWduZWQgY2hhciAqcmVhZF9idWY7CisgICAgdW5zaWduZWQgY2hhciAqd3JpdGVfYnVmOworCisgICAgc3RydWN0IGhyX3RpbWUgdDsKKyAgICBoYXZlZ2Vfc3RhdGUgaHM7CisgICAgc3NsX2NvbnRleHQgc3NsOworICAgIHNzbF9zZXNzaW9uIHNzbjsKKyAgICB4NTA5X2NlcnQgc3J2Y2VydDsKKyAgICByc2FfY29udGV4dCByc2E7CisKKyAgICByZXQgPSAxOworCisgICAgaGF2ZWdlX2luaXQoICZocyApOworICAgIGdldF90aW1lciggJnQsIDEgKTsKKworICAgIG1lbXNldCggcmVhZF9zdGF0ZSwgMCwgc2l6ZW9mKCByZWFkX3N0YXRlICkgKTsKKyAgICBtZW1zZXQoIHdyaXRlX3N0YXRlLCAwLCBzaXplb2YoIHdyaXRlX3N0YXRlICkgKTsKKworICAgIG1lbXNldCggJnNydmNlcnQsIDAsIHNpemVvZiggeDUwOV9jZXJ0ICkgKTsKKyAgICBtZW1zZXQoICZyc2EsIDAsIHNpemVvZiggcnNhX2NvbnRleHQgKSApOworCisgICAgaWYoIG9wdC0+b3Btb2RlID09IE9QTU9ERV9DTElFTlQgKQorICAgIHsKKyAgICAgICAgaWYoICggcmV0ID0gbmV0X2Nvbm5lY3QoICZjbGllbnRfZmQsIG9wdC0+c2VydmVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQtPnNlcnZlcl9wb3J0ICkgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiICAhIG5ldF9jb25uZWN0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAoIHJldCA9IHNzbF9pbml0KCAmc3NsICkgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiICAhIHNzbF9pbml0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHNzbF9zZXRfZW5kcG9pbnQoICZzc2wsIFNTTF9JU19DTElFTlQgKTsKKyAgICB9CisKKyAgICBpZiggb3B0LT5vcG1vZGUgPT0gT1BNT0RFX1NFUlZFUiApCisgICAgeworICAgICAgICByZXQgPSAgeDUwOXBhcnNlX2NydCggJnNydmNlcnQsICh1bnNpZ25lZCBjaGFyICopIHRlc3Rfc3J2X2NydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiggdGVzdF9zcnZfY3J0ICkgKTsKKyAgICAgICAgaWYoIHJldCAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiICAhICB4NTA5cGFyc2VfY3J0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gIHg1MDlwYXJzZV9jcnQoICZzcnZjZXJ0LCAodW5zaWduZWQgY2hhciAqKSB0ZXN0X2NhX2NydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiggdGVzdF9jYV9jcnQgKSApOworICAgICAgICBpZiggcmV0ICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoICIgICEgIHg1MDlwYXJzZV9jcnQgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSAgeDUwOXBhcnNlX2tleSggJnJzYSwgKHVuc2lnbmVkIGNoYXIgKikgdGVzdF9zcnZfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCB0ZXN0X3Nydl9rZXkgKSwgTlVMTCwgMCApOworICAgICAgICBpZiggcmV0ICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoICIgICEgIHg1MDlwYXJzZV9rZXkgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiggc2VydmVyX2ZkIDwgMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAoIHJldCA9IG5ldF9iaW5kKCAmc2VydmVyX2ZkLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQtPnNlcnZlcl9wb3J0ICkgKSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoICIgICEgbmV0X2JpbmQgcmV0dXJuZWQgJWRcblxuIiwgcmV0ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCAoIHJldCA9IG5ldF9hY2NlcHQoIHNlcnZlcl9mZCwgJmNsaWVudF9mZCwgTlVMTCApICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZiggIiAgISBuZXRfYWNjZXB0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAoIHJldCA9IHNzbF9pbml0KCAmc3NsICkgKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiICAhIHNzbF9pbml0IHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHNzbF9zZXRfZW5kcG9pbnQoICZzc2wsIFNTTF9JU19TRVJWRVIgKTsKKyAgICAgICAgc3NsX3NldF9kaF9wYXJhbSggJnNzbCwgZGhtX1AsIGRobV9HICk7CisgICAgICAgIHNzbF9zZXRfY2FfY2hhaW4oICZzc2wsIHNydmNlcnQubmV4dCwgTlVMTCApOworICAgICAgICBzc2xfc2V0X293bl9jZXJ0KCAmc3NsLCAmc3J2Y2VydCwgJnJzYSApOworICAgIH0KKworICAgIHNzbF9zZXRfYXV0aG1vZGUoICZzc2wsIFNTTF9WRVJJRllfTk9ORSApOworCisgICAgc3NsX3NldF9ybmcoICZzc2wsIGhhdmVnZV9yYW5kLCAmaHMgKTsKKyAgICBzc2xfc2V0X2RiZyggJnNzbCwgbXlfZGVidWcsIG9wdCApOworICAgIHNzbF9zZXRfYmlvKCAmc3NsLCBuZXRfcmVjdiwgJmNsaWVudF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV0X3NlbmQsICZjbGllbnRfZmQgKTsKKworICAgIHNzbF9zZXRfc2Vzc2lvbiggJnNzbCwgb3B0LT5zZXNzaW9uX3JldXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0LT5zZXNzaW9uX2xpZmV0aW1lLCAmc3NuICk7CisKKyAgICBpZiggb3B0LT5mb3JjZV9jaXBoZXJbMF0gPT0gREZMX0ZPUkNFX0NJUEhFUiApCisgICAgICAgICAgc3NsX3NldF9jaXBoZXJzKCAmc3NsLCBzc2xfZGVmYXVsdF9jaXBoZXJzICk7CisgICAgZWxzZSAgc3NsX3NldF9jaXBoZXJzKCAmc3NsLCBvcHQtPmZvcmNlX2NpcGhlciApOworCisgICAgaWYoIG9wdC0+aW9tb2RlID09IElPTU9ERV9OT05CTE9DSyApCisgICAgICAgIG5ldF9zZXRfbm9uYmxvY2soIGNsaWVudF9mZCApOworCisgICAgIHJlYWRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jKCBvcHQtPmJ1ZmZlcl9zaXplICk7CisgICAgd3JpdGVfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jKCBvcHQtPmJ1ZmZlcl9zaXplICk7CisKKyAgICBpZiggcmVhZF9idWYgPT0gTlVMTCB8fCB3cml0ZV9idWYgPT0gTlVMTCApCisgICAgeworICAgICAgICBwcmludGYoICIgICEgbWFsbG9jKCVkIGJ5dGVzKSBmYWlsZWRcblxuIiwgb3B0LT5idWZmZXJfc2l6ZSApOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgbmJfcmVhZCA9IGJ5dGVzX3RvX3JlYWQgPSAwOworICAgIG5iX3dyaXR0ZW4gPSBieXRlc190b193cml0ZSA9IDA7CisKKyAgICB3aGlsZSggMSApCisgICAgeworICAgICAgICBpZiggb3B0LT5jb21tYW5kICYgQ09NTUFORF9XUklURSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBieXRlc190b193cml0ZSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSggYnl0ZXNfdG9fd3JpdGUgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3RvX3dyaXRlID0gcmFuZCgpICUgb3B0LT5idWZmZXJfc2l6ZTsKKworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBieXRlc190b193cml0ZTsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmW2ldID0gKHVuc2lnbmVkIGNoYXIpIGxjcHBtNSggd3JpdGVfc3RhdGUgKTsKKworICAgICAgICAgICAgICAgIG9mZnNldF90b193cml0ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldCA9IHNzbF93cml0ZSggJnNzbCwgd3JpdGVfYnVmICsgb2Zmc2V0X3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc190b193cml0ZSApOworCisgICAgICAgICAgICBpZiggcmV0ID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5iX3dyaXR0ZW4gKz0gcmV0OworICAgICAgICAgICAgICAgIGJ5dGVzX3RvX3dyaXRlICAtPSByZXQ7CisgICAgICAgICAgICAgICAgb2Zmc2V0X3RvX3dyaXRlICs9IHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHJldCA9PSBYWVNTTF9FUlJfU1NMX1BFRVJfQ0xPU0VfTk9USUZZIHx8CisgICAgICAgICAgICAgICAgcmV0ID09IFhZU1NMX0VSUl9ORVRfQ09OTl9SRVNFVCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCByZXQgPCAwICYmIHJldCAhPSBYWVNTTF9FUlJfTkVUX1RSWV9BR0FJTiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCAiICAhIHNzbF93cml0ZSByZXR1cm5lZCAlZFxuXG4iLCByZXQgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCBvcHQtPmNvbW1hbmQgJiBDT01NQU5EX1JFQUQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggYnl0ZXNfdG9fcmVhZCA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlc190b19yZWFkID0gcmFuZCgpICUgb3B0LT5idWZmZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICBvZmZzZXRfdG9fcmVhZCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldCA9IHNzbF9yZWFkKCAmc3NsLCByZWFkX2J1ZiArIG9mZnNldF90b19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3RvX3JlYWQgKTsKKworICAgICAgICAgICAgaWYoIHJldCA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcmV0OyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlYWRfYnVmW29mZnNldF90b19yZWFkICsgaV0gIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSBsY3BwbTUoIHJlYWRfc3RhdGUgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoICIgICEgcGxhaW50ZXh0IG1pc21hdGNoXG5cbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5iX3JlYWQgKz0gcmV0OworICAgICAgICAgICAgICAgIGJ5dGVzX3RvX3JlYWQgLT0gcmV0OworICAgICAgICAgICAgICAgIG9mZnNldF90b19yZWFkICs9IHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHJldCA9PSBYWVNTTF9FUlJfU1NMX1BFRVJfQ0xPU0VfTk9USUZZIHx8CisgICAgICAgICAgICAgICAgcmV0ID09IFhZU1NMX0VSUl9ORVRfQ09OTl9SRVNFVCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCByZXQgPCAwICYmIHJldCAhPSBYWVNTTF9FUlJfTkVUX1RSWV9BR0FJTiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCAiICAhIHNzbF9yZWFkIHJldHVybmVkICVkXG5cbiIsIHJldCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gMDsKKworICAgICAgICBpZiggb3B0LT5tYXhfYnl0ZXMgIT0gMCAmJgorICAgICAgICAgICAgKCBvcHQtPm1heF9ieXRlcyA8PSBuYl9yZWFkIHx8CisgICAgICAgICAgICAgIG9wdC0+bWF4X2J5dGVzIDw9IG5iX3dyaXR0ZW4gKSApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiggb3B0LT5jb25uX3RpbWVvdXQgIT0gMCAmJgorICAgICAgICAgICAgb3B0LT5jb25uX3RpbWVvdXQgPD0gKGludCkgZ2V0X3RpbWVyKCAmdCwgMCApICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworZXhpdDoKKworICAgIGZmbHVzaCggc3Rkb3V0ICk7CisKKyAgICBpZiggcmVhZF9idWYgIT0gTlVMTCApCisgICAgICAgIGZyZWUoIHJlYWRfYnVmICk7CisKKyAgICBpZiggd3JpdGVfYnVmICE9IE5VTEwgKQorICAgICAgICBmcmVlKCB3cml0ZV9idWYgKTsKKworICAgIHNzbF9jbG9zZV9ub3RpZnkoICZzc2wgKTsKKyAgICB4NTA5X2ZyZWUoICZzcnZjZXJ0ICk7CisgICAgcnNhX2ZyZWUoICZyc2EgKTsKKyAgICBzc2xfZnJlZSggJnNzbCApOworICAgIG5ldF9jbG9zZSggY2xpZW50X2ZkICk7CisKKyAgICByZXR1cm4oIHJldCApOworfQorCisjZGVmaW5lIFVTQUdFIFwKKyAgICAiXG4gdXNhZ2U6IHNzbF90ZXN0IG9wbW9kZT08PiBjb21tYW5kPTw+Li4uXG4iICAgICAgICAgICAgICAgXAorICAgICJcbiBhY2NlcHRhYmxlIHBhcmFtZXRlcnM6XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiAgICBvcG1vZGU9Y2xpZW50L3NlcnZlciAgICAgICAgZGVmYXVsdDogPG5vbmU+XG4iICAgICAgICAgIFwKKyAgICAiICAgIGlvbW9kZT1ibG9jay9ub25ibG9jayAgICAgICBkZWZhdWx0OiBibG9ja1xuIiAgICAgICAgICAgXAorICAgICIgICAgc2VydmVyX25hbWU9JSVzICAgICAgICAgICAgICBkZWZhdWx0OiBsb2NhbGhvc3RcbiIgICAgICBcCisgICAgIiAgICBzZXJ2ZXJfcG9ydD0lJWQgICAgICAgICAgICAgIGRlZmF1bHQ6IDQ0MzNcbiIgICAgICAgICAgIFwKKyAgICAiICAgIGNvbW1hbmQ9cmVhZC93cml0ZS9ib3RoICAgICBkZWZhdWx0OiByZWFkXG4iICAgICAgICAgICAgXAorICAgICIgICAgYnVmZmVyX3NpemU9JSVkIChieXRlcykgICAgICBkZWZhdWx0OiAxMDI0XG4iICAgICAgICAgICBcCisgICAgIiAgICBtYXhfYnl0ZXM9JSVkIChieXRlcykgICAgICAgIGRlZmF1bHQ6IDAgKG5vIGxpbWl0KVxuIiAgIFwKKyAgICAiICAgIGRlYnVnX2xldmVsPSUlZCAgICAgICAgICAgICAgZGVmYXVsdDogMCAoZGlzYWJsZWQpXG4iICAgXAorICAgICIgICAgY29ubl90aW1lb3V0PSUlZCAobXMpICAgICAgICBkZWZhdWx0OiAwIChubyB0aW1lb3V0KVxuIiBcCisgICAgIiAgICBtYXhfY29ubmVjdGlvbnM9JSVkICAgICAgICAgIGRlZmF1bHQ6IDAgKG5vIGxpbWl0KVxuIiAgIFwKKyAgICAiICAgIHNlc3Npb25fcmV1c2U9b24vb2ZmICAgICAgICBkZWZhdWx0OiBvbiAoZW5hYmxlZClcbiIgICAgXAorICAgICIgICAgc2Vzc2lvbl9saWZldGltZT0lJWQgKHMpICAgICBkZWZhdWx0OiA4NjQwMFxuIiAgICAgICAgICBcCisgICAgIiAgICBmb3JjZV9jaXBoZXI9PG5hbWU+ICAgICAgICAgZGVmYXVsdDogYWxsIGVuYWJsZWRcbiIgICAgIFwKKyAgICAiIGFjY2VwdGFibGUgY2lwaGVyIG5hbWVzOlxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgICAgU1NMX1JTQV9SQzRfMTI4X01ENSAgICAgICAgIFNTTF9SU0FfUkM0XzEyOF9TSEFcbiIgICAgICBcCisgICAgIiAgICBTU0xfUlNBX0RFU18xNjhfU0hBICAgICAgICAgU1NMX0VESF9SU0FfREVTXzE2OF9TSEFcbiIgIFwKKyAgICAiICAgIFNTTF9SU0FfQUVTXzEyOF9TSEEgICAgICAgICBTU0xfRURIX1JTQV9BRVNfMjU2X1NIQVxuIiAgXAorICAgICIgICAgU1NMX1JTQV9BRVNfMjU2X1NIQVxuXG4iCisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKK3sKKyAgICBpbnQgaSwgaiwgbjsKKyAgICBpbnQgcmV0ID0gMTsKKyAgICBpbnQgbmJfY29ubjsKKyAgICBjaGFyICpwLCAqcTsKKyAgICBzdHJ1Y3Qgb3B0aW9ucyBvcHQ7CisKKyAgICBpZiggYXJnYyA9PSAxICkKKyAgICB7CisgICAgdXNhZ2U6CisgICAgICAgIHByaW50ZiggVVNBR0UgKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIG9wdC5vcG1vZGUgICAgICAgICAgICAgICAgICA9IERGTF9PUE1PREU7CisgICAgb3B0LmlvbW9kZSAgICAgICAgICAgICAgICAgID0gREZMX0lPTU9ERTsKKyAgICBvcHQuc2VydmVyX25hbWUgICAgICAgICAgICAgPSBERkxfU0VSVkVSX05BTUU7CisgICAgb3B0LnNlcnZlcl9wb3J0ICAgICAgICAgICAgID0gREZMX1NFUlZFUl9QT1JUOworICAgIG9wdC5jb21tYW5kICAgICAgICAgICAgICAgICA9IERGTF9DT01NQU5EOworICAgIG9wdC5idWZmZXJfc2l6ZSAgICAgICAgICAgICA9IERGTF9CVUZGRVJfU0laRTsKKyAgICBvcHQubWF4X2J5dGVzICAgICAgICAgICAgICAgPSBERkxfTUFYX0JZVEVTOworICAgIG9wdC5kZWJ1Z19sZXZlbCAgICAgICAgICAgICA9IERGTF9ERUJVR19MRVZFTDsKKyAgICBvcHQuY29ubl90aW1lb3V0ICAgICAgICAgICAgPSBERkxfQ09OTl9USU1FT1VUOworICAgIG9wdC5tYXhfY29ubmVjdGlvbnMgICAgICAgICA9IERGTF9NQVhfQ09OTkVDVElPTlM7CisgICAgb3B0LnNlc3Npb25fcmV1c2UgICAgICAgICAgID0gREZMX1NFU1NJT05fUkVVU0U7CisgICAgb3B0LnNlc3Npb25fbGlmZXRpbWUgICAgICAgID0gREZMX1NFU1NJT05fTElGRVRJTUU7CisgICAgb3B0LmZvcmNlX2NpcGhlclswXSAgICAgICAgID0gREZMX0ZPUkNFX0NJUEhFUjsKKworICAgIGZvciggaSA9IDE7IGkgPCBhcmdjOyBpKysgKQorICAgIHsKKyAgICAgICAgbiA9IHN0cmxlbiggYXJndltpXSApOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBuOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggYXJndltpXVtqXSA+PSAnQScgJiYgYXJndltpXVtqXSA8PSAnWicgKQorICAgICAgICAgICAgICAgIGFyZ3ZbaV1bal0gfD0gMHgyMDsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBhcmd2W2ldOworICAgICAgICBpZiggKCBxID0gc3RyY2hyKCBwLCAnPScgKSApID09IE5VTEwgKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICpxKysgPSAnXDAnOworCisgICAgICAgIGlmKCBzdHJjbXAoIHAsICJvcG1vZGUiICkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzdHJjbXAoIHEsICJjbGllbnQiICkgPT0gMCApCisgICAgICAgICAgICAgICAgb3B0Lm9wbW9kZSA9IE9QTU9ERV9DTElFTlQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiggc3RyY21wKCBxLCAic2VydmVyIiApID09IDAgKQorICAgICAgICAgICAgICAgIG9wdC5vcG1vZGUgPSBPUE1PREVfU0VSVkVSOworICAgICAgICAgICAgZWxzZSBnb3RvIHVzYWdlOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHN0cmNtcCggcCwgImlvbW9kZSIgKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHN0cmNtcCggcSwgImJsb2NrIiApID09IDAgKQorICAgICAgICAgICAgICAgIG9wdC5pb21vZGUgPSBJT01PREVfQkxPQ0s7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiggc3RyY21wKCBxLCAibm9uYmxvY2siICkgPT0gMCApCisgICAgICAgICAgICAgICAgb3B0LmlvbW9kZSA9IElPTU9ERV9OT05CTE9DSzsKKyAgICAgICAgICAgIGVsc2UgZ290byB1c2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzdHJjbXAoIHAsICJzZXJ2ZXJfbmFtZSIgKSA9PSAwICkKKyAgICAgICAgICAgIG9wdC5zZXJ2ZXJfbmFtZSA9IHE7CisKKyAgICAgICAgaWYoIHN0cmNtcCggcCwgInNlcnZlcl9wb3J0IiApID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBvcHQuc2VydmVyX3BvcnQgPSBhdG9pKCBxICk7CisgICAgICAgICAgICBpZiggb3B0LnNlcnZlcl9wb3J0IDwgMSB8fCBvcHQuc2VydmVyX3BvcnQgPiA2NTUzNSApCisgICAgICAgICAgICAgICAgZ290byB1c2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzdHJjbXAoIHAsICJjb21tYW5kIiApID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3RyY21wKCBxLCAicmVhZCIgKSA9PSAwICkKKyAgICAgICAgICAgICAgICBvcHQuY29tbWFuZCA9IENPTU1BTkRfUkVBRDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmKCBzdHJjbXAoIHEsICJ3cml0ZSIgKSA9PSAwICkKKyAgICAgICAgICAgICAgICBvcHQuY29tbWFuZCA9IENPTU1BTkRfV1JJVEU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiggc3RyY21wKCBxLCAiYm90aCIgKSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcHQuaW9tb2RlICA9IElPTU9ERV9OT05CTE9DSzsKKyAgICAgICAgICAgICAgICBvcHQuY29tbWFuZCA9IENPTU1BTkRfQk9USDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgZ290byB1c2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzdHJjbXAoIHAsICJidWZmZXJfc2l6ZSIgKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0LmJ1ZmZlcl9zaXplID0gYXRvaSggcSApOworICAgICAgICAgICAgaWYoIG9wdC5idWZmZXJfc2l6ZSA8IDEgfHwgb3B0LmJ1ZmZlcl9zaXplID4gMTA0ODU3NiApCisgICAgICAgICAgICAgICAgZ290byB1c2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzdHJjbXAoIHAsICJtYXhfYnl0ZXMiICkgPT0gMCApCisgICAgICAgICAgICBvcHQubWF4X2J5dGVzID0gYXRvaSggcSApOworCisgICAgICAgIGlmKCBzdHJjbXAoIHAsICJkZWJ1Z19sZXZlbCIgKSA9PSAwICkKKyAgICAgICAgICAgIG9wdC5kZWJ1Z19sZXZlbCA9IGF0b2koIHEgKTsKKworICAgICAgICBpZiggc3RyY21wKCBwLCAiY29ubl90aW1lb3V0IiApID09IDAgKQorICAgICAgICAgICAgb3B0LmNvbm5fdGltZW91dCA9IGF0b2koIHEgKTsKKworICAgICAgICBpZiggc3RyY21wKCBwLCAibWF4X2Nvbm5lY3Rpb25zIiApID09IDAgKQorICAgICAgICAgICAgb3B0Lm1heF9jb25uZWN0aW9ucyA9IGF0b2koIHEgKTsKKworICAgICAgICBpZiggc3RyY21wKCBwLCAic2Vzc2lvbl9yZXVzZSIgKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHN0cmNtcCggcSwgIm9uIiApID09IDAgKQorICAgICAgICAgICAgICAgIG9wdC5zZXNzaW9uX3JldXNlID0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmKCBzdHJjbXAoIHEsICJvZmYiICkgPT0gMCApCisgICAgICAgICAgICAgICAgb3B0LnNlc3Npb25fcmV1c2UgPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gdXNhZ2U7CisgICAgICAgIH0KKworICAgICAgICBpZiggc3RyY21wKCBwLCAic2Vzc2lvbl9saWZldGltZSIgKSA9PSAwICkKKyAgICAgICAgICAgIG9wdC5zZXNzaW9uX2xpZmV0aW1lID0gYXRvaSggcSApOworCisgICAgICAgIGlmKCBzdHJjbXAoIHAsICJmb3JjZV9jaXBoZXIiICkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wdC5mb3JjZV9jaXBoZXJbMF0gPSAtMTsKKworICAgICAgICAgICAgaWYoIHN0cmNtcCggcSwgInNzbF9yc2FfcmM0XzEyOF9tZDUiICkgPT0gMCApCisgICAgICAgICAgICAgICAgb3B0LmZvcmNlX2NpcGhlclswXSA9IFNTTF9SU0FfUkM0XzEyOF9NRDU7CisKKyAgICAgICAgICAgIGlmKCBzdHJjbXAoIHEsICJzc2xfcnNhX3JjNF8xMjhfc2hhIiApID09IDAgKQorICAgICAgICAgICAgICAgIG9wdC5mb3JjZV9jaXBoZXJbMF0gPSBTU0xfUlNBX1JDNF8xMjhfU0hBOworCisgICAgICAgICAgICBpZiggc3RyY21wKCBxLCAic3NsX3JzYV9kZXNfMTY4X3NoYSIgKSA9PSAwICkKKyAgICAgICAgICAgICAgICBvcHQuZm9yY2VfY2lwaGVyWzBdID0gU1NMX1JTQV9ERVNfMTY4X1NIQTsKKworICAgICAgICAgICAgaWYoIHN0cmNtcCggcSwgInNzbF9lZGhfcnNhX2Rlc18xNjhfc2hhIiApID09IDAgKQorICAgICAgICAgICAgICAgIG9wdC5mb3JjZV9jaXBoZXJbMF0gPSBTU0xfRURIX1JTQV9ERVNfMTY4X1NIQTsKKworICAgICAgICAgICAgaWYoIHN0cmNtcCggcSwgInNzbF9yc2FfYWVzXzEyOF9zaGEiICkgPT0gMCApCisgICAgICAgICAgICAgICAgb3B0LmZvcmNlX2NpcGhlclswXSA9IFNTTF9SU0FfQUVTXzEyOF9TSEE7CisKKyAgICAgICAgICAgIGlmKCBzdHJjbXAoIHEsICJzc2xfcnNhX2Flc18yNTZfc2hhIiApID09IDAgKQorICAgICAgICAgICAgICAgIG9wdC5mb3JjZV9jaXBoZXJbMF0gPSBTU0xfUlNBX0FFU18yNTZfU0hBOworCisgICAgICAgICAgICBpZiggc3RyY21wKCBxLCAic3NsX2VkaF9yc2FfYWVzXzI1Nl9zaGEiICkgPT0gMCApCisgICAgICAgICAgICAgICAgb3B0LmZvcmNlX2NpcGhlclswXSA9IFNTTF9FREhfUlNBX0FFU18yNTZfU0hBOworCisgICAgICAgICAgICBpZiggb3B0LmZvcmNlX2NpcGhlclswXSA8IDAgKQorICAgICAgICAgICAgICAgIGdvdG8gdXNhZ2U7CisKKyAgICAgICAgICAgIG9wdC5mb3JjZV9jaXBoZXJbMV0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoKCBvcHQub3Btb2RlICkKKyAgICB7CisgICAgICAgIGNhc2UgT1BNT0RFX0NMSUVOVDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT1BNT0RFX1NFUlZFUjoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIHVzYWdlOworICAgIH0KKworICAgIG5iX2Nvbm4gPSAwOworCisgICAgZG8geworICAgICAgICBuYl9jb25uKys7CisgICAgICAgIHJldCA9IHNzbF90ZXN0KCAmb3B0ICk7CisgICAgICAgIGlmKCBvcHQubWF4X2Nvbm5lY3Rpb25zICE9IDAgJiYKKyAgICAgICAgICAgIG9wdC5tYXhfY29ubmVjdGlvbnMgPD0gbmJfY29ubiApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgd2hpbGUoIHJldCA9PSAwICk7CisKK2V4aXQ6CisKKyNpZmRlZiBXSU4zMgorICAgIHByaW50ZiggIiAgUHJlc3MgRW50ZXIgdG8gZXhpdCB0aGlzIHByb2dyYW0uXG4iICk7CisgICAgZmZsdXNoKCBzdGRvdXQgKTsgZ2V0Y2hhcigpOworI2VuZGlmCisKKyAgICByZXR1cm4oIHJldCApOworfQpkaWZmIC0tZ2l0IGEvdmlzdWFsYy9fYnVpbGQuZHN3IGIvdmlzdWFsYy9fYnVpbGQuZHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTY4YzIKLS0tIC9kZXYvbnVsbAorKysgYi92aXN1YWxjL19idWlsZC5kc3cKQEAgLTAsMCArMSwzNjggQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIl9idWlsZF9hbGwiPSIuXF9idWlsZF9hbGwuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSB4eXNzbA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGFlc2NyeXB0Mg0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGhlbGxvDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgbWQ1c3VtDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgc2hhMXN1bQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHNoYTJzdW0NCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBiZW5jaG1hcmsNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBkaF9jbGllbnQNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBkaF9nZW5wcmltZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGRoX3NlcnZlcg0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIG1waV9kZW1vDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgcnNhX2dlbmtleQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHJzYV9zaWduDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgcnNhX3ZlcmlmeQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHNlbGZ0ZXN0DQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgc3NsX2NsaWVudDENCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBzc2xfY2xpZW50Mg0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHNzbF9zZXJ2ZXINCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBzc2xfdGVzdA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJhZXNjcnlwdDIiPSIuXGFlc2NyeXB0Mi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHh5c3NsDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImJlbmNobWFyayI9Ii5cYmVuY2htYXJrLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgeHlzc2wNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAiZGhfY2xpZW50Ij0iLlxkaF9jbGllbnQuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSB4eXNzbA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJkaF9nZW5wcmltZSI9Ii5cZGhfZ2VucHJpbWUuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSB4eXNzbA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJkaF9zZXJ2ZXIiPSIuXGRoX3NlcnZlci5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHh5c3NsDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImhlbGxvIj0iLlxoZWxsby5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHh5c3NsDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIm1kNXN1bSI9Ii5cbWQ1c3VtLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgeHlzc2wNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAibXBpX2RlbW8iPSIuXG1waV9kZW1vLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgeHlzc2wNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAicnNhX2dlbmtleSI9Ii5ccnNhX2dlbmtleS5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHh5c3NsDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInJzYV9zaWduIj0iLlxyc2Ffc2lnbi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHh5c3NsDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInJzYV92ZXJpZnkiPSIuXHJzYV92ZXJpZnkuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSB4eXNzbA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJzZWxmdGVzdCI9Ii5cc2VsZnRlc3QuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSB4eXNzbA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJzaGExc3VtIj0iLlxzaGExc3VtLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgeHlzc2wNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAic2hhMnN1bSI9Ii5cc2hhMnN1bS5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHh5c3NsDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInNzbF9jbGllbnQxIj0iLlxzc2xfY2xpZW50MS5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHh5c3NsDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInNzbF9jbGllbnQyIj0iLlxzc2xfY2xpZW50Mi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHh5c3NsDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInNzbF9zZXJ2ZXIiPSIuXHNzbF9zZXJ2ZXIuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSB4eXNzbA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJzc2xfdGVzdCI9Ii5cc3NsX3Rlc3QuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSB4eXNzbA0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJ4eXNzbCI9Ii5ceHlzc2wuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS92aXN1YWxjL19idWlsZF9hbGwuZHNwIGIvdmlzdWFsYy9fYnVpbGRfYWxsLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTY2M2JmCi0tLSAvZGV2L251bGwKKysrIGIvdmlzdWFsYy9fYnVpbGRfYWxsLmRzcApAQCAtMCwwICsxLDYzIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Il9idWlsZF9hbGwiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIEdlbmVyaWMgUHJvamVjdCIgMHgwMTBhDQorDQorQ0ZHPV9idWlsZF9hbGwgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiX2J1aWxkX2FsbC5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiX2J1aWxkX2FsbC5tYWsiIENGRz0iX2J1aWxkX2FsbCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJfYnVpbGRfYWxsIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBHZW5lcmljIFByb2plY3QiKQ0KKyFNRVNTQUdFICJfYnVpbGRfYWxsIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgR2VuZXJpYyBQcm9qZWN0IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK01UTD1taWRsLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIl9idWlsZF9hbGwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiX2J1aWxkX2FsbCAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgIl9idWlsZF9hbGwgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiX2J1aWxkX2FsbCAtIFdpbjMyIERlYnVnIg0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS92aXN1YWxjL2Flc2NyeXB0Mi5kc3AgYi92aXN1YWxjL2Flc2NyeXB0Mi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhMjZjNQotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvYWVzY3J5cHQyLmRzcApAQCAtMCwwICsxLDEwMSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJhZXNjcnlwdDIiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1hZXNjcnlwdDIgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiYWVzY3J5cHQyLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJhZXNjcnlwdDIubWFrIiBDRkc9ImFlc2NyeXB0MiAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJhZXNjcnlwdDIgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJhZXNjcnlwdDIgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiYWVzY3J5cHQyIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiYWVzY3J5cHQyIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIiINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgImFlc2NyeXB0MiAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJhZXNjcnlwdDIgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNcYWVzXGFlc2NyeXB0Mi5jDQorIyBBREQgQ1BQIC9JICIuLi9pbmNsdWRlIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvdmlzdWFsYy9iZW5jaG1hcmsuZHNwIGIvdmlzdWFsYy9iZW5jaG1hcmsuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMDYzZTUKLS0tIC9kZXYvbnVsbAorKysgYi92aXN1YWxjL2JlbmNobWFyay5kc3AKQEAgLTAsMCArMSwxMDEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iYmVuY2htYXJrIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9YmVuY2htYXJrIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImJlbmNobWFyay5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiYmVuY2htYXJrLm1hayIgQ0ZHPSJiZW5jaG1hcmsgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiYmVuY2htYXJrIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiYmVuY2htYXJrIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImJlbmNobWFyayAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIiINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImJlbmNobWFyayAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJiZW5jaG1hcmsgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiYmVuY2htYXJrIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXHByb2dyYW1zXHRlc3RcYmVuY2htYXJrLmMNCisjIEFERCBDUFAgL0kgIi4uL2luY2x1ZGUiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS92aXN1YWxjL2RoX2NsaWVudC5kc3AgYi92aXN1YWxjL2RoX2NsaWVudC5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhMTM4YgotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvZGhfY2xpZW50LmRzcApAQCAtMCwwICsxLDEwMSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJkaF9jbGllbnQiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1kaF9jbGllbnQgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiZGhfY2xpZW50Lm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJkaF9jbGllbnQubWFrIiBDRkc9ImRoX2NsaWVudCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJkaF9jbGllbnQgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJkaF9jbGllbnQgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiZGhfY2xpZW50IC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiZGhfY2xpZW50IC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIiINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgImRoX2NsaWVudCAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJkaF9jbGllbnQgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNccGtleVxkaF9jbGllbnQuYw0KKyMgQUREIENQUCAvSSAiLi4vaW5jbHVkZSINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCINCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL3Zpc3VhbGMvZGhfZ2VucHJpbWUuZHNwIGIvdmlzdWFsYy9kaF9nZW5wcmltZS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3NTExYwotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvZGhfZ2VucHJpbWUuZHNwCkBAIC0wLDAgKzEsMTAxIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImRoX2dlbnByaW1lIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9ZGhfZ2VucHJpbWUgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiZGhfZ2VucHJpbWUubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImRoX2dlbnByaW1lLm1hayIgQ0ZHPSJkaF9nZW5wcmltZSAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJkaF9nZW5wcmltZSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgImRoX2dlbnByaW1lIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImRoX2dlbnByaW1lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiZGhfZ2VucHJpbWUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiZGhfZ2VucHJpbWUgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiZGhfZ2VucHJpbWUgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNccGtleVxkaF9nZW5wcmltZS5jDQorIyBBREQgQ1BQIC9JICIuLi9pbmNsdWRlIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvdmlzdWFsYy9kaF9wcmltZS50eHQgYi92aXN1YWxjL2RoX3ByaW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjJjMjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdmlzdWFsYy9kaF9wcmltZS50eHQKQEAgLTAsMCArMSwyIEBACitQID0gQzNDRjhCQ0ZEOUU4OEIwQ0MzNUVDNTI2RjNENjNGQTAwMURDOTM5MkU2Q0E4MUYzQjQxNDE3Mzk1NUM1ODI3NThCNTIwMzhGQUZCRjQwMkI4QzI5REMzMkY1MjMxQjBEMkUyNUIyNTI4NTBDN0RDREJGRjQ2RDBFNzk4OUU1MURFQTA3QTUzQkNGNzk0N0Q0Qzk1RUJBMjhGOUNCQUZCMDI2N0VDM0JDRjU3QjE1QTQ5OTY0MjM2QjU2NzczODUxRDY2MjFFNTQ2RjQxMEQ1MDRGMTM4MjcyMThDRDE0QTFGREI2OTUyMkRDNzJERDY3RDg4MEU1MUIyRTAwODk0Rg0KK0cgPSAwNA0KZGlmZiAtLWdpdCBhL3Zpc3VhbGMvZGhfc2VydmVyLmRzcCBiL3Zpc3VhbGMvZGhfc2VydmVyLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2YwM2YyCi0tLSAvZGV2L251bGwKKysrIGIvdmlzdWFsYy9kaF9zZXJ2ZXIuZHNwCkBAIC0wLDAgKzEsMTAxIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImRoX3NlcnZlciIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPWRoX3NlcnZlciAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJkaF9zZXJ2ZXIubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImRoX3NlcnZlci5tYWsiIENGRz0iZGhfc2VydmVyIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImRoX3NlcnZlciAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgImRoX3NlcnZlciAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJkaF9zZXJ2ZXIgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJkaF9zZXJ2ZXIgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiZGhfc2VydmVyIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgImRoX3NlcnZlciAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxwcm9ncmFtc1xwa2V5XGRoX3NlcnZlci5jDQorIyBBREQgQ1BQIC9JICIuLi9pbmNsdWRlIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvdmlzdWFsYy9oZWxsby5kc3AgYi92aXN1YWxjL2hlbGxvLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWMwZmRmCi0tLSAvZGV2L251bGwKKysrIGIvdmlzdWFsYy9oZWxsby5kc3AKQEAgLTAsMCArMSwxMDEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iaGVsbG8iIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1oZWxsbyAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJoZWxsby5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiaGVsbG8ubWFrIiBDRkc9ImhlbGxvIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImhlbGxvIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiaGVsbG8gLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiaGVsbG8gLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJoZWxsbyAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJoZWxsbyAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJoZWxsbyAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxwcm9ncmFtc1xoYXNoXGhlbGxvLmMNCisjIEFERCBDUFAgL0kgIi4uL2luY2x1ZGUiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS92aXN1YWxjL21kNXN1bS5kc3AgYi92aXN1YWxjL21kNXN1bS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4NmM0NgotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvbWQ1c3VtLmRzcApAQCAtMCwwICsxLDEwMSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtZDVzdW0iIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1tZDVzdW0gLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAibWQ1c3VtLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJtZDVzdW0ubWFrIiBDRkc9Im1kNXN1bSAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJtZDVzdW0gLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJtZDVzdW0gLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAibWQ1c3VtIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibWQ1c3VtIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIiINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgIm1kNXN1bSAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJtZDVzdW0gLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNcaGFzaFxtZDVzdW0uYw0KKyMgQUREIENQUCAvSSAiLi4vaW5jbHVkZSINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCINCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL3Zpc3VhbGMvbXBpX2RlbW8uZHNwIGIvdmlzdWFsYy9tcGlfZGVtby5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3OTAwNAotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvbXBpX2RlbW8uZHNwCkBAIC0wLDAgKzEsMTAxIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1waV9kZW1vIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9bXBpX2RlbW8gLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAibXBpX2RlbW8ubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIm1waV9kZW1vLm1hayIgQ0ZHPSJtcGlfZGVtbyAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJtcGlfZGVtbyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgIm1waV9kZW1vIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIm1waV9kZW1vIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAibXBpX2RlbW8gLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAibXBpX2RlbW8gLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAibXBpX2RlbW8gLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNccGtleVxtcGlfZGVtby5jDQorIyBBREQgQ1BQIC9JICIuLi9pbmNsdWRlIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvdmlzdWFsYy9yc2FfZ2Vua2V5LmRzcCBiL3Zpc3VhbGMvcnNhX2dlbmtleS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwNWRmOAotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvcnNhX2dlbmtleS5kc3AKQEAgLTAsMCArMSwxMDEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0icnNhX2dlbmtleSIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPXJzYV9nZW5rZXkgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAicnNhX2dlbmtleS5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAicnNhX2dlbmtleS5tYWsiIENGRz0icnNhX2dlbmtleSAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJyc2FfZ2Vua2V5IC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAicnNhX2dlbmtleSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJyc2FfZ2Vua2V5IC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAicnNhX2dlbmtleSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJyc2FfZ2Vua2V5IC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgInJzYV9nZW5rZXkgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNccGtleVxyc2FfZ2Vua2V5LmMNCisjIEFERCBDUFAgL0kgIi4uL2luY2x1ZGUiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS92aXN1YWxjL3JzYV9wcml2LnR4dCBiL3Zpc3VhbGMvcnNhX3ByaXYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYWMzNTkKLS0tIC9kZXYvbnVsbAorKysgYi92aXN1YWxjL3JzYV9wcml2LnR4dApAQCAtMCwwICsxLDggQEAKK049NkY0NDBFOEM4NTEwMTA3QjIwNDBBREVDMjNDMjA1Mjc2OUZGODlFNUVBRTA2MUFENUZDRTg1NTZFMDUxREJGMjVGQkEzMURDODNBQUZDREZBQ0E3MDkxMkI4QkE4Q0M3M0VDNjcxMzJBQjY2Q0U3OUQyRjkxQTE5MEQ1N0NDNDJDMTQ4NzI4QjMzMTkwRDg1RTMxMUYxNzQ0QkY2REI5NUU3QzJEQkRDOEMzRkMyOTE4MjU1MjdCQzU1NTZFNjdGRkFEMkNBQjkyNkE2RkJGMkI0N0JDNzQ2QkVDNjdBOEMyMDVDM0FGRDQwMjhGQzA4NjRGNUVFRUIyN0ZGQTkxQg0KK0U9MDEwMDAxDQorRD0wRDI3N0FBMERBNEE1RkU4NkU5M0I2RkMyN0VFMTQzNUU4QUUzMTVCNjEzRDREQ0VGNTc4QjEwMkU4NUE0NTJBOEU2RUIwREU2NTIyOURFQUMzQkFBQkIzRUVFQUZGMjFCRjI2MkVEM0QyQjdDMEM5NUU0QkRDRUUwMTQ5RDNGODE3NDZGMzhCMEQyQTM2MzkwMjU4QkVDMzdDMzM3RTE2MDg4NTlFMDEzM0M2ODZFMTM5QjZGNTE2MkUzOEYyMDRDNjFDRkJEMzBFRDBGNDMxNEIyQjA3OUIzNkVDMTYzMjI1MjYyRDYxOEJDNEVBMENERjUzM0U3MzA4QzQxRTQxDQorUD1EODMxMjYxRjVFREU5QUZENTQ0Qzk1QjJCQUFGOTNCRUMxMDMyRjQ0MjZEQzA0OEFDQTY4NkVEMDgxM0EyNzc5QjA0RDA5Mzk4RDM3NjE3ODY3ODFCM0I3NDBCMTZBREFBODFENDkxOEFCQ0JENjFGNUZENUQ3MjZBN0RBRDg0Mw0KK1E9ODNDMEU3MUUzOUQxRUQzNEUxMkVDOUI1NEY3RUI2QUNDNUUyN0I1NjYzNDhCMTdBOUIxQjZBNjBGMkFCQkQxRTEzN0MwQjNFN0NFMzY5M0QyMTVBMzMxMkM3NzRCNUUxNzc3MTM3MjdEMDA1MzMxMTQ4QzlGRUZBNTExRjJBNDkNCitEUD04N0M4QzZEMkU5MzkxMzRCOEQ0OEQ0QjRGRjAwMEJFMUMxNDQ4OEM5NUI0NkQxMkI4MkQ5NzhEMDQ4N0EwODE1MkMyMDE2NkQyOTNFRTE1RjQ4NTM3NDU2RTJCMTBDMTVFRDg1MDc0NjExOTBFMzE5QUQ4RDk3QTY1NUMyRTQxNQ0KK0RRPTA2NzcyMEUwNEFENjEyNURENUVGMDVENkVGREZCN0Y3MjI3RUNBQUVBMjkwOUVBNEY1OTc5MkQwQ0YxN0JFNjAwQjc0QkFEODg2Mjg2MkIxQUQ0MTRGRTA0QzA5NUUyMzgyNDhGQkZCRTgyOTU5MjgyRkZBMzk5OEVGMDIyODgxDQorUVA9OEMyRkFFRjJDN0Y4RkVFNkM2RjJCNEY4MTFEQTU3NDVBMzMyOEU1QjA2MjU2QzVGN0U4RjkyNEVDNkU1NTI3MTgwOTVBMkY5QjRCNTJERTVCN0IyMkY2OTdGQjNDQzZENzJFRDY0MTU1NTVDREMyQzRCMTkzRDIyOTYyNDk0ODgNCmRpZmYgLS1naXQgYS92aXN1YWxjL3JzYV9wdWIudHh0IGIvdmlzdWFsYy9yc2FfcHViLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODM2ODVkCi0tLSAvZGV2L251bGwKKysrIGIvdmlzdWFsYy9yc2FfcHViLnR4dApAQCAtMCwwICsxLDIgQEAKK049NkY0NDBFOEM4NTEwMTA3QjIwNDBBREVDMjNDMjA1Mjc2OUZGODlFNUVBRTA2MUFENUZDRTg1NTZFMDUxREJGMjVGQkEzMURDODNBQUZDREZBQ0E3MDkxMkI4QkE4Q0M3M0VDNjcxMzJBQjY2Q0U3OUQyRjkxQTE5MEQ1N0NDNDJDMTQ4NzI4QjMzMTkwRDg1RTMxMUYxNzQ0QkY2REI5NUU3QzJEQkRDOEMzRkMyOTE4MjU1MjdCQzU1NTZFNjdGRkFEMkNBQjkyNkE2RkJGMkI0N0JDNzQ2QkVDNjdBOEMyMDVDM0FGRDQwMjhGQzA4NjRGNUVFRUIyN0ZGQTkxQg0KK0U9MDEwMDAxDQpkaWZmIC0tZ2l0IGEvdmlzdWFsYy9yc2Ffc2lnbi5kc3AgYi92aXN1YWxjL3JzYV9zaWduLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2JmZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdmlzdWFsYy9yc2Ffc2lnbi5kc3AKQEAgLTAsMCArMSwxMDEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0icnNhX3NpZ24iIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1yc2Ffc2lnbiAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJyc2Ffc2lnbi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAicnNhX3NpZ24ubWFrIiBDRkc9InJzYV9zaWduIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgInJzYV9zaWduIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAicnNhX3NpZ24gLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAicnNhX3NpZ24gLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJyc2Ffc2lnbiAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJyc2Ffc2lnbiAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJyc2Ffc2lnbiAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxwcm9ncmFtc1xwa2V5XHJzYV9zaWduLmMNCisjIEFERCBDUFAgL0kgIi4uL2luY2x1ZGUiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS92aXN1YWxjL3JzYV92ZXJpZnkuZHNwIGIvdmlzdWFsYy9yc2FfdmVyaWZ5LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTUwN2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdmlzdWFsYy9yc2FfdmVyaWZ5LmRzcApAQCAtMCwwICsxLDEwMSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJyc2FfdmVyaWZ5IiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9cnNhX3ZlcmlmeSAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJyc2FfdmVyaWZ5Lm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJyc2FfdmVyaWZ5Lm1hayIgQ0ZHPSJyc2FfdmVyaWZ5IC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgInJzYV92ZXJpZnkgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJyc2FfdmVyaWZ5IC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gInJzYV92ZXJpZnkgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJyc2FfdmVyaWZ5IC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIiINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgInJzYV92ZXJpZnkgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAicnNhX3ZlcmlmeSAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxwcm9ncmFtc1xwa2V5XHJzYV92ZXJpZnkuYw0KKyMgQUREIENQUCAvSSAiLi4vaW5jbHVkZSINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCINCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL3Zpc3VhbGMvc2VsZnRlc3QuZHNwIGIvdmlzdWFsYy9zZWxmdGVzdC5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyMTdiNwotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvc2VsZnRlc3QuZHNwCkBAIC0wLDAgKzEsMTAxIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InNlbGZ0ZXN0IiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9c2VsZnRlc3QgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAic2VsZnRlc3QubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInNlbGZ0ZXN0Lm1hayIgQ0ZHPSJzZWxmdGVzdCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJzZWxmdGVzdCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgInNlbGZ0ZXN0IC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gInNlbGZ0ZXN0IC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAic2VsZnRlc3QgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAic2VsZnRlc3QgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAic2VsZnRlc3QgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNcdGVzdFxzZWxmdGVzdC5jDQorIyBBREQgQ1BQIC9JICIuLi9pbmNsdWRlIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvdmlzdWFsYy9zaGExc3VtLmRzcCBiL3Zpc3VhbGMvc2hhMXN1bS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjZWFmYwotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvc2hhMXN1bS5kc3AKQEAgLTAsMCArMSwxMDEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ic2hhMXN1bSIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPXNoYTFzdW0gLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAic2hhMXN1bS5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAic2hhMXN1bS5tYWsiIENGRz0ic2hhMXN1bSAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJzaGExc3VtIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAic2hhMXN1bSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJzaGExc3VtIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAic2hhMXN1bSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJzaGExc3VtIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgInNoYTFzdW0gLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNcaGFzaFxzaGExc3VtLmMNCisjIEFERCBDUFAgL0kgIi4uL2luY2x1ZGUiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS92aXN1YWxjL3NoYTJzdW0uZHNwIGIvdmlzdWFsYy9zaGEyc3VtLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDUwMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvdmlzdWFsYy9zaGEyc3VtLmRzcApAQCAtMCwwICsxLDEwMSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJzaGEyc3VtIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9c2hhMnN1bSAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJzaGEyc3VtLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJzaGEyc3VtLm1hayIgQ0ZHPSJzaGEyc3VtIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgInNoYTJzdW0gLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJzaGEyc3VtIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gInNoYTJzdW0gLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJzaGEyc3VtIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIiINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgInNoYTJzdW0gLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAic2hhMnN1bSAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxwcm9ncmFtc1xoYXNoXHNoYTJzdW0uYw0KKyMgQUREIENQUCAvSSAiLi4vaW5jbHVkZSINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCINCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL3Zpc3VhbGMvc3NsX2NsaWVudDEuZHNwIGIvdmlzdWFsYy9zc2xfY2xpZW50MS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1ODVmMgotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvc3NsX2NsaWVudDEuZHNwCkBAIC0wLDAgKzEsMTAxIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InNzbF9jbGllbnQxIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9c3NsX2NsaWVudDEgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAic3NsX2NsaWVudDEubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInNzbF9jbGllbnQxLm1hayIgQ0ZHPSJzc2xfY2xpZW50MSAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJzc2xfY2xpZW50MSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgInNzbF9jbGllbnQxIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gInNzbF9jbGllbnQxIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAic3NsX2NsaWVudDEgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAic3NsX2NsaWVudDEgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAic3NsX2NsaWVudDEgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNcc3NsXHNzbF9jbGllbnQxLmMNCisjIEFERCBDUFAgL0kgIi4uL2luY2x1ZGUiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS92aXN1YWxjL3NzbF9jbGllbnQyLmRzcCBiL3Zpc3VhbGMvc3NsX2NsaWVudDIuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzM3MGYKLS0tIC9kZXYvbnVsbAorKysgYi92aXN1YWxjL3NzbF9jbGllbnQyLmRzcApAQCAtMCwwICsxLDEwMSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJzc2xfY2xpZW50MiIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPXNzbF9jbGllbnQyIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInNzbF9jbGllbnQyLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJzc2xfY2xpZW50Mi5tYWsiIENGRz0ic3NsX2NsaWVudDIgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAic3NsX2NsaWVudDIgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJzc2xfY2xpZW50MiAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJzc2xfY2xpZW50MiAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIiINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInNzbF9jbGllbnQyIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIiINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgInNzbF9jbGllbnQyIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgInNzbF9jbGllbnQyIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXHByb2dyYW1zXHNzbFxzc2xfY2xpZW50Mi5jDQorIyBBREQgQ1BQIC9JICIuLi9pbmNsdWRlIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvdmlzdWFsYy9zc2xfc2VydmVyLmRzcCBiL3Zpc3VhbGMvc3NsX3NlcnZlci5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmYjhiMQotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvc3NsX3NlcnZlci5kc3AKQEAgLTAsMCArMSwxMDEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ic3NsX3NlcnZlciIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPXNzbF9zZXJ2ZXIgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAic3NsX3NlcnZlci5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAic3NsX3NlcnZlci5tYWsiIENGRz0ic3NsX3NlcnZlciAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJzc2xfc2VydmVyIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAic3NsX3NlcnZlciAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJzc2xfc2VydmVyIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAic3NsX3NlcnZlciAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliICBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJzc2xfc2VydmVyIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgInNzbF9zZXJ2ZXIgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNcc3NsXHNzbF9zZXJ2ZXIuYw0KKyMgQUREIENQUCAvSSAiLi4vaW5jbHVkZSINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCINCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL3Zpc3VhbGMvc3NsX3Rlc3QuZHNwIGIvdmlzdWFsYy9zc2xfdGVzdC5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyZmI2MAotLS0gL2Rldi9udWxsCisrKyBiL3Zpc3VhbGMvc3NsX3Rlc3QuZHNwCkBAIC0wLDAgKzEsMTAxIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InNzbF90ZXN0IiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9c3NsX3Rlc3QgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAic3NsX3Rlc3QubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInNzbF90ZXN0Lm1hayIgQ0ZHPSJzc2xfdGVzdCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJzc2xfdGVzdCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgInNzbF90ZXN0IC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gInNzbF90ZXN0IC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAic3NsX3Rlc3QgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daICAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAic3NsX3Rlc3QgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAic3NsX3Rlc3QgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5ccHJvZ3JhbXNcdGVzdFxzc2xfdGVzdC5jDQorIyBBREQgQ1BQIC9JICIuLi9pbmNsdWRlIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvdmlzdWFsYy94eXNzbC5kc3AgYi92aXN1YWxjL3h5c3NsLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzY5MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdmlzdWFsYy94eXNzbC5kc3AKQEAgLTAsMCArMSwyNzYgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ieHlzc2wiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQNCisNCitDRkc9eHlzc2wgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAieHlzc2wubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInh5c3NsLm1hayIgQ0ZHPSJ4eXNzbCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJ4eXNzbCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJ4eXNzbCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAieHlzc2wgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ0ZW1wIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9JICIuLi9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwYyAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInh5c3NsIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInRlbXAiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIiINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAidGVtcCINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1o3IC9PZCAvSSAiLi4vaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgInh5c3NsIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgInh5c3NsIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcYWVzLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbGlicmFyeVxhcmM0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbGlicmFyeVxiYXNlNjQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxsaWJyYXJ5XGJpZ251bS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcY2VydHMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxsaWJyYXJ5XGRlYnVnLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbGlicmFyeVxkZXMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxsaWJyYXJ5XGRobS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcaGF2ZWdlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbGlicmFyeVxtZDIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxsaWJyYXJ5XG1kNC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcbWQ1LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbGlicmFyeVxuZXQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxsaWJyYXJ5XHBhZGxvY2suYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxsaWJyYXJ5XHJzYS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcc2hhMS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcc2hhMi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcc2hhNC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcc3NsX2NsaS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcc3NsX3Nydi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcc3NsX3Rscy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGxpYnJhcnlcdGltaW5nLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cbGlicmFyeVx4NTA5cGFyc2UuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5caW5jbHVkZVx4eXNzbFxhZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXHh5c3NsXGFyYzQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXHh5c3NsXGJhc2U2NC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGluY2x1ZGVceHlzc2xcYmlnbnVtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5caW5jbHVkZVx4eXNzbFxibl9tdWwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXHh5c3NsXGNlcnRzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5caW5jbHVkZVx4eXNzbFxjb25maWcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXHh5c3NsXGRlYnVnLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5caW5jbHVkZVx4eXNzbFxkZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXHh5c3NsXGRobS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGluY2x1ZGVceHlzc2xcaGF2ZWdlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5caW5jbHVkZVx4eXNzbFxtZDIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXHh5c3NsXG1kNC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGluY2x1ZGVceHlzc2xcbWQ1LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5caW5jbHVkZVx4eXNzbFxuZXQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXHh5c3NsXHBhZGxvY2suaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXHh5c3NsXHJzYS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGluY2x1ZGVceHlzc2xcc2hhMS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGluY2x1ZGVceHlzc2xcc2hhMi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGluY2x1ZGVceHlzc2xcc2hhNC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXGluY2x1ZGVceHlzc2xcc3NsLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5caW5jbHVkZVx4eXNzbFx0aW1pbmcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlxpbmNsdWRlXHh5c3NsXHg1MDkuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQo=