This is a multi-part message in MIME format. --------------67BDF2B7F2453AAB6129FCFC Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Guido van Rossum wrote: > > [Skip Montanaro] > > > I just noticed in the development docs that when a timeout on a socket > > > occurs, socket.error is raised. I rather liked the idea that a different > > > exception was raised for timeouts (I used Tim O'Malley's timeout_socket > > > module). Making a TimeoutError exception a subclass of socket.error would > > > be fine so you can catch it with existing code, but I could see recovering > > > differently for a timeout as opposed to other possible errors: > > > > > > sock.settimeout(5.0) > > > try: > > > data = sock.recv(8192) > > > except socket.TimeoutError: > > > # maybe requeue the request > > > ... > > > except socket.error, codes: > > > # some more drastic solution is needed > > > ... > > > > > [Bernard Yue] > > +1 on your suggestion. Anyway, under windows, the current > > implementation returns incorrect socket.error code for timeout. I am > > working on the test suite as well as a fix for problem found. Once the > > code is bug free maybe we can put the TimeoutError in. > > > > I will leave it to Guido for the approval of the change. When he comes > > back from his holiday. > > The way I restructured the code it is impossible to distinguish a > timeout error from other errors; you simply get the "no data > available" error from the socket operation. This is the same error > you'd get in non-blocking mode. > To distinguish a timeout error, the caller can check s->sock_timeout when a non-blocking mode error occured, or just return an error code from internal_select() (I guess you must have your reason to taken it out in the first place) > Before I recomplicate the code so that it can raise a separate error > when the select fails, I'd like to understand the use case better. > Why would you want to make this distinction? Requeueing the request > (as in Skip's example) doesn't make sense IMO: you set the timeout for > a reason, and that reason is that you want to give up if it takes too > long. If you really intend to retry you're better of disabling the > timeout! > How about the following (assume we have socket.setDefaultTimeout()): import socket import urllib socket.setDefaultTimeout(5.0) retry = 0 url = 'some url' while retry < 3: try: file = urllib.urlretrieve(url) except socket.TimeoutError: if retry == 2: print "Server too busy, given up!" raise else: print "Server busy, retry!" retry += 1 else: break MS IIS behave strangely to http request. When the server is very busy, it will randomly drop some requests without disconnecting the client. So the best approach for the client is to timeout and retry. I guess that might be the reason why people needed timeoutsocket in the first place. > If you really want to, you can already distinguish the timeout case, > because you get an EAGAIN error then (maybe something else on Windows > -- Bernard, if you have a fix for that, please send it to me). > I am struggling with the test case for the new socket code. The timeout test case I've send you works with the old socketmodule.c (attached), but not with the lastest version (on linux or windows). It's strange, your new implementation looks much cleaner. Please bear with me a bit longer for a patch :.( > So a -0 unless more evidence is brought forward. > > --Guido van Rossum (home page: http://www.python.org/~guido/) Bernie --------------67BDF2B7F2453AAB6129FCFC Content-Type: application/vnd.lotus-organizer; name="socketmodule.c.org" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="socketmodule.c.org" LyogU29ja2V0IG1vZHVsZSAqLwoKLyoKClRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGludGVy ZmFjZSB0byBCZXJrZWxleSBzb2NrZXQgSVBDLgoKTGltaXRhdGlvbnM6CgotIE9ubHkgQUZf SU5FVCwgQUZfSU5FVDYgYW5kIEFGX1VOSVggYWRkcmVzcyBmYW1pbGllcyBhcmUgc3VwcG9y dGVkIGluIGEKICBwb3J0YWJsZSBtYW5uZXIsIHRob3VnaCBBRl9QQUNLRVQgaXMgc3VwcG9y dGVkIHVuZGVyIExpbnV4LgotIE5vIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyAodXNlIHNlbmRh bGwvcmVjdiBvciBtYWtlZmlsZSBpbnN0ZWFkKS4KLSBBZGRpdGlvbmFsIHJlc3RyaWN0aW9u cyBhcHBseSBvbiBzb21lIG5vbi1Vbml4IHBsYXRmb3JtcyAoY29tcGVuc2F0ZWQKICBmb3Ig Ynkgc29ja2V0LnB5KS4KCk1vZHVsZSBpbnRlcmZhY2U6CgotIHNvY2tldC5lcnJvcjogZXhj ZXB0aW9uIHJhaXNlZCBmb3Igc29ja2V0IHNwZWNpZmljIGVycm9ycwotIHNvY2tldC5nYWll cnJvcjogZXhjZXB0aW9uIHJhaXNlZCBmb3IgZ2V0YWRkcmluZm8vZ2V0bmFtZWluZm8gZXJy b3JzLAoJYSBzdWJjbGFzcyBvZiBzb2NrZXQuZXJyb3IKLSBzb2NrZXQuaGVycm9yOiBleGNl cHRpb24gcmFpc2VkIGZvciBnZXRob3N0YnkqIGVycm9ycywKCWEgc3ViY2xhc3Mgb2Ygc29j a2V0LmVycm9yCi0gc29ja2V0LmdldGhvc3RieW5hbWUoaG9zdG5hbWUpIC0tPiBob3N0IElQ IGFkZHJlc3MgKHN0cmluZzogJ2RkLmRkLmRkLmRkJykKLSBzb2NrZXQuZ2V0aG9zdGJ5YWRk cihJUCBhZGRyZXNzKSAtLT4gKGhvc3RuYW1lLCBbYWxpYXMsIC4uLl0sIFtJUCBhZGRyLCAu Li5dKQotIHNvY2tldC5nZXRob3N0bmFtZSgpIC0tPiBob3N0IG5hbWUgKHN0cmluZzogJ3Nw YW0nIG9yICdzcGFtLmRvbWFpbi5jb20nKQotIHNvY2tldC5nZXRwcm90b2J5bmFtZShwcm90 b2NvbG5hbWUpIC0tPiBwcm90b2NvbCBudW1iZXIKLSBzb2NrZXQuZ2V0c2VydmJ5bmFtZShz ZXJ2aWNlbmFtZSwgcHJvdG9jb2xuYW1lKSAtLT4gcG9ydCBudW1iZXIKLSBzb2NrZXQuc29j a2V0KGZhbWlseSwgdHlwZSBbLCBwcm90b10pIC0tPiBuZXcgc29ja2V0IG9iamVjdAotIHNv Y2tldC5udG9ocygxNiBiaXQgdmFsdWUpIC0tPiBuZXcgaW50IG9iamVjdAotIHNvY2tldC5u dG9obCgzMiBiaXQgdmFsdWUpIC0tPiBuZXcgaW50IG9iamVjdAotIHNvY2tldC5odG9ucygx NiBiaXQgdmFsdWUpIC0tPiBuZXcgaW50IG9iamVjdAotIHNvY2tldC5odG9ubCgzMiBiaXQg dmFsdWUpIC0tPiBuZXcgaW50IG9iamVjdAotIHNvY2tldC5nZXRhZGRyaW5mbyhob3N0LCBw b3J0IFssIGZhbWlseSwgc29ja3R5cGUsIHByb3RvLCBmbGFnc10pCgktLT4gTGlzdCBvZiAo ZmFtaWx5LCBzb2NrdHlwZSwgcHJvdG8sIGNhbm9ubmFtZSwgc29ja2FkZHIpCi0gc29ja2V0 LmdldG5hbWVpbmZvKHNvY2thZGRyLCBmbGFncykgLS0+IChob3N0LCBwb3J0KQotIHNvY2tl dC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0sIGV0Yy46IGNvbnN0YW50cyBmcm9tIDxz b2NrZXQuaD4KLSBzb2NrZXQuaW5ldF9hdG9uKElQIGFkZHJlc3MpIC0+IDMyLWJpdCBwYWNr ZWQgSVAgcmVwcmVzZW50YXRpb24KLSBzb2NrZXQuaW5ldF9udG9hKHBhY2tlZCBJUCkgLT4g SVAgYWRkcmVzcyBzdHJpbmcKLSBhbiBJbnRlcm5ldCBzb2NrZXQgYWRkcmVzcyBpcyBhIHBh aXIgKGhvc3RuYW1lLCBwb3J0KQogIHdoZXJlIGhvc3RuYW1lIGNhbiBiZSBhbnl0aGluZyBy ZWNvZ25pemVkIGJ5IGdldGhvc3RieW5hbWUoKQogIChpbmNsdWRpbmcgdGhlIGRkLmRkLmRk LmRkIG5vdGF0aW9uKSBhbmQgcG9ydCBpcyBpbiBob3N0IGJ5dGUgb3JkZXIKLSB3aGVyZSBh IGhvc3RuYW1lIGlzIHJldHVybmVkLCB0aGUgZGQuZGQuZGQuZGQgbm90YXRpb24gaXMgdXNl ZAotIGEgVU5JWCBkb21haW4gc29ja2V0IGFkZHJlc3MgaXMgYSBzdHJpbmcgc3BlY2lmeWlu ZyB0aGUgcGF0aG5hbWUKLSBhbiBBRl9QQUNLRVQgc29ja2V0IGFkZHJlc3MgaXMgYSB0dXBs ZSBjb250YWluaW5nIGEgc3RyaW5nCiAgc3BlY2lmeWluZyB0aGUgZXRoZXJuZXQgaW50ZXJm YWNlIGFuZCBhbiBpbnRlZ2VyIHNwZWNpZnlpbmcKICB0aGUgRXRoZXJuZXQgcHJvdG9jb2wg bnVtYmVyIHRvIGJlIHJlY2VpdmVkLiBGb3IgZXhhbXBsZToKICAoImV0aDAiLDB4MTIzNCku ICBPcHRpb25hbCAzcmQsNHRoLDV0aCBlbGVtZW50cyBpbiB0aGUgdHVwbGUKICBzcGVjaWZ5 IHBhY2tldC10eXBlIGFuZCBoYS10eXBlL2FkZHIgLS0gdGhlc2UgYXJlIGlnbm9yZWQgYnkK ICBuZXR3b3JraW5nIGNvZGUsIGJ1dCBhY2NlcHRlZCBzaW5jZSB0aGV5IGFyZSByZXR1cm5l ZCBieSB0aGUKICBnZXRzb2NrbmFtZSgpIG1ldGhvZC4KCkxvY2FsIG5hbWluZyBjb252ZW50 aW9uczoKCi0gbmFtZXMgc3RhcnRpbmcgd2l0aCBzb2NrXyBhcmUgc29ja2V0IG9iamVjdCBt ZXRob2RzCi0gbmFtZXMgc3RhcnRpbmcgd2l0aCBzb2NrZXRfIGFyZSBtb2R1bGUtbGV2ZWwg ZnVuY3Rpb25zCi0gbmFtZXMgc3RhcnRpbmcgd2l0aCBQeVNvY2tldCBhcmUgZXhwb3J0ZWQg dGhyb3VnaCBzb2NrZXRtb2R1bGUuaAoKKi8KCi8qIFNvY2tldCBvYmplY3QgZG9jdW1lbnRh dGlvbiAqLwpzdGF0aWMgY2hhciBzb2NrX2RvY1tdID0KInNvY2tldChbZmFtaWx5WywgdHlw ZVssIHByb3RvXV1dKSAtPiBzb2NrZXQgb2JqZWN0XG5cClxuXApPcGVuIGEgc29ja2V0IG9m IHRoZSBnaXZlbiB0eXBlLiAgVGhlIGZhbWlseSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlXG5c CmFkZHJlc3MgZmFtaWx5OyBpdCBkZWZhdWx0cyB0byBBRl9JTkVULiAgVGhlIHR5cGUgYXJn dW1lbnQgc3BlY2lmaWVzXG5cCndoZXRoZXIgdGhpcyBpcyBhIHN0cmVhbSAoU09DS19TVFJF QU0sIHRoaXMgaXMgdGhlIGRlZmF1bHQpXG5cCm9yIGRhdGFncmFtIChTT0NLX0RHUkFNKSBz b2NrZXQuICBUaGUgcHJvdG9jb2wgYXJndW1lbnQgZGVmYXVsdHMgdG8gMCxcblwKc3BlY2lm eWluZyB0aGUgZGVmYXVsdCBwcm90b2NvbC4gIEtleXdvcmQgYXJndW1lbnRzIGFyZSBhY2Nl cHRlZC5cblwKXG5cCkEgc29ja2V0IG9iamVjdCByZXByZXNlbnRzIG9uZSBlbmRwb2ludCBv ZiBhIG5ldHdvcmsgY29ubmVjdGlvbi5cblwKXG5cCk1ldGhvZHMgb2Ygc29ja2V0IG9iamVj dHMgKGtleXdvcmQgYXJndW1lbnRzIG5vdCBhbGxvd2VkKTpcblwKXG5cCmFjY2VwdCgpIC0t IGFjY2VwdCBhIGNvbm5lY3Rpb24sIHJldHVybmluZyBuZXcgc29ja2V0IGFuZCBjbGllbnQg YWRkcmVzc1xuXApiaW5kKGFkZHIpIC0tIGJpbmQgdGhlIHNvY2tldCB0byBhIGxvY2FsIGFk ZHJlc3NcblwKY2xvc2UoKSAtLSBjbG9zZSB0aGUgc29ja2V0XG5cCmNvbm5lY3QoYWRkcikg LS0gY29ubmVjdCB0aGUgc29ja2V0IHRvIGEgcmVtb3RlIGFkZHJlc3NcblwKY29ubmVjdF9l eChhZGRyKSAtLSBjb25uZWN0LCByZXR1cm4gYW4gZXJyb3IgY29kZSBpbnN0ZWFkIG9mIGFu IGV4Y2VwdGlvblxuXApkdXAoKSAtLSByZXR1cm4gYSBuZXcgc29ja2V0IG9iamVjdCBpZGVu dGljYWwgdG8gdGhlIGN1cnJlbnQgb25lIFsqXVxuXApmaWxlbm8oKSAtLSByZXR1cm4gdW5k ZXJseWluZyBmaWxlIGRlc2NyaXB0b3JcblwKZ2V0cGVlcm5hbWUoKSAtLSByZXR1cm4gcmVt b3RlIGFkZHJlc3MgWypdXG5cCmdldHNvY2tuYW1lKCkgLS0gcmV0dXJuIGxvY2FsIGFkZHJl c3NcblwKZ2V0c29ja29wdChsZXZlbCwgb3B0bmFtZVssIGJ1Zmxlbl0pIC0tIGdldCBzb2Nr ZXQgb3B0aW9uc1xuXApnZXR0aW1lb3V0KCkgLS0gcmV0dXJuIHRpbWVvdXQgb3IgTm9uZVxu XApsaXN0ZW4obikgLS0gc3RhcnQgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9u c1xuXAptYWtlZmlsZShbbW9kZSwgW2J1ZnNpemVdXSkgLS0gcmV0dXJuIGEgZmlsZSBvYmpl Y3QgZm9yIHRoZSBzb2NrZXQgWypdXG5cCnJlY3YoYnVmbGVuWywgZmxhZ3NdKSAtLSByZWNl aXZlIGRhdGFcblwKcmVjdmZyb20oYnVmbGVuWywgZmxhZ3NdKSAtLSByZWNlaXZlIGRhdGEg YW5kIHNlbmRlcidzIGFkZHJlc3NcblwKc2VuZGFsbChkYXRhWywgZmxhZ3NdKSAtLSBzZW5k IGFsbCBkYXRhXG5cCnNlbmQoZGF0YVssIGZsYWdzXSkgLS0gc2VuZCBkYXRhLCBtYXkgbm90 IHNlbmQgYWxsIG9mIGl0XG5cCnNlbmR0byhkYXRhWywgZmxhZ3NdLCBhZGRyKSAtLSBzZW5k IGRhdGEgdG8gYSBnaXZlbiBhZGRyZXNzXG5cCnNldGJsb2NraW5nKDAgfCAxKSAtLSBzZXQg b3IgY2xlYXIgdGhlIGJsb2NraW5nIEkvTyBmbGFnXG5cCnNldHNvY2tvcHQobGV2ZWwsIG9w dG5hbWUsIHZhbHVlKSAtLSBzZXQgc29ja2V0IG9wdGlvbnNcblwKc2V0dGltZW91dChOb25l IHwgZmxvYXQpIC0tIHNldCBvciBjbGVhciB0aGUgdGltZW91dFxuXApzaHV0ZG93bihob3cp IC0tIHNodXQgZG93biB0cmFmZmljIGluIG9uZSBvciBib3RoIGRpcmVjdGlvbnNcblwKXG5c CiBbKl0gbm90IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zISI7CgojaW5jbHVkZSAiUHl0 aG9uLmgiCgovKiBYWFggVGhpcyBpcyBhIHRlcnJpYmxlIG1lc3Mgb2Ygb2YgcGxhdGZvcm0t ZGVwZW5kZW50IHByZXByb2Nlc3NvciBoYWNrcy4KICAgSSBob3BlIHNvbWUgZGF5IHNvbWVv bmUgY2FuIGNsZWFuIHRoaXMgdXAgcGxlYXNlLi4uICovCgovKiBIYWNrcyBmb3IgZ2V0aG9z dGJ5bmFtZV9yKCkuICBPbiBzb21lIG5vbi1MaW51eCBwbGF0Zm9ybXMsIHRoZSBjb25maWd1 cmUKICAgc2NyaXB0IGRvZXNuJ3QgZ2V0IHRoaXMgcmlnaHQsIHNvIHdlIGhhcmRjb2RlIHNv bWUgcGxhdGZvcm0gY2hlY2tzIGJlbG93LgogICBPbiB0aGUgb3RoZXIgaGFuZCwgbm90IGFs bCBMaW51eCB2ZXJzaW9ucyBhZ3JlZSwgc28gdGhlcmUgdGhlIHNldHRpbmdzCiAgIGNvbXB1 dGVkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IGFyZSBuZWVkZWQhICovCgojaWZuZGVmIGxp bnV4CiMgdW5kZWYgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcKIyB1bmRlZiBIQVZFX0dF VEhPU1RCWU5BTUVfUl81X0FSRwojIHVuZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJH CiNlbmRpZgoKI2lmbmRlZiBXSVRIX1RIUkVBRAojIHVuZGVmIEhBVkVfR0VUSE9TVEJZTkFN RV9SCiNlbmRpZgoKI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SCiMgaWYgZGVmaW5lZChf QUlYKSB8fCBkZWZpbmVkKF9fb3NmX18pCiMgIGRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVf Ul8zX0FSRwojIGVsaWYgZGVmaW5lZChfX3N1bikgfHwgZGVmaW5lZChfX3NnaSkKIyAgZGVm aW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHCiMgZWxpZiBkZWZpbmVkKGxpbnV4KQov KiBSZWx5IG9uIHRoZSBjb25maWd1cmUgc2NyaXB0ICovCiMgZWxzZQojICB1bmRlZiBIQVZF X0dFVEhPU1RCWU5BTUVfUgojIGVuZGlmCiNlbmRpZgoKI2lmICFkZWZpbmVkKEhBVkVfR0VU SE9TVEJZTkFNRV9SKSAmJiBkZWZpbmVkKFdJVEhfVEhSRUFEKSAmJiBcCiAgICAhZGVmaW5l ZChNU19XSU5ET1dTKQojIGRlZmluZSBVU0VfR0VUSE9TVEJZTkFNRV9MT0NLCiNlbmRpZgoK I2lmZGVmIFVTRV9HRVRIT1NUQllOQU1FX0xPQ0sKIyBpbmNsdWRlICJweXRocmVhZC5oIgoj ZW5kaWYKCiNpZiBkZWZpbmVkKFBZQ0NfVkFDUFApCiMgaW5jbHVkZSA8dHlwZXMuaD4KIyBp bmNsdWRlIDxpby5oPgojIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgojIGluY2x1ZGUgPHV0aWxz Lmg+CiMgaW5jbHVkZSA8Y3R5cGUuaD4KI2VuZGlmCgojaWYgZGVmaW5lZChQWU9TX09TMikK IyBkZWZpbmUgIElOQ0xfRE9TCiMgZGVmaW5lICBJTkNMX0RPU0VSUk9SUwojIGRlZmluZSAg SU5DTF9OT1BNQVBJCiMgaW5jbHVkZSA8b3MyLmg+CiNlbmRpZgoKLyogR2VuZXJpYyBpbmNs dWRlcyAqLwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KCi8q IEdlbmVyaWMgc29ja2V0IG9iamVjdCBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZXMgKi8KI2Rl ZmluZSBQeVNvY2tldF9CVUlMRElOR19TT0NLRVQKI2luY2x1ZGUgInNvY2tldG1vZHVsZS5o IgoKLyogQWRkcmVzc2luZyBpbmNsdWRlcyAqLwoKI2lmbmRlZiBNU19XSU5ET1dTCgovKiBO b24tTVMgV0lORE9XUyBpbmNsdWRlcyAqLwojIGluY2x1ZGUgPG5ldGRiLmg+CgovKiBIZWFk ZXJzIG5lZWRlZCBmb3IgaW5ldF9udG9hKCkgYW5kIGluZXRfYWRkcigpICovCiMgaWZkZWYg X19CRU9TX18KIyAgaW5jbHVkZSA8bmV0L25ldGRiLmg+CiMgZWxpZiBkZWZpbmVkKFBZT1Nf T1MyKSAmJiBkZWZpbmVkKFBZQ0NfVkFDUFApCiMgIGluY2x1ZGUgPG5ldGRiLmg+CnR5cGVk ZWYgc2l6ZV90IHNvY2tsZW5fdDsKIyBlbHNlCiMgICBpbmNsdWRlIDxhcnBhL2luZXQuaD4K IyBlbmRpZgoKIyBpZm5kZWYgUklTQ09TCiMgIGluY2x1ZGUgPGZjbnRsLmg+CiMgZWxzZQoj ICBpbmNsdWRlIDxzeXMvZmNudGwuaD4KIyAgZGVmaW5lIE5PX0RVUAppbnQgaF9lcnJubzsg Lyogbm90IHVzZWQgKi8KIyBlbmRpZgoKI2Vsc2UKCi8qIE1TX1dJTkRPV1MgaW5jbHVkZXMg Ki8KIyBpbmNsdWRlIDxmY250bC5oPgoKI2VuZGlmCgojaWZkZWYgSEFWRV9TVERERUZfSAoj IGluY2x1ZGUgPHN0ZGRlZi5oPgojZW5kaWYKCiNpZm5kZWYgb2Zmc2V0b2YKIyBkZWZpbmUg b2Zmc2V0b2YodHlwZSwgbWVtYmVyKQkoKHNpemVfdCkoJigodHlwZSAqKTApLT5tZW1iZXIp KQojZW5kaWYKCiNpZm5kZWYgT19OREVMQVkKIyBkZWZpbmUgT19OREVMQVkgT19OT05CTE9D SwkvKiBGb3IgUU5YIG9ubHk/ICovCiNlbmRpZgoKI2luY2x1ZGUgImFkZHJpbmZvLmgiCgoj aWZuZGVmIEhBVkVfSU5FVF9QVE9OCmludCBpbmV0X3B0b24oaW50IGFmLCBjb25zdCBjaGFy ICpzcmMsIHZvaWQgKmRzdCk7CmNvbnN0IGNoYXIgKmluZXRfbnRvcChpbnQgYWYsIGNvbnN0 IHZvaWQgKnNyYywgY2hhciAqZHN0LCBzb2NrbGVuX3Qgc2l6ZSk7CiNlbmRpZgoKI2lmZGVm IF9fQVBQTEVfXwovKiBPbiBPUyBYLCBnZXRhZGRyaW5mbyByZXR1cm5zIG5vIGVycm9yIGlu ZGljYXRpb24gb2YgbG9va3VwCiAgIGZhaWx1cmUsIHNvIHdlIG11c3QgdXNlIHRoZSBlbXVs YXRpb24gaW5zdGVhZCBvZiB0aGUgbGliaW5mbwogICBpbXBsZW1lbnRhdGlvbi4gVW5mb3J0 dW5hdGVseSwgcGVyZm9ybWluZyBhbiBhdXRvY29uZiB0ZXN0CiAgIGZvciB0aGlzIGJ1ZyB3 b3VsZCByZXF1aXJlIEROUyBhY2Nlc3MgZm9yIHRoZSBtYWNoaW5lIHBlcmZvcm1pbmcKICAg dGhlIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGlzIG5vdCBhY2NlcHRhYmxlLiBUaGVyZWZvcmUs IHdlCiAgIGRldGVybWluZSB0aGUgYnVnIGp1c3QgYnkgY2hlY2tpbmcgZm9yIF9fQVBQTEVf Xy4gSWYgdGhpcyBidWcKICAgZ2V0cyBldmVyIGZpeGVkLCBwZXJoYXBzIGNoZWNraW5nIGZv ciBzeXMvdmVyc2lvbi5oIHdvdWxkIGJlCiAgIGFwcHJvcHJpYXRlLCB3aGljaCBpcyAxMC8w IG9uIHRoZSBzeXN0ZW0gd2l0aCB0aGUgYnVnLiAqLwojdW5kZWYgSEFWRV9HRVRBRERSSU5G TwovKiBhdm9pZCBjbGFzaGVzIHdpdGggdGhlIEMgbGlicmFyeSBkZWZpbml0aW9uIG9mIHRo ZSBzeW1ib2wuICovCiNkZWZpbmUgZ2V0YWRkcmluZm8gZmFrZV9nZXRhZGRyaW5mbwojZW5k aWYKCi8qIEkga25vdyB0aGlzIGlzIGEgYmFkIHByYWN0aWNlLCBidXQgaXQgaXMgdGhlIGVh c2llc3QuLi4gKi8KI2lmICFkZWZpbmVkKEhBVkVfR0VUQUREUklORk8pCiNpbmNsdWRlICJn ZXRhZGRyaW5mby5jIgojZW5kaWYKI2lmICFkZWZpbmVkKEhBVkVfR0VUTkFNRUlORk8pCiNp bmNsdWRlICJnZXRuYW1laW5mby5jIgojZW5kaWYKCiNpZiBkZWZpbmVkKE1TX1dJTkRPV1Mp IHx8IGRlZmluZWQoX19CRU9TX18pCi8qIEJlT1Mgc3VmZmVycyBmcm9tIHRoZSBzYW1lIHNv Y2tldCBkaWNob3RvbXkgYXMgV2luMzIuLi4gLSBbY2poXSAqLwovKiBzZWVtIHRvIGJlIGEg ZmV3IGRpZmZlcmVuY2VzIGluIHRoZSBBUEkgKi8KI2RlZmluZSBTT0NLRVRDTE9TRSBjbG9z ZXNvY2tldAojZGVmaW5lIE5PX0RVUCAvKiBBY3R1YWxseSBpdCBleGlzdHMgb24gTlQgMy41 LCBidXQgd2hhdCB0aGUgaGVjay4uLiAqLwojZW5kaWYKCiNpZmRlZiBNU19XSU4zMgojZGVm aW5lIEVBRk5PU1VQUE9SVCBXU0FFQUZOT1NVUFBPUlQKI2RlZmluZSBzbnByaW50ZiBfc25w cmludGYKI2VuZGlmCgojaWYgZGVmaW5lZChQWU9TX09TMikgJiYgIWRlZmluZWQoUFlDQ19H Q0MpCiNkZWZpbmUgU09DS0VUQ0xPU0Ugc29jbG9zZQojZGVmaW5lIE5PX0RVUCAvKiBTb2Nr ZXRzIGFyZSBOb3QgQWN0dWFsIEZpbGUgSGFuZGxlcyB1bmRlciBPUy8yICovCiNlbmRpZgoK I2lmbmRlZiBTT0NLRVRDTE9TRQojZGVmaW5lIFNPQ0tFVENMT1NFIGNsb3NlCiNlbmRpZgoK LyogWFhYIFRoZXJlJ3MgYSBwcm9ibGVtIGhlcmU6ICpzdGF0aWMqIGZ1bmN0aW9ucyBhcmUg bm90IHN1cHBvc2VkIHRvIGhhdmUKICAgYSBQeSBwcmVmaXggKG9yIHVzZSBDYXBpdGFsaXpl ZFdvcmRzKS4gIExhdGVyLi4uICovCgovKiBHbG9iYWwgdmFyaWFibGUgaG9sZGluZyB0aGUg ZXhjZXB0aW9uIHR5cGUgZm9yIGVycm9ycyBkZXRlY3RlZAogICBieSB0aGlzIG1vZHVsZSAo YnV0IG5vdCBhcmd1bWVudCB0eXBlIG9yIG1lbW9yeSBlcnJvcnMsIGV0Yy4pLiAqLwpzdGF0 aWMgUHlPYmplY3QgKnNvY2tldF9lcnJvcjsKc3RhdGljIFB5T2JqZWN0ICpzb2NrZXRfaGVy cm9yOwpzdGF0aWMgUHlPYmplY3QgKnNvY2tldF9nYWllcnJvcjsKCiNpZmRlZiBSSVNDT1MK LyogR2xvYmFsIHZhcmlhYmxlIHdoaWNoIGlzICE9MCBpZiBQeXRob24gaXMgcnVubmluZyBp biBhIFJJU0MgT1MgdGFza3dpbmRvdyAqLwpzdGF0aWMgaW50IHRhc2t3aW5kb3c7CiNlbmRp ZgoKLyogQSBmb3J3YXJkIHJlZmVyZW5jZSB0byB0aGUgc29ja2V0IHR5cGUgb2JqZWN0Lgog ICBUaGUgc29ja190eXBlIHZhcmlhYmxlIGNvbnRhaW5zIHBvaW50ZXJzIHRvIHZhcmlvdXMg ZnVuY3Rpb25zLAogICBzb21lIG9mIHdoaWNoIGNhbGwgbmV3X3NvY2tvYmplY3QoKSwgd2hp Y2ggdXNlcyBzb2NrX3R5cGUsIHNvCiAgIHRoZXJlIGhhcyB0byBiZSBhIGNpcmN1bGFyIHJl ZmVyZW5jZS4gKi8Kc3RhdGljZm9yd2FyZCBQeVR5cGVPYmplY3Qgc29ja190eXBlOwoKLyog Q29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcmFpc2UgYW4gZXJyb3IgYWNjb3JkaW5nIHRvIGVy cm5vCiAgIGFuZCByZXR1cm4gYSBOVUxMIHBvaW50ZXIgZnJvbSBhIGZ1bmN0aW9uLiAqLwoK c3RhdGljIFB5T2JqZWN0ICoKc2V0X2Vycm9yKHZvaWQpCnsKI2lmZGVmIE1TX1dJTkRPV1MK CWludCBlcnJfbm8gPSBXU0FHZXRMYXN0RXJyb3IoKTsKCXN0YXRpYyBzdHJ1Y3QgewoJCWlu dCBubzsKCQljb25zdCBjaGFyICptc2c7Cgl9ICptc2dwLCBtc2dzW10gPSB7CgkJe1dTQUVJ TlRSLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwifSwKCQl7V1NBRUJBREYsICJCYWQgZmls ZSBkZXNjcmlwdG9yIn0sCgkJe1dTQUVBQ0NFUywgIlBlcm1pc3Npb24gZGVuaWVkIn0sCgkJ e1dTQUVGQVVMVCwgIkJhZCBhZGRyZXNzIn0sCgkJe1dTQUVJTlZBTCwgIkludmFsaWQgYXJn dW1lbnQifSwKCQl7V1NBRU1GSUxFLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyJ9LAoJCXtXU0FF V09VTERCTE9DSywKCQkgICJUaGUgc29ja2V0IG9wZXJhdGlvbiBjb3VsZCBub3QgY29tcGxl dGUgIgoJCSAgIndpdGhvdXQgYmxvY2tpbmcifSwKCQl7V1NBRUlOUFJPR1JFU1MsICJPcGVy YXRpb24gbm93IGluIHByb2dyZXNzIn0sCgkJe1dTQUVBTFJFQURZLCAiT3BlcmF0aW9uIGFs cmVhZHkgaW4gcHJvZ3Jlc3MifSwKCQl7V1NBRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9u IG9uIG5vbi1zb2NrZXQifSwKCQl7V1NBRURFU1RBRERSUkVRLCAiRGVzdGluYXRpb24gYWRk cmVzcyByZXF1aXJlZCJ9LAoJCXtXU0FFTVNHU0laRSwgIk1lc3NhZ2UgdG9vIGxvbmcifSwK CQl7V1NBRVBST1RPVFlQRSwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCJ9LAoJ CXtXU0FFTk9QUk9UT09QVCwgIlByb3RvY29sIG5vdCBhdmFpbGFibGUifSwKCQl7V1NBRVBS T1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCJ9LAoJCXtXU0FFU09DS1RO T1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIn0sCgkJe1dTQUVPUE5PVFNV UFAsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCJ9LAoJCXtXU0FFUEZOT1NVUFBPUlQsICJQ cm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCJ9LAoJCXtXU0FFQUZOT1NVUFBPUlQsICJB ZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIn0sCgkJe1dTQUVBRERSSU5VU0UsICJBZGRy ZXNzIGFscmVhZHkgaW4gdXNlIn0sCgkJe1dTQUVBRERSTk9UQVZBSUwsICJDYW4ndCBhc3Np Z24gcmVxdWVzdGVkIGFkZHJlc3MifSwKCQl7V1NBRU5FVERPV04sICJOZXR3b3JrIGlzIGRv d24ifSwKCQl7V1NBRU5FVFVOUkVBQ0gsICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIn0sCgkJ e1dTQUVORVRSRVNFVCwgIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIG9uIHJlc2V0In0s CgkJe1dTQUVDT05OQUJPUlRFRCwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0 In0sCgkJe1dTQUVDT05OUkVTRVQsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIifSwKCQl7 V1NBRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUifSwKCQl7V1NBRUlTQ09O TiwgIlNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCJ9LAoJCXtXU0FFTk9UQ09OTiwgIlNv Y2tldCBpcyBub3QgY29ubmVjdGVkIn0sCgkJe1dTQUVTSFVURE9XTiwgIkNhbid0IHNlbmQg YWZ0ZXIgc29ja2V0IHNodXRkb3duIn0sCgkJe1dTQUVUT09NQU5ZUkVGUywgIlRvbyBtYW55 IHJlZmVyZW5jZXM6IGNhbid0IHNwbGljZSJ9LAoJCXtXU0FFVElNRURPVVQsICJPcGVyYXRp b24gdGltZWQgb3V0In0sCgkJe1dTQUVDT05OUkVGVVNFRCwgIkNvbm5lY3Rpb24gcmVmdXNl ZCJ9LAoJCXtXU0FFTE9PUCwgIlRvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rcyJ9 LAoJCXtXU0FFTkFNRVRPT0xPTkcsICJGaWxlIG5hbWUgdG9vIGxvbmcifSwKCQl7V1NBRUhP U1RET1dOLCAiSG9zdCBpcyBkb3duIn0sCgkJe1dTQUVIT1NUVU5SRUFDSCwgIk5vIHJvdXRl IHRvIGhvc3QifSwKCQl7V1NBRU5PVEVNUFRZLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSJ9LAoJ CXtXU0FFUFJPQ0xJTSwgIlRvbyBtYW55IHByb2Nlc3NlcyJ9LAoJCXtXU0FFVVNFUlMsICJU b28gbWFueSB1c2VycyJ9LAoJCXtXU0FFRFFVT1QsICJEaXNjIHF1b3RhIGV4Y2VlZGVkIn0s CgkJe1dTQUVTVEFMRSwgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSJ9LAoJCXtXU0FFUkVNT1RF LCAiVG9vIG1hbnkgbGV2ZWxzIG9mIHJlbW90ZSBpbiBwYXRoIn0sCgkJe1dTQVNZU05PVFJF QURZLCAiTmV0d29yayBzdWJzeXN0ZW0gaXMgdW52YWlsYWJsZSJ9LAoJCXtXU0FWRVJOT1RT VVBQT1JURUQsICJXaW5Tb2NrIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCJ9LAoJCXtXU0FO T1RJTklUSUFMSVNFRCwKCQkgICJTdWNjZXNzZnVsIFdTQVN0YXJ0dXAoKSBub3QgeWV0IHBl cmZvcm1lZCJ9LAoJCXtXU0FFRElTQ09OLCAiR3JhY2VmdWwgc2h1dGRvd24gaW4gcHJvZ3Jl c3MifSwKCQkvKiBSZXNvbHZlciBlcnJvcnMgKi8KCQl7V1NBSE9TVF9OT1RfRk9VTkQsICJO byBzdWNoIGhvc3QgaXMga25vd24ifSwKCQl7V1NBVFJZX0FHQUlOLCAiSG9zdCBub3QgZm91 bmQsIG9yIHNlcnZlciBmYWlsZWQifSwKCQl7V1NBTk9fUkVDT1ZFUlksICJVbmV4cGVjdGVk IHNlcnZlciBlcnJvciBlbmNvdW50ZXJlZCJ9LAoJCXtXU0FOT19EQVRBLCAiVmFsaWQgbmFt ZSB3aXRob3V0IHJlcXVlc3RlZCBkYXRhIn0sCgkJe1dTQU5PX0FERFJFU1MsICJObyBhZGRy ZXNzLCBsb29rIGZvciBNWCByZWNvcmQifSwKCQl7MCwgTlVMTH0KCX07CglpZiAoZXJyX25v KSB7CgkJUHlPYmplY3QgKnY7CgkJY29uc3QgY2hhciAqbXNnID0gIndpbnNvY2sgZXJyb3Ii OwoKCQlmb3IgKG1zZ3AgPSBtc2dzOyBtc2dwLT5tc2c7IG1zZ3ArKykgewoJCQlpZiAoZXJy X25vID09IG1zZ3AtPm5vKSB7CgkJCQltc2cgPSBtc2dwLT5tc2c7CgkJCQlicmVhazsKCQkJ fQoJCX0KCgkJdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnJfbm8sIG1zZyk7CgkJaWYg KHYgIT0gTlVMTCkgewoJCQlQeUVycl9TZXRPYmplY3Qoc29ja2V0X2Vycm9yLCB2KTsKCQkJ UHlfREVDUkVGKHYpOwoJCX0KCQlyZXR1cm4gTlVMTDsKCX0KCWVsc2UKI2VuZGlmCgojaWYg ZGVmaW5lZChQWU9TX09TMikgJiYgIWRlZmluZWQoUFlDQ19HQ0MpCglpZiAoc29ja19lcnJu bygpICE9IE5PX0VSUk9SKSB7CgkJQVBJUkVUIHJjOwoJCVVMT05HICBtc2dsZW47CgkJY2hh ciBvdXRidWZbMTAwXTsKCQlpbnQgbXllcnJvcmNvZGUgPSBzb2NrX2Vycm5vKCk7CgoJCS8q IFJldHJpZXZlIHNvY2tldC1yZWxhdGVkIGVycm9yIG1lc3NhZ2UgZnJvbSBNUFROLk1TRyBm aWxlICovCgkJcmMgPSBEb3NHZXRNZXNzYWdlKE5VTEwsIDAsIG91dGJ1Ziwgc2l6ZW9mKG91 dGJ1ZiksCgkJCQkgICBteWVycm9yY29kZSAtIFNPQ0JBU0VFUlIgKyAyNiwKCQkJCSAgICJt cHRuLm1zZyIsCgkJCQkgICAmbXNnbGVuKTsKCQlpZiAocmMgPT0gTk9fRVJST1IpIHsKCQkJ UHlPYmplY3QgKnY7CgoJCQkvKiBPUy8yIGRvZXNuJ3QgZ3VhcmFudGVlIGEgdGVybWluYXRv ciAqLwoJCQlvdXRidWZbbXNnbGVuXSA9ICdcMCc7CgkJCWlmIChzdHJsZW4ob3V0YnVmKSA+ IDApIHsKCQkJCS8qIElmIG5vbi1lbXB0eSBtc2csIHRyaW0gQ1JMRiAqLwoJCQkJY2hhciAq bGFzdGMgPSAmb3V0YnVmWyBzdHJsZW4ob3V0YnVmKS0xIF07CgkJCQl3aGlsZSAobGFzdGMg PiBvdXRidWYgJiYgaXNzcGFjZSgqbGFzdGMpKSB7CgkJCQkJLyogVHJpbSB0cmFpbGluZyB3 aGl0ZXNwYWNlIChDUkxGKSAqLwoJCQkJCSpsYXN0Yy0tID0gJ1wwJzsKCQkJCX0KCQkJfQoJ CQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIG15ZXJyb3Jjb2RlLCBvdXRidWYpOwoJCQlp ZiAodiAhPSBOVUxMKSB7CgkJCQlQeUVycl9TZXRPYmplY3Qoc29ja2V0X2Vycm9yLCB2KTsK CQkJCVB5X0RFQ1JFRih2KTsKCQkJfQoJCQlyZXR1cm4gTlVMTDsKCQl9Cgl9CiNlbmRpZgoK CXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oc29ja2V0X2Vycm9yKTsKfQoKCnN0YXRpYyBQ eU9iamVjdCAqCnNldF9oZXJyb3IoaW50IGhfZXJyb3IpCnsKCVB5T2JqZWN0ICp2OwoKI2lm ZGVmIEhBVkVfSFNUUkVSUk9SCgl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGhfZXJyb3Is IChjaGFyICopaHN0cmVycm9yKGhfZXJyb3IpKTsKI2Vsc2UKCXYgPSBQeV9CdWlsZFZhbHVl KCIoaXMpIiwgaF9lcnJvciwgImhvc3Qgbm90IGZvdW5kIik7CiNlbmRpZgoJaWYgKHYgIT0g TlVMTCkgewoJCVB5RXJyX1NldE9iamVjdChzb2NrZXRfaGVycm9yLCB2KTsKCQlQeV9ERUNS RUYodik7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCgpzdGF0aWMgUHlPYmplY3QgKgpzZXRfZ2Fp ZXJyb3IoaW50IGVycm9yKQp7CglQeU9iamVjdCAqdjsKCiNpZmRlZiBFQUlfU1lTVEVNCgkv KiBFQUlfU1lTVEVNIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyBYUC4gKi8KCWlmIChl cnJvciA9PSBFQUlfU1lTVEVNKQoJCXJldHVybiBzZXRfZXJyb3IoKTsKI2VuZGlmCgojaWZk ZWYgSEFWRV9HQUlfU1RSRVJST1IKCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyb3Is IGdhaV9zdHJlcnJvcihlcnJvcikpOwojZWxzZQoJdiA9IFB5X0J1aWxkVmFsdWUoIihpcyki LCBlcnJvciwgImdldGFkZHJpbmZvIGZhaWxlZCIpOwojZW5kaWYKCWlmICh2ICE9IE5VTEwp IHsKCQlQeUVycl9TZXRPYmplY3Qoc29ja2V0X2dhaWVycm9yLCB2KTsKCQlQeV9ERUNSRUYo dik7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCi8qIEZvciB0aW1lb3V0IGVycm9ycyAqLwpzdGF0 aWMgUHlPYmplY3QgKgp0aW1lb3V0X2Vycih2b2lkKQp7CglQeU9iamVjdCAqdjsKCiNpZmRl ZiBNU19XSU5ET1dTCgl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIFdTQUVUSU1FRE9VVCwg IlNvY2tldCBvcGVyYXRpb24gdGltZWQgb3V0Iik7CiNlbHNlCgl2ID0gUHlfQnVpbGRWYWx1 ZSgiKGlzKSIsIEVUSU1FRE9VVCwgIlNvY2tldCBvcGVyYXRpb24gdGltZWQgb3V0Iik7CiNl bmRpZgoKCWlmICh2ICE9IE5VTEwpIHsKCQlQeUVycl9TZXRPYmplY3Qoc29ja2V0X2Vycm9y LCB2KTsKCQlQeV9ERUNSRUYodik7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCi8qIEZ1bmN0aW9u IHRvIHBlcmZvcm0gdGhlIHNldHRpbmcgb2Ygc29ja2V0IGJsb2NraW5nIG1vZGUKICAgaW50 ZXJuYWxseS4gYmxvY2sgPSAoMSB8IDApLiAqLwpzdGF0aWMgaW50CmludGVybmFsX3NldGJs b2NraW5nKFB5U29ja2V0U29ja09iamVjdCAqcywgaW50IGJsb2NrKQp7CiNpZm5kZWYgUklT Q09TCiNpZm5kZWYgTVNfV0lORE9XUwoJaW50IGRlbGF5X2ZsYWc7CiNlbmRpZgojZW5kaWYK CglQeV9CRUdJTl9BTExPV19USFJFQURTCiNpZmRlZiBfX0JFT1NfXwoJYmxvY2sgPSAhYmxv Y2s7CglzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIFNPTF9TT0NLRVQsIFNPX05PTkJMT0NLLAoJ CSAgICh2b2lkICopKCZibG9jayksIHNpemVvZihpbnQpKTsKI2Vsc2UKI2lmbmRlZiBSSVND T1MKI2lmbmRlZiBNU19XSU5ET1dTCiNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiAhZGVmaW5l ZChQWUNDX0dDQykKCWJsb2NrID0gIWJsb2NrOwoJaW9jdGwocy0+c29ja19mZCwgRklPTkJJ TywgKGNhZGRyX3QpJmJsb2NrLCBzaXplb2YoYmxvY2spKTsKI2Vsc2UgLyogIVBZT1NfT1My ICovCglkZWxheV9mbGFnID0gZmNudGwocy0+c29ja19mZCwgRl9HRVRGTCwgMCk7CglpZiAo YmxvY2spCgkJZGVsYXlfZmxhZyAmPSAofk9fTkRFTEFZKTsKCWVsc2UKCQlkZWxheV9mbGFn IHw9IE9fTkRFTEFZOwoJZmNudGwocy0+c29ja19mZCwgRl9TRVRGTCwgZGVsYXlfZmxhZyk7 CiNlbmRpZiAvKiAhUFlPU19PUzIgKi8KI2Vsc2UgLyogTVNfV0lORE9XUyAqLwoJYmxvY2sg PSAhYmxvY2s7Cglpb2N0bHNvY2tldChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodV9sb25nKikm YmxvY2spOwojZW5kaWYgLyogTVNfV0lORE9XUyAqLwojZW5kaWYgLyogX19CRU9TX18gKi8K I2VuZGlmIC8qIFJJU0NPUyAqLwoJUHlfRU5EX0FMTE9XX1RIUkVBRFMKCgkvKiBTaW5jZSB0 aGVzZSBkb24ndCByZXR1cm4gYW55dGhpbmcgKi8KCXJldHVybiAxOwp9CgovKiBGb3IgYWNj ZXNzIHRvIHRoZSBzZWxlY3QgbW9kdWxlIHRvIHBvbGwgdGhlIHNvY2tldCBmb3IgdGltZW91 dAogICBmdW5jdGlvbmFsaXR5LiB3cml0aW5nIGlzIDEgZm9yIHdyaXRpbmcsIDAgZm9yIHJl YWRpbmcuCiAgIFJldHVybiB2YWx1ZTogLTEgaWYgZXJyb3IsIDAgaWYgbm90IHJlYWR5LCA+ PSAxIGlmIHJlYWR5LgogICBBbiBleGNlcHRpb24gaXMgc2V0IHdoZW4gdGhlIHJldHVybiB2 YWx1ZSBpcyA8PSAwICghKS4gKi8Kc3RhdGljIGludAppbnRlcm5hbF9zZWxlY3QoUHlTb2Nr ZXRTb2NrT2JqZWN0ICpzLCBpbnQgd3JpdGluZykKewoJZmRfc2V0IGZkczsKCXN0cnVjdCB0 aW1ldmFsIHR2OwoJaW50IGNvdW50OwoKCS8qIENvbnN0cnVjdCB0aGUgYXJndW1lbnRzIHRv IHNlbGVjdCAqLwoJdHYudHZfc2VjID0gKGludClzLT5zb2NrX3RpbWVvdXQ7Cgl0di50dl91 c2VjID0gKGludCkoKHMtPnNvY2tfdGltZW91dCAtIHR2LnR2X3NlYykgKiAxZTYpOwoJRkRf WkVSTygmZmRzKTsKCUZEX1NFVChzLT5zb2NrX2ZkLCAmZmRzKTsKCgkvKiBTZWUgaWYgdGhl IHNvY2tldCBpcyByZWFkeSAqLwoJaWYgKHdyaXRpbmcpCgkJY291bnQgPSBzZWxlY3Qocy0+ c29ja19mZCsxLCBOVUxMLCAmZmRzLCBOVUxMLCAmdHYpOwoJZWxzZQoJCWNvdW50ID0gc2Vs ZWN0KHMtPnNvY2tfZmQrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKCgkvKiBDaGVjayBm b3IgZXJyb3JzICovCglpZiAoY291bnQgPCAwKSB7CgkJcy0+ZXJyb3JoYW5kbGVyKCk7CgkJ cmV0dXJuIC0xOwoJfQoKCS8qIFNldCB0aGUgZXJyb3IgaWYgdGhlIHRpbWVvdXQgaGFzIGVs YXBzZWQsIGkuZSwgd2Ugd2VyZSBub3QKCSAgcG9sbGVkLiAqLwoJaWYgKGNvdW50ID09IDAp CgkJdGltZW91dF9lcnIoKTsKCglyZXR1cm4gY291bnQ7Cn0KCi8qIEluaXRpYWxpemUgYSBu ZXcgc29ja2V0IG9iamVjdC4gKi8KCnN0YXRpYyB2b2lkCmluaXRfc29ja29iamVjdChQeVNv Y2tldFNvY2tPYmplY3QgKnMsCgkJU09DS0VUX1QgZmQsIGludCBmYW1pbHksIGludCB0eXBl LCBpbnQgcHJvdG8pCnsKI2lmZGVmIFJJU0NPUwoJaW50IGJsb2NrID0gMTsKI2VuZGlmCglz LT5zb2NrX2ZkID0gZmQ7CglzLT5zb2NrX2ZhbWlseSA9IGZhbWlseTsKCXMtPnNvY2tfdHlw ZSA9IHR5cGU7CglzLT5zb2NrX3Byb3RvID0gcHJvdG87CglzLT5zb2NrX2Jsb2NraW5nID0g MTsgLyogU3RhcnQgaW4gYmxvY2tpbmcgbW9kZSAqLwoJcy0+c29ja190aW1lb3V0ID0gLTEu MDsgLyogU3RhcnQgd2l0aG91dCB0aW1lb3V0ICovCgoJcy0+ZXJyb3JoYW5kbGVyID0gJnNl dF9lcnJvcjsKI2lmZGVmIFJJU0NPUwoJaWYgKHRhc2t3aW5kb3cpCgkJc29ja2V0aW9jdGwo cy0+c29ja19mZCwgMHg4MDA0NjY3OSwgKHVfbG9uZyopJmJsb2NrKTsKI2VuZGlmCn0KCgov KiBDcmVhdGUgYSBuZXcgc29ja2V0IG9iamVjdC4KICAgVGhpcyBqdXN0IGNyZWF0ZXMgdGhl IG9iamVjdCBhbmQgaW5pdGlhbGl6ZXMgaXQuCiAgIElmIHRoZSBjcmVhdGlvbiBmYWlscywg cmV0dXJuIE5VTEwgYW5kIHNldCBhbiBleGNlcHRpb24gKGltcGxpY2l0CiAgIGluIE5FV09C SigpKS4gKi8KCnN0YXRpYyBQeVNvY2tldFNvY2tPYmplY3QgKgpuZXdfc29ja29iamVjdChT T0NLRVRfVCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90bykKewoJUHlTb2Nr ZXRTb2NrT2JqZWN0ICpzOwoJcyA9IChQeVNvY2tldFNvY2tPYmplY3QgKikKCQlQeVR5cGVf R2VuZXJpY05ldygmc29ja190eXBlLCBOVUxMLCBOVUxMKTsKCWlmIChzICE9IE5VTEwpCgkJ aW5pdF9zb2Nrb2JqZWN0KHMsIGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKCXJldHVybiBz Owp9CgoKLyogTG9jayB0byBhbGxvdyBweXRob24gaW50ZXJwcmV0ZXIgdG8gY29udGludWUs IGJ1dCBvbmx5IGFsbG93IG9uZQogICB0aHJlYWQgdG8gYmUgaW4gZ2V0aG9zdGJ5bmFtZSAq LwojaWZkZWYgVVNFX0dFVEhPU1RCWU5BTUVfTE9DSwpQeVRocmVhZF90eXBlX2xvY2sgZ2V0 aG9zdGJ5bmFtZV9sb2NrOwojZW5kaWYKCgovKiBDb252ZXJ0IGEgc3RyaW5nIHNwZWNpZnlp bmcgYSBob3N0IG5hbWUgb3Igb25lIG9mIGEgZmV3IHN5bWJvbGljCiAgIG5hbWVzIHRvIGEg bnVtZXJpYyBJUCBhZGRyZXNzLiAgVGhpcyB1c3VhbGx5IGNhbGxzIGdldGhvc3RieW5hbWUo KQogICB0byBkbyB0aGUgd29yazsgdGhlIG5hbWVzICIiIGFuZCAiPGJyb2FkY2FzdD4iIGFy ZSBzcGVjaWFsLgogICBSZXR1cm4gdGhlIGxlbmd0aCAoSVB2NCBzaG91bGQgYmUgNCBieXRl cyksIG9yIG5lZ2F0aXZlIGlmCiAgIGFuIGVycm9yIG9jY3VycmVkOyB0aGVuIGFuIGV4Y2Vw dGlvbiBpcyByYWlzZWQuICovCgpzdGF0aWMgaW50CnNldGlwYWRkcihjaGFyICpuYW1lLCBz dHJ1Y3Qgc29ja2FkZHIgKmFkZHJfcmV0LCBpbnQgYWYpCnsKCXN0cnVjdCBhZGRyaW5mbyBo aW50cywgKnJlczsKCWludCBlcnJvcjsKCgltZW1zZXQoKHZvaWQgKikgYWRkcl9yZXQsICdc MCcsIHNpemVvZigqYWRkcl9yZXQpKTsKCWlmIChuYW1lWzBdID09ICdcMCcpIHsKCQlpbnQg c2l6OwoJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwoJCWhpbnRzLmFpX2Zh bWlseSA9IGFmOwoJCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsJLypkdW1teSov CgkJaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOwoJCWVycm9yID0gZ2V0YWRkcmluZm8o TlVMTCwgIjAiLCAmaGludHMsICZyZXMpOwoJCWlmIChlcnJvcikgewoJCQlzZXRfZ2FpZXJy b3IoZXJyb3IpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCXN3aXRjaCAocmVzLT5haV9mYW1pbHkp IHsKCQljYXNlIEFGX0lORVQ6CgkJCXNpeiA9IDQ7CgkJCWJyZWFrOwojaWZkZWYgRU5BQkxF X0lQVjYKCQljYXNlIEFGX0lORVQ2OgoJCQlzaXogPSAxNjsKCQkJYnJlYWs7CiNlbmRpZgoJ CWRlZmF1bHQ6CgkJCWZyZWVhZGRyaW5mbyhyZXMpOwoJCQlQeUVycl9TZXRTdHJpbmcoc29j a2V0X2Vycm9yLAoJCQkJInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CgkJCXJldHVy biAtMTsKCQl9CgkJaWYgKHJlcy0+YWlfbmV4dCkgewoJCQlmcmVlYWRkcmluZm8ocmVzKTsK CQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKCQkJCSJ3aWxkY2FyZCByZXNvbHZl ZCB0byBtdWx0aXBsZSBhZGRyZXNzIik7CgkJCXJldHVybiAtMTsKCQl9CgkJbWVtY3B5KGFk ZHJfcmV0LCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbik7CgkJZnJlZWFkZHJpbmZv KHJlcyk7CgkJcmV0dXJuIHNpejsKCX0KCWlmIChuYW1lWzBdID09ICc8JyAmJiBzdHJjbXAo bmFtZSwgIjxicm9hZGNhc3Q+IikgPT0gMCkgewoJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2lu OwoJCWlmIChhZiAhPSBQRl9JTkVUICYmIGFmICE9IFBGX1VOU1BFQykgewoJCQlQeUVycl9T ZXRTdHJpbmcoc29ja2V0X2Vycm9yLAoJCQkJImFkZHJlc3MgZmFtaWx5IG1pc21hdGNoZWQi KTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRk cl9yZXQ7CgkJbWVtc2V0KCh2b2lkICopIHNpbiwgJ1wwJywgc2l6ZW9mKCpzaW4pKTsKCQlz aW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwojaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4K CQlzaW4tPnNpbl9sZW4gPSBzaXplb2YoKnNpbik7CiNlbmRpZgoJCXNpbi0+c2luX2FkZHIu c19hZGRyID0gSU5BRERSX0JST0FEQ0FTVDsKCQlyZXR1cm4gc2l6ZW9mKHNpbi0+c2luX2Fk ZHIpOwoJfQoJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CgloaW50cy5haV9m YW1pbHkgPSBhZjsKCWVycm9yID0gZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJmhpbnRzLCAm cmVzKTsKI2lmIGRlZmluZWQoX19kaWdpdGFsX18pICYmIGRlZmluZWQoX191bml4X18pCglp ZiAoZXJyb3IgPT0gRUFJX05PTkFNRSAmJiBhZiA9PSBBRl9VTlNQRUMpIHsKCQkvKiBPbiBU cnU2NCBWNS4xLCBudW1lcmljLXRvLWFkZHIgY29udmVyc2lvbiBmYWlscwoJCSAgIGlmIG5v IGFkZHJlc3MgZmFtaWx5IGlzIGdpdmVuLiBBc3N1bWUgSVB2NCBmb3Igbm93LiovCgkJaGlu dHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKCQllcnJvciA9IGdldGFkZHJpbmZvKG5hbWUsIE5V TEwsICZoaW50cywgJnJlcyk7Cgl9CiNlbmRpZgoJaWYgKGVycm9yKSB7CgkJc2V0X2dhaWVy cm9yKGVycm9yKTsKCQlyZXR1cm4gLTE7Cgl9CgltZW1jcHkoKGNoYXIgKikgYWRkcl9yZXQs IHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKTsKCWZyZWVhZGRyaW5mbyhyZXMpOwoJ c3dpdGNoIChhZGRyX3JldC0+c2FfZmFtaWx5KSB7CgljYXNlIEFGX0lORVQ6CgkJcmV0dXJu IDQ7CiNpZmRlZiBFTkFCTEVfSVBWNgoJY2FzZSBBRl9JTkVUNjoKCQlyZXR1cm4gMTY7CiNl bmRpZgoJZGVmYXVsdDoKCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAidW5rbm93 biBhZGRyZXNzIGZhbWlseSIpOwoJCXJldHVybiAtMTsKCX0KfQoKCi8qIENyZWF0ZSBhIHN0 cmluZyBvYmplY3QgcmVwcmVzZW50aW5nIGFuIElQIGFkZHJlc3MuCiAgIFRoaXMgaXMgYWx3 YXlzIGEgc3RyaW5nIG9mIHRoZSBmb3JtICdkZC5kZC5kZC5kZCcgKHdpdGggdmFyaWFibGUK ICAgc2l6ZSBudW1iZXJzKS4gKi8KCnN0YXRpYyBQeU9iamVjdCAqCm1ha2VpcGFkZHIoc3Ry dWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKewoJY2hhciBidWZbTklfTUFYSE9T VF07CglpbnQgZXJyb3I7CgoJZXJyb3IgPSBnZXRuYW1laW5mbyhhZGRyLCBhZGRybGVuLCBi dWYsIHNpemVvZihidWYpLCBOVUxMLCAwLAoJCU5JX05VTUVSSUNIT1NUKTsKCWlmIChlcnJv cikgewoJCXNldF9nYWllcnJvcihlcnJvcik7CgkJcmV0dXJuIE5VTEw7Cgl9CglyZXR1cm4g UHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwp9CgoKLyogQ3JlYXRlIGFuIG9iamVjdCByZXBy ZXNlbnRpbmcgdGhlIGdpdmVuIHNvY2tldCBhZGRyZXNzLAogICBzdWl0YWJsZSBmb3IgcGFz c2luZyBpdCBiYWNrIHRvIGJpbmQoKSwgY29ubmVjdCgpIGV0Yy4KICAgVGhlIGZhbWlseSBm aWVsZCBvZiB0aGUgc29ja2FkZHIgc3RydWN0dXJlIGlzIGluc3BlY3RlZAogICB0byBkZXRl cm1pbmUgd2hhdCBraW5kIG9mIGFkZHJlc3MgaXQgcmVhbGx5IGlzLiAqLwoKLypBUkdTVVNF RCovCnN0YXRpYyBQeU9iamVjdCAqCm1ha2Vzb2NrYWRkcihpbnQgc29ja2ZkLCBzdHJ1Y3Qg c29ja2FkZHIgKmFkZHIsIGludCBhZGRybGVuKQp7CglpZiAoYWRkcmxlbiA9PSAwKSB7CgkJ LyogTm8gYWRkcmVzcyAtLSBtYXkgYmUgcmVjdmZyb20oKSBmcm9tIGtub3duIHNvY2tldCAq LwoJCVB5X0lOQ1JFRihQeV9Ob25lKTsKCQlyZXR1cm4gUHlfTm9uZTsKCX0KCiNpZmRlZiBf X0JFT1NfXwoJLyogWFhYOiBCZU9TIHZlcnNpb24gb2YgYWNjZXB0KCkgZG9lc24ndCBzZXQg ZmFtaWx5IGNvcnJlY3RseSAqLwoJYWRkci0+c2FfZmFtaWx5ID0gQUZfSU5FVDsKI2VuZGlm CgoJc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKCgljYXNlIEFGX0lORVQ6Cgl7CgkJc3Ry dWN0IHNvY2thZGRyX2luICphOwoJCVB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWlwYWRkcihh ZGRyLCBzaXplb2YoKmEpKTsKCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKCQlpZiAoYWRkcm9i aikgewoJCQlhID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7CgkJCXJldCA9IFB5X0J1 aWxkVmFsdWUoIk9pIiwgYWRkcm9iaiwgbnRvaHMoYS0+c2luX3BvcnQpKTsKCQkJUHlfREVD UkVGKGFkZHJvYmopOwoJCX0KCQlyZXR1cm4gcmV0OwoJfQoKI2lmZGVmIEFGX1VOSVgKCWNh c2UgQUZfVU5JWDoKCXsKCQlzdHJ1Y3Qgc29ja2FkZHJfdW4gKmEgPSAoc3RydWN0IHNvY2th ZGRyX3VuICopIGFkZHI7CgkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYS0+c3VuX3Bh dGgpOwoJfQojZW5kaWYgLyogQUZfVU5JWCAqLwoKI2lmZGVmIEVOQUJMRV9JUFY2CgljYXNl IEFGX0lORVQ2OgoJewoJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmE7CgkJUHlPYmplY3QgKmFk ZHJvYmogPSBtYWtlaXBhZGRyKGFkZHIsIHNpemVvZigqYSkpOwoJCVB5T2JqZWN0ICpyZXQg PSBOVUxMOwoJCWlmIChhZGRyb2JqKSB7CgkJCWEgPSAoc3RydWN0IHNvY2thZGRyX2luNiAq KWFkZHI7CgkJCXJldCA9IFB5X0J1aWxkVmFsdWUoIk9paWkiLAoJCQkJCSAgICBhZGRyb2Jq LAoJCQkJCSAgICBudG9ocyhhLT5zaW42X3BvcnQpLAoJCQkJCSAgICBhLT5zaW42X2Zsb3dp bmZvLAoJCQkJCSAgICBhLT5zaW42X3Njb3BlX2lkKTsKCQkJUHlfREVDUkVGKGFkZHJvYmop OwoJCX0KCQlyZXR1cm4gcmV0OwoJfQojZW5kaWYKCiNpZmRlZiBIQVZFX05FVFBBQ0tFVF9Q QUNLRVRfSAoJY2FzZSBBRl9QQUNLRVQ6Cgl7CgkJc3RydWN0IHNvY2thZGRyX2xsICphID0g KHN0cnVjdCBzb2NrYWRkcl9sbCAqKWFkZHI7CgkJY2hhciAqaWZuYW1lID0gIiI7CgkJc3Ry dWN0IGlmcmVxIGlmcjsKCQkvKiBuZWVkIHRvIGxvb2sgdXAgaW50ZXJmYWNlIG5hbWUgZ2l2 ZSBpbmRleCAqLwoJCWlmIChhLT5zbGxfaWZpbmRleCkgewoJCQlpZnIuaWZyX2lmaW5kZXgg PSBhLT5zbGxfaWZpbmRleDsKCQkJaWYgKGlvY3RsKHNvY2tmZCwgU0lPQ0dJRk5BTUUsICZp ZnIpID09IDApCgkJCQlpZm5hbWUgPSBpZnIuaWZyX25hbWU7CgkJfQoJCXJldHVybiBQeV9C dWlsZFZhbHVlKCJzaGJocyMiLAoJCQkJICAgICBpZm5hbWUsCgkJCQkgICAgIG50b2hzKGEt PnNsbF9wcm90b2NvbCksCgkJCQkgICAgIGEtPnNsbF9wa3R0eXBlLAoJCQkJICAgICBhLT5z bGxfaGF0eXBlLAoJCQkJICAgICBhLT5zbGxfYWRkciwKCQkJCSAgICAgYS0+c2xsX2hhbGVu KTsKCX0KI2VuZGlmCgoJLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCgoJZGVmYXVsdDoKCQkv KiBJZiB3ZSBkb24ndCBrbm93IHRoZSBhZGRyZXNzIGZhbWlseSwgZG9uJ3QgcmFpc2UgYW4K CQkgICBleGNlcHRpb24gLS0gcmV0dXJuIGl0IGFzIGEgdHVwbGUuICovCgkJcmV0dXJuIFB5 X0J1aWxkVmFsdWUoImlzIyIsCgkJCQkgICAgIGFkZHItPnNhX2ZhbWlseSwKCQkJCSAgICAg YWRkci0+c2FfZGF0YSwKCQkJCSAgICAgc2l6ZW9mKGFkZHItPnNhX2RhdGEpKTsKCgl9Cn0K CgovKiBQYXJzZSBhIHNvY2tldCBhZGRyZXNzIGFyZ3VtZW50IGFjY29yZGluZyB0byB0aGUg c29ja2V0IG9iamVjdCdzCiAgIGFkZHJlc3MgZmFtaWx5LiAgUmV0dXJuIDEgaWYgdGhlIGFk ZHJlc3Mgd2FzIGluIHRoZSBwcm9wZXIgZm9ybWF0LAogICAwIG9mIG5vdC4gIFRoZSBhZGRy ZXNzIGlzIHJldHVybmVkIHRocm91Z2ggYWRkcl9yZXQsIGl0cyBsZW5ndGgKICAgdGhyb3Vn aCBsZW5fcmV0LiAqLwoKc3RhdGljIGludApnZXRzb2NrYWRkcmFyZyhQeVNvY2tldFNvY2tP YmplY3QgKnMsIFB5T2JqZWN0ICphcmdzLAoJICAgICAgIHN0cnVjdCBzb2NrYWRkciAqKmFk ZHJfcmV0LCBpbnQgKmxlbl9yZXQpCnsKCXN3aXRjaCAocy0+c29ja19mYW1pbHkpIHsKCiNp ZmRlZiBBRl9VTklYCgljYXNlIEFGX1VOSVg6Cgl7CgkJc3RydWN0IHNvY2thZGRyX3VuKiBh ZGRyOwoJCWNoYXIgKnBhdGg7CgkJaW50IGxlbjsKCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRk cl91biopJihzLT5zb2NrX2FkZHIpLnVuOwoJCWlmICghUHlBcmdfUGFyc2UoYXJncywgInQj IiwgJnBhdGgsICZsZW4pKQoJCQlyZXR1cm4gMDsKCQlpZiAobGVuID4gc2l6ZW9mIGFkZHIt PnN1bl9wYXRoKSB7CgkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCgkJCQkJIkFG X1VOSVggcGF0aCB0b28gbG9uZyIpOwoJCQlyZXR1cm4gMDsKCQl9CgkJYWRkci0+c3VuX2Zh bWlseSA9IHMtPnNvY2tfZmFtaWx5OwoJCW1lbWNweShhZGRyLT5zdW5fcGF0aCwgcGF0aCwg bGVuKTsKCQlhZGRyLT5zdW5fcGF0aFtsZW5dID0gMDsKCQkqYWRkcl9yZXQgPSAoc3RydWN0 IHNvY2thZGRyICopIGFkZHI7CgkJKmxlbl9yZXQgPSBsZW4gKyBzaXplb2YoKmFkZHIpIC0g c2l6ZW9mKGFkZHItPnN1bl9wYXRoKTsKCQlyZXR1cm4gMTsKCX0KI2VuZGlmIC8qIEFGX1VO SVggKi8KCgljYXNlIEFGX0lORVQ6Cgl7CgkJc3RydWN0IHNvY2thZGRyX2luKiBhZGRyOwoJ CWNoYXIgKmhvc3Q7CgkJaW50IHBvcnQ7CiAJCWFkZHI9KHN0cnVjdCBzb2NrYWRkcl9pbiop JihzLT5zb2NrX2FkZHIpLmluOwoJCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewoJCQlQ eUVycl9Gb3JtYXQoCgkJCQlQeUV4Y19UeXBlRXJyb3IsCgkJCQkiZ2V0c29ja2FkZHJhcmc6 ICIKCQkJCSJBRl9JTkVUIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCgkJ CQlhcmdzLT5vYl90eXBlLT50cF9uYW1lKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWlmICghUHlB cmdfUGFyc2VUdXBsZShhcmdzLCAic2k6Z2V0c29ja2FkZHJhcmciLCAmaG9zdCwgJnBvcnQp KQoJCQlyZXR1cm4gMDsKCQlpZiAoc2V0aXBhZGRyKGhvc3QsIChzdHJ1Y3Qgc29ja2FkZHIg KilhZGRyLCBBRl9JTkVUKSA8IDApCgkJCXJldHVybiAwOwoJCWFkZHItPnNpbl9mYW1pbHkg PSBBRl9JTkVUOwoJCWFkZHItPnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOwoJCSph ZGRyX3JldCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcjsKCQkqbGVuX3JldCA9IHNpemVv ZiAqYWRkcjsKCQlyZXR1cm4gMTsKCX0KCiNpZmRlZiBFTkFCTEVfSVBWNgoJY2FzZSBBRl9J TkVUNjoKCXsKCQlzdHJ1Y3Qgc29ja2FkZHJfaW42KiBhZGRyOwoJCWNoYXIgKmhvc3Q7CgkJ aW50IHBvcnQsIGZsb3dpbmZvLCBzY29wZV9pZDsKIAkJYWRkciA9IChzdHJ1Y3Qgc29ja2Fk ZHJfaW42KikmKHMtPnNvY2tfYWRkcikuaW42OwoJCWZsb3dpbmZvID0gc2NvcGVfaWQgPSAw OwoJCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2l8aWkiLCAmaG9zdCwgJnBvcnQs ICZmbG93aW5mbywKCQkJCSAgICAgICZzY29wZV9pZCkpIHsKCQkJcmV0dXJuIDA7CgkJfQoJ CWlmIChzZXRpcGFkZHIoaG9zdCwgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsIEFGX0lORVQ2 KSA8IDApCgkJCXJldHVybiAwOwoJCWFkZHItPnNpbjZfZmFtaWx5ID0gcy0+c29ja19mYW1p bHk7CgkJYWRkci0+c2luNl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOwoJCWFkZHItPnNp bjZfZmxvd2luZm8gPSBmbG93aW5mbzsKCQlhZGRyLT5zaW42X3Njb3BlX2lkID0gc2NvcGVf aWQ7CgkJKmFkZHJfcmV0ID0gKHN0cnVjdCBzb2NrYWRkciAqKSBhZGRyOwoJCSpsZW5fcmV0 ID0gc2l6ZW9mICphZGRyOwoJCXJldHVybiAxOwoJfQojZW5kaWYKCiNpZmRlZiBIQVZFX05F VFBBQ0tFVF9QQUNLRVRfSAoJY2FzZSBBRl9QQUNLRVQ6Cgl7CgkJc3RydWN0IHNvY2thZGRy X2xsKiBhZGRyOwoJCXN0cnVjdCBpZnJlcSBpZnI7CgkJY2hhciAqaW50ZXJmYWNlTmFtZTsK CQlpbnQgcHJvdG9OdW1iZXI7CgkJaW50IGhhdHlwZSA9IDA7CgkJaW50IHBrdHR5cGUgPSAw OwoJCWNoYXIgKmhhZGRyOwoKCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpfGlp cyIsICZpbnRlcmZhY2VOYW1lLAoJCQkJICAgICAgJnByb3RvTnVtYmVyLCAmcGt0dHlwZSwg JmhhdHlwZSwgJmhhZGRyKSkKCQkJcmV0dXJuIDA7CgkJc3RybmNweShpZnIuaWZyX25hbWUs IGludGVyZmFjZU5hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKCQlpZnIuaWZyX25hbWVb KHNpemVvZihpZnIuaWZyX25hbWUpKS0xXSA9ICdcMCc7CgkJaWYgKGlvY3RsKHMtPnNvY2tf ZmQsIFNJT0NHSUZJTkRFWCwgJmlmcikgPCAwKSB7CgkJICAgICAgICBzLT5lcnJvcmhhbmRs ZXIoKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWFkZHIgPSAmKHMtPnNvY2tfYWRkci5sbCk7CgkJ YWRkci0+c2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKCQlhZGRyLT5zbGxfcHJvdG9jb2wgPSBo dG9ucygoc2hvcnQpcHJvdG9OdW1iZXIpOwoJCWFkZHItPnNsbF9pZmluZGV4ID0gaWZyLmlm cl9pZmluZGV4OwoJCWFkZHItPnNsbF9wa3R0eXBlID0gcGt0dHlwZTsKCQlhZGRyLT5zbGxf aGF0eXBlID0gaGF0eXBlOwoJCSphZGRyX3JldCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRk cjsKCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKCQlyZXR1cm4gMTsKCX0KI2VuZGlmCgoJ LyogTW9yZSBjYXNlcyBoZXJlLi4uICovCgoJZGVmYXVsdDoKCQlQeUVycl9TZXRTdHJpbmco c29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6IGJhZCBmYW1pbHkiKTsKCQlyZXR1cm4g MDsKCgl9Cn0KCgovKiBHZXQgdGhlIGFkZHJlc3MgbGVuZ3RoIGFjY29yZGluZyB0byB0aGUg c29ja2V0IG9iamVjdCdzIGFkZHJlc3MgZmFtaWx5LgogICBSZXR1cm4gMSBpZiB0aGUgZmFt aWx5IGlzIGtub3duLCAwIG90aGVyd2lzZS4gIFRoZSBsZW5ndGggaXMgcmV0dXJuZWQKICAg dGhyb3VnaCBsZW5fcmV0LiAqLwoKc3RhdGljIGludApnZXRzb2NrYWRkcmxlbihQeVNvY2tl dFNvY2tPYmplY3QgKnMsIHNvY2tsZW5fdCAqbGVuX3JldCkKewoJc3dpdGNoIChzLT5zb2Nr X2ZhbWlseSkgewoKI2lmZGVmIEFGX1VOSVgKCWNhc2UgQUZfVU5JWDoKCXsKCQkqbGVuX3Jl dCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3VuKTsKCQlyZXR1cm4gMTsKCX0KI2VuZGlm IC8qIEFGX1VOSVggKi8KCgljYXNlIEFGX0lORVQ6Cgl7CgkJKmxlbl9yZXQgPSBzaXplb2Yg KHN0cnVjdCBzb2NrYWRkcl9pbik7CgkJcmV0dXJuIDE7Cgl9CgojaWZkZWYgRU5BQkxFX0lQ VjYKCWNhc2UgQUZfSU5FVDY6Cgl7CgkJKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2Nr YWRkcl9pbjYpOwoJCXJldHVybiAxOwoJfQojZW5kaWYKCiNpZmRlZiBIQVZFX05FVFBBQ0tF VF9QQUNLRVRfSAoJY2FzZSBBRl9QQUNLRVQ6Cgl7CgkJKmxlbl9yZXQgPSBzaXplb2YgKHN0 cnVjdCBzb2NrYWRkcl9sbCk7CgkJcmV0dXJuIDE7Cgl9CiNlbmRpZgoKCS8qIE1vcmUgY2Fz ZXMgaGVyZS4uLiAqLwoKCWRlZmF1bHQ6CgkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJv ciwgImdldHNvY2thZGRybGVuOiBiYWQgZmFtaWx5Iik7CgkJcmV0dXJuIDA7CgoJfQp9CgoK Lyogcy5hY2NlcHQoKSBtZXRob2QgKi8KCnN0YXRpYyBQeU9iamVjdCAqCnNvY2tfYWNjZXB0 KFB5U29ja2V0U29ja09iamVjdCAqcykKewoJY2hhciBhZGRyYnVmWzI1Nl07CglTT0NLRVRf VCBuZXdmZDsKCXNvY2tsZW5fdCBhZGRybGVuOwoJUHlPYmplY3QgKnNvY2sgPSBOVUxMOwoJ UHlPYmplY3QgKmFkZHIgPSBOVUxMOwoJUHlPYmplY3QgKnJlcyA9IE5VTEw7CgoJaWYgKCFn ZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCgkJcmV0dXJuIE5VTEw7CgltZW1zZXQoYWRk cmJ1ZiwgMCwgYWRkcmxlbik7CgoJZXJybm8gPSAwOyAvKiBSZXNldCBpbmRpY2F0b3IgZm9y IHVzZSB3aXRoIHRpbWVvdXQgYmVoYXZpb3IgKi8KCglQeV9CRUdJTl9BTExPV19USFJFQURT CgluZXdmZCA9IGFjY2VwdChzLT5zb2NrX2ZkLCAoc3RydWN0IHNvY2thZGRyICopIGFkZHJi dWYsICZhZGRybGVuKTsKCVB5X0VORF9BTExPV19USFJFQURTCgoJaWYgKHMtPnNvY2tfdGlt ZW91dCA+PSAwLjApIHsKI2lmZGVmIE1TX1dJTkRPV1MKCQlpZiAobmV3ZmQgPT0gSU5WQUxJ RF9TT0NLRVQpCgkJCWlmICghcy0+c29ja19ibG9ja2luZykKCQkJCXJldHVybiBzLT5lcnJv cmhhbmRsZXIoKTsKCQkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIHRydWUgZmFpbHVyZQoJCQkg ICBmb3IgYSBibG9ja2luZyBzb2NrZXQgKi8KCQkJaWYgKGVycm5vICE9IFdTQUVXT1VMREJM T0NLKQoJCQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwojZWxzZQoJCWlmIChuZXdmZCA8 IDApIHsKCQkJaWYgKCFzLT5zb2NrX2Jsb2NraW5nKQoJCQkJcmV0dXJuIHMtPmVycm9yaGFu ZGxlcigpOwoJCQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgdHJ1ZSBmYWlsdXJlCgkJCSAgIGZv ciBhIGJsb2NraW5nIHNvY2tldCAqLwoJCQlpZiAoZXJybm8gIT0gRUFHQUlOICYmIGVycm5v ICE9IEVXT1VMREJMT0NLKQoJCQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwoJCX0KI2Vu ZGlmCgoJCS8qIHRyeSB3YWl0aW5nIHRoZSB0aW1lb3V0IHBlcmlvZCAqLwoJCWlmIChpbnRl cm5hbF9zZWxlY3QocywgMCkgPD0gMCkKCQkJcmV0dXJuIE5VTEw7CgoJCVB5X0JFR0lOX0FM TE9XX1RIUkVBRFMKCQluZXdmZCA9IGFjY2VwdChzLT5zb2NrX2ZkLAoJCQkgICAgICAgKHN0 cnVjdCBzb2NrYWRkciAqKWFkZHJidWYsCgkJCSAgICAgICAmYWRkcmxlbik7CgkJUHlfRU5E X0FMTE9XX1RIUkVBRFMKCX0KCgkvKiBBdCB0aGlzIHBvaW50LCB3ZSByZWFsbHkgaGF2ZSBh biBlcnJvciwgd2hldGhlciB1c2luZyB0aW1lb3V0CgkgICBiZWhhdmlvciBvciByZWd1bGFy IHNvY2tldCBiZWhhdmlvciAqLwojaWZkZWYgTVNfV0lORE9XUwoJaWYgKG5ld2ZkID09IElO VkFMSURfU09DS0VUKQojZWxzZQoJaWYgKG5ld2ZkIDwgMCkKI2VuZGlmCgkJcmV0dXJuIHMt PmVycm9yaGFuZGxlcigpOwoKCS8qIENyZWF0ZSB0aGUgbmV3IG9iamVjdCB3aXRoIHVuc3Bl Y2lmaWVkIGZhbWlseSwKCSAgIHRvIGF2b2lkIGNhbGxzIHRvIGJpbmQoKSBldGMuIG9uIGl0 LiAqLwoJc29jayA9IChQeU9iamVjdCAqKSBuZXdfc29ja29iamVjdChuZXdmZCwKCQkJCQkg ICBzLT5zb2NrX2ZhbWlseSwKCQkJCQkgICBzLT5zb2NrX3R5cGUsCgkJCQkJICAgcy0+c29j a19wcm90byk7CgoJaWYgKHNvY2sgPT0gTlVMTCkgewoJCVNPQ0tFVENMT1NFKG5ld2ZkKTsK CQlnb3RvIGZpbmFsbHk7Cgl9CglhZGRyID0gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIChz dHJ1Y3Qgc29ja2FkZHIgKilhZGRyYnVmLAoJCQkgICAgYWRkcmxlbik7CglpZiAoYWRkciA9 PSBOVUxMKQoJCWdvdG8gZmluYWxseTsKCglyZXMgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIHNv Y2ssIGFkZHIpOwoKZmluYWxseToKCVB5X1hERUNSRUYoc29jayk7CglQeV9YREVDUkVGKGFk ZHIpOwoJcmV0dXJuIHJlczsKfQoKc3RhdGljIGNoYXIgYWNjZXB0X2RvY1tdID0KImFjY2Vw dCgpIC0+IChzb2NrZXQgb2JqZWN0LCBhZGRyZXNzIGluZm8pXG5cClxuXApXYWl0IGZvciBh biBpbmNvbWluZyBjb25uZWN0aW9uLiAgUmV0dXJuIGEgbmV3IHNvY2tldCByZXByZXNlbnRp bmcgdGhlXG5cCmNvbm5lY3Rpb24sIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgY2xpZW50LiAg Rm9yIElQIHNvY2tldHMsIHRoZSBhZGRyZXNzXG5cCmluZm8gaXMgYSBwYWlyIChob3N0YWRk ciwgcG9ydCkuIjsKCi8qIHMuc2V0YmxvY2tpbmcoMSB8IDApIG1ldGhvZCAqLwoKc3RhdGlj IFB5T2JqZWN0ICoKc29ja19zZXRibG9ja2luZyhQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5 T2JqZWN0ICphcmcpCnsKCWludCBibG9jazsKCglibG9jayA9IFB5SW50X0FzTG9uZyhhcmcp OwoJaWYgKGJsb2NrID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCgkJcmV0dXJuIE5VTEw7 CgoJcy0+c29ja19ibG9ja2luZyA9IGJsb2NrOwoJcy0+c29ja190aW1lb3V0ID0gLTEuMDsg LyogQWx3YXlzIGNsZWFyIHRoZSB0aW1lb3V0ICovCglpbnRlcm5hbF9zZXRibG9ja2luZyhz LCBibG9jayk7CgoJUHlfSU5DUkVGKFB5X05vbmUpOwoJcmV0dXJuIFB5X05vbmU7Cn0KCnN0 YXRpYyBjaGFyIHNldGJsb2NraW5nX2RvY1tdID0KInNldGJsb2NraW5nKGZsYWcpXG5cClxu XApTZXQgdGhlIHNvY2tldCB0byBibG9ja2luZyAoZmxhZyBpcyB0cnVlKSBvciBub24tYmxv Y2tpbmcgKGZhbHNlKS5cblwKVGhpcyB1c2VzIHRoZSBGSU9OQklPIGlvY3RsIHdpdGggdGhl IE9fTkRFTEFZIGZsYWcuIjsKCi8qIHMuc2V0dGltZW91dChOb25lIHwgZmxvYXQpIG1ldGhv ZC4KICAgQ2F1c2VzIGFuIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQgd2hlbiB0aGUgZ2l2ZW4g dGltZSBoYXMKICAgZWxhcHNlZCB3aGVuIHBlcmZvcm1pbmcgYSBibG9ja2luZyBzb2NrZXQg b3BlcmF0aW9uLiAqLwpzdGF0aWMgUHlPYmplY3QgKgpzb2NrX3NldHRpbWVvdXQoUHlTb2Nr ZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJnKQp7Cglkb3VibGUgdmFsdWU7CgoJaWYg KGFyZyA9PSBQeV9Ob25lKQoJCXZhbHVlID0gLTEuMDsKCWVsc2UgewoJCXZhbHVlID0gUHlG bG9hdF9Bc0RvdWJsZShhcmcpOwoJCWlmICh2YWx1ZSA8IDAuMCkgewoJCQlpZiAoIVB5RXJy X09jY3VycmVkKCkpCgkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKCQkJ CQkJIkludmFsaWQgdGltZW91dCB2YWx1ZSIpOwoJCQlyZXR1cm4gTlVMTDsKCQl9Cgl9CgoJ cy0+c29ja190aW1lb3V0ID0gdmFsdWU7CgoJLyogVGhlIHNlbWFudGljcyBvZiBzZXR0aW5n IHNvY2tldCB0aW1lb3V0cyBhcmU6CgkgICBJZiB5b3Ugc2V0dGltZW91dCghPU5vbmUpOgoJ ICAgICAgIFRoZSBhY3R1YWwgc29ja2V0IGdldHMgcHV0IGluIG5vbi1ibG9ja2luZyBtb2Rl IGFuZCB0aGUgc2VsZWN0CgkgICAgICAgaXMgdXNlZCB0byBjb250cm9sIHRpbWVvdXRzLgoJ ICAgRWxzZSBpZiB5b3Ugc2V0dGltZW91dChOb25lKSBbdGhlbiB2YWx1ZSBpcyAtMS4wXToK CSAgICAgICBUaGUgb2xkIGJlaGF2aW9yIGlzIHVzZWQgQU5EIGF1dG9tYXRpY2FsbHksIHRo ZSBzb2NrZXQgaXMgc2V0CgkgICAgICAgdG8gYmxvY2tpbmcgbW9kZS4gVGhhdCBtZWFucyB0 aGF0IHNvbWVvbmUgd2hvIHdhcyBkb2luZwoJICAgICAgIG5vbi1ibG9ja2luZyBzdHVmZiBi ZWZvcmUsIHNldHMgYSB0aW1lb3V0LCBhbmQgdGhlbiB1bnNldHMKCSAgICAgICBvbmUsIHdp bGwgaGF2ZSB0byBjYWxsIHNldGJsb2NraW5nKDApIGFnYWluIGlmIGhlIHdhbnRzCgkgICAg ICAgbm9uLWJsb2NraW5nIHN0dWZmLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgdGltZW91 dCBzdHVmZiBpcwoJICAgICAgIGJsb2NraW5nIGJ5IG5hdHVyZS4gKi8KCWludGVybmFsX3Nl dGJsb2NraW5nKHMsIHZhbHVlIDwgMC4wKTsKCglzLT5zb2NrX2Jsb2NraW5nID0gMTsgLyog QWx3YXlzIG5lZ2F0ZSBzZXRibG9ja2luZygpICovCgoJUHlfSU5DUkVGKFB5X05vbmUpOwoJ cmV0dXJuIFB5X05vbmU7Cn0KCnN0YXRpYyBjaGFyIHNldHRpbWVvdXRfZG9jW10gPQoic2V0 dGltZW91dCh0aW1lb3V0KVxuXApcblwKU2V0IGEgdGltZW91dCBvbiBibG9ja2luZyBzb2Nr ZXQgb3BlcmF0aW9ucy4gICd0aW1lb3V0JyBjYW4gYmUgYSBmbG9hdCxcblwKZ2l2aW5nIHNl Y29uZHMsIG9yIE5vbmUuICBTZXR0aW5nIGEgdGltZW91dCBvZiBOb25lIGRpc2FibGVzIHRp bWVvdXQuIjsKCi8qIHMuZ2V0dGltZW91dCgpIG1ldGhvZC4KICAgUmV0dXJucyB0aGUgdGlt ZW91dCBhc3NvY2lhdGVkIHdpdGggYSBzb2NrZXQuICovCnN0YXRpYyBQeU9iamVjdCAqCnNv Y2tfZ2V0dGltZW91dChQeVNvY2tldFNvY2tPYmplY3QgKnMpCnsKCWlmIChzLT5zb2NrX3Rp bWVvdXQgPCAwLjApIHsKCQlQeV9JTkNSRUYoUHlfTm9uZSk7CgkJcmV0dXJuIFB5X05vbmU7 Cgl9CgllbHNlCgkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShzLT5zb2NrX3RpbWVvdXQp Owp9CgpzdGF0aWMgY2hhciBnZXR0aW1lb3V0X2RvY1tdID0KImdldHRpbWVvdXQoKVxuXApc blwKUmV0dXJucyB0aGUgdGltZW91dCBpbiBmbG9hdGluZyBzZWNvbmRzIGFzc29jaWF0ZWQg d2l0aCBzb2NrZXQgXG5cCm9wZXJhdGlvbnMuIEEgdGltZW91dCBvZiBOb25lIGluZGljYXRl cyB0aGF0IHRpbWVvdXRzIG9uIHNvY2tldCBcblwKb3BlcmF0aW9ucyBhcmUgZGlzYWJsZWQu IjsKCiNpZmRlZiBSSVNDT1MKLyogcy5zbGVlcHRhc2t3KDEgfCAwKSBtZXRob2QgKi8KCnN0 YXRpYyBQeU9iamVjdCAqCnNvY2tfc2xlZXB0YXNrdyhQeVNvY2tldFNvY2tPYmplY3QgKnMs UHlPYmplY3QgKmFyZ3MpCnsKCWludCBibG9jazsKCWludCBkZWxheV9mbGFnOwoJaWYgKCFQ eUFyZ19QYXJzZShhcmdzLCAiaSIsICZibG9jaykpCgkJcmV0dXJuIE5VTEw7CglQeV9CRUdJ Tl9BTExPV19USFJFQURTCglzb2NrZXRpb2N0bChzLT5zb2NrX2ZkLCAweDgwMDQ2Njc5LCAo dV9sb25nKikmYmxvY2spOwoJUHlfRU5EX0FMTE9XX1RIUkVBRFMKCglQeV9JTkNSRUYoUHlf Tm9uZSk7CglyZXR1cm4gUHlfTm9uZTsKfQpzdGF0aWMgY2hhciBzbGVlcHRhc2t3X2RvY1td ID0KInNsZWVwdGFza3coZmxhZylcblwKXG5cCkFsbG93IHNsZWVwcyBpbiB0YXNrd2luZG93 cy4iOwojZW5kaWYKCgovKiBzLnNldHNvY2tvcHQoKSBtZXRob2QuCiAgIFdpdGggYW4gaW50 ZWdlciB0aGlyZCBhcmd1bWVudCwgc2V0cyBhbiBpbnRlZ2VyIG9wdGlvbi4KICAgV2l0aCBh IHN0cmluZyB0aGlyZCBhcmd1bWVudCwgc2V0cyBhbiBvcHRpb24gZnJvbSBhIGJ1ZmZlcjsK ICAgdXNlIG9wdGlvbmFsIGJ1aWx0LWluIG1vZHVsZSAnc3RydWN0JyB0byBlbmNvZGUgdGhl IHN0cmluZy4gKi8KCnN0YXRpYyBQeU9iamVjdCAqCnNvY2tfc2V0c29ja29wdChQeVNvY2tl dFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQp7CglpbnQgbGV2ZWw7CglpbnQgb3B0 bmFtZTsKCWludCByZXM7CgljaGFyICpidWY7CglpbnQgYnVmbGVuOwoJaW50IGZsYWc7CgoJ aWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTpzZXRzb2Nrb3B0IiwKCQkJICAgICAm bGV2ZWwsICZvcHRuYW1lLCAmZmxhZykpIHsKCQlidWYgPSAoY2hhciAqKSAmZmxhZzsKCQli dWZsZW4gPSBzaXplb2YgZmxhZzsKCX0KCWVsc2UgewoJCVB5RXJyX0NsZWFyKCk7CgkJaWYg KCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaXMjOnNldHNvY2tvcHQiLAoJCQkJICAgICAg JmxldmVsLCAmb3B0bmFtZSwgJmJ1ZiwgJmJ1ZmxlbikpCgkJCXJldHVybiBOVUxMOwoJfQoJ cmVzID0gc2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwgKHZvaWQgKili dWYsIGJ1Zmxlbik7CglpZiAocmVzIDwgMCkKCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7 CglQeV9JTkNSRUYoUHlfTm9uZSk7CglyZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIGNoYXIg c2V0c29ja29wdF9kb2NbXSA9CiJzZXRzb2Nrb3B0KGxldmVsLCBvcHRpb24sIHZhbHVlKVxu XApcblwKU2V0IGEgc29ja2V0IG9wdGlvbi4gIFNlZSB0aGUgVW5peCBtYW51YWwgZm9yIGxl dmVsIGFuZCBvcHRpb24uXG5cClRoZSB2YWx1ZSBhcmd1bWVudCBjYW4gZWl0aGVyIGJlIGFu IGludGVnZXIgb3IgYSBzdHJpbmcuIjsKCgovKiBzLmdldHNvY2tvcHQoKSBtZXRob2QuCiAg IFdpdGggdHdvIGFyZ3VtZW50cywgcmV0cmlldmVzIGFuIGludGVnZXIgb3B0aW9uLgogICBX aXRoIGEgdGhpcmQgaW50ZWdlciBhcmd1bWVudCwgcmV0cmlldmVzIGEgc3RyaW5nIGJ1ZmZl ciBvZiB0aGF0IHNpemU7CiAgIHVzZSBvcHRpb25hbCBidWlsdC1pbiBtb2R1bGUgJ3N0cnVj dCcgdG8gZGVjb2RlIHRoZSBzdHJpbmcuICovCgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrX2dl dHNvY2tvcHQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKewoJaW50 IGxldmVsOwoJaW50IG9wdG5hbWU7CglpbnQgcmVzOwoJUHlPYmplY3QgKmJ1ZjsKCXNvY2ts ZW5fdCBidWZsZW4gPSAwOwoKI2lmZGVmIF9fQkVPU19fCgkvKiBXZSBoYXZlIGluY29tcGxl dGUgc29ja2V0IHN1cHBvcnQuICovCglQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAi Z2V0c29ja29wdCBub3Qgc3VwcG9ydGVkIik7CglyZXR1cm4gTlVMTDsKI2Vsc2UKCglpZiAo IVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpfGk6Z2V0c29ja29wdCIsCgkJCSAgICAgICZs ZXZlbCwgJm9wdG5hbWUsICZidWZsZW4pKQoJCXJldHVybiBOVUxMOwoKCWlmIChidWZsZW4g PT0gMCkgewoJCWludCBmbGFnID0gMDsKCQlzb2NrbGVuX3QgZmxhZ3NpemUgPSBzaXplb2Yg ZmxhZzsKCQlyZXMgPSBnZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAoJ CQkJICh2b2lkICopJmZsYWcsICZmbGFnc2l6ZSk7CgkJaWYgKHJlcyA8IDApCgkJCXJldHVy biBzLT5lcnJvcmhhbmRsZXIoKTsKCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZmxhZyk7Cgl9 CglpZiAoYnVmbGVuIDw9IDAgfHwgYnVmbGVuID4gMTAyNCkgewoJCVB5RXJyX1NldFN0cmlu Zyhzb2NrZXRfZXJyb3IsCgkJCQkiZ2V0c29ja29wdCBidWZsZW4gb3V0IG9mIHJhbmdlIik7 CgkJcmV0dXJuIE5VTEw7Cgl9CglidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgo Y2hhciAqKU5VTEwsIGJ1Zmxlbik7CglpZiAoYnVmID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7 CglyZXMgPSBnZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAoJCQkgKHZv aWQgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgJmJ1Zmxlbik7CglpZiAocmVzIDwgMCkg ewoJCVB5X0RFQ1JFRihidWYpOwoJCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKCX0KCV9Q eVN0cmluZ19SZXNpemUoJmJ1ZiwgYnVmbGVuKTsKCXJldHVybiBidWY7CiNlbmRpZiAvKiBf X0JFT1NfXyAqLwp9CgpzdGF0aWMgY2hhciBnZXRzb2Nrb3B0X2RvY1tdID0KImdldHNvY2tv cHQobGV2ZWwsIG9wdGlvblssIGJ1ZmZlcnNpemVdKSAtPiB2YWx1ZVxuXApcblwKR2V0IGEg c29ja2V0IG9wdGlvbi4gIFNlZSB0aGUgVW5peCBtYW51YWwgZm9yIGxldmVsIGFuZCBvcHRp b24uXG5cCklmIGEgbm9uemVybyBidWZmZXJzaXplIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUg cmV0dXJuIHZhbHVlIGlzIGFcblwKc3RyaW5nIG9mIHRoYXQgbGVuZ3RoOyBvdGhlcndpc2Ug aXQgaXMgYW4gaW50ZWdlci4iOwoKCi8qIHMuYmluZChzb2NrYWRkcikgbWV0aG9kICovCgpz dGF0aWMgUHlPYmplY3QgKgpzb2NrX2JpbmQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9i amVjdCAqYWRkcm8pCnsKCXN0cnVjdCBzb2NrYWRkciAqYWRkcjsKCWludCBhZGRybGVuOwoJ aW50IHJlczsKCglpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCAmYWRkciwgJmFkZHJs ZW4pKQoJCXJldHVybiBOVUxMOwoJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwoJcmVzID0gYmlu ZChzLT5zb2NrX2ZkLCBhZGRyLCBhZGRybGVuKTsKCVB5X0VORF9BTExPV19USFJFQURTCglp ZiAocmVzIDwgMCkKCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CglQeV9JTkNSRUYoUHlf Tm9uZSk7CglyZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIGNoYXIgYmluZF9kb2NbXSA9CiJi aW5kKGFkZHJlc3MpXG5cClxuXApCaW5kIHRoZSBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNz LiAgRm9yIElQIHNvY2tldHMsIHRoZSBhZGRyZXNzIGlzIGFcblwKcGFpciAoaG9zdCwgcG9y dCk7IHRoZSBob3N0IG11c3QgcmVmZXIgdG8gdGhlIGxvY2FsIGhvc3QuIEZvciByYXcgcGFj a2V0XG5cCnNvY2tldHMgdGhlIGFkZHJlc3MgaXMgYSB0dXBsZSAoaWZuYW1lLCBwcm90byBb LHBrdHR5cGUgWyxoYXR5cGVdXSkiOwoKCi8qIHMuY2xvc2UoKSBtZXRob2QuCiAgIFNldCB0 aGUgZmlsZSBkZXNjcmlwdG9yIHRvIC0xIHNvIG9wZXJhdGlvbnMgdHJpZWQgc3Vic2VxdWVu dGx5CiAgIHdpbGwgc3VyZWx5IGZhaWwuICovCgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrX2Ns b3NlKFB5U29ja2V0U29ja09iamVjdCAqcykKewoJU09DS0VUX1QgZmQ7CgoJaWYgKChmZCA9 IHMtPnNvY2tfZmQpICE9IC0xKSB7CgkJcy0+c29ja19mZCA9IC0xOwoJCVB5X0JFR0lOX0FM TE9XX1RIUkVBRFMKCQkodm9pZCkgU09DS0VUQ0xPU0UoZmQpOwoJCVB5X0VORF9BTExPV19U SFJFQURTCgl9CglQeV9JTkNSRUYoUHlfTm9uZSk7CglyZXR1cm4gUHlfTm9uZTsKfQoKc3Rh dGljIGNoYXIgY2xvc2VfZG9jW10gPQoiY2xvc2UoKVxuXApcblwKQ2xvc2UgdGhlIHNvY2tl dC4gIEl0IGNhbm5vdCBiZSB1c2VkIGFmdGVyIHRoaXMgY2FsbC4iOwoKCi8qIHMuY29ubmVj dChzb2NrYWRkcikgbWV0aG9kICovCgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrX2Nvbm5lY3Qo UHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYWRkcm8pCnsKCXN0cnVjdCBzb2Nr YWRkciAqYWRkcjsKCWludCBhZGRybGVuOwoJaW50IHJlczsKCglpZiAoIWdldHNvY2thZGRy YXJnKHMsIGFkZHJvLCAmYWRkciwgJmFkZHJsZW4pKQoJCXJldHVybiBOVUxMOwoKCWVycm5v ID0gMDsgLyogUmVzZXQgdGhlIGVyciBpbmRpY2F0b3IgZm9yIHVzZSB3aXRoIHRpbWVvdXRz ICovCgoJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwoJcmVzID0gY29ubmVjdChzLT5zb2NrX2Zk LCBhZGRyLCBhZGRybGVuKTsKCVB5X0VORF9BTExPV19USFJFQURTCgoJaWYgKHMtPnNvY2tf dGltZW91dCA+PSAwLjApIHsKCQlpZiAocmVzIDwgMCkgewoJCQkvKiBSZXR1cm4gaWYgd2Un cmUgYWxyZWFkeSBjb25uZWN0ZWQgKi8KI2lmZGVmIE1TX1dJTkRPV1MKCQkJaWYgKGVycm5v ID09IFdTQUVJTlZBTCB8fCBlcnJubyA9PSBXU0FFSVNDT05OKQojZWxzZQoJCQlpZiAoZXJy bm8gPT0gRUlTQ09OTikKI2VuZGlmCgkJCQlnb3RvIGNvbm5lY3RlZDsKCgkJCS8qIENoZWNr IGlmIHdlIGhhdmUgYW4gZXJyb3IgKi8KCQkJaWYgKCFzLT5zb2NrX2Jsb2NraW5nKQoJCQkJ cmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwoJCQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgdHJ1 ZSBmYWlsdXJlCgkJCSAgIGZvciBhIGJsb2NraW5nIHNvY2tldCAqLwojaWZkZWYgTVNfV0lO RE9XUwoJCQlpZiAoZXJybm8gIT0gV1NBRVdPVUxEQkxPQ0spCiNlbHNlCgkJCWlmIChlcnJu byAhPSBFSU5QUk9HUkVTUyAmJiBlcnJubyAhPSBFQUxSRUFEWSAmJgoJCQkgICAgZXJybm8g IT0gRVdPVUxEQkxPQ0spCiNlbmRpZgoJCQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwoJ CX0KCgkJLyogQ2hlY2sgaWYgd2UncmUgcmVhZHkgZm9yIHRoZSBjb25uZWN0IHZpYSBzZWxl Y3QgKi8KCQlpZiAoaW50ZXJuYWxfc2VsZWN0KHMsIDEpIDw9IDApCgkJCXJldHVybiBOVUxM OwoKCQkvKiBDb21wbGV0ZSB0aGUgY29ubmVjdGlvbiBub3cgKi8KCQlQeV9CRUdJTl9BTExP V19USFJFQURTCgkJcmVzID0gY29ubmVjdChzLT5zb2NrX2ZkLCBhZGRyLCBhZGRybGVuKTsK CQlQeV9FTkRfQUxMT1dfVEhSRUFEUwoJfQoKCWlmIChyZXMgPCAwKQoJCXJldHVybiBzLT5l cnJvcmhhbmRsZXIoKTsKCmNvbm5lY3RlZDoKCVB5X0lOQ1JFRihQeV9Ob25lKTsKCXJldHVy biBQeV9Ob25lOwp9CgpzdGF0aWMgY2hhciBjb25uZWN0X2RvY1tdID0KImNvbm5lY3QoYWRk cmVzcylcblwKXG5cCkNvbm5lY3QgdGhlIHNvY2tldCB0byBhIHJlbW90ZSBhZGRyZXNzLiAg Rm9yIElQIHNvY2tldHMsIHRoZSBhZGRyZXNzXG5cCmlzIGEgcGFpciAoaG9zdCwgcG9ydCku IjsKCgovKiBzLmNvbm5lY3RfZXgoc29ja2FkZHIpIG1ldGhvZCAqLwoKc3RhdGljIFB5T2Jq ZWN0ICoKc29ja19jb25uZWN0X2V4KFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3Qg KmFkZHJvKQp7CglzdHJ1Y3Qgc29ja2FkZHIgKmFkZHI7CglpbnQgYWRkcmxlbjsKCWludCBy ZXM7CgoJaWYgKCFnZXRzb2NrYWRkcmFyZyhzLCBhZGRybywgJmFkZHIsICZhZGRybGVuKSkK CQlyZXR1cm4gTlVMTDsKCgllcnJubyA9IDA7IC8qIFJlc2V0IHRoZSBlcnIgaW5kaWNhdG9y IGZvciB1c2Ugd2l0aCB0aW1lb3V0cyAqLwoKCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKCXJl cyA9IGNvbm5lY3Qocy0+c29ja19mZCwgYWRkciwgYWRkcmxlbik7CglQeV9FTkRfQUxMT1df VEhSRUFEUwoKCWlmIChzLT5zb2NrX3RpbWVvdXQgPj0gMC4wKSB7CgkJaWYgKHJlcyA8IDAp IHsKCQkJLyogUmV0dXJuIGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkICovCiNpZmRlZiBN U19XSU5ET1dTCgkJCWlmIChlcnJubyA9PSBXU0FFSU5WQUwgfHwgZXJybm8gPT0gV1NBRUlT Q09OTikKI2Vsc2UKCQkJaWYgKGVycm5vID09IEVJU0NPTk4pCiNlbmRpZgoJCQkJZ290byBj b25leF9maW5hbGx5OwoKCQkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbiBlcnJvciAqLwoJCQlp ZiAoIXMtPnNvY2tfYmxvY2tpbmcpCgkJCQlnb3RvIGNvbmV4X2ZpbmFsbHk7CgkJCS8qIENo ZWNrIGlmIHdlIGhhdmUgYSB0cnVlIGZhaWx1cmUKCQkJICAgZm9yIGEgYmxvY2tpbmcgc29j a2V0ICovCiNpZmRlZiBNU19XSU5ET1dTCgkJCWlmIChlcnJubyAhPSBXU0FFV09VTERCTE9D SykKI2Vsc2UKCQkJaWYgKGVycm5vICE9IEVJTlBST0dSRVNTICYmIGVycm5vICE9IEVBTFJF QURZICYmCgkJCSAgICBlcnJubyAhPSBFV09VTERCTE9DSykKI2VuZGlmCgkJCQlnb3RvIGNv bmV4X2ZpbmFsbHk7CgkJfQoKCQkvKiBDaGVjayBpZiB3ZSdyZSByZWFkeSBmb3IgdGhlIGNv bm5lY3QgdmlhIHNlbGVjdCAqLwoJCWlmIChpbnRlcm5hbF9zZWxlY3QocywgMSkgPD0gMCkK CQkJcmV0dXJuIE5VTEw7CgoJCS8qIENvbXBsZXRlIHRoZSBjb25uZWN0aW9uIG5vdyAqLwoJ CVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKCQlyZXMgPSBjb25uZWN0KHMtPnNvY2tfZmQsIGFk ZHIsIGFkZHJsZW4pOwoJCVB5X0VORF9BTExPV19USFJFQURTCgl9CgoJaWYgKHJlcyAhPSAw KSB7CiNpZmRlZiBNU19XSU5ET1dTCgkJcmVzID0gV1NBR2V0TGFzdEVycm9yKCk7CiNlbHNl CgkJcmVzID0gZXJybm87CiNlbmRpZgoJfQoKY29uZXhfZmluYWxseToKCXJldHVybiBQeUlu dF9Gcm9tTG9uZygobG9uZykgcmVzKTsKfQoKc3RhdGljIGNoYXIgY29ubmVjdF9leF9kb2Nb XSA9CiJjb25uZWN0X2V4KGFkZHJlc3MpXG5cClxuXApUaGlzIGlzIGxpa2UgY29ubmVjdChh ZGRyZXNzKSwgYnV0IHJldHVybnMgYW4gZXJyb3IgY29kZSAodGhlIGVycm5vIHZhbHVlKVxu XAppbnN0ZWFkIG9mIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJz LiI7CgoKLyogcy5maWxlbm8oKSBtZXRob2QgKi8KCnN0YXRpYyBQeU9iamVjdCAqCnNvY2tf ZmlsZW5vKFB5U29ja2V0U29ja09iamVjdCAqcykKewojaWYgU0laRU9GX1NPQ0tFVF9UIDw9 IFNJWkVPRl9MT05HCglyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHMtPnNvY2tfZmQp OwojZWxzZQoJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKExPTkdfTE9ORylzLT5zb2Nr X2ZkKTsKI2VuZGlmCn0KCnN0YXRpYyBjaGFyIGZpbGVub19kb2NbXSA9CiJmaWxlbm8oKSAt PiBpbnRlZ2VyXG5cClxuXApSZXR1cm4gdGhlIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIG9m IHRoZSBzb2NrZXQuIjsKCgojaWZuZGVmIE5PX0RVUAovKiBzLmR1cCgpIG1ldGhvZCAqLwoK c3RhdGljIFB5T2JqZWN0ICoKc29ja19kdXAoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQp7CglT T0NLRVRfVCBuZXdmZDsKCVB5T2JqZWN0ICpzb2NrOwoKCW5ld2ZkID0gZHVwKHMtPnNvY2tf ZmQpOwoJaWYgKG5ld2ZkIDwgMCkKCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Cglzb2Nr ID0gKFB5T2JqZWN0ICopIG5ld19zb2Nrb2JqZWN0KG5ld2ZkLAoJCQkJCSAgIHMtPnNvY2tf ZmFtaWx5LAoJCQkJCSAgIHMtPnNvY2tfdHlwZSwKCQkJCQkgICBzLT5zb2NrX3Byb3RvKTsK CWlmIChzb2NrID09IE5VTEwpCgkJU09DS0VUQ0xPU0UobmV3ZmQpOwoJcmV0dXJuIHNvY2s7 Cn0KCnN0YXRpYyBjaGFyIGR1cF9kb2NbXSA9CiJkdXAoKSAtPiBzb2NrZXQgb2JqZWN0XG5c ClxuXApSZXR1cm4gYSBuZXcgc29ja2V0IG9iamVjdCBjb25uZWN0ZWQgdG8gdGhlIHNhbWUg c3lzdGVtIHJlc291cmNlLiI7CgojZW5kaWYKCgovKiBzLmdldHNvY2tuYW1lKCkgbWV0aG9k ICovCgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrX2dldHNvY2tuYW1lKFB5U29ja2V0U29ja09i amVjdCAqcykKewoJY2hhciBhZGRyYnVmWzI1Nl07CglpbnQgcmVzOwoJc29ja2xlbl90IGFk ZHJsZW47CgoJaWYgKCFnZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCgkJcmV0dXJuIE5V TEw7CgltZW1zZXQoYWRkcmJ1ZiwgMCwgYWRkcmxlbik7CglQeV9CRUdJTl9BTExPV19USFJF QURTCglyZXMgPSBnZXRzb2NrbmFtZShzLT5zb2NrX2ZkLCAoc3RydWN0IHNvY2thZGRyICop IGFkZHJidWYsICZhZGRybGVuKTsKCVB5X0VORF9BTExPV19USFJFQURTCglpZiAocmVzIDwg MCkKCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CglyZXR1cm4gbWFrZXNvY2thZGRyKHMt PnNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcmJ1ZiwgYWRkcmxlbik7Cn0KCnN0 YXRpYyBjaGFyIGdldHNvY2tuYW1lX2RvY1tdID0KImdldHNvY2tuYW1lKCkgLT4gYWRkcmVz cyBpbmZvXG5cClxuXApSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2FsIGVuZHBvaW50 LiAgRm9yIElQIHNvY2tldHMsIHRoZSBhZGRyZXNzXG5cCmluZm8gaXMgYSBwYWlyIChob3N0 YWRkciwgcG9ydCkuIjsKCgojaWZkZWYgSEFWRV9HRVRQRUVSTkFNRQkJLyogQ3JheSBBUFAg ZG9lc24ndCBoYXZlIHRoaXMgOi0oICovCi8qIHMuZ2V0cGVlcm5hbWUoKSBtZXRob2QgKi8K CnN0YXRpYyBQeU9iamVjdCAqCnNvY2tfZ2V0cGVlcm5hbWUoUHlTb2NrZXRTb2NrT2JqZWN0 ICpzKQp7CgljaGFyIGFkZHJidWZbMjU2XTsKCWludCByZXM7Cglzb2NrbGVuX3QgYWRkcmxl bjsKCglpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKCQlyZXR1cm4gTlVMTDsK CW1lbXNldChhZGRyYnVmLCAwLCBhZGRybGVuKTsKCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMK CXJlcyA9IGdldHBlZXJuYW1lKHMtPnNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRk cmJ1ZiwgJmFkZHJsZW4pOwoJUHlfRU5EX0FMTE9XX1RIUkVBRFMKCWlmIChyZXMgPCAwKQoJ CXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKCXJldHVybiBtYWtlc29ja2FkZHIocy0+c29j a19mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSBhZGRyYnVmLCBhZGRybGVuKTsKfQoKc3RhdGlj IGNoYXIgZ2V0cGVlcm5hbWVfZG9jW10gPQoiZ2V0cGVlcm5hbWUoKSAtPiBhZGRyZXNzIGlu Zm9cblwKXG5cClJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGVuZHBvaW50LiAg Rm9yIElQIHNvY2tldHMsIHRoZSBhZGRyZXNzXG5cCmluZm8gaXMgYSBwYWlyIChob3N0YWRk ciwgcG9ydCkuIjsKCiNlbmRpZiAvKiBIQVZFX0dFVFBFRVJOQU1FICovCgoKLyogcy5saXN0 ZW4obikgbWV0aG9kICovCgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrX2xpc3RlbihQeVNvY2tl dFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmcpCnsKCWludCBiYWNrbG9nOwoJaW50IHJl czsKCgliYWNrbG9nID0gUHlJbnRfQXNMb25nKGFyZyk7CglpZiAoYmFja2xvZyA9PSAtMSAm JiBQeUVycl9PY2N1cnJlZCgpKQoJCXJldHVybiBOVUxMOwoJUHlfQkVHSU5fQUxMT1dfVEhS RUFEUwoJaWYgKGJhY2tsb2cgPCAxKQoJCWJhY2tsb2cgPSAxOwoJcmVzID0gbGlzdGVuKHMt PnNvY2tfZmQsIGJhY2tsb2cpOwoJUHlfRU5EX0FMTE9XX1RIUkVBRFMKCWlmIChyZXMgPCAw KQoJCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKCVB5X0lOQ1JFRihQeV9Ob25lKTsKCXJl dHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgY2hhciBsaXN0ZW5fZG9jW10gPQoibGlzdGVuKGJh Y2tsb2cpXG5cClxuXApFbmFibGUgYSBzZXJ2ZXIgdG8gYWNjZXB0IGNvbm5lY3Rpb25zLiAg VGhlIGJhY2tsb2cgYXJndW1lbnQgbXVzdCBiZSBhdFxuXApsZWFzdCAxOyBpdCBzcGVjaWZp ZXMgdGhlIG51bWJlciBvZiB1bmFjY2VwdGVkIGNvbm5lY3Rpb24gdGhhdCB0aGUgc3lzdGVt XG5cCndpbGwgYWxsb3cgYmVmb3JlIHJlZnVzaW5nIG5ldyBjb25uZWN0aW9ucy4iOwoKCiNp Zm5kZWYgTk9fRFVQCi8qIHMubWFrZWZpbGUobW9kZSkgbWV0aG9kLgogICBDcmVhdGUgYSBu ZXcgb3BlbiBmaWxlIG9iamVjdCByZWZlcnJpbmcgdG8gYSBkdXBwZWQgdmVyc2lvbiBvZgog ICB0aGUgc29ja2V0J3MgZmlsZSBkZXNjcmlwdG9yLiAgKFRoZSBkdXAoKSBjYWxsIGlzIG5l Y2Vzc2FyeSBzbwogICB0aGF0IHRoZSBvcGVuIGZpbGUgYW5kIHNvY2tldCBvYmplY3RzIG1h eSBiZSBjbG9zZWQgaW5kZXBlbmRlbnQKICAgb2YgZWFjaCBvdGhlci4pCiAgIFRoZSBtb2Rl IGFyZ3VtZW50IHNwZWNpZmllcyAncicgb3IgJ3cnIHBhc3NlZCB0byBmZG9wZW4oKS4gKi8K CnN0YXRpYyBQeU9iamVjdCAqCnNvY2tfbWFrZWZpbGUoUHlTb2NrZXRTb2NrT2JqZWN0ICpz LCBQeU9iamVjdCAqYXJncykKewoJZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqKTsKCWNoYXIg Km1vZGUgPSAiciI7CglpbnQgYnVmc2l6ZSA9IC0xOwojaWZkZWYgTVNfV0lOMzIKCVB5X2lu dHB0cl90IGZkOwojZWxzZQoJaW50IGZkOwojZW5kaWYKCUZJTEUgKmZwOwoJUHlPYmplY3Qg KmY7CgoJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8c2k6bWFrZWZpbGUiLCAmbW9k ZSwgJmJ1ZnNpemUpKQoJCXJldHVybiBOVUxMOwojaWZkZWYgTVNfV0lOMzIKCWlmICgoKGZk ID0gX29wZW5fb3NmaGFuZGxlKHMtPnNvY2tfZmQsIF9PX0JJTkFSWSkpIDwgMCkgfHwKCSAg ICAoKGZkID0gZHVwKGZkKSkgPCAwKSB8fCAoKGZwID0gZmRvcGVuKGZkLCBtb2RlKSkgPT0g TlVMTCkpCiNlbHNlCglpZiAoKGZkID0gZHVwKHMtPnNvY2tfZmQpKSA8IDAgfHwgKGZwID0g ZmRvcGVuKGZkLCBtb2RlKSkgPT0gTlVMTCkKI2VuZGlmCgl7CgkJaWYgKGZkID49IDApCgkJ CVNPQ0tFVENMT1NFKGZkKTsKCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Cgl9CiNpZmRl ZiBVU0VfR1VTSTIKCS8qIFdvcmthcm91bmQgZm9yIGJ1ZyBpbiBNZXRyb3dlcmtzIE1TTCB2 cy4gR1VTSSBJL08gbGlicmFyeSAqLwoJaWYgKHN0cmNocihtb2RlLCAnYicpICE9IE5VTEwp CgkJYnVmc2l6ZSA9IDA7CiNlbmRpZgoJZiA9IFB5RmlsZV9Gcm9tRmlsZShmcCwgIjxzb2Nr ZXQ+IiwgbW9kZSwgZmNsb3NlKTsKCWlmIChmICE9IE5VTEwpCgkJUHlGaWxlX1NldEJ1ZlNp emUoZiwgYnVmc2l6ZSk7CglyZXR1cm4gZjsKfQoKc3RhdGljIGNoYXIgbWFrZWZpbGVfZG9j W10gPQoibWFrZWZpbGUoW21vZGVbLCBidWZmZXJzaXplXV0pIC0+IGZpbGUgb2JqZWN0XG5c ClxuXApSZXR1cm4gYSByZWd1bGFyIGZpbGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhl IHNvY2tldC5cblwKVGhlIG1vZGUgYW5kIGJ1ZmZlcnNpemUgYXJndW1lbnRzIGFyZSBhcyBm b3IgdGhlIGJ1aWx0LWluIG9wZW4oKSBmdW5jdGlvbi4iOwoKI2VuZGlmIC8qIE5PX0RVUCAq LwoKCi8qIHMucmVjdihuYnl0ZXMgWyxmbGFnc10pIG1ldGhvZCAqLwoKc3RhdGljIFB5T2Jq ZWN0ICoKc29ja19yZWN2KFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3Mp CnsKCWludCBsZW4sIG4sIGZsYWdzID0gMDsKCVB5T2JqZWN0ICpidWY7CgoJaWYgKCFQeUFy Z19QYXJzZVR1cGxlKGFyZ3MsICJpfGk6cmVjdiIsICZsZW4sICZmbGFncykpCgkJcmV0dXJu IE5VTEw7CgoJaWYgKGxlbiA8IDApIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVF cnJvciwKCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIGNvbm5lY3QiKTsKCQlyZXR1cm4g TlVMTDsKCX0KCglidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAw LCBsZW4pOwoJaWYgKGJ1ZiA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoKCWlmIChzLT5zb2Nr X3RpbWVvdXQgPj0gMC4wKSB7CgkJaWYgKHMtPnNvY2tfYmxvY2tpbmcpIHsKCQkJaWYgKGlu dGVybmFsX3NlbGVjdChzLCAwKSA8PSAwKQoJCQkJcmV0dXJuIE5VTEw7CgkJfQoJfQoKCVB5 X0JFR0lOX0FMTE9XX1RIUkVBRFMKCW4gPSByZWN2KHMtPnNvY2tfZmQsIFB5U3RyaW5nX0FT X1NUUklORyhidWYpLCBsZW4sIGZsYWdzKTsKCVB5X0VORF9BTExPV19USFJFQURTCgoJaWYg KG4gPCAwKSB7CgkJUHlfREVDUkVGKGJ1Zik7CgkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigp OwoJfQoJaWYgKG4gIT0gbGVuKQoJCV9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgbik7CglyZXR1 cm4gYnVmOwp9CgpzdGF0aWMgY2hhciByZWN2X2RvY1tdID0KInJlY3YoYnVmZmVyc2l6ZVss IGZsYWdzXSkgLT4gZGF0YVxuXApcblwKUmVjZWl2ZSB1cCB0byBidWZmZXJzaXplIGJ5dGVz IGZyb20gdGhlIHNvY2tldC4gIEZvciB0aGUgb3B0aW9uYWwgZmxhZ3NcblwKYXJndW1lbnQs IHNlZSB0aGUgVW5peCBtYW51YWwuICBXaGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlLCBibG9j ayB1bnRpbFxuXAphdCBsZWFzdCBvbmUgYnl0ZSBpcyBhdmFpbGFibGUgb3IgdW50aWwgdGhl IHJlbW90ZSBlbmQgaXMgY2xvc2VkLiAgV2hlblxuXAp0aGUgcmVtb3RlIGVuZCBpcyBjbG9z ZWQgYW5kIGFsbCBkYXRhIGlzIHJlYWQsIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLiI7CgoK Lyogcy5yZWN2ZnJvbShuYnl0ZXMgWyxmbGFnc10pIG1ldGhvZCAqLwoKc3RhdGljIFB5T2Jq ZWN0ICoKc29ja19yZWN2ZnJvbShQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICph cmdzKQp7CgljaGFyIGFkZHJidWZbMjU2XTsKCVB5T2JqZWN0ICpidWYgPSBOVUxMOwoJUHlP YmplY3QgKmFkZHIgPSBOVUxMOwoJUHlPYmplY3QgKnJldCA9IE5VTEw7CglpbnQgbGVuLCBu LCBmbGFncyA9IDA7Cglzb2NrbGVuX3QgYWRkcmxlbjsKCglpZiAoIVB5QXJnX1BhcnNlVHVw bGUoYXJncywgIml8aTpyZWN2ZnJvbSIsICZsZW4sICZmbGFncykpCgkJcmV0dXJuIE5VTEw7 CgoJaWYgKCFnZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCgkJcmV0dXJuIE5VTEw7Cgli dWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAwLCBsZW4pOwoJaWYg KGJ1ZiA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoKCWlmIChzLT5zb2NrX3RpbWVvdXQgPj0g MC4wKSB7CgkJaWYgKHMtPnNvY2tfYmxvY2tpbmcpIHsKCQkJaWYgKGludGVybmFsX3NlbGVj dChzLCAwKSA8PSAwKQoJCQkJcmV0dXJuIE5VTEw7CgkJfQoJfQoKCVB5X0JFR0lOX0FMTE9X X1RIUkVBRFMKCW1lbXNldChhZGRyYnVmLCAwLCBhZGRybGVuKTsKCW4gPSByZWN2ZnJvbShz LT5zb2NrX2ZkLCBQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgbGVuLCBmbGFncywKI2lmbmRl ZiBNU19XSU5ET1dTCiNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiAhZGVmaW5lZChQWUNDX0dD QykKCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyYnVmLCAmYWRkcmxlbgojZWxzZQoJ CSAgICAgKHZvaWQgKilhZGRyYnVmLCAmYWRkcmxlbgojZW5kaWYKI2Vsc2UKCQkgICAgIChz dHJ1Y3Qgc29ja2FkZHIgKilhZGRyYnVmLCAmYWRkcmxlbgojZW5kaWYKCQkgICAgICk7CglQ eV9FTkRfQUxMT1dfVEhSRUFEUwoKCWlmIChuIDwgMCkgewoJCVB5X0RFQ1JFRihidWYpOwoJ CXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKCX0KCglpZiAobiAhPSBsZW4gJiYgX1B5U3Ry aW5nX1Jlc2l6ZSgmYnVmLCBuKSA8IDApCgkJcmV0dXJuIE5VTEw7CgoJaWYgKCEoYWRkciA9 IG1ha2Vzb2NrYWRkcihzLT5zb2NrX2ZkLCAoc3RydWN0IHNvY2thZGRyICopYWRkcmJ1ZiwK CQkJCSAgYWRkcmxlbikpKQoJCWdvdG8gZmluYWxseTsKCglyZXQgPSBQeV9CdWlsZFZhbHVl KCJPTyIsIGJ1ZiwgYWRkcik7CgpmaW5hbGx5OgoJUHlfWERFQ1JFRihhZGRyKTsKCVB5X1hE RUNSRUYoYnVmKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBjaGFyIHJlY3Zmcm9tX2RvY1td ID0KInJlY3Zmcm9tKGJ1ZmZlcnNpemVbLCBmbGFnc10pIC0+IChkYXRhLCBhZGRyZXNzIGlu Zm8pXG5cClxuXApMaWtlIHJlY3YoYnVmZmVyc2l6ZSwgZmxhZ3MpIGJ1dCBhbHNvIHJldHVy biB0aGUgc2VuZGVyJ3MgYWRkcmVzcyBpbmZvLiI7CgovKiBzLnNlbmQoZGF0YSBbLGZsYWdz XSkgbWV0aG9kICovCgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrX3NlbmQoUHlTb2NrZXRTb2Nr T2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKewoJY2hhciAqYnVmOwoJaW50IGxlbiwgbiwg ZmxhZ3MgPSAwOwoKCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aTpzZW5kIiwg JmJ1ZiwgJmxlbiwgJmZsYWdzKSkKCQlyZXR1cm4gTlVMTDsKCglpZiAocy0+c29ja190aW1l b3V0ID49IDAuMCkgewoJCWlmIChzLT5zb2NrX2Jsb2NraW5nKSB7CgkJCWlmIChpbnRlcm5h bF9zZWxlY3QocywgMSkgPD0gMCkKCQkJCXJldHVybiBOVUxMOwoJCX0KCX0KCglQeV9CRUdJ Tl9BTExPV19USFJFQURTCgluID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3Mp OwoJUHlfRU5EX0FMTE9XX1RIUkVBRFMKCglpZiAobiA8IDApCgkJcmV0dXJuIHMtPmVycm9y aGFuZGxlcigpOwoJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKW4pOwp9CgpzdGF0aWMg Y2hhciBzZW5kX2RvY1tdID0KInNlbmQoZGF0YVssIGZsYWdzXSkgLT4gY291bnRcblwKXG5c ClNlbmQgYSBkYXRhIHN0cmluZyB0byB0aGUgc29ja2V0LiAgRm9yIHRoZSBvcHRpb25hbCBm bGFnc1xuXAphcmd1bWVudCwgc2VlIHRoZSBVbml4IG1hbnVhbC4gIFJldHVybiB0aGUgbnVt YmVyIG9mIGJ5dGVzXG5cCnNlbnQ7IHRoaXMgbWF5IGJlIGxlc3MgdGhhbiBsZW4oZGF0YSkg aWYgdGhlIG5ldHdvcmsgaXMgYnVzeS4iOwoKCi8qIHMuc2VuZGFsbChkYXRhIFssZmxhZ3Nd KSBtZXRob2QgKi8KCnN0YXRpYyBQeU9iamVjdCAqCnNvY2tfc2VuZGFsbChQeVNvY2tldFNv Y2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQp7CgljaGFyICpidWY7CglpbnQgbGVuLCBu LCBmbGFncyA9IDA7CgoJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xpOnNlbmRh bGwiLCAmYnVmLCAmbGVuLCAmZmxhZ3MpKQoJCXJldHVybiBOVUxMOwoKCWlmIChzLT5zb2Nr X3RpbWVvdXQgPj0gMC4wKSB7CgkJaWYgKHMtPnNvY2tfYmxvY2tpbmcpIHsKCQkJaWYgKGlu dGVybmFsX3NlbGVjdChzLCAxKSA8PSAwKQoJCQkJcmV0dXJuIE5VTEw7CgkJfQoJfQoKCVB5 X0JFR0lOX0FMTE9XX1RIUkVBRFMKCWRvIHsKCQluID0gc2VuZChzLT5zb2NrX2ZkLCBidWYs IGxlbiwgZmxhZ3MpOwoJCWlmIChuIDwgMCkKCQkJYnJlYWs7CgkJYnVmICs9IG47CgkJbGVu IC09IG47Cgl9IHdoaWxlIChsZW4gPiAwKTsKCVB5X0VORF9BTExPV19USFJFQURTCgoJaWYg KG4gPCAwKQoJCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKCglQeV9JTkNSRUYoUHlfTm9u ZSk7CglyZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIGNoYXIgc2VuZGFsbF9kb2NbXSA9CiJz ZW5kYWxsKGRhdGFbLCBmbGFnc10pXG5cClxuXApTZW5kIGEgZGF0YSBzdHJpbmcgdG8gdGhl IHNvY2tldC4gIEZvciB0aGUgb3B0aW9uYWwgZmxhZ3NcblwKYXJndW1lbnQsIHNlZSB0aGUg VW5peCBtYW51YWwuICBUaGlzIGNhbGxzIHNlbmQoKSByZXBlYXRlZGx5XG5cCnVudGlsIGFs bCBkYXRhIGlzIHNlbnQuICBJZiBhbiBlcnJvciBvY2N1cnMsIGl0J3MgaW1wb3NzaWJsZVxu XAp0byB0ZWxsIGhvdyBtdWNoIGRhdGEgaGFzIGJlZW4gc2VudC4iOwoKCi8qIHMuc2VuZHRv KGRhdGEsIFtmbGFncyxdIHNvY2thZGRyKSBtZXRob2QgKi8KCnN0YXRpYyBQeU9iamVjdCAq CnNvY2tfc2VuZHRvKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MpCnsK CVB5T2JqZWN0ICphZGRybzsKCWNoYXIgKmJ1ZjsKCXN0cnVjdCBzb2NrYWRkciAqYWRkcjsK CWludCBhZGRybGVuLCBsZW4sIG4sIGZsYWdzOwoKCWZsYWdzID0gMDsKCWlmICghUHlBcmdf UGFyc2VUdXBsZShhcmdzLCAicyNPOnNlbmR0byIsICZidWYsICZsZW4sICZhZGRybykpIHsK CQlQeUVycl9DbGVhcigpOwoJCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpTzpz ZW5kdG8iLAoJCQkJICAgICAgJmJ1ZiwgJmxlbiwgJmZsYWdzLCAmYWRkcm8pKQoJCQlyZXR1 cm4gTlVMTDsKCX0KCglpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCAmYWRkciwgJmFk ZHJsZW4pKQoJCXJldHVybiBOVUxMOwoKCWlmIChzLT5zb2NrX3RpbWVvdXQgPj0gMC4wKSB7 CgkJaWYgKHMtPnNvY2tfYmxvY2tpbmcpIHsKCQkJaWYgKGludGVybmFsX3NlbGVjdChzLCAx KSA8PSAwKQoJCQkJcmV0dXJuIE5VTEw7CgkJfQoJfQoKCVB5X0JFR0lOX0FMTE9XX1RIUkVB RFMKCW4gPSBzZW5kdG8ocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzLCBhZGRyLCBhZGRy bGVuKTsKCVB5X0VORF9BTExPV19USFJFQURTCgoJaWYgKG4gPCAwKQoJCXJldHVybiBzLT5l cnJvcmhhbmRsZXIoKTsKCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyluKTsKfQoKc3Rh dGljIGNoYXIgc2VuZHRvX2RvY1tdID0KInNlbmR0byhkYXRhWywgZmxhZ3NdLCBhZGRyZXNz KVxuXApcblwKTGlrZSBzZW5kKGRhdGEsIGZsYWdzKSBidXQgYWxsb3dzIHNwZWNpZnlpbmcg dGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MuXG5cCkZvciBJUCBzb2NrZXRzLCB0aGUgYWRkcmVz cyBpcyBhIHBhaXIgKGhvc3RhZGRyLCBwb3J0KS4iOwoKCi8qIHMuc2h1dGRvd24oaG93KSBt ZXRob2QgKi8KCnN0YXRpYyBQeU9iamVjdCAqCnNvY2tfc2h1dGRvd24oUHlTb2NrZXRTb2Nr T2JqZWN0ICpzLCBQeU9iamVjdCAqYXJnKQp7CglpbnQgaG93OwoJaW50IHJlczsKCglob3cg PSBQeUludF9Bc0xvbmcoYXJnKTsKCWlmIChob3cgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQo KSkKCQlyZXR1cm4gTlVMTDsKCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKCXJlcyA9IHNodXRk b3duKHMtPnNvY2tfZmQsIGhvdyk7CglQeV9FTkRfQUxMT1dfVEhSRUFEUwoJaWYgKHJlcyA8 IDApCgkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwoJUHlfSU5DUkVGKFB5X05vbmUpOwoJ cmV0dXJuIFB5X05vbmU7Cn0KCnN0YXRpYyBjaGFyIHNodXRkb3duX2RvY1tdID0KInNodXRk b3duKGZsYWcpXG5cClxuXApTaHV0IGRvd24gdGhlIHJlYWRpbmcgc2lkZSBvZiB0aGUgc29j a2V0IChmbGFnID09IDApLCB0aGUgd3JpdGluZyBzaWRlXG5cCm9mIHRoZSBzb2NrZXQgKGZs YWcgPT0gMSksIG9yIGJvdGggZW5kcyAoZmxhZyA9PSAyKS4iOwoKCi8qIExpc3Qgb2YgbWV0 aG9kcyBmb3Igc29ja2V0IG9iamVjdHMgKi8KCnN0YXRpYyBQeU1ldGhvZERlZiBzb2NrX21l dGhvZHNbXSA9IHsKCXsiYWNjZXB0IiwJKFB5Q0Z1bmN0aW9uKXNvY2tfYWNjZXB0LCBNRVRI X05PQVJHUywKCQkJYWNjZXB0X2RvY30sCgl7ImJpbmQiLAkoUHlDRnVuY3Rpb24pc29ja19i aW5kLCBNRVRIX08sCgkJCWJpbmRfZG9jfSwKCXsiY2xvc2UiLAkoUHlDRnVuY3Rpb24pc29j a19jbG9zZSwgTUVUSF9OT0FSR1MsCgkJCWNsb3NlX2RvY30sCgl7ImNvbm5lY3QiLAkoUHlD RnVuY3Rpb24pc29ja19jb25uZWN0LCBNRVRIX08sCgkJCWNvbm5lY3RfZG9jfSwKCXsiY29u bmVjdF9leCIsCShQeUNGdW5jdGlvbilzb2NrX2Nvbm5lY3RfZXgsIE1FVEhfTywKCQkJY29u bmVjdF9leF9kb2N9LAojaWZuZGVmIE5PX0RVUAoJeyJkdXAiLAkJKFB5Q0Z1bmN0aW9uKXNv Y2tfZHVwLCBNRVRIX05PQVJHUywKCQkJZHVwX2RvY30sCiNlbmRpZgoJeyJmaWxlbm8iLAko UHlDRnVuY3Rpb24pc29ja19maWxlbm8sIE1FVEhfTk9BUkdTLAoJCQlmaWxlbm9fZG9jfSwK I2lmZGVmIEhBVkVfR0VUUEVFUk5BTUUKCXsiZ2V0cGVlcm5hbWUiLAkoUHlDRnVuY3Rpb24p c29ja19nZXRwZWVybmFtZSwKCQkJTUVUSF9OT0FSR1MsIGdldHBlZXJuYW1lX2RvY30sCiNl bmRpZgoJeyJnZXRzb2NrbmFtZSIsCShQeUNGdW5jdGlvbilzb2NrX2dldHNvY2tuYW1lLAoJ CQlNRVRIX05PQVJHUywgZ2V0c29ja25hbWVfZG9jfSwKCXsiZ2V0c29ja29wdCIsCShQeUNG dW5jdGlvbilzb2NrX2dldHNvY2tvcHQsIE1FVEhfVkFSQVJHUywKCQkJZ2V0c29ja29wdF9k b2N9LAoJeyJsaXN0ZW4iLAkoUHlDRnVuY3Rpb24pc29ja19saXN0ZW4sIE1FVEhfTywKCQkJ bGlzdGVuX2RvY30sCiNpZm5kZWYgTk9fRFVQCgl7Im1ha2VmaWxlIiwJKFB5Q0Z1bmN0aW9u KXNvY2tfbWFrZWZpbGUsIE1FVEhfVkFSQVJHUywKCQkJbWFrZWZpbGVfZG9jfSwKI2VuZGlm Cgl7InJlY3YiLAkoUHlDRnVuY3Rpb24pc29ja19yZWN2LCBNRVRIX1ZBUkFSR1MsCgkJCXJl Y3ZfZG9jfSwKCXsicmVjdmZyb20iLAkoUHlDRnVuY3Rpb24pc29ja19yZWN2ZnJvbSwgTUVU SF9WQVJBUkdTLAoJCQlyZWN2ZnJvbV9kb2N9LAoJeyJzZW5kIiwJKFB5Q0Z1bmN0aW9uKXNv Y2tfc2VuZCwgTUVUSF9WQVJBUkdTLAoJCQlzZW5kX2RvY30sCgl7InNlbmRhbGwiLAkoUHlD RnVuY3Rpb24pc29ja19zZW5kYWxsLCBNRVRIX1ZBUkFSR1MsCgkJCXNlbmRhbGxfZG9jfSwK CXsic2VuZHRvIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZHRvLCBNRVRIX1ZBUkFSR1MsCgkJ CXNlbmR0b19kb2N9LAoJeyJzZXRibG9ja2luZyIsCShQeUNGdW5jdGlvbilzb2NrX3NldGJs b2NraW5nLCBNRVRIX08sCgkJCXNldGJsb2NraW5nX2RvY30sCgl7InNldHRpbWVvdXQiLCAo UHlDRnVuY3Rpb24pc29ja19zZXR0aW1lb3V0LCBNRVRIX08sCgkJCXNldHRpbWVvdXRfZG9j fSwKCXsiZ2V0dGltZW91dCIsIChQeUNGdW5jdGlvbilzb2NrX2dldHRpbWVvdXQsIE1FVEhf Tk9BUkdTLAoJCQlnZXR0aW1lb3V0X2RvY30sCgl7InNldHNvY2tvcHQiLAkoUHlDRnVuY3Rp b24pc29ja19zZXRzb2Nrb3B0LCBNRVRIX1ZBUkFSR1MsCgkJCXNldHNvY2tvcHRfZG9jfSwK CXsic2h1dGRvd24iLAkoUHlDRnVuY3Rpb24pc29ja19zaHV0ZG93biwgTUVUSF9PLAoJCQlz aHV0ZG93bl9kb2N9LAojaWZkZWYgUklTQ09TCgl7InNsZWVwdGFza3ciLAkoUHlDRnVuY3Rp b24pc29ja19zbGVlcHRhc2t3LCBNRVRIX1ZBUkFSR1MsCgkgCQlzbGVlcHRhc2t3X2RvY30s CiNlbmRpZgoJe05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCn07CgoKLyogRGVhbGxv Y2F0ZSBhIHNvY2tldCBvYmplY3QgaW4gcmVzcG9uc2UgdG8gdGhlIGxhc3QgUHlfREVDUkVG KCkuCiAgIEZpcnN0IGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0aW9uLiAqLwoKc3RhdGljIHZv aWQKc29ja19kZWFsbG9jKFB5U29ja2V0U29ja09iamVjdCAqcykKewoJaWYgKHMtPnNvY2tf ZmQgIT0gLTEpCgkJKHZvaWQpIFNPQ0tFVENMT1NFKHMtPnNvY2tfZmQpOwoJcy0+b2JfdHlw ZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzKTsKfQoKCnN0YXRpYyBQeU9iamVjdCAqCnNvY2tf cmVwcihQeVNvY2tldFNvY2tPYmplY3QgKnMpCnsKCWNoYXIgYnVmWzUxMl07CiNpZiBTSVpF T0ZfU09DS0VUX1QgPiBTSVpFT0ZfTE9ORwoJaWYgKHMtPnNvY2tfZmQgPiBMT05HX01BWCkg ewoJCS8qIHRoaXMgY2FuIG9jY3VyIG9uIFdpbjY0LCBhbmQgYWN0dWFsbHkgdGhlcmUgaXMg YSBzcGVjaWFsCgkJICAgdWdseSBwcmludGYgZm9ybWF0dGVyIGZvciBkZWNpbWFsIHBvaW50 ZXIgbGVuZ3RoIGludGVnZXIKCQkgICBwcmludGluZywgb25seSBib3RoZXIgaWYgbmVjZXNz YXJ5Ki8KCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKCQkJCSJubyBw cmludGYgZm9ybWF0dGVyIHRvIGRpc3BsYXkgIgoJCQkJInRoZSBzb2NrZXQgZGVzY3JpcHRv ciBpbiBkZWNpbWFsIik7CgkJcmV0dXJuIE5VTEw7Cgl9CiNlbmRpZgoJUHlPU19zbnByaW50 ZigKCQlidWYsIHNpemVvZihidWYpLAoJCSI8c29ja2V0IG9iamVjdCwgZmQ9JWxkLCBmYW1p bHk9JWQsIHR5cGU9JWQsIHByb3RvY29sPSVkPiIsCgkJKGxvbmcpcy0+c29ja19mZCwgcy0+ c29ja19mYW1pbHksCgkJcy0+c29ja190eXBlLAoJCXMtPnNvY2tfcHJvdG8pOwoJcmV0dXJu IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKfQoKCi8qIENyZWF0ZSBhIG5ldywgdW5pbml0 aWFsaXplZCBzb2NrZXQgb2JqZWN0LiAqLwoKc3RhdGljIFB5T2JqZWN0ICoKc29ja19uZXco UHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCnsK CVB5T2JqZWN0ICpuZXc7CgoJbmV3ID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CglpZiAo bmV3ICE9IE5VTEwpIHsKCQkoKFB5U29ja2V0U29ja09iamVjdCAqKW5ldyktPnNvY2tfZmQg PSAtMTsKCQkoKFB5U29ja2V0U29ja09iamVjdCAqKW5ldyktPnNvY2tfdGltZW91dCA9IC0x LjA7CgkJKChQeVNvY2tldFNvY2tPYmplY3QgKiluZXcpLT5lcnJvcmhhbmRsZXIgPSAmc2V0 X2Vycm9yOwoJfQoJcmV0dXJuIG5ldzsKfQoKCi8qIEluaXRpYWxpemUgYSBuZXcgc29ja2V0 IG9iamVjdC4gKi8KCi8qQVJHU1VTRUQqLwpzdGF0aWMgaW50CnNvY2tfaW5pdChQeU9iamVj dCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQp7CglQeVNvY2tldFNv Y2tPYmplY3QgKnMgPSAoUHlTb2NrZXRTb2NrT2JqZWN0ICopc2VsZjsKCVNPQ0tFVF9UIGZk OwoJaW50IGZhbWlseSA9IEFGX0lORVQsIHR5cGUgPSBTT0NLX1NUUkVBTSwgcHJvdG8gPSAw OwoJc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImZhbWlseSIsICJ0eXBlIiwgInByb3Rv IiwgMH07CgoJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywK CQkJCQkgInxpaWk6c29ja2V0Iiwga2V5d29yZHMsCgkJCQkJICZmYW1pbHksICZ0eXBlLCAm cHJvdG8pKQoJCXJldHVybiAtMTsKCglQeV9CRUdJTl9BTExPV19USFJFQURTCglmZCA9IHNv Y2tldChmYW1pbHksIHR5cGUsIHByb3RvKTsKCVB5X0VORF9BTExPV19USFJFQURTCgojaWZk ZWYgTVNfV0lORE9XUwoJaWYgKGZkID09IElOVkFMSURfU09DS0VUKQojZWxzZQoJaWYgKGZk IDwgMCkKI2VuZGlmCgl7CgkJc2V0X2Vycm9yKCk7CgkJcmV0dXJuIC0xOwoJfQoJaW5pdF9z b2Nrb2JqZWN0KHMsIGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKCS8qIEZyb20gbm93IG9u LCBpZ25vcmUgU0lHUElQRSBhbmQgbGV0IHRoZSBlcnJvciBjaGVja2luZwoJICAgZG8gdGhl IHdvcmsuICovCiNpZmRlZiBTSUdQSVBFCgkodm9pZCkgc2lnbmFsKFNJR1BJUEUsIFNJR19J R04pOwojZW5kaWYKCglyZXR1cm4gMDsKCn0KCgovKiBUeXBlIG9iamVjdCBmb3Igc29ja2V0 IG9iamVjdHMuICovCgpzdGF0aWMgUHlUeXBlT2JqZWN0IHNvY2tfdHlwZSA9IHsKCVB5T2Jq ZWN0X0hFQURfSU5JVCgwKQkvKiBNdXN0IGZpbGwgaW4gdHlwZSB2YWx1ZSBsYXRlciAqLwoJ MCwJCQkJCS8qIG9iX3NpemUgKi8KCSJfc29ja2V0LnNvY2tldCIsCQkJLyogdHBfbmFtZSAq LwoJc2l6ZW9mKFB5U29ja2V0U29ja09iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KCTAs CQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwoJKGRlc3RydWN0b3Ipc29ja19kZWFsbG9jLAkJLyog dHBfZGVhbGxvYyAqLwoJMCwJCQkJCS8qIHRwX3ByaW50ICovCgkwLAkJCQkJLyogdHBfZ2V0 YXR0ciAqLwoJMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KCTAsCQkJCQkvKiB0cF9jb21wYXJl ICovCgkocmVwcmZ1bmMpc29ja19yZXByLAkJCS8qIHRwX3JlcHIgKi8KCTAsCQkJCQkvKiB0 cF9hc19udW1iZXIgKi8KCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwoJMCwJCQkJCS8q IHRwX2FzX21hcHBpbmcgKi8KCTAsCQkJCQkvKiB0cF9oYXNoICovCgkwLAkJCQkJLyogdHBf Y2FsbCAqLwoJMCwJCQkJCS8qIHRwX3N0ciAqLwoJMCwJLyogc2V0IGJlbG93ICovCQkJLyog dHBfZ2V0YXR0cm8gKi8KCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwoJMCwJCQkJCS8qIHRw X2FzX2J1ZmZlciAqLwoJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQ RSwgLyogdHBfZmxhZ3MgKi8KCXNvY2tfZG9jLAkJCQkvKiB0cF9kb2MgKi8KCTAsCQkJCQkv KiB0cF90cmF2ZXJzZSAqLwoJMCwJCQkJCS8qIHRwX2NsZWFyICovCgkwLAkJCQkJLyogdHBf cmljaGNvbXBhcmUgKi8KCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwoJMCwJCQkJ CS8qIHRwX2l0ZXIgKi8KCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwoJc29ja19tZXRob2Rz LAkJCQkvKiB0cF9tZXRob2RzICovCgkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwoJMCwJCQkJ CS8qIHRwX2dldHNldCAqLwoJMCwJCQkJCS8qIHRwX2Jhc2UgKi8KCTAsCQkJCQkvKiB0cF9k aWN0ICovCgkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCgkwLAkJCQkJLyogdHBfZGVzY3Jf c2V0ICovCgkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwoJc29ja19pbml0LAkJCQkvKiB0 cF9pbml0ICovCgkwLAkvKiBzZXQgYmVsb3cgKi8JCQkvKiB0cF9hbGxvYyAqLwoJc29ja19u ZXcsCQkJCS8qIHRwX25ldyAqLwoJMCwJLyogc2V0IGJlbG93ICovCQkJLyogdHBfZnJlZSAq Lwp9OwoKCi8qIFB5dGhvbiBpbnRlcmZhY2UgdG8gZ2V0aG9zdG5hbWUoKS4gKi8KCi8qQVJH U1VTRUQqLwpzdGF0aWMgUHlPYmplY3QgKgpzb2NrZXRfZ2V0aG9zdG5hbWUoUHlPYmplY3Qg KnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CgljaGFyIGJ1ZlsxMDI0XTsKCWludCByZXM7Cglp ZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRob3N0bmFtZSIpKQoJCXJldHVybiBO VUxMOwoJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwoJcmVzID0gZ2V0aG9zdG5hbWUoYnVmLCAo aW50KSBzaXplb2YgYnVmIC0gMSk7CglQeV9FTkRfQUxMT1dfVEhSRUFEUwoJaWYgKHJlcyA8 IDApCgkJcmV0dXJuIHNldF9lcnJvcigpOwoJYnVmW3NpemVvZiBidWYgLSAxXSA9ICdcMCc7 CglyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwp9CgpzdGF0aWMgY2hhciBnZXRo b3N0bmFtZV9kb2NbXSA9CiJnZXRob3N0bmFtZSgpIC0+IHN0cmluZ1xuXApcblwKUmV0dXJu IHRoZSBjdXJyZW50IGhvc3QgbmFtZS4iOwoKCi8qIFB5dGhvbiBpbnRlcmZhY2UgdG8gZ2V0 aG9zdGJ5bmFtZShuYW1lKS4gKi8KCi8qQVJHU1VTRUQqLwpzdGF0aWMgUHlPYmplY3QgKgpz b2NrZXRfZ2V0aG9zdGJ5bmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsK CWNoYXIgKm5hbWU7CglzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyYnVmOwoKCWlmICgh UHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRob3N0YnluYW1lIiwgJm5hbWUpKQoJCXJl dHVybiBOVUxMOwoJaWYgKHNldGlwYWRkcihuYW1lLCAoc3RydWN0IHNvY2thZGRyICopJmFk ZHJidWYsIEFGX0lORVQpIDwgMCkKCQlyZXR1cm4gTlVMTDsKCXJldHVybiBtYWtlaXBhZGRy KChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmJ1ZiwKCQlzaXplb2Yoc3RydWN0IHNvY2thZGRy X2luKSk7Cn0KCnN0YXRpYyBjaGFyIGdldGhvc3RieW5hbWVfZG9jW10gPQoiZ2V0aG9zdGJ5 bmFtZShob3N0KSAtPiBhZGRyZXNzXG5cClxuXApSZXR1cm4gdGhlIElQIGFkZHJlc3MgKGEg c3RyaW5nIG9mIHRoZSBmb3JtICcyNTUuMjU1LjI1NS4yNTUnKSBmb3IgYSBob3N0LiI7CgoK LyogQ29udmVuaWVuY2UgZnVuY3Rpb24gY29tbW9uIHRvIGdldGhvc3RieW5hbWVfZXggYW5k IGdldGhvc3RieWFkZHIgKi8KCnN0YXRpYyBQeU9iamVjdCAqCmdldGhvc3RfY29tbW9uKHN0 cnVjdCBob3N0ZW50ICpoLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhbGVuLCBpbnQg YWYpCnsKCWNoYXIgKipwY2g7CglQeU9iamVjdCAqcnRuX3R1cGxlID0gKFB5T2JqZWN0ICop TlVMTDsKCVB5T2JqZWN0ICpuYW1lX2xpc3QgPSAoUHlPYmplY3QgKilOVUxMOwoJUHlPYmpl Y3QgKmFkZHJfbGlzdCA9IChQeU9iamVjdCAqKU5VTEw7CglQeU9iamVjdCAqdG1wOwoKCWlm IChoID09IE5VTEwpIHsKCQkvKiBMZXQncyBnZXQgcmVhbCBlcnJvciBtZXNzYWdlIHRvIHJl dHVybiAqLwojaWZuZGVmIFJJU0NPUwoJCXNldF9oZXJyb3IoaF9lcnJubyk7CiNlbHNlCgkJ UHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImhvc3Qgbm90IGZvdW5kIik7CiNlbmRp ZgoJCXJldHVybiBOVUxMOwoJfQoKCWlmIChoLT5oX2FkZHJ0eXBlICE9IGFmKSB7CiNpZmRl ZiBIQVZFX1NUUkVSUk9SCgkJLyogTGV0J3MgZ2V0IHJlYWwgZXJyb3IgbWVzc2FnZSB0byBy ZXR1cm4gKi8KCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAoJCQkJKGNoYXIgKilz dHJlcnJvcihFQUZOT1NVUFBPUlQpKTsKI2Vsc2UKCQlQeUVycl9TZXRTdHJpbmcoCgkJCXNv Y2tldF9lcnJvciwKCQkJIkFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9j b2wgZmFtaWx5Iik7CiNlbmRpZgoJCXJldHVybiBOVUxMOwoJfQoKCXN3aXRjaCAoYWYpIHsK CgljYXNlIEFGX0lORVQ6CgkJaWYgKGFsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2lu KSkKCQkJcmV0dXJuIE5VTEw7CgkJYnJlYWs7CgojaWZkZWYgRU5BQkxFX0lQVjYKCWNhc2Ug QUZfSU5FVDY6CgkJaWYgKGFsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpCgkJ CXJldHVybiBOVUxMOwoJCWJyZWFrOwojZW5kaWYKCgl9CgoJaWYgKChuYW1lX2xpc3QgPSBQ eUxpc3RfTmV3KDApKSA9PSBOVUxMKQoJCWdvdG8gZXJyOwoKCWlmICgoYWRkcl9saXN0ID0g UHlMaXN0X05ldygwKSkgPT0gTlVMTCkKCQlnb3RvIGVycjsKCglmb3IgKHBjaCA9IGgtPmhf YWxpYXNlczsgKnBjaCAhPSBOVUxMOyBwY2grKykgewoJCWludCBzdGF0dXM7CgkJdG1wID0g UHlTdHJpbmdfRnJvbVN0cmluZygqcGNoKTsKCQlpZiAodG1wID09IE5VTEwpCgkJCWdvdG8g ZXJyOwoKCQlzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKG5hbWVfbGlzdCwgdG1wKTsKCQlQeV9E RUNSRUYodG1wKTsKCgkJaWYgKHN0YXR1cykKCQkJZ290byBlcnI7Cgl9CgoJZm9yIChwY2gg PSBoLT5oX2FkZHJfbGlzdDsgKnBjaCAhPSBOVUxMOyBwY2grKykgewoJCWludCBzdGF0dXM7 CgoJCXN3aXRjaCAoYWYpIHsKCgkJY2FzZSBBRl9JTkVUOgoJCSAgICB7CgkJCXN0cnVjdCBz b2NrYWRkcl9pbiBzaW47CgkJCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CgkJCXNp bi5zaW5fZmFtaWx5ID0gYWY7CiNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgoJCQlzaW4u c2luX2xlbiA9IHNpemVvZihzaW4pOwojZW5kaWYKCQkJbWVtY3B5KCZzaW4uc2luX2FkZHIs ICpwY2gsIHNpemVvZihzaW4uc2luX2FkZHIpKTsKCQkJdG1wID0gbWFrZWlwYWRkcigoc3Ry dWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mKHNpbikpOwoKCQkJaWYgKHBjaCA9PSBoLT5o X2FkZHJfbGlzdCAmJiBhbGVuID49IHNpemVvZihzaW4pKQoJCQkJbWVtY3B5KChjaGFyICop IGFkZHIsICZzaW4sIHNpemVvZihzaW4pKTsKCQkJYnJlYWs7CgkJICAgIH0KCiNpZmRlZiBF TkFCTEVfSVBWNgoJCWNhc2UgQUZfSU5FVDY6CgkJICAgIHsKCQkJc3RydWN0IHNvY2thZGRy X2luNiBzaW42OwoJCQltZW1zZXQoJnNpbjYsIDAsIHNpemVvZihzaW42KSk7CgkJCXNpbjYu c2luNl9mYW1pbHkgPSBhZjsKI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCgkJCXNpbjYu c2luNl9sZW4gPSBzaXplb2Yoc2luNik7CiNlbmRpZgoJCQltZW1jcHkoJnNpbjYuc2luNl9h ZGRyLCAqcGNoLCBzaXplb2Yoc2luNi5zaW42X2FkZHIpKTsKCQkJdG1wID0gbWFrZWlwYWRk cigoc3RydWN0IHNvY2thZGRyICopJnNpbjYsCgkJCQlzaXplb2Yoc2luNikpOwoKCQkJaWYg KHBjaCA9PSBoLT5oX2FkZHJfbGlzdCAmJiBhbGVuID49IHNpemVvZihzaW42KSkKCQkJCW1l bWNweSgoY2hhciAqKSBhZGRyLCAmc2luNiwgc2l6ZW9mKHNpbjYpKTsKCQkJYnJlYWs7CgkJ ICAgIH0KI2VuZGlmCgoJCWRlZmF1bHQ6CS8qIGNhbid0IGhhcHBlbiAqLwoJCQlQeUVycl9T ZXRTdHJpbmcoc29ja2V0X2Vycm9yLAoJCQkJCSJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWls eSIpOwoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCWlmICh0bXAgPT0gTlVMTCkKCQkJZ290byBl cnI7CgoJCXN0YXR1cyA9IFB5TGlzdF9BcHBlbmQoYWRkcl9saXN0LCB0bXApOwoJCVB5X0RF Q1JFRih0bXApOwoKCQlpZiAoc3RhdHVzKQoJCQlnb3RvIGVycjsKCX0KCglydG5fdHVwbGUg PSBQeV9CdWlsZFZhbHVlKCJzT08iLCBoLT5oX25hbWUsIG5hbWVfbGlzdCwgYWRkcl9saXN0 KTsKCiBlcnI6CglQeV9YREVDUkVGKG5hbWVfbGlzdCk7CglQeV9YREVDUkVGKGFkZHJfbGlz dCk7CglyZXR1cm4gcnRuX3R1cGxlOwp9CgoKLyogUHl0aG9uIGludGVyZmFjZSB0byBnZXRo b3N0YnluYW1lX2V4KG5hbWUpLiAqLwoKLypBUkdTVVNFRCovCnN0YXRpYyBQeU9iamVjdCAq CnNvY2tldF9nZXRob3N0YnluYW1lX2V4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJn cykKewoJY2hhciAqbmFtZTsKCXN0cnVjdCBob3N0ZW50ICpoOwoJc3RydWN0IHNvY2thZGRy X3N0b3JhZ2UgYWRkcjsKCXN0cnVjdCBzb2NrYWRkciAqc2E7CglQeU9iamVjdCAqcmV0Owoj aWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IKCXN0cnVjdCBob3N0ZW50IGhwX2FsbG9jYXRl ZDsKI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHCglzdHJ1Y3QgaG9zdGVudF9k YXRhIGRhdGE7CiNlbHNlCgljaGFyIGJ1ZlsxNjM4NF07CglpbnQgYnVmX2xlbiA9IChzaXpl b2YgYnVmKSAtIDE7CglpbnQgZXJybm9wOwojZW5kaWYKI2lmIGRlZmluZWQoSEFWRV9HRVRI T1NUQllOQU1FX1JfM19BUkcpIHx8IGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9B UkcpCglpbnQgcmVzdWx0OwojZW5kaWYKI2VuZGlmIC8qIEhBVkVfR0VUSE9TVEJZTkFNRV9S ICovCgoJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGhvc3RieW5hbWVfZXgi LCAmbmFtZSkpCgkJcmV0dXJuIE5VTEw7CglpZiAoc2V0aXBhZGRyKG5hbWUsIChzdHJ1Y3Qg c29ja2FkZHIgKikmYWRkciwgUEZfSU5FVCkgPCAwKQoJCXJldHVybiBOVUxMOwoJUHlfQkVH SU5fQUxMT1dfVEhSRUFEUwojaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IKI2lmICAgZGVm aW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUl82X0FSRykKCXJlc3VsdCA9IGdldGhvc3RieW5h bWVfcihuYW1lLCAmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sCgkJCQkgJmgsICZlcnJu b3ApOwojZWxpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHKQoJaCA9IGdl dGhvc3RieW5hbWVfcihuYW1lLCAmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sICZlcnJu b3ApOwojZWxzZSAvKiBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX0FSRyAqLwoJbWVtc2V0KCh2 b2lkICopICZkYXRhLCAnXDAnLCBzaXplb2YoZGF0YSkpOwoJcmVzdWx0ID0gZ2V0aG9zdGJ5 bmFtZV9yKG5hbWUsICZocF9hbGxvY2F0ZWQsICZkYXRhKTsKCWggPSAocmVzdWx0ICE9IDAp ID8gTlVMTCA6ICZocF9hbGxvY2F0ZWQ7CiNlbmRpZgojZWxzZSAvKiBub3QgSEFWRV9HRVRI T1NUQllOQU1FX1IgKi8KI2lmZGVmIFVTRV9HRVRIT1NUQllOQU1FX0xPQ0sKCVB5VGhyZWFk X2FjcXVpcmVfbG9jayhnZXRob3N0YnluYW1lX2xvY2ssIDEpOwojZW5kaWYKCWggPSBnZXRo b3N0YnluYW1lKG5hbWUpOwojZW5kaWYgLyogSEFWRV9HRVRIT1NUQllOQU1FX1IgKi8KCVB5 X0VORF9BTExPV19USFJFQURTCgkvKiBTb21lIEMgbGlicmFyaWVzIHdvdWxkIHJlcXVpcmUg YWRkci5fX3NzX2ZhbWlseSBpbnN0ZWFkIG9mCgkgICBhZGRyLnNzX2ZhbWlseS4KCSAgIFRo ZXJlZm9yZSwgd2UgY2FzdCB0aGUgc29ja2FkZHJfc3RvcmFnZSBpbnRvIHNvY2thZGRyIHRv CgkgICBhY2Nlc3Mgc2FfZmFtaWx5LiAqLwoJc2EgPSAoc3RydWN0IHNvY2thZGRyKikmYWRk cjsKCXJldCA9IGdldGhvc3RfY29tbW9uKGgsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwg c2l6ZW9mKGFkZHIpLAoJCQkgICAgIHNhLT5zYV9mYW1pbHkpOwojaWZkZWYgVVNFX0dFVEhP U1RCWU5BTUVfTE9DSwoJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGdldGhvc3RieW5hbWVfbG9j ayk7CiNlbmRpZgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGNoYXIgZ2hibl9leF9kb2NbXSA9 CiJnZXRob3N0YnluYW1lX2V4KGhvc3QpIC0+IChuYW1lLCBhbGlhc2xpc3QsIGFkZHJlc3Ns aXN0KVxuXApcblwKUmV0dXJuIHRoZSB0cnVlIGhvc3QgbmFtZSwgYSBsaXN0IG9mIGFsaWFz ZXMsIGFuZCBhIGxpc3Qgb2YgSVAgYWRkcmVzc2VzLFxuXApmb3IgYSBob3N0LiAgVGhlIGhv c3QgYXJndW1lbnQgaXMgYSBzdHJpbmcgZ2l2aW5nIGEgaG9zdCBuYW1lIG9yIElQIG51bWJl ci4iOwoKCi8qIFB5dGhvbiBpbnRlcmZhY2UgdG8gZ2V0aG9zdGJ5YWRkcihJUCkuICovCgov KkFSR1NVU0VEKi8Kc3RhdGljIFB5T2JqZWN0ICoKc29ja2V0X2dldGhvc3RieWFkZHIoUHlP YmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiNpZmRlZiBFTkFCTEVfSVBWNgoJc3Ry dWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKI2Vsc2UKCXN0cnVjdCBzb2NrYWRkcl9pbiBh ZGRyOwojZW5kaWYKCXN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICop JmFkZHI7CgljaGFyICppcF9udW07CglzdHJ1Y3QgaG9zdGVudCAqaDsKCVB5T2JqZWN0ICpy ZXQ7CiNpZmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgoJc3RydWN0IGhvc3RlbnQgaHBfYWxs b2NhdGVkOwojaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcKCXN0cnVjdCBob3N0 ZW50X2RhdGEgZGF0YTsKI2Vsc2UKCWNoYXIgYnVmWzE2Mzg0XTsKCWludCBidWZfbGVuID0g KHNpemVvZiBidWYpIC0gMTsKCWludCBlcnJub3A7CiNlbmRpZgojaWYgZGVmaW5lZChIQVZF X0dFVEhPU1RCWU5BTUVfUl8zX0FSRykgfHwgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVf Ul82X0FSRykKCWludCByZXN1bHQ7CiNlbmRpZgojZW5kaWYgLyogSEFWRV9HRVRIT1NUQllO QU1FX1IgKi8KCWNoYXIgKmFwOwoJaW50IGFsOwoJaW50IGFmOwoKCWlmICghUHlBcmdfUGFy c2VUdXBsZShhcmdzLCAiczpnZXRob3N0YnlhZGRyIiwgJmlwX251bSkpCgkJcmV0dXJuIE5V TEw7CglhZiA9IFBGX1VOU1BFQzsKCWlmIChzZXRpcGFkZHIoaXBfbnVtLCBzYSwgYWYpIDwg MCkKCQlyZXR1cm4gTlVMTDsKCWFmID0gc2EtPnNhX2ZhbWlseTsKCWFwID0gTlVMTDsKCWFs ID0gMDsKCXN3aXRjaCAoYWYpIHsKCWNhc2UgQUZfSU5FVDoKCQlhcCA9IChjaGFyICopJigo c3RydWN0IHNvY2thZGRyX2luICopc2EpLT5zaW5fYWRkcjsKCQlhbCA9IHNpemVvZigoKHN0 cnVjdCBzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHIpOwoJCWJyZWFrOwojaWZkZWYgRU5B QkxFX0lQVjYKCWNhc2UgQUZfSU5FVDY6CgkJYXAgPSAoY2hhciAqKSYoKHN0cnVjdCBzb2Nr YWRkcl9pbjYgKilzYSktPnNpbjZfYWRkcjsKCQlhbCA9IHNpemVvZigoKHN0cnVjdCBzb2Nr YWRkcl9pbjYgKilzYSktPnNpbjZfYWRkcik7CgkJYnJlYWs7CiNlbmRpZgoJZGVmYXVsdDoK CQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAidW5zdXBwb3J0ZWQgYWRkcmVzcyBm YW1pbHkiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKI2lm ZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SCiNpZiAgIGRlZmluZWQoSEFWRV9HRVRIT1NUQllO QU1FX1JfNl9BUkcpCglyZXN1bHQgPSBnZXRob3N0YnlhZGRyX3IoYXAsIGFsLCBhZiwKCQkm aHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sCgkJJmgsICZlcnJub3ApOwojZWxpZiBkZWZp bmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHKQoJaCA9IGdldGhvc3RieWFkZHJfcihh cCwgYWwsIGFmLAoJCQkgICAgJmhwX2FsbG9jYXRlZCwgYnVmLCBidWZfbGVuLCAmZXJybm9w KTsKI2Vsc2UgLyogSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcgKi8KCW1lbXNldCgodm9p ZCAqKSAmZGF0YSwgJ1wwJywgc2l6ZW9mKGRhdGEpKTsKCXJlc3VsdCA9IGdldGhvc3RieWFk ZHJfcihhcCwgYWwsIGFmLCAmaHBfYWxsb2NhdGVkLCAmZGF0YSk7CgloID0gKHJlc3VsdCAh PSAwKSA/IE5VTEwgOiAmaHBfYWxsb2NhdGVkOwojZW5kaWYKI2Vsc2UgLyogbm90IEhBVkVf R0VUSE9TVEJZTkFNRV9SICovCiNpZmRlZiBVU0VfR0VUSE9TVEJZTkFNRV9MT0NLCglQeVRo cmVhZF9hY3F1aXJlX2xvY2soZ2V0aG9zdGJ5bmFtZV9sb2NrLCAxKTsKI2VuZGlmCgloID0g Z2V0aG9zdGJ5YWRkcihhcCwgYWwsIGFmKTsKI2VuZGlmIC8qIEhBVkVfR0VUSE9TVEJZTkFN RV9SICovCglQeV9FTkRfQUxMT1dfVEhSRUFEUwoJcmV0ID0gZ2V0aG9zdF9jb21tb24oaCwg KHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkciksIGFmKTsKI2lmZGVmIFVT RV9HRVRIT1NUQllOQU1FX0xPQ0sKCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhnZXRob3N0Ynlu YW1lX2xvY2spOwojZW5kaWYKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBjaGFyIGdldGhvc3Ri eWFkZHJfZG9jW10gPQoiZ2V0aG9zdGJ5YWRkcihob3N0KSAtPiAobmFtZSwgYWxpYXNsaXN0 LCBhZGRyZXNzbGlzdClcblwKXG5cClJldHVybiB0aGUgdHJ1ZSBob3N0IG5hbWUsIGEgbGlz dCBvZiBhbGlhc2VzLCBhbmQgYSBsaXN0IG9mIElQIGFkZHJlc3NlcyxcblwKZm9yIGEgaG9z dC4gIFRoZSBob3N0IGFyZ3VtZW50IGlzIGEgc3RyaW5nIGdpdmluZyBhIGhvc3QgbmFtZSBv ciBJUCBudW1iZXIuIjsKCgovKiBQeXRob24gaW50ZXJmYWNlIHRvIGdldHNlcnZieW5hbWUo bmFtZSkuCiAgIFRoaXMgb25seSByZXR1cm5zIHRoZSBwb3J0IG51bWJlciwgc2luY2UgdGhl IG90aGVyIGluZm8gaXMgYWxyZWFkeQogICBrbm93biBvciBub3QgdXNlZnVsIChsaWtlIHRo ZSBsaXN0IG9mIGFsaWFzZXMpLiAqLwoKLypBUkdTVVNFRCovCnN0YXRpYyBQeU9iamVjdCAq CnNvY2tldF9nZXRzZXJ2YnluYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykK ewoJY2hhciAqbmFtZSwgKnByb3RvOwoJc3RydWN0IHNlcnZlbnQgKnNwOwoJaWYgKCFQeUFy Z19QYXJzZVR1cGxlKGFyZ3MsICJzczpnZXRzZXJ2YnluYW1lIiwgJm5hbWUsICZwcm90bykp CgkJcmV0dXJuIE5VTEw7CglQeV9CRUdJTl9BTExPV19USFJFQURTCglzcCA9IGdldHNlcnZi eW5hbWUobmFtZSwgcHJvdG8pOwoJUHlfRU5EX0FMTE9XX1RIUkVBRFMKCWlmIChzcCA9PSBO VUxMKSB7CgkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInNlcnZpY2UvcHJvdG8g bm90IGZvdW5kIik7CgkJcmV0dXJuIE5VTEw7Cgl9CglyZXR1cm4gUHlJbnRfRnJvbUxvbmco KGxvbmcpIG50b2hzKHNwLT5zX3BvcnQpKTsKfQoKc3RhdGljIGNoYXIgZ2V0c2VydmJ5bmFt ZV9kb2NbXSA9CiJnZXRzZXJ2YnluYW1lKHNlcnZpY2VuYW1lLCBwcm90b2NvbG5hbWUpIC0+ IGludGVnZXJcblwKXG5cClJldHVybiBhIHBvcnQgbnVtYmVyIGZyb20gYSBzZXJ2aWNlIG5h bWUgYW5kIHByb3RvY29sIG5hbWUuXG5cClRoZSBwcm90b2NvbCBuYW1lIHNob3VsZCBiZSAn dGNwJyBvciAndWRwJy4iOwoKCi8qIFB5dGhvbiBpbnRlcmZhY2UgdG8gZ2V0cHJvdG9ieW5h bWUobmFtZSkuCiAgIFRoaXMgb25seSByZXR1cm5zIHRoZSBwcm90b2NvbCBudW1iZXIsIHNp bmNlIHRoZSBvdGhlciBpbmZvIGlzCiAgIGFscmVhZHkga25vd24gb3Igbm90IHVzZWZ1bCAo bGlrZSB0aGUgbGlzdCBvZiBhbGlhc2VzKS4gKi8KCi8qQVJHU1VTRUQqLwpzdGF0aWMgUHlP YmplY3QgKgpzb2NrZXRfZ2V0cHJvdG9ieW5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0 ICphcmdzKQp7CgljaGFyICpuYW1lOwoJc3RydWN0IHByb3RvZW50ICpzcDsKI2lmZGVmIF9f QkVPU19fCi8qIE5vdCBhdmFpbGFibGUgaW4gQmVPUyB5ZXQuIC0gW2NqaF0gKi8KCVB5RXJy X1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRwcm90b2J5bmFtZSBub3Qgc3VwcG9ydGVk Iik7CglyZXR1cm4gTlVMTDsKI2Vsc2UKCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAi czpnZXRwcm90b2J5bmFtZSIsICZuYW1lKSkKCQlyZXR1cm4gTlVMTDsKCVB5X0JFR0lOX0FM TE9XX1RIUkVBRFMKCXNwID0gZ2V0cHJvdG9ieW5hbWUobmFtZSk7CglQeV9FTkRfQUxMT1df VEhSRUFEUwoJaWYgKHNwID09IE5VTEwpIHsKCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vy cm9yLCAicHJvdG9jb2wgbm90IGZvdW5kIik7CgkJcmV0dXJuIE5VTEw7Cgl9CglyZXR1cm4g UHlJbnRfRnJvbUxvbmcoKGxvbmcpIHNwLT5wX3Byb3RvKTsKI2VuZGlmCn0KCnN0YXRpYyBj aGFyIGdldHByb3RvYnluYW1lX2RvY1tdID0KImdldHByb3RvYnluYW1lKG5hbWUpIC0+IGlu dGVnZXJcblwKXG5cClJldHVybiB0aGUgcHJvdG9jb2wgbnVtYmVyIGZvciB0aGUgbmFtZWQg cHJvdG9jb2wuICAoUmFyZWx5IHVzZWQuKSI7CgoKI2lmbmRlZiBOT19EVVAKLyogQ3JlYXRl IGEgc29ja2V0IG9iamVjdCBmcm9tIGEgbnVtZXJpYyBmaWxlIGRlc2NyaXB0aW9uLgogICBV c2VmdWwgZS5nLiBpZiBzdGRpbiBpcyBhIHNvY2tldC4KICAgQWRkaXRpb25hbCBhcmd1bWVu dHMgYXMgZm9yIHNvY2tldCgpLiAqLwoKLypBUkdTVVNFRCovCnN0YXRpYyBQeU9iamVjdCAq CnNvY2tldF9mcm9tZmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CglQeVNv Y2tldFNvY2tPYmplY3QgKnM7CglTT0NLRVRfVCBmZDsKCWludCBmYW1pbHksIHR5cGUsIHBy b3RvID0gMDsKCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpfGk6ZnJvbWZkIiwK CQkJICAgICAgJmZkLCAmZmFtaWx5LCAmdHlwZSwgJnByb3RvKSkKCQlyZXR1cm4gTlVMTDsK CS8qIER1cCB0aGUgZmQgc28gaXQgYW5kIHRoZSBzb2NrZXQgY2FuIGJlIGNsb3NlZCBpbmRl cGVuZGVudGx5ICovCglmZCA9IGR1cChmZCk7CglpZiAoZmQgPCAwKQoJCXJldHVybiBzZXRf ZXJyb3IoKTsKCXMgPSBuZXdfc29ja29iamVjdChmZCwgZmFtaWx5LCB0eXBlLCBwcm90byk7 CgkvKiBGcm9tIG5vdyBvbiwgaWdub3JlIFNJR1BJUEUgYW5kIGxldCB0aGUgZXJyb3IgY2hl Y2tpbmcKCSAgIGRvIHRoZSB3b3JrLiAqLwojaWZkZWYgU0lHUElQRQoJKHZvaWQpIHNpZ25h bChTSUdQSVBFLCBTSUdfSUdOKTsKI2VuZGlmCglyZXR1cm4gKFB5T2JqZWN0ICopIHM7Cn0K CnN0YXRpYyBjaGFyIGZyb21mZF9kb2NbXSA9CiJmcm9tZmQoZmQsIGZhbWlseSwgdHlwZVss IHByb3RvXSkgLT4gc29ja2V0IG9iamVjdFxuXApcblwKQ3JlYXRlIGEgc29ja2V0IG9iamVj dCBmcm9tIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuXG5cClRoZSByZW1haW5pbmcgYXJn dW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3Igc29ja2V0KCkuIjsKCiNlbmRpZiAvKiBOT19E VVAgKi8KCgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrZXRfbnRvaHMoUHlPYmplY3QgKnNlbGYs IFB5T2JqZWN0ICphcmdzKQp7CglpbnQgeDEsIHgyOwoKCWlmICghUHlBcmdfUGFyc2VUdXBs ZShhcmdzLCAiaTpudG9ocyIsICZ4MSkpIHsKCQlyZXR1cm4gTlVMTDsKCX0KCXgyID0gKGlu dCludG9ocygoc2hvcnQpeDEpOwoJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgyKTsKfQoKc3Rh dGljIGNoYXIgbnRvaHNfZG9jW10gPQoibnRvaHMoaW50ZWdlcikgLT4gaW50ZWdlclxuXApc blwKQ29udmVydCBhIDE2LWJpdCBpbnRlZ2VyIGZyb20gbmV0d29yayB0byBob3N0IGJ5dGUg b3JkZXIuIjsKCgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrZXRfbnRvaGwoUHlPYmplY3QgKnNl bGYsIFB5T2JqZWN0ICphcmdzKQp7CglpbnQgeDEsIHgyOwoKCWlmICghUHlBcmdfUGFyc2VU dXBsZShhcmdzLCAiaTpudG9obCIsICZ4MSkpIHsKCQlyZXR1cm4gTlVMTDsKCX0KCXgyID0g bnRvaGwoeDEpOwoJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgyKTsKfQoKc3RhdGljIGNoYXIg bnRvaGxfZG9jW10gPQoibnRvaGwoaW50ZWdlcikgLT4gaW50ZWdlclxuXApcblwKQ29udmVy dCBhIDMyLWJpdCBpbnRlZ2VyIGZyb20gbmV0d29yayB0byBob3N0IGJ5dGUgb3JkZXIuIjsK CgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrZXRfaHRvbnMoUHlPYmplY3QgKnNlbGYsIFB5T2Jq ZWN0ICphcmdzKQp7CglpbnQgeDEsIHgyOwoKCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdz LCAiaTpodG9ucyIsICZ4MSkpIHsKCQlyZXR1cm4gTlVMTDsKCX0KCXgyID0gKGludClodG9u cygoc2hvcnQpeDEpOwoJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgyKTsKfQoKc3RhdGljIGNo YXIgaHRvbnNfZG9jW10gPQoiaHRvbnMoaW50ZWdlcikgLT4gaW50ZWdlclxuXApcblwKQ29u dmVydCBhIDE2LWJpdCBpbnRlZ2VyIGZyb20gaG9zdCB0byBuZXR3b3JrIGJ5dGUgb3JkZXIu IjsKCgpzdGF0aWMgUHlPYmplY3QgKgpzb2NrZXRfaHRvbmwoUHlPYmplY3QgKnNlbGYsIFB5 T2JqZWN0ICphcmdzKQp7CglpbnQgeDEsIHgyOwoKCWlmICghUHlBcmdfUGFyc2VUdXBsZShh cmdzLCAiaTpodG9ubCIsICZ4MSkpIHsKCQlyZXR1cm4gTlVMTDsKCX0KCXgyID0gaHRvbmwo eDEpOwoJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgyKTsKfQoKc3RhdGljIGNoYXIgaHRvbmxf ZG9jW10gPQoiaHRvbmwoaW50ZWdlcikgLT4gaW50ZWdlclxuXApcblwKQ29udmVydCBhIDMy LWJpdCBpbnRlZ2VyIGZyb20gaG9zdCB0byBuZXR3b3JrIGJ5dGUgb3JkZXIuIjsKCi8qIHNv Y2tldC5pbmV0X2F0b24oKSBhbmQgc29ja2V0LmluZXRfbnRvYSgpIGZ1bmN0aW9ucy4gKi8K CnN0YXRpYyBjaGFyIGluZXRfYXRvbl9kb2NbXSA9CiJpbmV0X2F0b24oc3RyaW5nKSAtPiBw YWNrZWQgMzItYml0IElQIHJlcHJlc2VudGF0aW9uXG5cClxuXApDb252ZXJ0IGFuIElQIGFk ZHJlc3MgaW4gc3RyaW5nIGZvcm1hdCAoMTIzLjQ1LjY3Ljg5KSB0byB0aGUgMzItYml0IHBh Y2tlZFxuXApiaW5hcnkgZm9ybWF0IHVzZWQgaW4gbG93LWxldmVsIG5ldHdvcmsgZnVuY3Rp b25zLiI7CgpzdGF0aWMgUHlPYmplY3QqCnNvY2tldF9pbmV0X2F0b24oUHlPYmplY3QgKnNl bGYsIFB5T2JqZWN0ICphcmdzKQp7CiNpZm5kZWYgSU5BRERSX05PTkUKI2RlZmluZSBJTkFE RFJfTk9ORSAoLTEpCiNlbmRpZgoKCS8qIEhhdmUgdG8gdXNlIGluZXRfYWRkcigpIGluc3Rl YWQgKi8KCWNoYXIgKmlwX2FkZHI7Cgl1bnNpZ25lZCBsb25nIHBhY2tlZF9hZGRyOwoKCWlm ICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbmV0X2F0b24iLCAmaXBfYWRkcikpIHsK CQlyZXR1cm4gTlVMTDsKCX0KCXBhY2tlZF9hZGRyID0gaW5ldF9hZGRyKGlwX2FkZHIpOwoK CWlmIChwYWNrZWRfYWRkciA9PSBJTkFERFJfTk9ORSkgewkvKiBpbnZhbGlkIGFkZHJlc3Mg Ki8KCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAoJCQkiaWxsZWdhbCBJUCBhZGRy ZXNzIHN0cmluZyBwYXNzZWQgdG8gaW5ldF9hdG9uIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJ cmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopICZwYWNrZWRfYWRk ciwKCQkJCQkgIHNpemVvZihwYWNrZWRfYWRkcikpOwp9CgpzdGF0aWMgY2hhciBpbmV0X250 b2FfZG9jW10gPQoiaW5ldF9udG9hKHBhY2tlZF9pcCkgLT4gaXBfYWRkcmVzc19zdHJpbmdc blwKXG5cCkNvbnZlcnQgYW4gSVAgYWRkcmVzcyBmcm9tIDMyLWJpdCBwYWNrZWQgYmluYXJ5 IGZvcm1hdCB0byBzdHJpbmcgZm9ybWF0IjsKCnN0YXRpYyBQeU9iamVjdCoKc29ja2V0X2lu ZXRfbnRvYShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKCWNoYXIgKnBhY2tl ZF9zdHI7CglpbnQgYWRkcl9sZW47CglzdHJ1Y3QgaW5fYWRkciBwYWNrZWRfYWRkcjsKCglp ZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmluZXRfbnRvYSIsICZwYWNrZWRfc3Ry LCAmYWRkcl9sZW4pKSB7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJaWYgKGFkZHJfbGVuICE9IHNp emVvZihwYWNrZWRfYWRkcikpIHsKCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAoJ CQkicGFja2VkIElQIHdyb25nIGxlbmd0aCBmb3IgaW5ldF9udG9hIik7CgkJcmV0dXJuIE5V TEw7Cgl9CgoJbWVtY3B5KCZwYWNrZWRfYWRkciwgcGFja2VkX3N0ciwgYWRkcl9sZW4pOwoK CXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGluZXRfbnRvYShwYWNrZWRfYWRkcikpOwp9 CgovKiBQeXRob24gaW50ZXJmYWNlIHRvIGdldGFkZHJpbmZvKGhvc3QsIHBvcnQpLiAqLwoK LypBUkdTVVNFRCovCnN0YXRpYyBQeU9iamVjdCAqCnNvY2tldF9nZXRhZGRyaW5mbyhQeU9i amVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKCXN0cnVjdCBhZGRyaW5mbyBoaW50cywg KnJlczsKCXN0cnVjdCBhZGRyaW5mbyAqcmVzMCA9IE5VTEw7CglQeU9iamVjdCAqcG9iaiA9 IChQeU9iamVjdCAqKU5VTEw7CgljaGFyIHBidWZbMzBdOwoJY2hhciAqaHB0ciwgKnBwdHI7 CglpbnQgZmFtaWx5LCBzb2NrdHlwZSwgcHJvdG9jb2wsIGZsYWdzOwoJaW50IGVycm9yOwoJ UHlPYmplY3QgKmFsbCA9IChQeU9iamVjdCAqKU5VTEw7CglQeU9iamVjdCAqc2luZ2xlID0g KFB5T2JqZWN0ICopTlVMTDsKCglmYW1pbHkgPSBzb2NrdHlwZSA9IHByb3RvY29sID0gZmxh Z3MgPSAwOwoJZmFtaWx5ID0gUEZfVU5TUEVDOwoJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFy Z3MsICJ6T3xpaWlpOmdldGFkZHJpbmZvIiwKCSAgICAmaHB0ciwgJnBvYmosICZmYW1pbHks ICZzb2NrdHlwZSwKCQkJJnByb3RvY29sLCAmZmxhZ3MpKSB7CgkJcmV0dXJuIE5VTEw7Cgl9 CglpZiAoUHlJbnRfQ2hlY2socG9iaikpIHsKCQlQeU9TX3NucHJpbnRmKHBidWYsIHNpemVv ZihwYnVmKSwgIiVsZCIsIFB5SW50X0FzTG9uZyhwb2JqKSk7CgkJcHB0ciA9IHBidWY7Cgl9 IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHBvYmopKSB7CgkJcHB0ciA9IFB5U3RyaW5nX0Fz U3RyaW5nKHBvYmopOwoJfSBlbHNlIGlmIChwb2JqID09IFB5X05vbmUpIHsKCQlwcHRyID0g KGNoYXIgKilOVUxMOwoJfSBlbHNlIHsKCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9y LCAiSW50IG9yIFN0cmluZyBleHBlY3RlZCIpOwoJCXJldHVybiBOVUxMOwoJfQoJbWVtc2V0 KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CgloaW50cy5haV9mYW1pbHkgPSBmYW1pbHk7 CgloaW50cy5haV9zb2NrdHlwZSA9IHNvY2t0eXBlOwoJaGludHMuYWlfcHJvdG9jb2wgPSBw cm90b2NvbDsKCWhpbnRzLmFpX2ZsYWdzID0gZmxhZ3M7CgllcnJvciA9IGdldGFkZHJpbmZv KGhwdHIsIHBwdHIsICZoaW50cywgJnJlczApOwoJaWYgKGVycm9yKSB7CgkJc2V0X2dhaWVy cm9yKGVycm9yKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglpZiAoKGFsbCA9IFB5TGlzdF9OZXco MCkpID09IE5VTEwpCgkJZ290byBlcnI7Cglmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzID0g cmVzLT5haV9uZXh0KSB7CgkJUHlPYmplY3QgKmFkZHIgPQoJCQltYWtlc29ja2FkZHIoLTEs IHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKTsKCQlpZiAoYWRkciA9PSBOVUxMKQoJ CQlnb3RvIGVycjsKCQlzaW5nbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlzTyIsIHJlcy0+YWlf ZmFtaWx5LAoJCQlyZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sLAoJCQlyZXMt PmFpX2Nhbm9ubmFtZSA/IHJlcy0+YWlfY2Fub25uYW1lIDogIiIsCgkJCWFkZHIpOwoJCVB5 X0RFQ1JFRihhZGRyKTsKCQlpZiAoc2luZ2xlID09IE5VTEwpCgkJCWdvdG8gZXJyOwoKCQlp ZiAoUHlMaXN0X0FwcGVuZChhbGwsIHNpbmdsZSkpCgkJCWdvdG8gZXJyOwoJCVB5X1hERUNS RUYoc2luZ2xlKTsKCX0KCXJldHVybiBhbGw7CiBlcnI6CglQeV9YREVDUkVGKHNpbmdsZSk7 CglQeV9YREVDUkVGKGFsbCk7CglpZiAocmVzMCkKCQlmcmVlYWRkcmluZm8ocmVzMCk7Cgly ZXR1cm4gKFB5T2JqZWN0ICopTlVMTDsKfQoKc3RhdGljIGNoYXIgZ2V0YWRkcmluZm9fZG9j W10gPQoic29ja2V0LmdldGFkZHJpbmZvKGhvc3QsIHBvcnQgWywgZmFtaWx5LCBzb2NrdHlw ZSwgcHJvdG8sIGZsYWdzXSlcblwKCS0tPiBMaXN0IG9mIChmYW1pbHksIHNvY2t0eXBlLCBw cm90bywgY2Fub25uYW1lLCBzb2NrYWRkcilcblwKXG5cClJlc29sdmUgaG9zdCBhbmQgcG9y dCBpbnRvIGFkZHJpbmZvIHN0cnVjdC4iOwoKLyogUHl0aG9uIGludGVyZmFjZSB0byBnZXRu YW1laW5mbyhzYSwgZmxhZ3MpLiAqLwoKLypBUkdTVVNFRCovCnN0YXRpYyBQeU9iamVjdCAq CnNvY2tldF9nZXRuYW1laW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsK CVB5T2JqZWN0ICpzYSA9IChQeU9iamVjdCAqKU5VTEw7CglpbnQgZmxhZ3M7CgljaGFyICpo b3N0cDsKCWludCBwb3J0LCBmbG93aW5mbywgc2NvcGVfaWQ7CgljaGFyIGhidWZbTklfTUFY SE9TVF0sIHBidWZbTklfTUFYU0VSVl07CglzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMg PSBOVUxMOwoJaW50IGVycm9yOwoJUHlPYmplY3QgKnJldCA9IChQeU9iamVjdCAqKU5VTEw7 CgoJZmxhZ3MgPSBmbG93aW5mbyA9IHNjb3BlX2lkID0gMDsKCWlmICghUHlBcmdfUGFyc2VU dXBsZShhcmdzLCAiT2k6Z2V0bmFtZWluZm8iLCAmc2EsICZmbGFncykpCgkJcmV0dXJuIE5V TEw7CglpZiAgKCFQeUFyZ19QYXJzZVR1cGxlKHNhLCAic2l8aWkiLAoJCQkgICAgICAgJmhv c3RwLCAmcG9ydCwgJmZsb3dpbmZvLCAmc2NvcGVfaWQpKQoJCXJldHVybiBOVUxMOwoJUHlP U19zbnByaW50ZihwYnVmLCBzaXplb2YocGJ1ZiksICIlZCIsIHBvcnQpOwoJbWVtc2V0KCZo aW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CgloaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7 CgloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CS8qIG1ha2UgbnVtZXJpYyBwb3J0 IGhhcHB5ICovCgllcnJvciA9IGdldGFkZHJpbmZvKGhvc3RwLCBwYnVmLCAmaGludHMsICZy ZXMpOwoJaWYgKGVycm9yKSB7CgkJc2V0X2dhaWVycm9yKGVycm9yKTsKCQlnb3RvIGZhaWw7 Cgl9CglpZiAocmVzLT5haV9uZXh0KSB7CgkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJv ciwKCQkJInNvY2thZGRyIHJlc29sdmVkIHRvIG11bHRpcGxlIGFkZHJlc3NlcyIpOwoJCWdv dG8gZmFpbDsKCX0KCXN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKCWNhc2UgQUZfSU5FVDoK CSAgICB7CgkJY2hhciAqdDE7CgkJaW50IHQyOwoJCWlmIChQeUFyZ19QYXJzZVR1cGxlKHNh LCAic2kiLCAmdDEsICZ0MikgPT0gMCkgewoJCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vy cm9yLAoJCQkJIklQdjQgc29ja2FkZHIgbXVzdCBiZSAyIHR1cGxlIik7CgkJCWdvdG8gZmFp bDsKCQl9CgkJYnJlYWs7CgkgICAgfQojaWZkZWYgRU5BQkxFX0lQVjYKCWNhc2UgQUZfSU5F VDY6CgkgICAgewoJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CgkJc2luNiA9IChzdHJ1 Y3Qgc29ja2FkZHJfaW42ICopcmVzLT5haV9hZGRyOwoJCXNpbjYtPnNpbjZfZmxvd2luZm8g PSBmbG93aW5mbzsKCQlzaW42LT5zaW42X3Njb3BlX2lkID0gc2NvcGVfaWQ7CgkJYnJlYWs7 CgkgICAgfQojZW5kaWYKCX0KCWVycm9yID0gZ2V0bmFtZWluZm8ocmVzLT5haV9hZGRyLCBy ZXMtPmFpX2FkZHJsZW4sCgkJCWhidWYsIHNpemVvZihoYnVmKSwgcGJ1Ziwgc2l6ZW9mKHBi dWYpLCBmbGFncyk7CglpZiAoZXJyb3IpIHsKCQlzZXRfZ2FpZXJyb3IoZXJyb3IpOwoJCWdv dG8gZmFpbDsKCX0KCXJldCA9IFB5X0J1aWxkVmFsdWUoInNzIiwgaGJ1ZiwgcGJ1Zik7Cgpm YWlsOgoJaWYgKHJlcykKCQlmcmVlYWRkcmluZm8ocmVzKTsKCXJldHVybiByZXQ7Cn0KCnN0 YXRpYyBjaGFyIGdldG5hbWVpbmZvX2RvY1tdID0KInNvY2tldC5nZXRuYW1laW5mbyhzb2Nr YWRkciwgZmxhZ3MpIC0tPiAoaG9zdCwgcG9ydClcblwKXG5cCkdldCBob3N0IGFuZCBwb3J0 IGZvciBhIHNvY2thZGRyLiI7CgovKiBMaXN0IG9mIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0 aGlzIG1vZHVsZS4gKi8KCnN0YXRpYyBQeU1ldGhvZERlZiBzb2NrZXRfbWV0aG9kc1tdID0g ewoJeyJnZXRob3N0YnluYW1lIiwJc29ja2V0X2dldGhvc3RieW5hbWUsCgkgTUVUSF9WQVJB UkdTLCBnZXRob3N0YnluYW1lX2RvY30sCgl7ImdldGhvc3RieW5hbWVfZXgiLAlzb2NrZXRf Z2V0aG9zdGJ5bmFtZV9leCwKCSBNRVRIX1ZBUkFSR1MsIGdoYm5fZXhfZG9jfSwKCXsiZ2V0 aG9zdGJ5YWRkciIsCXNvY2tldF9nZXRob3N0YnlhZGRyLAoJIE1FVEhfVkFSQVJHUywgZ2V0 aG9zdGJ5YWRkcl9kb2N9LAoJeyJnZXRob3N0bmFtZSIsCQlzb2NrZXRfZ2V0aG9zdG5hbWUs CgkgTUVUSF9WQVJBUkdTLCBnZXRob3N0bmFtZV9kb2N9LAoJeyJnZXRzZXJ2YnluYW1lIiwJ c29ja2V0X2dldHNlcnZieW5hbWUsCgkgTUVUSF9WQVJBUkdTLCBnZXRzZXJ2YnluYW1lX2Rv Y30sCgl7ImdldHByb3RvYnluYW1lIiwJc29ja2V0X2dldHByb3RvYnluYW1lLAoJIE1FVEhf VkFSQVJHUyxnZXRwcm90b2J5bmFtZV9kb2N9LAojaWZuZGVmIE5PX0RVUAoJeyJmcm9tZmQi LAkJc29ja2V0X2Zyb21mZCwKCSBNRVRIX1ZBUkFSR1MsIGZyb21mZF9kb2N9LAojZW5kaWYK CXsibnRvaHMiLAkJc29ja2V0X250b2hzLAoJIE1FVEhfVkFSQVJHUywgbnRvaHNfZG9jfSwK CXsibnRvaGwiLAkJc29ja2V0X250b2hsLAoJIE1FVEhfVkFSQVJHUywgbnRvaGxfZG9jfSwK CXsiaHRvbnMiLAkJc29ja2V0X2h0b25zLAoJIE1FVEhfVkFSQVJHUywgaHRvbnNfZG9jfSwK CXsiaHRvbmwiLAkJc29ja2V0X2h0b25sLAoJIE1FVEhfVkFSQVJHUywgaHRvbmxfZG9jfSwK CXsiaW5ldF9hdG9uIiwJCXNvY2tldF9pbmV0X2F0b24sCgkgTUVUSF9WQVJBUkdTLCBpbmV0 X2F0b25fZG9jfSwKCXsiaW5ldF9udG9hIiwJCXNvY2tldF9pbmV0X250b2EsCgkgTUVUSF9W QVJBUkdTLCBpbmV0X250b2FfZG9jfSwKCXsiZ2V0YWRkcmluZm8iLAkJc29ja2V0X2dldGFk ZHJpbmZvLAoJIE1FVEhfVkFSQVJHUywgZ2V0YWRkcmluZm9fZG9jfSwKCXsiZ2V0bmFtZWlu Zm8iLAkJc29ja2V0X2dldG5hbWVpbmZvLAoJIE1FVEhfVkFSQVJHUywgZ2V0bmFtZWluZm9f ZG9jfSwKCXtOVUxMLAkJCU5VTEx9CQkgLyogU2VudGluZWwgKi8KfTsKCgojaWZkZWYgUklT Q09TCiNkZWZpbmUgT1NfSU5JVF9ERUZJTkVECgpzdGF0aWMgaW50Cm9zX2luaXQodm9pZCkK ewoJX2tlcm5lbF9zd2lfcmVncyByOwoKCXIuclswXSA9IDA7Cglfa2VybmVsX3N3aSgweDQz MzgwLCAmciwgJnIpOwoJdGFza3dpbmRvdyA9IHIuclswXTsKCglyZXR1cm4gMDsKfQoKI2Vu ZGlmIC8qIFJJU0NPUyAqLwoKCiNpZmRlZiBNU19XSU5ET1dTCiNkZWZpbmUgT1NfSU5JVF9E RUZJTkVECgovKiBBZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwIGZvciBX aW5kb3dzICovCgpzdGF0aWMgdm9pZApvc19jbGVhbnVwKHZvaWQpCnsKCVdTQUNsZWFudXAo KTsKfQoKc3RhdGljIGludApvc19pbml0KHZvaWQpCnsKCVdTQURBVEEgV1NBRGF0YTsKCWlu dCByZXQ7CgljaGFyIGJ1ZlsxMDBdOwoJcmV0ID0gV1NBU3RhcnR1cCgweDAxMDEsICZXU0FE YXRhKTsKCXN3aXRjaCAocmV0KSB7CgljYXNlIDA6CS8qIE5vIGVycm9yICovCgkJYXRleGl0 KG9zX2NsZWFudXApOwoJCXJldHVybiAxOyAvKiBTdWNjZXNzICovCgljYXNlIFdTQVNZU05P VFJFQURZOgoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKCQkJCSJXU0FT dGFydHVwIGZhaWxlZDogbmV0d29yayBub3QgcmVhZHkiKTsKCQlicmVhazsKCWNhc2UgV1NB VkVSTk9UU1VQUE9SVEVEOgoJY2FzZSBXU0FFSU5WQUw6CgkJUHlFcnJfU2V0U3RyaW5nKAoJ CQlQeUV4Y19JbXBvcnRFcnJvciwKCQkJIldTQVN0YXJ0dXAgZmFpbGVkOiByZXF1ZXN0ZWQg dmVyc2lvbiBub3Qgc3VwcG9ydGVkIik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCVB5T1Nfc25w cmludGYoYnVmLCBzaXplb2YoYnVmKSwKCQkJICAgICAgIldTQVN0YXJ0dXAgZmFpbGVkOiBl cnJvciBjb2RlICVkIiwgcmV0KTsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJy b3IsIGJ1Zik7CgkJYnJlYWs7Cgl9CglyZXR1cm4gMDsgLyogRmFpbHVyZSAqLwp9CgojZW5k aWYgLyogTVNfV0lORE9XUyAqLwoKCiNpZmRlZiBQWU9TX09TMgojZGVmaW5lIE9TX0lOSVRf REVGSU5FRAoKLyogQWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBmb3IgT1MvMiAqLwoKc3Rh dGljIGludApvc19pbml0KHZvaWQpCnsKI2lmbmRlZiBQWUNDX0dDQwoJY2hhciByZWFzb25b NjRdOwoJaW50IHJjID0gc29ja19pbml0KCk7CgoJaWYgKHJjID09IDApIHsKCQlyZXR1cm4g MTsgLyogU3VjY2VzcyAqLwoJfQoKCVB5T1Nfc25wcmludGYocmVhc29uLCBzaXplb2YocmVh c29uKSwKCQkgICAgICAiT1MvMiBUQ1AvSVAgRXJyb3IjICVkIiwgc29ja19lcnJubygpKTsK CVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgcmVhc29uKTsKCglyZXR1cm4g MDsgIC8qIEZhaWx1cmUgKi8KI2Vsc2UKCS8qIE5vIG5lZWQgdG8gaW5pdGlhbGlzZSBzb2Nr ZXRzIHdpdGggR0NDL0VNWCAqLwoJcmV0dXJuIDE7IC8qIFN1Y2Nlc3MgKi8KI2VuZGlmCn0K CiNlbmRpZiAvKiBQWU9TX09TMiAqLwoKCiNpZm5kZWYgT1NfSU5JVF9ERUZJTkVECnN0YXRp YyBpbnQKb3NfaW5pdCh2b2lkKQp7CglyZXR1cm4gMTsgLyogU3VjY2VzcyAqLwp9CiNlbmRp ZgoKCi8qIEMgQVBJIHRhYmxlIC0gYWx3YXlzIGFkZCBuZXcgdGhpbmdzIHRvIHRoZSBlbmQg Zm9yIGJpbmFyeQogICBjb21wYXRpYmlsaXR5LiAqLwpzdGF0aWMKUHlTb2NrZXRNb2R1bGVf QVBJT2JqZWN0IFB5U29ja2V0TW9kdWxlQVBJID0KewoJJnNvY2tfdHlwZSwKfTsKCgovKiBJ bml0aWFsaXplIHRoZSBfc29ja2V0IG1vZHVsZS4KCiAgIFRoaXMgbW9kdWxlIGlzIGFjdHVh bGx5IGNhbGxlZCAiX3NvY2tldCIsIGFuZCB0aGVyZSdzIGEgd3JhcHBlcgogICAic29ja2V0 LnB5IiB3aGljaCBpbXBsZW1lbnRzIHNvbWUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LiAg T24gc29tZQogICBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cyBhbmQgT1MvMiksIHNvY2tldC5w eSBhbHNvIGltcGxlbWVudHMgYQogICB3cmFwcGVyIGZvciB0aGUgc29ja2V0IHR5cGUgdGhh dCBwcm92aWRlcyBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkgc3VjaAogICBhcyBtYWtlZmlsZSgp LCBkdXAoKSBhbmQgZnJvbWZkKCkuICBUaGUgaW1wb3J0IG9mICJfc29ja2V0IiBtYXkgZmFp bAogICB3aXRoIGFuIEltcG9ydEVycm9yIGV4Y2VwdGlvbiBpZiBvcy1zcGVjaWZpYyBpbml0 aWFsaXphdGlvbiBmYWlscy4KICAgT24gV2luZG93cywgdGhpcyBkb2VzIFdJTlNPQ0sgaW5p dGlhbGl6YXRpb24uICBXaGVuIFdJTlNPQ0sgaXMKICAgaW5pdGlhbGl6ZWQgc3VjY2VzZnVs bHksIGEgY2FsbCB0byBXU0FDbGVhbnVwKCkgaXMgc2NoZWR1bGVkIHRvIGJlCiAgIG1hZGUg YXQgZXhpdCB0aW1lLgoqLwoKc3RhdGljIGNoYXIgc29ja2V0X2RvY1tdID0KIkltcGxlbWVu dGF0aW9uIG1vZHVsZSBmb3Igc29ja2V0IG9wZXJhdGlvbnMuICBTZWUgdGhlIHNvY2tldCBt b2R1bGVcblwKZm9yIGRvY3VtZW50YXRpb24uIjsKCkRMX0VYUE9SVCh2b2lkKQppbml0X3Nv Y2tldCh2b2lkKQp7CglQeU9iamVjdCAqbTsKCglpZiAoIW9zX2luaXQoKSkKCQlyZXR1cm47 CgoJc29ja190eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Cglzb2NrX3R5cGUudHBfZ2V0 YXR0cm8gPSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cjsKCXNvY2tfdHlwZS50cF9hbGxvYyA9 IFB5VHlwZV9HZW5lcmljQWxsb2M7Cglzb2NrX3R5cGUudHBfZnJlZSA9IFB5T2JqZWN0X0Rl bDsKCW0gPSBQeV9Jbml0TW9kdWxlMyhQeVNvY2tldF9NT0RVTEVfTkFNRSwKCQkJICAgc29j a2V0X21ldGhvZHMsCgkJCSAgIHNvY2tldF9kb2MpOwoKCXNvY2tldF9lcnJvciA9IFB5RXJy X05ld0V4Y2VwdGlvbigic29ja2V0LmVycm9yIiwgTlVMTCwgTlVMTCk7CglpZiAoc29ja2V0 X2Vycm9yID09IE5VTEwpCgkJcmV0dXJuOwoJUHlfSU5DUkVGKHNvY2tldF9lcnJvcik7CglQ eU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgc29ja2V0X2Vycm9yKTsKCXNvY2tldF9o ZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC5oZXJyb3IiLAoJCQkJCSAgIHNv Y2tldF9lcnJvciwgTlVMTCk7CglpZiAoc29ja2V0X2hlcnJvciA9PSBOVUxMKQoJCXJldHVy bjsKCVB5X0lOQ1JFRihzb2NrZXRfaGVycm9yKTsKCVB5TW9kdWxlX0FkZE9iamVjdChtLCAi aGVycm9yIiwgc29ja2V0X2hlcnJvcik7Cglzb2NrZXRfZ2FpZXJyb3IgPSBQeUVycl9OZXdF eGNlcHRpb24oInNvY2tldC5nYWllcnJvciIsIHNvY2tldF9lcnJvciwKCSAgICBOVUxMKTsK CWlmIChzb2NrZXRfZ2FpZXJyb3IgPT0gTlVMTCkKCQlyZXR1cm47CglQeV9JTkNSRUYoc29j a2V0X2dhaWVycm9yKTsKCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZ2FpZXJyb3IiLCBzb2Nr ZXRfZ2FpZXJyb3IpOwoJUHlfSU5DUkVGKChQeU9iamVjdCAqKSZzb2NrX3R5cGUpOwoJaWYg KFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU29ja2V0VHlwZSIsCgkJCSAgICAgICAoUHlPYmpl Y3QgKikmc29ja190eXBlKSAhPSAwKQoJCXJldHVybjsKCVB5X0lOQ1JFRigoUHlPYmplY3Qg Kikmc29ja190eXBlKTsKCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgInNvY2tldCIsCgkJ CSAgICAgICAoUHlPYmplY3QgKikmc29ja190eXBlKSAhPSAwKQoJCXJldHVybjsKCgkvKiBF eHBvcnQgQyBBUEkgKi8KCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgUHlTb2NrZXRfQ0FQ SV9OQU1FLAoJICAgICAgIFB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCAqKSZQeVNvY2tl dE1vZHVsZUFQSSwgTlVMTCkKCQkJCSApICE9IDApCgkJcmV0dXJuOwoKCS8qIEFkZHJlc3Mg ZmFtaWxpZXMgKHdlIG9ubHkgc3VwcG9ydCBBRl9JTkVUIGFuZCBBRl9VTklYKSAqLwojaWZk ZWYgQUZfVU5TUEVDCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfVU5TUEVDIiwg QUZfVU5TUEVDKTsKI2VuZGlmCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSU5F VCIsIEFGX0lORVQpOwojaWZkZWYgQUZfSU5FVDYKCVB5TW9kdWxlX0FkZEludENvbnN0YW50 KG0sICJBRl9JTkVUNiIsIEFGX0lORVQ2KTsKI2VuZGlmIC8qIEFGX0lORVQ2ICovCiNpZmRl ZiBBRl9VTklYCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfVU5JWCIsIEFGX1VO SVgpOwojZW5kaWYgLyogQUZfVU5JWCAqLwojaWZkZWYgQUZfQVgyNQoJLyogQW1hdGV1ciBS YWRpbyBBWC4yNSAqLwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FYMjUiLCBB Rl9BWDI1KTsKI2VuZGlmCiNpZmRlZiBBRl9JUFgKCVB5TW9kdWxlX0FkZEludENvbnN0YW50 KG0sICJBRl9JUFgiLCBBRl9JUFgpOyAvKiBOb3ZlbGwgSVBYICovCiNlbmRpZgojaWZkZWYg QUZfQVBQTEVUQUxLCgkvKiBBcHBsZXRhbGsgRERQICovCglQeU1vZHVsZV9BZGRJbnRDb25z dGFudChtLCAiQUZfQVBQTEVUQUxLIiwgQUZfQVBQTEVUQUxLKTsKI2VuZGlmCiNpZmRlZiBB Rl9ORVRST00KCS8qIEFtYXRldXIgcmFkaW8gTmV0Uk9NICovCglQeU1vZHVsZV9BZGRJbnRD b25zdGFudChtLCAiQUZfTkVUUk9NIiwgQUZfTkVUUk9NKTsKI2VuZGlmCiNpZmRlZiBBRl9C UklER0UKCS8qIE11bHRpcHJvdG9jb2wgYnJpZGdlICovCglQeU1vZHVsZV9BZGRJbnRDb25z dGFudChtLCAiQUZfQlJJREdFIiwgQUZfQlJJREdFKTsKI2VuZGlmCiNpZmRlZiBBRl9BQUw1 CgkvKiBSZXNlcnZlZCBmb3IgV2VybmVyJ3MgQVRNICovCglQeU1vZHVsZV9BZGRJbnRDb25z dGFudChtLCAiQUZfQUFMNSIsIEFGX0FBTDUpOwojZW5kaWYKI2lmZGVmIEFGX1gyNQoJLyog UmVzZXJ2ZWQgZm9yIFguMjUgcHJvamVjdCAqLwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQo bSwgIkFGX1gyNSIsIEFGX1gyNSk7CiNlbmRpZgojaWZkZWYgQUZfSU5FVDYKCVB5TW9kdWxl X0FkZEludENvbnN0YW50KG0sICJBRl9JTkVUNiIsIEFGX0lORVQ2KTsgLyogSVAgdmVyc2lv biA2ICovCiNlbmRpZgojaWZkZWYgQUZfUk9TRQoJLyogQW1hdGV1ciBSYWRpbyBYLjI1IFBM UCAqLwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1JPU0UiLCBBRl9ST1NFKTsK I2VuZGlmCiNpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAoJUHlNb2R1bGVfQWRkSW50 Q29uc3RhbnQobSwgIkFGX1BBQ0tFVCIsIEFGX1BBQ0tFVCk7CglQeU1vZHVsZV9BZGRJbnRD b25zdGFudChtLCAiUEZfUEFDS0VUIiwgUEZfUEFDS0VUKTsKCVB5TW9kdWxlX0FkZEludENv bnN0YW50KG0sICJQQUNLRVRfSE9TVCIsIFBBQ0tFVF9IT1NUKTsKCVB5TW9kdWxlX0FkZElu dENvbnN0YW50KG0sICJQQUNLRVRfQlJPQURDQVNUIiwgUEFDS0VUX0JST0FEQ0FTVCk7CglQ eU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX01VTFRJQ0FTVCIsIFBBQ0tFVF9N VUxUSUNBU1QpOwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9PVEhFUkhP U1QiLCBQQUNLRVRfT1RIRVJIT1NUKTsKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQ QUNLRVRfT1VUR09JTkciLCBQQUNLRVRfT1VUR09JTkcpOwoJUHlNb2R1bGVfQWRkSW50Q29u c3RhbnQobSwgIlBBQ0tFVF9MT09QQkFDSyIsIFBBQ0tFVF9MT09QQkFDSyk7CglQeU1vZHVs ZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX0ZBU1RST1VURSIsIFBBQ0tFVF9GQVNUUk9V VEUpOwojZW5kaWYKCgkvKiBTb2NrZXQgdHlwZXMgKi8KCVB5TW9kdWxlX0FkZEludENvbnN0 YW50KG0sICJTT0NLX1NUUkVBTSIsIFNPQ0tfU1RSRUFNKTsKCVB5TW9kdWxlX0FkZEludENv bnN0YW50KG0sICJTT0NLX0RHUkFNIiwgU09DS19ER1JBTSk7CiNpZm5kZWYgX19CRU9TX18K LyogV2UgaGF2ZSBpbmNvbXBsZXRlIHNvY2tldCBzdXBwb3J0LiAqLwoJUHlNb2R1bGVfQWRk SW50Q29uc3RhbnQobSwgIlNPQ0tfUkFXIiwgU09DS19SQVcpOwoJUHlNb2R1bGVfQWRkSW50 Q29uc3RhbnQobSwgIlNPQ0tfU0VRUEFDS0VUIiwgU09DS19TRVFQQUNLRVQpOwoJUHlNb2R1 bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfUkRNIiwgU09DS19SRE0pOwojZW5kaWYKCiNp ZmRlZglTT19ERUJVRwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0RFQlVHIiwg U09fREVCVUcpOwojZW5kaWYKI2lmZGVmCVNPX0FDQ0VQVENPTk4KCVB5TW9kdWxlX0FkZElu dENvbnN0YW50KG0sICJTT19BQ0NFUFRDT05OIiwgU09fQUNDRVBUQ09OTik7CiNlbmRpZgoj aWZkZWYJU09fUkVVU0VBRERSCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkVV U0VBRERSIiwgU09fUkVVU0VBRERSKTsKI2VuZGlmCiNpZmRlZglTT19LRUVQQUxJVkUKCVB5 TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19LRUVQQUxJVkUiLCBTT19LRUVQQUxJVkUp OwojZW5kaWYKI2lmZGVmCVNPX0RPTlRST1VURQoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQo bSwgIlNPX0RPTlRST1VURSIsIFNPX0RPTlRST1VURSk7CiNlbmRpZgojaWZkZWYJU09fQlJP QURDQVNUCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fQlJPQURDQVNUIiwgU09f QlJPQURDQVNUKTsKI2VuZGlmCiNpZmRlZglTT19VU0VMT09QQkFDSwoJUHlNb2R1bGVfQWRk SW50Q29uc3RhbnQobSwgIlNPX1VTRUxPT1BCQUNLIiwgU09fVVNFTE9PUEJBQ0spOwojZW5k aWYKI2lmZGVmCVNPX0xJTkdFUgoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0xJ TkdFUiIsIFNPX0xJTkdFUik7CiNlbmRpZgojaWZkZWYJU09fT09CSU5MSU5FCglQeU1vZHVs ZV9BZGRJbnRDb25zdGFudChtLCAiU09fT09CSU5MSU5FIiwgU09fT09CSU5MSU5FKTsKI2Vu ZGlmCiNpZmRlZglTT19SRVVTRVBPUlQKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJT T19SRVVTRVBPUlQiLCBTT19SRVVTRVBPUlQpOwojZW5kaWYKI2lmZGVmCVNPX1NOREJVRgoJ UHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1NOREJVRiIsIFNPX1NOREJVRik7CiNl bmRpZgojaWZkZWYJU09fUkNWQlVGCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09f UkNWQlVGIiwgU09fUkNWQlVGKTsKI2VuZGlmCiNpZmRlZglTT19TTkRMT1dBVAoJUHlNb2R1 bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1NORExPV0FUIiwgU09fU05ETE9XQVQpOwojZW5k aWYKI2lmZGVmCVNPX1JDVkxPV0FUCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09f UkNWTE9XQVQiLCBTT19SQ1ZMT1dBVCk7CiNlbmRpZgojaWZkZWYJU09fU05EVElNRU8KCVB5 TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19TTkRUSU1FTyIsIFNPX1NORFRJTUVPKTsK I2VuZGlmCiNpZmRlZglTT19SQ1ZUSU1FTwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwg IlNPX1JDVlRJTUVPIiwgU09fUkNWVElNRU8pOwojZW5kaWYKI2lmZGVmCVNPX0VSUk9SCglQ eU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fRVJST1IiLCBTT19FUlJPUik7CiNlbmRp ZgojaWZkZWYJU09fVFlQRQoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1RZUEUi LCBTT19UWVBFKTsKI2VuZGlmCgoJLyogTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMg Zm9yICJsaXN0ZW4iICovCiNpZmRlZglTT01BWENPTk4KCVB5TW9kdWxlX0FkZEludENvbnN0 YW50KG0sICJTT01BWENPTk4iLCBTT01BWENPTk4pOwojZWxzZQoJUHlNb2R1bGVfQWRkSW50 Q29uc3RhbnQobSwgIlNPTUFYQ09OTiIsIDUpOyAvKiBDb21tb24gdmFsdWUgKi8KI2VuZGlm CgoJLyogRmxhZ3MgZm9yIHNlbmQsIHJlY3YgKi8KI2lmZGVmCU1TR19PT0IKCVB5TW9kdWxl X0FkZEludENvbnN0YW50KG0sICJNU0dfT09CIiwgTVNHX09PQik7CiNlbmRpZgojaWZkZWYJ TVNHX1BFRUsKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfUEVFSyIsIE1TR19Q RUVLKTsKI2VuZGlmCiNpZmRlZglNU0dfRE9OVFJPVVRFCglQeU1vZHVsZV9BZGRJbnRDb25z dGFudChtLCAiTVNHX0RPTlRST1VURSIsIE1TR19ET05UUk9VVEUpOwojZW5kaWYKI2lmZGVm CU1TR19ET05UV0FJVAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19ET05UV0FJ VCIsIE1TR19ET05UV0FJVCk7CiNlbmRpZgojaWZkZWYJTVNHX0VPUgoJUHlNb2R1bGVfQWRk SW50Q29uc3RhbnQobSwgIk1TR19FT1IiLCBNU0dfRU9SKTsKI2VuZGlmCiNpZmRlZglNU0df VFJVTkMKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfVFJVTkMiLCBNU0dfVFJV TkMpOwojZW5kaWYKI2lmZGVmCU1TR19DVFJVTkMKCVB5TW9kdWxlX0FkZEludENvbnN0YW50 KG0sICJNU0dfQ1RSVU5DIiwgTVNHX0NUUlVOQyk7CiNlbmRpZgojaWZkZWYJTVNHX1dBSVRB TEwKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfV0FJVEFMTCIsIE1TR19XQUlU QUxMKTsKI2VuZGlmCiNpZmRlZglNU0dfQlRBRwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQo bSwgIk1TR19CVEFHIiwgTVNHX0JUQUcpOwojZW5kaWYKI2lmZGVmCU1TR19FVEFHCglQeU1v ZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0VUQUciLCBNU0dfRVRBRyk7CiNlbmRpZgoK CS8qIFByb3RvY29sIGxldmVsIGFuZCBudW1iZXJzLCB1c2FibGUgZm9yIFtnc11ldHNvY2tv cHQgKi8KI2lmZGVmCVNPTF9TT0NLRVQKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJT T0xfU09DS0VUIiwgU09MX1NPQ0tFVCk7CiNlbmRpZgojaWZkZWYJU09MX0lQCglQeU1vZHVs ZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0lQIiwgU09MX0lQKTsKI2Vsc2UKCVB5TW9kdWxl X0FkZEludENvbnN0YW50KG0sICJTT0xfSVAiLCAwKTsKI2VuZGlmCiNpZmRlZglTT0xfSVBY CglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0lQWCIsIFNPTF9JUFgpOwojZW5k aWYKI2lmZGVmCVNPTF9BWDI1CglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0FY MjUiLCBTT0xfQVgyNSk7CiNlbmRpZgojaWZkZWYJU09MX0FUQUxLCglQeU1vZHVsZV9BZGRJ bnRDb25zdGFudChtLCAiU09MX0FUQUxLIiwgU09MX0FUQUxLKTsKI2VuZGlmCiNpZmRlZglT T0xfTkVUUk9NCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX05FVFJPTSIsIFNP TF9ORVRST00pOwojZW5kaWYKI2lmZGVmCVNPTF9ST1NFCglQeU1vZHVsZV9BZGRJbnRDb25z dGFudChtLCAiU09MX1JPU0UiLCBTT0xfUk9TRSk7CiNlbmRpZgojaWZkZWYJU09MX1RDUAoJ UHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9UQ1AiLCBTT0xfVENQKTsKI2Vsc2UK CVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVENQIiwgNik7CiNlbmRpZgojaWZk ZWYJU09MX1VEUAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9VRFAiLCBTT0xf VURQKTsKI2Vsc2UKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVURQIiwgMTcp OwojZW5kaWYKI2lmZGVmCUlQUFJPVE9fSVAKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0s ICJJUFBST1RPX0lQIiwgSVBQUk9UT19JUCk7CiNlbHNlCglQeU1vZHVsZV9BZGRJbnRDb25z dGFudChtLCAiSVBQUk9UT19JUCIsIDApOwojZW5kaWYKI2lmZGVmCUlQUFJPVE9fSE9QT1BU UwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSE9QT1BUUyIsIElQUFJP VE9fSE9QT1BUUyk7CiNlbmRpZgojaWZkZWYJSVBQUk9UT19JQ01QCglQeU1vZHVsZV9BZGRJ bnRDb25zdGFudChtLCAiSVBQUk9UT19JQ01QIiwgSVBQUk9UT19JQ01QKTsKI2Vsc2UKCVB5 TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lDTVAiLCAxKTsKI2VuZGlmCiNp ZmRlZglJUFBST1RPX0lHTVAKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RP X0lHTVAiLCBJUFBST1RPX0lHTVApOwojZW5kaWYKI2lmZGVmCUlQUFJPVE9fR0dQCglQeU1v ZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19HR1AiLCBJUFBST1RPX0dHUCk7CiNl bmRpZgojaWZkZWYJSVBQUk9UT19JUFY0CglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAi SVBQUk9UT19JUFY0IiwgSVBQUk9UT19JUFY0KTsKI2VuZGlmCiNpZmRlZglJUFBST1RPX0lQ SVAKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQSVAiLCBJUFBST1RP X0lQSVApOwojZW5kaWYKI2lmZGVmCUlQUFJPVE9fVENQCglQeU1vZHVsZV9BZGRJbnRDb25z dGFudChtLCAiSVBQUk9UT19UQ1AiLCBJUFBST1RPX1RDUCk7CiNlbHNlCglQeU1vZHVsZV9B ZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UQ1AiLCA2KTsKI2VuZGlmCiNpZmRlZglJUFBS T1RPX0VHUAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRUdQIiwgSVBQ Uk9UT19FR1ApOwojZW5kaWYKI2lmZGVmCUlQUFJPVE9fUFVQCglQeU1vZHVsZV9BZGRJbnRD b25zdGFudChtLCAiSVBQUk9UT19QVVAiLCBJUFBST1RPX1BVUCk7CiNlbmRpZgojaWZkZWYJ SVBQUk9UT19VRFAKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1VEUCIs IElQUFJPVE9fVURQKTsKI2Vsc2UKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBS T1RPX1VEUCIsIDE3KTsKI2VuZGlmCiNpZmRlZglJUFBST1RPX0lEUAoJUHlNb2R1bGVfQWRk SW50Q29uc3RhbnQobSwgIklQUFJPVE9fSURQIiwgSVBQUk9UT19JRFApOwojZW5kaWYKI2lm ZGVmCUlQUFJPVE9fSEVMTE8KCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RP X0hFTExPIiwgSVBQUk9UT19IRUxMTyk7CiNlbmRpZgojaWZkZWYJSVBQUk9UT19ORAoJUHlN b2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fTkQiLCBJUFBST1RPX05EKTsKI2Vu ZGlmCiNpZmRlZglJUFBST1RPX1RQCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQ Uk9UT19UUCIsIElQUFJPVE9fVFApOwojZW5kaWYKI2lmZGVmCUlQUFJPVE9fSVBWNgoJUHlN b2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBWNiIsIElQUFJPVE9fSVBWNik7 CiNlbmRpZgojaWZkZWYJSVBQUk9UT19ST1VUSU5HCglQeU1vZHVsZV9BZGRJbnRDb25zdGFu dChtLCAiSVBQUk9UT19ST1VUSU5HIiwgSVBQUk9UT19ST1VUSU5HKTsKI2VuZGlmCiNpZmRl ZglJUFBST1RPX0ZSQUdNRU5UCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9U T19GUkFHTUVOVCIsIElQUFJPVE9fRlJBR01FTlQpOwojZW5kaWYKI2lmZGVmCUlQUFJPVE9f UlNWUAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUlNWUCIsIElQUFJP VE9fUlNWUCk7CiNlbmRpZgojaWZkZWYJSVBQUk9UT19HUkUKCVB5TW9kdWxlX0FkZEludENv bnN0YW50KG0sICJJUFBST1RPX0dSRSIsIElQUFJPVE9fR1JFKTsKI2VuZGlmCiNpZmRlZglJ UFBST1RPX0VTUAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRVNQIiwg SVBQUk9UT19FU1ApOwojZW5kaWYKI2lmZGVmCUlQUFJPVE9fQUgKCVB5TW9kdWxlX0FkZElu dENvbnN0YW50KG0sICJJUFBST1RPX0FIIiwgSVBQUk9UT19BSCk7CiNlbmRpZgojaWZkZWYJ SVBQUk9UT19NT0JJTEUKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX01P QklMRSIsIElQUFJPVE9fTU9CSUxFKTsKI2VuZGlmCiNpZmRlZglJUFBST1RPX0lDTVBWNgoJ UHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUNNUFY2IiwgSVBQUk9UT19J Q01QVjYpOwojZW5kaWYKI2lmZGVmCUlQUFJPVE9fTk9ORQoJUHlNb2R1bGVfQWRkSW50Q29u c3RhbnQobSwgIklQUFJPVE9fTk9ORSIsIElQUFJPVE9fTk9ORSk7CiNlbmRpZgojaWZkZWYJ SVBQUk9UT19EU1RPUFRTCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19E U1RPUFRTIiwgSVBQUk9UT19EU1RPUFRTKTsKI2VuZGlmCiNpZmRlZglJUFBST1RPX1hUUAoJ UHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fWFRQIiwgSVBQUk9UT19YVFAp OwojZW5kaWYKI2lmZGVmCUlQUFJPVE9fRU9OCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudCht LCAiSVBQUk9UT19FT04iLCBJUFBST1RPX0VPTik7CiNlbmRpZgojaWZkZWYJSVBQUk9UT19Q SU0KCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1BJTSIsIElQUFJPVE9f UElNKTsKI2VuZGlmCiNpZmRlZglJUFBST1RPX0lQQ09NUAoJUHlNb2R1bGVfQWRkSW50Q29u c3RhbnQobSwgIklQUFJPVE9fSVBDT01QIiwgSVBQUk9UT19JUENPTVApOwojZW5kaWYKI2lm ZGVmCUlQUFJPVE9fVlJSUAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9f VlJSUCIsIElQUFJPVE9fVlJSUCk7CiNlbmRpZgojaWZkZWYJSVBQUk9UT19CSVAKCVB5TW9k dWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0JJUCIsIElQUFJPVE9fQklQKTsKI2Vu ZGlmCi8qKi8KI2lmZGVmCUlQUFJPVE9fUkFXCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudCht LCAiSVBQUk9UT19SQVciLCBJUFBST1RPX1JBVyk7CiNlbHNlCglQeU1vZHVsZV9BZGRJbnRD b25zdGFudChtLCAiSVBQUk9UT19SQVciLCAyNTUpOwojZW5kaWYKI2lmZGVmCUlQUFJPVE9f TUFYCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19NQVgiLCBJUFBST1RP X01BWCk7CiNlbmRpZgoKCS8qIFNvbWUgcG9ydCBjb25maWd1cmF0aW9uICovCiNpZmRlZglJ UFBPUlRfUkVTRVJWRUQKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfUkVT RVJWRUQiLCBJUFBPUlRfUkVTRVJWRUQpOwojZWxzZQoJUHlNb2R1bGVfQWRkSW50Q29uc3Rh bnQobSwgIklQUE9SVF9SRVNFUlZFRCIsIDEwMjQpOwojZW5kaWYKI2lmZGVmCUlQUE9SVF9V U0VSUkVTRVJWRUQKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfVVNFUlJF U0VSVkVEIiwgSVBQT1JUX1VTRVJSRVNFUlZFRCk7CiNlbHNlCglQeU1vZHVsZV9BZGRJbnRD b25zdGFudChtLCAiSVBQT1JUX1VTRVJSRVNFUlZFRCIsIDUwMDApOwojZW5kaWYKCgkvKiBT b21lIHJlc2VydmVkIElQIHYuNCBhZGRyZXNzZXMgKi8KI2lmZGVmCUlOQUREUl9BTlkKCVB5 TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQU5ZIiwgSU5BRERSX0FOWSk7CiNl bHNlCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FOWSIsIDB4MDAwMDAw MDApOwojZW5kaWYKI2lmZGVmCUlOQUREUl9CUk9BRENBU1QKCVB5TW9kdWxlX0FkZEludENv bnN0YW50KG0sICJJTkFERFJfQlJPQURDQVNUIiwgSU5BRERSX0JST0FEQ0FTVCk7CiNlbHNl CglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0JST0FEQ0FTVCIsIDB4ZmZm ZmZmZmYpOwojZW5kaWYKI2lmZGVmCUlOQUREUl9MT09QQkFDSwoJUHlNb2R1bGVfQWRkSW50 Q29uc3RhbnQobSwgIklOQUREUl9MT09QQkFDSyIsIElOQUREUl9MT09QQkFDSyk7CiNlbHNl CglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0xPT1BCQUNLIiwgMHg3RjAw MDAwMSk7CiNlbmRpZgojaWZkZWYJSU5BRERSX1VOU1BFQ19HUk9VUAoJUHlNb2R1bGVfQWRk SW50Q29uc3RhbnQobSwgIklOQUREUl9VTlNQRUNfR1JPVVAiLCBJTkFERFJfVU5TUEVDX0dS T1VQKTsKI2Vsc2UKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfVU5TUEVD X0dST1VQIiwgMHhlMDAwMDAwMCk7CiNlbmRpZgojaWZkZWYJSU5BRERSX0FMTEhPU1RTX0dS T1VQCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FMTEhPU1RTX0dST1VQ IiwKCQkJCUlOQUREUl9BTExIT1NUU19HUk9VUCk7CiNlbHNlCglQeU1vZHVsZV9BZGRJbnRD b25zdGFudChtLCAiSU5BRERSX0FMTEhPU1RTX0dST1VQIiwgMHhlMDAwMDAwMSk7CiNlbmRp ZgojaWZkZWYJSU5BRERSX01BWF9MT0NBTF9HUk9VUAoJUHlNb2R1bGVfQWRkSW50Q29uc3Rh bnQobSwgIklOQUREUl9NQVhfTE9DQUxfR1JPVVAiLAoJCQkJSU5BRERSX01BWF9MT0NBTF9H Uk9VUCk7CiNlbHNlCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX01BWF9M T0NBTF9HUk9VUCIsIDB4ZTAwMDAwZmYpOwojZW5kaWYKI2lmZGVmCUlOQUREUl9OT05FCglQ eU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX05PTkUiLCBJTkFERFJfTk9ORSk7 CiNlbHNlCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX05PTkUiLCAweGZm ZmZmZmZmKTsKI2VuZGlmCgoJLyogSVB2NCBbZ3NdZXRzb2Nrb3B0IG9wdGlvbnMgKi8KI2lm ZGVmCUlQX09QVElPTlMKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9PUFRJT05T IiwgSVBfT1BUSU9OUyk7CiNlbmRpZgojaWZkZWYJSVBfSERSSU5DTAoJUHlNb2R1bGVfQWRk SW50Q29uc3RhbnQobSwgIklQX0hEUklOQ0wiLCBJUF9IRFJJTkNMKTsKI2VuZGlmCiNpZmRl ZglJUF9UT1MKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9UT1MiLCBJUF9UT1Mp OwojZW5kaWYKI2lmZGVmCUlQX1RUTAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQ X1RUTCIsIElQX1RUTCk7CiNlbmRpZgojaWZkZWYJSVBfUkVDVk9QVFMKCVB5TW9kdWxlX0Fk ZEludENvbnN0YW50KG0sICJJUF9SRUNWT1BUUyIsIElQX1JFQ1ZPUFRTKTsKI2VuZGlmCiNp ZmRlZglJUF9SRUNWUkVUT1BUUwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1JF Q1ZSRVRPUFRTIiwgSVBfUkVDVlJFVE9QVFMpOwojZW5kaWYKI2lmZGVmCUlQX1JFQ1ZEU1RB RERSCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVkRTVEFERFIiLCBJUF9S RUNWRFNUQUREUik7CiNlbmRpZgojaWZkZWYJSVBfUkVUT1BUUwoJUHlNb2R1bGVfQWRkSW50 Q29uc3RhbnQobSwgIklQX1JFVE9QVFMiLCBJUF9SRVRPUFRTKTsKI2VuZGlmCiNpZmRlZglJ UF9NVUxUSUNBU1RfSUYKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NVUxUSUNB U1RfSUYiLCBJUF9NVUxUSUNBU1RfSUYpOwojZW5kaWYKI2lmZGVmCUlQX01VTFRJQ0FTVF9U VEwKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NVUxUSUNBU1RfVFRMIiwgSVBf TVVMVElDQVNUX1RUTCk7CiNlbmRpZgojaWZkZWYJSVBfTVVMVElDQVNUX0xPT1AKCVB5TW9k dWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NVUxUSUNBU1RfTE9PUCIsIElQX01VTFRJQ0FT VF9MT09QKTsKI2VuZGlmCiNpZmRlZglJUF9BRERfTUVNQkVSU0hJUAoJUHlNb2R1bGVfQWRk SW50Q29uc3RhbnQobSwgIklQX0FERF9NRU1CRVJTSElQIiwgSVBfQUREX01FTUJFUlNISVAp OwojZW5kaWYKI2lmZGVmCUlQX0RST1BfTUVNQkVSU0hJUAoJUHlNb2R1bGVfQWRkSW50Q29u c3RhbnQobSwgIklQX0RST1BfTUVNQkVSU0hJUCIsIElQX0RST1BfTUVNQkVSU0hJUCk7CiNl bmRpZgojaWZkZWYJSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMCglQeU1vZHVsZV9BZGRJbnRD b25zdGFudChtLCAiSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMIiwKCQkJCUlQX0RFRkFVTFRf TVVMVElDQVNUX1RUTCk7CiNlbmRpZgojaWZkZWYJSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9P UAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0RFRkFVTFRfTVVMVElDQVNUX0xP T1AiLAoJCQkJSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCk7CiNlbmRpZgojaWZkZWYJSVBf TUFYX01FTUJFUlNISVBTCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTUFYX01F TUJFUlNISVBTIiwgSVBfTUFYX01FTUJFUlNISVBTKTsKI2VuZGlmCgoJLyogSVB2NiBbZ3Nd ZXRzb2Nrb3B0IG9wdGlvbnMsIGRlZmluZWQgaW4gUkZDMjU1MyAqLwojaWZkZWYJSVBWNl9K T0lOX0dST1VQCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9KT0lOX0dST1VQ IiwgSVBWNl9KT0lOX0dST1VQKTsKI2VuZGlmCiNpZmRlZglJUFY2X0xFQVZFX0dST1VQCglQ eU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9MRUFWRV9HUk9VUCIsIElQVjZfTEVB VkVfR1JPVVApOwojZW5kaWYKI2lmZGVmCUlQVjZfTVVMVElDQVNUX0hPUFMKCVB5TW9kdWxl X0FkZEludENvbnN0YW50KG0sICJJUFY2X01VTFRJQ0FTVF9IT1BTIiwgSVBWNl9NVUxUSUNB U1RfSE9QUyk7CiNlbmRpZgojaWZkZWYJSVBWNl9NVUxUSUNBU1RfSUYKCVB5TW9kdWxlX0Fk ZEludENvbnN0YW50KG0sICJJUFY2X01VTFRJQ0FTVF9JRiIsIElQVjZfTVVMVElDQVNUX0lG KTsKI2VuZGlmCiNpZmRlZglJUFY2X01VTFRJQ0FTVF9MT09QCglQeU1vZHVsZV9BZGRJbnRD b25zdGFudChtLCAiSVBWNl9NVUxUSUNBU1RfTE9PUCIsIElQVjZfTVVMVElDQVNUX0xPT1Ap OwojZW5kaWYKI2lmZGVmCUlQVjZfVU5JQ0FTVF9IT1BTCglQeU1vZHVsZV9BZGRJbnRDb25z dGFudChtLCAiSVBWNl9VTklDQVNUX0hPUFMiLCBJUFY2X1VOSUNBU1RfSE9QUyk7CiNlbmRp ZgoKCS8qIFRDUCBvcHRpb25zICovCiNpZmRlZglUQ1BfTk9ERUxBWQoJUHlNb2R1bGVfQWRk SW50Q29uc3RhbnQobSwgIlRDUF9OT0RFTEFZIiwgVENQX05PREVMQVkpOwojZW5kaWYKI2lm ZGVmCVRDUF9NQVhTRUcKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfTUFYU0VH IiwgVENQX01BWFNFRyk7CiNlbmRpZgojaWZkZWYJVENQX0NPUksKCVB5TW9kdWxlX0FkZElu dENvbnN0YW50KG0sICJUQ1BfQ09SSyIsIFRDUF9DT1JLKTsKI2VuZGlmCiNpZmRlZglUQ1Bf S0VFUElETEUKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfS0VFUElETEUiLCBU Q1BfS0VFUElETEUpOwojZW5kaWYKI2lmZGVmCVRDUF9LRUVQSU5UVkwKCVB5TW9kdWxlX0Fk ZEludENvbnN0YW50KG0sICJUQ1BfS0VFUElOVFZMIiwgVENQX0tFRVBJTlRWTCk7CiNlbmRp ZgojaWZkZWYJVENQX0tFRVBDTlQKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1Bf S0VFUENOVCIsIFRDUF9LRUVQQ05UKTsKI2VuZGlmCiNpZmRlZglUQ1BfU1lOQ05UCglQeU1v ZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX1NZTkNOVCIsIFRDUF9TWU5DTlQpOwojZW5k aWYKI2lmZGVmCVRDUF9MSU5HRVIyCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQ X0xJTkdFUjIiLCBUQ1BfTElOR0VSMik7CiNlbmRpZgojaWZkZWYJVENQX0RFRkVSX0FDQ0VQ VAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9ERUZFUl9BQ0NFUFQiLCBUQ1Bf REVGRVJfQUNDRVBUKTsKI2VuZGlmCiNpZmRlZglUQ1BfV0lORE9XX0NMQU1QCglQeU1vZHVs ZV9BZGRJbnRDb25zdGFudChtLCAiVENQX1dJTkRPV19DTEFNUCIsIFRDUF9XSU5ET1dfQ0xB TVApOwojZW5kaWYKI2lmZGVmCVRDUF9JTkZPCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudCht LCAiVENQX0lORk8iLCBUQ1BfSU5GTyk7CiNlbmRpZgojaWZkZWYJVENQX1FVSUNLQUNLCglQ eU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX1FVSUNLQUNLIiwgVENQX1FVSUNLQUNL KTsKI2VuZGlmCgoKCS8qIElQWCBvcHRpb25zICovCiNpZmRlZglJUFhfVFlQRQoJUHlNb2R1 bGVfQWRkSW50Q29uc3RhbnQobSwgIklQWF9UWVBFIiwgSVBYX1RZUEUpOwojZW5kaWYKCgkv KiBnZXR7YWRkcixuYW1lfWluZm8gcGFyYW1ldGVycyAqLwojaWZkZWYgRUFJX0FERFJGQU1J TFkKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQUREUkZBTUlMWSIsIEVBSV9B RERSRkFNSUxZKTsKI2VuZGlmCiNpZmRlZiBFQUlfQUdBSU4KCVB5TW9kdWxlX0FkZEludENv bnN0YW50KG0sICJFQUlfQUdBSU4iLCBFQUlfQUdBSU4pOwojZW5kaWYKI2lmZGVmIEVBSV9C QURGTEFHUwoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9CQURGTEFHUyIsIEVB SV9CQURGTEFHUyk7CiNlbmRpZgojaWZkZWYgRUFJX0ZBSUwKCVB5TW9kdWxlX0FkZEludENv bnN0YW50KG0sICJFQUlfRkFJTCIsIEVBSV9GQUlMKTsKI2VuZGlmCiNpZmRlZiBFQUlfRkFN SUxZCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0ZBTUlMWSIsIEVBSV9GQU1J TFkpOwojZW5kaWYKI2lmZGVmIEVBSV9NRU1PUlkKCVB5TW9kdWxlX0FkZEludENvbnN0YW50 KG0sICJFQUlfTUVNT1JZIiwgRUFJX01FTU9SWSk7CiNlbmRpZgojaWZkZWYgRUFJX05PREFU QQoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9OT0RBVEEiLCBFQUlfTk9EQVRB KTsKI2VuZGlmCiNpZmRlZiBFQUlfTk9OQU1FCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudCht LCAiRUFJX05PTkFNRSIsIEVBSV9OT05BTUUpOwojZW5kaWYKI2lmZGVmIEVBSV9TRVJWSUNF CglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NFUlZJQ0UiLCBFQUlfU0VSVklD RSk7CiNlbmRpZgojaWZkZWYgRUFJX1NPQ0tUWVBFCglQeU1vZHVsZV9BZGRJbnRDb25zdGFu dChtLCAiRUFJX1NPQ0tUWVBFIiwgRUFJX1NPQ0tUWVBFKTsKI2VuZGlmCiNpZmRlZiBFQUlf U1lTVEVNCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NZU1RFTSIsIEVBSV9T WVNURU0pOwojZW5kaWYKI2lmZGVmIEVBSV9CQURISU5UUwoJUHlNb2R1bGVfQWRkSW50Q29u c3RhbnQobSwgIkVBSV9CQURISU5UUyIsIEVBSV9CQURISU5UUyk7CiNlbmRpZgojaWZkZWYg RUFJX1BST1RPQ09MCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1BST1RPQ09M IiwgRUFJX1BST1RPQ09MKTsKI2VuZGlmCiNpZmRlZiBFQUlfTUFYCglQeU1vZHVsZV9BZGRJ bnRDb25zdGFudChtLCAiRUFJX01BWCIsIEVBSV9NQVgpOwojZW5kaWYKI2lmZGVmIEFJX1BB U1NJVkUKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9QQVNTSVZFIiwgQUlfUEFT U0lWRSk7CiNlbmRpZgojaWZkZWYgQUlfQ0FOT05OQU1FCglQeU1vZHVsZV9BZGRJbnRDb25z dGFudChtLCAiQUlfQ0FOT05OQU1FIiwgQUlfQ0FOT05OQU1FKTsKI2VuZGlmCiNpZmRlZiBB SV9OVU1FUklDSE9TVAoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX05VTUVSSUNI T1NUIiwgQUlfTlVNRVJJQ0hPU1QpOwojZW5kaWYKI2lmZGVmIEFJX01BU0sKCVB5TW9kdWxl X0FkZEludENvbnN0YW50KG0sICJBSV9NQVNLIiwgQUlfTUFTSyk7CiNlbmRpZgojaWZkZWYg QUlfQUxMCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfQUxMIiwgQUlfQUxMKTsK I2VuZGlmCiNpZmRlZiBBSV9WNE1BUFBFRF9DRkcKCVB5TW9kdWxlX0FkZEludENvbnN0YW50 KG0sICJBSV9WNE1BUFBFRF9DRkciLCBBSV9WNE1BUFBFRF9DRkcpOwojZW5kaWYKI2lmZGVm IEFJX0FERFJDT05GSUcKCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9BRERSQ09O RklHIiwgQUlfQUREUkNPTkZJRyk7CiNlbmRpZgojaWZkZWYgQUlfVjRNQVBQRUQKCVB5TW9k dWxlX0FkZEludENvbnN0YW50KG0sICJBSV9WNE1BUFBFRCIsIEFJX1Y0TUFQUEVEKTsKI2Vu ZGlmCiNpZmRlZiBBSV9ERUZBVUxUCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlf REVGQVVMVCIsIEFJX0RFRkFVTFQpOwojZW5kaWYKI2lmZGVmIE5JX01BWEhPU1QKCVB5TW9k dWxlX0FkZEludENvbnN0YW50KG0sICJOSV9NQVhIT1NUIiwgTklfTUFYSE9TVCk7CiNlbmRp ZgojaWZkZWYgTklfTUFYU0VSVgoJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX01B WFNFUlYiLCBOSV9NQVhTRVJWKTsKI2VuZGlmCiNpZmRlZiBOSV9OT0ZRRE4KCVB5TW9kdWxl X0FkZEludENvbnN0YW50KG0sICJOSV9OT0ZRRE4iLCBOSV9OT0ZRRE4pOwojZW5kaWYKI2lm ZGVmIE5JX05VTUVSSUNIT1NUCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTlVN RVJJQ0hPU1QiLCBOSV9OVU1FUklDSE9TVCk7CiNlbmRpZgojaWZkZWYgTklfTkFNRVJFUUQK CVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9OQU1FUkVRRCIsIE5JX05BTUVSRVFE KTsKI2VuZGlmCiNpZmRlZiBOSV9OVU1FUklDU0VSVgoJUHlNb2R1bGVfQWRkSW50Q29uc3Rh bnQobSwgIk5JX05VTUVSSUNTRVJWIiwgTklfTlVNRVJJQ1NFUlYpOwojZW5kaWYKI2lmZGVm IE5JX0RHUkFNCglQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfREdSQU0iLCBOSV9E R1JBTSk7CiNlbmRpZgoKCS8qIEluaXRpYWxpemUgZ2V0aG9zdGJ5bmFtZSBsb2NrICovCiNp ZmRlZiBVU0VfR0VUSE9TVEJZTkFNRV9MT0NLCglnZXRob3N0YnluYW1lX2xvY2sgPSBQeVRo cmVhZF9hbGxvY2F0ZV9sb2NrKCk7CiNlbmRpZgp9CgoKI2lmbmRlZiBIQVZFX0lORVRfUFRP TgoKLyogU2ltcGxpc3RpYyBlbXVsYXRpb24gY29kZSBmb3IgaW5ldF9wdG9uIHRoYXQgb25s eSB3b3JrcyBmb3IgSVB2NCAqLwoKaW50CmluZXRfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIg KnNyYywgdm9pZCAqZHN0KQp7CglpZiAoYWYgPT0gQUZfSU5FVCkgewoJCWxvbmcgcGFja2Vk X2FkZHI7CgkJcGFja2VkX2FkZHIgPSBpbmV0X2FkZHIoc3JjKTsKCQlpZiAocGFja2VkX2Fk ZHIgPT0gSU5BRERSX05PTkUpCgkJCXJldHVybiAwOwoJCW1lbWNweShkc3QsICZwYWNrZWRf YWRkciwgNCk7CgkJcmV0dXJuIDE7Cgl9CgkvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVBRk5P U1VQUE9SVCAqLwoJcmV0dXJuIC0xOwp9Cgpjb25zdCBjaGFyICoKaW5ldF9udG9wKGludCBh ZiwgY29uc3Qgdm9pZCAqc3JjLCBjaGFyICpkc3QsIHNvY2tsZW5fdCBzaXplKQp7CglpZiAo YWYgPT0gQUZfSU5FVCkgewoJCXN0cnVjdCBpbl9hZGRyIHBhY2tlZF9hZGRyOwoJCWlmIChz aXplIDwgMTYpCgkJCS8qIFNob3VsZCBzZXQgZXJybm8gdG8gRU5PU1BDLiAqLwoJCQlyZXR1 cm4gTlVMTDsKCQltZW1jcHkoJnBhY2tlZF9hZGRyLCBzcmMsIHNpemVvZihwYWNrZWRfYWRk cikpOwoJCXJldHVybiBzdHJuY3B5KGRzdCwgaW5ldF9udG9hKHBhY2tlZF9hZGRyKSwgc2l6 ZSk7Cgl9CgkvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVBRk5PU1VQUE9SVCAqLwoJcmV0dXJu IE5VTEw7Cn0KCiNlbmRpZgo= --------------67BDF2B7F2453AAB6129FCFC--
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4