LyoKICogVVNCIEZUREkgU0lPIGRyaXZlcgogKgogKglDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAxCiAqCSAgICBHcmVnIEtyb2FoLUhhcnRtYW4gKGdyZWdAa3JvYWguY29tKQogKiAgICAgICAgICBCaWxsIFJ5ZGVyIChicnlkZXJAc2dpLmNvbSkKICoJQ29weXJpZ2h0IChDKSAyMDAyCiAqCSAgICBLdWJhIE9iZXIgKGt1YmFAbWFyZWltYnJpdW0ub3JnKQogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBTZWUgRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhpcyBkcml2ZXIKICoKICogU2VlIGh0dHA6Ly9mdGRpLXVzYi1zaW8uc291cmNlZm9yZ2UubmV0IGZvciB1cHRvIGRhdGUgdGVzdGluZyBpbmZvCiAqCWFuZCBleHRyYSBkb2N1bWVudGF0aW9uCiAqCiAqICgyMS9KdWwvMjAwNCkgSWFuIEFiYm90dAogKiAgICAgIEluY29ycG9yYXRlZCBTdGV2ZW4gVHVybmVyJ3MgY29kZSB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEZUMjIzMkMgY2hpcC4KICogICAgICBUaGUgcHJlbGltaWxhcnkgcG9ydCB0byB0aGUgMi42IGtlcm5lbCB3YXMgYnkgUnVzIFYuIEJydXNoa29mZi4gIEkgaGF2ZQogKiAgICAgIGZpeGVkIGEgY291cGxlIG9mIHRoaW5ncy4KICoKICogKDI3L01heS8yMDA0KSBJYW4gQWJib3R0CiAqICAgICAgSW1wcm92ZWQgdGhyb3R0bGluZyBjb2RlLCBtb3N0bHkgc3RvbGVuIGZyb20gdGhlIFdoaXRlSEVBVCBkcml2ZXIuCiAqCiAqICgyNi9NYXIvMjAwNCkgSmFuIENhcGVrCiAqICAgICAgQWRkZWQgUElEJ3MgZm9yIElDRC1VMjAvSUNELVU0MCAtIGluY2lyY3VpdCBQSUMgZGVidWdnZXJzIGZyb20gQ0NTIEluYy4KICoKICogKDA5L0ZlYi8yMDA0KSBJYW4gQWJib3R0CiAqICAgICAgQ2hhbmdlZCBmdWxsIG5hbWUgb2YgVVNCLVVJUlQgZGV2aWNlIHRvIGF2b2lkICIvIiBjaGFyYWN0ZXIuCiAqICAgICAgQWRkZWQgRlRESSdzIGFsdGVybmF0ZSBQSUQgKDB4NjAwNikgZm9yIEZUMjMyLzI0NSBkZXZpY2VzLgogKiAgICAgIEFkZGVkIFBJRCBmb3IgIkVMViBVU0IgTW9kdWxlIFVPMTAwIiBmcm9tIFN0ZWZhbiBGcmluZ3MuCiAqCiAqICgyMS9PY3QvMjAwMykgSWFuIEFiYm90dAogKiAgICAgIFJlbmFtZWQgc29tZSBWSUQvUElEIG1hY3JvcyBmb3IgTWF0cml4IE9yYml0YWwgYW5kIFBlcmxlIFN5c3RlbXMKICogICAgICBkZXZpY2VzLiAgUmVtb3ZlZCBNYXRyaXggT3JiaXRhbCBhbmQgUGVybGUgU3lzdGVtcyBkZXZpY2VzIGZyb20gdGhlCiAqICAgICAgOFUyMzJBTSBkZXZpY2UgdGFibGUsIGJ1dCBsZWZ0IHRoZW0gaW4gdGhlIEZUMjMyQk0gdGFibGUsIGFzIHRoZXkgYXJlCiAqICAgICAga25vd24gdG8gdXNlIG9ubHkgRlQyMzJCTS4KICoKICogKDE3L09jdC8yMDAzKSBTY290dCBBbGxlbgogKiAgICAgIEFkZGVkIHZpZC9waWQgZm9yIFBlcmxlIFN5c3RlbXMgVWx0cmFQb3J0IFVTQiBzZXJpYWwgY29udmVydGVycwogKgogKiAoMjEvU2VwLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBBZGRlZCBWSUQvUElEIGZvciBPbW5pZGlyZWN0aW9uYWwgQ29udHJvbCBUZWNobm9sb2d5IFVTMTAxIFVTQiB0bwogKiAgICAgIFJTLTIzMiBhZGFwdGVyIChhbHNvIHJlYmFkZ2VkIGFzIERpY2sgU21pdGggRWxlY3Ryb25pY3MgWEg2MzgxKS4KICogICAgICBWSUQvUElEIHN1cHBsaWVkIGJ5IERvbmFsZCBHb3Jkb24uCiAqCiAqICgxOS9BdWcvMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEZyZWVkIHVyYidzIHRyYW5zZmVyIGJ1ZmZlciBpbiB3cml0ZSBidWxrIGNhbGxiYWNrLgogKiAgICAgIE9taXR0ZWQgc29tZSBwYXJhbm9pZCBjaGVja3MgaW4gd3JpdGUgYnVsayBjYWxsYmFjayB0aGF0IGRvbid0IG1hdHRlci4KICogICAgICBTY2hlZHVsZWQgd29yayBpbiB3cml0ZSBidWxrIGNhbGxiYWNrIHJlZ2FyZGxlc3Mgb2YgcG9ydCdzIG9wZW4gY291bnQuCiAqCiAqICgwNS9BdWcvMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEFkZGVkIFZJRC9QSUQgZm9yIElEIFRFQ0ggSURUMTIyMVUgVVNCIHRvIFJTLTIzMiBhZGFwdGVyLgogKiAgICAgIFZJRC9QSUQgcHJvdmlkZWQgYnkgU3RldmUgQnJpZ2dzLgogKgogKiAoMjMvSnVsLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBBZGRlZCBQSURzIGZvciBDcnlzdGFsRm9udHogNTQ3LCA2MzMsIDYzMSwgNjM1LCA2NDAgYW5kIDY0MCBmcm9tCiAqICAgICAgV2F5bmUgV3lsdXBza2kuCiAqCiAqICgxMC9KdWwvMjAwMykgRGF2aWQgR2xhbmNlCiAqICAgICAgQWRkZWQgUElEIGZvciBEU1MtMjAgU3luY1N0YXRpb24gY3JhZGxlIGZvciBTb255LUVyaWNzc29uIFA4MDAuCiAqCiAqICgyNy9KdW4vMjAwMykgSWFuIEFiYm90dAogKglSZXdvcmtlZCB0aGUgdXJiIGhhbmRsaW5nIGxvZ2ljLiAgV2UgaGF2ZSBubyBtb3JlIHBvb2wsIGJ1dCBkeW5hbWljYWxseQogKglhbGxvY2F0ZSB0aGUgdXJiIGFuZCB0aGUgdHJhbnNmZXIgYnVmZmVyIG9uIHRoZSBmbHkuICBJbiB0ZXN0aW5nIHRoaXMKICoJZG9lcyBub3QgaW5jdXJlIGFueSBtZWFzdXJhYmxlIG92ZXJoZWFkLiAgVGhpcyBhbHNvIHJlbGllcyBvbiB0aGUgZmFjdAogKgl0aGF0IHdlIGhhdmUgcHJvcGVyIHJlZmVyZW5jZSBjb3VudGluZyBsb2dpYyBmb3IgdXJicy4gIEkgbmlja2VkIHRoaXMKICoJZnJvbSBHcmVnIEtIJ3MgVmlzb3IgZHJpdmVyLgogKgogKiAoMjMvSnVuLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBSZWR1Y2VkIGZsaXAgYnVmZmVyIHB1c2hlcyBhbmQgY29ycmVjdGVkIGEgZGF0YSBsZW5ndGggdGVzdCBpbgogKiAgICAgIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLgogKiAgICAgIERlZmVyZXJlbmNlIHBvaW50ZXJzIGFmdGVyIGFueSBwYXJhbm9pZCBjaGVja3MsIG5vdCBiZWZvcmUuCiAqCiAqICgyMS9KdW4vMjAwMykgRXJpayBOeWdyZW4KICogICAgICBBZGRlZCBzdXBwb3J0IGZvciBIb21lIEVsZWN0cm9uaWNzIFRpcmEtMSBJUiB0cmFuc2NlaXZlciB1c2luZyBGVDIzMkJNIGNoaXAuCiAqICAgICAgU2VlIDxodHRwOi8vd3d3LmhvbWUtZWxlY3Ryby5jb20vdGlyYTEuaHRtPi4gIE9ubHkgb3BlcmF0ZXMgcHJvcGVybHkKICogICAgICBhdCAxMDAwMDAgYW5kIFJUUy1DVFMsIHNvIHNldCBjdXN0b20gZGl2aXNvciBtb2RlIG9uIHN0YXJ0dXAuCiAqICAgICAgQWxzbyBmb3JjZSB0aGUgVGlyYS0xIGFuZCBVU0ItVUlSVCB0byBvbmx5IHVzZSB0aGVpciBjdXN0b20gYmF1ZCByYXRlcy4KICoKICogKDE4L0p1bi8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgQWRkZWQgRGV2aWNlIElEIG9mIHRoZSBVU0IgcmVsYWlzIGZyb20gUnVkb2xmIEd1Z2xlciAoYmFja3BvcnRlZCBmcm9tCiAqICAgICAgUGhpbGlwcCBH/GhyaW5nJ3MgcGF0Y2ggZm9yIDIuNS54IGtlcm5lbCkuCiAqICAgICAgTW92ZWQgcmVhZCB0cmFuc2ZlciBidWZmZXIgcmVhbGxvY2F0aW9uIGludG8gc3RhcnR1cCBmdW5jdGlvbi4KICogICAgICBGcmVlIGV4aXN0aW5nIHdyaXRlIHVyYiBhbmQgdHJhbnNmZXIgYnVmZmVyIGluIHN0YXJ0dXAgZnVuY3Rpb24uCiAqICAgICAgT25seSB1c2UgdXJicyBpbiB3cml0ZSB1cmIgcG9vbCB0aGF0IHdlcmUgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KICogICAgICBNb3ZlZCBzb21lIGNvbnN0YW50IG1hY3JvcyBvdXQgb2YgZnVuY3Rpb25zLgogKiAgICAgIE1pbm9yIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgY2hhbmdlcy4KICoKICogKDEyL0p1bi8yMDAzKSBEYXZpZCBOb3J3b29kCiAqICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgVVNCLVVJUlQgSVIgdHJhbnNjZWl2ZXIgdXNpbmcgOFUyMzJBTSBjaGlwLgogKiAgICAgIFNlZSA8aHR0cDovL2hvbWUuZWFydGhsaW5rLm5ldC9+anJoZWVzL1VTQlVJUlQvaW5kZXguaHRtPi4gIE9ubHkKICogICAgICBvcGVyYXRlcyBwcm9wZXJseSBhdCAzMTI1MDAsIHNvIHNldCBjdXN0b20gZGl2aXNvciBtb2RlIG9uIHN0YXJ0dXAuCiAqCiAqICgxMi9KdW4vMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEFkZGVkIFNlYWxldmVsIFNlYUxJTksrIDIxMHgsIDIyMHgsIDI0MHgsIDI4MHggdmlkL3BpZHMgZnJvbSBUdWFuIEhvYW5nCiAqICAgICAgLSBJJ3ZlIGVsaW1pbmF0ZWQgc29tZSB0aGF0IGRvbid0IHNlZW0gdG8gZXhpc3QhCiAqICAgICAgQWRkZWQgSG9tZSBFbGVjdHJvbmljcyBUaXJhLTEgSVIgdHJhbnNjZWl2ZXIgcGlkIGZyb20gQ2hyaXMgSG9ybgogKiAgICAgIFNvbWUgd2hpdGVzcGFjZS9jb2Rpbmctc3R5bGUgY2xlYW51cHMKICoKICogKDExL0p1bi8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgRml4ZWQgdW5zYWZlIHNwaW5sb2NrIHVzYWdlIGluIGZ0ZGlfd3JpdGUKICoKICogKDI0L0ZlYi8yMDAzKSBSaWNoYXJkIFNob290ZXIKICogICAgICBJbmNyZWFzZSByZWFkIGJ1ZmZlciBzaXplIHRvIGltcHJvdmUgcmVhZCBzcGVlZHMgYXQgaGlnaGVyIGJhdWQgcmF0ZXMKICogICAgICAoc3BlY2lmaWNhbGx5IHRlc3RlZCB3aXRoIHVwIHRvIDFNYi9zZWMgYXQgMS41TSBiYXVkKQogKgogKiAoMjMvRmViLzIwMDMpIEpvaG4gV2lsa2lucwogKiAgICAgIEFkZGVkIFhvbi94b2ZmIGZsb3cgY29udHJvbCAoYWN0aXZhdGluZyBzdXBwb3J0IGluIHRoZSBmdGRpIGRldmljZSkKICogICAgICBBZGRlZCB2aWQvcGlkIGZvciBWaWRlb25ldHdvcmtzL0hvbWVjaG9pY2UgKFVLIElTUCkKICoKICogKDIzL0ZlYi8yMDAzKSBCaWxsIFJ5ZGVyCiAqICAgICAgQWRkZWQgbWF0cml4IG9yYiBkZXZpY2UgdmlkL3BpZHMgZnJvbSBXYXluZSBXeWx1cHNraQogKgogKiAoMTkvRmViLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBGb3IgVElPQ1NTRVJJQUwsIHNldCBhbHRfc3BlZWQgdG8gMCB3aGVuIEFTWU5DX1NQRF9NQVNLIHZhbHVlIGhhcwogKiAgICAgIGNoYW5nZWQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gQVNZTkNfU1BEX0hJLCBBU1lOQ19TUERfVkhJLAogKiAgICAgIEFTWU5DX1NQRF9TSEkgb3IgQVNZTkNfU1BEX1dBUlAuICBBbHNvLCB1bmxlc3MgQVNZTkNfU1BEX0NVU1QgaXMgaW4KICogICAgICBmb3JjZSwgZG9uJ3QgYm90aGVyIGNoYW5naW5nIGJhdWQgcmF0ZSB3aGVuIGN1c3RvbV9kaXZpc29yIGhhcyBjaGFuZ2VkLgogKgogKiAoMTgvRmViLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBGaXhlZCBUSU9DTUdFVCBoYW5kbGluZyB0byBpbmNsdWRlIHN0YXRlIG9mIERUUiBhbmQgUlRTLCB0aGUgc3RhdGUKICogICAgICBvZiB3aGljaCBhcmUgbm93IHNhdmVkIGJ5IHNldF9kdHIoKSBhbmQgc2V0X3J0cygpLgogKiAgICAgIEZpeGVkIGltcHJvcGVyIHN0b3JhZ2UgY2xhc3MgZm9yIGJ1ZiBpbiBzZXRfZHRyKCkgYW5kIHNldF9ydHMoKS4KICogICAgICBBZGRlZCBGVDIzMkJNIGNoaXAgdHlwZSBhbmQgc3VwcG9ydCBmb3IgaXRzIGV4dHJhIGJhdWQgcmF0ZXMgKGNvbXBhcmVkCiAqICAgICAgdG8gRlQ4VTIzMkFNKS4KICogICAgICBUb29rIGFjY291bnQgb2Ygc3BlY2lhbCBjYXNlIGRpdmlzb3IgdmFsdWVzIGZvciBoaWdoZXN0IGJhdWQgcmF0ZXMgb2YKICogICAgICBGVDhVMjMyQU0gYW5kIEZUMjMyQk0uCiAqICAgICAgRm9yIFRJT0NTU0VSSUFMLCBmb3JjZWQgYWx0X3NwZWVkIHRvIDAgd2hlbiBBU1lOQ19TUERfQ1VTVCBrbHVkZ2UgdXNlZCwKICogICAgICBhcyBwcmV2aW91cyBhbHRfc3BlZWQgc2V0dGluZyBpcyBub3cgc3RhbGUuCiAqICAgICAgTW92ZWQgc3RhcnR1cCBjb2RlIGNvbW1vbiBiZXR3ZWVuIHRoZSBzdGFydHVwIHJvdXRpbmVzIGZvciB0aGUKICogICAgICBkaWZmZXJlbnQgY2hpcCB0eXBlcyBpbnRvIGEgY29tbW9uIHN1YnJvdXRpbmUuCiAqCiAqICgxNy9GZWIvMjAwMykgQmlsbCBSeWRlcgogKiAgICAgIEFkZGVkIHdyaXRlIHVyYiBidWZmZXIgcG9vbCBvbiBhIHBlciBkZXZpY2UgYmFzaXMKICogICAgICBBZGRlZCBtb3JlIGNoZWNraW5nIGZvciBvcGVuIGZpbGUgb24gY2FsbGJhY2tzIChmaXhlZCBPT1BTKQogKiAgICAgIEFkZGVkIENyeXN0YWxGb250eiA2MzIgYW5kIDYzNCBQSURzCiAqICAgICAgICAgKHRoYW54IHRvIENyeXN0YWxGb250eiBmb3IgdGhlIHNhbXBsZSBkZXZpY2VzIC0gdGhleSBmbHVzaGVkIG91dAogKiAgICAgICAgICAgc29tZSBkcml2ZXIgYnVncykKICogICAgICBNaW5vciBkZWJ1Z2dpbmcgbWVzc2FnZSBjaGFuZ2VzCiAqICAgICAgQWRkZWQgdGhyb3R0bGUsIHVudGhyb3R0bGUgYW5kIGNoYXJzX2luX2J1ZmZlciBmdW5jdGlvbnMKICogICAgICBGaXhlZCBGVERJX1NJTyAodGhlIG9yaWdpbmFsIGRldmljZSkgYnVnCiAqICAgICAgRml4ZWQgc29tZSBzaHV0ZG93biBoYW5kbGluZwogKgogKgogKgogKgogKiAoMDcvSnVuLzIwMDIpIEt1YmEgT2JlcgogKglDaGFuZ2VkIEZURElfU0lPX0JBU0VfQkFVRF9UT19ESVZJU09SIG1hY3JvIGludG8gZnRkaV9iYXVkX3RvX2Rpdmlzb3IKICoJZnVuY3Rpb24uIEl0IHdhcyBnZXR0aW5nIHRvbyBjb21wbGV4LgogKglGaXggdGhlIGRpdmlzb3IgY2FsY3VsYXRpb24gbG9naWMgd2hpY2ggd2FzIHNldHRpbmcgZGl2aXNvciBvZiAwLjEyNQogKglpbnN0ZWFkIG9mIDAuNSBmb3IgZnJhY3Rpb25hbCBwYXJ0cyBvZiBkaXZpc29yIGVxdWFsIHRvIDUvOCwgNi84LCA3LzguCiAqCUFsc28gbWFrZSBpdCBidW1wIHVwIHRoZSBkaXZpc29yIHRvIG5leHQgaW50ZWdlciBpbiBjYXNlIG9mIDcvOCAtIGl0J3MKICoJYSBiZXR0ZXIgYXBwcm94aW1hdGlvbi4KICoKICogKDI1L0p1bC8yMDAyKSBCaWxsIFJ5ZGVyIGluc2VydGVkIERtaXRyaSdzIFRJT0NNSVdBSVQgcGF0Y2gKICogICAgICBOb3QgdGVzdGVkIGJ5IG1lIGJ1dCBpdCBkb2Vzbid0IGJyZWFrIGFueXRoaW5nIEkgdXNlLgogKgogKiAoMDQvSmFuLzIwMDIpIEt1YmEgT2JlcgogKglJbXBsZW1lbnRlZCAzODQwMCBiYXVkcmF0ZSBrbHVkZ2UsIHdoZXJlIGl0IGNhbiBiZSBzdWJzdGl0dXRlZCB3aXRoIG90aGVyCiAqCSAgdmFsdWVzLiBUaGF0J3MgdGhlIG9ubHkgd2F5IHRvIHNldCBjdXN0b20gYmF1ZHJhdGVzLgogKglJbXBsZW1lbnRlZCBUSU9DU1NFUklBTCwgVElPQ0dTRVJJQUwgaW9jdGwncyBzbyB0aGF0IHNldHNlcmlhbCBpcyBoYXBweS4KICoJRklYTUU6IGJvdGggYmF1ZHJhdGUgdGhpbmdzIHNob3VsZCBldmVudHVhbGx5IGdvIHRvIHVzYnNlcmlhbC5jIGFzIG90aGVyCiAqCSAgZGV2aWNlcyBtYXkgbmVlZCB0aGF0IGZ1bmN0aW9uYWxpdHkgdG9vLiBBY3R1YWxseSwgaXQgY2FuIHByb2JhYmx5IGJlCiAqCSAgbWVyZ2VkIGluIHNlcmlhbC5jIHNvbWVob3cgLSB0b28gbWFueSBkcml2ZXJzIHJlcGVhdCB0aGlzIGNvZGUgb3ZlcgogKgkgIGFuZCBvdmVyLgogKglGaXhlZCBiYXVkcmF0ZSBmb3JnZXRmdWxuZXNzIC0gb3BlbigpIHVzZWQgdG8gcmVzZXQgYmF1ZHJhdGUgdG8gOTYwMCBldmVyeSB0aW1lLgogKglEaXZpc29ycyBmb3IgYmF1ZHJhdGVzIGFyZSBjYWxjdWxhdGVkIGJ5IGEgbWFjcm8uCiAqCVNtYWxsIGNvZGUgY2xlYW51cHMuIFVnbHkgd2hpdGVzcGFjZSBjaGFuZ2VzIGZvciBQbGF0bydzIHNha2Ugb25seSA7LV0uCiAqCiAqICgwNC9Ob3YvMjAwMSkgQmlsbCBSeWRlcgogKglGaXhlZCBidWcgaW4gcmVhZF9idWxrX2NhbGxiYWNrIHdoZXJlIGluY29ycmVjdCB1cmIgYnVmZmVyIHdhcyB1c2VkLgogKglDbGVhbmVkIHVwIHdyaXRlIG9mZnNldCBjYWxjdWxhdGlvbgogKglBZGRlZCB3cml0ZV9yb29tIHNpbmNlIGRlZmF1bHQgdmFsdWVzIGNhbiBiZSBpbmNvcnJlY3QgZm9yIHNpbwogKglDaGFuZ2VkIHdyaXRlX2J1bGtfY2FsbGJhY2sgdG8gdXNlIHNhbWUgcXVldWVfdGFzayBhcyBvdGhlciBkcml2ZXJzCiAqICAgICAgICAodGhlIHByZXZpb3VzIHZlcnNpb24gY2F1c2VkIHBhbmljcykKICoJUmVtb3ZlZCBwb3J0IGl0ZXJhdGlvbiBjb2RlIHNpbmNlIHRoZSBkZXZpY2Ugb25seSBoYXMgb25lIEkvTyBwb3J0IGFuZCBpdAogKgkgIHdhcyB3cm9uZyBhbnl3YXkuCiAqCiAqICgzMS9NYXkvMjAwMSkgZ2toCiAqCVN3aXRjaGVkIGZyb20gdXNpbmcgc3BpbmxvY2sgdG8gYSBzZW1hcGhvcmUsIHdoaWNoIGZpeGVzIGxvdHMgb2YgcHJvYmxlbXMuCiAqCiAqICgyMy9NYXkvMjAwMSkgICBCaWxsIFJ5ZGVyCiAqCUFkZGVkIHJ1bnRpbWUgZGVidWcgcGF0Y2ggKHRoYW54IFR5c29uIEQgU2F3eWVyKS4KICoJQ2xlYW5lZCB1cCBjb21tZW50cyBmb3IgOFUyMzIKICoJQWRkZWQgcGFyaXR5LCBmcmFtaW5nIGFuZCBvdmVycnVuIGVycm9yIGhhbmRsaW5nCiAqCUFkZGVkIHJlY2VpdmUgYnJlYWsgaGFuZGxpbmcuCiAqCiAqICgwNC8wOC8yMDAxKSBnYgogKglJZGVudGlmeSB2ZXJzaW9uIG9uIG1vZHVsZSBsb2FkLgogKgogKiAoMTgvTWFyY2gvMjAwMSkgQmlsbCBSeWRlcgogKgkoTm90IHJlbGVhc2VkKQogKglBZGRlZCBzZW5kIGJyZWFrIGhhbmRsaW5nLiAocmVxdWlyZXMga2VybmVsIHBhdGNoIHRvbykKICoJRml4ZWQgOFUyMzJBTSBoYXJkd2FyZSBSVFMvQ1RTIGV0YyBzdGF0dXMgcmVwb3J0aW5nLgogKglBZGRlZCBmbGlwYnVmIGZpeCBjb3BpZWQgZnJvbSBnZW5lcmljIGRldmljZQogKgogKiAoMTIvMy8yMDAwKSBCaWxsIFJ5ZGVyCiAqCUFkZGVkIHN1cHBvcnQgZm9yIDhVMjMyQU0gZGV2aWNlLgogKglNb3ZlZCBQSUQgYW5kIFZJRHMgaW50byBoZWFkZXIgZmlsZSBvbmx5LgogKglUdXJuZWQgb24gbG93LWxhdGVuY3kgZm9yIHRoZSB0dHkgKGRldmljZSB3aWxsIGRvIGhpZ2ggYmF1ZHJhdGVzKQogKglBZGRlZCBzaHV0ZG93biByb3V0aW5lIHRvIGNsb3NlIGZpbGVzIHdoZW4gZGV2aWNlIHJlbW92ZWQuCiAqCU1vcmUgZGVidWcgYW5kIGVycm9yIG1lc3NhZ2UgY2xlYW51cHMuCiAqCiAqICgxMS8xMy8yMDAwKSBCaWxsIFJ5ZGVyCiAqCUFkZGVkIHNwaW5sb2NrIHByb3RlY3RlZCBvcGVuIGNvZGUgYW5kIGNsb3NlIGNvZGUuCiAqCU11bHRpcGxlIG9wZW5zIHdvcmsgKHNvcnQgb2YgLSBzZWUgd2VicGFnZSBtZW50aW9uZWQgYWJvdmUpLgogKglDbGVhbmVkIHVwIGNvbW1lbnRzLiBSZW1vdmVkIG11bHRpcGxlIFBJRC9WSUQgZGVmaW5pdGlvbnMuCiAqCUZhY3RvcmlzZWQgY3RzL2R0ciBjb2RlCiAqCU1hZGUgdXNlIG9mIF9fRlVOQ1RJT05fXyBpbiBkYmcncwogKgogKiAoMTEvMDEvMjAwMCkgQWRhbSBKLiBSaWNodGVyCiAqCXVzYl9kZXZpY2VfaWQgdGFibGUgc3VwcG9ydAogKgogKiAoMTAvMDUvMjAwMCkgZ2toCiAqCUZpeGVkIGJ1ZyB3aXRoIHVyYi0+ZGV2IG5vdCBiZWluZyBzZXQgcHJvcGVybHksIG5vdyB0aGF0IHRoZSB1c2IKICoJY29yZSBuZWVkcyBpdC4KICoKICogKDA5LzExLzIwMDApIGdraAogKglSZW1vdmVkIERFQlVHICNpZmRlZnMgd2l0aCBjYWxsIHRvIHVzYl9zZXJpYWxfZGVidWdfZGF0YQogKgogKiAoMDcvMTkvMjAwMCkgZ2toCiAqCUFkZGVkIG1vZHVsZV9pbml0IGFuZCBtb2R1bGVfZXhpdCBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBmYWN0IHRoYXQgdGhpcwogKglkcml2ZXIgaXMgYSBsb2FkYWJsZSBtb2R1bGUgbm93LgogKgogKiAoMDQvMDQvMjAwMCkgQmlsbCBSeWRlcgogKglGaXhlZCBidWdzIGluIFRDR0VUL1RDU0VUIGlvY3RscyAoYnkgcmVtb3ZpbmcgdGhlbSAtIHRoZXkgYXJlCiAqICAgICAgICBoYW5kbGVkIGVsc2V3aGVyZSBpbiB0aGUgdHR5IGlvIGRyaXZlciBjaGFpbikuCiAqCiAqICgwMy8zMC8yMDAwKSBCaWxsIFJ5ZGVyCiAqCUltcGxlbWVudGVkIGxvdHMgb2YgaW9jdGxzCiAqCUZpeGVkIGEgcmFjZSBjb25kaXRpb24gaW4gd3JpdGUKICoJQ2hhbmdlZCBzb21lIGRiZydzIHRvIGVycnMKICoKICogKDAzLzI2LzIwMDApIGdraAogKglTcGxpdCBkcml2ZXIgdXAgaW50byBkZXZpY2Ugc3BlY2lmaWMgcGllY2VzLgogKgogKi8KCi8qIEJpbGwgUnlkZXIgLSBicnlkZXJAc2dpLmNvbSAtIHdyb3RlIHRoZSBGVERJX1NJTyBpbXBsZW1lbnRhdGlvbiAqLwovKiBUaGFueCB0byBGVERJIGZvciBzbyBraW5kbHkgcHJvdmlkaW5nIGRldGFpbHMgb2YgdGhlIHByb3RvY29sIHJlcXVpcmVkICovCi8qICAgdG8gdGFsayB0byB0aGUgZGV2aWNlICovCi8qIFRoYW54IHRvIGdraCBhbmQgdGhlIHJlc3Qgb2YgdGhlIHVzYiBkZXYgZ3JvdXAgZm9yIGFsbCBjb2RlIEkgaGF2ZSBhc3NpbWlsYXRlZCA6LSkgKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC90dHkuaD4KI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8bGludXgvdXNiLmg+CiNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KI2luY2x1ZGUgImZ0ZGlfc2lvLmgiCgovKgogKiBWZXJzaW9uIEluZm9ybWF0aW9uCiAqLwojZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS40LjMiCiNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4sIEJpbGwgUnlkZXIgPGJyeWRlckBzZ2kuY29tPiwgS3ViYSBPYmVyIDxrdWJhQG1hcmVpbWJyaXVtLm9yZz4iCiNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBGVERJIFNlcmlhbCBDb252ZXJ0ZXJzIERyaXZlciIKCnN0YXRpYyBpbnQgZGVidWc7CnN0YXRpYyBfX3UxNiB2ZW5kb3IgPSBGVERJX1ZJRDsKc3RhdGljIF9fdTE2IHByb2R1Y3Q7CgovKiBzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgaXMgdXNlZCBieSBkZXZpY2VzIHJlcXVpcmluZyBzcGVjaWFsIGF0dGVudGlvbi4gKi8Kc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIHsKCWludCAoKnByb2JlKShzdHJ1Y3QgdXNiX3NlcmlhbCAqKTsKCXZvaWQgKCpzZXR1cCkoc3RydWN0IHVzYl9zZXJpYWwgKik7IC8qIFNwZWNpYWwgc2V0dGluZ3MgZHVyaW5nIHN0YXJ0dXAuICovCn07CgpzdGF0aWMgaW50ICAgZnRkaV9vbGltZXhfcHJvYmUJCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKc3RhdGljIHZvaWQgIGZ0ZGlfVVNCX1VJUlRfc2V0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwpzdGF0aWMgdm9pZCAgZnRkaV9IRV9USVJBMV9zZXR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CgpzdGF0aWMgc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIGZ0ZGlfb2xpbWV4X3F1aXJrID0gewoJLnByb2JlCT0gZnRkaV9vbGltZXhfcHJvYmUsCn07CgpzdGF0aWMgc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIGZ0ZGlfVVNCX1VJUlRfcXVpcmsgPSB7Cgkuc2V0dXAgPSBmdGRpX1VTQl9VSVJUX3NldHVwLAp9OwoKc3RhdGljIHN0cnVjdCBmdGRpX3Npb19xdWlyayBmdGRpX0hFX1RJUkExX3F1aXJrID0gewoJLnNldHVwID0gZnRkaV9IRV9USVJBMV9zZXR1cCwKfTsKCi8qCiAqIFRoZSA4VTIzMkFNIGhhcyB0aGUgc2FtZSBBUEkgYXMgdGhlIHNpbyBleGNlcHQgZm9yOgogKiAtIGl0IGNhbiBzdXBwb3J0IE1VQ0ggaGlnaGVyIGJhdWRyYXRlczsgdXAgdG86CiAqICAgbyA5MjE2MDAgZm9yIFJTMjMyIGFuZCAyMDAwMDAwIGZvciBSUzQyMi80ODUgYXQgNDhNSHoKICogICBvIDIzMDQwMCBhdCAxMk1IegogKiAgIHNvIC4uIDhVMjMyQU0ncyBiYXVkcmF0ZSBzZXR0aW5nIGNvZGVzIGFyZSBkaWZmZXJlbnQKICogLSBpdCBoYXMgYSB0d28gYnl0ZSBzdGF0dXMgY29kZS4KICogLSBpdCByZXR1cm5zIGNoYXJhY3RlcnMgZXZlcnkgMTZtcyAodGhlIEZUREkgZG9lcyBpdCBldmVyeSA0MG1zKQogKgogKiB0aGUgYmNkRGV2aWNlIHZhbHVlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBGVDIzMkJNIGFuZCBGVDI0NUJNIGZyb20KICogdGhlIGVhcmxpZXIgRlQ4VTIzMkFNIGFuZCBGVDhVMjMyQk0uICBGb3Igbm93LCBpbmNsdWRlIGFsbCBrbm93biBWSUQvUElECiAqIGNvbWJpbmF0aW9ucyBpbiBib3RoIHRhYmxlcy4KICogRklYTUU6IHBlcmhhcHMgYmNkRGV2aWNlIGNhbiBhbHNvIGlkZW50aWZ5IDEyTUh6IEZUOFUyMzJBTSBkZXZpY2VzLAogKiBidXQgSSBkb24ndCBrbm93IGlmIHRob3NlIGV2ZXIgd2VudCBpbnRvIG1hc3MgcHJvZHVjdGlvbi4gW0lhbiBBYmJvdHRdCiAqLwoKCgpzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfY29tYmluZWQgW10gPSB7Cgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQU1DMjMyX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQU5VU0JfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FDVFpXQVZFX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9JUlRSQU5TX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9JUExVU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfSVBMVVMyX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9ETVg0QUxMKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1NJT19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfOFUyMzJBTV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfOFUyMzJBTV9BTFRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzIzMlJMX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV84VTIyMzJDX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NSUNST19DSEFNRUxFT05fUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1JFTEFJU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfT1BFTkRDQ19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoSU5URVJCSU9NRVRSSUNTX1ZJRCwgSU5URVJCSU9NRVRSSUNTX0lPQk9BUkRfUElEKSB9LAoJeyBVU0JfREVWSUNFKElOVEVSQklPTUVUUklDU19WSUQsIElOVEVSQklPTUVUUklDU19NSU5JX0lPQk9BUkRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzYzMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjM0X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl81NDdfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzYzM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjMxX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl82MzVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzY0MF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjQyX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9EU1MyMF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9ORl9SSUNfVklELCBGVERJX05GX1JJQ19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVk5IQ1BDVVNCX0RfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl8wX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl8zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl82X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QRVJMRV9VTFRSQVBPUlRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1BJRUdST1VQX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9UTkNfWF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVVNCWF83MDdfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAyX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTA2X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDFfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMl8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDJfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAzXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwM18yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM180X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzVfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV82X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfN19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzhfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl80X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzZfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl83X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfOF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM181X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzdfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM184X1BJRCkgfSwKCXsgVVNCX0RFVklDRShJRFRFQ0hfVklELCBJRFRFQ0hfSURUMTIyMVVfUElEKSB9LAoJeyBVU0JfREVWSUNFKE9DVF9WSUQsIE9DVF9VUzEwMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfSEVfVElSQTFfUElEKSwKCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJmZ0ZGlfSEVfVElSQTFfcXVpcmsgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9VU0JfVUlSVF9QSUQpLAoJCS5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmZnRkaV9VU0JfVUlSVF9xdWlyayB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMSkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgUFJPVEVHT19SMlgwKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMykgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA4X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MDlfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwQV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBCX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MENfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwRF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBFX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEZfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4OF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg5X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4Ql9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhDX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OERfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4RV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhGX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVU8xMDBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VTTEwMF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VSMTAwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfQUxDODUwMF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfUFlSQU1JRF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0ZIWjEwMDBQQ19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfSUJTX1VTNDg1X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9JQlNfUElDUFJPX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9JQlNfUENNQ0lBX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9JQlNfUEsxX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9JQlNfUlMyMzJNT05fUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lCU19BUFA3MF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfSUJTX1BFRE9fUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lCU19QUk9EX1BJRCkgfSwKCS8qCgkgKiBUaGVzZSB3aWxsIHByb2JhYmx5IHVzZSB1c2VyLXNwYWNlIGRyaXZlcnMuICBVbmNvbW1lbnQgdGhlbSBpZgoJICogeW91IG5lZWQgdGhlbSBvciB1c2UgdGhlIHVzZXItc3BlY2lmaWVkIHZlbmRvci9wcm9kdWN0IG1vZHVsZQoJICogcGFyYW1ldGVycyAoc2VlIGZ0ZGlfc2lvLmggZm9yIHRoZSBudW1iZXJzKS4gIE1ha2UgYSBmdXNzIGlmCgkgKiB5b3UgdGhpbmsgdGhlIGRyaXZlciBzaG91bGQgcmVjb2duaXplIGFueSBvZiB0aGVtIGJ5IGRlZmF1bHQuCgkgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfQ0xJNzAwMF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1BQUzczMzBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9URk0xMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VREY3N19QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VJTzg4X1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVUFEOF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VEQTdfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VU0kyX1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVDExMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9QQ0QyMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VTEEyMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9DU0k4X1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfRU0xMDAwRExfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9QQ0sxMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9SRlA1MDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9GUzIwU0lHX1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfV1MzMDBQQ19QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0ZIWjEzMDBQQ19QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1dTNTAwX1BJRCkgfSwgKi8KCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9TRE1VU0JRU1NfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX01BU1RFUkRFVkVMMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTIwXzBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NDU0lDRFU0MF8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NNQUNIWF8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgSU5TSURFX0FDQ0VTU08pIH0sCgl7IFVTQl9ERVZJQ0UoSU5UUkVQSURfVklELCBJTlRSRVBJRF9WQUxVRUNBTl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoSU5UUkVQSURfVklELCBJTlRSRVBJRF9ORU9WSV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRkFMQ09NX1ZJRCwgRkFMQ09NX1RXSVNUX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGQUxDT01fVklELCBGQUxDT01fU0FNQkFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1NVVU5UT19TUE9SVFNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFRUSV9WSUQsIFRUSV9RTDM1NVBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1JNX0NBTlZJRVdfUElEKSB9LAoJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVVNPVEw0X1BJRCkgfSwKCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTVEw0X1BJRCkgfSwKCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTTzlNTDJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBFVkVSX0VDT19QUk9fQ0RTKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8wX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfNV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl82X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzdfUElEKSB9LAoJeyBVU0JfREVWSUNFKE1PQklMSVRZX1ZJRCwgTU9CSUxJVFlfVVNCX1NFUklBTF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQUNUSVZFX1JPQk9UU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9LV19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9ZU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9ZNl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9ZOF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9JQ19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9EQjlfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01IQU1fUlMyMzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01IQU1fWTlfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1RFUkFUUk9OSUtfVkNQX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9URVJBVFJPTklLX0QyWFhfUElEKSB9LAoJeyBVU0JfREVWSUNFKEVWT0xVVElPTl9WSUQsIEVWT0xVVElPTl9FUjFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FSVEVNSVNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FUSUtfQVRLMTZfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FUSUtfQVRLMTZDX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BVElLX0FUSzE2SFJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FUSUtfQVRLMTZIUkNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEtPQklMX1ZJRCwgS09CSUxfQ09OVl9CMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoS09CSUxfVklELCBLT0JJTF9DT05WX0tBQU5fUElEKSB9LAoJeyBVU0JfREVWSUNFKFBPU0lGTEVYX1ZJRCwgUE9TSUZMRVhfUFA3MDAwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9UVFVTQl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUNMT19DT01fMVdJUkVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1dFU1RSRVhfTU9ERUxfNzc3X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9XRVNUUkVYX01PREVMXzg5MDBGX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QQ0RKX0RBQzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1JSQ0lSS0lUU19MT0NPQlVGRkVSX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BU0tfUkRSNDAwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShJQ09NX0lEMV9WSUQsIElDT01fSUQxX1BJRCkgfSwKCXsgVVNCX0RFVklDRShQQVBPVUNIX1ZJRCwgUEFQT1VDSF9UTVVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FDR19IRkRVQUxfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1lFSV9TRVJWT0NFTlRFUjMxX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9USE9STEFCU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoVEVTVE9fVklELCBURVNUT19VU0JfSU5URVJGQUNFX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HQU1NQV9TQ09VVF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVEFDVFJJWF9PUEVOUE9SVF8xM01fUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1RBQ1RSSVhfT1BFTlBPUlRfMTNTX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9UQUNUUklYX09QRU5QT1JUXzEzVV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRUxFS1RPUl9WSUQsIEVMRUtUT1JfRlQzMjNSX1BJRCkgfSwKCXsgVVNCX0RFVklDRShURUxMRFVTX1ZJRCwgVEVMTERVU19URUxMU1RJQ0tfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01BWFNUUkVBTV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoT0xJTUVYX1ZJRCwgT0xJTUVYX0FSTV9VU0JfT0NEX1BJRCksCgkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmdGRpX29saW1leF9xdWlyayB9LAoJeyB9LAkJCQkJLyogT3B0aW9uYWwgcGFyYW1ldGVyIGVudHJ5ICovCgl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCn07CgpNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGlkX3RhYmxlX2NvbWJpbmVkKTsKCnN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBmdGRpX2RyaXZlciA9IHsKCS5uYW1lID0JCSJmdGRpX3NpbyIsCgkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAoJLmRpc2Nvbm5lY3QgPQl1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QsCgkuaWRfdGFibGUgPQlpZF90YWJsZV9jb21iaW5lZCwKCS5ub19keW5hbWljX2lkID0JMSwKfTsKCnN0YXRpYyBjb25zdCBjaGFyICpmdGRpX2NoaXBfbmFtZVtdID0gewoJW1NJT10gPSAiU0lPIiwJLyogdGhlIHNlcmlhbCBwYXJ0IG9mIEZUOFUxMDBBWCAqLwoJW0ZUOFUyMzJBTV0gPSAiRlQ4VTIzMkFNIiwKCVtGVDIzMkJNXSA9ICJGVDIzMkJNIiwKCVtGVDIyMzJDXSA9ICJGVDIyMzJDIiwKCVtGVDIzMlJMXSA9ICJGVDIzMlJMIiwKfTsKCgovKiBDb25zdGFudHMgZm9yIHJlYWQgdXJiIGFuZCB3cml0ZSB1cmIgKi8KI2RlZmluZSBCVUZTWiA1MTIKI2RlZmluZSBQS1RTWiA2NAoKLyogcnhfZmxhZ3MgKi8KI2RlZmluZSBUSFJPVFRMRUQJCTB4MDEKI2RlZmluZSBBQ1RVQUxMWV9USFJPVFRMRUQJMHgwMgoKc3RydWN0IGZ0ZGlfcHJpdmF0ZSB7CglmdGRpX2NoaXBfdHlwZV90IGNoaXBfdHlwZTsKCQkJCS8qIHR5cGUgb2YgdGhlIGRldmljZSwgZWl0aGVyIFNJTyBvciBGVDhVMjMyQU0gKi8KCWludCBiYXVkX2Jhc2U7CQkvKiBiYXVkIGJhc2UgY2xvY2sgZm9yIGRpdmlzb3Igc2V0dGluZyAqLwoJaW50IGN1c3RvbV9kaXZpc29yOwkvKiBjdXN0b21fZGl2aXNvciBrbHVkZ2UsIHRoaXMgaXMgZm9yIGJhdWRfYmFzZSAoZGlmZmVyZW50IGZyb20gd2hhdCBnb2VzIHRvIHRoZSBjaGlwISkgKi8KCV9fdTE2IGxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlIDsKCQkJCS8qIHRoZSBsYXN0IGRhdGEgc3RhdGUgc2V0IC0gbmVlZGVkIGZvciBkb2luZyBhIGJyZWFrICovCiAgICAgICAgaW50IHdyaXRlX29mZnNldDsgICAgICAgLyogVGhpcyBpcyB0aGUgb2Zmc2V0IGluIHRoZSB1c2IgZGF0YSBibG9jayB0byB3cml0ZSB0aGUgc2VyaWFsIGRhdGEgLQoJCQkJICogaXQgaXMgZGlmZmVyZW50IGJldHdlZW4gZGV2aWNlcwoJCQkJICovCglpbnQgZmxhZ3M7CQkvKiBzb21lIEFTWU5DX3h4eHggZmxhZ3MgYXJlIHN1cHBvcnRlZCAqLwoJdW5zaWduZWQgbG9uZyBsYXN0X2R0cl9ydHM7CS8qIHNhdmVkIG1vZGVtIGNvbnRyb2wgb3V0cHV0cyAqLwogICAgICAgIHdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OyAvKiBVc2VkIGZvciBUSU9DTUlXQUlUICovCgljaGFyIHByZXZfc3RhdHVzLCBkaWZmX3N0YXR1czsgICAgICAgIC8qIFVzZWQgZm9yIFRJT0NNSVdBSVQgKi8KCV9fdTggcnhfZmxhZ3M7CQkvKiByZWNlaXZlIHN0YXRlIGZsYWdzICh0aHJvdHRsaW5nKSAqLwoJc3BpbmxvY2tfdCByeF9sb2NrOwkvKiBzcGlubG9jayBmb3IgcmVjZWl2ZSBzdGF0ZSAqLwoJc3RydWN0IGRlbGF5ZWRfd29yayByeF93b3JrOwoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKCWludCByeF9wcm9jZXNzZWQ7Cgl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOwoKCV9fdTE2IGludGVyZmFjZTsJLyogRlQyMjMyQyBwb3J0IGludGVyZmFjZSAoMCBmb3IgRlQyMzIvMjQ1KSAqLwoKCWludCBmb3JjZV9iYXVkOwkJLyogaWYgbm9uLXplcm8sIGZvcmNlIHRoZSBiYXVkIHJhdGUgdG8gdGhpcyB2YWx1ZSAqLwoJaW50IGZvcmNlX3J0c2N0czsJLyogaWYgbm9uLXplcm8sIGZvcmNlIFJUUy1DVFMgdG8gYWx3YXlzIGJlIGVuYWJsZWQgKi8KCglzcGlubG9ja190IHR4X2xvY2s7CS8qIHNwaW5sb2NrIGZvciB0cmFuc21pdCBzdGF0ZSAqLwoJdW5zaWduZWQgbG9uZyB0eF9ieXRlczsKCXVuc2lnbmVkIGxvbmcgdHhfb3V0c3RhbmRpbmdfYnl0ZXM7Cgl1bnNpZ25lZCBsb25nIHR4X291dHN0YW5kaW5nX3VyYnM7Cn07CgovKiBVc2VkIGZvciBUSU9DTUlXQUlUICovCiNkZWZpbmUgRlRESV9TVEFUVVNfQjBfTUFTSwkoRlRESV9SUzBfQ1RTIHwgRlRESV9SUzBfRFNSIHwgRlRESV9SUzBfUkkgfCBGVERJX1JTMF9STFNEKQojZGVmaW5lIEZURElfU1RBVFVTX0IxX01BU0sJKEZURElfUlNfQkkpCi8qIEVuZCBUSU9DTUlXQUlUICovCgojZGVmaW5lIEZURElfSU1QTF9BU1lOQ19GTEFHUyA9ICggQVNZTkNfU1BEX0hJIHwgQVNZTkNfU1BEX1ZISSBcCiBBU1lOQ19TUERfQ1VTVCB8IEFTWU5DX1NQRF9TSEkgfCBBU1lOQ19TUERfV0FSUCApCgovKiBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBhIEZUREkgc2VyaWFsIGNvbnZlcnRlciAqLwpzdGF0aWMgaW50ICBmdGRpX3Npb19wcm9iZQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKc3RhdGljIGludCAgZnRkaV9zaW9fYXR0YWNoCQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CnN0YXRpYyB2b2lkIGZ0ZGlfc2h1dGRvd24JCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKc3RhdGljIGludCAgZnRkaV9zaW9fcG9ydF9wcm9iZQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CnN0YXRpYyBpbnQgIGZ0ZGlfc2lvX3BvcnRfcmVtb3ZlCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKc3RhdGljIGludCAgZnRkaV9vcGVuCQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKc3RhdGljIHZvaWQgZnRkaV9jbG9zZQkJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CnN0YXRpYyBpbnQgIGZ0ZGlfd3JpdGUJCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwpzdGF0aWMgaW50ICBmdGRpX3dyaXRlX3Jvb20JCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKc3RhdGljIGludCAgZnRkaV9jaGFyc19pbl9idWZmZXIJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwpzdGF0aWMgdm9pZCBmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYik7CnN0YXRpYyB2b2lkIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrCShzdHJ1Y3QgdXJiICp1cmIpOwpzdGF0aWMgdm9pZCBmdGRpX3Byb2Nlc3NfcmVhZAkJKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CnN0YXRpYyB2b2lkIGZ0ZGlfc2V0X3Rlcm1pb3MJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwpzdGF0aWMgaW50ICBmdGRpX3Rpb2NtZ2V0ICAgICAgICAgICAgICAgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlKTsKc3RhdGljIGludCAgZnRkaV90aW9jbXNldAkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKc3RhdGljIGludCAgZnRkaV9pb2N0bAkJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKc3RhdGljIHZvaWQgZnRkaV9icmVha19jdGwJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUgKTsKc3RhdGljIHZvaWQgZnRkaV90aHJvdHRsZQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwpzdGF0aWMgdm9pZCBmdGRpX3VudGhyb3R0bGUJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgZnRkaV8yMzJhbV9iYXVkX2Jhc2VfdG9fZGl2aXNvciAoaW50IGJhdWQsIGludCBiYXNlKTsKc3RhdGljIHVuc2lnbmVkIHNob3J0IGludCBmdGRpXzIzMmFtX2JhdWRfdG9fZGl2aXNvciAoaW50IGJhdWQpOwpzdGF0aWMgX191MzIgZnRkaV8yMzJibV9iYXVkX2Jhc2VfdG9fZGl2aXNvciAoaW50IGJhdWQsIGludCBiYXNlKTsKc3RhdGljIF9fdTMyIGZ0ZGlfMjMyYm1fYmF1ZF90b19kaXZpc29yIChpbnQgYmF1ZCk7CgpzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIGZ0ZGlfc2lvX2RldmljZSA9IHsKCS5kcml2ZXIgPSB7CgkJLm93bmVyID0JVEhJU19NT0RVTEUsCgkJLm5hbWUgPQkJImZ0ZGlfc2lvIiwKCX0sCgkuZGVzY3JpcHRpb24gPQkJIkZUREkgVVNCIFNlcmlhbCBEZXZpY2UiLAoJLnVzYl9kcml2ZXIgPSAJCSZmdGRpX2RyaXZlciAsCgkuaWRfdGFibGUgPQkJaWRfdGFibGVfY29tYmluZWQsCgkubnVtX2ludGVycnVwdF9pbiA9CTAsCgkubnVtX2J1bGtfaW4gPQkJMSwKCS5udW1fYnVsa19vdXQgPQkJMSwKCS5udW1fcG9ydHMgPQkJMSwKCS5wcm9iZSA9CQlmdGRpX3Npb19wcm9iZSwKCS5wb3J0X3Byb2JlID0JCWZ0ZGlfc2lvX3BvcnRfcHJvYmUsCgkucG9ydF9yZW1vdmUgPQkJZnRkaV9zaW9fcG9ydF9yZW1vdmUsCgkub3BlbiA9CQkJZnRkaV9vcGVuLAoJLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCgkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKCS53cml0ZSA9CQlmdGRpX3dyaXRlLAoJLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAoJLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAoJLnJlYWRfYnVsa19jYWxsYmFjayA9CWZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLAoJLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCgkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAoJLnRpb2Ntc2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbXNldCwKCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAoJLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCgkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAoJLmF0dGFjaCA9CQlmdGRpX3Npb19hdHRhY2gsCgkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKfTsKCgojZGVmaW5lIFdEUl9USU1FT1VUIDUwMDAgLyogZGVmYXVsdCB1cmIgdGltZW91dCAqLwojZGVmaW5lIFdEUl9TSE9SVF9USU1FT1VUIDEwMDAJLyogc2hvcnRlciB1cmIgdGltZW91dCAqLwoKLyogSGlnaCBhbmQgbG93IGFyZSBmb3IgRFRSLCBSVFMgZXRjIGV0YyAqLwojZGVmaW5lIEhJR0ggMQojZGVmaW5lIExPVyAwCgovKiBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgdXJicyB0byBwcmV2ZW50IHVzZXJzcGFjZSBEb1MgZnJvbSBoYXBwZW5pbmcgKi8KI2RlZmluZSBVUkJfVVBQRVJfTElNSVQJNDIKCi8qCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBVdGlsaXR5IGZ1bmN0aW9ucwogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgpzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW50IGZ0ZGlfMjMyYW1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IoaW50IGJhdWQsIGludCBiYXNlKQp7Cgl1bnNpZ25lZCBzaG9ydCBpbnQgZGl2aXNvcjsKCWludCBkaXZpc29yMyA9IGJhc2UgLyAyIC8gYmF1ZDsgLy8gZGl2aXNvciBzaGlmdGVkIDMgYml0cyB0byB0aGUgbGVmdAoJaWYgKChkaXZpc29yMyAmIDB4NykgPT0gNykgZGl2aXNvcjMgKys7IC8vIHJvdW5kIHguNy84IHVwIHRvIHgrMQoJZGl2aXNvciA9IGRpdmlzb3IzID4+IDM7CglkaXZpc29yMyAmPSAweDc7CglpZiAoZGl2aXNvcjMgPT0gMSkgZGl2aXNvciB8PSAweGMwMDA7IGVsc2UgLy8gMC4xMjUKCWlmIChkaXZpc29yMyA+PSA0KSBkaXZpc29yIHw9IDB4NDAwMDsgZWxzZSAvLyAwLjUKCWlmIChkaXZpc29yMyAhPSAwKSBkaXZpc29yIHw9IDB4ODAwMDsgICAgICAvLyAwLjI1CglpZiAoZGl2aXNvciA9PSAxKSBkaXZpc29yID0gMDsJLyogc3BlY2lhbCBjYXNlIGZvciBtYXhpbXVtIGJhdWQgcmF0ZSAqLwoJcmV0dXJuIGRpdmlzb3I7Cn0KCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgZnRkaV8yMzJhbV9iYXVkX3RvX2Rpdmlzb3IoaW50IGJhdWQpCnsKCSByZXR1cm4oZnRkaV8yMzJhbV9iYXVkX2Jhc2VfdG9fZGl2aXNvcihiYXVkLCA0ODAwMDAwMCkpOwp9CgpzdGF0aWMgX191MzIgZnRkaV8yMzJibV9iYXVkX2Jhc2VfdG9fZGl2aXNvcihpbnQgYmF1ZCwgaW50IGJhc2UpCnsKCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRpdmZyYWNbOF0gPSB7IDAsIDMsIDIsIDQsIDEsIDUsIDYsIDcgfTsKCV9fdTMyIGRpdmlzb3I7CglpbnQgZGl2aXNvcjMgPSBiYXNlIC8gMiAvIGJhdWQ7IC8vIGRpdmlzb3Igc2hpZnRlZCAzIGJpdHMgdG8gdGhlIGxlZnQKCWRpdmlzb3IgPSBkaXZpc29yMyA+PiAzOwoJZGl2aXNvciB8PSAoX191MzIpZGl2ZnJhY1tkaXZpc29yMyAmIDB4N10gPDwgMTQ7CgkvKiBEZWFsIHdpdGggc3BlY2lhbCBjYXNlcyBmb3IgaGlnaGVzdCBiYXVkIHJhdGVzLiAqLwoJaWYgKGRpdmlzb3IgPT0gMSkgZGl2aXNvciA9IDA7IGVsc2UJLy8gMS4wCglpZiAoZGl2aXNvciA9PSAweDQwMDEpIGRpdmlzb3IgPSAxOwkvLyAxLjUKCXJldHVybiBkaXZpc29yOwp9CgpzdGF0aWMgX191MzIgZnRkaV8yMzJibV9iYXVkX3RvX2Rpdmlzb3IoaW50IGJhdWQpCnsKCSByZXR1cm4oZnRkaV8yMzJibV9iYXVkX2Jhc2VfdG9fZGl2aXNvcihiYXVkLCA0ODAwMDAwMCkpOwp9CgojZGVmaW5lIHNldF9tY3RybChwb3J0LCBzZXQpCQl1cGRhdGVfbWN0cmwoKHBvcnQpLCAoc2V0KSwgMCkKI2RlZmluZSBjbGVhcl9tY3RybChwb3J0LCBjbGVhcikJdXBkYXRlX21jdHJsKChwb3J0KSwgMCwgKGNsZWFyKSkKCnN0YXRpYyBpbnQgdXBkYXRlX21jdHJsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCWNoYXIgKmJ1ZjsKCXVuc2lnbmVkIHVyYl92YWx1ZTsKCWludCBydjsKCglpZiAoKChzZXQgfCBjbGVhcikgJiAoVElPQ01fRFRSIHwgVElPQ01fUlRTKSkgPT0gMCkgewoJCWRiZygiJXMgLSBEVFJ8UlRTIG5vdCBiZWluZyBzZXR8Y2xlYXJlZCIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIDA7CS8qIG5vIGNoYW5nZSAqLwoJfQoKCWJ1ZiA9IGttYWxsb2MoMSwgR0ZQX05PSU8pOwoJaWYgKCFidWYpIHsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgljbGVhciAmPSB+c2V0OwkvKiAnc2V0JyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgJ2NsZWFyJyAqLwoJdXJiX3ZhbHVlID0gMDsKCWlmIChjbGVhciAmIFRJT0NNX0RUUikKCQl1cmJfdmFsdWUgfD0gRlRESV9TSU9fU0VUX0RUUl9MT1c7CglpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCgkJdXJiX3ZhbHVlIHw9IEZURElfU0lPX1NFVF9SVFNfTE9XOwoJaWYgKHNldCAmIFRJT0NNX0RUUikKCQl1cmJfdmFsdWUgfD0gRlRESV9TSU9fU0VUX0RUUl9ISUdIOwoJaWYgKHNldCAmIFRJT0NNX1JUUykKCQl1cmJfdmFsdWUgfD0gRlRESV9TSU9fU0VUX1JUU19ISUdIOwoJcnYgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCgkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAoJCQkgICAgICAgRlRESV9TSU9fU0VUX01PREVNX0NUUkxfUkVRVUVTVCwKCQkJICAgICAgIEZURElfU0lPX1NFVF9NT0RFTV9DVFJMX1JFUVVFU1RfVFlQRSwKCQkJICAgICAgIHVyYl92YWx1ZSwgcHJpdi0+aW50ZXJmYWNlLAoJCQkgICAgICAgYnVmLCAwLCBXRFJfVElNRU9VVCk7CgoJa2ZyZWUoYnVmKTsKCWlmIChydiA8IDApIHsKCQllcnIoIiVzIEVycm9yIGZyb20gTU9ERU1fQ1RSTCB1cmI6IERUUiAlcywgUlRTICVzIiwKCQkJCV9fRlVOQ1RJT05fXywKCQkJCShzZXQgJiBUSU9DTV9EVFIpID8gIkhJR0giIDoKCQkJCShjbGVhciAmIFRJT0NNX0RUUikgPyAiTE9XIiA6ICJ1bmNoYW5nZWQiLAoJCQkJKHNldCAmIFRJT0NNX1JUUykgPyAiSElHSCIgOgoJCQkJKGNsZWFyICYgVElPQ01fUlRTKSA/ICJMT1ciIDogInVuY2hhbmdlZCIpOwoJfSBlbHNlIHsKCQlkYmcoIiVzIC0gRFRSICVzLCBSVFMgJXMiLCBfX0ZVTkNUSU9OX18sCgkJCQkoc2V0ICYgVElPQ01fRFRSKSA/ICJISUdIIiA6CgkJCQkoY2xlYXIgJiBUSU9DTV9EVFIpID8gIkxPVyIgOiAidW5jaGFuZ2VkIiwKCQkJCShzZXQgJiBUSU9DTV9SVFMpID8gIkhJR0giIDoKCQkJCShjbGVhciAmIFRJT0NNX1JUUykgPyAiTE9XIiA6ICJ1bmNoYW5nZWQiKTsKCQlwcml2LT5sYXN0X2R0cl9ydHMgPSAocHJpdi0+bGFzdF9kdHJfcnRzICYgfmNsZWFyKSB8IHNldDsKCX0KCXJldHVybiBydjsKfQoKCnN0YXRpYyBfX3UzMiBnZXRfZnRkaV9kaXZpc29yKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiBwb3J0KTsKCgpzdGF0aWMgaW50IGNoYW5nZV9zcGVlZChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJY2hhciAqYnVmOwogICAgICAgIF9fdTE2IHVyYl92YWx1ZTsKCV9fdTE2IHVyYl9pbmRleDsKCV9fdTMyIHVyYl9pbmRleF92YWx1ZTsKCWludCBydjsKCglidWYgPSBrbWFsbG9jKDEsIEdGUF9OT0lPKTsKCWlmICghYnVmKQoJCXJldHVybiAtRU5PTUVNOwoKCXVyYl9pbmRleF92YWx1ZSA9IGdldF9mdGRpX2Rpdmlzb3IocG9ydCk7Cgl1cmJfdmFsdWUgPSAoX191MTYpdXJiX2luZGV4X3ZhbHVlOwoJdXJiX2luZGV4ID0gKF9fdTE2KSh1cmJfaW5kZXhfdmFsdWUgPj4gMTYpOwoJaWYgKHByaXYtPmludGVyZmFjZSkgewkvKiBGVDIyMzJDICovCgkJdXJiX2luZGV4ID0gKF9fdTE2KSgodXJiX2luZGV4IDw8IDgpIHwgcHJpdi0+aW50ZXJmYWNlKTsKCX0KCglydiA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKCQkJICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCSAgICBGVERJX1NJT19TRVRfQkFVRFJBVEVfUkVRVUVTVCwKCQkJICAgIEZURElfU0lPX1NFVF9CQVVEUkFURV9SRVFVRVNUX1RZUEUsCgkJCSAgICB1cmJfdmFsdWUsIHVyYl9pbmRleCwKCQkJICAgIGJ1ZiwgMCwgV0RSX1NIT1JUX1RJTUVPVVQpOwoKCWtmcmVlKGJ1Zik7CglyZXR1cm4gcnY7Cn0KCgpzdGF0aWMgX191MzIgZ2V0X2Z0ZGlfZGl2aXNvcihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICogcG9ydCkKeyAvKiBnZXRfZnRkaV9kaXZpc29yICovCglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJX191MzIgZGl2X3ZhbHVlID0gMDsKCWludCBkaXZfb2theSA9IDE7CglpbnQgYmF1ZDsKCgkvKgoJICogVGhlIGxvZ2ljIGludm9sdmVkIGluIHNldHRpbmcgdGhlIGJhdWRyYXRlIGNhbiBiZSBjbGVhbmx5IHNwbGl0IGluIDMgc3RlcHMuCgkgKiBPYnRhaW5pbmcgdGhlIGFjdHVhbCBiYXVkIHJhdGUgaXMgYSBsaXR0bGUgdHJpY2t5IHNpbmNlIHVuaXggdHJhZGl0aW9uYWxseQoJICogc29tZWhvdyBpZ25vcmVkIHRoZSBwb3NzaWJpbGl0eSB0byBzZXQgbm9uLXN0YW5kYXJkIGJhdWQgcmF0ZXMuCgkgKiAxLiBTdGFuZGFyZCBiYXVkIHJhdGVzIGFyZSBzZXQgaW4gdHR5LT50ZXJtaW9zLT5jX2NmbGFnCgkgKiAyLiBJZiB0aGVzZSBhcmUgbm90IGVub3VnaCwgeW91IGNhbiBzZXQgYW55IHNwZWVkIHVzaW5nIGFsdF9zcGVlZCBhcyBmb2xsb3dzOgoJICogICAgLSBzZXQgdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHNwZWVkIHRvIEIzODQwMAoJICogICAgLSBzZXQgeW91ciByZWFsIHNwZWVkIGluIHR0eS0+YWx0X3NwZWVkOyBpdCBnZXRzIGlnbm9yZWQgd2hlbgoJICogICAgICBhbHRfc3BlZWQ9PTAsIChvcikKCSAqICAgIC0gY2FsbCBUSU9DU1NFUklBTCBpb2N0bCB3aXRoIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkgc2V0IGFzIGZvbGxvd3M6CgkgKiAgICAgIGZsYWdzICYgQVNZTkNfU1BEX01BU0sgPT0gQVNZTkNfU1BEX1tISSwgVkhJLCBTSEksIFdBUlBdLCB0aGlzIGp1c3QKCSAqICAgICAgc2V0cyBhbHRfc3BlZWQgdG8gKEhJOiA1NzYwMCwgVkhJOiAxMTUyMDAsIFNISTogMjMwNDAwLCBXQVJQOiA0NjA4MDApCgkgKiAqKiBTdGVwcyAxLCAyIGFyZSBkb25lIGNvdXJ0ZXN5IG9mIHR0eV9nZXRfYmF1ZF9yYXRlCgkgKiAzLiBZb3UgY2FuIGFsc28gc2V0IGJhdWQgcmF0ZSBieSBzZXR0aW5nIGN1c3RvbSBkaXZpc29yIGFzIGZvbGxvd3MKCSAqICAgIC0gc2V0IHR0eS0+dGVybWlvcy0+Y19jZmxhZyBzcGVlZCB0byBCMzg0MDAKCSAqICAgIC0gY2FsbCBUSU9DU1NFUklBTCBpb2N0bCB3aXRoIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkgc2V0IGFzIGZvbGxvd3M6CgkgKiAgICAgIG8gZmxhZ3MgJiBBU1lOQ19TUERfTUFTSyA9PSBBU1lOQ19TUERfQ1VTVAoJICogICAgICBvIGN1c3RvbV9kaXZpc29yIHNldCB0byBiYXVkX2Jhc2UgLyB5b3VyX25ld19iYXVkcmF0ZQoJICogKiogU3RlcCAzIGlzIGRvbmUgY291cnRlc3kgb2YgY29kZSBib3Jyb3dlZCBmcm9tIHNlcmlhbC5jIC0gSSBzaG91bGQgcmVhbGx5CgkgKiAgICBzcGVuZCBzb21lIHRpbWUgYW5kIHNlcGFyYXRlK21vdmUgdGhpcyBjb21tb24gY29kZSB0byBzZXJpYWwuYywgaXQgaXMKCSAqICAgIHJlcGxpY2F0ZWQgaW4gbmVhcmx5IGV2ZXJ5IHNlcmlhbCBkcml2ZXIgeW91IHNlZS4KCSAqLwoKCS8qIDEuIEdldCB0aGUgYmF1ZCByYXRlIGZyb20gdGhlIHR0eSBzZXR0aW5ncywgdGhpcyBvYnNlcnZlcyBhbHRfc3BlZWQgaGFjayAqLwoKCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShwb3J0LT50dHkpOwoJZGJnKCIlcyAtIHR0eV9nZXRfYmF1ZF9yYXRlIHJlcG9ydHMgc3BlZWQgJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWQpOwoKCS8qIDIuIE9ic2VydmUgYXN5bmMtY29tcGF0aWJsZSBjdXN0b21fZGl2aXNvciBoYWNrLCB1cGRhdGUgYmF1ZHJhdGUgaWYgbmVlZGVkICovCgoJaWYgKGJhdWQgPT0gMzg0MDAgJiYKCSAgICAoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSAmJgoJICAgICAocHJpdi0+Y3VzdG9tX2Rpdmlzb3IpKSB7CgkJYmF1ZCA9IHByaXYtPmJhdWRfYmFzZSAvIHByaXYtPmN1c3RvbV9kaXZpc29yOwoJCWRiZygiJXMgLSBjdXN0b20gZGl2aXNvciAlZCBzZXRzIGJhdWQgcmF0ZSB0byAlZCIsIF9fRlVOQ1RJT05fXywgcHJpdi0+Y3VzdG9tX2Rpdmlzb3IsIGJhdWQpOwoJfQoKCS8qIDMuIENvbnZlcnQgYmF1ZHJhdGUgdG8gZGV2aWNlLXNwZWNpZmljIGRpdmlzb3IgKi8KCglpZiAoIWJhdWQpIGJhdWQgPSA5NjAwOwoJc3dpdGNoKHByaXYtPmNoaXBfdHlwZSkgewoJY2FzZSBTSU86IC8qIFNJTyBjaGlwICovCgkJc3dpdGNoKGJhdWQpIHsKCQljYXNlIDMwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjMwMDsgYnJlYWs7CgkJY2FzZSA2MDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2I2MDA7IGJyZWFrOwoJCWNhc2UgMTIwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjEyMDA7IGJyZWFrOwoJCWNhc2UgMjQwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjI0MDA7IGJyZWFrOwoJCWNhc2UgNDgwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjQ4MDA7IGJyZWFrOwoJCWNhc2UgOTYwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjk2MDA7IGJyZWFrOwoJCWNhc2UgMTkyMDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2IxOTIwMDsgYnJlYWs7CgkJY2FzZSAzODQwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjM4NDAwOyBicmVhazsKCQljYXNlIDU3NjAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iNTc2MDA7ICBicmVhazsKCQljYXNlIDExNTIwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjExNTIwMDsgYnJlYWs7CgkJfSAvKiBiYXVkICovCgkJaWYgKGRpdl92YWx1ZSA9PSAwKSB7CgkJCWRiZygiJXMgLSBCYXVkcmF0ZSAoJWQpIHJlcXVlc3RlZCBpcyBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fLCAgYmF1ZCk7CgkJCWRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2I5NjAwOwoJCQlkaXZfb2theSA9IDA7CgkJfQoJCWJyZWFrOwoJY2FzZSBGVDhVMjMyQU06IC8qIDhVMjMyQU0gY2hpcCAqLwoJCWlmIChiYXVkIDw9IDMwMDAwMDApIHsKCQkJZGl2X3ZhbHVlID0gZnRkaV8yMzJhbV9iYXVkX3RvX2Rpdmlzb3IoYmF1ZCk7CgkJfSBlbHNlIHsKCSAgICAgICAgICAgICAgICBkYmcoIiVzIC0gQmF1ZCByYXRlIHRvbyBoaWdoISIsIF9fRlVOQ1RJT05fXyk7CgkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjMyYW1fYmF1ZF90b19kaXZpc29yKDk2MDApOwoJCQlkaXZfb2theSA9IDA7CgkJfQoJCWJyZWFrOwoJY2FzZSBGVDIzMkJNOiAvKiBGVDIzMkJNIGNoaXAgKi8KCWNhc2UgRlQyMjMyQzogLyogRlQyMjMyQyBjaGlwICovCgljYXNlIEZUMjMyUkw6CgkJaWYgKGJhdWQgPD0gMzAwMDAwMCkgewoJCQlkaXZfdmFsdWUgPSBmdGRpXzIzMmJtX2JhdWRfdG9fZGl2aXNvcihiYXVkKTsKCQl9IGVsc2UgewoJICAgICAgICAgICAgICAgIGRiZygiJXMgLSBCYXVkIHJhdGUgdG9vIGhpZ2ghIiwgX19GVU5DVElPTl9fKTsKCQkJZGl2X3ZhbHVlID0gZnRkaV8yMzJibV9iYXVkX3RvX2Rpdmlzb3IoOTYwMCk7CgkJCWRpdl9va2F5ID0gMDsKCQl9CgkJYnJlYWs7Cgl9IC8qIHByaXYtPmNoaXBfdHlwZSAqLwoKCWlmIChkaXZfb2theSkgewoJCWRiZygiJXMgLSBCYXVkIHJhdGUgc2V0IHRvICVkIChkaXZpc29yIDB4JWxYKSBvbiBjaGlwICVzIiwKCQkJX19GVU5DVElPTl9fLCBiYXVkLCAodW5zaWduZWQgbG9uZylkaXZfdmFsdWUsCgkJCWZ0ZGlfY2hpcF9uYW1lW3ByaXYtPmNoaXBfdHlwZV0pOwoJfQoKCXJldHVybihkaXZfdmFsdWUpOwp9CgoKc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqIHBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIHJldGluZm8pCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CgoJaWYgKCFyZXRpbmZvKQoJCXJldHVybiAtRUZBVUxUOwoJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKCXRtcC5mbGFncyA9IHByaXYtPmZsYWdzOwoJdG1wLmJhdWRfYmFzZSA9IHByaXYtPmJhdWRfYmFzZTsKCXRtcC5jdXN0b21fZGl2aXNvciA9IHByaXYtPmN1c3RvbV9kaXZpc29yOwoJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKCQlyZXR1cm4gLUVGQVVMVDsKCXJldHVybiAwOwp9IC8qIGdldF9zZXJpYWxfaW5mbyAqLwoKCnN0YXRpYyBpbnQgc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiBwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdpbmZvKQp7IC8qIHNldF9zZXJpYWxfaW5mbyAqLwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CglzdHJ1Y3QgZnRkaV9wcml2YXRlIG9sZF9wcml2OwoKCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCwgbmV3aW5mbywgc2l6ZW9mKG5ld19zZXJpYWwpKSkKCQlyZXR1cm4gLUVGQVVMVDsKCW9sZF9wcml2ID0gKiBwcml2OwoKCS8qIERvIGVycm9yIGNoZWNraW5nIGFuZCBwZXJtaXNzaW9uIGNoZWNraW5nICovCgoJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CgkJaWYgKCgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KCQkgICAgIChwcml2LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQoJCQlyZXR1cm4gLUVQRVJNOwoJCXByaXYtPmZsYWdzID0gKChwcml2LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAoJCQkgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOwoJCXByaXYtPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKCQlnb3RvIGNoZWNrX2FuZF9leGl0OwoJfQoKCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gcHJpdi0+YmF1ZF9iYXNlKSAmJgoJICAgIChuZXdfc2VyaWFsLmJhdWRfYmFzZSA8IDk2MDApKQoJCXJldHVybiAtRUlOVkFMOwoKCS8qIE1ha2UgdGhlIGNoYW5nZXMgLSB0aGVzZSBhcmUgcHJpdmlsZWdlZCBjaGFuZ2VzISAqLwoKCXByaXYtPmZsYWdzID0gKChwcml2LT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAoJICAgICAgICAgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOwoJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwoKCXBvcnQtPnR0eS0+bG93X2xhdGVuY3kgPSAocHJpdi0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKCmNoZWNrX2FuZF9leGl0OgoJaWYgKChvbGRfcHJpdi5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSAhPQoJICAgICAocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHsKCQlpZiAoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKCQkJcG9ydC0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKCQllbHNlIGlmICgocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKCQkJcG9ydC0+dHR5LT5hbHRfc3BlZWQgPSAxMTUyMDA7CgkJZWxzZSBpZiAoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCgkJCXBvcnQtPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOwoJCWVsc2UgaWYgKChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKCQkJcG9ydC0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CgkJZWxzZQoJCQlwb3J0LT50dHktPmFsdF9zcGVlZCA9IDA7Cgl9CglpZiAoKChvbGRfcHJpdi5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSAhPQoJICAgICAocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHx8CgkgICAgKCgocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpICYmCgkgICAgIChvbGRfcHJpdi5jdXN0b21fZGl2aXNvciAhPSBwcml2LT5jdXN0b21fZGl2aXNvcikpKSB7CgkJY2hhbmdlX3NwZWVkKHBvcnQpOwoJfQoKCXJldHVybiAoMCk7Cgp9IC8qIHNldF9zZXJpYWxfaW5mbyAqLwoKCi8qIERldGVybWluZSB0eXBlIG9mIEZUREkgY2hpcCBiYXNlZCBvbiBVU0IgY29uZmlnIGFuZCBkZXNjcmlwdG9yLiAqLwpzdGF0aWMgdm9pZCBmdGRpX2RldGVybWluZV90eXBlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZXJpYWwtPmRldjsKCXVuc2lnbmVkIHZlcnNpb247Cgl1bnNpZ25lZCBpbnRlcmZhY2VzOwoKCS8qIEFzc3VtZSBpdCBpcyBub3QgdGhlIG9yaWdpbmFsIFNJTyBkZXZpY2UgZm9yIG5vdy4gKi8KCXByaXYtPmJhdWRfYmFzZSA9IDQ4MDAwMDAwIC8gMjsKCXByaXYtPndyaXRlX29mZnNldCA9IDA7CgoJdmVyc2lvbiA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKCWludGVyZmFjZXMgPSB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7CglkYmcoIiVzOiBiY2REZXZpY2UgPSAweCV4LCBiTnVtSW50ZXJmYWNlcyA9ICV1IiwgX19GVU5DVElPTl9fLAoJCQl2ZXJzaW9uLCBpbnRlcmZhY2VzKTsKCWlmIChpbnRlcmZhY2VzID4gMSkgewoJCWludCBpbnRlcjsKCgkJLyogTXVsdGlwbGUgaW50ZXJmYWNlcy4gIEFzc3VtZSBGVDIyMzJDLiAqLwoJCXByaXYtPmNoaXBfdHlwZSA9IEZUMjIzMkM7CgkJLyogRGV0ZXJtaW5lIGludGVyZmFjZSBjb2RlLiAqLwoJCWludGVyID0gc2VyaWFsLT5pbnRlcmZhY2UtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKCQlpZiAoaW50ZXIgPT0gMCkgewoJCQlwcml2LT5pbnRlcmZhY2UgPSBQSVRfU0lPQTsKCQl9IGVsc2UgewoJCQlwcml2LT5pbnRlcmZhY2UgPSBQSVRfU0lPQjsKCQl9CgkJLyogQk0tdHlwZSBkZXZpY2VzIGhhdmUgYSBidWcgd2hlcmUgYmNkRGV2aWNlIGdldHMgc2V0CgkJICogdG8gMHgyMDAgd2hlbiBpU2VyaWFsTnVtYmVyIGlzIDAuICAqLwoJCWlmICh2ZXJzaW9uIDwgMHg1MDApIHsKCQkJZGJnKCIlczogc29tZXRoaW5nIGZpc2h5IC0gYmNkRGV2aWNlIHRvbyBsb3cgZm9yIG11bHRpLWludGVyZmFjZSBkZXZpY2UiLAoJCQkJCV9fRlVOQ1RJT05fXyk7CgkJfQoJfSBlbHNlIGlmICh2ZXJzaW9uIDwgMHgyMDApIHsKCQkvKiBPbGQgZGV2aWNlLiAgQXNzdW1lIGl0cyB0aGUgb3JpZ2luYWwgU0lPLiAqLwoJCXByaXYtPmNoaXBfdHlwZSA9IFNJTzsKCQlwcml2LT5iYXVkX2Jhc2UgPSAxMjAwMDAwMCAvIDE2OwoJCXByaXYtPndyaXRlX29mZnNldCA9IDE7Cgl9IGVsc2UgaWYgKHZlcnNpb24gPCAweDQwMCkgewoJCS8qIEFzc3VtZSBpdHMgYW4gRlQ4VTIzMkFNIChvciBGVDhVMjQ1QU0pICovCgkJLyogKEl0IG1pZ2h0IGJlIGEgQk0gYmVjYXVzZSBvZiB0aGUgaVNlcmlhbE51bWJlciBidWcsCgkJICogYnV0IGl0IHdpbGwgc3RpbGwgd29yayBhcyBhbiBBTSBkZXZpY2UuKSAqLwoJCXByaXYtPmNoaXBfdHlwZSA9IEZUOFUyMzJBTTsKCX0gZWxzZSBpZiAodmVyc2lvbiA8IDB4NjAwKSB7CgkJLyogQXNzdW1lIGl0cyBhbiBGVDIzMkJNIChvciBGVDI0NUJNKSAqLwoJCXByaXYtPmNoaXBfdHlwZSA9IEZUMjMyQk07Cgl9IGVsc2UgewoJCS8qIEFzc3VtZSBpdHMgYW4gRlQyMzJSICAqLwoJCXByaXYtPmNoaXBfdHlwZSA9IEZUMjMyUkw7Cgl9CglpbmZvKCJEZXRlY3RlZCAlcyIsIGZ0ZGlfY2hpcF9uYW1lW3ByaXYtPmNoaXBfdHlwZV0pOwp9CgoKLyoKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN5c2ZzIEF0dHJpYnV0ZQogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgpzdGF0aWMgc3NpemVfdCBzaG93X2xhdGVuY3lfdGltZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdG9fdXNiX3NlcmlhbF9wb3J0KGRldik7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKCXVuc2lnbmVkIHNob3J0IGxhdGVuY3kgPSAwOwoJaW50IHJ2ID0gMDsKCgoJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKCglydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAoJCQkgICAgIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKCQkJICAgICBGVERJX1NJT19HRVRfTEFURU5DWV9USU1FUl9SRVFVRVNULAoJCQkgICAgIEZURElfU0lPX0dFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1RfVFlQRSwKCQkJICAgICAwLCBwcml2LT5pbnRlcmZhY2UsCgkJCSAgICAgKGNoYXIqKSAmbGF0ZW5jeSwgMSwgV0RSX1RJTUVPVVQpOwoKCWlmIChydiA8IDApIHsKCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byByZWFkIGxhdGVuY3kgdGltZXI6ICVpIiwgcnYpOwoJCXJldHVybiAtRUlPOwoJfQoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIGxhdGVuY3kpOwp9CgovKiBXcml0ZSBhIG5ldyB2YWx1ZSBvZiB0aGUgbGF0ZW5jeSB0aW1lciwgaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzLiAqLwpzdGF0aWMgc3NpemVfdCBzdG9yZV9sYXRlbmN5X3RpbWVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKnZhbGJ1ZiwKCQkJCSAgIHNpemVfdCBjb3VudCkKewoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRvX3VzYl9zZXJpYWxfcG9ydChkZXYpOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CgljaGFyIGJ1ZlsxXTsKCWludCB2ID0gc2ltcGxlX3N0cnRvdWwodmFsYnVmLCBOVUxMLCAxMCk7CglpbnQgcnYgPSAwOwoKCWRiZygiJXM6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciA9ICVpIiwgX19GVU5DVElPTl9fLCB2KTsKCglydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAoJCQkgICAgIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKCQkJICAgICBGVERJX1NJT19TRVRfTEFURU5DWV9USU1FUl9SRVFVRVNULAoJCQkgICAgIEZURElfU0lPX1NFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1RfVFlQRSwKCQkJICAgICB2LCBwcml2LT5pbnRlcmZhY2UsCgkJCSAgICAgYnVmLCAwLCBXRFJfVElNRU9VVCk7CgoJaWYgKHJ2IDwgMCkgewoJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHdyaXRlIGxhdGVuY3kgdGltZXI6ICVpIiwgcnYpOwoJCXJldHVybiAtRUlPOwoJfQoKCXJldHVybiBjb3VudDsKfQoKLyogV3JpdGUgYW4gZXZlbnQgY2hhcmFjdGVyIGRpcmVjdGx5IHRvIHRoZSBGVERJIHJlZ2lzdGVyLiAgVGhlIEFTQ0lJCiAgIHZhbHVlIGlzIGluIHRoZSBsb3cgOCBiaXRzLCB3aXRoIHRoZSBlbmFibGUgYml0IGluIHRoZSA5dGggYml0LiAqLwpzdGF0aWMgc3NpemVfdCBzdG9yZV9ldmVudF9jaGFyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKnZhbGJ1ZiwKCQkJCXNpemVfdCBjb3VudCkKewoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRvX3VzYl9zZXJpYWxfcG9ydChkZXYpOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CgljaGFyIGJ1ZlsxXTsKCWludCB2ID0gc2ltcGxlX3N0cnRvdWwodmFsYnVmLCBOVUxMLCAxMCk7CglpbnQgcnYgPSAwOwoKCWRiZygiJXM6IHNldHRpbmcgZXZlbnQgY2hhciA9ICVpIiwgX19GVU5DVElPTl9fLCB2KTsKCglydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAoJCQkgICAgIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKCQkJICAgICBGVERJX1NJT19TRVRfRVZFTlRfQ0hBUl9SRVFVRVNULAoJCQkgICAgIEZURElfU0lPX1NFVF9FVkVOVF9DSEFSX1JFUVVFU1RfVFlQRSwKCQkJICAgICB2LCBwcml2LT5pbnRlcmZhY2UsCgkJCSAgICAgYnVmLCAwLCBXRFJfVElNRU9VVCk7CgoJaWYgKHJ2IDwgMCkgewoJCWRiZygiVW5hYmxlIHRvIHdyaXRlIGV2ZW50IGNoYXJhY3RlcjogJWkiLCBydik7CgkJcmV0dXJuIC1FSU87Cgl9CgoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgREVWSUNFX0FUVFIobGF0ZW5jeV90aW1lciwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGF0ZW5jeV90aW1lciwgc3RvcmVfbGF0ZW5jeV90aW1lcik7CnN0YXRpYyBERVZJQ0VfQVRUUihldmVudF9jaGFyLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9ldmVudF9jaGFyKTsKCnN0YXRpYyBpbnQgY3JlYXRlX3N5c2ZzX2F0dHJzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglpbnQgcmV0dmFsID0gMDsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoKCS8qIFhYWCBJJ3ZlIG5vIGlkZWEgaWYgdGhlIG9yaWdpbmFsIFNJTyBzdXBwb3J0cyB0aGUgZXZlbnRfY2hhcgoJICogc3lzZnMgcGFyYW1ldGVyLCBzbyBJJ20gcGxheWluZyBpdCBzYWZlLiAgKi8KCWlmIChwcml2LT5jaGlwX3R5cGUgIT0gU0lPKSB7CgkJZGJnKCJzeXNmcyBhdHRyaWJ1dGVzIGZvciAlcyIsIGZ0ZGlfY2hpcF9uYW1lW3ByaXYtPmNoaXBfdHlwZV0pOwoJCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcG9ydC0+ZGV2LCAmZGV2X2F0dHJfZXZlbnRfY2hhcik7CgkJaWYgKCghcmV0dmFsKSAmJgoJCSAgICAocHJpdi0+Y2hpcF90eXBlID09IEZUMjMyQk0gfHwgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkMpKSB7CgkJCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcG9ydC0+ZGV2LAoJCQkJCQkgICAgJmRldl9hdHRyX2xhdGVuY3lfdGltZXIpOwoJCX0KCX0KCXJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyB2b2lkIHJlbW92ZV9zeXNmc19hdHRycyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgoJLyogWFhYIHNlZSBjcmVhdGVfc3lzZnNfYXR0cnMgKi8KCWlmIChwcml2LT5jaGlwX3R5cGUgIT0gU0lPKSB7CgkJZGV2aWNlX3JlbW92ZV9maWxlKCZwb3J0LT5kZXYsICZkZXZfYXR0cl9ldmVudF9jaGFyKTsKCQlpZiAocHJpdi0+Y2hpcF90eXBlID09IEZUMjMyQk0gfHwgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkMpIHsKCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwb3J0LT5kZXYsICZkZXZfYXR0cl9sYXRlbmN5X3RpbWVyKTsKCQl9Cgl9Cgp9CgovKgogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRlRESSBkcml2ZXIgc3BlY2lmaWMgZnVuY3Rpb25zCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCi8qIFByb2JlIGZ1bmN0aW9uIHRvIGNoZWNrIGZvciBzcGVjaWFsIGRldmljZXMgKi8Kc3RhdGljIGludCBmdGRpX3Npb19wcm9iZSAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQp7CglzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgKnF1aXJrID0gKHN0cnVjdCBmdGRpX3Npb19xdWlyayAqKWlkLT5kcml2ZXJfaW5mbzsKCglpZiAocXVpcmsgJiYgcXVpcmstPnByb2JlKSB7CgkJaW50IHJldCA9IHF1aXJrLT5wcm9iZShzZXJpYWwpOwoJCWlmIChyZXQgIT0gMCkKCQkJcmV0dXJuIHJldDsKCX0KCgl1c2Jfc2V0X3NlcmlhbF9kYXRhKHNlcmlhbCwgKHZvaWQgKilpZC0+ZHJpdmVyX2luZm8pOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGZ0ZGlfc2lvX3BvcnRfcHJvYmUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoKCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CglpZiAoIXByaXYpewoJCWVycigiJXMtIGttYWxsb2MoJVpkKSBmYWlsZWQuIiwgX19GVU5DVElPTl9fLCBzaXplb2Yoc3RydWN0IGZ0ZGlfcHJpdmF0ZSkpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCXNwaW5fbG9ja19pbml0KCZwcml2LT5yeF9sb2NrKTsKCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9sb2NrKTsKICAgICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CgkvKiBUaGlzIHdpbGwgcHVzaCB0aGUgY2hhcmFjdGVycyB0aHJvdWdoIGltbWVkaWF0ZWx5IHJhdGhlcgoJICAgdGhhbiBxdWV1ZSBhIHRhc2sgdG8gZGVsaXZlciB0aGVtICovCglwcml2LT5mbGFncyA9IEFTWU5DX0xPV19MQVRFTkNZOwoKCS8qIEluY3JlYXNlIHRoZSBzaXplIG9mIHJlYWQgYnVmZmVycyAqLwoJa2ZyZWUocG9ydC0+YnVsa19pbl9idWZmZXIpOwoJcG9ydC0+YnVsa19pbl9idWZmZXIgPSBrbWFsbG9jIChCVUZTWiwgR0ZQX0tFUk5FTCk7CglpZiAoIXBvcnQtPmJ1bGtfaW5fYnVmZmVyKSB7CgkJa2ZyZWUgKHByaXYpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJaWYgKHBvcnQtPnJlYWRfdXJiKSB7CgkJcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlciA9IHBvcnQtPmJ1bGtfaW5fYnVmZmVyOwoJCXBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gQlVGU1o7Cgl9CgoJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnJ4X3dvcmssIGZ0ZGlfcHJvY2Vzc19yZWFkKTsKCXByaXYtPnBvcnQgPSBwb3J0OwoKCS8qIEZyZWUgcG9ydCdzIGV4aXN0aW5nIHdyaXRlIHVyYiBhbmQgdHJhbnNmZXIgYnVmZmVyLiAqLwoJaWYgKHBvcnQtPndyaXRlX3VyYikgewoJCXVzYl9mcmVlX3VyYiAocG9ydC0+d3JpdGVfdXJiKTsKCQlwb3J0LT53cml0ZV91cmIgPSBOVUxMOwoJfQoJa2ZyZWUocG9ydC0+YnVsa19vdXRfYnVmZmVyKTsKCXBvcnQtPmJ1bGtfb3V0X2J1ZmZlciA9IE5VTEw7CgoJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQsIHByaXYpOwoKCWZ0ZGlfZGV0ZXJtaW5lX3R5cGUgKHBvcnQpOwoJY3JlYXRlX3N5c2ZzX2F0dHJzKHBvcnQpOwoJcmV0dXJuIDA7Cn0KCi8qIGF0dGFjaCBzdWJyb3V0aW5lICovCnN0YXRpYyBpbnQgZnRkaV9zaW9fYXR0YWNoIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQp7CgkvKiBDaGVjayBmb3IgZGV2aWNlIHJlcXVpcmluZyBzcGVjaWFsIHNldCB1cC4gKi8KCXN0cnVjdCBmdGRpX3Npb19xdWlyayAqcXVpcmsgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CgoJaWYgKHF1aXJrICYmIHF1aXJrLT5zZXR1cCkKCQlxdWlyay0+c2V0dXAoc2VyaWFsKTsKCglyZXR1cm4gMDsKfSAvKiBmdGRpX3Npb19hdHRhY2ggKi8KCgovKiBTZXR1cCBmb3IgdGhlIFVTQi1VSVJUIGRldmljZSwgd2hpY2ggcmVxdWlyZXMgaGFyZHdpcmVkCiAqIGJhdWRyYXRlICgzODQwMCBnZXRzIG1hcHBlZCB0byAzMTI1MDApICovCi8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8Kc3RhdGljIHZvaWQgZnRkaV9VU0JfVUlSVF9zZXR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwoJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSA3NzsKCXByaXYtPmZvcmNlX2JhdWQgPSBCMzg0MDA7Cn0gLyogZnRkaV9VU0JfVUlSVF9zZXR1cCAqLwoKLyogU2V0dXAgZm9yIHRoZSBIRS1USVJBMSBkZXZpY2UsIHdoaWNoIHJlcXVpcmVzIGhhcmR3aXJlZAogKiBiYXVkcmF0ZSAoMzg0MDAgZ2V0cyBtYXBwZWQgdG8gMTAwMDAwKSBhbmQgUlRTLUNUUyBlbmFibGVkLiAgKi8Kc3RhdGljIHZvaWQgZnRkaV9IRV9USVJBMV9zZXR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwoJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSAyNDA7Cglwcml2LT5mb3JjZV9iYXVkID0gQjM4NDAwOwoJcHJpdi0+Zm9yY2VfcnRzY3RzID0gMTsKfSAvKiBmdGRpX0hFX1RJUkExX3NldHVwICovCgovKgogKiBGaXJzdCBwb3J0IG9uIE9saW1leCBhcm0tdXNiLW9jZCBpcyByZXNlcnZlZCBmb3IgSlRBRyBpbnRlcmZhY2UKICogYW5kIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHVzZXJzcGFjZSB1c2luZyBvcGVub2NkLgogKi8Kc3RhdGljIGludCBmdGRpX29saW1leF9wcm9iZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQp7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNlcmlhbC0+ZGV2OwoJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHNlcmlhbC0+aW50ZXJmYWNlOwoKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgoJaWYgKGludGVyZmFjZSA9PSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVswXSkgewoJCWluZm8oIklnbm9yaW5nIHJlc2VydmVkIHNlcmlhbCBwb3J0IG9uIE9saW1leCBhcm0tdXNiLW9jZFxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qIGZ0ZGlfc2h1dGRvd24gaXMgY2FsbGVkIGZyb20gdXNic2VyaWFsOnVzYl9zZXJpYWxfZGlzY29ubmVjdAogKiAgIGl0IGlzIGNhbGxlZCB3aGVuIHRoZSB1c2IgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZAogKgogKiAgIHVzYnNlcmlhbDp1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QKICogICAgICBjYWxscyBfX3NlcmlhbF9jbG9zZSBmb3IgZWFjaCBvcGVuIG9mIHRoZSBwb3J0CiAqICAgICAgc2h1dGRvd24gaXMgY2FsbGVkIHRoZW4gKGllIGZ0ZGlfc2h1dGRvd24pCiAqLwpzdGF0aWMgdm9pZCBmdGRpX3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQp7CglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKfQoKc3RhdGljIGludCBmdGRpX3Npb19wb3J0X3JlbW92ZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoKCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwoKCXJlbW92ZV9zeXNmc19hdHRycyhwb3J0KTsKCgkvKiBhbGwgb3BlbiBwb3J0cyBhcmUgY2xvc2VkIGF0IHRoaXMgcG9pbnQKICAgICAgICAgKiAgICAoYnkgdXNic2VyaWFsLmM6X19zZXJpYWxfY2xvc2UsIHdoaWNoIGNhbGxzIGZ0ZGlfY2xvc2UpCgkgKi8KCglpZiAocHJpdikgewoJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBOVUxMKTsKCQlrZnJlZShwcml2KTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCAgZnRkaV9vcGVuIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKeyAvKiBmdGRpX29wZW4gKi8KCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWludCByZXN1bHQgPSAwOwoJY2hhciBidWZbMV07IC8qIE5lZWRlZCBmb3IgdGhlIHVzYl9jb250cm9sX21zZyBJIHRoaW5rICovCgoJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCXByaXYtPnR4X2J5dGVzID0gMDsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Cglwcml2LT5yeF9ieXRlcyA9IDA7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgoJaWYgKHBvcnQtPnR0eSkKCQlwb3J0LT50dHktPmxvd19sYXRlbmN5ID0gKHByaXYtPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CgoJLyogTm8gZXJyb3IgY2hlY2tpbmcgZm9yIHRoaXMgKHdpbGwgZ2V0IGVycm9ycyBsYXRlciBhbnl3YXkpICovCgkvKiBTZWUgZnRkaV9zaW8uaCBmb3IgZGVzY3JpcHRpb24gb2Ygd2hhdCBpcyByZXNldCAqLwoJdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCgkJCUZURElfU0lPX1JFU0VUX1JFUVVFU1QsIEZURElfU0lPX1JFU0VUX1JFUVVFU1RfVFlQRSwKCQkJRlRESV9TSU9fUkVTRVRfU0lPLAoJCQlwcml2LT5pbnRlcmZhY2UsIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwoKCS8qIFRlcm1pb3MgZGVmYXVsdHMgYXJlIHNldCBieSB1c2Jfc2VyaWFsX2luaXQuIFdlIGRvbid0IGNoYW5nZQoJICAgcG9ydC0+dHR5LT50ZXJtaW9zIC0gdGhpcyB3b3VsZCBsb29zZSBzcGVlZCBzZXR0aW5ncywgZXRjLgoJICAgVGhpcyBpcyBzYW1lIGJlaGF2aW91ciBhcyBzZXJpYWwuYy9yc19vcGVuKCkgLSBLdWJhICovCgoJLyogZnRkaV9zZXRfdGVybWlvcyAgd2lsbCBzZW5kIHVzYiBjb250cm9sIG1lc3NhZ2VzICovCglpZiAocG9ydC0+dHR5KQoJCWZ0ZGlfc2V0X3Rlcm1pb3MocG9ydCwgTlVMTCk7CgoJLyogRklYTUU6IEZsb3cgY29udHJvbCBtaWdodCBiZSBlbmFibGVkLCBzbyBpdCBzaG91bGQgYmUgY2hlY2tlZCAtCgkgICB3ZSBoYXZlIG5vIGNvbnRyb2wgb2YgZGVmYXVsdHMhICovCgkvKiBUdXJuIG9uIFJUUyBhbmQgRFRSIHNpbmNlIHdlIGFyZSBub3QgZmxvdyBjb250cm9sbGluZyBieSBkZWZhdWx0ICovCglzZXRfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKCgkvKiBOb3QgdGhyb3R0bGVkICovCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoJcHJpdi0+cnhfZmxhZ3MgJj0gfihUSFJPVFRMRUQgfCBBQ1RVQUxMWV9USFJPVFRMRUQpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoKCS8qIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlICovCglwcml2LT5yeF9wcm9jZXNzZWQgPSAwOwoJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+cmVhZF91cmIsIGRldiwKCQkgICAgICB1c2JfcmN2YnVsa3BpcGUoZGV2LCBwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyksCgkJICAgICAgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlciwgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCgkJICAgICAgZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOwoJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwoJaWYgKHJlc3VsdCkKCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOwoKCglyZXR1cm4gcmVzdWx0Owp9IC8qIGZ0ZGlfb3BlbiAqLwoKCgovKgogKiB1c2JzZXJpYWw6X19zZXJpYWxfY2xvc2UgIG9ubHkgY2FsbHMgZnRkaV9jbG9zZSBpZiB0aGUgcG9pbnQgaXMgb3BlbgogKgogKiAgIFRoaXMgb25seSBnZXRzIGNhbGxlZCB3aGVuIGl0IGlzIHRoZSBsYXN0IGNsb3NlCiAqCiAqCiAqLwoKc3RhdGljIHZvaWQgZnRkaV9jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCnsgLyogZnRkaV9jbG9zZSAqLwoJdW5zaWduZWQgaW50IGNfY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJY2hhciBidWZbMV07CgoJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CgoJaWYgKGNfY2ZsYWcgJiBIVVBDTCl7CgkJLyogRGlzYWJsZSBmbG93IGNvbnRyb2wgKi8KCQlpZiAodXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAoJCQkJICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNULAoJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAoJCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwgYnVmLCAwLAoJCQkJICAgIFdEUl9USU1FT1VUKSA8IDApIHsKCQkJZXJyKCJlcnJvciBmcm9tIGZsb3djb250cm9sIHVyYiIpOwoJCX0KCgkJLyogZHJvcCBSVFMgYW5kIERUUiAqLwoJCWNsZWFyX21jdHJsKHBvcnQsIFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7Cgl9IC8qIE5vdGUgY2hhbmdlIG5vIGxpbmUgaWYgaHVwY2wgaXMgb2ZmICovCgoJLyogY2FuY2VsIGFueSBzY2hlZHVsZWQgcmVhZGluZyAqLwoJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cnhfd29yayk7CglmbHVzaF9zY2hlZHVsZWRfd29yaygpOwoKCS8qIHNodXRkb3duIG91ciBidWxrIHJlYWQgKi8KCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7Cn0gLyogZnRkaV9jbG9zZSAqLwoKCgovKiBUaGUgU0lPIHJlcXVpcmVzIHRoZSBmaXJzdCBieXRlIHRvIGhhdmU6CiAqICBCMCAxCiAqICBCMSAwCiAqICBCMi4uNyBsZW5ndGggb2YgbWVzc2FnZSBleGNsdWRpbmcgYnl0ZSAwCiAqCiAqIFRoZSBuZXcgZGV2aWNlcyBkbyBub3QgcmVxdWlyZSB0aGlzIGJ5dGUKICovCnN0YXRpYyBpbnQgZnRkaV93cml0ZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCnsgLyogZnRkaV93cml0ZSAqLwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCB1cmIgKnVyYjsKCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKCWludCBkYXRhX29mZnNldCA7ICAgICAgIC8qIHdpbGwgYmUgMSBmb3IgdGhlIFNJTyBhbmQgMCBvdGhlcndpc2UgKi8KCWludCBzdGF0dXM7CglpbnQgdHJhbnNmZXJfc2l6ZTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZGJnKCIlcyBwb3J0ICVkLCAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CgoJaWYgKGNvdW50ID09IDApIHsKCQlkYmcoIndyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIpOwoJCXJldHVybiAwOwoJfQoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCWlmIChwcml2LT50eF9vdXRzdGFuZGluZ191cmJzID4gVVJCX1VQUEVSX0xJTUlUKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoJCWRiZygiJXMgLSB3cml0ZSBsaW1pdCBoaXRcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIDA7Cgl9Cglwcml2LT50eF9vdXRzdGFuZGluZ191cmJzKys7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CgoJZGF0YV9vZmZzZXQgPSBwcml2LT53cml0ZV9vZmZzZXQ7CiAgICAgICAgZGJnKCJkYXRhX29mZnNldCBzZXQgdG8gJWQiLGRhdGFfb2Zmc2V0KTsKCgkvKiBEZXRlcm1pbmUgdG90YWwgdHJhbnNmZXIgc2l6ZSAqLwoJdHJhbnNmZXJfc2l6ZSA9IGNvdW50OwoJaWYgKGRhdGFfb2Zmc2V0ID4gMCkgewoJCS8qIE9yaWdpbmFsIHNpbyBuZWVkcyBjb250cm9sIGJ5dGVzIHRvby4uLiAqLwoJCXRyYW5zZmVyX3NpemUgKz0gKGRhdGFfb2Zmc2V0ICoKCQkJCSgoY291bnQgKyAoUEtUU1ogLSAxIC0gZGF0YV9vZmZzZXQpKSAvCgkJCQkgKFBLVFNaIC0gZGF0YV9vZmZzZXQpKSk7Cgl9CgoJYnVmZmVyID0ga21hbGxvYyAodHJhbnNmZXJfc2l6ZSwgR0ZQX0FUT01JQyk7CglpZiAoIWJ1ZmZlcikgewoJCWVycigiJXMgcmFuIG91dCBvZiBrZXJuZWwgbWVtb3J5IGZvciB1cmIgLi4uIiwgX19GVU5DVElPTl9fKTsKCQljb3VudCA9IC1FTk9NRU07CgkJZ290byBlcnJvcl9ub19idWZmZXI7Cgl9CgoJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKCWlmICghdXJiKSB7CgkJZXJyKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19GVU5DVElPTl9fKTsKCQljb3VudCA9IC1FTk9NRU07CgkJZ290byBlcnJvcl9ub191cmI7Cgl9CgoJLyogQ29weSBkYXRhICovCglpZiAoZGF0YV9vZmZzZXQgPiAwKSB7CgkJLyogT3JpZ2luYWwgc2lvIHJlcXVpcmVzIGNvbnRyb2wgYnl0ZSBhdCBzdGFydCBvZiBlYWNoIHBhY2tldC4gKi8KCQlpbnQgdXNlcl9wa3RzeiA9IFBLVFNaIC0gZGF0YV9vZmZzZXQ7CgkJaW50IHRvZG8gPSBjb3VudDsKCQl1bnNpZ25lZCBjaGFyICpmaXJzdF9ieXRlID0gYnVmZmVyOwoJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmN1cnJlbnRfcG9zaXRpb24gPSBidWY7CgoJCXdoaWxlICh0b2RvID4gMCkgewoJCQlpZiAodXNlcl9wa3RzeiA+IHRvZG8pIHsKCQkJCXVzZXJfcGt0c3ogPSB0b2RvOwoJCQl9CgkJCS8qIFdyaXRlIHRoZSBjb250cm9sIGJ5dGUgYXQgdGhlIGZyb250IG9mIHRoZSBwYWNrZXQqLwoJCQkqZmlyc3RfYnl0ZSA9IDEgfCAoKHVzZXJfcGt0c3opIDw8IDIpOwoJCQkvKiBDb3B5IGRhdGEgZm9yIHBhY2tldCAqLwoJCQltZW1jcHkgKGZpcnN0X2J5dGUgKyBkYXRhX29mZnNldCwKCQkJCWN1cnJlbnRfcG9zaXRpb24sIHVzZXJfcGt0c3opOwoJCQlmaXJzdF9ieXRlICs9IHVzZXJfcGt0c3ogKyBkYXRhX29mZnNldDsKCQkJY3VycmVudF9wb3NpdGlvbiArPSB1c2VyX3BrdHN6OwoJCQl0b2RvIC09IHVzZXJfcGt0c3o7CgkJfQoJfSBlbHNlIHsKCQkvKiBObyBjb250cm9sIGJ5dGUgcmVxdWlyZWQuICovCgkJLyogQ29weSBpbiB0aGUgZGF0YSB0byBzZW5kICovCgkJbWVtY3B5IChidWZmZXIsIGJ1ZiwgY291bnQpOwoJfQoKCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB0cmFuc2Zlcl9zaXplLCBidWZmZXIpOwoKCS8qIGZpbGwgdGhlIGJ1ZmZlciBhbmQgc2VuZCBpdCAqLwoJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKCQkgICAgICB1c2Jfc25kYnVsa3BpcGUocG9ydC0+c2VyaWFsLT5kZXYsIHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyksCgkJICAgICAgYnVmZmVyLCB0cmFuc2Zlcl9zaXplLAoJCSAgICAgIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywgcG9ydCk7CgoJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKCWlmIChzdGF0dXMpIHsKCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKCQljb3VudCA9IHN0YXR1czsKCQlnb3RvIGVycm9yOwoJfSBlbHNlIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoJCXByaXYtPnR4X291dHN0YW5kaW5nX2J5dGVzICs9IGNvdW50OwoJCXByaXYtPnR4X2J5dGVzICs9IGNvdW50OwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCX0KCgkvKiB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgdXJiLCBzbyBsZXQgdGhlIGhvc3QgZHJpdmVyCgkgKiByZWFsbHkgZnJlZSBpdCB3aGVuIGl0IGlzIGZpbmlzaGVkIHdpdGggaXQgKi8KCXVzYl9mcmVlX3VyYih1cmIpOwoKCWRiZygiJXMgd3JpdGUgcmV0dXJuaW5nOiAlZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOwoJcmV0dXJuIGNvdW50OwplcnJvcjoKCXVzYl9mcmVlX3VyYih1cmIpOwplcnJvcl9ub191cmI6CglrZnJlZSAoYnVmZmVyKTsKZXJyb3Jfbm9fYnVmZmVyOgoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCXByaXYtPnR4X291dHN0YW5kaW5nX3VyYnMtLTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCXJldHVybiBjb3VudDsKfSAvKiBmdGRpX3dyaXRlICovCgoKLyogVGhpcyBmdW5jdGlvbiBtYXkgZ2V0IGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMgY2xvc2VkICovCgpzdGF0aWMgdm9pZCBmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CglpbnQgZGF0YV9vZmZzZXQ7ICAgICAgIC8qIHdpbGwgYmUgMSBmb3IgdGhlIFNJTyBhbmQgMCBvdGhlcndpc2UgKi8KCXVuc2lnbmVkIGxvbmcgY291bnRiYWNrOwoKCS8qIGZyZWUgdXAgdGhlIHRyYW5zZmVyIGJ1ZmZlciwgYXMgdXNiX2ZyZWVfdXJiKCkgZG9lcyBub3QgZG8gdGhpcyAqLwoJa2ZyZWUgKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCglpZiAodXJiLT5zdGF0dXMpIHsKCQlkYmcoIm5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgdXJiLT5zdGF0dXMpOwoJCXJldHVybjsKCX0KCglwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJaWYgKCFwcml2KSB7CgkJZGJnKCIlcyAtIGJhZCBwb3J0IHByaXZhdGUgZGF0YSBwb2ludGVyIC0gZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJLyogYWNjb3VudCBmb3IgdHJhbnNmZXJyZWQgZGF0YSAqLwoJY291bnRiYWNrID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwoJZGF0YV9vZmZzZXQgPSBwcml2LT53cml0ZV9vZmZzZXQ7CglpZiAoZGF0YV9vZmZzZXQgPiAwKSB7CgkJLyogU3VidHJhY3QgdGhlIGNvbnRyb2wgYnl0ZXMgKi8KCQljb3VudGJhY2sgLT0gKGRhdGFfb2Zmc2V0ICogKChjb3VudGJhY2sgKyAoUEtUU1ogLSAxKSkgLyBQS1RTWikpOwoJfQoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCS0tcHJpdi0+dHhfb3V0c3RhbmRpbmdfdXJiczsKCXByaXYtPnR4X291dHN0YW5kaW5nX2J5dGVzIC09IGNvdW50YmFjazsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCgl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKfSAvKiBmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2sgKi8KCgpzdGF0aWMgaW50IGZ0ZGlfd3JpdGVfcm9vbSggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCApCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglpbnQgcm9vbTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCWlmIChwcml2LT50eF9vdXRzdGFuZGluZ191cmJzIDwgVVJCX1VQUEVSX0xJTUlUKSB7CgkJLyoKCQkgKiBXZSByZWFsbHkgY2FuIHRha2UgYW55dGhpbmcgdGhlIHVzZXIgdGhyb3dzIGF0IHVzCgkJICogYnV0IGxldCdzIHBpY2sgYSBuaWNlIGJpZyBudW1iZXIgdG8gdGVsbCB0aGUgdHR5CgkJICogbGF5ZXIgdGhhdCB3ZSBoYXZlIGxvdHMgb2YgZnJlZSBzcGFjZQoJCSAqLwoJCXJvb20gPSAyMDQ4OwoJfSBlbHNlIHsKCQlyb29tID0gMDsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCXJldHVybiByb29tOwp9IC8qIGZ0ZGlfd3JpdGVfcm9vbSAqLwoKCnN0YXRpYyBpbnQgZnRkaV9jaGFyc19pbl9idWZmZXIgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsgLyogZnRkaV9jaGFyc19pbl9idWZmZXIgKi8KCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglpbnQgYnVmZmVyZWQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CglidWZmZXJlZCA9IChpbnQpcHJpdi0+dHhfb3V0c3RhbmRpbmdfYnl0ZXM7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CglpZiAoYnVmZmVyZWQgPCAwKSB7CgkJZXJyKCIlcyBvdXRzdGFuZGluZyB0eCBieXRlcyBpcyBuZWdhdGl2ZSEiLCBfX0ZVTkNUSU9OX18pOwoJCWJ1ZmZlcmVkID0gMDsKCX0KCXJldHVybiBidWZmZXJlZDsKfSAvKiBmdGRpX2NoYXJzX2luX2J1ZmZlciAqLwoKCgpzdGF0aWMgdm9pZCBmdGRpX3JlYWRfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQp7IC8qIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrICovCglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CglzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCXVuc2lnbmVkIGxvbmcgY291bnRyZWFkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglpZiAodXJiLT5udW1iZXJfb2ZfcGFja2V0cyA+IDApIHsKCQllcnIoIiVzIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJWQgYWN0dWFsX2xlbmd0aCAlZCBudW1iZXIgb2YgcGFja2V0cyAlZCIsX19GVU5DVElPTl9fLAoJCSAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIHVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT5udW1iZXJfb2ZfcGFja2V0cyApOwoJCWVycigiJXMgdHJhbnNmZXJfZmxhZ3MgJXggIiwgX19GVU5DVElPTl9fLHVyYi0+dHJhbnNmZXJfZmxhZ3MgKTsKCX0KCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCglpZiAocG9ydC0+b3Blbl9jb3VudCA8PSAwKQoJCXJldHVybjsKCgl0dHkgPSBwb3J0LT50dHk7CglpZiAoIXR0eSkgewoJCWRiZygiJXMgLSBiYWQgdHR5IHBvaW50ZXIgLSBleGl0aW5nIixfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCglwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJaWYgKCFwcml2KSB7CgkJZGJnKCIlcyAtIGJhZCBwb3J0IHByaXZhdGUgZGF0YSBwb2ludGVyIC0gZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoKCWlmICh1cmIgIT0gcG9ydC0+cmVhZF91cmIpIHsKCQllcnIoIiVzIC0gTm90IG15IHVyYiEiLCBfX0ZVTkNUSU9OX18pOwoJfQoKCWlmICh1cmItPnN0YXR1cykgewoJCS8qIFRoaXMgd2lsbCBoYXBwZW4gYXQgY2xvc2UgZXZlcnkgdGltZSBzbyBpdCBpcyBhIGRiZyBub3QgYW4gZXJyICovCgkJZGJnKCIodGhpcyBpcyBvayBvbiBjbG9zZSkgbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIHVyYi0+c3RhdHVzKTsKCQlyZXR1cm47Cgl9CgoJLyogY291bnQgZGF0YSBieXRlcywgYnV0IG5vdCBzdGF0dXMgYnl0ZXMgKi8KCWNvdW50cmVhZCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKCWNvdW50cmVhZCAtPSAyICogKChjb3VudHJlYWQgKyAoUEtUU1ogLSAxKSkgLyBQS1RTWik7CglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoJcHJpdi0+cnhfYnl0ZXMgKz0gY291bnRyZWFkOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoKCWZ0ZGlfcHJvY2Vzc19yZWFkKCZwcml2LT5yeF93b3JrLndvcmspOwoKfSAvKiBmdGRpX3JlYWRfYnVsa19jYWxsYmFjayAqLwoKCnN0YXRpYyB2b2lkIGZ0ZGlfcHJvY2Vzc19yZWFkIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCnsgLyogZnRkaV9wcm9jZXNzX3JlYWQgKi8KCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPQoJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZnRkaV9wcml2YXRlLCByeF93b3JrLndvcmspOwoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHByaXYtPnBvcnQ7CglzdHJ1Y3QgdXJiICp1cmI7CglzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwoJY2hhciBlcnJvcl9mbGFnOwoJdW5zaWduZWQgY2hhciAqZGF0YTsKCglpbnQgaTsKCWludCByZXN1bHQ7CglpbnQgbmVlZF9mbGlwOwoJaW50IHBhY2tldF9vZmZzZXQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwoKCWlmIChwb3J0LT5vcGVuX2NvdW50IDw9IDApCgkJcmV0dXJuOwoKCXR0eSA9IHBvcnQtPnR0eTsKCWlmICghdHR5KSB7CgkJZGJnKCIlcyAtIGJhZCB0dHkgcG9pbnRlciAtIGV4aXRpbmciLF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglpZiAoIXByaXYpIHsKCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJdXJiID0gcG9ydC0+cmVhZF91cmI7CglpZiAoIXVyYikgewoJCWRiZygiJXMgLSBiYWQgcmVhZF91cmIgcG9pbnRlciAtIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCglkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CgoJaWYgKHByaXYtPnJ4X3Byb2Nlc3NlZCkgewoJCWRiZygiJXMgLSBhbHJlYWR5IHByb2Nlc3NlZDogJWQgYnl0ZXMsICVkIHJlbWFpbiIsIF9fRlVOQ1RJT05fXywKCQkJCXByaXYtPnJ4X3Byb2Nlc3NlZCwKCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCAtIHByaXYtPnJ4X3Byb2Nlc3NlZCk7Cgl9IGVsc2UgewoJCS8qIFRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgZXZlcnkgcmVhZCBwYWNrZXQgYXJlIHN0YXR1cyAqLwoJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAyKSB7CgkJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwoJCX0gZWxzZSB7CgkJCWRiZygiU3RhdHVzIG9ubHk6ICUwM29vICUwM29vIixkYXRhWzBdLGRhdGFbMV0pOwoJCX0KCX0KCgoJLyogVE8gRE8gLS0gY2hlY2sgZm9yIGh1bmcgdXAgbGluZSBhbmQgaGFuZGxlIGFwcHJvcHJpYXRlbHk6ICovCgkvKiAgIHNlbmQgaGFuZ3VwICAqLwoJLyogU2VlIGFjbS5jIC0geW91IGRvIGEgdHR5X2hhbmd1cCAgLSBlZyB0dHlfaGFuZ3VwKHR0eSkgKi8KCS8qIGlmIENEIGlzIGRyb3BwZWQgYW5kIHRoZSBsaW5lIGlzIG5vdCBDTE9DQUwgdGhlbiB3ZSBzaG91bGQgaGFuZ3VwICovCgoJbmVlZF9mbGlwID0gMDsKCWZvciAocGFja2V0X29mZnNldCA9IHByaXYtPnJ4X3Byb2Nlc3NlZDsgcGFja2V0X29mZnNldCA8IHVyYi0+YWN0dWFsX2xlbmd0aDsgcGFja2V0X29mZnNldCArPSBQS1RTWikgewoJCWludCBsZW5ndGg7CgoJCS8qIENvbXBhcmUgbmV3IGxpbmUgc3RhdHVzIHRvIHRoZSBvbGQgb25lLCBzaWduYWwgaWYgZGlmZmVyZW50ICovCgkJLyogTi5CLiBwYWNrZXQgbWF5IGJlIHByb2Nlc3NlZCBtb3JlIHRoYW4gb25jZSwgYnV0IGRpZmZlcmVuY2VzCgkJICogYXJlIG9ubHkgcHJvY2Vzc2VkIG9uY2UuICAqLwoJCWlmIChwcml2ICE9IE5VTEwpIHsKCQkJY2hhciBuZXdfc3RhdHVzID0gZGF0YVtwYWNrZXRfb2Zmc2V0KzBdICYgRlRESV9TVEFUVVNfQjBfTUFTSzsKCQkJaWYgKG5ld19zdGF0dXMgIT0gcHJpdi0+cHJldl9zdGF0dXMpIHsKCQkJCXByaXYtPmRpZmZfc3RhdHVzIHw9IG5ld19zdGF0dXMgXiBwcml2LT5wcmV2X3N0YXR1czsKCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwoJCQkJcHJpdi0+cHJldl9zdGF0dXMgPSBuZXdfc3RhdHVzOwoJCQl9CgkJfQoKCQlsZW5ndGggPSBtaW4oUEtUU1osIHVyYi0+YWN0dWFsX2xlbmd0aC1wYWNrZXRfb2Zmc2V0KS0yOwoJCWlmIChsZW5ndGggPCAwKSB7CgkJCWVycigiJXMgLSBiYWQgcGFja2V0IGxlbmd0aDogJWQiLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCsyKTsKCQkJbGVuZ3RoID0gMDsKCQl9CgoJCWlmIChwcml2LT5yeF9mbGFncyAmIFRIUk9UVExFRCkgewoJCQlkYmcoIiVzIC0gdGhyb3R0bGVkIiwgX19GVU5DVElPTl9fKTsKCQkJYnJlYWs7CgkJfQoJCWlmICh0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGxlbmd0aCkgPCBsZW5ndGgpIHsKCQkJLyogYnJlYWsgb3V0ICYgd2FpdCBmb3IgdGhyb3R0bGluZy91bnRocm90dGxpbmcgdG8gaGFwcGVuICovCgkJCWRiZygiJXMgLSByZWNlaXZlIHJvb20gbG93IiwgX19GVU5DVElPTl9fKTsKCQkJYnJlYWs7CgkJfQoKCQkvKiBIYW5kbGUgZXJyb3JzIGFuZCBicmVhayAqLwoJCWVycm9yX2ZsYWcgPSBUVFlfTk9STUFMOwoJCS8qIEFsdGhvdWdoIHRoZSBkZXZpY2UgdXNlcyBhIGJpdG1hc2sgYW5kIGhlbmNlIGNhbiBoYXZlIG11bHRpcGxlICovCgkJLyogZXJyb3JzIG9uIGEgcGFja2V0IC0gdGhlIG9yZGVyIGhlcmUgc2V0cyB0aGUgcHJpb3JpdHkgdGhlICovCgkJLyogZXJyb3IgaXMgcmV0dXJuZWQgdG8gdGhlIHR0eSBsYXllciAgKi8KCgkJaWYgKCBkYXRhW3BhY2tldF9vZmZzZXQrMV0gJiBGVERJX1JTX09FICkgewoJCQllcnJvcl9mbGFnID0gVFRZX09WRVJSVU47CgkJCWRiZygiT1ZFUlJSVU4gZXJyb3IiKTsKCQl9CgkJaWYgKCBkYXRhW3BhY2tldF9vZmZzZXQrMV0gJiBGVERJX1JTX0JJICkgewoJCQllcnJvcl9mbGFnID0gVFRZX0JSRUFLOwoJCQlkYmcoIkJSRUFLIHJlY2VpdmVkIik7CgkJfQoJCWlmICggZGF0YVtwYWNrZXRfb2Zmc2V0KzFdICYgRlRESV9SU19QRSApIHsKCQkJZXJyb3JfZmxhZyA9IFRUWV9QQVJJVFk7CgkJCWRiZygiUEFSSVRZIGVycm9yIik7CgkJfQoJCWlmICggZGF0YVtwYWNrZXRfb2Zmc2V0KzFdICYgRlRESV9SU19GRSApIHsKCQkJZXJyb3JfZmxhZyA9IFRUWV9GUkFNRTsKCQkJZGJnKCJGUkFNSU5HIGVycm9yIik7CgkJfQoJCWlmIChsZW5ndGggPiAwKSB7CgkJCWZvciAoaSA9IDI7IGkgPCBsZW5ndGgrMjsgaSsrKSB7CgkJCQkvKiBOb3RlIHRoYXQgdGhlIGVycm9yIGZsYWcgaXMgZHVwbGljYXRlZCBmb3IKCQkJCSAgIGV2ZXJ5IGNoYXJhY3RlciByZWNlaXZlZCBzaW5jZSB3ZSBkb24ndCBrbm93CgkJCQkgICB3aGljaCBjaGFyYWN0ZXIgaXQgYXBwbGllZCB0byAqLwoJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhW3BhY2tldF9vZmZzZXQraV0sIGVycm9yX2ZsYWcpOwoJCQl9CgkJCW5lZWRfZmxpcCA9IDE7CgkJfQoKI2lmZGVmIE5PVF9DT1JSRUNUX0JVVF9LRUVQSU5HX0lUX0ZPUl9OT1cKCQkvKiBpZiBhIHBhcml0eSBlcnJvciBpcyBkZXRlY3RlZCB5b3UgZ2V0IHN0YXR1cyBwYWNrZXRzIGZvcmV2ZXIKCQkgICB1bnRpbCBhIGNoYXJhY3RlciBpcyBzZW50IHdpdGhvdXQgYSBwYXJpdHkgZXJyb3IuCgkJICAgVGhpcyBkb2Vzbid0IHdvcmsgd2VsbCBzaW5jZSB0aGUgYXBwbGljYXRpb24gcmVjZWl2ZXMgYSBuZXZlcgoJCSAgIGVuZGluZyBzdHJlYW0gb2YgYmFkIGRhdGEgLSBldmVuIHRob3VnaCBuZXcgZGF0YSBoYXNuJ3QgYmVlbiBzZW50LgoJCSAgIFRoZXJlZm9yZSBJIChiaWxsKSBoYXZlIHRha2VuIHRoaXMgb3V0LgoJCSAgIEhvd2V2ZXIgLSB0aGlzIG1pZ2h0IG1ha2Ugc2Vuc2UgZm9yIGZyYW1pbmcgZXJyb3JzIGFuZCBzbyBvbgoJCSAgIHNvIEkgYW0gbGVhdmluZyB0aGUgY29kZSBpbiBmb3Igbm93LgoJCSovCgkJZWxzZSB7CgkJCWlmIChlcnJvcl9mbGFnICE9IFRUWV9OT1JNQUwpewoJCQkJZGJnKCJlcnJvcl9mbGFnIGlzIG5vdCBub3JtYWwiKTsKCQkJCS8qIEluIHRoaXMgY2FzZSBpdCBpcyBqdXN0IHN0YXR1cyAtIGlmIHRoYXQgaXMgYW4gZXJyb3Igc2VuZCBhIGJhZCBjaGFyYWN0ZXIgKi8KCQkJCWlmKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7CgkJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKCQkJCX0KCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMHhmZiwgZXJyb3JfZmxhZyk7CgkJCQluZWVkX2ZsaXAgPSAxOwoJCQl9CgkJfQojZW5kaWYKCX0gLyogImZvcihwYWNrZXRfb2Zmc2V0PTAuLi4iICovCgoJLyogTG93IGxhdGVuY3kgKi8KCWlmIChuZWVkX2ZsaXApIHsKCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwoJfQoKCWlmIChwYWNrZXRfb2Zmc2V0IDwgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CgkJLyogbm90IGNvbXBsZXRlbHkgcHJvY2Vzc2VkIC0gcmVjb3JkIHByb2dyZXNzICovCgkJcHJpdi0+cnhfcHJvY2Vzc2VkID0gcGFja2V0X29mZnNldDsKCQlkYmcoIiVzIC0gaW5jb21wbGV0ZSwgJWQgYnl0ZXMgcHJvY2Vzc2VkLCAlZCByZW1haW4iLAoJCQkJX19GVU5DVElPTl9fLCBwYWNrZXRfb2Zmc2V0LAoJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoIC0gcGFja2V0X29mZnNldCk7CgkJLyogY2hlY2sgaWYgd2Ugd2VyZSB0aHJvdHRsZWQgd2hpbGUgcHJvY2Vzc2luZyAqLwoJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgkJaWYgKHByaXYtPnJ4X2ZsYWdzICYgVEhST1RUTEVEKSB7CgkJCXByaXYtPnJ4X2ZsYWdzIHw9IEFDVFVBTExZX1RIUk9UVExFRDsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoJCQlkYmcoIiVzIC0gZGVmZXJyaW5nIHJlbWFpbmRlciB1bnRpbCB1bnRocm90dGxlZCIsCgkJCQkJX19GVU5DVElPTl9fKTsKCQkJcmV0dXJuOwoJCX0KCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgkJLyogaWYgdGhlIHBvcnQgaXMgY2xvc2VkIHN0b3AgdHJ5aW5nIHRvIHJlYWQgKi8KCQlpZiAocG9ydC0+b3Blbl9jb3VudCA+IDApewoJCQkvKiBkZWxheSBwcm9jZXNzaW5nIG9mIHJlbWFpbmRlciAqLwoJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPnJ4X3dvcmssIDEpOwoJCX0gZWxzZSB7CgkJCWRiZygiJXMgLSBwb3J0IGlzIGNsb3NlZCIsIF9fRlVOQ1RJT05fXyk7CgkJfQoJCXJldHVybjsKCX0KCgkvKiB1cmIgaXMgY29tcGxldGVseSBwcm9jZXNzZWQgKi8KCXByaXYtPnJ4X3Byb2Nlc3NlZCA9IDA7CgoJLyogaWYgdGhlIHBvcnQgaXMgY2xvc2VkIHN0b3AgdHJ5aW5nIHRvIHJlYWQgKi8KCWlmIChwb3J0LT5vcGVuX2NvdW50ID4gMCl7CgkJLyogQ29udGludWUgdHJ5aW5nIHRvIGFsd2F5cyByZWFkICAqLwoJCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKCQkJICAgICAgdXNiX3JjdmJ1bGtwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCBwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyksCgkJCSAgICAgIHBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXIsIHBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAoJCQkgICAgICBmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CgoJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKCQlpZiAocmVzdWx0KQoJCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7Cgl9CgoJcmV0dXJuOwp9IC8qIGZ0ZGlfcHJvY2Vzc19yZWFkICovCgoKc3RhdGljIHZvaWQgZnRkaV9icmVha19jdGwoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSApCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglfX3UxNiB1cmJfdmFsdWUgPSAwOwoJY2hhciBidWZbMV07CgoJLyogYnJlYWtfc3RhdGUgPSAtMSB0byB0dXJuIG9uIGJyZWFrLCBhbmQgMCB0byB0dXJuIG9mZiBicmVhayAqLwoJLyogc2VlIGRyaXZlcnMvY2hhci90dHlfaW8uYyB0byBzZWUgaXQgdXNlZCAqLwoJLyogbGFzdF9zZXRfZGF0YV91cmJfdmFsdWUgTkVWRVIgaGFzIHRoZSBicmVhayBiaXQgc2V0IGluIGl0ICovCgoJaWYgKGJyZWFrX3N0YXRlKSB7CgkJdXJiX3ZhbHVlID0gcHJpdi0+bGFzdF9zZXRfZGF0YV91cmJfdmFsdWUgfCBGVERJX1NJT19TRVRfQlJFQUs7Cgl9IGVsc2UgewoJCXVyYl92YWx1ZSA9IHByaXYtPmxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlOwoJfQoKCglpZiAodXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAoJCQkgICAgRlRESV9TSU9fU0VUX0RBVEFfUkVRVUVTVCwKCQkJICAgIEZURElfU0lPX1NFVF9EQVRBX1JFUVVFU1RfVFlQRSwKCQkJICAgIHVyYl92YWx1ZSAsIHByaXYtPmludGVyZmFjZSwKCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewoJCWVycigiJXMgRkFJTEVEIHRvIGVuYWJsZS9kaXNhYmxlIGJyZWFrIHN0YXRlIChzdGF0ZSB3YXMgJWQpIiwgX19GVU5DVElPTl9fLGJyZWFrX3N0YXRlKTsKCX0KCglkYmcoIiVzIGJyZWFrIHN0YXRlIGlzICVkIC0gdXJiIGlzICVkIiwgX19GVU5DVElPTl9fLGJyZWFrX3N0YXRlLCB1cmJfdmFsdWUpOwoKfQoKCi8qIG9sZF90ZXJtaW9zIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB0ZXJtaW9zIHNldHRpbmdzIGFuZCB0dHktPnRlcm1pb3MgY29udGFpbnMKICogdGhlIG5ldyBzZXR0aW5nIHRvIGJlIHVzZWQKICogV0FSTklORzogc2V0X3Rlcm1pb3MgY2FsbHMgdGhpcyB3aXRoIG9sZF90ZXJtaW9zIGluIGtlcm5lbCBzcGFjZQogKi8KCnN0YXRpYyB2b2lkIGZ0ZGlfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCnsgLyogZnRkaV90ZXJtaW9zICovCglzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7Cgl1bnNpZ25lZCBpbnQgY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJX191MTYgdXJiX3ZhbHVlOyAvKiB3aWxsIGhvbGQgdGhlIG5ldyBmbGFncyAqLwoJY2hhciBidWZbMV07IC8qIFBlcmhhcHMgSSBzaG91bGQgZHluYW1pY2FsbHkgYWxsb2MgdGhpcz8gKi8KCgkvLyBBZGRlZCBmb3IgeG9uL3hvZmYgc3VwcG9ydAoJdW5zaWduZWQgaW50IGlmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2lmbGFnOwoJdW5zaWduZWQgY2hhciB2c3RvcDsKCXVuc2lnbmVkIGNoYXIgdnN0YXJ0OwoKCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwoKCS8qIEZvcmNlIGJhdWQgcmF0ZSBpZiB0aGlzIGRldmljZSByZXF1aXJlcyBpdCwgdW5sZXNzIGl0IGlzIHNldCB0byBCMC4gKi8KCWlmIChwcml2LT5mb3JjZV9iYXVkICYmICgocG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICE9IEIwKSkgewoJCWRiZygiJXM6IGZvcmNpbmcgYmF1ZCByYXRlIGZvciB0aGlzIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CgkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKCQlwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gcHJpdi0+Zm9yY2VfYmF1ZDsKCX0KCgkvKiBGb3JjZSBSVFMtQ1RTIGlmIHRoaXMgZGV2aWNlIHJlcXVpcmVzIGl0LiAqLwoJaWYgKHByaXYtPmZvcmNlX3J0c2N0cykgewoJCWRiZygiJXM6IGZvcmNpbmcgcnRzY3RzIGZvciB0aGlzIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CgkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IENSVFNDVFM7Cgl9CgoJY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CgoJLyogRklYTUUgLUZvciB0aGlzIGN1dCBJIGRvbid0IGNhcmUgaWYgdGhlIGxpbmUgaXMgcmVhbGx5IGNoYW5naW5nIG9yCgkgICBub3QgIC0gc28ganVzdCBkbyB0aGUgY2hhbmdlIHJlZ2FyZGxlc3MgIC0gc2hvdWxkIGJlIGFibGUgdG8KCSAgIGNvbXBhcmUgb2xkX3Rlcm1pb3MgYW5kIHR0eS0+dGVybWlvcyAqLwoJLyogTk9URSBUaGVzZSByb3V0aW5lcyBjYW4gZ2V0IGludGVycnVwdGVkIGJ5CgkgICBmdGRpX3Npb19yZWFkX2J1bGtfY2FsbGJhY2sgIC0gbmVlZCB0byBleGFtaW5lIHdoYXQgdGhpcwogICAgICAgICAgIG1lYW5zIC0gZG9uJ3Qgc2VlIGFueSBwcm9ibGVtcyB5ZXQgKi8KCgkvKiBTZXQgbnVtYmVyIG9mIGRhdGEgYml0cywgcGFyaXR5LCBzdG9wIGJpdHMgKi8KCgl1cmJfdmFsdWUgPSAwOwoJdXJiX3ZhbHVlIHw9IChjZmxhZyAmIENTVE9QQiA/IEZURElfU0lPX1NFVF9EQVRBX1NUT1BfQklUU18yIDoKCQkgICAgICBGVERJX1NJT19TRVRfREFUQV9TVE9QX0JJVFNfMSk7Cgl1cmJfdmFsdWUgfD0gKGNmbGFnICYgUEFSRU5CID8KCQkgICAgICAoY2ZsYWcgJiBQQVJPREQgPyBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfT0REIDoKCQkgICAgICAgRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX0VWRU4pIDoKCQkgICAgICBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfTk9ORSk7CglpZiAoY2ZsYWcgJiBDU0laRSkgewoJCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewoJCWNhc2UgQ1M1OiB1cmJfdmFsdWUgfD0gNTsgZGJnKCJTZXR0aW5nIENTNSIpOyBicmVhazsKCQljYXNlIENTNjogdXJiX3ZhbHVlIHw9IDY7IGRiZygiU2V0dGluZyBDUzYiKTsgYnJlYWs7CgkJY2FzZSBDUzc6IHVyYl92YWx1ZSB8PSA3OyBkYmcoIlNldHRpbmcgQ1M3Iik7IGJyZWFrOwoJCWNhc2UgQ1M4OiB1cmJfdmFsdWUgfD0gODsgZGJnKCJTZXR0aW5nIENTOCIpOyBicmVhazsKCQlkZWZhdWx0OgoJCQllcnIoIkNTSVpFIHdhcyBzZXQgYnV0IG5vdCBDUzUtQ1M4Iik7CgkJfQoJfQoKCS8qIFRoaXMgaXMgbmVlZGVkIGJ5IHRoZSBicmVhayBjb21tYW5kIHNpbmNlIGl0IHVzZXMgdGhlIHNhbWUgY29tbWFuZCAtIGJ1dCBpcwoJICogIG9yJ2VkIHdpdGggdGhpcyB2YWx1ZSAgKi8KCXByaXYtPmxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlID0gdXJiX3ZhbHVlOwoKCWlmICh1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKCQkJICAgIEZURElfU0lPX1NFVF9EQVRBX1JFUVVFU1QsCgkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNUX1RZUEUsCgkJCSAgICB1cmJfdmFsdWUgLCBwcml2LT5pbnRlcmZhY2UsCgkJCSAgICBidWYsIDAsIFdEUl9TSE9SVF9USU1FT1VUKSA8IDApIHsKCQllcnIoIiVzIEZBSUxFRCB0byBzZXQgZGF0YWJpdHMvc3RvcGJpdHMvcGFyaXR5IiwgX19GVU5DVElPTl9fKTsKCX0KCgkvKiBOb3cgZG8gdGhlIGJhdWRyYXRlICovCglpZiAoKGNmbGFnICYgQ0JBVUQpID09IEIwICkgewoJCS8qIERpc2FibGUgZmxvdyBjb250cm9sICovCgkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwKCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKCQkJCSAgICAwLCBwcml2LT5pbnRlcmZhY2UsCgkJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7CgkJCWVycigiJXMgZXJyb3IgZnJvbSBkaXNhYmxlIGZsb3djb250cm9sIHVyYiIsIF9fRlVOQ1RJT05fXyk7CgkJfQoJCS8qIERyb3AgUlRTIGFuZCBEVFIgKi8KCQljbGVhcl9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwoJfSBlbHNlIHsKCQkvKiBzZXQgdGhlIGJhdWRyYXRlIGRldGVybWluZWQgYmVmb3JlICovCgkJaWYgKGNoYW5nZV9zcGVlZChwb3J0KSkgewoJCQllcnIoIiVzIHVyYiBmYWlsZWQgdG8gc2V0IGJhdWRyYXRlIiwgX19GVU5DVElPTl9fKTsKCQl9CgkJLyogRW5zdXJlIFJUUyBhbmQgRFRSIGFyZSByYWlzZWQgd2hlbiBiYXVkcmF0ZSBjaGFuZ2VkIGZyb20gMCAqLwoJCWlmICghb2xkX3Rlcm1pb3MgfHwgKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpID09IEIwKSB7CgkJCXNldF9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwoJCX0KCX0KCgkvKiBTZXQgZmxvdyBjb250cm9sICovCgkvKiBOb3RlIGRldmljZSBhbHNvIHN1cHBvcnRzIERUUi9DRCAodWdoKSBhbmQgWG9uL1hvZmYgaW4gaGFyZHdhcmUgKi8KCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKCQlkYmcoIiVzIFNldHRpbmcgdG8gQ1JUU0NUUyBmbG93IGNvbnRyb2wiLCBfX0ZVTkNUSU9OX18pOwoJCWlmICh1c2JfY29udHJvbF9tc2coZGV2LAoJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwKCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKCQkJCSAgICAwICwgKEZURElfU0lPX1JUU19DVFNfSFMgfCBwcml2LT5pbnRlcmZhY2UpLAoJCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewoJCQllcnIoInVyYiBmYWlsZWQgdG8gc2V0IHRvIHJ0cy9jdHMgZmxvdyBjb250cm9sIik7CgkJfQoKCX0gZWxzZSB7CgkJLyoKCQkgKiBYb24vWG9mZiBjb2RlCgkJICoKCQkgKiBDaGVjayB0aGUgSVhPRkYgc3RhdHVzIGluIHRoZSBpZmxhZyBjb21wb25lbnQgb2YgdGhlIHRlcm1pb3Mgc3RydWN0dXJlCgkJICogaWYgSVhPRkYgaXMgbm90IHNldCwgdGhlIHByZS14b24veG9mZiBjb2RlIGlzIGV4ZWN1dGVkLgoJCSovCgkJaWYgKGlmbGFnICYgSVhPRkYpIHsKCQkJZGJnKCIlcyAgcmVxdWVzdCB0byBlbmFibGUgeG9ueG9mZiBpZmxhZz0lMDR4IixfX0ZVTkNUSU9OX18saWZsYWcpOwoJCQkvLyBUcnkgdG8gZW5hYmxlIHRoZSBYT04vWE9GRiBvbiB0aGUgZnRkaV9zaW8KCQkJLy8gU2V0IHRoZSB2c3RhcnQgYW5kIHZzdG9wIC0tIGNvdWxkIGhhdmUgYmVlbiBkb25lIHVwIGFib3ZlIHdoZXJlCgkJCS8vIGEgbG90IG9mIG90aGVyIGRlcmVmZXJlbmNpbmcgaXMgZG9uZSBidXQgdGhhdCB3b3VsZCBiZSB2ZXJ5CgkJCS8vIGluZWZmaWNpZW50IGFzIHZzdGFydCBhbmQgdnN0b3AgYXJlIG5vdCBhbHdheXMgbmVlZGVkCgkJCXZzdGFydD1wb3J0LT50dHktPnRlcm1pb3MtPmNfY2NbVlNUQVJUXTsKCQkJdnN0b3A9cG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NjW1ZTVE9QXTsKCQkJdXJiX3ZhbHVlPSh2c3RvcCA8PCA4KSB8ICh2c3RhcnQpOwoKCQkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsCgkJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCgkJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAoJCQkJCSAgICB1cmJfdmFsdWUgLCAoRlRESV9TSU9fWE9OX1hPRkZfSFMKCQkJCQkJCSB8IHByaXYtPmludGVyZmFjZSksCgkJCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewoJCQkJZXJyKCJ1cmIgZmFpbGVkIHRvIHNldCB0byB4b24veG9mZiBmbG93IGNvbnRyb2wiKTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8qIGVsc2UgY2xhdXNlIHRvIG9ubHkgcnVuIGlmIGNmYWcgISBDUlRTQ1RTIGFuZCBpZmxhZyAhIFhPRkYgKi8KCQkJLyogQ0hFQ0tNRSBBc3N1bWluZyBYT04vWE9GRiBoYW5kbGVkIGJ5IHR0eSBzdGFjayAtIG5vdCBieSBkZXZpY2UgKi8KCQkJZGJnKCIlcyBUdXJuaW5nIG9mZiBoYXJkd2FyZSBmbG93IGNvbnRyb2wiLCBfX0ZVTkNUSU9OX18pOwoJCQlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwKCQkJCQkgICAgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCgkJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwKCQkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCgkJCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwKCQkJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7CgkJCQllcnIoInVyYiBmYWlsZWQgdG8gY2xlYXIgZmxvdyBjb250cm9sIik7CgkJCX0KCQl9CgoJfQoJcmV0dXJuOwp9IC8qIGZ0ZGlfdGVybWlvcyAqLwoKCnN0YXRpYyBpbnQgZnRkaV90aW9jbWdldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Cgl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKCWludCByZXQ7CgoJZGJnKCIlcyBUSU9DTUdFVCIsIF9fRlVOQ1RJT05fXyk7Cglzd2l0Y2ggKHByaXYtPmNoaXBfdHlwZSkgewoJY2FzZSBTSU86CgkJLyogUmVxdWVzdCB0aGUgc3RhdHVzIGZyb20gdGhlIGRldmljZSAqLwoJCWlmICgocmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAoJCQkJCSAgIHVzYl9yY3ZjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCQkJICAgRlRESV9TSU9fR0VUX01PREVNX1NUQVRVU19SRVFVRVNULAoJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVF9UWVBFLAoJCQkJCSAgIDAsIDAsCgkJCQkJICAgYnVmLCAxLCBXRFJfVElNRU9VVCkpIDwgMCApIHsKCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19GVU5DVElPTl9fLAoJCQkgICAgcmV0KTsKCQkJcmV0dXJuKHJldCk7CgkJfQoJCWJyZWFrOwoJY2FzZSBGVDhVMjMyQU06CgljYXNlIEZUMjMyQk06CgljYXNlIEZUMjIzMkM6CgkJLyogdGhlIDhVMjMyQU0gcmV0dXJucyBhIHR3byBieXRlIHZhbHVlICh0aGUgc2lvIGlzIGEgMSBieXRlIHZhbHVlKSAtIGluIHRoZSBzYW1lCgkJICAgZm9ybWF0IGFzIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIGluIHBvaW50ICovCgkJaWYgKChyZXQgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCgkJCQkJICAgdXNiX3JjdmN0cmxwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKSwKCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1QsCgkJCQkJICAgRlRESV9TSU9fR0VUX01PREVNX1NUQVRVU19SRVFVRVNUX1RZUEUsCgkJCQkJICAgMCwgcHJpdi0+aW50ZXJmYWNlLAoJCQkJCSAgIGJ1ZiwgMiwgV0RSX1RJTUVPVVQpKSA8IDAgKSB7CgkJCWVycigiJXMgQ291bGQgbm90IGdldCBtb2RlbSBzdGF0dXMgb2YgZGV2aWNlIC0gZXJyOiAlZCIsIF9fRlVOQ1RJT05fXywKCQkJICAgIHJldCk7CgkJCXJldHVybihyZXQpOwoJCX0KCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FRkFVTFQ7CgkJYnJlYWs7Cgl9CgoJcmV0dXJuICAoYnVmWzBdICYgRlRESV9TSU9fRFNSX01BU0sgPyBUSU9DTV9EU1IgOiAwKSB8CgkJKGJ1ZlswXSAmIEZURElfU0lPX0NUU19NQVNLID8gVElPQ01fQ1RTIDogMCkgfAoJCShidWZbMF0gICYgRlRESV9TSU9fUklfTUFTSyAgPyBUSU9DTV9SSSAgOiAwKSB8CgkJKGJ1ZlswXSAgJiBGVERJX1NJT19STFNEX01BU0sgPyBUSU9DTV9DRCAgOiAwKSB8CgkJcHJpdi0+bGFzdF9kdHJfcnRzOwp9CgpzdGF0aWMgaW50IGZ0ZGlfdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCnsKCWRiZygiJXMgVElPQ01TRVQiLCBfX0ZVTkNUSU9OX18pOwoJcmV0dXJuIHVwZGF0ZV9tY3RybChwb3J0LCBzZXQsIGNsZWFyKTsKfQoKCnN0YXRpYyBpbnQgZnRkaV9pb2N0bCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCglkYmcoIiVzIGNtZCAweCUwNHgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CgoJLyogQmFzZWQgb24gY29kZSBmcm9tIGFjbS5jIGFuZCBvdGhlcnMgKi8KCXN3aXRjaCAoY21kKSB7CgoJY2FzZSBUSU9DR1NFUklBTDogLyogZ2V0cyBzZXJpYWwgcG9ydCBkYXRhICovCgkJcmV0dXJuIGdldF9zZXJpYWxfaW5mbyhwb3J0LCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopIGFyZyk7CgoJY2FzZSBUSU9DU1NFUklBTDogLyogc2V0cyBzZXJpYWwgcG9ydCBkYXRhICovCgkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhwb3J0LCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopIGFyZyk7CgoJLyoKCSAqIFdhaXQgZm9yIGFueSBvZiB0aGUgNCBtb2RlbSBpbnB1dHMgKERDRCxSSSxEU1IsQ1RTKSB0byBjaGFuZ2UKCSAqIC0gbWFzayBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdAoJICogICAodXNlIHwnZWQgVElPQ01fUk5HL0RTUi9DRC9DVFMgZm9yIG1hc2tpbmcpCgkgKiBDYWxsZXIgc2hvdWxkIHVzZSBUSU9DR0lDT1VOVCB0byBzZWUgd2hpY2ggb25lIGl0IHdhcy4KCSAqCgkgKiBUaGlzIGNvZGUgaXMgYm9ycm93ZWQgZnJvbSBsaW51eC9kcml2ZXJzL2NoYXIvc2VyaWFsLmMKCSAqLwoJY2FzZSBUSU9DTUlXQUlUOgoJCXdoaWxlIChwcml2ICE9IE5VTEwpIHsKCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwoJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCgkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CgkJCWVsc2UgewoJCQkJY2hhciBkaWZmID0gcHJpdi0+ZGlmZl9zdGF0dXM7CgoJCQkJaWYgKGRpZmYgPT0gMCkgewoJCQkJCXJldHVybiAtRUlPOyAvKiBubyBjaGFuZ2UgPT4gZXJyb3IgKi8KCQkJCX0KCgkJCQkvKiBDb25zdW1lIGFsbCBldmVudHMgKi8KCQkJCXByaXYtPmRpZmZfc3RhdHVzID0gMDsKCgkJCQkvKiBSZXR1cm4gMCBpZiBjYWxsZXIgd2FudGVkIHRvIGtub3cgYWJvdXQgdGhlc2UgYml0cyAqLwoJCQkJaWYgKCAoKGFyZyAmIFRJT0NNX1JORykgJiYgKGRpZmYgJiBGVERJX1JTMF9SSSkpIHx8CgkJCQkgICAgICgoYXJnICYgVElPQ01fRFNSKSAmJiAoZGlmZiAmIEZURElfUlMwX0RTUikpIHx8CgkJCQkgICAgICgoYXJnICYgVElPQ01fQ0QpICAmJiAoZGlmZiAmIEZURElfUlMwX1JMU0QpKSB8fAoJCQkJICAgICAoKGFyZyAmIFRJT0NNX0NUUykgJiYgKGRpZmYgJiBGVERJX1JTMF9DVFMpKSApIHsKCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJCS8qCgkJCQkgKiBPdGhlcndpc2UgY2FsbGVyIGNhbid0IGNhcmUgbGVzcyBhYm91dCB3aGF0IGhhcHBlbmVkLAoJCQkJICogYW5kIHNvIHdlIGNvbnRpbnVlIHRvIHdhaXQgZm9yIG1vcmUgZXZlbnRzLgoJCQkJICovCgkJCX0KCQl9CgkJcmV0dXJuKDApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCgl9CgoKCS8qIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yIC0gdHVybnMgb3V0IHRoZSBoaWdoZXIgbGF5ZXJzIHdpbGwgZG8KCSAqICBzb21lIGlvY3RscyBpdHNlbGYgKHNlZSBjb21tZW50IGFib3ZlKQoJICovCglkYmcoIiVzIGFyZyBub3Qgc3VwcG9ydGVkIC0gaXQgd2FzIDB4JTA0eCAtIGNoZWNrIC91c3IvaW5jbHVkZS9hc20vaW9jdGxzLmgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CgoJcmV0dXJuKC1FTk9JT0NUTENNRCk7Cn0gLyogZnRkaV9pb2N0bCAqLwoKCnN0YXRpYyB2b2lkIGZ0ZGlfdGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Cglwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Cn0KCgpzdGF0aWMgdm9pZCBmdGRpX3VudGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglpbnQgYWN0dWFsbHlfdGhyb3R0bGVkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoJYWN0dWFsbHlfdGhyb3R0bGVkID0gcHJpdi0+cnhfZmxhZ3MgJiBBQ1RVQUxMWV9USFJPVFRMRUQ7Cglwcml2LT5yeF9mbGFncyAmPSB+KFRIUk9UVExFRCB8IEFDVFVBTExZX1RIUk9UVExFRCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgoJaWYgKGFjdHVhbGx5X3Rocm90dGxlZCkKCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPnJ4X3dvcmssIDApOwp9CgpzdGF0aWMgaW50IF9faW5pdCBmdGRpX2luaXQgKHZvaWQpCnsKCWludCByZXR2YWw7CgoJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CglpZiAodmVuZG9yID4gMCAmJiBwcm9kdWN0ID4gMCkgewoJCS8qIEFkZCB1c2VyIHNwZWNpZmllZCBWSUQvUElEIHRvIHJlc2VydmVkIGVsZW1lbnQgb2YgdGFibGUuICovCgkJaW50IGk7CgkJZm9yIChpID0gMDsgaWRfdGFibGVfY29tYmluZWRbaV0uaWRWZW5kb3I7IGkrKykKCQkJOwoJCWlkX3RhYmxlX2NvbWJpbmVkW2ldLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0U7CgkJaWRfdGFibGVfY29tYmluZWRbaV0uaWRWZW5kb3IgPSB2ZW5kb3I7CgkJaWRfdGFibGVfY29tYmluZWRbaV0uaWRQcm9kdWN0ID0gcHJvZHVjdDsKCX0KCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfc2lvX2RldmljZSk7CglpZiAocmV0dmFsKQoJCWdvdG8gZmFpbGVkX3Npb19yZWdpc3RlcjsKCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmZnRkaV9kcml2ZXIpOwoJaWYgKHJldHZhbCkKCQlnb3RvIGZhaWxlZF91c2JfcmVnaXN0ZXI7CgoJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOwoJcmV0dXJuIDA7CmZhaWxlZF91c2JfcmVnaXN0ZXI6Cgl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfc2lvX2RldmljZSk7CmZhaWxlZF9zaW9fcmVnaXN0ZXI6CglyZXR1cm4gcmV0dmFsOwp9CgoKc3RhdGljIHZvaWQgX19leGl0IGZ0ZGlfZXhpdCAodm9pZCkKewoKCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwoKCXVzYl9kZXJlZ2lzdGVyICgmZnRkaV9kcml2ZXIpOwoJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9zaW9fZGV2aWNlKTsKCn0KCgptb2R1bGVfaW5pdChmdGRpX2luaXQpOwptb2R1bGVfZXhpdChmdGRpX2V4aXQpOwoKTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOwpNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKbW9kdWxlX3BhcmFtKHZlbmRvciwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh2ZW5kb3IsICJVc2VyIHNwZWNpZmllZCB2ZW5kb3IgSUQgKGRlZmF1bHQ9IgoJCV9fTU9EVUxFX1NUUklORyhGVERJX1ZJRCkiKSIpOwptb2R1bGVfcGFyYW0ocHJvZHVjdCwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh2ZW5kb3IsICJVc2VyIHNwZWNpZmllZCBwcm9kdWN0IElEIik7Cgo=