From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 97692 invoked by alias); 10 Jun 2015 12:12:12 -0000 Mailing-List: contact ecos-discuss-help@ecos.sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: ecos-discuss-owner@ecos.sourceware.org Received: (qmail 97673 invoked by uid 89); 10 Jun 2015 12:12:12 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=2.3 required=5.0 tests=AWL,BAYES_50,KAM_ASCII_DIVIDERS,KAM_LAZY_DOMAIN_SECURITY,T_RP_MATCHES_RCVD,UNSUBSCRIBE_BODY autolearn=no version=3.3.2 X-HELO: ip2.televic.com Received: from ip2.televic.com (HELO ip2.televic.com) (81.82.194.222) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 10 Jun 2015 12:12:05 +0000 Received: from SRV-VS06.TELEVIC.COM ([10.0.0.46]) by SRV-VS06.TELEVIC.COM ([10.0.0.46]) with mapi; Wed, 10 Jun 2015 14:11:59 +0200 From: =?Windows-1252?Q?Lambrecht_J=FCrgen?= To: oliver.munz CC: "ecos-patches@sourceware.org" , ecos Date: Wed, 10 Jun 2015 12:12:00 -0000 Message-ID: <5578298D.4090509@televic.com> References: In-Reply-To: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 Content-Type: multipart/mixed; boundary="_003_5578298D4090509televiccom_" MIME-Version: 1.0 X-IsSubscribed: yes Subject: [ECOS] Re: at91 emac ethernet driver lwip diff patch X-SW-Source: 2015-06/txt/msg00000.txt.bz2 --_003_5578298D4090509televiccom_ Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable Content-length: 5662 Hi eCos list and hi Oliver, sorry for my late reaction.. I finally reviewed your (Oliver's) changes to my version of the=20 if_at91.c driver. And I think your changes are wrong. I did not look at the other patches - I do not use LwIP. For reference I added my source file in attach (it is still on my todo=20 list to make it ready for commit..) and Oliver's version (cleaned up a=20 bit for easier diff). Below you find your email with my remarks, and at the end some other=20 remarks. On 23/03/15 12:16, oliver.munz wrote: > Dear J=FCrgen > > I had problems using the driver whit lwIP. After some debuging i think > that the driver does two things wrong: > 1. he adds AT91_EMAC_RX_BUFF_SIZE on line 1260 if the AT91_EMAC_RBD_SR_EOF > isn't set. But it should do it if the size is 0. No, the '- buffer_pos' is already contained in 'total_bytes'. Else you=20 count it double. Do you agree? > 2. he dose not calculate the size the same way in at91_eth_recv() and > at91_eth_deliver(). Yes he does. Mark that AT91_EMAC_RBD_SR_LEN_MASK contains the length of the complete=20 packet. The EMAC hardware puts that packet in 128B buffers, and only the=20 last buffer can not be completely full. So for at91_eth_recv() I can=20 read those 128B buffers completely, except the last buffer. But the only=20 way to know how much bytes are put in that last buffer is to use the=20 complete length (T91_EMAC_RBD_SR_LEN_MASK), so the number of bytes in=20 the last buffer is (the-packet-length minus the-already-received-bytes). In case of at91_eth_deliver() I am only interested in the complete size,=20 no need to count it separately as sums of 128B buffers=20 (AT91_EMAC_RX_BUFF_SIZE). So I think your code has an error, because you sum all buffers and then=20 finally add the complete packet length, so you have almost the double=20 length? > at91_eth_deliver() dont care about the buffers whit the > size marked as 0. Indeed I don't check if the AT91_EMAC_RBD_SR_LEN_MASK is valid, because=20 I know (from the AT91SAM9260 datasheet - although not very clear: "If=20 end of frame is not set, then the only other valid status are bits 12,=20 13 and 14.") that it is only valid for the last buffer. And apparently,=20 it is 0 in the other cases. And I am also confident that when the EMAC=20 sets the EOF bit it has written the correct length. > I think this leads to problems whit reciveing packeds bigger then > 128Bytes, because the at91_eth_deliver() function don't let the ip-stack > (at least the lwIP-stack) allocate the right amount of memory in this cas= e. This would mean that the length stored in bits 0-11 of the receive=20 status is not correct? It should be the length of the complete packet. Maybe there is a difference between my AT91SAM9260 and your AT91SAM7X? Let me know if I need to send you the datasheet. Apart from that, why didn't you use my other fixes? We already use that=20 code for many years - always on the same ARM9, but on many different=20 boards and many different software projects. A remark: do you know that the AT91SAM9260 EMAC is not performant enough=20 (sort of hardware bug), and that it is advised (see datasheet errata) to=20 let the EMAC use the internal SRAM and not the SDRAM? Else you will have=20 performance problems at full load. My code was tested for long time under heavy loads, so you can trust=20 (most of) it. For example this remark in your code: " //TODO: The interrupts other than RCOMP and TCOMP needs to be // handled properly especially stuff like RBNA which could have // serious effects on driver performance " Or for example my fix of a wrong datasheet on line 366 about=20 AT91_EMAC_TBD_SR_USED in at91_tb_init(). You can use my handling of the error cases. I also added a reset to the driver, because sometimes things went wrong=20 with AT91_EMAC_ISR_TBRE (datasheet: "Transmit buffers exhausted in=20 mid-frame"). Mark that that reset to the driver (with "b_reset_tbd_idx" is needed=20 when running without IRQs, so for RedBoot. This because RedBoot stalls=20 when e.g. you are typing data in the telnet shell, then the EMAC buffers=20 are fastly exhausted. FYI, here a link to my old eCos mails:=20 http://ecos.sourceware.org/ml/ecos-discuss/2008-06/msg00016.html. In your code in at91_eth_deliver() you use the variable 'begpack'=20 (begin-of-packet). Is there something wrong with my implementation of the recovering of the=20 buffers (code with "&=3D ~(AT91_EMAC_RBD_ADDR_OWNER_SW") ? Kind regards, J=FCrgen P.S.: now the code is again fresh in my head, I will try to react faster=20 next time > I did change the two funktions and now my application seems to work stable > whitout memory holes... > > I would like it if You would look at it. > > Thanks Oliver > > > On Fri, 13 Feb 2015 15:42:56 +0100, Lambrecht J=FCrgen > wrote: >> On 13/02/15 13:55, oliver.munz wrote: >>> Dear J=FCrgen >>> >>> I'm working whit eCOS and the AT91SAM7X again and i would like to get >>> Your lateste version of the if_at91.c. >>> >>> Thanks >>> >>> Oliver Munz >>> >> I just took our latest file on CVS, no editing.. >> success with it - feel free to ask stuff >> J=FCrgen On 20/04/15 13:18, oliver.munz wrote: > This is a patch for the at91 emac driver and the lwIP stack. > > It should solve the no PBUF leak and other stack blocking errors. It also > replaces some "\t" whit " "... --=20 J=FCrgen Lambrecht R&D Associate Mobile: +32 499 644 531 Twitter: JGRLambrecht Tel: +32 (0)51 303045 Fax: +32 (0)51 310670 http://www.televic-rail.com Televic Rail NV - Leo Bekaertlaan 1 - 8870 Izegem - Belgium Company number 0825.539.581 - RPR Kortrijk --_003_5578298D4090509televiccom_ Content-Type: text/x-csrc; name="if_at91.c" Content-Description: if_at91.c Content-Disposition: attachment; filename="if_at91.c"; size=43521; creation-date="Wed, 10 Jun 2015 12:11:58 GMT"; modification-date="Wed, 10 Jun 2015 12:11:58 GMT" Content-Transfer-Encoding: base64 Content-length: 58996 Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLy8NCi8vICAgICAg aWZfYXQ5MS5jDQovLw0KLy8NCi8vDQovLz09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09DQovLyMjIyNFQ09TR1BMQ09QWVJJR0hUQkVHSU4jIyMjDQov LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t DQovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlQ29zLCB0aGUgRW1iZWRkZWQg Q29uZmlndXJhYmxlIE9wZXJhdGluZyBTeXN0ZW0uDQovLyBDb3B5cmlnaHQg KEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5j Lg0KLy8gQ29weXJpZ2h0IChDKSAyMDA2IEFuZHJldyBMdW5uIDxhbmRyZXcu bHVubkBhc2NvbS5jaD4NCi8vDQovLyBlQ29zIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5k ZXINCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQovLyBTb2Z0d2FyZSBG b3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uDQovLw0KLy8gZUNvcyBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQg V0lUSE9VVCBBTlkNCi8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQovLyBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UNCi8vIGZvciBtb3JlIGRldGFpbHMuDQov Lw0KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcNCi8vIHdpdGggZUNv czsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBJbmMuLA0KLy8gNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJv c3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuDQovLw0KLy8gQXMgYSBzcGVjaWFs IGV4Y2VwdGlvbiwgaWYgb3RoZXIgZmlsZXMgaW5zdGFudGlhdGUgdGVtcGxh dGVzIG9yIHVzZSBtYWNyb3MNCi8vIG9yIGlubGluZSBmdW5jdGlvbnMgZnJv bSB0aGlzIGZpbGUsIG9yIHlvdSBjb21waWxlIHRoaXMgZmlsZSBhbmQgbGlu ayBpdA0KLy8gd2l0aCBvdGhlciB3b3JrcyB0byBwcm9kdWNlIGEgd29yayBi YXNlZCBvbiB0aGlzIGZpbGUsIHRoaXMgZmlsZSBkb2VzIG5vdA0KLy8gYnkg aXRzZWxmIGNhdXNlIHRoZSByZXN1bHRpbmcgd29yayB0byBiZSBjb3ZlcmVk IGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMNCi8vIExpY2Vuc2UuIEhvd2V2 ZXIgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIGZpbGUgbXVzdCBzdGlsbCBi ZSBtYWRlIGF2YWlsYWJsZQ0KLy8gaW4gYWNjb3JkYW5jZSB3aXRoIHNlY3Rp b24gKDMpIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4NCi8v DQovLyBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBpbnZhbGlkYXRlIGFueSBv dGhlciByZWFzb25zIHdoeSBhIHdvcmsgYmFzZWQgb24NCi8vIHRoaXMgZmls ZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZS4NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCi8vIyMjI0VDT1NHUExDT1BZUklHSFRFTkQjIyMjDQov Lz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQovLyMjIyMjREVTQ1JJ UFRJT05CRUdJTiMjIyMNCi8vDQovLyBBdXRob3Iocyk6ICAgIEFuZHJldyBM dW5uLCBKb2huIEVpZ2VsYWFyLCBKdWVyZ2VuIExhbWJyZWNodA0KLy8gQ29u dHJpYnV0b3JzOg0KLy8gRGF0ZTogICAgICAgICAyMDA2LTA1LTEwDQovLyBQ dXJwb3NlOiAgICAgIEJTRCBjb21wYXRpYmxlIG5ldHdvcmsgZHJpdmVyDQov LyBEZXNjcmlwdGlvbjogIEhXIG5ldHdvcmsgZHJpdmVyIGZvciBBVDkxIEVN QUMgYmxvY2sgb2YgQVQ5MVNBTSB1QydzLg0KLy8gTGltaXRhdGlvbnM6ICBK dW1ibyBmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSBvZg0KLy8g ICAgICAgICAgICAgICBBVDkxX0VNQUNfUkJEX1NSX0xFTl9NQVNLID0gMHhG RkYNCi8vDQovLyMjIyNERVNDUklQVElPTkVORCMjIyMNCi8vDQovLz09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PSovDQoNCiNpbmNsdWRlIDxwa2djb25m L3N5c3RlbS5oPg0KI2luY2x1ZGUgPHBrZ2NvbmYvaGFsLmg+DQojaW5jbHVk ZSA8cGtnY29uZi9kZXZzX2V0aF9hcm1fYXQ5MS5oPg0KI2luY2x1ZGUgPHBr Z2NvbmYvaW9fZXRoX2RyaXZlcnMuaD4NCiNpZiBkZWZpbmVkKENZR1BLR19S RURCT09UKQ0KICAgI2luY2x1ZGUgPHBrZ2NvbmYvcmVkYm9vdC5oPg0KI2Vu ZGlmDQoNCiNpbmNsdWRlIDxjeWcvaGFsL2hhbF9pby5oPg0KI2luY2x1ZGUg PGN5Zy9oYWwvaGFsX2ludHIuaD4NCiNpbmNsdWRlIDxjeWcvaGFsL2hhbF9h cmNoLmg+DQojaW5jbHVkZSA8Y3lnL2hhbC9kcnZfYXBpLmg+DQojaW5jbHVk ZSA8Y3lnL2hhbC9oYWxfZGlhZy5oPg0KI2luY2x1ZGUgPGN5Zy9pbmZyYS9j eWdfdHlwZS5oPg0KI2luY2x1ZGUgPGN5Zy9pbmZyYS9jeWdfYXNzLmg+DQoj aW5jbHVkZSA8Y3lnL2luZnJhL2RpYWcuaD4NCiNpbmNsdWRlIDxjeWcvaW8v ZXRoL25ldGRldi5oPg0KI2luY2x1ZGUgPGN5Zy9pby9ldGgvZXRoX2Rydi5o Pg0KI2luY2x1ZGUgPGN5Zy9pby9ldGgvZXRoX2Rydl9zdGF0cy5oPg0KI2lm ZGVmIENZR1BLR19ERVZTX0VUSF9QSFkNCiAgICNpbmNsdWRlIDxjeWcvaW8v ZXRoX3BoeS5oPg0KI2VuZGlmDQojaW5jbHVkZSA8ZXJybm8uaD4NCiNpbmNs dWRlIDxzdHJpbmcuaD4NCiNpZmRlZiBUTFZGVU5fREVWU19FVEhfQVJNX0ZQ R0FfU01JDQojaW5jbHVkZSA8Y3lnL2hhbC9taWkuaD4NCiNlbmRpZg0KDQoN Ci8vIFNldCB1cCB0aGUgbGV2ZWwgb2YgZGVidWcgb3V0cHV0DQojaWYgQ1lH UEtHX0RFVlNfRVRIX0FSTV9BVDkxX0RFQlVHX0xFVkVMID4gMA0KICAgI2Rl ZmluZSBkZWJ1ZzFfcHJpbnRmKGFyZ3MuLi4pIGRpYWdfcHJpbnRmKGFyZ3Mp DQojZWxzZQ0KICAgI2RlZmluZSBkZWJ1ZzFfcHJpbnRmKGFyZ3MuLi4pDQoj ZW5kaWYNCiNpZiBDWUdQS0dfREVWU19FVEhfQVJNX0FUOTFfREVCVUdfTEVW RUwgPiAxDQogICAjZGVmaW5lIGRlYnVnMl9wcmludGYoYXJncy4uLikgZGlh Z19wcmludGYoYXJncykNCiNlbHNlDQogICAjZGVmaW5lIGRlYnVnMl9wcmlu dGYoYXJncy4uLikNCiNlbmRpZg0KDQovL0RyaXZlciBpbnRlcmZhY2UgY2Fs bGJhY2tzDQojZGVmaW5lIF9ldGhfZHJ2X2luaXQoc2MsbWFjKSAgICAgICAg IFwNCiAgKHNjLT5mdW5zLT5ldGhfZHJ2LT5pbml0KShzYywodW5zaWduZWQg Y2hhciAqKW1hYykNCiNkZWZpbmUgX2V0aF9kcnZfdHhfZG9uZShzYyxrZXks c3RhdHVzKSAgICAgIFwNCiAgKHNjLT5mdW5zLT5ldGhfZHJ2LT50eF9kb25l KShzYyxrZXksc3RhdHVzKQ0KI2RlZmluZSBfZXRoX2Rydl9yZWN2KHNjLGxl bikgICAgICAgICBcDQogIChzYy0+ZnVucy0+ZXRoX2Rydi0+cmVjdikoc2Ms bGVuKQ0KDQojaWZkZWYgQ1lHSU5UX0lPX0VUSF9JTlRfU1VQUE9SVF9SRVFV SVJFRA0Kc3RhdGljIGN5Z191aW50MzINCmF0OTFfZXRoX2lzciAoY3lnX3Zl Y3Rvcl90IHZlY3RvciwgY3lnX2FkZHJ3b3JkX3QgZGF0YSk7DQojZW5kaWYN Cg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFJlZEJvb3QgY29uZmlndXJh dGlvbiBvcHRpb25zIGZvciBtYW5hZ2luZyBFU0FzIGZvciB1cw0KDQovLyBE ZWNpZGUgd2hldGhlciB0byBoYXZlIHJlZGJvb3QgY29uZmlnIHZhcnMgZm9y IGl0Li4uDQojaWYgZGVmaW5lZChDWUdTRU1fUkVEQk9PVF9GTEFTSF9DT05G SUcpICYmIGRlZmluZWQoQ1lHUEtHX1JFREJPT1RfTkVUV09SS0lORykNCiAg ICNpbmNsdWRlIDxyZWRib290Lmg+DQogICAjaW5jbHVkZSA8Zmxhc2hfY29u ZmlnLmg+DQoNCiAgICNpZmRlZiBDWUdTRU1fREVWU19FVEhfQVJNX0FUOTFf UkVEQk9PVF9IT0xEU19FU0FfRVRIMA0KUmVkQm9vdF9jb25maWdfb3B0aW9u KCJOZXR3b3JrIGhhcmR3YXJlIGFkZHJlc3MgW01BQ10gZm9yIGV0aDAiLA0K ICAgICAgICAgICAgICAgICAgICAgIGV0aDBfZXNhX2RhdGEsDQogICAgICAg ICAgICAgICAgICAgICAgQUxXQVlTX0VOQUJMRUQsIHRydWUsDQogICAgICAg ICAgICAgICAgICAgICAgQ09ORklHX0VTQSwgMCk7DQogICAjZW5kaWYNCg0K I2VuZGlmICAvLyBDWUdQS0dfUkVEQk9PVF9ORVRXT1JLSU5HICYmIENZR1NF TV9SRURCT09UX0ZMQVNIX0NPTkZJRw0KDQovLyBhbmQgaW5pdGlhbGl6YXRp b24gY29kZSB0byByZWFkIHRoZW0NCi8vIC0gaW5kZXBlbmRlbnQgb2Ygd2hl dGhlciB3ZSBhcmUgYnVpbGRpbmcgUmVkQm9vdCByaWdodCBub3c6DQovLyNp ZmRlZiBDWUdQS0dfREVWU19FVEhfQVJNX0FUOTFfUkVEQk9PVF9IT0xEU19F U0ENCi8vdGhlIGFwcGxpY2F0aW9uIGhhcyB0byBwcm92aWRlIHRoZSBmbGFz aCBjb25maWcgYWNjZXNzIGZ1bmN0aW9uOyBpZiBub3QsIGENCi8vTk9QIHdp bGwgYmUgZXhlY3V0ZWQsIHNvIGFsc28gb2suDQojaW5jbHVkZSA8Y3lnL2hh bC9oYWxfaWYuaD4NCiNpZiBkZWZpbmVkIChDWUdQS0dfSU9fUkVEQk9PVF9W VlQpDQojaW5jbHVkZSA8Y3lnL2lvL2ZsYXNoX2NvbmZpZ192dnQuaD4NCiNl bmRpZg0KI2lmbmRlZiBDT05GSUdfRVNBDQojZGVmaW5lIENPTkZJR19FU0Eg KDYpDQojZW5kaWYNCg0KLyogICAjZGVmaW5lIENZR0hXUl9ERVZTX0VUSF9B Uk1fQVQ5MV9HRVRfRVNBKCBtYWNfYWRkcmVzcywgb2sgKSAgICAgICAgICAg XCAqLw0KLyogICBDWUdfTUFDUk9fU1RBUlQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAqLw0KLyog ICBvayA9IENZR0FDQ19DQUxMX0lGX0ZMQVNIX0NGR19PUCggQ1lHTlVNX0NB TExfSUZfRkxBU0hfQ0ZHX0dFVCwgICAgICAgXCAqLw0KLyogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgImV0aDBfZXNhX2RhdGEiLCAg ICAgICAgICAgICAgICAgICAgXCAqLw0KLyogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbWFjX2FkZHJlc3MsICAgICAgICAgICAgICAg ICAgICAgICAgXCAqLw0KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgQ09ORklHX0VTQSk7ICAgICAgICAgICAgICAgICAgICAgICAg XCAqLw0KLyogICBDWUdfTUFDUk9fRU5EICovDQovKiAgICAgICAgIHN0cnVj dCBjeWdfZmNvbmZpZyBpbmZvOyAqLw0KLyogICAgIGluZm8ua2V5ID0gImV0 aDBfZXNhX2RhdGEiOyAqLw0KLyogICAgIGluZm8udmFsID0gKHZvaWQgKikm ZW5hZGRyWzBdOyAqLw0KLyogICAgIGluZm8udHlwZSA9IENPTkZJR19FU0E7 ICovDQovKiAgICAgaW5mby5vZmZzZXQgPSAwOyAqLw0KLyogICAgIGVzYV9v ayA9IENZR0FDQ19DQUxMX0lGX0ZMQVNIX0NGR19PUDIoQ1lHTlVNX0NBTExf SUZfRkxBU0hfQ0ZHX0dFVCwgJmluZm8pOyAqLw0KDQovLyNlbmRpZiAvLyBD WUdQS0dfREVWU19FVEhfQVJNX0FUOTFfUkVEQk9PVF9IT0xEU19FU0ENCg0K Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCi8vIFByaXZh dGUgRGF0YSBzdHJ1Y3R1cmVzDQoNCiNpZm5kZWYgQVQ5MV9FTUFDX1JYX0JV RkZfU0laRQ0KI2RlZmluZSBBVDkxX0VNQUNfUlhfQlVGRl9TSVpFICAxMjgN CiNlbmRpZg0KDQovLyBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yDQp0eXBl ZGVmIHN0cnVjdCByYmRfcw0Kew0KICAgY3lnX3VpbnQzMiBhZGRyOw0KICAg Y3lnX3VpbnQzMiBzcjsNCn0gcmJkX3Q7DQoNCi8vIFJlY2VpdmUgQnVmZmVy DQp0eXBlZGVmIHN0cnVjdCByYl9zDQp7DQogICBjeWdfdWludDggcmJbQVQ5 MV9FTUFDX1JYX0JVRkZfU0laRV07DQp9IHJiX3Q7DQoNCi8vIFRyYW5zbWl0 IEJ1ZmZlciBEZXNjcmlwdG9yDQp0eXBlZGVmIHN0cnVjdCB0YmRfcw0Kew0K ICAgY3lnX3VpbnQzMiBhZGRyOw0KICAgY3lnX3VpbnQzMiBzcjsNCn0gdGJk X3Q7DQoNCi8vIEFUOTEgRXRoZXJuZXQgcHJpdmF0ZSBkYXRhDQp0eXBlZGVm IHN0cnVjdCBhdDkxX2V0aF9wcml2X3MNCnsNCiAgIGN5Z191aW50MzIgICAg aW50cl92ZWN0b3I7DQogICBjaGFyICplc2Ffa2V5OyAgICAgIC8vIFJlZEJv b3QgJ2tleScgZm9yIGRldmljZSBFU0ENCiAgIGN5Z191aW50OCAqZW5hZGRy Ow0KICAgY3lnX3VpbnQzMiBiYXNlOyAgICAvLyBCYXNlIGFkZHJlc3Mgb2Yg ZGV2aWNlDQojaWZkZWYgQ1lHUEtHX0RFVlNfRVRIX1BIWQ0KICAgZXRoX3Bo eV9hY2Nlc3NfdCAqcGh5Ow0KI2VuZGlmDQogICByYmRfdCByYmRbQ1lHTlVN X0RFVlNfRVRIX0FSTV9BVDkxX1JYX0JVRlNdOw0KICAgcmJfdCAgcmJbQ1lH TlVNX0RFVlNfRVRIX0FSTV9BVDkxX1JYX0JVRlNdIF9fYXR0cmlidXRlX18g KChhbGlnbmVkICgxNikpKTsNCiAgIHRiZF90IHRiZFtDWUdOVU1fREVWU19F VEhfQVJNX0FUOTFfVFhfQlVGU107DQogICB1bnNpZ25lZCBsb25nIGN1cnJf dHhfa2V5Ow0KICAgY3lnX2Jvb2wgdHhfYnVzeTsNCiAgIGN5Z191aW50MzIg bGFzdF90YmRfaWR4Ow0KICAgY3lnX3VpbnQzMiBjdXJyX3RiZF9pZHg7DQog ICBjeWdfdWludDMyIGN1cnJfcmJkX2lkeDsNCiNpZmRlZiBDWUdJTlRfSU9f RVRIX0lOVF9TVVBQT1JUX1JFUVVJUkVEDQogICBjeWdfaW50ZXJydXB0IGlu dHI7DQogICBjeWdfaGFuZGxlX3QgIGludHJfaGFuZGxlOw0KICAgY3lnX3Vp bnQzMiAgICBpc3I7IC8vdG8gaW5mb3JtIGRlbGl2ZXIoKSBvZiBjYWxsaW5n IElSUQ0KI2VuZGlmDQojaWZuZGVmIENZR1BLR19SRURCT09UDQogICBzdHJ1 Y3QgZXRoZXJfZHJ2X3N0YXRzIGlmU3RhdHM7DQojZW5kaWYNCn0gYXQ5MV9l dGhfcHJpdl90Ow0KDQojaWZkZWYgQ1lHUEtHX0RFVlNfRVRIX1BIWQ0KLy89 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQovLyBQSFkgYWNjZXNz IGJpdHMgYW5kIHBpZWNlcw0KLy8NCg0Kc3RhdGljIHZvaWQNCmF0OTFfbWRp b19lbmFibGUodm9pZCkNCnsNCiAgIGN5Z191aW50MzIgdmFsOw0KICAgSEFM X1JFQURfVUlOVDMyKEFUOTFfRU1BQyArIEFUOTFfRU1BQ19OQ1IsIHZhbCk7 DQogICB2YWwgfD0gQVQ5MV9FTUFDX05DUl9NUEU7ICAgIC8qIGVuYWJsZSBt YW5hZ2VtZW50IHBvcnQgKi8NCiAgIEhBTF9XUklURV9VSU5UMzIoQVQ5MV9F TUFDICsgQVQ5MV9FTUFDX05DUiwgdmFsKTsNCn0NCg0Kc3RhdGljIHZvaWQN CmF0OTFfbWRpb19kaXNhYmxlKHZvaWQpDQp7DQogICBjeWdfdWludDMyIHZh bDsNCiAgIEhBTF9SRUFEX1VJTlQzMihBVDkxX0VNQUMgKyBBVDkxX0VNQUNf TkNSLCB2YWwpOw0KICAgdmFsICY9IH5BVDkxX0VNQUNfTkNSX01QRTsgICAg LyogZGlzYWJsZSBtYW5hZ2VtZW50IHBvcnQgKi8NCiAgIEhBTF9XUklURV9V SU5UMzIoQVQ5MV9FTUFDICsgQVQ5MV9FTUFDX05DUiwgdmFsKTsNCn0NCg0K Ly8gV3JpdGUgb25lIG9mIHRoZSBQSFkgcmVnaXN0ZXJzIHZpYSB0aGUgTUlJ IGJ1cw0Kdm9pZA0KYXQ5MV93cml0ZV9waHkoaW50IHJlZ19hZGRyLCBpbnQg cGh5X2FkZHIsIHVuc2lnbmVkIHNob3J0IGRhdGEpDQp7DQogICBjeWdfdWlu dDMyIHZhbCwgY250PTA7DQoNCiAgIENZR19BU1NFUlRDKHJlZ19hZGRyID49 IDAgJiYgcmVnX2FkZHIgPD0gQVQ5MV9FTUFDX01BTl9SRUdBX01BU0spOw0K ICAgQ1lHX0FTU0VSVEMocGh5X2FkZHIgPj0gMCAmJiBwaHlfYWRkciA8PSBB VDkxX0VNQUNfTUFOX1BIWV9NQVNLKTsNCg0KICAgdmFsID0gKEFUOTFfRU1B Q19NQU5fU09GICB8DQogICAgICAgICBBVDkxX0VNQUNfTUFOX1dSICAgfA0K ICAgICAgICAgQVQ5MV9FTUFDX01BTl9DT0RFIHwNCiAgICAgICAgIEFUOTFf RU1BQ19NQU5fUEhZQShwaHlfYWRkcikgfA0KICAgICAgICAgQVQ5MV9FTUFD X01BTl9SRUdBKHJlZ19hZGRyKSB8DQogICAgICAgICBBVDkxX0VNQUNfTUFO X0RBVEEoZGF0YSkpOw0KDQogICBIQUxfV1JJVEVfVUlOVDMyKEFUOTFfRU1B QyArIEFUOTFfRU1BQ19NQU4sIHZhbCk7DQoNCiAgIC8qIFdhaXQgdW50aWwg SURMRSBiaXQgaW4gTmV0d29yayBTdGF0dXMgcmVnaXN0ZXIgaXMgY2xlYXJl ZCAqLw0KICAgd2hpbGUgKGNudCA8IDEwMDAwMDApDQogICB7DQogICAgICBI QUxfUkVBRF9VSU5UMzIoKEFUOTFfRU1BQyArIEFUOTFfRU1BQ19OU1IpLCB2 YWwpOw0KICAgICAgaWYgKCEodmFsICYgQVQ5MV9FTUFDX05TUl9JRExFKSkN CiAgICAgICAgIGJyZWFrOw0KICAgfQ0KICAgQ1lHX0FTU0VSVEMoY250IDwg MTAwMDAwMCk7DQogICBkZWJ1ZzJfcHJpbnRmKCJhdDkxX3dyaXRlX3BoeSAw eCVYIDB4JVggMHglWFxuIiwgKHVuc2lnbmVkIGludClyZWdfYWRkciwgKHVu c2lnbmVkIGludClwaHlfYWRkciwgKHVuc2lnbmVkIGludClkYXRhKTsNCn0N Cg0KDQovLyBSZWFkIG9uZSBvZiB0aGUgUEhZIHJlZ2lzdGVycyB2aWEgdGhl IE1JSSBidXMNCmJvb2wNCmF0OTFfcmVhZF9waHkoaW50IHJlZ19hZGRyLCBp bnQgcGh5X2FkZHIsIHVuc2lnbmVkIHNob3J0ICpkYXRhKQ0Kew0KICAgY3ln X3VpbnQzMiB2YWw7DQoNCiAgIENZR19BU1NFUlRDKHJlZ19hZGRyID49IDAg JiYgcmVnX2FkZHIgPD0gQVQ5MV9FTUFDX01BTl9SRUdBX01BU0spOw0KICAg Q1lHX0FTU0VSVEMocGh5X2FkZHIgPj0gMCAmJiBwaHlfYWRkciA8PSBBVDkx X0VNQUNfTUFOX1BIWV9NQVNLKTsNCg0KICAgdmFsID0gKEFUOTFfRU1BQ19N QU5fU09GICB8DQogICAgICAgICBBVDkxX0VNQUNfTUFOX1JEICAgfA0KICAg ICAgICAgQVQ5MV9FTUFDX01BTl9DT0RFIHwNCiAgICAgICAgIEFUOTFfRU1B Q19NQU5fUEhZQShwaHlfYWRkcikgfA0KICAgICAgICAgQVQ5MV9FTUFDX01B Tl9SRUdBKHJlZ19hZGRyKSk7DQoNCg0KICAgSEFMX1dSSVRFX1VJTlQzMihB VDkxX0VNQUMgKyBBVDkxX0VNQUNfTUFOLCB2YWwpOw0KICAgLyogV2FpdCB1 bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBj bGVhcmVkICovDQogICBkbw0KICAgew0KICAgICAgSEFMX1JFQURfVUlOVDMy KChBVDkxX0VNQUMgKyBBVDkxX0VNQUNfTlNSKSwgdmFsKTsNCiAgIH13aGls ZSh2YWwgJiBBVDkxX0VNQUNfTlNSX0lETEUpOw0KDQogICBIQUxfREVMQVlf VVMoNTApOw0KDQogICBIQUxfUkVBRF9VSU5UMzIoQVQ5MV9FTUFDICsgQVQ5 MV9FTUFDX01BTiwgdmFsKTsNCiAgICpkYXRhID0gdmFsICYgQVQ5MV9FTUFD X01BTl9EQVRBX01BU0s7DQogICBkZWJ1ZzJfcHJpbnRmKCJhdDkxX3JlYWRf cGh5IDB4JVggMHglWCAweCVYXG4iLCAodW5zaWduZWQgaW50KXJlZ19hZGRy LCAodW5zaWduZWQgaW50KXBoeV9hZGRyLCAodW5zaWduZWQgaW50KSgqZGF0 YSkpOw0KDQogICByZXR1cm4gKHRydWUpOw0KfQ0KDQovLyBFbmFibGUgdGhl IE1ESU8gYml0IGluIE1BQyBjb250cm9sIHJlZ2lzdGVyIHNvIHRoYXQgd2Ug Y2FuIHRhbGsgdG8NCi8vIHRoZSBQSFkuIEFsc28gc2V0IHRoZSBjbG9jayBk aXZpZGVyIHNvIHRoYXQgTURDIGlzIGxlc3MgdGhhbiAyLjVNSHouDQpzdGF0 aWMgdm9pZA0KYXQ5MV9pbml0X3BoeSh2b2lkKQ0Kew0KICAgY3lnX3VpbnQz MiBjZmc7DQogICBjeWdfdWludDMyIGRpdjsNCg0KICAgSEFMX1JFQURfVUlO VDMyKEFUOTFfRU1BQyArIEFUOTFfRU1BQ19OQ0ZHLCBjZmcpOw0KICAgY2Zn ICY9fiBBVDkxX0VNQUNfTkNGR19DTEtfTUFTSzsNCg0KICAgZGl2ID0gKENZ R05VTV9IQUxfQVJNX0FUOTFfQ0xPQ0tfU1BFRUQgLyAyNTAwMDAwKTsNCiAg IGlmIChkaXYgPCA4KQ0KICAgew0KICAgICAgY2ZnIHw9IEFUOTFfRU1BQ19O Q0ZHX0NMS19IQ0xLXzg7DQogICB9DQogICBlbHNlIGlmIChkaXYgPCAxNikN CiAgIHsNCiAgICAgIGNmZyB8PSBBVDkxX0VNQUNfTkNGR19DTEtfSENMS18x NjsNCiAgIH0NCiAgIGVsc2UgaWYgKGRpdiA8IDMyKQ0KICAgew0KICAgICAg Y2ZnIHw9IEFUOTFfRU1BQ19OQ0ZHX0NMS19IQ0xLXzMyOw0KICAgfQ0KICAg ZWxzZSBpZiAoZGl2IDwgNjQpDQogICB7DQogICAgICBjZmcgfD0gQVQ5MV9F TUFDX05DRkdfQ0xLX0hDTEtfNjQ7DQogICB9DQogICBlbHNlDQogICB7DQog ICAgICBDWUdfRkFJTCgiVW5hYmxlIHRvIHByb2dyYW0gTUlJIGNsb2NrIik7 DQogICB9DQoNCiAgIEhBTF9XUklURV9VSU5UMzIoQVQ5MV9FTUFDICsgQVQ5 MV9FTUFDX05DRkcsIGNmZyk7DQp9DQovKiBUaGUgZ2VuZXJhbCBQSFkgZHJp dmVyIG11c3Qga25vdyBob3cgdG8gYWNjZXNzIHRoZSBQSFkuICovDQpFVEhf UEhZX1JFR19MRVZFTF9BQ0NFU1NfRlVOUyhhdDkxX3BoeSwNCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGF0OTFfaW5pdF9waHksDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBOVUxMLA0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgYXQ5MV93cml0ZV9waHksDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBhdDkxX3JlYWRfcGh5KTsNCiNlbmRpZiAvLyBQ SFkgYWNjZXNzIGJpdHMgYW5kIHBpZWNlcw0KLy89PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09DQovLyBSZWNlaXZlciBidWZmZXIgaGFuZGxpbmcNCg0KLy8g SW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZXIgYnVmZmVycyBhbmQgZGVzY3JpcHRv cnMNCnN0YXRpYyB2b2lkDQphdDkxX3JiX2luaXQoYXQ5MV9ldGhfcHJpdl90 ICpwcml2KQ0Kew0KICAgaW50IGk7DQogICBkZWJ1ZzFfcHJpbnRmKCJSWCBi dWYgYmFzZSBhZGRyZXNzID0gMHglWFxuIiwgKChjeWdfdWludDMyKSZwcml2 LT5yYlswXSkpOw0KICAgZm9yIChpID0gMCA7IGkgPCBDWUdOVU1fREVWU19F VEhfQVJNX0FUOTFfUlhfQlVGUzsgaSsrKQ0KICAgew0KICAgICAgcHJpdi0+ cmJkW2ldLmFkZHIgPSAoKGN5Z191aW50MzIpJnByaXYtPnJiW2ldKSAmIEFU OTFfRU1BQ19SQkRfQUREUl9NQVNLOw0KICAgICAgcHJpdi0+cmJkW2ldLnNy ID0gMDsNCiAgIH0NCiAgIC8vIFNldCB0aGUgd3JhcCBiaXQgb24gdGhlIGxh c3QgZW50cnkNCiAgIHByaXYtPnJiZFtDWUdOVU1fREVWU19FVEhfQVJNX0FU OTFfUlhfQlVGUy0xXS5hZGRyIHw9DQogICAgIEFUOTFfRU1BQ19SQkRfQURE Ul9XUkFQOw0KfQ0KDQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi8v IFRyYW5zbWl0IGJ1ZmZlciBoYW5kbGluZw0KDQovLyBJbml0aWFsaXplIHRo ZSB0cmFuc21pdCBidWZmZXIgZGVzY3JpcHRvcnMNCnN0YXRpYyB2b2lkDQph dDkxX3RiX2luaXQoYXQ5MV9ldGhfcHJpdl90ICpwcml2KQ0Kew0KICAgaW50 IGk7DQogICBmb3IgKGkgPSAwIDsgaSA8IENZR05VTV9ERVZTX0VUSF9BUk1f QVQ5MV9UWF9CVUZTOyBpKyspDQogICB7DQogICAgICBwcml2LT50YmRbaV0u YWRkciA9IDA7DQogICAgICBwcml2LT50YmRbaV0uc3IgPSAwOyAvKiBBVDkx X0VNQUNfVEJEX1NSX1VTRUQ7ICovIC8qIGRhdGFzaGVldCBpcyB3cm9uZyEg MzYuNC4xLjMgZm9yIFNBTTkyNjAgdkcgYW5kIDM3LjQuMS4zIGZvciBTQU03 IHZHIHBvaW50IDIgKi8NCiAgIH0NCiAgIC8vIFNldCB0aGUgd3JhcCBiaXQg b24gdGhlIGxhc3QgZW50cnkNCiAgIHByaXYtPnRiZFtDWUdOVU1fREVWU19F VEhfQVJNX0FUOTFfVFhfQlVGUy0xXS5zciB8PSBBVDkxX0VNQUNfVEJEX1NS X1dSQVA7DQp9DQoNCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLy8g RW5hYmxlIGFuZCBEaXNhYmxlIG9mIHRoZSByZWNlaXZlciBhbmQgdHJhbnNt aXR0ZXIuDQoNCnN0YXRpYyB2b2lkDQphdDkxX2Rpc2FibGVfcngoYXQ5MV9l dGhfcHJpdl90ICpwcml2KQ0Kew0KICAgY3lnX3VpbnQzMiBjdGw7DQoNCiAg IEhBTF9SRUFEX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX05DUiwg Y3RsKTsNCiAgIGN0bCAmPSB+QVQ5MV9FTUFDX05DUl9SRTsNCiAgIEhBTF9X UklURV9VSU5UMzIocHJpdi0+YmFzZSArIEFUOTFfRU1BQ19OQ1IsIGN0bCk7 DQp9DQoNCnN0YXRpYyB2b2lkDQphdDkxX2Rpc2FibGVfdHgoYXQ5MV9ldGhf cHJpdl90ICpwcml2KQ0Kew0KICAgY3lnX3VpbnQzMiBjdGw7DQoNCiAgIEhB TF9SRUFEX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX05DUiwgY3Rs KTsNCiAgIGN0bCAmPSB+QVQ5MV9FTUFDX05DUl9UWDsNCiAgIEhBTF9XUklU RV9VSU5UMzIocHJpdi0+YmFzZSArIEFUOTFfRU1BQ19OQ1IsIGN0bCk7DQp9 DQoNCnN0YXRpYyB2b2lkDQphdDkxX2VuYWJsZV9yeChhdDkxX2V0aF9wcml2 X3QgKnByaXYpDQp7DQogICBjeWdfdWludDMyIGN0bDsNCg0KICAgSEFMX1JF QURfVUlOVDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfTkNSLCBjdGwpOw0K ICAgY3RsIHw9IEFUOTFfRU1BQ19OQ1JfUkU7DQogICBIQUxfV1JJVEVfVUlO VDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfTkNSLCBjdGwpOw0KfQ0KDQpz dGF0aWMgdm9pZA0KYXQ5MV9lbmFibGVfdHgoYXQ5MV9ldGhfcHJpdl90ICpw cml2KQ0Kew0KICAgY3lnX3VpbnQzMiBjdGw7DQoNCiAgIEhBTF9SRUFEX1VJ TlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX05DUiwgY3RsKTsNCiAgIGN0 bCB8PSBBVDkxX0VNQUNfTkNSX1RYOw0KICAgSEFMX1dSSVRFX1VJTlQzMihw cml2LT5iYXNlICsgQVQ5MV9FTUFDX05DUiwgY3RsKTsNCn0NCg0Kc3RhdGlj IHZvaWQNCmF0OTFfZW5hYmxlKGF0OTFfZXRoX3ByaXZfdCAqcHJpdikNCnsN CiAgIGF0OTFfZW5hYmxlX3R4KHByaXYpOw0KICAgYXQ5MV9lbmFibGVfcngo cHJpdik7DQp9DQoNCnN0YXRpYyB2b2lkDQphdDkxX2Rpc2FibGUoYXQ5MV9l dGhfcHJpdl90ICpwcml2KQ0Kew0KICAgYXQ5MV9kaXNhYmxlX3R4KHByaXYp Ow0KICAgYXQ5MV9kaXNhYmxlX3J4KHByaXYpOw0KfQ0KDQpzdGF0aWMgdm9p ZA0KYXQ5MV9zdGFydF90cmFuc21pdHRlcihhdDkxX2V0aF9wcml2X3QgKnBy aXYpDQp7DQogICBjeWdfdWludDMyIGN0bDsNCg0KICAgSEFMX1JFQURfVUlO VDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfTkNSLCBjdGwpOw0KICAgY3Rs IHw9IEFUOTFfRU1BQ19OQ1JfVFNUQVJUOw0KICAgSEFMX1dSSVRFX1VJTlQz Mihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX05DUiwgY3RsKTsNCn0NCg0KDQov Lz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi8vIEluaXRpYWxpemF0aW9u IGNvZGUNCg0KLy8gQ29uZmlndXJlIHRoZSBwaW5zIHNvIHRoYXQgdGhlIEVN QUMgaGFzIGNvbnRyb2wgb2YgdGhlbS4gVGhpcw0KLy8gYXNzdW1lcyB0aGUg TUlJIGlzIHVzZWQsIG5vdCB0aGUgUk1JSQ0Kc3RhdGljIHZvaWQNCmF0OTFf Y2ZnX3BpbnModm9pZCkNCnsNCiAgIEhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFU OTFfRU1BQ19FUkVGQ0spOw0KI2lmZGVmIENZR1BLR19ERVZTX0VUSF9QSFkN CiAgIEhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FQ1JTKTsNCiAg IEhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FQ09MKTsNCiNlbmRp Zg0KICAgSEFMX0FSTV9BVDkxX1BJT19DRkcoQVQ5MV9FTUFDX0VSWERWKTsN CiAgIEhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FUlgwKTsNCiAg IEhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FUlgxKTsNCiAgIEhB TF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FUlgyKTsNCiAgIEhBTF9B Uk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FUlgzKTsNCiAgIEhBTF9BUk1f QVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FUlhFUik7DQogICBIQUxfQVJNX0FU OTFfUElPX0NGRyhBVDkxX0VNQUNfRVJYQ0spOw0KDQogICBIQUxfQVJNX0FU OTFfUElPX0NGRyhBVDkxX0VNQUNfRVRYRU4pOw0KICAgSEFMX0FSTV9BVDkx X1BJT19DRkcoQVQ5MV9FTUFDX0VUWDApOw0KICAgSEFMX0FSTV9BVDkxX1BJ T19DRkcoQVQ5MV9FTUFDX0VUWDEpOw0KICAgSEFMX0FSTV9BVDkxX1BJT19D RkcoQVQ5MV9FTUFDX0VUWDIpOw0KICAgSEFMX0FSTV9BVDkxX1BJT19DRkco QVQ5MV9FTUFDX0VUWDMpOw0KICAgSEFMX0FSTV9BVDkxX1BJT19DRkcoQVQ5 MV9FTUFDX0VUWEVSKTsNCg0KI2lmZGVmIENZR1BLR19ERVZTX0VUSF9QSFkN CiAgIEhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FTURDKTsNCiAg IEhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FTURJTyk7DQojZW5k aWYNCn0NCg0KLy8gU2V0IGEgc3BlY2lmaWMgYWRkcmVzcyBtYXRjaCB0byBh IGdpdmVuIGFkZHJlc3MuIFBhY2tldHMgcmVjZWl2ZWQgd2hpY2gNCi8vIG1h dGNoIHRoaXMgYWRkcmVzcyB3aWxsIGJlIHBhc3NlZCBvbi4NCnN0YXRpYyB2 b2lkDQphdDkxX3NldF9tYWMoYXQ5MV9ldGhfcHJpdl90ICogcHJpdiwgY3ln X3VpbnQ4ICogZW5hZGRyLCBpbnQgc2EpDQp7DQogICBjeWdfdWludDMyIGhp LCBsbzsNCg0KICAgQ1lHX0FTU0VSVEMoc2EgPiAwICYmIHNhIDwgNSk7DQog ICBzYS0tOw0KDQogICBsbyA9ICgoZW5hZGRyWzNdIDw8IDI0KSB8DQogICAg ICAgICAoZW5hZGRyWzJdIDw8IDE2KSB8DQogICAgICAgICAoZW5hZGRyWzFd IDw8ICA4KSB8DQogICAgICAgICAoZW5hZGRyWzBdKSk7DQoNCiAgIGhpID0g KChlbmFkZHJbNV0gPDwgIDgpIHwNCiAgICAgICAgIChlbmFkZHJbNF0pKTsN Cg0KICAgSEFMX1dSSVRFX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFD X1NBMUwgKyAoOCpzYSksIGxvKTsNCiAgIEhBTF9XUklURV9VSU5UMzIocHJp di0+YmFzZSArIEFUOTFfRU1BQ19TQTFIICsgKDgqc2EpLCBoaSk7DQp9DQoN CnN0YXRpYyB2b2lkDQphdDkxX2NsZWFyX3N0YXRzKGF0OTFfZXRoX3ByaXZf dCAqcHJpdikNCnsNCiAgIGN5Z191aW50MzIgY3RsOw0KDQogICBIQUxfUkVB RF9VSU5UMzIocHJpdi0+YmFzZSArIEFUOTFfRU1BQ19OQ1IsIGN0bCk7DQog ICBjdGwgfD0gQVQ5MV9FTUFDX05DUl9DU1I7DQogICBIQUxfV1JJVEVfVUlO VDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfTkNSLCBjdGwpOw0KfQ0KDQov LyBFbmFibGUgYW5kIERpc2FibGUgb2YgdGhlIHJlY2VpdmVyIGFuZCB0cmFu c21pdHRlci4NCi8vIEluaXRpYWxpemUgdGhlIGludGVyZmFjZS4gVGhpcyBj b25maWd1cmVzIHRoZSBpbnRlcmZhY2UgcmVhZHkgZm9yIHVzZS4NCi8vIElu dGVycnVwdHMgYXJlIGdyYWJiZWQgZXRjLiBUaGlzIG1lYW5zIHRoZSBzdGFy dCBmdW5jdGlvbiBoYXMNCi8vIGxpdHRsZSB0byBkbyBleGNlcHQgZW5hYmxl IHRoZSByZWNlaXZlcg0Kc3RhdGljIGJvb2wNCmF0OTFfZXRoX2luaXQoc3Ry dWN0IGN5Z19uZXRkZXZ0YWJfZW50cnkgKnRhYikNCnsNCiAgIHN0cnVjdCBl dGhfZHJ2X3NjICpzYyA9IChzdHJ1Y3QgZXRoX2Rydl9zYyAqKXRhYi0+ZGV2 aWNlX2luc3RhbmNlOw0KICAgYXQ5MV9ldGhfcHJpdl90ICpwcml2ID0gKGF0 OTFfZXRoX3ByaXZfdCAqKXNjLT5kcml2ZXJfcHJpdmF0ZTsNCiAgIGJvb2wg ZXNhX29rID0gZmFsc2U7DQogICB1bnNpZ25lZCBjaGFyIGVuYWRkcls2XSA9 IHsgQ1lHUEtHX0RFVlNfRVRIX0FSTV9BVDkxX01BQ0FERFJ9Ow0KICAgdW5z aWduZWQgY2hhciBlbnplcm9bNl0gPSB7IDB4MCwgMHgwLCAweDAsIDB4MCwg MHgwLCAweDB9Ow0KI2lmZGVmIENZR1BLR19ERVZTX0VUSF9QSFkNCiAgIHVu c2lnbmVkIHNob3J0IHBoeV9zdGF0ZSA9IDA7DQojZW5kaWYNCiAgIGN5Z191 aW50MzIgbmNmZyA9IDA7DQoNCiAgIGRlYnVnMV9wcmludGYoIlxuQVQ5MV9F VEg6IEluaXRpYWxpc2luZyBAICV4XG4iLHByaXYtPmJhc2UpOw0KDQogICBw cml2LT50eF9idXN5ID0gZmFsc2U7DQogICBwcml2LT5jdXJyX3RiZF9pZHgg PSAwOw0KICAgcHJpdi0+Y3Vycl9yYmRfaWR4ID0gMDsNCiNpZmRlZiBDWUdJ TlRfSU9fRVRIX0lOVF9TVVBQT1JUX1JFUVVJUkVEDQogICBwcml2LT5pc3Ig PSAwOw0KI2VuZGlmDQogICAvLyBFbmFibGUgdGhlIGNsb2NrIHRvIHRoZSBF TUFDIC0gVE9ETzogaXMgaXQgbmVlZGVkIHRvIGVuYWJsZSBQSU8gY2xrPz8N CiAgIEhBTF9XUklURV9VSU5UMzIoQVQ5MV9QTUMgKyBBVDkxX1BNQ19QQ0VS LCBBVDkxX1BNQ19QQ0VSX0VNQUMpOw0KLyogICAgSEFMX1dSSVRFX1VJTlQz MihBVDkxX1BNQyArIEFUOTFfUE1DX1BDRVIsIEFUOTFfUE1DX1BDRVJfUElP Qik7ICovDQovKiAgICBIQUxfV1JJVEVfVUlOVDMyKEFUOTFfUE1DICsgQVQ5 MV9QTUNfUENFUiwgQVQ5MV9QTUNfUENFUl9QSU9BKTsgKi8NCg0KICAgLy9h dDkxX2Rpc2FibGUocHJpdik7DQogICBhdDkxX2NmZ19waW5zKCk7DQoNCiAg IC8qIEVuYWJsZSAgSU8gQ2xvY2sgKi8NCiAgIEhBTF9XUklURV9VSU5UMzIo cHJpdi0+YmFzZStBVDkxX0VNQUNfVVNSSU8sQVQ5MV9FTUFDX1VTUklPX0NM S0VOKTsNCg0KICAgLyogRGlzYWJsZSBhbGwgdGhlIGludGVycnVwdHMgZm9y IHRoZSBtb21lbnQgICAgICAgICAgICAqLw0KICAgLyogVGhlIFN0YXJ0IGZ1 bmN0aW9uIGFjdHVhbGx5IGVuYWJsZXMgYWxsIHRoYXQgd2UgbmVlZCAqLw0K ICAgLy9IQUxfV1JJVEVfVUlOVDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNf SURSLCAweDNGRkYpOw0KDQogICAvLyBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4g aW50ZXJydXB0IGVuYWJsZWQgdmVyc2lvbiwgaW5zdGFsbCB0aGUNCiAgIC8v IGludGVycnVwdCBoYW5kbGVyDQojaWZkZWYgQ1lHSU5UX0lPX0VUSF9JTlRf U1VQUE9SVF9SRVFVSVJFRA0KICAgZGVidWcxX3ByaW50ZigiQVQ5MV9FVEg6 IEluc3RhbGxpbmcgSW50ZXJydXB0cyBvbiBJUlEgJWRcbiIsDQogICAgICAg cHJpdi0+aW50cl92ZWN0b3IpOw0KICAgY3lnX2Rydl9pbnRlcnJ1cHRfY3Jl YXRlKHByaXYtPmludHJfdmVjdG9yLA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN5Z19h ZGRyd29yZF90KXNjLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0 OTFfZXRoX2lzciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhf ZHJ2X2RzciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdi0+ aW50cl9oYW5kbGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBy aXYtPmludHIpOw0KICAgLyogZGVmYXVsdCBpcyBsZXZlbCBzZW5zaXRpdmU7 ICovDQogICBjeWdfZHJ2X2ludGVycnVwdF9hdHRhY2gocHJpdi0+aW50cl9o YW5kbGUpOw0KICAgY3lnX2Rydl9pbnRlcnJ1cHRfdW5tYXNrKHByaXYtPmlu dHJfdmVjdG9yKTsNCiNlbmRpZg0KDQovKiAjaWZkZWYgQ1lHSFdSX0RFVlNf RVRIX0FSTV9BVDkxX0dFVF9FU0EgKi8NCiAgIC8vIEdldCBNQUMgYWRkcmVz cyBmcm9tIFJlZEJvb3QgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMNCi8qICAg IENZR0hXUl9ERVZTX0VUSF9BUk1fQVQ5MV9HRVRfRVNBKCZlbmFkZHJbMF0s IGVzYV9vayk7ICovDQogICBlc2Ffb2sgPSBmbGFzaF9nZXRfY29uZmlnKCJl dGgwX2VzYV9kYXRhIiwgJmVuYWRkclswXSwgQ09ORklHX0VTQSk7DQogICAv LyBJZiB0aGlzIGNhbGwgZmFpbHMgbXlNYWNBZGRyIGlzIHVuY2hhbmdlZCBh bmQgTUFDIGFkZHJlc3MgZnJvbQ0KICAgLy8gQ0RMIGlzIHVzZWQNCi8qICNl bmRpZiAqLw0KDQogICBpZiAoIWVzYV9vaykNCiAgIHsNCiAgICAgIC8vIENh bid0IGZpZ3VyZSBvdXQgRVNBDQogICAgICBkZWJ1ZzFfcHJpbnRmKCJBVDkx X0VUSCAtIFdhcm5pbmchIEVTQSB1bmtub3duXG4iKTsNCiAgIH0NCiAgIGRl YnVnMV9wcmludGYoIkFUOTFfRVRIOiBpbml0ICUwMng6JTAyeDolMDJ4OiUw Mng6JTAyeDolMDJ4XG4iLA0KICAgICAgICAgICAgICAgICBlbmFkZHJbMF0s ZW5hZGRyWzFdLGVuYWRkclsyXSwNCiAgICAgICAgICAgICAgICAgZW5hZGRy WzNdLGVuYWRkcls0XSxlbmFkZHJbNV0pOw0KDQogICAvLyBHaXZlIHRoZSBF TUFDIGl0cyBhZGRyZXNzDQogICBhdDkxX3NldF9tYWMocHJpdiwgZW5hZGRy LCAxKTsNCiAgIGF0OTFfc2V0X21hYyhwcml2LCBlbnplcm8sIDIpOw0KICAg YXQ5MV9zZXRfbWFjKHByaXYsIGVuemVybywgMyk7DQogICBhdDkxX3NldF9t YWMocHJpdiwgZW56ZXJvLCA0KTsNCg0KICAgLy8gU2V0dXAgdGhlIHJlY2Vp dmVyIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzDQogICBhdDkxX3JiX2luaXQo cHJpdik7DQoNCiAgIC8vIEFuZCB0ZWxsIHRoZSBFTUFDIHdoZXJlIHRoZSBm aXJzdCByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9yIGlzDQogICBIQUxfV1JJ VEVfVUlOVDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfUkJRUCwgKGN5Z191 aW50MzIpcHJpdi0+cmJkKTsNCg0KICAgLy8gU2V0dXAgdGhlIHRyYW5zbWl0 IGRlc2NyaXB0b3JzDQogICBhdDkxX3RiX2luaXQocHJpdik7DQoNCiAgIC8v IEFuZCB0ZWxsIHRoZSBFTUFDIHdoZXJlIHRoZSBmaXJzdCB0cmFuc21pdCBi dWZmZXIgZGVzY3JpcHRvciBpcw0KICAgSEFMX1dSSVRFX1VJTlQzMihwcml2 LT5iYXNlICsgQVQ5MV9FTUFDX1RCUVAsIChjeWdfdWludDMyKXByaXYtPnRi ZCk7DQoNCiNpZmRlZiBDWUdQS0dfREVWU19FVEhfUEhZDQogICAvLyBTZXR1 cCB0aGUgUEhZDQogICBDWUdfQVNTRVJUQyhwcml2LT5waHkpOw0KDQogICBh dDkxX21kaW9fZW5hYmxlKCk7DQogICBpZiAoIV9ldGhfcGh5X2luaXQocHJp di0+cGh5KSkNCiAgIHsNCiAgICAgIGF0OTFfbWRpb19kaXNhYmxlKCk7DQog ICAgICBkZWJ1ZzFfcHJpbnRmKCJfZXRoX3BoeV9pbml0IGZhaWxlZFxuIik7 DQogICAgICByZXR1cm4gKGZhbHNlKTsNCiAgIH0NCiAgIGVsc2Uge2RlYnVn MV9wcmludGYoIl9ldGhfcGh5X2luaXQgc3VjY2VlZGVkXG4iKTt9DQogICAv LyBHZXQgdGhlIGN1cnJlbnQgbW9kZSBhbmQgcHJpbnQgaXQNCiAgIHBoeV9z dGF0ZSA9IF9ldGhfcGh5X3N0YXRlKHByaXYtPnBoeSk7DQogICAvL2F0OTFf bWRpb19kaXNhYmxlKCk7IEpMOiB3aHkgZGlzYWJsZT8/DQojZW5kaWYNCg0K ICAgSEFMX1JFQURfVUlOVDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfTkNG RyxuY2ZnKTsNCg0KI2lmZGVmIENZR1BLR19ERVZTX0VUSF9QSFkNCiAgIGlm ICgocGh5X3N0YXRlICYgRVRIX1BIWV9TVEFUX0xJTkspICE9IDApDQogICB7 DQogICAgICBpZiAoKChwaHlfc3RhdGUgJiBFVEhfUEhZX1NUQVRfMTAwTUIp ICE9IDApKQ0KICAgICAgew0KICAgICAgICAgZGVidWcxX3ByaW50ZigiQVQ5 MV9FVEg6IDEwME1ieXRlL3MiKTsNCiNlbmRpZg0KICAgICAgICAgbmNmZyB8 PSBBVDkxX0VNQUNfTkNGR19TUERfMTAwTWJwczsNCiNpZmRlZiBDWUdQS0df REVWU19FVEhfUEhZDQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQog ICAgICAgICBkZWJ1ZzFfcHJpbnRmKCJBVDkxX0VUSDogMTBNYnl0ZS9zIik7 DQogICAgICAgICBuY2ZnICY9IH4oQVQ5MV9FTUFDX05DRkdfU1BEXzEwME1i cHMpOw0KICAgICAgfQ0KICAgICAgaWYoKHBoeV9zdGF0ZSAmIEVUSF9QSFlf U1RBVF9GRFgpKQ0KICAgICAgew0KICAgICAgICAgZGVidWcxX3ByaW50Zigi IEZ1bGwgRHVwbGV4XG4iKTsNCiNlbmRpZg0KICAgICAgICAgbmNmZyB8PSBB VDkxX0VNQUNfTkNGR19GRDsNCiNpZmRlZiBDWUdQS0dfREVWU19FVEhfUEhZ DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgICBkZWJ1 ZzFfcHJpbnRmKCIgSGFsZiBEdXBsZXhcbiIpOw0KICAgICAgICAgbmNmZyAm PSB+KEFUOTFfRU1BQ19OQ0ZHX0ZEKTsNCiAgICAgIH0NCiAgIH0NCiAgIGVs c2UNCiAgIHsNCiAgICAgIGRlYnVnMV9wcmludGYoIkFUOTFfRVRIOiBObyBM aW5rXG4iKTsNCiAgIH0NCiNlbmRpZg0KDQojaWYgQ1lHSU5UX0lPX0VUSF9N VUxUSUNBU1QNCiAgIC8qIEVuYWJsZSBtdWx0aWNhc3QgKi8NCiAgIG5jZmcg fD0gQVQ5MV9FTUFDX05DRkdfTVRJOw0KI2VuZGlmDQogICAvL1NldHVwIHRo ZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24NCiAgIG5jZmcgfD0gKEFUOTFfRU1B Q19OQ0ZHX1JMQ0UpOw0KDQogICBIQUxfV1JJVEVfVUlOVDMyKHByaXYtPmJh c2UgKyBBVDkxX0VNQUNfTkNGRyxuY2ZnKTsNCg0KICAgLy8gQ2xlYXIgdGhl IFN0YXRpc3RpY3MgY291bnRlcnM7DQogICBhdDkxX2NsZWFyX3N0YXRzKHBy aXYpOw0KDQoNCiAgIC8qIENsZWFyIHRoZSBzdGF0dXMgcmVnaXN0ZXJzICov DQogICBIQUxfUkVBRF9VSU5UMzIocHJpdi0+YmFzZSArIEFUOTFfRU1BQ19J U1IsbmNmZyk7DQogICBIQUxfUkVBRF9VSU5UMzIocHJpdi0+YmFzZSArIEFU OTFfRU1BQ19SU1IsbmNmZyk7DQogICBIQUxfV1JJVEVfVUlOVDMyKHByaXYt PmJhc2UgKyBBVDkxX0VNQUNfUlNSLG5jZmcpOw0KICAgSEFMX1JFQURfVUlO VDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfVFNSLG5jZmcpOw0KICAgSEFM X1dSSVRFX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX1RTUixuY2Zn KTsNCg0KICAgLy8gSW5pdGlhbGl6ZSB0aGUgdXBwZXIgbGF5ZXIgZHJpdmVy DQogICBfZXRoX2Rydl9pbml0KHNjLGVuYWRkcik7DQoNCiAgIHJldHVybiAo dHJ1ZSk7DQp9DQoNCi8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0 b3AgdGhlIGludGVyZmFjZS4NCnN0YXRpYyB2b2lkDQphdDkxX2V0aF9zdG9w KHN0cnVjdCBldGhfZHJ2X3NjICpzYykNCnsNCiAgIGF0OTFfZXRoX3ByaXZf dCAqcHJpdiA9IChhdDkxX2V0aF9wcml2X3QgKilzYy0+ZHJpdmVyX3ByaXZh dGU7DQojaWZkZWYgQ1lHSU5UX0lPX0VUSF9JTlRfU1VQUE9SVF9SRVFVSVJF RA0KICAgY3lnX3VpbnQzMiBiaXRzOw0KDQogICBiaXRzID0gKEFUOTFfRU1B Q19JU1JfUkNPTSB8IEFUOTFfRU1BQ19JU1JfUkJOQSB8IEFUOTFfRU1BQ19J U1JfUk9WUiB8IEFUOTFfRU1BQ19JU1JfSFJFU1AgfA0KICAgICAgICAgICBB VDkxX0VNQUNfSVNSX1RCUkUgfCBBVDkxX0VNQUNfSVNSX1RDT00pOw0KDQog ICBIQUxfV1JJVEVfVUlOVDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfSURS LCBiaXRzKTsNCiNlbmRpZg0KICAgYXQ5MV9kaXNhYmxlKHByaXYpOw0KfQ0K DQovLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byAic3RhcnQgdXAiIHRo ZSBpbnRlcmZhY2UuIEl0IG1heSBiZSBjYWxsZWQNCi8vIG11bHRpcGxlIHRp bWVzLCBldmVuIHdoZW4gdGhlIGhhcmR3YXJlIGlzIGFscmVhZHkgcnVubmlu Zy4NCnN0YXRpYyB2b2lkDQphdDkxX2V0aF9zdGFydChzdHJ1Y3QgZXRoX2Ry dl9zYyAqc2MsIHVuc2lnbmVkIGNoYXIgKmVuYWRkciwgaW50IGZsYWdzKQ0K ew0KICAgYXQ5MV9ldGhfcHJpdl90ICpwcml2ID0gKGF0OTFfZXRoX3ByaXZf dCAqKXNjLT5kcml2ZXJfcHJpdmF0ZTsNCiNpZmRlZiBDWUdJTlRfSU9fRVRI X0lOVF9TVVBQT1JUX1JFUVVJUkVEDQogICBjeWdfdWludDMyIGJpdHM7DQoN CiAgIC8vIEVuYWJsZSB0aGUgaW50ZXJydXB0cyB3ZSBhcmUgaW50ZXJlc3Rl ZCBpbg0KLyogVGhlIGZvbGxvd2luZyBlcnJvcnMgb25seSBjYXVzZSB0aGUg aW50ZXJuYWwgY291bnRlci9wb2ludGVyIHRvIGJlIHJlc2V0IGlmDQogICBh bHNvIGJpdCA2IFRYRVJSIGlzIHNldDogQVQ5MV9FTUFDX0lTUl9UT1ZSIHwg QVQ5MV9FTUFDX0lTUl9UVU5EDQogICB8QVQ5MV9FTUFDX0lTUl9SVFJZIHwN CiAgIFRoZSBkYXRhc2hlZXQgaXMgbm90IGNsZWFyIGFib3V0IHRoaXMuLi4g Ki8NCiAgIGJpdHMgPSAoQVQ5MV9FTUFDX0lTUl9SQ09NIHwgQVQ5MV9FTUFD X0lTUl9SQk5BIHwgQVQ5MV9FTUFDX0lTUl9ST1ZSIHwgQVQ5MV9FTUFDX0lT Ul9IUkVTUCB8DQogICAgICAgICAgIEFUOTFfRU1BQ19JU1JfVEJSRSB8IEFU OTFfRU1BQ19JU1JfVENPTSk7DQoNCiAgIEhBTF9XUklURV9VSU5UMzIocHJp di0+YmFzZSArIEFUOTFfRU1BQ19JRVIsIGJpdHMpOw0KI2VuZGlmDQogICAv LyBFbmFibGUgdGhlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlcg0KICAgYXQ5 MV9lbmFibGUocHJpdik7DQp9DQoNCi8vIFRoaXMgZnVuY3Rpb24gaXMgY2Fs bGVkIGZvciBsb3cgbGV2ZWwgImNvbnRyb2wiIG9wZXJhdGlvbnMNCnN0YXRp YyBpbnQNCmF0OTFfZXRoX2NvbnRyb2woc3RydWN0IGV0aF9kcnZfc2MgKnNj LCB1bnNpZ25lZCBsb25nIGtleSwNCiAgICAgICAgICAgICAgICAgdm9pZCAq ZGF0YSwgaW50IGxlbmd0aCkNCnsNCiAgIGF0OTFfZXRoX3ByaXZfdCAqcHJp diA9IChhdDkxX2V0aF9wcml2X3QgKilzYy0+ZHJpdmVyX3ByaXZhdGU7DQog ICBzd2l0Y2ggKGtleSkNCiAgIHsNCiNpZmRlZiBUTFZGVU5fREVWU19FVEhf QVJNX0ZQR0FfU01JDQogICAgLy90aGUgZGVmaW5lcyBiZWxvdyBhcmUgb25s eSB2YWxpZCBpZiBDWUdQS0dfTkVULCBzbyBub3QgZm9yIFJlZEJvb3QNCiAg ICAvLyB0byB1c2Ugc3RhdGlzdGljcywgbG9vayBhdCBpbnRlbC9pODI1NTkv Li4vaWZfaTgyNTU5LmMNCiAgIGNhc2UgRVRIX0RSVl9HRVRfSUZfU1RBVFNf VUQ6DQogICBjYXNlIEVUSF9EUlZfR0VUX0lGX1NUQVRTOg0KICAgICB7DQog ICAgICAgc3RydWN0IGV0aGVyX2Rydl9zdGF0cyAqcCA9IChzdHJ1Y3QgZXRo ZXJfZHJ2X3N0YXRzKilkYXRhOw0KICAgICAgIGN5Z191aW50MTYgbGlua1N0 YXR1czsNCiAgICAgICBSZWFkTUlJKEVUSDBfU01JX0FERFIsIDB4MDAsICZs aW5rU3RhdHVzKTsNCiAgICAgICBpZiAobGlua1N0YXR1cyAmIFBoeVN0YXR1 c19SZXNvbHZlZCkNCiAgICAgICAgIHsNCiAgICAgICAgICAgcHJpdi0+aWZT dGF0cy5yZXNvbHZlZCA9IDM7DQogICAgICAgICAgIGlmIChsaW5rU3RhdHVz ICYgUGh5U3RhdHVzX0Z1bGxEdXBsZXgpDQogICAgICAgICAgICAgcHJpdi0+ aWZTdGF0cy5kdXBsZXggPSAzOw0KICAgICAgICAgICBlbHNlDQogICAgICAg ICAgICAgcHJpdi0+aWZTdGF0cy5kdXBsZXggPSAyOw0KDQogICAgICAgICAg IGlmIChsaW5rU3RhdHVzICYgUGh5U3RhdHVzXzEwME1iKQ0KICAgICAgICAg ICAgIHByaXYtPmlmU3RhdHMuc3BlZWQgPSAxMDAwMDAwMDA7DQogICAgICAg ICAgIGVsc2UNCiAgICAgICAgICAgICBwcml2LT5pZlN0YXRzLnNwZWVkID0g MTAwMDAwMDA7DQogICAgICAgICB9DQogICAgICAgZWxzZQ0KICAgICAgICAg ew0KICAgICAgICAgICBwcml2LT5pZlN0YXRzLnJlc29sdmVkID0gMjsNCiAg ICAgICAgICAgcHJpdi0+aWZTdGF0cy5kdXBsZXggPSAxOw0KICAgICAgICAg fQ0KICAgICAgIGlmIChsaW5rU3RhdHVzICYgUGh5U3RhdHVzX0xpbmtVcCkN CiAgICAgICAgIHByaXYtPmlmU3RhdHMub3BlcmF0aW9uYWwgPSAzOw0KICAg ICAgIGVsc2UNCiAgICAgICAgIHByaXYtPmlmU3RhdHMub3BlcmF0aW9uYWwg PSAyOw0KDQogICAgICAgKnAgPSBwcml2LT5pZlN0YXRzOw0KICAgICAgIHJl dHVybiAwOw0KICAgICB9DQojZWxzZQ0KI2lmbmRlZiBDWUdQS0dfUkVEQk9P VA0KICAgICAvKiBEZWZhdWx0IHdlIGFzc3VtZSB0aGUgbGluayBpcyB1cC4N CiAgICAqIEVnOiBEVkEgYm9hcmQNCiAgICAqIE5lZWRlZCBmb3IgREhDUCAq Lw0KICAgY2FzZSBFVEhfRFJWX0dFVF9JRl9TVEFUU19VRDoNCiAgIGNhc2Ug RVRIX0RSVl9HRVRfSUZfU1RBVFM6DQogICB7DQogICAgIHN0cnVjdCBldGhl cl9kcnZfc3RhdHMgKnAgPSAoc3RydWN0IGV0aGVyX2Rydl9zdGF0cyopZGF0 YTsNCiAgICAgcHJpdi0+aWZTdGF0cy5yZXNvbHZlZCA9IDM7DQogICAgIHBy aXYtPmlmU3RhdHMuZHVwbGV4ID0gMzsgLyogRnVsbCBkdXBsZXggKi8NCiAg ICAgcHJpdi0+aWZTdGF0cy5zcGVlZCA9IDEwMDAwMDAwMDsgLyogMTAwIE1i aXQgKi8NCiAgICAgcHJpdi0+aWZTdGF0cy5vcGVyYXRpb25hbCA9IDM7DQog ICAgICpwID0gcHJpdi0+aWZTdGF0czsNCiAgICAgcmV0dXJuIDA7DQogICB9 DQojZW5kaWYNCiNlbmRpZg0KICAgICAgY2FzZSBFVEhfRFJWX1NFVF9NQUNf QUREUkVTUzoNCiAgICAgICAgIHsNCiAgICAgICAgICAgIGlmKGxlbmd0aCA+ PSBFVEhFUl9BRERSX0xFTikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAg ICAgIGF0OTFfZXRoX3N0b3Aoc2MpOw0KDQogICAgICAgICAgICAgICBjeWdf dWludDggKiBlbmFkZHIgPSAoY3lnX3VpbnQ4ICopZGF0YTsNCiAgICAgICAg ICAgICAgIGRlYnVnMV9wcmludGYoIkFUOTFfRVRIOiBzZXQgJTAyeDolMDJ4 OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGVuYWRkclswXSxlbmFkZHJbMV0sZW5hZGRyWzJdLA0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFkZHJbM10sZW5hZGRyWzRd LGVuYWRkcls1XSk7DQoNCiAgICAgICAgICAgICAgIGF0OTFfc2V0X21hYygo YXQ5MV9ldGhfcHJpdl90ICopc2MtPmRyaXZlcl9wcml2YXRlLGVuYWRkciwx KTsNCiAgICAgICAgICAgICAgIGF0OTFfZXRoX3N0YXJ0KHNjLGVuYWRkciww KTsNCiAgICAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgfQ0K ICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgICB9DQojaWYgQ1lHSU5U X0lPX0VUSF9NVUxUSUNBU1QNCiAgICBjYXNlIEVUSF9EUlZfU0VUX01DX0FM TDoNCiAgICB7DQogICAgICAgIEhBTF9XUklURV9VSU5UMzIocHJpdi0+YmFz ZStBVDkxX0VNQUNfSFJCLDB4RkZGRkZGRkYpOw0KICAgICAgICBIQUxfV1JJ VEVfVUlOVDMyKHByaXYtPmJhc2UrQVQ5MV9FTUFDX0hSVCwweEZGRkZGRkZG KTsNCiAgICAgIHJldHVybiAgMDsNCiAgICB9DQogICAgY2FzZSBFVEhfRFJW X1NFVF9NQ19MSVNUOg0KICAgIHsNCiAgICAgICAgSEFMX1dSSVRFX1VJTlQz Mihwcml2LT5iYXNlK0FUOTFfRU1BQ19IUkIsMHhGRkZGRkZGRik7DQogICAg ICAgIEhBTF9XUklURV9VSU5UMzIocHJpdi0+YmFzZStBVDkxX0VNQUNfSFJU LDB4RkZGRkZGRkYpOw0KICAgICAgcmV0dXJuICAwOw0KICAgICAgLyoNCiAg ICAgIHN0cnVjdCBldGhfZHJ2X21jX2xpc3QqIG1jbCA9IChzdHJ1Y3QgZXRo X2Rydl9tY19saXN0KikgZGF0YTsNCiAgICAgIGZvciAoaT0wOyBpPG1jbC0+ bGVuOyBpKyspDQogICAgICB7DQogICAgICAgIC8vbWNsLT5hZGRyc1swXVsw XT09MHgwMTsgbWNsLT5hZGRyc1swXVsxXT09MHgwMDsgbWNsLT5hZGRyc1sw XVsyXT09MHg1RTsNCiAgICAgICAgc3RkaW1zX3dyaXRlKGV0aCwgRlBHQV9N Q19PRkZTRVQrNCppLCAoKG1jbC0+YWRkcnNbaV1bNF08PDgpfChtY2wtPmFk ZHJzW2ldWzVdKSkpOw0KICAgICAgICBzdGRpbXNfd3JpdGUoZXRoLCBGUEdB X01DX09GRlNFVCsyKzQqaSwgKChtY2wtPmFkZHJzW2ldWzJdPDw4KXwobWNs LT5hZGRyc1tpXVszXSkpKTsNCiAgICAgIH0NCiAgICAgIGZvciAoaT1tY2wt PmxlbjsgaTxFVEhfRFJWX01BWF9NQzsgaSsrKQ0KICAgICAgew0KICAgICAg ICBzdGRpbXNfd3JpdGUoZXRoLCBGUEdBX01DX09GRlNFVCs0KmksIDApOw0K ICAgICAgICBzdGRpbXNfd3JpdGUoZXRoLCBGUEdBX01DX09GRlNFVCsyKzQq aSwgMCk7DQogICAgICB9DQogICAgICAvL3JlYWQgYmFjayBNQyBhZGRyZXNz OyBpZiBmYWlsLCByZXR1cm4gMSAoTUMgaXMgYXZhaWxhYmxlLCBidXQgZmFp bGVkIHRoaXMgdGltZSkNCiAgICAgICovDQogICAgICByZXR1cm4gIDA7DQog ICAgfQ0KI2Vsc2UNCiAgICBjYXNlIEVUSF9EUlZfU0VUX01DX0FMTDoNCiAg ICBjYXNlIEVUSF9EUlZfU0VUX01DX0xJU1Q6DQogICAgICByZXR1cm4gMDsN CiAgICAgIGJyZWFrOw0KDQojZW5kaWYNCiAgICAgIGRlZmF1bHQ6DQogICAg ICAgICB7DQogICAgICAgICAgICBkaWFnX3ByaW50ZigiJXMuJWQ6IGtleSAl bHhcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGtleSk7DQogICAgICAg ICAgICByZXR1cm4gKDEpOw0KICAgICAgICAgfQ0KICAgfQ0KDQp9DQoNCi8v IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlZSBpZiBhbm90aGVyIHBh Y2tldCBjYW4gYmUgc2VudC4NCi8vIEl0IHNob3VsZCByZXR1cm4gdGhlIG51 bWJlciBvZiBwYWNrZXRzIHdoaWNoIGNhbiBiZSBoYW5kbGVkLg0KLy8gWmVy byBzaG91bGQgYmUgcmV0dXJuZWQgaWYgdGhlIGludGVyZmFjZSBpcyBidXN5 IGFuZCBjYW4gbm90IHNlbmQNCi8vIGFueSBtb3JlLg0KLy8NCi8vIFdlIGFs bG9jYXRlIG9uZSBidWZmZXIgZGVzY3JpcHRvciBwZXIgc2NhdHRlci9nYXRo ZXIgZW50cnkuIFdlIGFzc3VtZSB0aGF0DQovLyBhIHR5cGljYWwgcGFja2V0 IHdpbGwgbm90IGhhdmUgbW9yZSB0aGFuIDMgc3VjaCBlbnRyaWVzLCBhbmQg c28gd2Ugc2F5IHdlDQovLyBjYW4gc2VuZCBhIHBhY2tldCB3aGVuIHdlIGhh dmUgMyBvciBtb3JlIGJ1ZmZlciBkZXNjcmlwdG9ycyBmcmVlDQovLw0KLy8g VE9ETzogSW1wbGVtZW50IHdoYXQgdGhlIGNvbW1lbnQgYWN0dWFsbHkgc2F5 cyENCi8vIEpMOiBtb3JlIGRpZmZpY3VsdCB3aXRoIGNvcHkgdG8gU1JBTS4u DQpzdGF0aWMgaW50DQphdDkxX2V0aF9jYW5fc2VuZChzdHJ1Y3QgZXRoX2Ry dl9zYyAqc2MpDQp7DQogICBpbnQgY2FuX3NlbmQ7DQogICBhdDkxX2V0aF9w cml2X3QgKnByaXYgPSAoYXQ5MV9ldGhfcHJpdl90ICopc2MtPmRyaXZlcl9w cml2YXRlOw0KICAgaWYocHJpdi0+dHhfYnVzeSkNCiAgIHsNCiAgICAgIGNh bl9zZW5kID0gMDsNCiAgIH0NCiAgIGVsc2UNCiAgIHsNCiAgICAgIGNhbl9z ZW5kID0gMTsNCiAgIH0NCiAgIHJldHVybiAoY2FuX3NlbmQpOw0KfQ0KDQov LyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHNlbmQgZGF0YSB0byB0aGUg aGFyZHdhcmUNCnN0YXRpYyB2b2lkDQphdDkxX2V0aF9zZW5kKHN0cnVjdCBl dGhfZHJ2X3NjICpzYywgc3RydWN0IGV0aF9kcnZfc2cgKnNnX2xpc3QsIGlu dCBzZ19sZW4sDQogICAgICAgICAgICAgIGludCB0b3RhbF9sZW4sIHVuc2ln bmVkIGxvbmcga2V5KQ0Kew0KICAgYXQ5MV9ldGhfcHJpdl90ICpwcml2ID0g KGF0OTFfZXRoX3ByaXZfdCAqKXNjLT5kcml2ZXJfcHJpdmF0ZTsNCiAgIGlu dCBpOw0KICAgY3lnX3VpbnQzMiBzcjsNCiNpZmRlZiBTUkFNMV9PUklHSU4g LyogZGVmaW5lIGl0IGluIHBsZl9pby5oIGlmIHByZXNlbnQgKi8NCiAgIGN5 Z191aW50MzIgdG90YWxfYnl0ZXMgPSAwOyAvKiBwb3NpdGlvbiBpbiBTUkFN MSAqLw0KICAgLy9UT0RPOiB0aGlzIGNvZGUgYWJ1c2VzIHRoYXQgdGhlIHRy YW5zbWl0IGJ1ZmZlciBvbmx5IGNvbnRhaW5zIDEgcGFja2V0DQogICAvL2Jl Y2F1c2UgY2FuX3NlbmQoKSByZXR1cm5zIGZhbHNlIGFzIGxvbmcgYXMgdGhl IG9ubHktb25lIGJ1ZmZlciBpcyBub3QgY2xlYXJlZA0KI2VuZGlmDQogICBw cml2LT50eF9idXN5ID0gdHJ1ZTsgLyogZm9yIGNhbl9zZW5kKCkgKi8NCg0K ICAgcHJpdi0+bGFzdF90YmRfaWR4ID0gcHJpdi0+Y3Vycl90YmRfaWR4Ow0K DQogICBmb3IoaSA9IDA7aTxzZ19sZW47aSsrKQ0KICAgew0KI2lmZGVmIFNS QU0xX09SSUdJTg0KICAgICAvL3RvZG86IHNjaGVkdWxlcl9sb2NrKCkNCiAg ICAgIG1lbWNweSgoY3lnX3VpbnQ4ICopKFNSQU0xX09SSUdJTit0b3RhbF9i eXRlcyksIChjeWdfdWludDggKikoc2dfbGlzdFtpXS5idWYpLCBzZ19saXN0 W2ldLmxlbik7DQoNCiAgICAgIHRvdGFsX2J5dGVzICs9IHNnX2xpc3RbaV0u bGVuOw0KICAgfSAvKiBXaGVuIHVzaW5nIFNSQU0sIHVzZSAxIGJ1ZmZlciBw ZXIgcGFja2V0ICovDQogICBwcml2LT50YmRbcHJpdi0+Y3Vycl90YmRfaWR4 XS5hZGRyID0gU1JBTTFfT1JJR0lOOw0KICAgc3IgPSAodG90YWxfYnl0ZXMg JiBBVDkxX0VNQUNfVEJEX1NSX0xFTl9NQVNLKTsgLy90aGlzIGNsZWFycyBh bHNvIHVzZWQgYml0DQogICBzciB8PSBBVDkxX0VNQUNfVEJEX1NSX0VPRjsN CiNlbHNlDQogICAgICBwcml2LT50YmRbcHJpdi0+Y3Vycl90YmRfaWR4XS5h ZGRyID0gc2dfbGlzdFtpXS5idWY7DQoNCiAgICAgIHNyID0gKHNnX2xpc3Rb aV0ubGVuICYgQVQ5MV9FTUFDX1RCRF9TUl9MRU5fTUFTSyk7DQogICAgICAv LyBTZXQgdGhlIEVuZCBPZiBGcmFtZSBiaXQgaW4gdGhlIGxhc3QgZGVzY3Jp cHRvcg0KICAgICAgaWYoaSA9PSAoc2dfbGVuLTEpKQ0KICAgICAgew0KICAg ICAgICAgc3IgfD0gQVQ5MV9FTUFDX1RCRF9TUl9FT0Y7DQogICAgICB9DQoj ZW5kaWYNCi8qICBUT0RPOiBhZGQgdGhpcyBhZ2FpbiB0byB1c2UgYSBjaXJj dWxhciBidWZmZXIgZm9yIHRyYW5zbWl0ICovDQovKiAgICAgICBpZihwcml2 LT5jdXJyX3RiZF9pZHggPCAoQ1lHTlVNX0RFVlNfRVRIX0FSTV9BVDkxX1RY X0JVRlMtMSkpICovDQovKiAgICAgICB7ICovDQovKiAgICAgICAgICBwcml2 LT50YmRbcHJpdi0+Y3Vycl90YmRfaWR4XS5zciA9IHNyOyAqLw0KLyogICAg ICAgICAgcHJpdi0+Y3Vycl90YmRfaWR4Kys7ICovDQovKiAgICAgICB9ICov DQovKiAgICAgICBlbHNlICovDQovKiAgICAgICB7ICovDQogICAgICAgICBw cml2LT50YmRbcHJpdi0+Y3Vycl90YmRfaWR4XS5zciA9IChzciB8IEFUOTFf RU1BQ19UQkRfU1JfV1JBUCk7DQovKiAgICAgICAgICBwcml2LT5jdXJyX3Ri ZF9pZHggPSAwOyAqLw0KLyogICAgICAgfSAqLw0KI2lmbmRlZiBTUkFNMV9P UklHSU4NCiAgIH0gLyogV2hlbiBOT1QgdXNpbmcgU1JBTSwgdXNlIHNnX2xp c3QgYnVmZmVycyAqLw0KI2VuZGlmDQoNCiAgIC8vIFN0b3JlIGF3YXkgdGhl IGtleSBmb3Igd2hlbiB0aGUgdHJhbnNtaXQgaGFzIGNvbXBsZXRlZA0KICAg Ly8gYW5kIHdlIG5lZWQgdG8gdGVsbCB0aGUgc3RhY2sgd2hpY2ggdHJhbnNt aXQgaGFzIGNvbXBsZXRlZC4NCiAgIHByaXYtPmN1cnJfdHhfa2V5ID0ga2V5 Ow0KDQogICBhdDkxX3N0YXJ0X3RyYW5zbWl0dGVyKHByaXYpOw0KfQ0KDQov KiBkYXRhc2hlZXQgMzYuNC4xLjMgZm9yIFNBTTkyNjAgdkcgYW5kIDM3LjQu MS4zIGZvciBTQU03IHZHIHBvaW50IDI6DQogICBzZXQgQVQ5MV9FTUFDX1RC RF9TUl9VU0VEPTAgKi8NCnN0YXRpYyB2b2lkIGF0OTFfcmVzZXRfdGJkKGF0 OTFfZXRoX3ByaXZfdCAqcHJpdiwgYm9vbCBiX3Jlc2V0X3RiZF9pZHgpDQp7 DQovKiAgICBjeWdfdWludDMyIHRiZF9pZHg7ICovDQoNCiAgIHByaXYtPnRi ZFswXS5zciA9IEFUOTFfRU1BQ19UQkRfU1JfV1JBUDsNCi8qICAgIHdoaWxl KHByaXYtPmN1cnJfdGJkX2lkeCAhPSBwcml2LT5sYXN0X3RiZF9pZHgpICov DQovKiAgICB7ICovDQovKiAgICAgIGlmKHByaXYtPmxhc3RfdGJkX2lkeCA9 PSAoQ1lHTlVNX0RFVlNfRVRIX0FSTV9BVDkxX1RYX0JVRlMtMSkpICovDQov KiAgICAgIHsgKi8NCi8qICAgICAgICBwcml2LT50YmRbcHJpdi0+bGFzdF90 YmRfaWR4XS5zciA9IEFUOTFfRU1BQ19UQkRfU1JfV1JBUDsgKi8NCi8qICAg ICAgICBwcml2LT5sYXN0X3RiZF9pZHggPSAwOyAqLw0KLyogICAgICB9ICov DQovKiAgICAgIGVsc2UgKi8NCi8qICAgICAgeyAqLw0KLyogICAgICAgIHBy aXYtPnRiZFtwcml2LT5sYXN0X3RiZF9pZHhdLnNyID0gMDsgKi8NCi8qICAg ICAgICBwcml2LT5sYXN0X3RiZF9pZHgrKzsgKi8NCi8qICAgICAgfSAqLw0K LyogICAgfSAqLw0KLyogICAgSEFMX1JFQURfVUlOVDMyKHByaXYtPmJhc2Ur QVQ5MV9FTUFDX1RCUVAsdGJkX2lkeCk7IC8vc3luY2hyb25pemUgKi8NCi8q ICogICAgcHJpdi0+bGFzdF90YmRfaWR4ID0gcHJpdi0+Y3Vycl90YmRfaWR4 ID0gICogKi8NCi8qICAgIHRiZF9pZHggLT0gKGN5Z191aW50MzIpcHJpdi0+ dGJkOyAqLw0KLyogICAgZGVidWcyX3ByaW50ZigidGJkX2lkeDogJVhcbiIs IHByaXYtPmN1cnJfdGJkX2lkeCk7ICovDQovKiAgICBpZiAoYl9yZXNldF90 YmRfaWR4KSAqLw0KLyogICAgeyAqLw0KLyogICAgICAgcHJpdi0+Y3Vycl90 YmRfaWR4ID0gMDsgLy9yZXNldCwgYmVjYXVzZSBFTUFDIGFsc28gcmVzZXRz IGl0cyBxdWV1ZSAqLw0KLyogICAgfSAgLy9wb2ludGVyIHRvIHRoZSBUQlFQ LiBObyBuZWVkIHRvIHJlc2V0IGxhc3RfdGJkX2lkeDogaXMgZWFjaCB0aW1l IHJlaW5pdGlhbGl6ZWQgKi8NCi8qICAgIGFzc2VydCh0YmRfaWR4PT1wcml2 LT5jdXJyX3RiZF9pZHgpOyAqLw0KfQ0KDQoNCi8vPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQ0KDQojaWZkZWYgQ1lHSU5UX0lPX0VUSF9JTlRfU1VQUE9S VF9SRVFVSVJFRA0Kc3RhdGljIGN5Z191aW50MzINCmF0OTFfZXRoX2lzciAo Y3lnX3ZlY3Rvcl90IHZlY3RvciwgY3lnX2FkZHJ3b3JkX3QgZGF0YSkNCnsN CiAgIHN0cnVjdCBldGhfZHJ2X3NjICpzYyA9IChzdHJ1Y3QgZXRoX2Rydl9z YyAqKWRhdGE7DQogICBhdDkxX2V0aF9wcml2X3QgKnByaXYgPSAoYXQ5MV9l dGhfcHJpdl90ICopc2MtPmRyaXZlcl9wcml2YXRlOw0KICAgY3lnX3VpbnQz MiByZXQ7DQogICBjeWdfdWludDMyIGlzcjsNCg0KICAgLyogR2V0IHRoZSBp bnRlcnJ1cHQgc3RhdHVzICovDQogICBIQUxfUkVBRF9VSU5UMzIocHJpdi0+ YmFzZStBVDkxX0VNQUNfSVNSLGlzcik7DQogICBwcml2LT5pc3IgfD0gaXNy OyAvL2NvdWxkIGJlIHNldmVyYWwgaXJxcyBiZWZvcmUgdGhlIGRzciBpcyBy dW4NCg0KICAgcmV0ID0gQ1lHX0lTUl9IQU5ETEVEOw0KDQovKiBUaGUgZm9s bG93aW5nIGVycm9ycyBvbmx5IGNhdXNlIHRoZSBpbnRlcm5hbCBjb3VudGVy L3BvaW50ZXIgdG8gYmUgcmVzZXQgaWYNCiAgIGFsc28gYml0IDYgVFhFUlIg aXMgc2V0OiBBVDkxX0VNQUNfSVNSX1RPVlIgfCBBVDkxX0VNQUNfSVNSX1RV TkQNCiAgIHxBVDkxX0VNQUNfSVNSX1JUUlkgfA0KICAgVGhlIGRhdGFzaGVl dCBpcyBub3QgY2xlYXIgYWJvdXQgdGhpcy4uLiAqLw0KICAgaWYoaXNyICYg KEFUOTFfRU1BQ19JU1JfVEJSRSB8IEFUOTFfRU1BQ19JU1JfVENPTSkpDQog ICB7DQogICAgICByZXQgPSBDWUdfSVNSX0NBTExfRFNSOw0KLyogICAgICAg ZGVidWcyX3ByaW50ZigiVFggSVJRXG4iKTsgKi8NCiAgIH0NCg0KICAgaWYo aXNyICYgKEFUOTFfRU1BQ19JU1JfUkNPTSB8IEFUOTFfRU1BQ19JU1JfUkJO QSB8IEFUOTFfRU1BQ19JU1JfUk9WUiB8IEFUOTFfRU1BQ19JU1JfSFJFU1Ap KQ0KICAgew0KICAgICAgcmV0ID0gQ1lHX0lTUl9DQUxMX0RTUjsNCi8qICAg ICAgIGRlYnVnMl9wcmludGYoIlJYIElSUVxuIik7ICovDQogICB9DQogICBj eWdfaW50ZXJydXB0X2Fja25vd2xlZGdlKHZlY3Rvcik7DQogICByZXR1cm4o cmV0KTsNCn0NCiNlbmRpZg0KDQpzdGF0aWMgdm9pZA0KYXQ5MV9ldGhfZGVs aXZlcihzdHJ1Y3QgZXRoX2Rydl9zYyAqc2MpDQp7DQogICBhdDkxX2V0aF9w cml2X3QgKnByaXYgPSAoYXQ5MV9ldGhfcHJpdl90ICopc2MtPmRyaXZlcl9w cml2YXRlOw0KDQojaWZkZWYgQ1lHSU5UX0lPX0VUSF9JTlRfU1VQUE9SVF9S RVFVSVJFRA0KICAgY3lnX3VpbnQzMiBpc3I7DQojZW5kaWYNCiAgIGN5Z191 aW50MzIgdHNyPTA7DQogICBjeWdfdWludDMyIHJzcj0wOw0KDQogICBjeWdf dWludDMyIGN0cjsNCiAgIGN5Z191aW50MzIgY250Ow0KICAgY3lnX3VpbnQz MiBpZHg7DQogICBib29sIGJfcmVzZXRfdGJkX2lkeCA9IGZhbHNlOw0KDQoj aWZkZWYgQ1lHSU5UX0lPX0VUSF9JTlRfU1VQUE9SVF9SRVFVSVJFRA0KICAg Y3lnX2ludGVycnVwdF9kaXNhYmxlKCk7DQogICBpc3IgPSBwcml2LT5pc3I7 DQogICBwcml2LT5pc3IgPSAwOw0KICAgY3lnX2ludGVycnVwdF9lbmFibGUo KTsNCiAgIGRlYnVnMl9wcmludGYoImxvY2FsIElSUSAlWFxuIiwgaXNyKTsN CiNlbHNlDQogICBkZWJ1ZzJfcHJpbnRmKCJBVDkxX0VUSCBpblxuIik7DQoj ZW5kaWYNCiNpZmRlZiBDWUdJTlRfSU9fRVRIX0lOVF9TVVBQT1JUX1JFUVVJ UkVEDQogICBpZiAoaXNyICYgKEFUOTFfRU1BQ19JU1JfVEJSRSB8IEFUOTFf RU1BQ19JU1JfVENPTSkpDQogICB7DQojZW5kaWYNCiAgIC8qIEdldCB0aGUg VHJhbnNtaXQgU3RhdHVzIGFuZCBjbGVhciBpdCAqLw0KICAgSEFMX1JFQURf VUlOVDMyKHByaXYtPmJhc2UrQVQ5MV9FTUFDX1RTUix0c3IpOw0KICAgSEFM X1dSSVRFX1VJTlQzMihwcml2LT5iYXNlK0FUOTFfRU1BQ19UU1IsdHNyKTsN CiNpZmRlZiBDWUdJTlRfSU9fRVRIX0lOVF9TVVBQT1JUX1JFUVVJUkVEDQog ICB9DQogICBpZihpc3IgJiAoQVQ5MV9FTUFDX0lTUl9SQ09NIHwgQVQ5MV9F TUFDX0lTUl9SQk5BIHwgQVQ5MV9FTUFDX0lTUl9ST1ZSIHwgQVQ5MV9FTUFD X0lTUl9IUkVTUCkpDQogICB7DQojZW5kaWYNCiAgIC8qIEdldCB0aGUgUmVj ZWl2ZSBTdGF0dXMgYW5kIGNsZWFyIGl0ICovDQogICBIQUxfUkVBRF9VSU5U MzIocHJpdi0+YmFzZStBVDkxX0VNQUNfUlNSLHJzcik7DQogICBIQUxfV1JJ VEVfVUlOVDMyKHByaXYtPmJhc2UrQVQ5MV9FTUFDX1JTUixyc3IpOw0KI2lm ZGVmIENZR0lOVF9JT19FVEhfSU5UX1NVUFBPUlRfUkVRVUlSRUQNCiAgIH0N CiNlbmRpZg0KDQogICAvKiBTZXJ2aWNlIHRoZSBUWCBidWZmZXJzIGFmdGVy IElSUSAqLw0KICAgaWYgKHRzciZBVDkxX0VNQUNfVFNSX09WUikgIC8vMA0K ICAgew0KICAgICAgZGVidWcyX3ByaW50ZigiQVQ5MV9FVEg6IFR4IFVCUlxu Iik7DQogICB9DQoNCiAgIGlmICh0c3ImQVQ5MV9FTUFDX1RTUl9DT0wpICAv LzENCiAgIHsNCiAgICAgIGRlYnVnMl9wcmludGYoIkFUOTFfRVRIOiBUeCBD T0xcbiIpOw0KICAgfQ0KDQogICBpZiAodHNyJkFUOTFfRU1BQ19UU1JfUkxF KSAgLy8yDQogICB7DQogICAgICBkZWJ1ZzFfcHJpbnRmKCJBVDkxX0VUSDog VHggUkxFXG4iKTsNCiNpZm5kZWYgQ1lHSU5UX0lPX0VUSF9JTlRfU1VQUE9S VF9SRVFVSVJFRA0KICAgICAgYl9yZXNldF90YmRfaWR4ID0gdHJ1ZTsNCiNl bmRpZg0KICAgfQ0KDQogICBpZiAoKHRzciZBVDkxX0VNQUNfVFNSX1RYSURM RSkgPT0gMCkgLy8zDQogICB7DQogICAgICBkZWJ1ZzJfcHJpbnRmKCJBVDkx X0VUSDogVHggSURMRVxuIik7DQogICB9DQoNCiAgIGlmICh0c3ImQVQ5MV9F TUFDX1RTUl9CTlEpICAvLzQNCiAgIHsNCiAgICAgIGRlYnVnMV9wcmludGYo IkFUOTFfRVRIOiBUeCBCRVhcbiIpOw0KI2lmbmRlZiBDWUdJTlRfSU9fRVRI X0lOVF9TVVBQT1JUX1JFUVVJUkVEDQogICAgICBiX3Jlc2V0X3RiZF9pZHgg PSB0cnVlOw0KI2VuZGlmDQogICB9DQoNCiAgIGlmICh0c3ImQVQ5MV9FTUFD X1RTUl9VTkQpICAvLzYNCiAgIHsNCiAgICAgIGRlYnVnMV9wcmludGYoIkFU OTFfRVRIOiBUeCBVTkRcbiIpOw0KI2lmbmRlZiBDWUdJTlRfSU9fRVRIX0lO VF9TVVBQT1JUX1JFUVVJUkVEDQogICAgICBiX3Jlc2V0X3RiZF9pZHggPSB0 cnVlOw0KI2VuZGlmDQogICB9DQoNCiAgIC8qIENoZWNrIHRoYXQgdGhlIGxh c3QgdHJhbnNtaXNzaW9uIGlzIGNvbXBsZXRlZCAqLw0KICAgaWYgKHRzciZB VDkxX0VNQUNfVFNSX0NPTVApIC8vNQ0KICAgew0KICAgICAgZGVidWcyX3By aW50ZigiQVQ5MV9FVEg6IFR4IENPTVBcbiIpOw0KICAgfQ0KDQojaWZkZWYg Q1lHSU5UX0lPX0VUSF9JTlRfU1VQUE9SVF9SRVFVSVJFRA0KICAgYl9yZXNl dF90YmRfaWR4ID0gKGlzciAmIEFUOTFfRU1BQ19JU1JfVEJSRSk7DQojZW5k aWYNCiAgIC8qIEFmdGVyIGVhY2ggdHJhbnNtaXQsIGl0IGlzIGJlc3QgdG8g aW1tZWRpYXRlbHkgcmVzZXQgdGJkICovDQogICAvKiBJZiB0aGVyZSB3ZXJl IGVycm9ycywgdGJkX2lkeCBtdXN0IGJlIHJlc2V0IGFsc28gKi8NCiAgIC8v RG8gaXQgYWx3YXlzOiBpZiBhbHJlYWR5IGRvbmUsIGN1cnI9PWxhc3Q7IHN5 bmNocm9uaXphdGlvbiBzdGF5cw0KI2lmZGVmIENZR0lOVF9JT19FVEhfSU5U X1NVUFBPUlRfUkVRVUlSRUQNCiAgIGlmIChpc3IgJiAoQVQ5MV9FTUFDX0lT Ul9UQlJFIHwgQVQ5MV9FTUFDX0lTUl9UQ09NKSkNCiNlbHNlDQogICBpZiAo KHRzciZBVDkxX0VNQUNfVFNSX0NPTVApIHx8IChiX3Jlc2V0X3RiZF9pZHgg PT0gdHJ1ZSkpIC8vNQ0KI2VuZGlmDQogICB7DQogICAgICBhdDkxX3Jlc2V0 X3RiZChwcml2LCBiX3Jlc2V0X3RiZF9pZHgpOw0KICAgICAgcHJpdi0+dHhf YnVzeSA9IGZhbHNlOw0KICAgICAgX2V0aF9kcnZfdHhfZG9uZShzYyxwcml2 LT5jdXJyX3R4X2tleSwwKTsNCiAgIH0NCg0KDQogICAvKiBDaGVjayBmb3Ig cmVjZWl2ZSBlcnJvcnMsIGFuZCBmaXggdGhlbSBpZiBuZWVkZWQvcG9zc2li bGUuICovDQogICBpZiAocnNyJkFUOTFfRU1BQ19SU1JfT1ZSKQ0KICAgew0K ICAgICAgZGVidWcxX3ByaW50ZigiQVQ5MV9FVEg6IFJ4IE9WUlxuIik7DQog ICB9DQogICBpZiAocnNyJkFUOTFfRU1BQ19SU1JfQk5BKQ0KICAgeyAvKiBj bGVhciBhbGwgdXNlZCBiaXRzOyBzb21ldGhpbmcgd2VudCB3cm9uZywgb3Ig d2UncmUgbm90IGZhc3QgZW5vdWdoLi4gKi8NCiAgICAgIGRlYnVnMV9wcmlu dGYoIkFUOTFfRVRIOiBSeCBCTkFcbiIpOw0KICAgICAgZm9yIChpZHg9MDsg aWR4PENZR05VTV9ERVZTX0VUSF9BUk1fQVQ5MV9SWF9CVUZTOyBpZHgrKykN CiAgICAgIHsNCiAgICAgICAgIHByaXYtPnJiZFtpZHhdLmFkZHIgJj0gfihB VDkxX0VNQUNfUkJEX0FERFJfT1dORVJfU1cpOw0KICAgICAgfQ0KICAgICAg cmV0dXJuOw0KICAgfQ0KDQogICAvKiBTZXJ2aWNlIHRoZSBSWCBidWZmZXJz IHdoZW4gd2UgZ2V0IHNvbWV0aGluZyBhZnRlciBJUlEgKi8NCiNpZmRlZiBD WUdJTlRfSU9fRVRIX0lOVF9TVVBQT1JUX1JFUVVJUkVEDQogICBpZiAoaXNy ICYgKEFUOTFfRU1BQ19JU1JfUkNPTSB8IEFUOTFfRU1BQ19JU1JfUk9WUiB8 IEFUOTFfRU1BQ19JU1JfSFJFU1ApKQ0KI2Vsc2UNCiAgIGlmIChyc3ImIChB VDkxX0VNQUNfUlNSX1JFQ3xBVDkxX0VNQUNfUlNSX09WUikpDQojZW5kaWYN CiAgICAgeyAvKiBhdCBPVlIsIG9ubHkgdGhlIGxhc3QgYnVmZmVyIGlzIHJl Y292ZXIgYnkgdGhlIEVNQUM7IFNXIHNob3VsZA0KICAgICAgICAgIHJlY292 ZXIgdGhlIG90aGVyIG9uZXMgKi8NCiNpZiAwDQogICAgICBjeWdfdWludDMy IHJiZF9pZHg7IC8qIEVuYWJsZSB0aGlzIGlmIHlvdSBkb24ndCB0cnVzdCB0 aGUgaGFyZHdhcmUgKi8NCiNlbmRpZg0KICAgICAgZGVidWcyX3ByaW50Zigi QVQ5MV9FVEg6IFJ4IENPTVBcbiIpOw0KICAgICAgLyogRG8gdGhpcyBhbGwg dW50aWwgd2UgZmluZCB0aGUgZmlyc3QgRU1BQyBCdWZmZXIgKi8NCiAgICAg IHdoaWxlIChwcml2LT5yYmRbcHJpdi0+Y3Vycl9yYmRfaWR4XS5hZGRyICYg QVQ5MV9FTUFDX1JCRF9BRERSX09XTkVSX1NXKQ0KICAgICAgew0KDQogICAg ICAgICAvL0ZpcnN0bHkgd2FsayB0aHJvdWdoIHRvIGVpdGhlciB0aGUgZmly c3QgYnVmZmVyIHRoYXQgYmVsb25ncw0KICAgICAgICAgLy8gdG8gdGhlIGNv bnRyb2xsZXIgb3IgdGhlIGZpcnN0IFNPRg0KICAgICAgICAgd2hpbGUgKChw cml2LT5yYmRbcHJpdi0+Y3Vycl9yYmRfaWR4XS5hZGRyICYNCiAgICAgICAg ICAgICAgICAgQVQ5MV9FTUFDX1JCRF9BRERSX09XTkVSX1NXKSAmJg0KICAg ICAgICAgICAgICAgICEocHJpdi0+cmJkW3ByaXYtPmN1cnJfcmJkX2lkeF0u c3IgJiBBVDkxX0VNQUNfUkJEX1NSX1NPRikpDQogICAgICAgICB7DQogICAg ICAgICAgICBwcml2LT5yYmRbcHJpdi0+Y3Vycl9yYmRfaWR4XS5hZGRyICY9 DQogICAgICAgICAgICAgIH4oQVQ5MV9FTUFDX1JCRF9BRERSX09XTkVSX1NX KTsNCiAgICAgICAgICAgIHByaXYtPmN1cnJfcmJkX2lkeCsrOw0KICAgICAg ICAgICAgaWYgKHByaXYtPmN1cnJfcmJkX2lkeCA+PSBDWUdOVU1fREVWU19F VEhfQVJNX0FUOTFfUlhfQlVGUykNCiAgICAgICAgICAgIHsNCiAgICAgICAg ICAgICAgIHByaXYtPmN1cnJfcmJkX2lkeCA9IDA7DQogICAgICAgICAgICB9 DQojaWYgMA0KICAgICAgICAgICAgLyogY2hlY2sgaWYgd2UncmUgbm90IGFj Y2Vzc2luZyBzYW1lIGJ1ZmZlciBhcyBFTUFDIEhXICovDQogICAgICAgICAg ICBIQUxfUkVBRF9VSU5UMzIocHJpdi0+YmFzZStBVDkxX0VNQUNfUkJRUCxy YmRfaWR4KTsNCiAgICAgICAgICAgIHJiZF9pZHggJj0gfjB4MTsgLyogY291 bnRzIHBlciAyIHNvIGxhc3QgYml0PTAgKi8NCiAgICAgICAgICAgIHJiZF9p ZHggLT0gKGN5Z191aW50MzIpcHJpdi0+cmJkOyAvKiB3ZSB3YW50IHRoZSBj b3VudGVyLCBub3QgdGhlIGFkZHJlc3MgKi8NCiAgICAgICAgICAgIGlmIChy YmRfaWR4ID09IHByaXYtPmN1cnJfcmJkX2lkeCkNCiAgICAgICAgICAgIHsN CiAgICAgICAgICAgICAgZGVidWcxX3ByaW50ZigiQVQ5MV9FVEg6IHN3IGNh dGNoZWQgaHchXG4iKTsNCiAgICAgICAgICAgICAgcmV0dXJuOyAvL2hvdyB0 byBicmVhazsgb3V0IG9mIDIgbG9vcHM/DQogICAgICAgICAgICB9DQojZW5k aWYNCiAgICAgICAgIH0NCiAgICAgICAgIC8qIENoZWNrIHRoYXQgd2UgZGlk IGZpbmQgYSBTT0YgKGFuZCBub3QgYW4gT1dORVJfU1c9MCkgKi8NCiAgICAg ICAgIGlmICgocHJpdi0+cmJkW3ByaXYtPmN1cnJfcmJkX2lkeF0uYWRkciAm DQogICAgICAgICAgICAgIEFUOTFfRU1BQ19SQkRfQUREUl9PV05FUl9TVykg JiYNCiAgICAgICAgICAgICAocHJpdi0+cmJkW3ByaXYtPmN1cnJfcmJkX2lk eF0uc3IgJiBBVDkxX0VNQUNfUkJEX1NSX1NPRikpDQogICAgICAgICB7DQog ICAgICAgICAgICBjdHIgPSAwOw0KICAgICAgICAgICAgaWR4ID0gcHJpdi0+ Y3Vycl9yYmRfaWR4Ow0KICAgICAgICAgICAgLyogTG9vayBmb3IgYW4gRU9G IGFzIGxvbmcgYXMgdGhlIFNXIG93bnMgdGhlIGJ1ZmZlciAqLw0KICAgICAg ICAgICAgd2hpbGUgKHByaXYtPnJiZFtpZHhdLmFkZHIgJiBBVDkxX0VNQUNf UkJEX0FERFJfT1dORVJfU1cpDQovKiAgICAgICAgICAgICBmb3IgKGN0cj0w O2N0cjxDWUdOVU1fREVWU19FVEhfQVJNX0FUOTFfUlhfQlVGUztjdHIrKykg dG9vIG11Y2gNCiAgICAgICAgICAgICAgIGVmZm9ydDogbm90IG5lZWRlZCB0 byBjaGVjayBhbGwgYnVmZmVycywgb25seSB1bnRpbCBub3Qgb3duZXIgYW55 bW9yZSovDQogICAgICAgICAgICB7DQojaWYgMA0KICAgICAgICAgICAgICAg LyogY2hlY2sgaWYgd2UncmUgbm90IGFjY2Vzc2luZyBzYW1lIGJ1ZmZlciBh cyBFTUFDIEhXICovDQogICAgICAgICAgICAgICBIQUxfUkVBRF9VSU5UMzIo cHJpdi0+YmFzZStBVDkxX0VNQUNfUkJRUCxyYmRfaWR4KTsNCiAgICAgICAg ICAgICAgIHJiZF9pZHggJj0gfjB4MTsgLyogY291bnRzIHBlciAyIHNvIGxh c3QgYml0PTAgKi8NCiAgICAgICAgICAgICAgIHJiZF9pZHggLT0gKGN5Z191 aW50MzIpcHJpdi0+cmJkOyAvKiB3ZSB3YW50IHRoZSBjb3VudGVyLCBub3Qg dGhlIGFkZHJlc3MgKi8NCiAgICAgICAgICAgICAgIGlmIChyYmRfaWR4ID09 IGlkeCkNCiAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgZGVi dWcxX3ByaW50ZigiQVQ5MV9FVEg6IFNXIGNhdGNoZWQgSFchXG4iKTsNCiAg ICAgICAgICAgICAgICAgcmV0dXJuOyAvL2hvdyB0byBicmVhazsgb3V0IG9m IDIgbG9vcHM/DQogICAgICAgICAgICAgICB9DQojZW5kaWYNCiAgICAgICAg ICAgICAgIC8qIGNoZWNrIGlmIG5vdCBhZ2FpbiBhIFNPRiAqLw0KICAgICAg ICAgICAgICAgaWYgKHByaXYtPnJiZFtpZHhdLnNyICYgQVQ5MV9FTUFDX1JC RF9TUl9TT0YpDQogICAgICAgICAgICAgICB7ICAvKiByZWNvdmVyIGJ1ZmZl cnMgKi8NCiAgICAgICAgICAgICAgICAgIHdoaWxlIChwcml2LT5jdXJyX3Ji ZF9pZHggIT0gaWR4KQ0KICAgICAgICAgICAgICAgICAgew0KICAgICAgICAg ICAgICAgICAgICBwcml2LT5yYmRbcHJpdi0+Y3Vycl9yYmRfaWR4XS5hZGRy ICY9DQogICAgICAgICAgICAgICAgICAgICAgfihBVDkxX0VNQUNfUkJEX0FE RFJfT1dORVJfU1cpOw0KICAgICAgICAgICAgICAgICAgICBwcml2LT5jdXJy X3JiZF9pZHgrKzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHByaXYtPmN1 cnJfcmJkX2lkeCA+PSBDWUdOVU1fREVWU19FVEhfQVJNX0FUOTFfUlhfQlVG UykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAg ICAgICBwcml2LT5jdXJyX3JiZF9pZHggPSAwOw0KICAgICAgICAgICAgICAg ICAgICB9DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICB9 DQogICAgICAgICAgICAgICAvKiBsb29rIGZvciBFT0YgKi8NCiAgICAgICAg ICAgICAgIGlmIChwcml2LT5yYmRbaWR4XS5zciAmIEFUOTFfRU1BQ19SQkRf U1JfRU9GKQ0KICAgICAgICAgICAgICAgeyAgLyogb25seSBmb3IgbGFzdCBi dWZmZXIgdGhlIGxlbmd0aCBpcyB2YWxpZCAqLw0KICAgICAgICAgICAgICAg ICAgY250ID0gKHByaXYtPnJiZFtpZHhdLnNyICYgQVQ5MV9FTUFDX1JCRF9T Ul9MRU5fTUFTSyk7DQogICAgICAgICAgICAgICAgICAvKiBUaGUgcmVjdiBm dW5jdGlvbiB3aWxsIGFkanVzdCB0aGUgY3VycmVudCBidWZmZXIgaWR4DQog ICAgICAgICAgICAgICAgICAgICBhZnRlciB0aGUgYnVmZmVyIGhhcyBiZWVu IGNsZWFyZWQNCiAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAg ICAgICAgaWYgKGNudCkgew0KICAgICAgICAgICAgICAgICAgICAgX2V0aF9k cnZfcmVjdihzYyxjbnQpO30gLyogVE9ETzogdGhpcyBmdW5jdGlvbiBjYW4g ZmFpbCwgYW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBj YWxsIGxvY2FsIHJlY3YsIHNvIG5vdCBjbGVhciB0aGUgT1dORVJfU1cgYml0 ICovDQogICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAg ICB7ICAvKiByZWNvdmVyIGJ1ZmZlcnMgKi8NCiAgICAgICAgICAgICAgICAg ICAgIGRlYnVnMV9wcmludGYoIkFUOTFfRVRIOiBSeCAwIEI/XG4iKTsNCiAg ICAgICAgICAgICAgICAgICAgIHdoaWxlIChwcml2LT5jdXJyX3JiZF9pZHgg IT0gaWR4KQ0KICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAg ICAgICAgICAgICAgcHJpdi0+cmJkW3ByaXYtPmN1cnJfcmJkX2lkeF0uYWRk ciAmPQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB+KEFUOTFfRU1BQ19S QkRfQUREUl9PV05FUl9TVyk7DQogICAgICAgICAgICAgICAgICAgICAgICBw cml2LT5jdXJyX3JiZF9pZHgrKzsNCiAgICAgICAgICAgICAgICAgICAgICAg IGlmIChwcml2LT5jdXJyX3JiZF9pZHggPj0gQ1lHTlVNX0RFVlNfRVRIX0FS TV9BVDkxX1JYX0JVRlMpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQog ICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5jdXJyX3JiZF9pZHgg PSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg ICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg ICAgICAgZGVidWcyX3ByaW50ZigiQVQ5MV9FVEg6IFJ4IGRhdGFcbiIpOw0K ICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICB9DQog ICAgICAgICAgICAgICBjdHIrKzsNCiAgICAgICAgICAgICAgIGlkeCA9IChj dHIrcHJpdi0+Y3Vycl9yYmRfaWR4KSVDWUdOVU1fREVWU19FVEhfQVJNX0FU OTFfUlhfQlVGUzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgIH0NCiAgICAg IH0NCiAgIH0NCiAgIGRlYnVnMl9wcmludGYoIkFUOTFfRVRIIG91dFxuIik7 DQp9DQoNCnN0YXRpYyB2b2lkDQphdDkxX2V0aF9yZWN2KHN0cnVjdCBldGhf ZHJ2X3NjICpzYywNCiAgICAgICAgICAgICAgc3RydWN0IGV0aF9kcnZfc2cg KnNnX2xpc3QsDQogICAgICAgICAgICAgIGludCBzZ19sZW4pDQp7DQogICBh dDkxX2V0aF9wcml2X3QgKnByaXYgPSAoYXQ5MV9ldGhfcHJpdl90ICopc2Mt PmRyaXZlcl9wcml2YXRlOw0KICAgaW50IGk7DQogICBjeWdfdWludDMyIGJ5 dGVzX2luX2J1ZmZlcjsgICAgICAgLyogIyBub3QgeWV0IGNvcGllZCBieXRl cyBpbiBFTUFDIGJ1ZmZlciAqLw0KICAgY3lnX3VpbnQzMiBieXRlc19pbl9s aXN0ID0gMDsgICAgIC8qIHBvc2l0aW9uIGluIGN1cnJlbnQgc2dfbGlzdCAq Lw0KICAgY3lnX3VpbnQzMiBieXRlc19uZWVkZWRfbGlzdCA9IDA7IC8qICMg Ynl0ZXMgc3RpbGwgZnJlZSBpbiBzZ19saXN0ICovDQogICBjeWdfdWludDMy IGJ1ZmZlcl9wb3MgPSAwOyAgICAgICAgLyogcG9zaXRpb24gaW4gY3VycmVu dCBFTUFDIGJ1ZmZlciAqLw0KICAgY3lnX3VpbnQ4ICogc2dfYnVmOw0KICAg Y3lnX3VpbnQzMiB0b3RhbF9ieXRlcyA9IDA7ICAgICAgIC8qIHRvdGFsIG5v LiBvZiBwYWNrZXQgYnl0ZXMgYWxyZWFkeSBjb3BpZWQgKi8NCg0KICAgZm9y KGkgPSAwO2k8c2dfbGVuO2krKykNCiAgIHsNCiAgICAgIGJ5dGVzX2luX2xp c3QgPSAwOyAvKiBnbyB0byBuZXh0IGxpc3QgKi8NCiAgICAgIHdoaWxlKGJ5 dGVzX2luX2xpc3QgPCBzZ19saXN0W2ldLmxlbikgLy9mcmVlYnNkIC0gaT0w OiAxNEINCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLy9mcmVlYnNkIC0gaT0xOiAxMjhCIG9yIHJlbWFpbmRlciBvZiBw YWNrZXQNCiAgICAgICAgIGJ5dGVzX25lZWRlZF9saXN0ID0gc2dfbGlzdFtp XS5sZW4gLSBieXRlc19pbl9saXN0Ow0KDQogICAgICAgICBpZihwcml2LT5y YmRbcHJpdi0+Y3Vycl9yYmRfaWR4XS5zciAmIEFUOTFfRU1BQ19SQkRfU1Jf RU9GKQ0KICAgICAgICAgeyAvKiBUaGlzIDEyOEIgYnVmZmVyIGNvbnRhaW5z IHRoZSBFbmQgT2YgdGhlIEZyYW1lLiAqLw0KICAgICAgICAgICAvKiBBVDkx X0VNQUNfUkJEX1NSX0xFTl9NQVNLIGNvbnRhaW5zIExlbmd0aCBvZiBmcmFt ZSBpbmNsdWRpbmcgRkNTIChpZiBzZWxlY3RlZCkgKi8NCiAgICAgICAgICAg IGJ5dGVzX2luX2J1ZmZlciA9DQogICAgICAgICAgICAgIChwcml2LT5yYmRb cHJpdi0+Y3Vycl9yYmRfaWR4XS5zciAmIEFUOTFfRU1BQ19SQkRfU1JfTEVO X01BU0spDQogICAgICAgICAgICAgIC0gdG90YWxfYnl0ZXM7IC8qIE5vdCAn LSBidWZmZXJfcG9zJyBiZWNhdXNlIHRoYXQgaXMgYWxyZWFkeSBjb250YWlu ZWQgaW4gdG90YWxfYnl0ZXMuICovDQogICAgICAgICB9DQogICAgICAgICBl bHNlDQogICAgICAgICB7IC8qIEFUOTFfRU1BQ19SWF9CVUZGX1NJWkUgPSAx MjhCICovDQogICAgICAgICAgICBieXRlc19pbl9idWZmZXIgPSBBVDkxX0VN QUNfUlhfQlVGRl9TSVpFIC0gYnVmZmVyX3BvczsNCiAgICAgICAgIH0NCg0K ICAgICAgICAgc2dfYnVmID0gKGN5Z191aW50OCAqKShzZ19saXN0W2ldLmJ1 Zik7DQoNCiAgICAgICAgIGlmKGJ5dGVzX25lZWRlZF9saXN0IDwgYnl0ZXNf aW5fYnVmZmVyKQ0KICAgICAgICAgew0KICAgICAgICAgICAgaWYoc2dfYnVm ICE9IE5VTEwpDQogICAgICAgICAgICAgICBtZW1jcHkoJnNnX2J1ZltieXRl c19pbl9saXN0XSwNCiAgICAgICAgICAgICAgICAgICAgICAmcHJpdi0+cmJb cHJpdi0+Y3Vycl9yYmRfaWR4XS5yYltidWZmZXJfcG9zXSwNCiAgICAgICAg ICAgICAgICAgICAgICBieXRlc19uZWVkZWRfbGlzdCk7DQogICAgICAgICAg ICBieXRlc19pbl9saXN0ICs9IGJ5dGVzX25lZWRlZF9saXN0Ow0KICAgICAg ICAgICAgYnVmZmVyX3BvcyArPSBieXRlc19uZWVkZWRfbGlzdDsNCiAgICAg ICAgICAgIHRvdGFsX2J5dGVzICs9IGJ5dGVzX25lZWRlZF9saXN0Ow0KICAg ICAgICAgfQ0KICAgICAgICAgZWxzZSAvKiBhbGwgZGF0YSBmcm9tIEVNQUMg YnVmZmVyIGNhbiBiZSBjb3BpZWQgKi8NCiAgICAgICAgIHsgLyogYWxzbyBo ZXJlIGZvciBsYXN0IGJ5dGVzIG9mIHBhY2tldDogc2dfbGVuW2xhc3RdLmxl biBtYXRjaGVzICovDQogICAgICAgICAgICBpZihzZ19idWYgIT0gTlVMTCkN CiAgICAgICAgICAgICAgIG1lbWNweSgmc2dfYnVmW2J5dGVzX2luX2xpc3Rd LA0KICAgICAgICAgICAgICAgICAgICAgICZwcml2LT5yYltwcml2LT5jdXJy X3JiZF9pZHhdLnJiW2J1ZmZlcl9wb3NdLA0KICAgICAgICAgICAgICAgICAg ICAgIGJ5dGVzX2luX2J1ZmZlcik7DQogICAgICAgICAgICBieXRlc19pbl9s aXN0ICs9IGJ5dGVzX2luX2J1ZmZlcjsNCiAgICAgICAgICAgIHRvdGFsX2J5 dGVzICs9IGJ5dGVzX2luX2J1ZmZlcjsNCg0KICAgICAgICAgICAgLyogU3Rl cCBvdXIgYnVmZmVyIG9uIG9uZSAqLw0KICAgICAgICAgICAgcHJpdi0+cmJk W3ByaXYtPmN1cnJfcmJkX2lkeF0uYWRkciAmPQ0KICAgICAgICAgICAgICB+ KEFUOTFfRU1BQ19SQkRfQUREUl9PV05FUl9TVyk7DQogICAgICAgICAgICBw cml2LT5jdXJyX3JiZF9pZHgrKzsNCiAgICAgICAgICAgIGlmKHByaXYtPmN1 cnJfcmJkX2lkeCA+PSBDWUdOVU1fREVWU19FVEhfQVJNX0FUOTFfUlhfQlVG UykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgIHByaXYtPmN1cnJf cmJkX2lkeCA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBidWZm ZXJfcG9zID0gMDsNCiAgICAgICAgIH0NCiAgICAgIH0NCiAgIH0NCn0NCg0K Ly8gcm91dGluZSBjYWxsZWQgdG8gaGFuZGxlIGV0aGVybmV0IGNvbnRyb2xs ZXIgaW4gcG9sbGVkIG1vZGUNCnN0YXRpYyB2b2lkDQphdDkxX2V0aF9wb2xs KHN0cnVjdCBldGhfZHJ2X3NjICpzYykNCnsNCiAgIC8qIFNlcnZpY2UgdGhl IGJ1ZmZlcnMgKi8NCiAgIGF0OTFfZXRoX2RlbGl2ZXIoc2MpOw0KfQ0KDQpz dGF0aWMgaW50DQphdDkxX2V0aF9pbnRfdmVjdG9yKHN0cnVjdCBldGhfZHJ2 X3NjICpzYykNCnsNCiAgIHJldHVybihDWUdOVU1fSEFMX0lOVEVSUlVQVF9F TUFDKTsNCn0NCg0KYXQ5MV9ldGhfcHJpdl90IGF0OTFfcHJpdl9kYXRhID0N CnsNCiAgIC5pbnRyX3ZlY3RvciA9IENZR05VTV9IQUxfSU5URVJSVVBUX0VN QUMsDQogICAuYmFzZSA9IEFUOTFfRU1BQw0KI2lmZGVmIENZR1BLR19ERVZT X0VUSF9QSFkNCiAgICwNCiAgIC5waHkgPSAmYXQ5MV9waHkNCiNlbmRpZg0K fTsNCg0KRVRIX0RSVl9TQyhhdDkxX3NjLA0KICAgICAgICAgICAmYXQ5MV9w cml2X2RhdGEsICAgICAgIC8vIERyaXZlciBzcGVjaWZpYyBkYXRhDQogICAg ICAgICAgICJldGgwIiwgICAgICAgICAgICAgICAgLy8gTmFtZSBmb3IgdGhp cyBpbnRlcmZhY2UNCiAgICAgICAgICAgYXQ5MV9ldGhfc3RhcnQsDQogICAg ICAgICAgIGF0OTFfZXRoX3N0b3AsDQogICAgICAgICAgIGF0OTFfZXRoX2Nv bnRyb2wsDQogICAgICAgICAgIGF0OTFfZXRoX2Nhbl9zZW5kLA0KICAgICAg ICAgICBhdDkxX2V0aF9zZW5kLA0KICAgICAgICAgICBhdDkxX2V0aF9yZWN2 LA0KICAgICAgICAgICBhdDkxX2V0aF9kZWxpdmVyLA0KICAgICAgICAgICBh dDkxX2V0aF9wb2xsLA0KICAgICAgICAgICBhdDkxX2V0aF9pbnRfdmVjdG9y KTsNCg0KTkVUREVWVEFCX0VOVFJZKGF0OTFfbmV0ZGV2LA0KICAgICAgICAg ICAgICAgICJhdDkxIiwNCiAgICAgICAgICAgICAgICBhdDkxX2V0aF9pbml0 LA0KICAgICAgICAgICAgICAgICZhdDkxX3NjKTsNCg0KLy8gRU9GIGlmX2F0 OTEuYw0K --_003_5578298D4090509televiccom_ Content-Type: text/x-csrc; name="if_at91_OliverM_LwIP.c" Content-Description: if_at91_OliverM_LwIP.c Content-Disposition: attachment; filename="if_at91_OliverM_LwIP.c"; size=29078; creation-date="Wed, 10 Jun 2015 12:11:58 GMT"; modification-date="Wed, 10 Jun 2015 12:11:58 GMT" Content-Transfer-Encoding: base64 Content-length: 39419 Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLy8NCi8vICAgICAg aWZfYXQ5MS5jDQovLw0KLy8NCi8vDQovLz09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09DQovLyAjIyMjRUNPU0dQTENPUFlSSUdIVEJFR0lOIyMjIyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQov LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQovLyBUaGlzIGZpbGUg aXMgcGFydCBvZiBlQ29zLCB0aGUgRW1iZWRkZWQgQ29uZmlndXJhYmxlIE9w ZXJhdGluZyBTeXN0ZW0uICAgDQovLyBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5 OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDYsIDIwMTAgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBJbmMuDQovLw0KLy8gZUNvcyBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0 IHVuZGVyICAgIA0KLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgICAgIA0K Ly8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvciAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciAgICAgIA0KLy8gdmVyc2lvbi4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIA0KLy8NCi8vIGVDb3MgaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJ VEhPVVQgICAgICANCi8vIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAgICAN Ci8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICANCi8vIGZvciBtb3Jl IGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICANCi8vDQovLyBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSAgICAgICAgDQovLyBhbG9uZyB3aXRoIGVDb3M7IGlmIG5vdCwgd3Jp dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAg DQovLyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24s IE1BICAwMjExMC0xMzAxLCBVU0EuICAgICAgICAgICAgDQovLw0KLy8gQXMg YSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgb3RoZXIgZmlsZXMgaW5zdGFudGlh dGUgdGVtcGxhdGVzIG9yIHVzZSAgICAgIA0KLy8gbWFjcm9zIG9yIGlubGlu ZSBmdW5jdGlvbnMgZnJvbSB0aGlzIGZpbGUsIG9yIHlvdSBjb21waWxlIHRo aXMgZmlsZSAgICAgIA0KLy8gYW5kIGxpbmsgaXQgd2l0aCBvdGhlciB3b3Jr cyB0byBwcm9kdWNlIGEgd29yayBiYXNlZCBvbiB0aGlzIGZpbGUsICAgICAg IA0KLy8gdGhpcyBmaWxlIGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUg cmVzdWx0aW5nIHdvcmsgdG8gYmUgY292ZXJlZCBieSAgIA0KLy8gdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBIb3dldmVyIHRoZSBzb3VyY2Ug Y29kZSBmb3IgdGhpcyBmaWxlICAgIA0KLy8gbXVzdCBzdGlsbCBiZSBtYWRl IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggc2VjdGlvbiAoMykgb2Yg dGhlIEdOVSAgIA0KLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0K Ly8NCi8vIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGludmFsaWRhdGUgYW55 IG90aGVyIHJlYXNvbnMgd2h5IGEgd29yayBiYXNlZCAgICANCi8vIG9uIHRo aXMgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZS4gICAgICAgICANCi8vIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICANCi8vICMjIyNFQ09TR1BMQ09QWVJJR0hURU5EIyMjIyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAN Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi8vIyMjIyNERVND UklQVElPTkJFR0lOIyMjIw0KLy8NCi8vIEF1dGhvcihzKTogICAgQW5kcmV3 IEx1bm4sIEpvaG4gRWlnZWxhYXINCi8vIENvbnRyaWJ1dG9yczogIE9MSQ0K Ly8gRGF0ZTogICAgICAgICAyMDE1LTAzLTE2DQovLyBQdXJwb3NlOg0KLy8g RGVzY3JpcHRpb246DQovLw0KLy8jIyMjREVTQ1JJUFRJT05FTkQjIyMjDQov Lw0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KDQojaW5jbHVk ZSA8cGtnY29uZi9zeXN0ZW0uaD4NCiNpbmNsdWRlIDxwa2djb25mL2hhbC5o Pg0KI2luY2x1ZGUgPHBrZ2NvbmYvZGV2c19ldGhfYXJtX2F0OTEuaD4NCiNp bmNsdWRlIDxwa2djb25mL2lvX2V0aF9kcml2ZXJzLmg+DQojaWYgZGVmaW5l ZChDWUdQS0dfUkVEQk9PVCkNCiNpbmNsdWRlIDxwa2djb25mL3JlZGJvb3Qu aD4NCiNlbmRpZg0KDQojaW5jbHVkZSA8Y3lnL2hhbC9oYWxfaW8uaD4NCiNp bmNsdWRlIDxjeWcvaGFsL2hhbF9pbnRyLmg+DQojaW5jbHVkZSA8Y3lnL2hh bC9oYWxfYXJjaC5oPg0KI2luY2x1ZGUgPGN5Zy9oYWwvZHJ2X2FwaS5oPg0K I2luY2x1ZGUgPGN5Zy9oYWwvaGFsX2RpYWcuaD4NCiNpbmNsdWRlIDxjeWcv aW5mcmEvY3lnX3R5cGUuaD4NCiNpbmNsdWRlIDxjeWcvaW5mcmEvY3lnX2Fz cy5oPg0KI2luY2x1ZGUgPGN5Zy9pbmZyYS9kaWFnLmg+DQojaW5jbHVkZSA8 Y3lnL2lvL2V0aC9uZXRkZXYuaD4NCiNpbmNsdWRlIDxjeWcvaW8vZXRoL2V0 aF9kcnYuaD4NCiNpbmNsdWRlIDxjeWcvaW8vZXRoL2V0aF9kcnZfc3RhdHMu aD4NCiNpbmNsdWRlIDxjeWcvaW8vZXRoX3BoeS5oPg0KI2luY2x1ZGUgPGVy cm5vLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQoNCi8vIFNldCB1cCB0aGUg bGV2ZWwgb2YgZGVidWcgb3V0cHV0DQojaWYgQ1lHUEtHX0RFVlNfRVRIX0FS TV9BVDkxX0RFQlVHX0xFVkVMID4gMA0KI2RlZmluZSBkZWJ1ZzFfcHJpbnRm KGFyZ3MuLi4pIGRpYWdfcHJpbnRmKGFyZ3MpDQojZWxzZQ0KI2RlZmluZSBk ZWJ1ZzFfcHJpbnRmKGFyZ3MuLi4pDQojZW5kaWYNCiNpZiBDWUdQS0dfREVW U19FVEhfQVJNX0FUOTFfREVCVUdfTEVWRUwgPiAxDQojZGVmaW5lIGRlYnVn Ml9wcmludGYoYXJncy4uLikgZGlhZ19wcmludGYoYXJncykNCiNlbHNlDQoj ZGVmaW5lIGRlYnVnMl9wcmludGYoYXJncy4uLikNCiNlbmRpZg0KDQovL0Ry aXZlciBpbnRlcmZhY2UgY2FsbGJhY2tzDQojZGVmaW5lIF9ldGhfZHJ2X2lu aXQoc2MsbWFjKQkJCVwNCiAgKHNjLT5mdW5zLT5ldGhfZHJ2LT5pbml0KShz YywodW5zaWduZWQgY2hhciAqKW1hYykNCiNkZWZpbmUgX2V0aF9kcnZfdHhf ZG9uZShzYyxrZXksc3RhdHVzKQkJXA0KICAoc2MtPmZ1bnMtPmV0aF9kcnYt PnR4X2RvbmUpKHNjLGtleSxzdGF0dXMpIA0KI2RlZmluZSBfZXRoX2Rydl9y ZWN2KHNjLGxlbikJCQlcDQogIChzYy0+ZnVucy0+ZXRoX2Rydi0+cmVjdiko c2MsbGVuKSANCg0KI2lmZGVmIENZR0lOVF9JT19FVEhfSU5UX1NVUFBPUlRf UkVRVUlSRUQNCnN0YXRpYyBjeWdfdWludDMyDQphdDkxX2V0aF9pc3IoY3ln X3ZlY3Rvcl90IHZlY3RvciwgY3lnX2FkZHJ3b3JkX3QgZGF0YSk7DQojZW5k aWYNCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFJlZEJvb3QgY29uZmln dXJhdGlvbiBvcHRpb25zIGZvciBtYW5hZ2luZyBFU0FzIGZvciB1cw0KDQov LyBEZWNpZGUgd2hldGhlciB0byBoYXZlIHJlZGJvb3QgY29uZmlnIHZhcnMg Zm9yIGl0Li4uDQojaWYgZGVmaW5lZChDWUdTRU1fUkVEQk9PVF9GTEFTSF9D T05GSUcpICYmIGRlZmluZWQoQ1lHUEtHX1JFREJPT1RfTkVUV09SS0lORykN CiNpbmNsdWRlIDxyZWRib290Lmg+DQojaW5jbHVkZSA8Zmxhc2hfY29uZmln Lmg+DQoNCiNpZmRlZiBDWUdTRU1fREVWU19FVEhfQVJNX0FUOTFfUkVEQk9P VF9IT0xEU19FU0FfRVRIMA0KUmVkQm9vdF9jb25maWdfb3B0aW9uKCJOZXR3 b3JrIGhhcmR3YXJlIGFkZHJlc3MgW01BQ10gZm9yIGV0aDAiLA0KCQlldGgw X2VzYV9kYXRhLA0KCQlBTFdBWVNfRU5BQkxFRCwgdHJ1ZSwNCgkJQ09ORklH X0VTQSwgMCk7DQojZW5kaWYNCg0KI2VuZGlmICAvLyBDWUdQS0dfUkVEQk9P VF9ORVRXT1JLSU5HICYmIENZR1NFTV9SRURCT09UX0ZMQVNIX0NPTkZJRw0K DQovLyBhbmQgaW5pdGlhbGl6YXRpb24gY29kZSB0byByZWFkIHRoZW0NCi8v IC0gaW5kZXBlbmRlbnQgb2Ygd2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgUmVk Qm9vdCByaWdodCBub3c6DQojaWZkZWYgQ1lHUEtHX0RFVlNfRVRIX0FSTV9B VDkxX1JFREJPT1RfSE9MRFNfRVNBDQoNCiNpbmNsdWRlIDxjeWcvaGFsL2hh bF9pZi5oPg0KDQojaWZuZGVmIENPTkZJR19FU0ENCiNkZWZpbmUgQ09ORklH X0VTQSAoNikNCiNlbmRpZg0KDQojZGVmaW5lIENZR0hXUl9ERVZTX0VUSF9B Uk1fQVQ5MV9HRVRfRVNBKCBtYWNfYWRkcmVzcywgb2sgKSAgICAgICAgICAg XA0KICBDWUdfTUFDUk9fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICBvayA9IENZR0FD Q19DQUxMX0lGX0ZMQVNIX0NGR19PUCggQ1lHTlVNX0NBTExfSUZfRkxBU0hf Q0ZHX0dFVCwgICAgICAgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgImV0aDBfZXNhX2RhdGEiLCAgICAgICAgICAgICAgICAgICAg XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX2Fk ZHJlc3MsICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VTQSk7ICAgICAgICAg ICAgICAgICAgICAgICAgXA0KICBDWUdfTUFDUk9fRU5EDQoNCiNlbmRpZiAv LyBDWUdQS0dfREVWU19FVEhfQVQ5MV9FVEhfUkVEQk9PVF9IT0xEU19FU0EN Cg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCg0KDQoN Cg0KDQpleHRlcm4gdm9pZCAqbWFjX2ZsYXNoX2FkZHJlc3M7DQoNCg0KDQoN Ci8vIFByaXZhdGUgRGF0YSBzdHJ1Y3R1cmVzDQoNCiNpZm5kZWYgQVQ5MV9F TUFDX1JYX0JVRkZfU0laRQ0KI2RlZmluZSBBVDkxX0VNQUNfUlhfQlVGRl9T SVpFICAxMjgNCiNlbmRpZg0KDQovLyBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlw dG9yDQp0eXBlZGVmIHN0cnVjdCByYmRfcyB7DQoJY3lnX3VpbnQzMiBhZGRy Ow0KCWN5Z191aW50MzIgc3I7DQp9IHJiZF90Ow0KDQovLyBSZWNlaXZlIEJ1 ZmZlcg0KdHlwZWRlZiBzdHJ1Y3QgcmJfcyB7DQoJY3lnX3VpbnQ4IHJiW0FU OTFfRU1BQ19SWF9CVUZGX1NJWkVdOw0KfSByYl90Ow0KDQovLyBUcmFuc21p dCBCdWZmZXIgRGVzY3JpcHRvcg0KdHlwZWRlZiBzdHJ1Y3QgdGJkX3Mgew0K CWN5Z191aW50MzIgYWRkcjsNCgljeWdfdWludDMyIHNyOw0KfSB0YmRfdDsN Cg0KLy8gQVQ5MSBFdGhlcm5ldCBwcml2YXRlIGRhdGENCnR5cGVkZWYgc3Ry dWN0IGF0OTFfZXRoX3ByaXZfcyB7DQoJY3lnX3VpbnQzMiBpbnRyX3ZlY3Rv cjsNCgljaGFyICplc2Ffa2V5OyAgICAgIC8vIFJlZEJvb3QgJ2tleScgZm9y IGRldmljZSBFU0ENCgljeWdfdWludDggKmVuYWRkcjsNCgljeWdfdWludDMy IGJhc2U7ICAgIC8vIEJhc2UgYWRkcmVzcyBvZiBkZXZpY2UNCglldGhfcGh5 X2FjY2Vzc190ICpwaHk7DQoJcmJkX3QgcmJkW0NZR05VTV9ERVZTX0VUSF9B Uk1fQVQ5MV9SWF9CVUZTXTsNCglyYl90IHJiW0NZR05VTV9ERVZTX0VUSF9B Uk1fQVQ5MV9SWF9CVUZTXTsNCgl0YmRfdCB0YmRbQ1lHTlVNX0RFVlNfRVRI X0FSTV9BVDkxX1RYX0JVRlNdOw0KCXVuc2lnbmVkIGxvbmcgY3Vycl90eF9r ZXk7DQoJY3lnX2Jvb2wgdHhfYnVzeTsNCgljeWdfdWludDMyIGxhc3RfdGJk X2lkeDsNCgljeWdfdWludDMyIGN1cnJfdGJkX2lkeDsNCgljeWdfdWludDMy IGN1cnJfcmJkX2lkeDsNCiNpZmRlZiBDWUdJTlRfSU9fRVRIX0lOVF9TVVBQ T1JUX1JFUVVJUkVEDQoJY3lnX2ludGVycnVwdCBpbnRyOw0KCWN5Z19oYW5k bGVfdCBpbnRyX2hhbmRsZTsNCiNlbmRpZg0KfSBhdDkxX2V0aF9wcml2X3Q7 DQoNCmV4dGVybiB2b2lkIHByaW50Zl91c2VyKGNvbnN0IGNoYXIgKmZtdCwg Li4uKTsNCiNkZWZpbmUgZGlhZ19wcmludGYgcHJpbnRmX3VzZXINCg0KI2Rl ZmluZSBDWUdQS0dfREVWU19FVEhfQVJNX0FUOTFfREVCVUdfTEVWRUwgMA0K DQojaWYgQ1lHUEtHX0RFVlNfRVRIX0FSTV9BVDkxX0RFQlVHX0xFVkVMID4g MA0KI2RlZmluZSBkZWJ1ZzFfcHJpbnRmKGFyZ3MuLi4pIGRpYWdfcHJpbnRm KGFyZ3MpDQojZWxzZQ0KI2RlZmluZSBkZWJ1ZzFfcHJpbnRmKGFyZ3MuLi4p DQojZW5kaWYNCiNpZiBDWUdQS0dfREVWU19FVEhfQVJNX0FUOTFfREVCVUdf TEVWRUwgPiAxDQojZGVmaW5lIGRlYnVnMl9wcmludGYoYXJncy4uLikgZGlh Z19wcmludGYoYXJncykNCiNlbHNlDQojZGVmaW5lIGRlYnVnMl9wcmludGYo YXJncy4uLikNCiNlbmRpZg0KDQp2b2lkIHByaW50X2J1ZmZzX3JlYWQodm9p ZCAqcCkgew0KDQoJc3RhdGljIGF0OTFfZXRoX3ByaXZfdCAqcHJpdiA9IE5V TEw7DQoNCglpZiAocCkgew0KCQlwcml2ID0gKGF0OTFfZXRoX3ByaXZfdCAq KSBwOw0KCX0NCglpZiAoIXByaXYpIHsNCgkJcHJpbnRmX3VzZXIoInByaW50 X2J1ZmZzX3JlYWQ6IHByaXYgPT0gTlVMTFxuIik7DQoJCXJldHVybjsNCgl9 DQoNCglpbnQgaTsNCg0KCWZvciAoaSA9IDA7IGkgPCBDWUdOVU1fREVWU19F VEhfQVJNX0FUOTFfUlhfQlVGUzsgaSsrKSB7DQoJCWlmIChwcml2LT5yYmRb aV0uYWRkciAmIEFUOTFfRU1BQ19SQkRfQUREUl9PV05FUl9TVykgew0KCQkJ cHJpbnRmX3VzZXIoIiUyZCB1c2VkICIsIGkpOw0KCQl9IGVsc2Ugew0KCQkJ cHJpbnRmX3VzZXIoIiUyZCAgICAgICIsIGkpOw0KCQl9DQoJCXByaW50Zl91 c2VyKCIlMDh4XG4iLCBwcml2LT5yYmRbaV0uc3IpOw0KCX0NCglwcmludGZf dXNlcigiXG4iKTsNCn0NCg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09DQovLyBQSFkgYWNjZXNzIGJpdHMgYW5kIHBpZWNlcw0KLy8gDQoN CnN0YXRpYyB2b2lkIGF0OTFfbWRpb19lbmFibGUodm9pZCkgew0KCWN5Z191 aW50MzIgdmFsOw0KCUhBTF9SRUFEX1VJTlQzMihBVDkxX0VNQUMgKyBBVDkx X0VNQUNfTkNSLCB2YWwpOw0KCXZhbCB8PSBBVDkxX0VNQUNfTkNSX01QRTsg LyogZW5hYmxlIG1hbmFnZW1lbnQgcG9ydCAqLw0KCUhBTF9XUklURV9VSU5U MzIoQVQ5MV9FTUFDICsgQVQ5MV9FTUFDX05DUiwgdmFsKTsNCn0NCg0Kc3Rh dGljIHZvaWQgYXQ5MV9tZGlvX2Rpc2FibGUodm9pZCkgew0KCWN5Z191aW50 MzIgdmFsOw0KCUhBTF9SRUFEX1VJTlQzMihBVDkxX0VNQUMgKyBBVDkxX0VN QUNfTkNSLCB2YWwpOw0KCXZhbCAmPSB+QVQ5MV9FTUFDX05DUl9NUEU7IC8q IGRpc2FibGUgbWFuYWdlbWVudCBwb3J0ICovDQoJSEFMX1dSSVRFX1VJTlQz MihBVDkxX0VNQUMgKyBBVDkxX0VNQUNfTkNSLCB2YWwpOw0KfQ0KDQovLyBX cml0ZSBvbmUgb2YgdGhlIFBIWSByZWdpc3RlcnMgdmlhIHRoZSBNSUkgYnVz DQpzdGF0aWMgdm9pZCBhdDkxX3dyaXRlX3BoeShpbnQgcmVnX2FkZHIsIGlu dCBwaHlfYWRkciwgdW5zaWduZWQgc2hvcnQgZGF0YSkgew0KCWN5Z191aW50 MzIgdmFsLCBjbnQgPSAwOw0KDQoJQ1lHX0FTU0VSVEMocmVnX2FkZHIgPj0g MCAmJiByZWdfYWRkciA8PSBBVDkxX0VNQUNfTUFOX1JFR0FfTUFTSyk7DQoJ Q1lHX0FTU0VSVEMocGh5X2FkZHIgPj0gMCAmJiBwaHlfYWRkciA8PSBBVDkx X0VNQUNfTUFOX1BIWV9NQVNLKTsNCg0KCXZhbCA9IChBVDkxX0VNQUNfTUFO X1NPRiB8DQoJQVQ5MV9FTUFDX01BTl9XUiB8DQoJQVQ5MV9FTUFDX01BTl9D T0RFIHwgQVQ5MV9FTUFDX01BTl9QSFlBKHBoeV9hZGRyKSB8IEFUOTFfRU1B Q19NQU5fUkVHQShyZWdfYWRkcikgfCBBVDkxX0VNQUNfTUFOX0RBVEEoZGF0 YSkpOw0KDQoJSEFMX1dSSVRFX1VJTlQzMihBVDkxX0VNQUMgKyBBVDkxX0VN QUNfTUFOLCB2YWwpOw0KDQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBO ZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBzZXQgKi8NCgl3aGlsZSAoY250 IDwgMTAwMDAwMCkgew0KCQlIQUxfUkVBRF9VSU5UMzIoKEFUOTFfRU1BQyAr IEFUOTFfRU1BQ19OU1IpLCB2YWwpOw0KCQlpZiAoISh2YWwgJiBBVDkxX0VN QUNfTlNSX0lETEUpKQ0KCQkJYnJlYWs7DQoJfQ0KCUNZR19BU1NFUlRDKGNu dCA8IDEwMDAwMDApOw0KfQ0KDQovLyBSZWFkIG9uZSBvZiB0aGUgUEhZIHJl Z2lzdGVycyB2aWEgdGhlIE1JSSBidXMNCnN0YXRpYyBib29sIGF0OTFfcmVh ZF9waHkoaW50IHJlZ19hZGRyLCBpbnQgcGh5X2FkZHIsIHVuc2lnbmVkIHNo b3J0ICpkYXRhKSB7DQoJY3lnX3VpbnQzMiB2YWw7DQoNCglDWUdfQVNTRVJU QyhyZWdfYWRkciA+PSAwICYmIHJlZ19hZGRyIDw9IEFUOTFfRU1BQ19NQU5f UkVHQV9NQVNLKTsNCglDWUdfQVNTRVJUQyhwaHlfYWRkciA+PSAwICYmIHBo eV9hZGRyIDw9IEFUOTFfRU1BQ19NQU5fUEhZX01BU0spOw0KDQoJdmFsID0g KEFUOTFfRU1BQ19NQU5fU09GIHwNCglBVDkxX0VNQUNfTUFOX1JEIHwNCglB VDkxX0VNQUNfTUFOX0NPREUgfCBBVDkxX0VNQUNfTUFOX1BIWUEocGh5X2Fk ZHIpIHwgQVQ5MV9FTUFDX01BTl9SRUdBKHJlZ19hZGRyKSk7DQoNCglIQUxf V1JJVEVfVUlOVDMyKEFUOTFfRU1BQyArIEFUOTFfRU1BQ19NQU4sIHZhbCk7 DQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyBy ZWdpc3RlciBpcyBzZXQgKi8NCglkbyB7DQoJCUhBTF9SRUFEX1VJTlQzMigo QVQ5MV9FTUFDICsgQVQ5MV9FTUFDX05TUiksIHZhbCk7DQoJfSB3aGlsZSAo ISh2YWwgJiBBVDkxX0VNQUNfTlNSX0lETEUpKTsNCg0KCUhBTF9ERUxBWV9V Uyg1MCk7DQoNCglIQUxfUkVBRF9VSU5UMzIoQVQ5MV9FTUFDICsgQVQ5MV9F TUFDX01BTiwgdmFsKTsNCgkqZGF0YSA9IHZhbCAmIEFUOTFfRU1BQ19NQU5f REFUQV9NQVNLOw0KDQoJcmV0dXJuICh0cnVlKTsNCn0NCg0KLy8gRW5hYmxl IHRoZSBNRElPIGJpdCBpbiBNQUMgY29udHJvbCByZWdpc3RlciBzbyB0aGF0 IHdlIGNhbiB0YWxrIHRvDQovLyB0aGUgUEhZLiBBbHNvIHNldCB0aGUgY2xv Y2sgZGl2aWRlciBzbyB0aGF0IE1EQyBpcyBsZXNzIHRoYW4gMi41TUh6Lg0K c3RhdGljIHZvaWQgYXQ5MV9pbml0X3BoeSh2b2lkKSB7DQoJY3lnX3VpbnQz MiBjZmc7DQoJY3lnX3VpbnQzMiBkaXY7DQoNCglIQUxfUkVBRF9VSU5UMzIo QVQ5MV9FTUFDICsgQVQ5MV9FTUFDX05DRkcsIGNmZyk7DQoJY2ZnICY9IH4g QVQ5MV9FTUFDX05DRkdfQ0xLX01BU0s7DQoNCglkaXYgPSAoQ1lHTlVNX0hB TF9BUk1fQVQ5MV9DTE9DS19TUEVFRCAvIDI1MDAwMDApOw0KCWlmIChkaXYg PCA4KSB7DQoJCWNmZyB8PSBBVDkxX0VNQUNfTkNGR19DTEtfSENMS184Ow0K CX0gZWxzZSBpZiAoZGl2IDwgMTYpIHsNCgkJY2ZnIHw9IEFUOTFfRU1BQ19O Q0ZHX0NMS19IQ0xLXzE2Ow0KCX0gZWxzZSBpZiAoZGl2IDwgMzIpIHsNCgkJ Y2ZnIHw9IEFUOTFfRU1BQ19OQ0ZHX0NMS19IQ0xLXzMyOw0KCX0gZWxzZSBp ZiAoZGl2IDwgNjQpIHsNCgkJY2ZnIHw9IEFUOTFfRU1BQ19OQ0ZHX0NMS19I Q0xLXzY0Ow0KCX0gZWxzZSB7DQoJCUNZR19GQUlMKCJVbmFibGUgdG8gcHJv Z3JhbSBNSUkgY2xvY2siKTsNCgl9DQoNCglIQUxfV1JJVEVfVUlOVDMyKEFU OTFfRU1BQyArIEFUOTFfRU1BQ19OQ0ZHLCBjZmcpOw0KfQ0KDQpFVEhfUEhZ X1JFR19MRVZFTF9BQ0NFU1NfRlVOUyhhdDkxX3BoeSwgYXQ5MV9pbml0X3Bo eSwgTlVMTCwgYXQ5MV93cml0ZV9waHksIGF0OTFfcmVhZF9waHkpOw0KDQov Lz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi8vIFJlY2VpdmVyIGJ1ZmZl ciBoYW5kbGluZw0KDQovLyBJbml0aWFsaXplIHRoZSByZWNlaXZlciBidWZm ZXJzIGFuZCBkZXNjcmlwdG9ycw0Kc3RhdGljIHZvaWQgYXQ5MV9yYl9pbml0 KGF0OTFfZXRoX3ByaXZfdCAqcHJpdikgew0KCWludCBpOw0KCWZvciAoaSA9 IDA7IGkgPCBDWUdOVU1fREVWU19FVEhfQVJNX0FUOTFfUlhfQlVGUzsgaSsr KSB7DQoJCXByaXYtPnJiZFtpXS5hZGRyID0gKChjeWdfdWludDMyKSAmcHJp di0+cmJbaV0pICYgQVQ5MV9FTUFDX1JCRF9BRERSX01BU0s7DQoJCXByaXYt PnJiZFtpXS5zciA9IDA7DQoJfQ0KCS8vIFNldCB0aGUgd3JhcCBiaXQgb24g dGhlIGxhc3QgZW50cnkNCglwcml2LT5yYmRbQ1lHTlVNX0RFVlNfRVRIX0FS TV9BVDkxX1JYX0JVRlMgLSAxXS5hZGRyIHw9DQoJQVQ5MV9FTUFDX1JCRF9B RERSX1dSQVA7DQp9DQoNCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K Ly8gVHJhbnNtaXQgYnVmZmVyIGhhbmRsaW5nDQoNCi8vIEluaXRpYWxpemUg dGhlIHRyYW5zbWl0IGJ1ZmZlciBkZXNjcmlwdG9ycw0Kc3RhdGljIHZvaWQg YXQ5MV90Yl9pbml0KGF0OTFfZXRoX3ByaXZfdCAqcHJpdikgew0KCWludCBp Ow0KCWZvciAoaSA9IDA7IGkgPCBDWUdOVU1fREVWU19FVEhfQVJNX0FUOTFf VFhfQlVGUzsgaSsrKSB7DQoJCXByaXYtPnRiZFtpXS5hZGRyID0gMDsNCgkJ cHJpdi0+dGJkW2ldLnNyID0gQVQ5MV9FTUFDX1RCRF9TUl9VU0VEOw0KCX0N CgkvLyBTZXQgdGhlIHdyYXAgYml0IG9uIHRoZSBsYXN0IGVudHJ5DQoJcHJp di0+dGJkW0NZR05VTV9ERVZTX0VUSF9BUk1fQVQ5MV9UWF9CVUZTIC0gMV0u c3IgfD0gQVQ5MV9FTUFDX1RCRF9TUl9XUkFQOw0KfQ0KDQovLz09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0NCi8vIEVuYWJsZSBhbmQgRGlzYWJsZSBvZiB0 aGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLg0KDQpzdGF0aWMgdm9pZCBh dDkxX2Rpc2FibGVfcngoYXQ5MV9ldGhfcHJpdl90ICpwcml2KSB7DQoJY3ln X3VpbnQzMiBjdGw7DQoNCglIQUxfUkVBRF9VSU5UMzIocHJpdi0+YmFzZSAr IEFUOTFfRU1BQ19OQ1IsIGN0bCk7DQoJY3RsICY9IH5BVDkxX0VNQUNfTkNS X1JFOw0KCUhBTF9XUklURV9VSU5UMzIocHJpdi0+YmFzZSArIEFUOTFfRU1B Q19OQ1IsIGN0bCk7DQp9DQoNCnN0YXRpYyB2b2lkIGF0OTFfZGlzYWJsZV90 eChhdDkxX2V0aF9wcml2X3QgKnByaXYpIHsNCgljeWdfdWludDMyIGN0bDsN Cg0KCUhBTF9SRUFEX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX05D UiwgY3RsKTsNCgljdGwgJj0gfkFUOTFfRU1BQ19OQ1JfVFg7DQoJSEFMX1dS SVRFX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX05DUiwgY3RsKTsN Cn0NCg0Kc3RhdGljIHZvaWQgYXQ5MV9lbmFibGVfcngoYXQ5MV9ldGhfcHJp dl90ICpwcml2KSB7DQoJY3lnX3VpbnQzMiBjdGw7DQoNCglIQUxfUkVBRF9V SU5UMzIocHJpdi0+YmFzZSArIEFUOTFfRU1BQ19OQ1IsIGN0bCk7DQoJY3Rs IHw9IEFUOTFfRU1BQ19OQ1JfUkU7DQoJSEFMX1dSSVRFX1VJTlQzMihwcml2 LT5iYXNlICsgQVQ5MV9FTUFDX05DUiwgY3RsKTsNCn0NCg0Kc3RhdGljIHZv aWQgYXQ5MV9lbmFibGVfdHgoYXQ5MV9ldGhfcHJpdl90ICpwcml2KSB7DQoJ Y3lnX3VpbnQzMiBjdGw7DQoNCglIQUxfUkVBRF9VSU5UMzIocHJpdi0+YmFz ZSArIEFUOTFfRU1BQ19OQ1IsIGN0bCk7DQoJY3RsIHw9IEFUOTFfRU1BQ19O Q1JfVFg7DQoJSEFMX1dSSVRFX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9F TUFDX05DUiwgY3RsKTsNCn0NCg0Kc3RhdGljIHZvaWQgYXQ5MV9lbmFibGUo YXQ5MV9ldGhfcHJpdl90ICpwcml2KSB7DQoJYXQ5MV9lbmFibGVfdHgocHJp dik7DQoJYXQ5MV9lbmFibGVfcngocHJpdik7DQp9DQoNCnN0YXRpYyB2b2lk IGF0OTFfZGlzYWJsZShhdDkxX2V0aF9wcml2X3QgKnByaXYpIHsNCglhdDkx X2Rpc2FibGVfdHgocHJpdik7DQoJYXQ5MV9kaXNhYmxlX3J4KHByaXYpOw0K fQ0KDQpzdGF0aWMgdm9pZCBhdDkxX3N0YXJ0X3RyYW5zbWl0dGVyKGF0OTFf ZXRoX3ByaXZfdCAqcHJpdikgew0KCWN5Z191aW50MzIgY3RsOw0KDQoJSEFM X1JFQURfVUlOVDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfTkNSLCBjdGwp Ow0KCWN0bCB8PSBBVDkxX0VNQUNfTkNSX1RTVEFSVDsNCglIQUxfV1JJVEVf VUlOVDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfTkNSLCBjdGwpOw0KfQ0K DQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi8vIEluaXRpYWxpemF0 aW9uIGNvZGUNCg0KLy8gQ29uZmlndXJlIHRoZSBwaW5zIHNvIHRoYXQgdGhl IEVNQUMgaGFzIGNvbnRyb2wgb2YgdGhlbS4gVGhpcw0KLy8gYXNzdW1lcyB0 aGUgTUlJIGlzIHVzZWQsIG5vdCB0aGUgUk1JSQ0Kc3RhdGljIHZvaWQgYXQ5 MV9jZmdfcGlucyh2b2lkKSB7DQoJSEFMX0FSTV9BVDkxX1BJT19DRkcoQVQ5 MV9FTUFDX0VSRUZDSyk7DQoJSEFMX0FSTV9BVDkxX1BJT19DRkcoQVQ5MV9F TUFDX0VDUlMpOw0KCUhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19F Q09MKTsNCg0KCUhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FUlhE Vik7DQoJSEFMX0FSTV9BVDkxX1BJT19DRkcoQVQ5MV9FTUFDX0VSWDApOw0K CUhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FUlgxKTsNCglIQUxf QVJNX0FUOTFfUElPX0NGRyhBVDkxX0VNQUNfRVJYMik7DQoJSEFMX0FSTV9B VDkxX1BJT19DRkcoQVQ5MV9FTUFDX0VSWDMpOw0KCUhBTF9BUk1fQVQ5MV9Q SU9fQ0ZHKEFUOTFfRU1BQ19FUlhFUik7DQoJSEFMX0FSTV9BVDkxX1BJT19D RkcoQVQ5MV9FTUFDX0VSWENLKTsNCg0KCUhBTF9BUk1fQVQ5MV9QSU9fQ0ZH KEFUOTFfRU1BQ19FVFhFTik7DQoJSEFMX0FSTV9BVDkxX1BJT19DRkcoQVQ5 MV9FTUFDX0VUWDApOw0KCUhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1B Q19FVFgxKTsNCglIQUxfQVJNX0FUOTFfUElPX0NGRyhBVDkxX0VNQUNfRVRY Mik7DQoJSEFMX0FSTV9BVDkxX1BJT19DRkcoQVQ5MV9FTUFDX0VUWDMpOw0K CUhBTF9BUk1fQVQ5MV9QSU9fQ0ZHKEFUOTFfRU1BQ19FVFhFUik7DQoNCglI QUxfQVJNX0FUOTFfUElPX0NGRyhBVDkxX0VNQUNfRU1EQyk7DQoJSEFMX0FS TV9BVDkxX1BJT19DRkcoQVQ5MV9FTUFDX0VNRElPKTsNCn0NCg0KLy8gU2V0 IGEgc3BlY2lmaWMgYWRkcmVzcyBtYXRjaCB0byBhIGdpdmVuIGFkZHJlc3Mu IFBhY2tldHMgcmVjZWl2ZWQgd2hpY2gNCi8vIG1hdGNoIHRoaXMgYWRkcmVz cyB3aWxsIGJlIHBhc3NlZCBvbi4NCnN0YXRpYyB2b2lkIGF0OTFfc2V0X21h YyhhdDkxX2V0aF9wcml2X3QgKiBwcml2LCBjeWdfdWludDggKiBlbmFkZHIs IGludCBzYSkgew0KCWN5Z191aW50MzIgaGksIGxvOw0KDQoJQ1lHX0FTU0VS VEMoc2EgPiAwICYmIHNhIDwgNSk7DQoJc2EtLTsNCg0KCWxvID0gKChlbmFk ZHJbM10gPDwgMjQpIHwgKGVuYWRkclsyXSA8PCAxNikgfCAoZW5hZGRyWzFd IDw8IDgpIHwgKGVuYWRkclswXSkpOw0KDQoJaGkgPSAoKGVuYWRkcls1XSA8 PCA4KSB8IChlbmFkZHJbNF0pKTsNCg0KCUhBTF9XUklURV9VSU5UMzIocHJp di0+YmFzZSArIEFUOTFfRU1BQ19TQTFMICsgKDgqc2EpLCBsbyk7DQoJSEFM X1dSSVRFX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX1NBMUggKyAo OCpzYSksIGhpKTsNCn0NCg0Kc3RhdGljIHZvaWQgYXQ5MV9jbGVhcl9zdGF0 cyhhdDkxX2V0aF9wcml2X3QgKnByaXYpIHsNCgljeWdfdWludDMyIGN0bDsN Cg0KCUhBTF9SRUFEX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX05D UiwgY3RsKTsNCgljdGwgfD0gQVQ5MV9FTUFDX05DUl9DU1I7DQoJSEFMX1dS SVRFX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX05DUiwgY3RsKTsN Cn0NCg0KLy8gRW5hYmxlIGFuZCBEaXNhYmxlIG9mIHRoZSByZWNlaXZlciBh bmQgdHJhbnNtaXR0ZXIuDQovLyBJbml0aWFsaXplIHRoZSBpbnRlcmZhY2Uu IFRoaXMgY29uZmlndXJlcyB0aGUgaW50ZXJmYWNlIHJlYWR5IGZvciB1c2Uu DQovLyBJbnRlcnJ1cHRzIGFyZSBncmFiYmVkIGV0Yy4gVGhpcyBtZWFucyB0 aGUgc3RhcnQgZnVuY3Rpb24gaGFzDQovLyBsaXR0bGUgdG8gZG8gZXhjZXB0 IGVuYWJsZSB0aGUgcmVjZWl2ZXINCnN0YXRpYyBib29sIGF0OTFfZXRoX2lu aXQoc3RydWN0IGN5Z19uZXRkZXZ0YWJfZW50cnkgKnRhYikgew0KCXN0cnVj dCBldGhfZHJ2X3NjICpzYyA9IChzdHJ1Y3QgZXRoX2Rydl9zYyAqKSB0YWIt PmRldmljZV9pbnN0YW5jZTsNCglhdDkxX2V0aF9wcml2X3QgKnByaXYgPSAo YXQ5MV9ldGhfcHJpdl90ICopIHNjLT5kcml2ZXJfcHJpdmF0ZTsNCglib29s IGVzYV9vayA9IGZhbHNlOw0KI2lmIDANCgl1bnNpZ25lZCBjaGFyIGVuYWRk cls2XSA9IHsgQ1lHUEtHX0RFVlNfRVRIX0FSTV9BVDkxX01BQ0FERFIgfTsN CiNlbHNlDQoJdW5zaWduZWQgY2hhciBkZWZhdWx0X2VuYWRkcls2XSA9IHsg Q1lHUEtHX0RFVlNfRVRIX0FSTV9BVDkxX01BQ0FERFIgfTsNCgl1bnNpZ25l ZCBjaGFyICplbmFkZHIgPSBtYWNfZmxhc2hfYWRkcmVzczsNCglpZiAoKCpl bmFkZHIpICYgMHhmZmZmZmZmZmZmZmYgPT0gMHhmZmZmZmZmZmZmZmYpew0K CQllbmFkZHIgPSBkZWZhdWx0X2VuYWRkcjsNCgl9DQojZW5kaWYNCgl1bnNp Z25lZCBjaGFyIGVuemVyb1s2XSA9IHsgMHgwLCAweDAsIDB4MCwgMHgwLCAw eDAsIDB4MCB9Ow0KCXVuc2lnbmVkIHNob3J0IHBoeV9zdGF0ZSA9IDA7DQoJ Y3lnX3VpbnQzMiBuY2ZnID0gMDsNCg0KCWRlYnVnMV9wcmludGYoIlxuQVQ5 MV9FVEg6IEluaXRpYWxpc2luZyBAICV4XG4iLCBwcml2LT5iYXNlKTsNCg0K CXByaXYtPnR4X2J1c3kgPSBmYWxzZTsNCglwcml2LT5jdXJyX3RiZF9pZHgg PSAwOw0KCXByaXYtPmN1cnJfcmJkX2lkeCA9IDA7DQoNCgkvLyBFbmFibGUg dGhlIGNsb2NrIHRvIHRoZSBFTUFDDQoJSEFMX1dSSVRFX1VJTlQzMihBVDkx X1BNQyArIEFUOTFfUE1DX1BDRVIsIEFUOTFfUE1DX1BDRVJfRU1BQyk7DQoJ SEFMX1dSSVRFX1VJTlQzMihBVDkxX1BNQyArIEFUOTFfUE1DX1BDRVIsIEFU OTFfUE1DX1BDRVJfUElPQik7DQoJSEFMX1dSSVRFX1VJTlQzMihBVDkxX1BN QyArIEFUOTFfUE1DX1BDRVIsIEFUOTFfUE1DX1BDRVJfUElPQSk7DQoNCgkv L2F0OTFfZGlzYWJsZShwcml2KTsNCglhdDkxX2NmZ19waW5zKCk7DQoNCgkv KiBFbmFibGUgIElPIENsb2NrICovDQoJSEFMX1dSSVRFX1VJTlQzMihwcml2 LT5iYXNlK0FUOTFfRU1BQ19VU1JJTywgQVQ5MV9FTUFDX1VTUklPX0NMS0VO KTsNCg0KCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzIGZvciB0aGUg bW9tZW50ICAgICAgICAgICAgKi8NCgkvKiBUaGUgU3RhcnQgZnVuY3Rpb24g YWN0dWFsbHkgZW5hYmxlcyBhbGwgdGhhdCB3ZSBuZWVkICovDQoJLy9IQUxf V1JJVEVfVUlOVDMyKHByaXYtPmJhc2UgKyBBVDkxX0VNQUNfSURSLCAweDNG RkYpOw0KCS8vIElmIHdlIGFyZSBidWlsZGluZyBhbiBpbnRlcnJ1cHQgZW5h YmxlZCB2ZXJzaW9uLCBpbnN0YWxsIHRoZQ0KCS8vIGludGVycnVwdCBoYW5k bGVyDQojaWZkZWYgQ1lHSU5UX0lPX0VUSF9JTlRfU1VQUE9SVF9SRVFVSVJF RA0KCWRlYnVnMV9wcmludGYoIkFUOTFfRVRIOiBJbnN0YWxsaW5nIEludGVy cnVwdHMgb24gSVJRICVkXG4iLCBwcml2LT5pbnRyX3ZlY3Rvcik7DQoJY3ln X2Rydl9pbnRlcnJ1cHRfY3JlYXRlKHByaXYtPmludHJfdmVjdG9yLCA0LCAo Y3lnX2FkZHJ3b3JkX3QpIHNjLCBhdDkxX2V0aF9pc3IsIGV0aF9kcnZfZHNy LA0KCQkJJnByaXYtPmludHJfaGFuZGxlLCAmcHJpdi0+aW50cik7DQoNCglj eWdfZHJ2X2ludGVycnVwdF9hdHRhY2gocHJpdi0+aW50cl9oYW5kbGUpOw0K CWN5Z19kcnZfaW50ZXJydXB0X3VubWFzayhwcml2LT5pbnRyX3ZlY3Rvcik7 DQojZW5kaWYNCg0KI2lmZGVmIENZR0hXUl9ERVZTX0VUSF9BUk1fQVQ5MV9H RVRfRVNBDQoJLy8gR2V0IE1BQyBhZGRyZXNzIGZyb20gUmVkQm9vdCBjb25m aWd1cmF0aW9uIHZhcmlhYmxlcw0KCUNZR0hXUl9ERVZTX0VUSF9BUk1fQVQ5 MV9HRVRfRVNBKCZlbmFkZHJbMF0sIGVzYV9vayk7DQoJLy8gSWYgdGhpcyBj YWxsIGZhaWxzIG15TWFjQWRkciBpcyB1bmNoYW5nZWQgYW5kIE1BQyBhZGRy ZXNzIGZyb20NCgkvLyBDREwgaXMgdXNlZA0KI2VuZGlmDQoNCglpZiAoIWVz YV9vaykgew0KCQkvLyBDYW4ndCBmaWd1cmUgb3V0IEVTQQ0KCQlkZWJ1ZzFf cHJpbnRmKCJBVDkxX0VUSCAtIFdhcm5pbmchIEVTQSB1bmtub3duXG4iKTsN Cgl9DQoJZGVidWcxX3ByaW50ZigiQVQ5MV9FVEg6ICUwMng6JTAyeDolMDJ4 OiUwMng6JTAyeDolMDJ4XG4iLCBlbmFkZHJbMF0sIGVuYWRkclsxXSwgZW5h ZGRyWzJdLCBlbmFkZHJbM10sDQoJCQllbmFkZHJbNF0sIGVuYWRkcls1XSk7 DQoNCgkvLyBHaXZlIHRoZSBFTUFDIGl0cyBhZGRyZXNzDQoJYXQ5MV9zZXRf bWFjKHByaXYsIGVuYWRkciwgMSk7DQoJYXQ5MV9zZXRfbWFjKHByaXYsIGVu emVybywgMik7DQoJYXQ5MV9zZXRfbWFjKHByaXYsIGVuemVybywgMyk7DQoJ YXQ5MV9zZXRfbWFjKHByaXYsIGVuemVybywgNCk7DQoNCgkvLyBTZXR1cCB0 aGUgcmVjZWl2ZXIgYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMNCglhdDkxX3Ji X2luaXQocHJpdik7DQoNCgkvLyBBbmQgdGVsbCB0aGUgRU1BQyB3aGVyZSB0 aGUgZmlyc3QgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvciBpcw0KCUhBTF9X UklURV9VSU5UMzIocHJpdi0+YmFzZSArIEFUOTFfRU1BQ19SQlFQLCAoY3ln X3VpbnQzMiApcHJpdi0+cmJkKTsNCg0KCS8vIFNldHVwIHRoZSB0cmFuc21p dCBkZXNjcmlwdG9ycw0KCWF0OTFfdGJfaW5pdChwcml2KTsNCg0KCS8vIEFu ZCB0ZWxsIHRoZSBFTUFDIHdoZXJlIHRoZSBmaXJzdCB0cmFuc21pdCBidWZm ZXIgZGVzY3JpcHRvciBpcw0KCUhBTF9XUklURV9VSU5UMzIocHJpdi0+YmFz ZSArIEFUOTFfRU1BQ19UQlFQLCAoY3lnX3VpbnQzMiApcHJpdi0+dGJkKTsN Cg0KCS8vIFNldHVwIHRoZSBQSFkNCglDWUdfQVNTRVJUQyhwcml2LT5waHkp Ow0KDQoJYXQ5MV9tZGlvX2VuYWJsZSgpOw0KCWlmICghX2V0aF9waHlfaW5p dChwcml2LT5waHkpKSB7DQoJCWF0OTFfbWRpb19kaXNhYmxlKCk7DQoJCXJl dHVybiAoZmFsc2UpOw0KCX0NCg0KCS8vIEdldCB0aGUgY3VycmVudCBtb2Rl IGFuZCBwcmludCBpdA0KCXBoeV9zdGF0ZSA9IF9ldGhfcGh5X3N0YXRlKHBy aXYtPnBoeSk7DQoJYXQ5MV9tZGlvX2Rpc2FibGUoKTsNCg0KCUhBTF9SRUFE X1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX05DRkcsIG5jZmcpOw0K DQoJaWYgKChwaHlfc3RhdGUgJiBFVEhfUEhZX1NUQVRfTElOSykgIT0gMCkg ew0KCQlpZiAoKChwaHlfc3RhdGUgJiBFVEhfUEhZX1NUQVRfMTAwTUIpICE9 IDApKSB7DQoJCQlkZWJ1ZzFfcHJpbnRmKCJBVDkxX0VUSDogMTAwTWJ5dGUv cyIpOw0KCQkJbmNmZyB8PSBBVDkxX0VNQUNfTkNGR19TUERfMTAwTWJwczsN CgkJfSBlbHNlIHsNCgkJCWRlYnVnMV9wcmludGYoIkFUOTFfRVRIOiAxME1i eXRlL3MiKTsNCgkJCW5jZmcgJj0gfihBVDkxX0VNQUNfTkNGR19TUERfMTAw TWJwcyk7DQoJCX0NCgkJaWYgKChwaHlfc3RhdGUgJiBFVEhfUEhZX1NUQVRf RkRYKSkgew0KCQkJZGVidWcxX3ByaW50ZigiIEZ1bGwgRHVwbGV4XG4iKTsN CgkJCW5jZmcgfD0gQVQ5MV9FTUFDX05DRkdfRkQ7DQoJCX0gZWxzZSB7DQoJ CQlkZWJ1ZzFfcHJpbnRmKCIgSGFsZiBEdXBsZXhcbiIpOw0KCQkJbmNmZyAm PSB+KEFUOTFfRU1BQ19OQ0ZHX0ZEKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCWRl YnVnMV9wcmludGYoIkFUOTFfRVRIOiBObyBMaW5rXG4iKTsNCgl9DQoNCgkv L1NldHVwIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24NCgluY2ZnIHw9IChB VDkxX0VNQUNfTkNGR19STENFKTsNCg0KCUhBTF9XUklURV9VSU5UMzIocHJp di0+YmFzZSArIEFUOTFfRU1BQ19OQ0ZHLCBuY2ZnKTsNCg0KCS8vIENsZWFy IHRoZSBTdGF0aXN0aWNzIGNvdW50ZXJzOw0KCWF0OTFfY2xlYXJfc3RhdHMo cHJpdik7DQoNCgkvKiBDbGVhciB0aGUgc3RhdHVzIHJlZ2lzdGVycyAqLw0K CUhBTF9SRUFEX1VJTlQzMihwcml2LT5iYXNlICsgQVQ5MV9FTUFDX0lTUiwg bmNmZyk7DQoJSEFMX1JFQURfVUlOVDMyKHByaXYtPmJhc2UgKyBBVDkxX0VN QUNfUlNSLCBuY2ZnKTsNCglIQUxfV1JJVEVfVUlOVDMyKHByaXYtPmJhc2Ug KyBBVDkxX0VNQUNfUlNSLCBuY2ZnKTsNCglIQUxfUkVBRF9VSU5UMzIocHJp di0+YmFzZSArIEFUOTFfRU1BQ19UU1IsIG5jZmcpOw0KCUhBTF9XUklURV9V SU5UMzIocHJpdi0+YmFzZSArIEFUOTFfRU1BQ19UU1IsIG5jZmcpOw0KDQoJ Ly8gSW5pdGlhbGl6ZSB0aGUgdXBwZXIgbGF5ZXIgZHJpdmVyDQoJX2V0aF9k cnZfaW5pdChzYywgZW5hZGRyKTsNCg0KCXJldHVybiAodHJ1ZSk7DQp9DQoN Ci8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0b3AgdGhlIGludGVy ZmFjZS4NCnN0YXRpYyB2b2lkIGF0OTFfZXRoX3N0b3Aoc3RydWN0IGV0aF9k cnZfc2MgKnNjKSB7DQoJYXQ5MV9ldGhfcHJpdl90ICpwcml2ID0gKGF0OTFf ZXRoX3ByaXZfdCAqKSBzYy0+ZHJpdmVyX3ByaXZhdGU7DQoNCglhdDkxX2Rp c2FibGUocHJpdik7DQp9DQoNCi8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVk IHRvICJzdGFydCB1cCIgdGhlIGludGVyZmFjZS4gSXQgbWF5IGJlIGNhbGxl ZA0KLy8gbXVsdGlwbGUgdGltZXMsIGV2ZW4gd2hlbiB0aGUgaGFyZHdhcmUg aXMgYWxyZWFkeSBydW5uaW5nLg0Kc3RhdGljIHZvaWQgYXQ5MV9ldGhfc3Rh cnQoc3RydWN0IGV0aF9kcnZfc2MgKnNjLCB1bnNpZ25lZCBjaGFyICplbmFk ZHIsIGludCBmbGFncykgew0KCWF0OTFfZXRoX3ByaXZfdCAqcHJpdiA9IChh dDkxX2V0aF9wcml2X3QgKikgc2MtPmRyaXZlcl9wcml2YXRlOw0KCWN5Z191 aW50MzIgYml0czsNCg0KCXByaW50X2J1ZmZzX3JlYWQocHJpdik7DQoNCgkv LyBFbmFibGUgdGhlIGludGVycnVwdHMgd2UgYXJlIGludGVyZXN0ZWQgaW4N CgkvLyBUT0RPOiBXZSBwcm9iYWJseSBuZWVkIHRvIGFkZCBhdCBsZWFzdCB0 aGUgUkJOQSBpbnRlcnJ1cHQgaGVyZQ0KCS8vICAgICAgIGFzIHdlbGwgaW4g b3JkZXIgdG8gZG8gc29tZSBlcnJvciBoYW5kbGluZw0KCWJpdHMgPSAoQVQ5 MV9FTUFDX0lTUl9SQ09NIHwgQVQ5MV9FTUFDX0lTUl9UQ09NKTsNCg0KCUhB TF9XUklURV9VSU5UMzIocHJpdi0+YmFzZSArIEFUOTFfRU1BQ19JRVIsIGJp dHMpOw0KDQoJLy8gRW5hYmxlIHRoZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0 ZXINCglhdDkxX2VuYWJsZShwcml2KTsNCn0NCg0KLy8gVGhpcyBmdW5jdGlv biBpcyBjYWxsZWQgZm9yIGxvdyBsZXZlbCAiY29udHJvbCIgb3BlcmF0aW9u cw0Kc3RhdGljIGludCBhdDkxX2V0aF9jb250cm9sKHN0cnVjdCBldGhfZHJ2 X3NjICpzYywgdW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKmRhdGEsIGludCBs ZW5ndGgpIHsNCg0KCXN3aXRjaCAoa2V5KSB7DQoJY2FzZSBFVEhfRFJWX1NF VF9NQUNfQUREUkVTUzogew0KCQlpZiAobGVuZ3RoID49IEVUSEVSX0FERFJf TEVOKSB7DQoJCQlhdDkxX2V0aF9zdG9wKHNjKTsNCg0KCQkJY3lnX3VpbnQ4 ICogZW5hZGRyID0gKGN5Z191aW50OCAqKSBkYXRhOw0KCQkJZGVidWcxX3By aW50ZigiQVQ5MV9FVEg6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4 XG4iLCBlbmFkZHJbMF0sIGVuYWRkclsxXSwgZW5hZGRyWzJdLA0KCQkJCQll bmFkZHJbM10sIGVuYWRkcls0XSwgZW5hZGRyWzVdKTsNCg0KCQkJYXQ5MV9z ZXRfbWFjKChhdDkxX2V0aF9wcml2X3QgKikgc2MtPmRyaXZlcl9wcml2YXRl LCBlbmFkZHIsIDEpOw0KCQkJYXQ5MV9ldGhfc3RhcnQoc2MsIGVuYWRkciwg MCk7DQoJCQlyZXR1cm4gMDsNCgkJfQ0KCQlyZXR1cm4gMTsNCgl9DQoJZGVm YXVsdDogew0KCQlkaWFnX3ByaW50ZigiJXMuJWQ6IGtleSAlbHhcbiIsIF9f RlVOQ1RJT05fXywgX19MSU5FX18sIGtleSk7DQoJCXJldHVybiAoMSk7DQoJ fQ0KCX0NCg0KfQ0KDQovLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBz ZWUgaWYgYW5vdGhlciBwYWNrZXQgY2FuIGJlIHNlbnQuDQovLyBJdCBzaG91 bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3aGljaCBjYW4gYmUg aGFuZGxlZC4NCi8vIFplcm8gc2hvdWxkIGJlIHJldHVybmVkIGlmIHRoZSBp bnRlcmZhY2UgaXMgYnVzeSBhbmQgY2FuIG5vdCBzZW5kDQovLyBhbnkgbW9y ZS4NCi8vDQovLyBXZSBhbGxvY2F0ZSBvbmUgYnVmZmVyIGRlc2NyaXB0b3Ig cGVyIHNjYXR0ZXIvZ2F0aGVyIGVudHJ5LiBXZSBhc3N1bWUgdGhhdA0KLy8g YSB0eXBpY2FsIHBhY2tldCB3aWxsIG5vdCBoYXZlIG1vcmUgdGhhbiAzIHN1 Y2ggZW50cmllcywgYW5kIHNvIHdlIHNheSB3ZQ0KLy8gY2FuIHNlbmQgYSBw YWNrZXQgd2hlbiB3ZSBoYXZlIDMgb3IgbW9yZSBidWZmZXIgZGVzY3JpcHRv cnMgZnJlZQ0KLy8NCi8vIFRPRE86IEltcGxlbWVudCB3aGF0IHRoZSBjb21t ZW50IGFjdHVhbGx5IHNheXMhDQpzdGF0aWMgaW50IGF0OTFfZXRoX2Nhbl9z ZW5kKHN0cnVjdCBldGhfZHJ2X3NjICpzYykgew0KCWludCBjYW5fc2VuZDsN CglhdDkxX2V0aF9wcml2X3QgKnByaXYgPSAoYXQ5MV9ldGhfcHJpdl90ICop IHNjLT5kcml2ZXJfcHJpdmF0ZTsNCglpZiAocHJpdi0+dHhfYnVzeSkgew0K CQljYW5fc2VuZCA9IDA7DQoJfSBlbHNlIHsNCgkJY2FuX3NlbmQgPSAxOw0K CX0NCglyZXR1cm4gKGNhbl9zZW5kKTsNCn0NCg0KLy8gVGhpcyByb3V0aW5l IGlzIGNhbGxlZCB0byBzZW5kIGRhdGEgdG8gdGhlIGhhcmR3YXJlDQpzdGF0 aWMgdm9pZCBhdDkxX2V0aF9zZW5kKHN0cnVjdCBldGhfZHJ2X3NjICpzYywg c3RydWN0IGV0aF9kcnZfc2cgKnNnX2xpc3QsIGludCBzZ19sZW4sIGludCB0 b3RhbF9sZW4sDQoJCXVuc2lnbmVkIGxvbmcga2V5KSB7DQoJYXQ5MV9ldGhf cHJpdl90ICpwcml2ID0gKGF0OTFfZXRoX3ByaXZfdCAqKSBzYy0+ZHJpdmVy X3ByaXZhdGU7DQoJaW50IGk7DQoJY3lnX3VpbnQzMiBzcjsNCg0KCXByaXYt PnR4X2J1c3kgPSB0cnVlOw0KDQoJcHJpdi0+bGFzdF90YmRfaWR4ID0gcHJp di0+Y3Vycl90YmRfaWR4Ow0KDQoJZm9yIChpID0gMDsgaSA8IHNnX2xlbjsg aSsrKSB7DQoJCXByaXYtPnRiZFtwcml2LT5jdXJyX3RiZF9pZHhdLmFkZHIg PSBzZ19saXN0W2ldLmJ1ZjsNCg0KCQlzciA9IChzZ19saXN0W2ldLmxlbiAm IEFUOTFfRU1BQ19UQkRfU1JfTEVOX01BU0spOw0KCQkvLyBTZXQgdGhlIEVu ZCBPZiBGcmFtZSBiaXQgaW4gdGhlIGxhc3QgZGVzY3JpcHRvcg0KCQlpZiAo aSA9PSAoc2dfbGVuIC0gMSkpIHsNCgkJCXNyIHw9IEFUOTFfRU1BQ19UQkRf U1JfRU9GOw0KCQl9DQoNCgkJaWYgKHByaXYtPmN1cnJfdGJkX2lkeCA8IChD WUdOVU1fREVWU19FVEhfQVJNX0FUOTFfVFhfQlVGUyAtIDEpKSB7DQoJCQlw cml2LT50YmRbcHJpdi0+Y3Vycl90YmRfaWR4XS5zciA9IHNyOw0KCQkJcHJp di0+Y3Vycl90YmRfaWR4Kys7DQoJCX0gZWxzZSB7DQoJCQlwcml2LT50YmRb cHJpdi0+Y3Vycl90YmRfaWR4XS5zciA9IChzciB8IEFUOTFfRU1BQ19UQkRf U1JfV1JBUCk7DQoJCQlwcml2LT5jdXJyX3RiZF9pZHggPSAwOw0KCQl9DQoJ fQ0KDQoJLy8gU3RvcmUgYXdheSB0aGUga2V5IGZvciB3aGVuIHRoZSB0cmFu c21pdCBoYXMgY29tcGxldGVkDQoJLy8gYW5kIHdlIG5lZWQgdG8gdGVsbCB0 aGUgc3RhY2sgd2hpY2ggdHJhbnNtaXQgaGFzIGNvbXBsZXRlZC4NCglwcml2 LT5jdXJyX3R4X2tleSA9IGtleTsNCg0KCWF0OTFfc3RhcnRfdHJhbnNtaXR0 ZXIocHJpdik7DQp9DQoNCnN0YXRpYyB2b2lkIGF0OTFfcmVzZXRfdGJkKGF0 OTFfZXRoX3ByaXZfdCAqcHJpdikgew0KCXdoaWxlIChwcml2LT5jdXJyX3Ri ZF9pZHggIT0gcHJpdi0+bGFzdF90YmRfaWR4KSB7DQoJCWlmIChwcml2LT5s YXN0X3RiZF9pZHggPT0gKENZR05VTV9ERVZTX0VUSF9BUk1fQVQ5MV9UWF9C VUZTIC0gMSkpIHsNCgkJCXByaXYtPnRiZFtwcml2LT5sYXN0X3RiZF9pZHhd LnNyID0gKEFUOTFfRU1BQ19UQkRfU1JfVVNFRCB8IEFUOTFfRU1BQ19UQkRf U1JfV1JBUCk7DQoJCQlwcml2LT5sYXN0X3RiZF9pZHggPSAwOw0KCQl9IGVs c2Ugew0KCQkJcHJpdi0+dGJkW3ByaXYtPmxhc3RfdGJkX2lkeF0uc3IgPSBB VDkxX0VNQUNfVEJEX1NSX1VTRUQ7DQoJCQlwcml2LT5sYXN0X3RiZF9pZHgr KzsNCgkJfQ0KCX0NCn0NCg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 DQoNCiNpZmRlZiBDWUdJTlRfSU9fRVRIX0lOVF9TVVBQT1JUX1JFUVVJUkVE DQpzdGF0aWMgY3lnX3VpbnQzMiBhdDkxX2V0aF9pc3IoY3lnX3ZlY3Rvcl90 IHZlY3RvciwgY3lnX2FkZHJ3b3JkX3QgZGF0YSkgew0KCXN0cnVjdCBldGhf ZHJ2X3NjICpzYyA9IChzdHJ1Y3QgZXRoX2Rydl9zYyAqKSBkYXRhOw0KCWF0 OTFfZXRoX3ByaXZfdCAqcHJpdiA9IChhdDkxX2V0aF9wcml2X3QgKikgc2Mt PmRyaXZlcl9wcml2YXRlOw0KCWN5Z191aW50MzIgcmV0Ow0KCWN5Z191aW50 MzIgaXNyOw0KDQoJLyogR2V0IHRoZSBpbnRlcnJ1cHQgc3RhdHVzICovDQoJ SEFMX1JFQURfVUlOVDMyKHByaXYtPmJhc2UrQVQ5MV9FTUFDX0lTUiwgaXNy KTsNCg0KCXJldCA9IENZR19JU1JfSEFORExFRDsNCg0KCS8vVE9ETzogV2Ug c2hvdWxkIHByb2JhYmx5IGJlIGhhbmRsaW5nIHNvbWUgb2YgdGhlIGVycm9y IGludGVycnVwdHMgYXMgd2VsbA0KCWlmIChpc3IgJiBBVDkxX0VNQUNfSVNS X1RDT00pIHsNCgkJcmV0ID0gQ1lHX0lTUl9DQUxMX0RTUjsNCgl9DQoNCglp ZiAoaXNyICYgQVQ5MV9FTUFDX0lTUl9SQ09NKSB7DQoJCXJldCA9IENZR19J U1JfQ0FMTF9EU1I7DQoJfQ0KCWN5Z19pbnRlcnJ1cHRfYWNrbm93bGVkZ2Uo dmVjdG9yKTsNCglyZXR1cm4gKHJldCk7DQp9DQojZW5kaWYNCg0KDQovKiBO ZXcgY29kZTogb2xkIHZlcmlzaW9uIGhhbmRsZXMgdGhlIDEyOCBCeXRlIGJ1 ZmZlciBjYWxjdWxhdGlvbiBub3QgcmlnaHQgYW5kIGFsc28gY2FuIGJsb2Nr IHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyAqLw0Kc3RhdGljIF9fYXR0cmli dXRlX18oKG9wdGltaXplKCJPMyIpKSkgdm9pZCBhdDkxX2V0aF9kZWxpdmVy KHN0cnVjdCBldGhfZHJ2X3NjICpzYykgew0KICBhdDkxX2V0aF9wcml2X3Qg KnByaXYgPSAoYXQ5MV9ldGhfcHJpdl90ICopIHNjLT5kcml2ZXJfcHJpdmF0 ZTsNCg0KICBjeWdfdWludDMyIHRzcjsNCiAgY3lnX3VpbnQzMiByc3I7DQoN CiAgY3lnX3VpbnQzMiBjbnQ7DQogIGN5Z191aW50MzIgaWR4Ow0KDQogIC8q IEdldCB0aGUgVHJhbnNtaXQgU3RhdHVzICovDQogIEhBTF9SRUFEX1VJTlQz Mihwcml2LT5iYXNlK0FUOTFfRU1BQ19UU1IsIHRzcik7DQogIEhBTF9XUklU RV9VSU5UMzIocHJpdi0+YmFzZStBVDkxX0VNQUNfVFNSLCB0c3IpOw0KDQog IC8qIEdldCB0aGUgUmVjZWl2ZSBTdGF0dXMgKi8NCiAgSEFMX1JFQURfVUlO VDMyKHByaXYtPmJhc2UrQVQ5MV9FTUFDX1JTUiwgcnNyKTsNCiAgSEFMX1dS SVRFX1VJTlQzMihwcml2LT5iYXNlK0FUOTFfRU1BQ19SU1IsIHJzcik7DQoN CiAgLy9UT0RPOiBUaGUgaW50ZXJydXB0cyBvdGhlciB0aGFuIFJDT01QIGFu ZCBUQ09NUCBuZWVkcyB0byBiZQ0KICAvLyAgICAgIGhhbmRsZWQgcHJvcGVy bHkgZXNwZWNpYWxseSBzdHVmZiBsaWtlIFJCTkEgd2hpY2ggY291bGQgaGF2 ZQ0KICAvLyAgICAgIHNlcmlvdXMgZWZmZWN0cyBvbiBkcml2ZXIgcGVyZm9y bWFuY2UNCg0KICAvKiBTZXJ2aWNlIHRoZSBUWCBidWZmZXJzICovDQogIGlm ICh0c3IgJiBBVDkxX0VNQUNfVFNSX0NPTCkgIC8vMQ0KICB7DQogICAgZGVi dWcxX3ByaW50ZigiQVQ5MV9FVEg6IFR4IENPTFxuIik7DQogIH0NCg0KICBp ZiAodHNyICYgQVQ5MV9FTUFDX1RTUl9STEUpICAvLzINCiAgew0KICAgIGRl YnVnMV9wcmludGYoIkFUOTFfRVRIOiBUeCBSTEVcbiIpOw0KICB9DQoNCiAg aWYgKHRzciAmIEFUOTFfRU1BQ19UU1JfQk5RKSAgLy80DQogIHsNCiAgICBk ZWJ1ZzFfcHJpbnRmKCJBVDkxX0VUSDogVHggQkVYXG4iKTsNCiAgfQ0KDQog IGlmICh0c3IgJiBBVDkxX0VNQUNfVFNSX1VORCkgIC8vNg0KICB7DQogICAg ZGVidWcxX3ByaW50ZigiQVQ5MV9FVEg6IFR4IFVORFxuIik7DQogIH0NCg0K ICAvKiBDaGVjayB0aGF0IHRoZSBsYXN0IHRyYW5zbWlzc2lvbiBpcyBjb21w bGV0ZWQgKi8NCiAgaWYgKHRzciAmIEFUOTFfRU1BQ19UU1JfQ09NUCkgLy81 DQogIHsNCiAgICBhdDkxX3Jlc2V0X3RiZChwcml2KTsNCiAgICBfZXRoX2Ry dl90eF9kb25lKHNjLCBwcml2LT5jdXJyX3R4X2tleSwgMCk7DQogICAgcHJp di0+dHhfYnVzeSA9IGZhbHNlOw0KICB9DQoNCiAgaWYgKHJzciAmIEFUOTFf RU1BQ19SU1JfT1ZSKSB7DQogICAgZGVidWcxX3ByaW50ZigiQVQ5MV9FVEg6 IFJ4IE9WUlxuIik7DQogIH0NCiAgaWYgKHJzciAmIEFUOTFfRU1BQ19SU1Jf Qk5BKSB7DQogICAgZGVidWcxX3ByaW50ZigiQVQ5MV9FVEg6IFJ4IEJOQVxu Iik7DQogIH0NCg0KICAvKiBTZXJ2aWNlIHRoZSBSWCBidWZmZXJzIHdoZW4g d2UgZ2V0IHNvbWV0aGluZyAqLw0KICBpZiAocnNyICYgQVQ5MV9FTUFDX1JT Ul9SRUMpIHsNCg0KI2RlZmluZSBOT1RfREVGSU5FRCAtMQ0KDQogICAgY3ln X2ludDMyIGJlZ3BhY2sgPSBOT1RfREVGSU5FRDsNCiAgICBjeWdfaW50MzIg aSA9IDA7DQoNCiAgICBpZHggPSBwcml2LT5jdXJyX3JiZF9pZHg7DQogICAg Y250ID0gMDsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCBDWUdOVU1fREVWU19F VEhfQVJNX0FUOTFfUlhfQlVGUzsgaSsrKSB7DQoNCiAgICAgIGlmIChwcml2 LT5yYmRbaWR4XS5hZGRyICYgQVQ5MV9FTUFDX1JCRF9BRERSX09XTkVSX1NX KXsNCg0KICAgICAgICBpZiAocHJpdi0+cmJkW2lkeF0uc3IgJiBBVDkxX0VN QUNfUkJEX1NSX1NPRil7DQogICAgICAgICAgYmVncGFjayA9IGlkeDsNCiAg ICAgICAgfQ0KICAgICAgICBpZiAoYmVncGFjayAhPSBOT1RfREVGSU5FRCl7 DQogICAgICAgICAgaWYgKHByaXYtPnJiZFtpZHhdLnNyICYgQVQ5MV9FTUFD X1JCRF9TUl9MRU5fTUFTSykgew0KICAgICAgICAgICAgY250ICs9IChwcml2 LT5yYmRbaWR4XS5zciAmIEFUOTFfRU1BQ19SQkRfU1JfTEVOX01BU0spOw0K ICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBjbnQgKz0gQVQ5MV9F TUFDX1JYX0JVRkZfU0laRTsNCiAgICAgICAgICB9DQogICAgICAgIH0gZWxz ZSB7DQogICAgICAgICAgcHJpdi0+cmJkW2lkeF0uYWRkciAmPSB+KEFUOTFf RU1BQ19SQkRfQUREUl9PV05FUl9TVyk7DQogICAgICAgIH0NCiAgICAgICAg aWYgKHByaXYtPnJiZFtpZHhdLnNyICYgQVQ5MV9FTUFDX1JCRF9TUl9FT0Yp ew0KICAgICAgICAgIGlmIChiZWdwYWNrID09IE5PVF9ERUZJTkVEKXsNCiAg ICAgICAgICAgIGNudCA9IDA7DQogICAgICAgICAgICBwcml2LT5yYmRbaWR4 XS5hZGRyICY9IH4oQVQ5MV9FTUFDX1JCRF9BRERSX09XTkVSX1NXKTsNCiAg ICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcHJpdi0+Y3Vycl9yYmRf aWR4ID0gYmVncGFjazsNCiAgICAgICAgICAgIF9ldGhfZHJ2X3JlY3Yoc2Ms IGNudCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGVsc2Ug ew0KICAgICAgICBpZiAoYmVncGFjayAhPSBOT1RfREVGSU5FRCl7DQogICAg ICAgICAgd2hpbGUgKGJlZ3BhY2sgIT0gaWR4KXsNCiAgICAgICAgICAgIHBy aXYtPnJiZFtiZWdwYWNrXS5hZGRyICY9IH4oQVQ5MV9FTUFDX1JCRF9BRERS X09XTkVSX1NXKTsNCiAgICAgICAgICAgIGJlZ3BhY2srKzsNCiAgICAgICAg ICAgIGlmIChiZWdwYWNrID4gQ1lHTlVNX0RFVlNfRVRIX0FSTV9BVDkxX1JY X0JVRlMtMSkgew0KICAgICAgICAgICAgICBiZWdwYWNrID0gMDsNCiAgICAg ICAgICAgIH0NCiAgICAgICAgICB9DQoNCiAgICAgICAgICBiZWdwYWNrID0g Tk9UX0RFRklORUQ7DQogICAgICAgICAgY250ID0gMDsNCiAgICAgICAgfQ0K ICAgICAgfQ0KICAgICAgaWR4Kys7DQogICAgICBpZiAoaWR4ID4gQ1lHTlVN X0RFVlNfRVRIX0FSTV9BVDkxX1JYX0JVRlMtMSkgew0KICAgICAgICBpZHgg PSAwOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQp9DQoNCnN0YXRpYyBfX2F0 dHJpYnV0ZV9fKChvcHRpbWl6ZSgiTzMiKSkpIHZvaWQgYXQ5MV9ldGhfcmVj dihzdHJ1Y3QgZXRoX2Rydl9zYyAqc2MsIHN0cnVjdCBldGhfZHJ2X3NnICpz Z19saXN0LCBpbnQgc2dfbGVuKSB7DQoNCglhdDkxX2V0aF9wcml2X3QgKnBy aXYgPSAoYXQ5MV9ldGhfcHJpdl90ICopIHNjLT5kcml2ZXJfcHJpdmF0ZTsN CglpbnQgaTsNCgljeWdfdWludDMyIGJ5dGVzX2luX2J1ZmZlciA9IDA7DQoJ Y3lnX3VpbnQzMiBieXRlc19pbl9saXN0ID0gMDsNCgljeWdfdWludDMyIGJ5 dGVzX25lZWRlZF9saXN0ID0gMDsNCgljeWdfdWludDMyIGJ1ZmZlcl9wb3Mg PSAwOw0KCWN5Z191aW50OCAqIHNnX2J1ZjsNCgljeWdfdWludDMyIHRvdGFs X2J5dGVzID0gMDsNCg0KCWZvciAoaSA9IDA7IGkgPCBzZ19sZW47IGkrKykg ew0KCQl3aGlsZSAoYnl0ZXNfaW5fbGlzdCA8IHNnX2xpc3RbaV0ubGVuKSB7 DQoJCQlieXRlc19uZWVkZWRfbGlzdCA9IHNnX2xpc3RbaV0ubGVuIC0gYnl0 ZXNfaW5fbGlzdDsNCg0KCQkJaWYgKHByaXYtPnJiZFtwcml2LT5jdXJyX3Ji ZF9pZHhdLnNyICYgQVQ5MV9FTUFDX1JCRF9TUl9MRU5fTUFTSykgew0KCQkJ CWJ5dGVzX2luX2J1ZmZlciA9ICgocHJpdi0+cmJkW3ByaXYtPmN1cnJfcmJk X2lkeF0uc3IgJiBBVDkxX0VNQUNfUkJEX1NSX0xFTl9NQVNLKSAtIHRvdGFs X2J5dGVzKQ0KCQkJCQkJLSBidWZmZXJfcG9zOw0KCQkJfSBlbHNlIHsNCgkJ CQlieXRlc19pbl9idWZmZXIgPSBBVDkxX0VNQUNfUlhfQlVGRl9TSVpFIC0g YnVmZmVyX3BvczsNCgkJCX0NCg0KCQkJc2dfYnVmID0gKGN5Z191aW50OCAq KSAoc2dfbGlzdFtpXS5idWYpOw0KDQoJCQlpZiAoYnl0ZXNfbmVlZGVkX2xp c3QgPCBieXRlc19pbl9idWZmZXIpIHsNCgkJCQlpZiAoc2dfYnVmICE9IE5V TEwpDQoJCQkJCW1lbWNweSgmc2dfYnVmW2J5dGVzX2luX2xpc3RdLCAmcHJp di0+cmJbcHJpdi0+Y3Vycl9yYmRfaWR4XS5yYltidWZmZXJfcG9zXSwNCgkJ CQkJCQlieXRlc19uZWVkZWRfbGlzdCk7DQoJCQkJYnl0ZXNfaW5fbGlzdCAr PSBieXRlc19uZWVkZWRfbGlzdDsNCgkJCQlidWZmZXJfcG9zICs9IGJ5dGVz X25lZWRlZF9saXN0Ow0KCQkJCXRvdGFsX2J5dGVzICs9IGJ5dGVzX25lZWRl ZF9saXN0Ow0KCQkJfSBlbHNlIHsNCgkJCQlpZiAoc2dfYnVmICE9IE5VTEwp DQoJCQkJCW1lbWNweSgmc2dfYnVmW2J5dGVzX2luX2xpc3RdLCAmcHJpdi0+ cmJbcHJpdi0+Y3Vycl9yYmRfaWR4XS5yYltidWZmZXJfcG9zXSwNCgkJCQkJ CQlieXRlc19pbl9idWZmZXIpOw0KCQkJCWJ5dGVzX2luX2xpc3QgKz0gYnl0 ZXNfaW5fYnVmZmVyOw0KCQkJCXRvdGFsX2J5dGVzICs9IGJ5dGVzX2luX2J1 ZmZlcjsNCg0KCQkJCS8qIFN0ZXAgb3VyIGJ1ZmZlciBvbiBvbmUgKi8NCgkJ CQlwcml2LT5yYmRbcHJpdi0+Y3Vycl9yYmRfaWR4XS5hZGRyICY9IH4oQVQ5 MV9FTUFDX1JCRF9BRERSX09XTkVSX1NXKTsNCgkJCQlwcml2LT5jdXJyX3Ji ZF9pZHgrKzsNCgkJCQlpZiAocHJpdi0+Y3Vycl9yYmRfaWR4ID4gQ1lHTlVN X0RFVlNfRVRIX0FSTV9BVDkxX1JYX0JVRlMtMSkgew0KCQkJCQlwcml2LT5j dXJyX3JiZF9pZHggPSAwOw0KCQkJCX0NCgkJCQlidWZmZXJfcG9zID0gMDsN CgkJCX0NCgkJfQ0KCX0NCn0NCg0KDQoNCi8vIHJvdXRpbmUgY2FsbGVkIHRv IGhhbmRsZSBldGhlcm5ldCBjb250cm9sbGVyIGluIHBvbGxlZCBtb2RlDQpz dGF0aWMgdm9pZCBhdDkxX2V0aF9wb2xsKHN0cnVjdCBldGhfZHJ2X3NjICpz Yykgew0KCS8qIFNlcnZpY2UgdGhlIGJ1ZmZlcnMgKi8NCglhdDkxX2V0aF9k ZWxpdmVyKHNjKTsNCn0NCg0Kc3RhdGljIGludCBhdDkxX2V0aF9pbnRfdmVj dG9yKHN0cnVjdCBldGhfZHJ2X3NjICpzYykgew0KCXJldHVybiAoQ1lHTlVN X0hBTF9JTlRFUlJVUFRfRU1BQyk7DQp9DQoNCmF0OTFfZXRoX3ByaXZfdCBh dDkxX3ByaXZfZGF0YSA9DQoJCXsgLmludHJfdmVjdG9yID0gQ1lHTlVNX0hB TF9JTlRFUlJVUFRfRU1BQywgLmJhc2UgPSBBVDkxX0VNQUMsIC5waHkgPSAm YXQ5MV9waHkgfTsNCg0KRVRIX0RSVl9TQyhhdDkxX3NjLA0KCQkmYXQ5MV9w cml2X2RhdGEsICAgICAgIC8vIERyaXZlciBzcGVjaWZpYyBkYXRhDQoJCSJl dGgwIiwvLyBOYW1lIGZvciB0aGlzIGludGVyZmFjZQ0KCQlhdDkxX2V0aF9z dGFydCwgYXQ5MV9ldGhfc3RvcCwgYXQ5MV9ldGhfY29udHJvbCwgYXQ5MV9l dGhfY2FuX3NlbmQsIGF0OTFfZXRoX3NlbmQsIGF0OTFfZXRoX3JlY3YsDQoJ CWF0OTFfZXRoX2RlbGl2ZXIsIGF0OTFfZXRoX3BvbGwsIGF0OTFfZXRoX2lu dF92ZWN0b3IpOw0KDQpORVRERVZUQUJfRU5UUlkoYXQ5MV9uZXRkZXYsICJh dDkxIiwgYXQ5MV9ldGhfaW5pdCwgJmF0OTFfc2MpOw0KDQovLyBFT0YgaWZf YXQ5MS5jDQo= --_003_5578298D4090509televiccom_ Content-Type: text/plain; charset=us-ascii Content-length: 148 -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss --_003_5578298D4090509televiccom_--