From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1HZzWO-0000OP-El for qemu-devel@nongnu.org; Fri, 06 Apr 2007 21:15:16 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1HZzWL-0000Nw-TO for qemu-devel@nongnu.org; Fri, 06 Apr 2007 21:15:15 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1HZzWL-0000No-Jh for qemu-devel@nongnu.org; Fri, 06 Apr 2007 21:15:13 -0400 Received: from wx-out-0506.google.com ([66.249.82.238]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1HZzSm-000231-Hn for qemu-devel@nongnu.org; Fri, 06 Apr 2007 21:11:33 -0400 Received: by wx-out-0506.google.com with SMTP id i30so1798534wxd for ; Fri, 06 Apr 2007 18:11:31 -0700 (PDT) Message-ID: <83a4d4ca0704061811ka631da0ufad5af1a63ba19c2@mail.gmail.com> Date: Sat, 7 Apr 2007 03:11:30 +0200 From: "Eduardo Felipe" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_15077_19359660.1175908290833" Subject: [Qemu-devel] Feature proposal: USB devices over TCP Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel ------=_Part_15077_19359660.1175908290833 Content-Type: multipart/alternative; boundary="----=_Part_15078_487858.1175908290833" ------=_Part_15078_487858.1175908290833 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi everybody, I think that a useful feature for QEMU would be to expose the USB interface through TCP. It would allow quick USB device development in high level languages without recompiling QEMU. We could have an instance of QEMU running all the time while we create our device and hot plug/unplug it whenever we want to. This could also attract people interested in hardware emulation, but scared of learning QEMU internals just to create a simple new device. I think USB is quite suited for this, as it is designed for pluggable external devices, but something similar could be made for serial and parallel devices too. The attached patch is a quick hack derived from the VNC server just to show the idea, not intended for commiting. A dummy protocol is used for message interchange between server and client. It adds the new command line option: -usbtcp port It starts a socket listening on port for incoming connections. A sample USB mouse in python is also provided that moves the cursor in circles. Would such a feature be of any interest for QEMU? Regards, Eduardo Felipe ------=_Part_15078_487858.1175908290833 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi everybody,

I think that a useful feature for QEMU would be to expose the USB interface through TCP.

It would allow quick USB device development in high level languages without recompiling QEMU. We could have an instance of QEMU running all the time while we create our device and hot plug/unplug it whenever we want to.

This could also attract people interested in hardware emulation, but scared of learning QEMU internals just to create a simple new device.

I think USB is quite suited for this, as it is designed for pluggable external devices, but something similar could be made for serial and parallel devices too.

The attached patch is a quick hack derived from the VNC server just to show the idea, not intended for commiting. A dummy protocol is used for message interchange between server and client.

It adds the new command line option:
 -usbtcp port
It starts a socket listening on port for incoming connections. A sample USB mouse in python is also provided that moves the cursor in circles.

Would such a feature be of any interest for QEMU?

Regards,
Eduardo Felipe



------=_Part_15078_487858.1175908290833-- ------=_Part_15077_19359660.1175908290833 Content-Type: application/octet-stream; name=usb_over_tcp.diff Content-Transfer-Encoding: base64 X-Attachment-Id: f_f07co1h3 Content-Disposition: attachment; filename="usb_over_tcp.diff" KioqIGh3L3VzYi10Y3AuYwlXZWQgRGVjIDMxIDE0OjAwOjAwIDE5NjkNCisrKyBody91c2ItdGNw LmMJRnJpIEFwciAgNiAyMzozNjowMSAyMDA3DQpAQCAtMCwwICsxLDU5MCBAQA0KKy8qDQorICog UUVNVSBVU0Igb3ZlciBUQ1AgcHJvdG9jb2wNCisgKiANCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcg RWR1YXJkbyBGZWxpcGUNCisgKiANCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBm cmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQorICogb2YgdGhp cyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3 YXJlIiksIHRvIGRlYWwNCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwg aW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzDQorICogdG8gdXNlLCBjb3B5 LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Ig c2VsbA0KKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0 byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQorICoNCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0 IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0K KyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0K KyAqDQorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFO VFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5P VCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCisgKiBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBF VkVOVCBTSEFMTA0KKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJM RSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQorICogTElBQklMSVRZLCBXSEVUSEVS IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJP TSwNCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUg VVNFIE9SIE9USEVSIERFQUxJTkdTIElODQorICogVEhFIFNPRlRXQVJFLg0KKyAqLw0KKyNpbmNs dWRlICJ2bC5oIg0KKyNpbmNsdWRlICJxZW11X3NvY2tldC5oIg0KKw0KKy8vI2RlZmluZSBERUJV R19VU0JUQ1ANCisNCisjaWZkZWYgREVCVUdfVVNCVENQDQorI2RlZmluZSB1cGRlYnVnKGZtdCwg YXJnLi4uKSBwcmludGYoInVzYi10Y3A6ICIgZm10LCAjI2FyZykNCisjZWxzZQ0KKyNkZWZpbmUg dXBkZWJ1ZyhmbXQsIGFyZy4uLikgKCh2b2lkKTApDQorI2VuZGlmDQorDQorDQordHlwZWRlZiBz dHJ1Y3QgVVNCVENQU3RhdGUgVVNCVENQU3RhdGU7DQorDQordHlwZWRlZiBzdHJ1Y3QgQnVmZmVy DQorew0KKyAgICBzaXplX3QgY2FwYWNpdHk7DQorICAgIHNpemVfdCBvZmZzZXQ7DQorICAgIGNo YXIgKmJ1ZmZlcjsNCit9IEJ1ZmZlcjsNCisNCit0eXBlZGVmIGludCBVU0JUQ1BSZWFkRXZlbnQo VVNCVENQU3RhdGUgKnMsIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4pOw0KKw0KK3N0cnVjdCBVU0JU Q1BTdGF0ZSB7DQorICAgIFVTQkRldmljZSBkZXY7DQorICAgIGludCBsc29jazsNCisgICAgaW50 IGNzb2NrOw0KKyAgICBpbnQgcGx1Z2dlZDsNCisgICAgDQorICAgIEJ1ZmZlciBvdXRwdXQ7DQor ICAgIEJ1ZmZlciBpbnB1dDsNCisgICAgDQorICAgIFVTQlRDUFJlYWRFdmVudCAqcmVhZF9oYW5k bGVyOw0KKyAgICBzaXplX3QgcmVhZF9oYW5kbGVyX2V4cGVjdDsNCisgICAgDQorfTsNCisNCisv KiBYWFggcmVtb3ZlIGdsb2JhbCB2YXJpYWJsZSB0byBhbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMg Ki8NCitVU0JUQ1BTdGF0ZSAqcHM7DQorDQorZXh0ZXJuIGludCBwYXJzZV9ob3N0X3BvcnQoc3Ry dWN0IHNvY2thZGRyX2luICpzYWRkciwgY29uc3QgY2hhciAqc3RyKTsNCisNCitzdGF0aWMgdm9p ZCB1c2JfdGNwX3dyaXRlKFVTQlRDUFN0YXRlICpzLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qg bGVuKTsNCitzdGF0aWMgdm9pZCB1c2JfdGNwX3dyaXRlX3MzMihVU0JUQ1BTdGF0ZSAqcywgaW50 MzJfdCB2YWx1ZSk7DQorc3RhdGljIHZvaWQgdXNiX3RjcF93cml0ZV91MzIoVVNCVENQU3RhdGUg KnMsIHVpbnQzMl90IHZhbHVlKTsNCitzdGF0aWMgdm9pZCB1c2JfdGNwX3dyaXRlX3UxNihVU0JU Q1BTdGF0ZSAqcywgdWludDE2X3QgdmFsdWUpOw0KK3N0YXRpYyB2b2lkIHVzYl90Y3Bfd3JpdGVf dTgoVVNCVENQU3RhdGUgKnMsIHVpbnQ4X3QgdmFsdWUpOw0KK3N0YXRpYyB2b2lkIHVzYl90Y3Bf Zmx1c2goVVNCVENQU3RhdGUgKnMpOw0KK3N0YXRpYyBpbnQgdXNiX3RjcF9jbGllbnRfaW9fZXJy b3IoVVNCVENQU3RhdGUgKnMsIGludCByZXQsIGludCBsYXN0X2Vycm5vKTsNCitzdGF0aWMgdm9p ZCB1c2JfdGNwX2NsaWVudF9lcnJvcihVU0JUQ1BTdGF0ZSAqcyk7DQorc3RhdGljIHZvaWQgdXNi X3RjcF9jbGllbnRfd3JpdGUodm9pZCAqb3BhcXVlKTsNCitzdGF0aWMgdm9pZCB1c2JfdGNwX2Ns aWVudF9yZWFkKHZvaWQgKm9wYXF1ZSk7DQorDQorc3RhdGljIHVpbnQ4X3QgcmVhZF91OCh1aW50 OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KTsNCitzdGF0aWMgdWludDE2X3QgcmVhZF91MTYodWlu dDhfdCAqZGF0YSwgc2l6ZV90IG9mZnNldCk7DQorc3RhdGljIGludDE2X3QgcmVhZF9zMTYodWlu dDhfdCAqZGF0YSwgc2l6ZV90IG9mZnNldCk7DQorc3RhdGljIGludDMyX3QgcmVhZF9zMzIodWlu dDhfdCAqZGF0YSwgc2l6ZV90IG9mZnNldCk7DQorc3RhdGljIHVpbnQzMl90IHJlYWRfdTMyKHVp bnQ4X3QgKmRhdGEsIHNpemVfdCBvZmZzZXQpOw0KKw0KK3N0YXRpYyB2b2lkIHVzYl90Y3BfbGlz dGVuX3JlYWQodm9pZCAqb3BhcXVlKTsNCitzdGF0aWMgaW50IHVzYl90Y3BfbGlzdGVuX3BvbGwo dm9pZCAqb3BhcXVlKTsNCisNCisNCitzdGF0aWMgdm9pZCBidWZmZXJfcmVzZXJ2ZShCdWZmZXIg KmJ1ZmZlciwgc2l6ZV90IGxlbikNCit7DQorICAgIGlmICgoYnVmZmVyLT5jYXBhY2l0eSAtIGJ1 ZmZlci0+b2Zmc2V0KSA8IGxlbikgew0KKyAgICAgICAgYnVmZmVyLT5jYXBhY2l0eSArPSAobGVu ICsgMTAyNCk7DQorICAgICAgICBidWZmZXItPmJ1ZmZlciA9IHJlYWxsb2MoYnVmZmVyLT5idWZm ZXIsIGJ1ZmZlci0+Y2FwYWNpdHkpOw0KKyAgICAgICAgaWYgKGJ1ZmZlci0+YnVmZmVyID09IE5V TEwpIHsNCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYi10Y3A6IG91dCBvZiBtZW1v cnlcbiIpOw0KKyAgICAgICAgICAgIGV4aXQoMSk7DQorICAgICAgICB9DQorICAgIH0NCit9DQor DQorc3RhdGljIHZvaWQgYnVmZmVyX2NvbnN1bWUoQnVmZmVyICpidWZmZXIsc2l6ZV90IGxlbikN Cit7DQorICAgIG1lbW1vdmUoYnVmZmVyLT5idWZmZXIsIGJ1ZmZlci0+YnVmZmVyICsgbGVuLCAo YnVmZmVyLT5vZmZzZXQgLSBsZW4pKTsNCisgICAgYnVmZmVyLT5vZmZzZXQgLT0gbGVuOw0KK30N CisNCisNCitzdGF0aWMgaW50IGJ1ZmZlcl9lbXB0eShCdWZmZXIgKmJ1ZmZlcikNCit7DQorICAg IHJldHVybiBidWZmZXItPm9mZnNldCA9PSAwOw0KK30NCisNCitzdGF0aWMgY2hhciAqYnVmZmVy X2VuZChCdWZmZXIgKmJ1ZmZlcikNCit7DQorICAgIHJldHVybiBidWZmZXItPmJ1ZmZlciArIGJ1 ZmZlci0+b2Zmc2V0Ow0KK30NCisNCitzdGF0aWMgdm9pZCBidWZmZXJfcmVzZXQoQnVmZmVyICpi dWZmZXIpDQorew0KKyAgICAgICAgYnVmZmVyLT5vZmZzZXQgPSAwOw0KK30NCisNCitzdGF0aWMg dm9pZCBidWZmZXJfYXBwZW5kKEJ1ZmZlciAqYnVmZmVyLCBjb25zdCB2b2lkICpkYXRhLCBzaXpl X3QgbGVuKQ0KK3sNCisgICAgbWVtY3B5KGJ1ZmZlci0+YnVmZmVyICsgYnVmZmVyLT5vZmZzZXQs IGRhdGEsIGxlbik7DQorICAgIGJ1ZmZlci0+b2Zmc2V0ICs9IGxlbjsNCit9DQorDQorc3RhdGlj IGludCB1c2JfdGNwX2NsaWVudF9pb19lcnJvcihVU0JUQ1BTdGF0ZSAqcywgaW50IHJldCwgaW50 IGxhc3RfZXJybm8pDQorew0KKyAgICBjaGFyIGRlbHN0cls2XTsNCisgICAgDQorICAgIGlmIChy ZXQgPT0gMCB8fCByZXQgPT0gLTEpIHsNCisgICAgICAgIGlmIChyZXQgPT0gLTEgJiYgKGxhc3Rf ZXJybm8gPT0gRUlOVFIgfHwgbGFzdF9lcnJubyA9PSBFQUdBSU4pKQ0KKyAgICAgICAgICAgIHJl dHVybiAwOw0KKw0KKyAgICAgICAgLy8gRGV0YWNoIGRldmljZQ0KKyAgICAgICAgaWYgKHMtPnBs dWdnZWQpIHsNCisgICAgICAgICAgICBzLT5wbHVnZ2VkID0gMDsNCisgICAgICAgICAgICBzcHJp bnRmKGRlbHN0ciwiJWQuJWQiLCAwLCBzLT5kZXYuYWRkcik7DQorICAgICAgICAgICAgZG9fdXNi X2RlbChkZWxzdHIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gQ2xvc2UgY29ubmVjdGlv bg0KKyAgICAgICAgaWYgKHMtPmNzb2NrIT0tMSkgew0KKyAgICAgICAgICAgIHFlbXVfc2V0X2Zk X2hhbmRsZXIyKHMtPmNzb2NrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsNCisgICAgICAgICAg ICBjbG9zZXNvY2tldChzLT5jc29jayk7DQorICAgICAgICAgICAgcy0+Y3NvY2sgPSAtMTsNCisg ICAgICAgICAgICBidWZmZXJfcmVzZXQoJnMtPmlucHV0KTsNCisgICAgICAgICAgICBidWZmZXJf cmVzZXQoJnMtPm91dHB1dCk7ICAgIA0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIDA7DQor ICAgIH0NCisgICAgcmV0dXJuIHJldDsNCit9DQorDQorc3RhdGljIHZvaWQgdXNiX3RjcF9jbGll bnRfZXJyb3IoVVNCVENQU3RhdGUgKnMpDQorew0KKyAgICB1c2JfdGNwX2NsaWVudF9pb19lcnJv cihzLCAtMSwgRUlOVkFMKTsNCit9DQorDQorc3RhdGljIHZvaWQgdXNiX3RjcF9jbGllbnRfd3Jp dGUodm9pZCAqb3BhcXVlKQ0KK3sNCisgICAgbG9uZyByZXQ7DQorICAgIFVTQlRDUFN0YXRlICpz ID0gb3BhcXVlOw0KKw0KKyAgICByZXQgPSBzZW5kKHMtPmNzb2NrLCBzLT5vdXRwdXQuYnVmZmVy LCBzLT5vdXRwdXQub2Zmc2V0LCAwKTsNCisgICAgcmV0ID0gdXNiX3RjcF9jbGllbnRfaW9fZXJy b3IocywgcmV0LCBzb2NrZXRfZXJyb3IoKSk7DQorICAgIGlmICghcmV0KQ0KKyAgICAgICAgcmV0 dXJuOw0KKw0KKyAgICBtZW1tb3ZlKHMtPm91dHB1dC5idWZmZXIsIHMtPm91dHB1dC5idWZmZXIg KyByZXQsIChzLT5vdXRwdXQub2Zmc2V0IC0gcmV0KSk7DQorICAgIHMtPm91dHB1dC5vZmZzZXQg LT0gcmV0Ow0KKw0KKyAgICBpZiAocy0+b3V0cHV0Lm9mZnNldCA9PSAwKSB7DQorICAgICAgICBx ZW11X3NldF9mZF9oYW5kbGVyMihzLT5jc29jaywgTlVMTCwgdXNiX3RjcF9jbGllbnRfcmVhZCwg TlVMTCwgcyk7DQorICAgIH0NCit9DQorDQorDQorc3RhdGljIHZvaWQgdXNiX3RjcF9yZWFkX3do ZW4oVVNCVENQU3RhdGUgKnMsIFVTQlRDUFJlYWRFdmVudCAqZnVuYywgc2l6ZV90IGV4cGVjdGlu ZykNCit7DQorICAgIHMtPnJlYWRfaGFuZGxlciA9IGZ1bmM7DQorICAgIHMtPnJlYWRfaGFuZGxl cl9leHBlY3QgPSBleHBlY3Rpbmc7DQorfQ0KKw0KKw0KK3N0YXRpYyBpbnQgdXNiX3RjcF9yZWFk X2FsbCh2b2lkICpvcGFxdWUpDQorew0KKyAgICBVU0JUQ1BTdGF0ZSAqcyA9IG9wYXF1ZTsNCisg ICAgaW50IHJldDsNCisgICAgDQorICAgIGJ1ZmZlcl9yZXNlcnZlKCZzLT5pbnB1dCwgNDA5Nik7 DQorDQorICAgIGRvIHsNCisgICAgICAgIHJldCA9IHJlY3Yocy0+Y3NvY2ssIGJ1ZmZlcl9lbmQo JnMtPmlucHV0KSwgNDA5NiwgMCk7DQorICAgIH0gd2hpbGUgKHJldD09LTEgJiYgc29ja2V0X2Vy cm9yKCk9PUVJTlRSKTsNCisNCisgICAgcmV0ID0gdXNiX3RjcF9jbGllbnRfaW9fZXJyb3Iocywg cmV0LCBzb2NrZXRfZXJyb3IoKSk7DQorDQorICAgIHMtPmlucHV0Lm9mZnNldCArPSByZXQ7DQor ICAgIA0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCitzdGF0aWMgdm9pZCB1c2JfdGNwX2NsaWVu dF9yZWFkKHZvaWQgKm9wYXF1ZSkNCit7DQorICAgIFVTQlRDUFN0YXRlICpzID0gb3BhcXVlOw0K KyAgICBpbnQgcmV0Ow0KKyAgICANCisgICAgYnVmZmVyX3Jlc2VydmUoJnMtPmlucHV0LCA0MDk2 KTsNCisNCisgICAgcmV0ID0gcmVjdihzLT5jc29jaywgYnVmZmVyX2VuZCgmcy0+aW5wdXQpLCA0 MDk2LCAwKTsNCisgICAgDQorICAgIHJldCA9IHVzYl90Y3BfY2xpZW50X2lvX2Vycm9yKHMsIHJl dCwgc29ja2V0X2Vycm9yKCkpOw0KKyAgICBpZiAoIXJldCkNCisgICAgICAgIHJldHVybjsNCisN CisgICAgcy0+aW5wdXQub2Zmc2V0ICs9IHJldDsNCisNCisgICAgd2hpbGUgKHMtPnJlYWRfaGFu ZGxlciAmJiBzLT5pbnB1dC5vZmZzZXQgPj0gcy0+cmVhZF9oYW5kbGVyX2V4cGVjdCkgew0KKw0K KyAgICAgICAgaW50IHJldDsNCisgICAgICAgIHNpemVfdCBsZW4gPSBzLT5yZWFkX2hhbmRsZXJf ZXhwZWN0Ow0KKw0KKyAgICAgICAgcmV0ID0gcy0+cmVhZF9oYW5kbGVyKHMsIHMtPmlucHV0LmJ1 ZmZlciwgbGVuKTsNCisgICAgICAgIGlmIChzLT5jc29jayA9PSAtMSkNCisgICAgICAgICAgICBy ZXR1cm47DQorICAgICAgICANCisgICAgICAgIGlmICghcmV0KSB7DQorICAgICAgICAgICAgYnVm ZmVyX2NvbnN1bWUoJnMtPmlucHV0LGxlbik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAg ICAgIHMtPnJlYWRfaGFuZGxlcl9leHBlY3QgPSByZXQ7DQorICAgICAgICB9DQorICAgIH0NCit9 DQorDQorDQorc3RhdGljIHZvaWQgdXNiX3RjcF93cml0ZShVU0JUQ1BTdGF0ZSAqcywgY29uc3Qg dm9pZCAqZGF0YSwgc2l6ZV90IGxlbikNCit7DQorICAgIGJ1ZmZlcl9yZXNlcnZlKCZzLT5vdXRw dXQsIGxlbik7DQorICAgIA0KKyAgICBpZiAoYnVmZmVyX2VtcHR5KCZzLT5vdXRwdXQpKSB7DQor ICAgICAgICBxZW11X3NldF9mZF9oYW5kbGVyMihzLT5jc29jaywgTlVMTCwgdXNiX3RjcF9jbGll bnRfcmVhZCwgTlVMTCwgcyk7DQorICAgIH0NCisNCisgICAgYnVmZmVyX2FwcGVuZCgmcy0+b3V0 cHV0LCBkYXRhLCBsZW4pOw0KK30NCisNCitzdGF0aWMgdm9pZCB1c2JfdGNwX3dyaXRlX3MzMihV U0JUQ1BTdGF0ZSAqcywgaW50MzJfdCB2YWx1ZSkNCit7DQorICAgIHVzYl90Y3Bfd3JpdGVfdTMy KHMsICoodWludDMyX3QgKikmdmFsdWUpOw0KK30NCisNCitzdGF0aWMgdm9pZCB1c2JfdGNwX3dy aXRlX3UzMihVU0JUQ1BTdGF0ZSAqcywgdWludDMyX3QgdmFsdWUpDQorew0KKyAgICB1aW50OF90 IGJ1Zls0XTsNCisNCisgICAgYnVmWzBdID0gKHZhbHVlID4+IDI0KSAmIDB4RkY7DQorICAgIGJ1 ZlsxXSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOw0KKyAgICBidWZbMl0gPSAodmFsdWUgPj4gIDgp ICYgMHhGRjsNCisgICAgYnVmWzNdID0gdmFsdWUgJiAweEZGOw0KKw0KKyAgICB1c2JfdGNwX3dy aXRlKHMsIGJ1ZiwgNCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHVzYl90Y3Bfd3JpdGVfdTE2KFVT QlRDUFN0YXRlICpzLCB1aW50MTZfdCB2YWx1ZSkNCit7DQorICAgIHVpbnQ4X3QgYnVmWzJdOw0K Kw0KKyAgICBidWZbMF0gPSAodmFsdWUgPj4gOCkgJiAweEZGOw0KKyAgICBidWZbMV0gPSB2YWx1 ZSAmIDB4RkY7DQorDQorICAgIHVzYl90Y3Bfd3JpdGUocywgYnVmLCAyKTsNCit9DQorDQorc3Rh dGljIHZvaWQgdXNiX3RjcF93cml0ZV91OChVU0JUQ1BTdGF0ZSAqcywgdWludDhfdCB2YWx1ZSkN Cit7DQorICAgIHVzYl90Y3Bfd3JpdGUocywgKGNoYXIgKikmdmFsdWUsIDEpOw0KK30NCisNCitz dGF0aWMgdm9pZCB1c2JfdGNwX2ZsdXNoKFVTQlRDUFN0YXRlICpzKQ0KK3sNCisgICAgaWYgKHMt Pm91dHB1dC5vZmZzZXQpDQorICAgICAgICB1c2JfdGNwX2NsaWVudF93cml0ZShzKTsNCit9DQor DQorc3RhdGljIHVpbnQ4X3QgcmVhZF91OCh1aW50OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KQ0K K3sNCisgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOw0KKyAgICByZXR1cm4gcHRy W29mZnNldF07DQorfQ0KKw0KK3N0YXRpYyB1aW50MTZfdCByZWFkX3UxNih1aW50OF90ICpkYXRh LCBzaXplX3Qgb2Zmc2V0KQ0KK3sNCisgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRh Ow0KKyAgICByZXR1cm4gKChwdHJbb2Zmc2V0XSAmIDB4RkYpIDw8IDgpIHwgKHB0cltvZmZzZXQg KyAxXSAmIDB4RkYpOw0KK30NCisNCitzdGF0aWMgaW50MTZfdCByZWFkX3MxNih1aW50OF90ICpk YXRhLCBzaXplX3Qgb2Zmc2V0KQ0KK3sNCisgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilk YXRhOw0KKyAgICByZXR1cm4gKGludDE2X3QpKChwdHJbb2Zmc2V0XSAmIDB4RkYpIDw8IDgpIHwg KHB0cltvZmZzZXQgKyAxXSAmIDB4RkYpOw0KK30NCisNCitzdGF0aWMgaW50MzJfdCByZWFkX3Mz Mih1aW50OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KQ0KK3sNCisgICAgdWludDhfdCAqcHRyID0g KHVpbnQ4X3QgKilkYXRhOw0KKyAgICByZXR1cm4gKGludDMyX3QpKChwdHJbb2Zmc2V0XSA8PCAy NCkgfCAocHRyW29mZnNldCArIDFdIDw8IDE2KSB8DQorICAgICAgICAgICAgICAgICAgICAgKHB0 cltvZmZzZXQgKyAyXSA8PCA4KSB8IHB0cltvZmZzZXQgKyAzXSk7DQorfQ0KKw0KK3N0YXRpYyB1 aW50MzJfdCByZWFkX3UzMih1aW50OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KQ0KK3sNCisgICAg dWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOw0KKyAgICByZXR1cm4gKChwdHJbb2Zmc2V0 XSA8PCAyNCkgfCAocHRyW29mZnNldCArIDFdIDw8IDE2KSB8DQorICAgICAgICAgICAgKHB0cltv ZmZzZXQgKyAyXSA8PCA4KSB8IHB0cltvZmZzZXQgKyAzXSk7DQorfQ0KKw0KKw0KK3N0YXRpYyB2 b2lkIHVzYl90Y3BfaGFuZGxlX3Jlc2V0KFVTQkRldmljZSAqZGV2KQ0KK3sNCisgICAgVVNCVENQ U3RhdGUgKnMgPSAoVVNCVENQU3RhdGUgKilkZXY7DQorICAgIGludCBhdmxlbjsNCisgICAgaW50 MTZfdCBkYXRhbGVuOw0KKw0KKyAgICBpZiAocy0+Y3NvY2sgPT0gLTEpDQorICAgICAgICByZXR1 cm4gVVNCX1JFVF9TVEFMTDsNCisgICAgDQorICAgIHVwZGVidWcoIltSZXNldF1cbiIpOw0KKyAg ICB1c2JfdGNwX3dyaXRlKHMsIlJTIiwyKTsNCisgICAgdXNiX3RjcF9mbHVzaChzKTsNCisNCisg ICAgYXZsZW4gPSB1c2JfdGNwX3JlYWRfYWxsKHMpOw0KKyAgICBkYXRhbGVuID0gcmVhZF9zMTYo cy0+aW5wdXQuYnVmZmVyLDApOw0KKyAgICBpZiAoZGF0YWxlbj49MCkNCisgICAgICAgIGJ1ZmZl cl9jb25zdW1lKCZzLT5pbnB1dCxkYXRhbGVuKzIpOw0KK30NCisNCitzdGF0aWMgaW50IHVzYl90 Y3BfaGFuZGxlX2NvbnRyb2woVVNCRGV2aWNlICpkZXYsIGludCByZXF1ZXN0LCBpbnQgdmFsdWUs DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50IGxlbmd0 aCwgdWludDhfdCAqZGF0YSkNCit7DQorICAgIFVTQlRDUFN0YXRlICpzID0gKFVTQlRDUFN0YXRl ICopZGV2Ow0KKyAgICBpbnQgcmV0ID0gMDsNCisgICAgaW50IGF2bGVuOw0KKyAgICBpbnQxNl90 IGRhdGFsZW47DQorICAgIA0KKyAgICB1cGRlYnVnKCJbQ29udHJvbF0gIHJlcXVlc3Q6MHglMDR4 ICB2YWx1ZToweCUwNHhcbiIscmVxdWVzdCx2YWx1ZSk7DQorICAgIA0KKyAgICBpZiAocy0+Y3Nv Y2sgPT0gLTEpDQorICAgICAgICByZXR1cm4gVVNCX1JFVF9TVEFMTDsNCisgICAgDQorICAgIC8v IFFFTVUgc2lkZSBoYW5kbGluZw0KKyAgICBzd2l0Y2gocmVxdWVzdCkgew0KKyAgICBjYXNlIERl dmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9BRERSRVNTOg0KKyAgICAgICAgZGV2LT5hZGRy ID0gdmFsdWU7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwg VVNCX1JFUV9DTEVBUl9GRUFUVVJFOg0KKyAgICAgICAgaWYgKHZhbHVlID09IFVTQl9ERVZJQ0Vf UkVNT1RFX1dBS0VVUCkNCisgICAgICAgICAgICBkZXYtPnJlbW90ZV93YWtldXAgPSAwOw0KKyAg ICAgICAgYnJlYWs7DQorICAgIGNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0ZF QVRVUkU6DQorICAgICAgICBpZiAodmFsdWUgPT0gVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQKQ0K KyAgICAgICAgICAgIGRldi0+cmVtb3RlX3dha2V1cCA9IDE7DQorICAgICAgICBicmVhazsNCisg ICAgLy8gLi4uDQorICAgIH0NCisgICAgDQorICAgIHVzYl90Y3Bfd3JpdGUocywiQ1QiLDIpOw0K KyAgICB1c2JfdGNwX3dyaXRlX3UxNihzLCByZXF1ZXN0KTsgDQorICAgIHVzYl90Y3Bfd3JpdGVf dTE2KHMsIHZhbHVlKTsgDQorICAgIHVzYl90Y3Bfd3JpdGVfdTE2KHMsIGluZGV4KTsgDQorICAg IHVzYl90Y3Bfd3JpdGVfdTE2KHMsIGxlbmd0aCk7IA0KKyAgICB1c2JfdGNwX2ZsdXNoKHMpOw0K Kw0KKyAgICBhdmxlbiA9IHVzYl90Y3BfcmVhZF9hbGwocyk7DQorICAgIGlmIChhdmxlbj49Mikg ew0KKyAgICAgICAgZGF0YWxlbiA9IHJlYWRfczE2KHMtPmlucHV0LmJ1ZmZlciwwKTsNCisNCisg ICAgICAgIGlmIChkYXRhbGVuPjApDQorICAgICAgICAgICAgbWVtY3B5KGRhdGEscy0+aW5wdXQu YnVmZmVyKzIsZGF0YWxlbik7DQorDQorICAgICAgICBpZiAoZGF0YWxlbj49MCkNCisgICAgICAg ICAgICBidWZmZXJfY29uc3VtZSgmcy0+aW5wdXQsZGF0YWxlbisyKTsNCisgICAgICAgIA0KKyAg ICAgICAgcmV0dXJuIGRhdGFsZW47DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICByZXR1 cm4gVVNCX1JFVF9TVEFMTDsNCisgICAgfQ0KK30NCisNCisNCitzdGF0aWMgaW50IHVzYl90Y3Bf aGFuZGxlX2RhdGEoVVNCRGV2aWNlICpkZXYsIFVTQlBhY2tldCAqcCkNCit7DQorICAgIFVTQlRD UFN0YXRlICpzID0gKFVTQlRDUFN0YXRlICopZGV2Ow0KKyAgICBpbnQgcmV0ID0gMDsNCisgICAg aW50IGF2bGVuOw0KKyAgICBpbnQxNl90IGRhdGFsZW47DQorICAgIA0KKyAgICB1cGRlYnVnKCJb RGF0YV0gIHBpZDoweCUwMnggIHBhY2tldCBzaXplOiVkXG4iLHAtPnBpZCxwLT5sZW4pOw0KKyAg ICANCisgICAgaWYgKHMtPmNzb2NrID09IC0xKQ0KKyAgICAgICAgcmV0dXJuIFVTQl9SRVRfU1RB TEw7DQorICAgIA0KKyAgICBzd2l0Y2gocC0+cGlkKSB7DQorICAgIGNhc2UgVVNCX1RPS0VOX0lO Og0KKyAgICAgICAgaWYgKHAtPmRldmVwICE9IDEpDQorICAgICAgICAgICAgZ290byBmYWlsOw0K KyAgICAgICAgICAgIA0KKyAgICAgICAgdXNiX3RjcF93cml0ZShzLCJESSIsMik7DQorICAgICAg ICB1c2JfdGNwX3dyaXRlX3UxNihzLCBwLT5sZW4pOyANCisgICAgICAgIHVzYl90Y3BfZmx1c2go cyk7DQorICAgICAgICBhdmxlbiA9IHVzYl90Y3BfcmVhZF9hbGwocyk7DQorICAgICAgICANCisg ICAgICAgIGlmIChhdmxlbiA8IDIpDQorICAgICAgICAgICAgZ290byBmYWlsOw0KKyAgICAgICAg DQorICAgICAgICBkYXRhbGVuID0gcmVhZF9zMTYocy0+aW5wdXQuYnVmZmVyLDApOw0KKw0KKyAg ICAgICAgaWYgKGRhdGFsZW4+MCkNCisgICAgICAgICAgICBtZW1jcHkocC0+ZGF0YSxzLT5pbnB1 dC5idWZmZXIrMixkYXRhbGVuKTsNCisNCisgICAgICAgIGlmIChkYXRhbGVuPj0wKQ0KKyAgICAg ICAgICAgIGJ1ZmZlcl9jb25zdW1lKCZzLT5pbnB1dCxkYXRhbGVuKzIpOw0KKyAgICAgICAgDQor ICAgICAgICByZXQgPSBkYXRhbGVuOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgVVNCX1RP S0VOX09VVDoNCisgICAgICAgIC8qIFhYWCBUT0RPICovDQorICAgIGRlZmF1bHQ6DQorICAgIGZh aWw6DQorICAgICAgICByZXQgPSBVU0JfUkVUX1NUQUxMOw0KKyAgICAgICAgYnJlYWs7DQorICAg IH0NCisgICAgcmV0dXJuIHJldDsNCit9DQorDQorc3RhdGljIHZvaWQgdXNiX3RjcF9oYW5kbGVf ZGVzdHJveShVU0JEZXZpY2UgKmRldikNCit7DQorICAgIFVTQlRDUFN0YXRlICpzID0gKFVTQlRD UFN0YXRlICopZGV2Ow0KKyAgICB1cGRlYnVnKCJbRGVzdHJveV1cbiIpOw0KKyAgICANCisgICAg dXNiX3RjcF9jbGllbnRfZXJyb3Iocyk7DQorICAgIG1lbXNldCgmcy0+ZGV2LCAwLCBzaXplb2Yo VVNCRGV2aWNlKSk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgcHJvdG9jb2xfdmVyc2lvbihVU0JUQ1BT dGF0ZSAqcywgY2hhciAqdmVyc2lvbiwgc2l6ZV90IGxlbikNCit7DQorICAgIGNoYXIgbG9jYWxb MTVdOw0KKyAgICBpbnQgbWFqLCBtaW47DQorDQorICAgIG1lbWNweShsb2NhbCwgdmVyc2lvbiwg MTUpOw0KKyAgICBsb2NhbFsxNV0gPSAwOw0KKw0KKyAgICBpZiAoc3NjYW5mKGxvY2FsLCAiVVNC VENQICUwM2QuJTAzZFxuIiwgJm1haiwgJm1pbikgIT0gMikgew0KKyAgICAgICAgdXNiX3RjcF9j bGllbnRfZXJyb3Iocyk7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfSAgICANCisNCisgICAg dXBkZWJ1ZygibmV3IFVTQiBkZXZpY2UgcGx1Z2dlZFxuIik7DQorICAgIGRvX3VzYl9hZGQoIlRD UGRldmljZSIpOw0KKyAgICANCisgICAgcy0+cGx1Z2dlZCA9IDE7DQorICAgIA0KKyAgICBxZW11 X3NldF9mZF9oYW5kbGVyMihzLT5jc29jaywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7DQorfQ0K Kw0KK3N0YXRpYyB2b2lkIHVzYl90Y3BfbGlzdGVuX3JlYWQodm9pZCAqb3BhcXVlKQ0KK3sNCisg ICAgVVNCVENQU3RhdGUgKnMgPSBvcGFxdWU7DQorICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRy Ow0KKyAgICBzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsNCisNCisgICAgcy0+Y3Nv Y2sgPSBhY2NlcHQocy0+bHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4p Ow0KKyAgICBpZiAocy0+Y3NvY2sgIT0gLTEpIHsNCisgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRs ZXIyKHMtPmNzb2NrLCBOVUxMLCB1c2JfdGNwX2NsaWVudF9yZWFkLCBOVUxMLCBvcGFxdWUpOw0K KyAgICAgICAgDQorICAgICAgICB1c2JfdGNwX3dyaXRlKHMsIlVTQlRDUCAwMDAuMDAxXG4iLDE1 KTsNCisgICAgICAgIHVzYl90Y3BfZmx1c2gocyk7DQorICAgICAgICB1c2JfdGNwX3JlYWRfd2hl bihzLCBwcm90b2NvbF92ZXJzaW9uLCAxNSk7DQorICAgIH0NCit9DQorDQorDQorc3RhdGljIGlu dCB1c2JfdGNwX2xpc3Rlbl9wb2xsKHZvaWQgKm9wYXF1ZSkNCit7DQorICAgIFVTQlRDUFN0YXRl ICpzID0gb3BhcXVlOw0KKyAgICBpZiAocy0+Y3NvY2sgPT0gLTEpDQorICAgICAgICByZXR1cm4g MTsNCisgICAgcmV0dXJuIDA7DQorfQ0KKw0KKw0KKw0KK1VTQkRldmljZSAqdXNiX3RjcF9kZXZp Y2VfaW5pdCh2b2lkKQ0KK3sNCisgICAgVVNCRGV2aWNlICpkOw0KKyAgICANCisgICAgZCA9ICZw cy0+ZGV2Ow0KKw0KKyAgICBkLT5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOw0KKyAgICBkLT5oYW5k bGVfcGFja2V0ID0gdXNiX2dlbmVyaWNfaGFuZGxlX3BhY2tldDsNCisgICAgZC0+aGFuZGxlX3Jl c2V0ID0gdXNiX3RjcF9oYW5kbGVfcmVzZXQ7DQorICAgIGQtPmhhbmRsZV9jb250cm9sID0gdXNi X3RjcF9oYW5kbGVfY29udHJvbDsNCisgICAgZC0+aGFuZGxlX2RhdGEgPSB1c2JfdGNwX2hhbmRs ZV9kYXRhOw0KKyAgICBkLT5oYW5kbGVfZGVzdHJveSA9IHVzYl90Y3BfaGFuZGxlX2Rlc3Ryb3k7 DQorDQorICAgIHBzdHJjcHkoZC0+ZGV2bmFtZSwgc2l6ZW9mKGQtPmRldm5hbWUpLCAiUUVNVSBV U0Igb3ZlciBUQ1AiKTsNCisgICAgDQorICAgIHJldHVybiAoVVNCRGV2aWNlICopcHM7DQorfQ0K Kw0KKw0KKw0KK3ZvaWQgdXNiX3RjcF9pbml0KGNvbnN0IGNoYXIgKmFyZykNCit7DQorICAgIHN0 cnVjdCBzb2NrYWRkciAqYWRkcjsNCisgICAgc3RydWN0IHNvY2thZGRyX2luIGlhZGRyOw0KKyNp Zm5kZWYgX1dJTjMyDQorICAgIHN0cnVjdCBzb2NrYWRkcl91biB1YWRkcjsNCisjZW5kaWYNCisg ICAgaW50IHJldXNlX2FkZHIsIHJldDsNCisgICAgc29ja2xlbl90IGFkZHJsZW47DQorICAgIGNv bnN0IGNoYXIgKnA7DQorICAgIA0KKyAgICBwcyA9IHFlbXVfbWFsbG9jeihzaXplb2YoVVNCVENQ U3RhdGUpKTsNCisgICAgaWYgKCFwcykNCisgICAgICAgIHJldHVybjsNCisgICAgDQorICAgIHBz LT5sc29jayA9IC0xOw0KKyAgICBwcy0+Y3NvY2sgPSAtMTsNCisgICAgDQorI2lmbmRlZiBfV0lO MzINCisgICAgaWYgKHN0cnN0YXJ0KGFyZywgInVuaXg6IiwgJnApKSB7DQorICAgIGFkZHIgPSAo c3RydWN0IHNvY2thZGRyICopJnVhZGRyOw0KKyAgICBhZGRybGVuID0gc2l6ZW9mKHVhZGRyKTsN CisNCisgICAgcHMtPmxzb2NrID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsNCisg ICAgaWYgKHBzLT5sc29jayA9PSAtMSkgew0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2It dGNwOiBDb3VsZCBub3QgY3JlYXRlIHNvY2tldFxuIik7DQorICAgICAgICBleGl0KDEpOw0KKyAg ICB9DQorDQorICAgIHVhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOw0KKyAgICBtZW1zZXQodWFk ZHIuc3VuX3BhdGgsIDAsIDEwOCk7DQorICAgIHNucHJpbnRmKHVhZGRyLnN1bl9wYXRoLCAxMDgs ICIlcyIsIHApOw0KKw0KKyAgICB1bmxpbmsodWFkZHIuc3VuX3BhdGgpOw0KKyAgICB9IGVsc2UN CisjZW5kaWYNCisgICAgew0KKyAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZpYWRkcjsN CisgICAgYWRkcmxlbiA9IHNpemVvZihpYWRkcik7DQorDQorICAgIHBzLT5sc29jayA9IHNvY2tl dChQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7DQorICAgIGlmIChwcy0+bHNvY2sgPT0gLTEpIHsN CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNiLXRjcDogQ291bGQgbm90IGNyZWF0ZSBzb2Nr ZXRcbiIpOw0KKyAgICAgICAgZXhpdCgxKTsNCisgICAgfQ0KKw0KKyAgICBpZiAocGFyc2VfaG9z dF9wb3J0KCZpYWRkciwgYXJnKSA8IDApIHsNCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNi LXRjcDogQ291bGQgbm90IHBhcnNlIGFkZHJlc3NcbiIpOw0KKyAgICAgICAgZXhpdCgxKTsNCisg ICAgfQ0KKw0KKyAgICByZXVzZV9hZGRyID0gMTsNCisgICAgcmV0ID0gc2V0c29ja29wdChwcy0+ bHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwNCisgICAgICAgICAgICAgICAgICAgICAo Y29uc3QgY2hhciAqKSZyZXVzZV9hZGRyLCBzaXplb2YocmV1c2VfYWRkcikpOw0KKyAgICBpZiAo cmV0ID09IC0xKSB7DQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYi10Y3A6IHNldHNvY2tv cHQoKSBmYWlsZWRcbiIpOw0KKyAgICAgICAgZXhpdCgxKTsNCisgICAgfQ0KKyAgICB9DQorDQor ICAgIGlmIChiaW5kKHBzLT5sc29jaywgYWRkciwgYWRkcmxlbikgPT0gLTEpIHsNCisgICAgICAg IGZwcmludGYoc3RkZXJyLCAidXNiLXRjcDogYmluZCgpIGZhaWxlZFxuIik7DQorICAgICAgICBl eGl0KDEpOw0KKyAgICB9DQorDQorICAgIGlmIChsaXN0ZW4ocHMtPmxzb2NrLCAxKSA9PSAtMSkg ew0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2ItdGNwOiBsaXN0ZW4oKSBmYWlsZWRcbiIp Ow0KKyAgICAgICAgZXhpdCgxKTsNCisgICAgfQ0KKw0KKyAgICByZXQgPSBxZW11X3NldF9mZF9o YW5kbGVyMihwcy0+bHNvY2ssIHVzYl90Y3BfbGlzdGVuX3BvbGwsIHVzYl90Y3BfbGlzdGVuX3Jl YWQsIE5VTEwsIHBzKTsNCisgICAgaWYgKHJldCA9PSAtMSkgew0KKyAgICAgICAgZXhpdCgxKTsN CisgICAgfQ0KK30NCisNCisNCg0KKioqIE1ha2VmaWxlLnRhcmdldAk2IEFwciAyMDA3IDE2OjQ5 OjQ4IC0wMDAwCTEuMTU4DQotLS0gTWFrZWZpbGUudGFyZ2V0CTYgQXByIDIwMDcgMjI6MTY6MzEg LTAwMDANCkBAIC0zOTcsNyArMzk3LDcgQEANCiBWTF9PQkpTKz0gc2NzaS1kaXNrLm8gY2Ryb20u byBsc2k1M2M4OTVhLm8NCiANCiAjIFVTQiBsYXllcg0KLVZMX09CSlMrPSB1c2IubyB1c2ItaHVi Lm8gdXNiLWxpbnV4Lm8gdXNiLWhpZC5vIHVzYi1vaGNpLm8gdXNiLW1zZC5vDQorVkxfT0JKUys9 IHVzYi5vIHVzYi1odWIubyB1c2ItbGludXgubyB1c2ItaGlkLm8gdXNiLW9oY2kubyB1c2ItbXNk Lm8gdXNiLXRjcC5vDQogDQogIyBFRVBST00gZW11bGF0aW9uDQogVkxfT0JKUyArPSBlZXByb205 M3h4Lm8NCg0KKioqIHZsLmMJNiBBcHIgMjAwNyAxNjo0OTo0OCAtMDAwMAkxLjI3OQ0KLS0tIHZs LmMJNiBBcHIgMjAwNyAyMjoxNjozMiAtMDAwMA0KQEAgLTE3Myw2ICsxNzMsNyBAQA0KIGludCB3 aW4ya19pbnN0YWxsX2hhY2sgPSAwOw0KICNlbmRpZg0KIGludCB1c2JfZW5hYmxlZCA9IDA7DQor Y29uc3QgY2hhciAqdXNidGNwX3BvcnQ7DQogc3RhdGljIFZMQU5TdGF0ZSAqZmlyc3RfdmxhbjsN CiBpbnQgc21wX2NwdXMgPSAxOw0KIGNvbnN0IGNoYXIgKnZuY19kaXNwbGF5Ow0KQEAgLTQyOTMs NiArNDI5NCw4IEBADQogCWRldiA9IHVzYl90YWJsZXRfaW5pdCgpOw0KICAgICB9IGVsc2UgaWYg KHN0cnN0YXJ0KGRldm5hbWUsICJkaXNrOiIsICZwKSkgew0KICAgICAgICAgZGV2ID0gdXNiX21z ZF9pbml0KHApOw0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZGV2bmFtZSwgIlRDUGRldmljZSIp KSB7DQorICAgICAgICBkZXYgPSB1c2JfdGNwX2RldmljZV9pbml0KCk7DQogICAgIH0gZWxzZSB7 DQogICAgICAgICByZXR1cm4gLTE7DQogICAgIH0NCkBAIC02Mzc2LDYgKzYzNzksNyBAQA0KICNl bmRpZg0KICAgICAgICAgICAgIi11c2IgICAgICAgICAgICBlbmFibGUgdGhlIFVTQiBkcml2ZXIg KHdpbGwgYmUgdGhlIGRlZmF1bHQgc29vbilcbiINCiAgICAgICAgICAgICItdXNiZGV2aWNlIG5h bWUgYWRkIHRoZSBob3N0IG9yIGd1ZXN0IFVTQiBkZXZpY2UgJ25hbWUnXG4iDQorICAgICAgICAg ICAiLXVzYnRjcCBwb3J0ICAgIHN0YXJ0IGEgVVNCIG92ZXIgVENQIHNlcnZlciBvbiBwb3J0XG4i DQogI2lmIGRlZmluZWQoVEFSR0VUX1BQQykgfHwgZGVmaW5lZChUQVJHRVRfU1BBUkMpDQogICAg ICAgICAgICAiLWcgV3hIW3hERVBUSF0gIFNldCB0aGUgaW5pdGlhbCBncmFwaGljYWwgcmVzb2x1 dGlvbiBhbmQgZGVwdGhcbiINCiAjZW5kaWYNCkBAIC02NTM0LDYgKzY1MzgsNyBAQA0KICAgICBR RU1VX09QVElPTl93aW4ya19oYWNrLA0KICAgICBRRU1VX09QVElPTl91c2IsDQogICAgIFFFTVVf T1BUSU9OX3VzYmRldmljZSwNCisgICAgUUVNVV9PUFRJT05fdXNidGNwLA0KICAgICBRRU1VX09Q VElPTl9zbXAsDQogICAgIFFFTVVfT1BUSU9OX3ZuYywNCiAgICAgUUVNVV9PUFRJT05fbm9fYWNw aSwNCkBAIC02NjIwLDYgKzY2MjUsNyBAQA0KICAgICB7ICJwaWRmaWxlIiwgSEFTX0FSRywgUUVN VV9PUFRJT05fcGlkZmlsZSB9LA0KICAgICB7ICJ3aW4yay1oYWNrIiwgMCwgUUVNVV9PUFRJT05f d2luMmtfaGFjayB9LA0KICAgICB7ICJ1c2JkZXZpY2UiLCBIQVNfQVJHLCBRRU1VX09QVElPTl91 c2JkZXZpY2UgfSwNCisgICAgeyAidXNidGNwIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fdXNidGNw IH0sDQogICAgIHsgInNtcCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3NtcCB9LA0KICAgICB7ICJ2 bmMiLCBIQVNfQVJHLCBRRU1VX09QVElPTl92bmMgfSwNCiANCkBAIC03MzE5LDYgKzczMjUsMTAg QEANCiAgICAgICAgICAgICAgICAgICAgICAgICBvcHRhcmcpOw0KICAgICAgICAgICAgICAgICB1 c2JfZGV2aWNlc19pbmRleCsrOw0KICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAg ICBjYXNlIFFFTVVfT1BUSU9OX3VzYnRjcDoNCisgICAgICAgICAgICAgICAgdXNiX2VuYWJsZWQg PSAxOw0KKyAgICAgICAgICAgICAgICB1c2J0Y3BfcG9ydCA9IG9wdGFyZzsNCisgICAgICAgICAg ICAgICAgYnJlYWs7DQogICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9zbXA6DQogICAgICAg ICAgICAgICAgIHNtcF9jcHVzID0gYXRvaShvcHRhcmcpOw0KICAgICAgICAgICAgICAgICBpZiAo c21wX2NwdXMgPCAxIHx8IHNtcF9jcHVzID4gTUFYX0NQVVMpIHsNCkBAIC03NjM3LDYgKzc2NDcs OCBAQA0KICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VzW2ldKTsNCiAgICAgICAg ICAgICB9DQogICAgICAgICB9DQorICAgICAgICBpZiAodXNidGNwX3BvcnQgIT0gTlVMTCkNCisg ICAgICAgICAgICB1c2JfdGNwX2luaXQodXNidGNwX3BvcnQpOw0KICAgICB9DQogDQogICAgIGd1 aV90aW1lciA9IHFlbXVfbmV3X3RpbWVyKHJ0X2Nsb2NrLCBndWlfdXBkYXRlLCBOVUxMKTsNCg0K KioqIGh3L3VzYi5oCTE3IE1hciAyMDA3IDE2OjU5OjMwIC0wMDAwCTEuMTINCi0tLSBody91c2Iu aAk1IEFwciAyMDA3IDEzOjUzOjM1IC0wMDAwDQpAQCAtMjIwLDMgKzIyMCw3IEBADQogDQogLyog dXNiLW1zZC5jICovDQogVVNCRGV2aWNlICp1c2JfbXNkX2luaXQoY29uc3QgY2hhciAqZmlsZW5h bWUpOw0KKw0KKy8qIHVzYi10Y3AuYyAqLw0KK3ZvaWQgdXNiX3RjcF9pbml0KGNvbnN0IGNoYXIg KmFyZyk7DQorVVNCRGV2aWNlICp1c2JfdGNwX2RldmljZV9pbml0KHZvaWQpOw0KDQo= ------=_Part_15077_19359660.1175908290833 Content-Type: text/x-python; name=usb_mouse.py; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_f07dhrdl Content-Disposition: attachment; filename="usb_mouse.py" IyBDb3B5cmlnaHQgKGMpIDIwMDcgRWR1YXJkbyBGZWxpcGUNCiMgDQojIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh IGNvcHkNCiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZp bGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCiMgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQg cmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KIyB0 byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vu c2UsIGFuZC9vciBzZWxsDQojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQg cGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1 YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KIyANCiMgVGhlIGFib3ZlIGNvcHly aWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQg aW4NCiMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUu DQojIA0KIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5U WSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBM SU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCiMgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQg U0hBTEwNCiMgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBB TlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFD VElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCiMgT1VU IE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhF UiBERUFMSU5HUyBJTg0KIyBUSEUgU09GVFdBUkUuDQoNCmltcG9ydCBzeXMsIHNvY2tldCwgc3Ry dWN0LCBtYXRoDQoNCg0KVVNCX0RJUl9PVVQgPSAgMA0KVVNCX0RJUl9JTiA9ICAweDgwDQoNClVT Ql9UWVBFX01BU0sgPSAgKDB4MDMgPDwgNSkNClVTQl9UWVBFX1NUQU5EQVJEID0gKDB4MDAgPDwg NSkNClVTQl9UWVBFX0NMQVNTID0gICgweDAxIDw8IDUpDQpVU0JfVFlQRV9WRU5ET1IgPSAgKDB4 MDIgPDwgNSkNClVTQl9UWVBFX1JFU0VSVkVEID0gKDB4MDMgPDwgNSkNCg0KVVNCX1JFQ0lQX01B U0sgPSAgMHgxZg0KVVNCX1JFQ0lQX0RFVklDRSA9IDB4MDANClVTQl9SRUNJUF9JTlRFUkZBQ0Ug PSAweDAxDQpVU0JfUkVDSVBfRU5EUE9JTlQgPSAweDAyDQpVU0JfUkVDSVBfT1RIRVIgPSAgMHgw Mw0KDQpEZXZpY2VSZXF1ZXN0ID0gKChVU0JfRElSX0lOfFVTQl9UWVBFX1NUQU5EQVJEfFVTQl9S RUNJUF9ERVZJQ0UpPDw4KQ0KRGV2aWNlT3V0UmVxdWVzdCA9ICgoVVNCX0RJUl9PVVR8VVNCX1RZ UEVfU1RBTkRBUkR8VVNCX1JFQ0lQX0RFVklDRSk8PDgpDQpJbnRlcmZhY2VSZXF1ZXN0ID0oKFVT Ql9ESVJfSU58VVNCX1RZUEVfU1RBTkRBUkR8VVNCX1JFQ0lQX0lOVEVSRkFDRSk8PDgpDQpJbnRl cmZhY2VPdXRSZXF1ZXN0ID0gKChVU0JfRElSX09VVHxVU0JfVFlQRV9TVEFOREFSRHxVU0JfUkVD SVBfSU5URVJGQUNFKTw8OCkNCkVuZHBvaW50UmVxdWVzdCA9ICgoVVNCX0RJUl9JTnxVU0JfVFlQ RV9TVEFOREFSRHxVU0JfUkVDSVBfRU5EUE9JTlQpPDw4KQ0KRW5kcG9pbnRPdXRSZXF1ZXN0ID0g KChVU0JfRElSX09VVHxVU0JfVFlQRV9TVEFOREFSRHxVU0JfUkVDSVBfRU5EUE9JTlQpPDw4KQ0K DQpVU0JfUkVRX0dFVF9TVEFUVVMgPSAweDAwDQpVU0JfUkVRX0NMRUFSX0ZFQVRVUkUgPSAweDAx DQpVU0JfUkVRX1NFVF9GRUFUVVJFID0gMHgwMw0KVVNCX1JFUV9TRVRfQUREUkVTUyA9IDB4MDUN ClVTQl9SRVFfR0VUX0RFU0NSSVBUT1IgPSAweDA2DQpVU0JfUkVRX1NFVF9ERVNDUklQVE9SID0g MHgwNw0KVVNCX1JFUV9HRVRfQ09ORklHVVJBVElPTiA9IDB4MDgNClVTQl9SRVFfU0VUX0NPTkZJ R1VSQVRJT04gPSAweDA5DQpVU0JfUkVRX0dFVF9JTlRFUkZBQ0UgPSAweDBBDQpVU0JfUkVRX1NF VF9JTlRFUkZBQ0UgPSAweDBCDQpVU0JfUkVRX1NZTkNIX0ZSQU1FID0gMHgwQw0KDQpVU0JfREVW SUNFX1NFTEZfUE9XRVJFRCA9IDANClVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCA9IDENCg0KVVNC X0RUX0RFVklDRSA9IAkweDAxDQpVU0JfRFRfQ09ORklHID0gCTB4MDINClVTQl9EVF9TVFJJTkcg PSAJMHgwMw0KVVNCX0RUX0lOVEVSRkFDRSA9IDB4MDQNClVTQl9EVF9FTkRQT0lOVCA9IAkweDA1 DQoNCiMgSElEIGludGVyZmFjZSByZXF1ZXN0cw0KR0VUX1JFUE9SVCAgPSAweGExMDENCkdFVF9J RExFICAgID0gMHhhMTAyDQpHRVRfUFJPVE9DT0w9IDB4YTEwMw0KU0VUX0lETEUgICAgPSAweDIx MGENClNFVF9QUk9UT0NPTD0gMHgyMTBiDQoNCg0KICAgIA0KY2xhc3MgVVNCZGV2aWNlOg0KICAg IGRlZiBfX2luaXRfXyhzZWxmKToNCiAgICAgICAgc2VsZi5kZXZfZGVzY3JpcHRvciA9ICJceDEy XHgwMVx4MDBceDAxXHgwMFx4MDBceDAwXHgwOFx4MjdceDA2XHgwMVx4MDBceDAwXHgwMFx4MDNc eDAyXHgwMVx4MDEiDQogICAgICAgIHNlbGYuY29uZl9kZXNjcmlwdG9yID0gICAgJ1x4MDlceDAy XHgyMlx4MDBceDAxXHgwMVx4MDRceEEwXHgzMicgXA0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdceDA5XHgwNFx4MDBceDAwXHgwMVx4MDNceDAx XHgwMlx4MDUnIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAnXHgwOVx4MjFceDAxXHgwMFx4MDBceDAxXHgyMlx4MzJceDAwJyBcDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4MDdceDA1XHg4 MVx4MDNceDAzXHgwMFx4MEEnDQogICAgICAgIHNlbGYuaGlkX3JlcG9ydF9kZXNjcmlwdG9yID0g J1x4MDVceDAxXHgwOVx4MDJceEExXHgwMVx4MDlceDAxJyBcDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHhBMVx4MDBceDA1XHgw OVx4MTlceDAxXHgyOVx4MDMnIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICdceDE1XHgwMFx4MjVceDAxXHg5NVx4MDNceDc1XHgw MScgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgJ1x4ODFceDAyXHg5NVx4MDFceDc1XHgwNVx4ODFceDAxJyBcDQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHgwNVx4 MDFceDA5XHgzMFx4MDlceDMxXHgxNVx4ODEnIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdceDI1XHg3Rlx4NzVceDA4XHg5NVx4 MDJceDgxXHgwNicgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJ1x4QzBceEMwJw0KICAgICAgICBzZWxmLnJlc2V0KCkNCg0KICAg IGRlZiB1c2JzdHIoc2VsZixzKToNCiAgICAgICAgcmV0dXJuIGNocihsZW4ocykqMisyKSsnXHgw MycgKyAnJy5qb2luKFsnJWNceDAwJyV4IGZvciB4IGluIHNdKQ0KDQogICAgZGVmIHJlc2V0KHNl bGYpOg0KICAgICAgICBzZWxmLmFuZ2xlID0gMC4wDQogICAgICAgIHNlbGYuYW5nbGVpbmMgPSAy LjAgKiBtYXRoLnBpIC8gMzYwLjANCiAgICAgICAgc2VsZi5yYWRpdXMgPSAxNTAuMA0KICAgICAg ICBzZWxmLnB4ID0gaW50KHNlbGYucmFkaXVzKQ0KICAgICAgICBzZWxmLnB5ID0gMA0KICAgICAg ICANCiAgICBkZWYgZ2V0X3N0cmluZyhzZWxmLHN0cmlkeCk6DQogICAgICAgIGRhdGEgPSAnJw0K ICAgICAgICBpZiBzdHJpZHggPT0gMDoNCiAgICAgICAgICAgICMgbGFuZ3VhZ2UgaWQNCiAgICAg ICAgICAgIGRhdGEgPSAnXHgwNFx4MDNceDA5XHgwNCcgIyBFbmdsaXNoIChVUykNCiAgICAgICAg ZWxpZiBzdHJpZHggPT0gMToNCiAgICAgICAgICAgICMgc2VyaWFsIG51bWJlcg0KICAgICAgICAg ICAgZGF0YSA9IHNlbGYudXNic3RyKCcxJykNCiAgICAgICAgZWxpZiBzdHJpZHggPT0gMjoNCiAg ICAgICAgICAgICMgcHJvZHVjdCBkZXNjcmlwdGlvbg0KICAgICAgICAgICAgZGF0YSA9IHNlbGYu dXNic3RyKCdQeXRob24gVVNCIG1vdXNlJykNCiAgICAgICAgZWxpZiBzdHJpZHggPT0gMzoNCiAg ICAgICAgICAgICMgdmVuZG9yIGRlc2NyaXB0aW9uDQogICAgICAgICAgICBkYXRhID0gc2VsZi51 c2JzdHIoJ1FFTVUnKQ0KICAgICAgICByZXR1cm4gZGF0YQ0KICAgICAgICANCiAgICBkZWYgZ2V0 X2RhdGEoc2VsZixwYWNrZXRsZW4pOg0KICAgICAgICBzZWxmLmFuZ2xlID0gKCBzZWxmLmFuZ2xl ICsgc2VsZi5hbmdsZWluYyApICUgKDIuMCAqIG1hdGgucGkpDQogICAgICAgIG54ID0gaW50KHJv dW5kKG1hdGguY29zKHNlbGYuYW5nbGUpICogc2VsZi5yYWRpdXMpKQ0KICAgICAgICBueSA9IGlu dChyb3VuZChtYXRoLnNpbihzZWxmLmFuZ2xlKSAqIHNlbGYucmFkaXVzKSkNCiAgICAgICAgZHgg PSBueCAtIHNlbGYucHgNCiAgICAgICAgZHkgPSAtIChueSAtIHNlbGYucHkpDQogICAgICAgIHNl bGYucHggPSBueA0KICAgICAgICBzZWxmLnB5ID0gbnkNCiAgICAgICAgYiA9IDANCiAgICAgICAg ZGF0YSA9ICclYyVjJWMnJShiLGR4JjB4ZmYsZHkmMHhmZikNCiAgICAgICAgcmV0dXJuIGRhdGEN Cg0KICAgIGRlZiBnZXRfY29udHJvbChzZWxmLCByZXF1ZXN0LCB2YWx1ZSwgaW5kZXgsIGxlbmd0 aCk6DQogICAgICAgIGRhdGEgPSAwDQogICAgICAgIA0KICAgICAgICBpZiByZXF1ZXN0ID09IERl dmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9ERVNDUklQVE9SOg0KICAgICAgICAgICAgaWYgdmFs dWU+PjggPT0gVVNCX0RUX0RFVklDRToNCiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5kZXZf ZGVzY3JpcHRvcg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgZWxpZiB2YWx1ZT4+OCA9 PSBVU0JfRFRfQ09ORklHOg0KICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLmNvbmZfZGVzY3Jp cHRvcg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgZWxpZiB2YWx1ZT4+OCA9PSBVU0Jf RFRfU1RSSU5HOg0KICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLmdldF9zdHJpbmcodmFsdWUm MHhmZikNCiAgICAgICAgICAgIA0KICAgICAgICBlbGlmIHJlcXVlc3QgPT0gRGV2aWNlT3V0UmVx dWVzdCB8IFVTQl9SRVFfU0VUX0FERFJFU1M6DQogICAgICAgICAgICBkYXRhID0gMA0KICAgICAg ICAgICAgDQogICAgICAgIGVsaWYgcmVxdWVzdCA9PSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JF UV9DTEVBUl9GRUFUVVJFOg0KICAgICAgICAgICAgaWYgdmFsdWUgPT0gVVNCX0RFVklDRV9SRU1P VEVfV0FLRVVQOg0KICAgICAgICAgICAgICAgIGRhdGEgPSAwDQogICAgICAgICAgICAgICAgDQog ICAgICAgIGVsaWYgcmVxdWVzdCA9PSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfQ09O RklHVVJBVElPTjoNCiAgICAgICAgICAgIGRhdGEgPSAwDQogICAgICAgICAgICANCiAgICAgICAg ZWxpZiByZXF1ZXN0ID09IEludGVyZmFjZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9ERVNDUklQVE9S Og0KICAgICAgICAgICAgaWYgdmFsdWUgPj4gOCA9PSAweDIyOiAgDQogICAgICAgICAgICAgICAg ZGF0YSA9IHNlbGYuaGlkX3JlcG9ydF9kZXNjcmlwdG9yDQogICAgICAgICAgICANCiAgICAgICAg ZWxpZiByZXF1ZXN0ID09IEdFVF9SRVBPUlQ6DQogICAgICAgICAgICBkYXRhID0gc2VsZi5nZXRf ZGF0YShsZW5ndGgpDQogICAgICAgICAgICANCiAgICAgICAgZWxpZiByZXF1ZXN0ID09IFNFVF9J RExFOg0KICAgICAgICAgICAgZGF0YSA9IDANCiAgICAgICAgICAgIA0KICAgICAgICBlbHNlOg0K ICAgICAgICAgICAgcHJpbnQgJ3VuaGFuZGxlZCByZXF1ZXN0OiAweCUwNHggICB2YWx1ZTogMHgl MDR4JyUocmVxLHZhbHVlKQ0KICAgICAgICAgDQogICAgICAgIHJldHVybiBkYXRhDQoNCmRlZiBx ZW11X3JldChkYXRhKToNCiAgICBpZiBpc2luc3RhbmNlKGRhdGEsaW50KToNCiAgICAgICAgcmV0 dXJuIHN0cnVjdC5wYWNrKCc+SCcsZGF0YSkNCiAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSxiYXNl c3RyaW5nKToNCiAgICAgICAgcmV0dXJuIHN0cnVjdC5wYWNrKCc+SCcsbGVuKGRhdGEpKSArIGRh dGENCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmIGxlbihzeXMuYXJndik+MToNCiAgICBsb2Nh bGhvc3QscG9ydCA9IHN5cy5hcmd2WzFdLnNwbGl0KCc6JykNCmVsc2U6DQogICAgaG9zdD0nbG9j YWxob3N0Jw0KICAgIHBvcnQgPSA1NTU1DQoNCm91dHNvY2tldCA9IHNvY2tldC5zb2NrZXQoc29j a2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkNCm91dHNvY2tldC5jb25uZWN0KChob3N0 LHBvcnQpKQ0KDQp1c2IgPSBVU0JkZXZpY2UoKQ0Kd2hpbGUgMToNCiAgICBzZGF0YSA9IG91dHNv Y2tldC5yZWN2KDE2KQ0KICAgIGlmIG5vdCBzZGF0YToNCiAgICAgICAgcHJpbnQgJ2Nvbm5lY3Rp b24gcmVzZXQgYnkgcGVlcicNCiAgICAgICAgYnJlYWsNCiAgICANCiAgICBpZiBzZGF0YSA9PSAn VVNCVENQIDAwMC4wMDFcbic6DQogICAgICAgICMgSGFuZHNoYWtlIA0KICAgICAgICBvdXRzb2Nr ZXQuc2VuZCgnVVNCVENQIDAwMC4wMDFcbicpDQogICAgZWxzZToNCiAgICAgICAgbXNnID0gc2Rh dGFbOjJdDQogICAgICAgIHBhcmFtID0gc2RhdGFbMjpdDQogICAgICAgICAgICANCiAgICAgICAg aWYgbXNnID09ICdDVCc6DQogICAgICAgICAgICByZXF1ZXN0LCB2YWx1ZSwgaW5kZXgsIGxlbmd0 aCA9IHN0cnVjdC51bnBhY2soJz5ISEhIJyxwYXJhbSkNCiAgICAgICAgICAgIG91dHNvY2tldC5z ZW5kKCBxZW11X3JldCggdXNiLmdldF9jb250cm9sKHJlcXVlc3QsIHZhbHVlLCBpbmRleCwgbGVu Z3RoKSApICkNCiAgICAgICAgZWxpZiBtc2cgPT0gJ1JTJzoNCiAgICAgICAgICAgIHVzYi5yZXNl dCgpDQogICAgICAgICAgICBvdXRzb2NrZXQuc2VuZCggcWVtdV9yZXQoIDAgKSApDQogICAgICAg IGVsaWYgbXNnID09ICdESSc6DQogICAgICAgICAgICB2YWx1ZSA9IHN0cnVjdC51bnBhY2soJz5I JyxwYXJhbSkNCiAgICAgICAgICAgIG91dHNvY2tldC5zZW5kKCBxZW11X3JldCggdXNiLmdldF9k YXRhKHZhbHVlKSApICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHByaW50ICd1bmtub3du IG1lc3NhZ2U6ICVzXG4lcyclKG1zZyxwYXJhbS5lbmNvZGUoJ2hleCcpKQ0KICAgICAgICAgICAg YnJlYWsNCg0K ------=_Part_15077_19359660.1175908290833--