Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1r6fSS-001vLE-Dl for pgsql-hackers@arkaria.postgresql.org; Fri, 24 Nov 2023 23:19:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1r6fSQ-00GFw9-Vx for pgsql-hackers@arkaria.postgresql.org; Fri, 24 Nov 2023 23:19:34 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1r6fSQ-00GFw1-5e for pgsql-hackers@lists.postgresql.org; Fri, 24 Nov 2023 23:19:34 +0000 Received: from meesny.iki.fi ([2001:67c:2b0:1c1::201]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1r6fSJ-007D21-N3 for pgsql-hackers@postgresql.org; Fri, 24 Nov 2023 23:19:32 +0000 Received: from [192.168.1.115] (dsl-hkibng22-54f8db-125.dhcp.inet.fi [84.248.219.125]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by meesny.iki.fi (Postfix) with ESMTPSA id 4ScWCC1xC5zyWw; Sat, 25 Nov 2023 01:19:16 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1700867960; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=Q76YtlKijYs87epXlXsAUU7Ake6mKs67OTLa9b+BssA=; b=hT49WXhXke4jOQJkkvVnGBrCiad57ijbUhKtEIEbp0R9egdxijzGkMnzOJleC7KT6/Hxdo K7w1mYB9I7iRIGiWN+c8pObToEq7rgbCQfKMef/dGt8ENSyxIro+1Sb4O6RnPgXRDCm6ej yqKWj8+SaUDSdqtlrSgHYKMOT0OHdoc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1700867960; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=Q76YtlKijYs87epXlXsAUU7Ake6mKs67OTLa9b+BssA=; b=rVXNto/QCUC3KxmAo2wvK1A9WW50D3NHJjtfvHff+uOwgbLbitg4JYKL0ig26cMc6dveku AfGF+BN3Yp2DHBjFiS81hCUBtpve33Zgr9XVM/RGFcUuu/9au9lC5ESz9SMoN4WsydUgXi Okm05N/rx1o+X2Ej4LfMKuWv8M+bPkk= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi ARC-Seal: i=1; s=meesny; d=iki.fi; t=1700867960; a=rsa-sha256; cv=none; b=FpOPfyNizqu7skzjRsg7Z/S95kSBc78KaLt9nlLoJelTGRMZDqOBaAj6iklvKrznGhxFgU /4l1CKRCygBEffpQ876u+YdvrCGDdP5iaiJAEGFBsBILqXV5z8q4DxCLHSh9Hggx6oaL1D YauSGUm6/DYpzxs678Oe4T1U9WgWuiY= Content-Type: multipart/mixed; boundary="------------DvqAffjbOhl3jxnP12IOUw9l" Message-ID: <93e91b02-e07f-4205-8de6-3942b91760cb@iki.fi> Date: Sat, 25 Nov 2023 01:19:16 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Relation bulk write facility Content-Language: en-US To: Andres Freund Cc: pgsql-hackers References: <30e8f366-58b3-b239-c521-422122dd5150@iki.fi> <20231119000416.fuyrbo6av7dytmf6@awork3.anarazel.de> From: Heikki Linnakangas In-Reply-To: <20231119000416.fuyrbo6av7dytmf6@awork3.anarazel.de> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------DvqAffjbOhl3jxnP12IOUw9l Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 19/11/2023 02:04, Andres Freund wrote: > On 2023-11-17 11:37:21 +0100, Heikki Linnakangas wrote: >> The new facility makes it easier to optimize bulk loading, as the >> logic for buffering, WAL-logging, and syncing the relation only needs >> to be implemented once. It's also less error-prone: We have had a >> number of bugs in how a relation is fsync'd - or not - at the end of a >> bulk loading operation. By centralizing that logic to one place, we >> only need to write it correctly once. > > One thing I'd like to use the centralized handling for is to track such > writes in pg_stat_io. I don't mean as part of the initial patch, just that > that's another reason I like the facility. Oh I didn't realize they're not counted at the moment. >> + bulkw = bulkw_start_smgr(dst, forkNum, use_wal); >> + >> nblocks = smgrnblocks(src, forkNum); >> >> for (blkno = 0; blkno < nblocks; blkno++) >> { >> + Page page; >> + >> /* If we got a cancel signal during the copy of the data, quit */ >> CHECK_FOR_INTERRUPTS(); >> >> - smgrread(src, forkNum, blkno, buf.data); >> + page = bulkw_alloc_buf(bulkw); >> + smgrread(src, forkNum, blkno, page); >> >> if (!PageIsVerifiedExtended(page, blkno, >> PIV_LOG_WARNING | PIV_REPORT_STAT)) >> @@ -511,30 +514,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst, >> * page this is, so we have to log the full page including any unused >> * space. >> */ >> - if (use_wal) >> - log_newpage(&dst->smgr_rlocator.locator, forkNum, blkno, page, false); >> - >> - PageSetChecksumInplace(page, blkno); >> - >> - /* >> - * Now write the page. We say skipFsync = true because there's no >> - * need for smgr to schedule an fsync for this write; we'll do it >> - * ourselves below. >> - */ >> - smgrextend(dst, forkNum, blkno, buf.data, true); >> + bulkw_write(bulkw, blkno, page, false); > > I wonder if bulkw_alloc_buf() is a good name - if you naively read this > change, it looks like it'll just leak memory. It also might be taken to be > valid until freed, which I don't think is the case? Yeah, I'm not very happy with this interface. The model is that you get a buffer to write to by calling bulkw_alloc_buf(). Later, you hand it over to bulkw_write(), which takes ownership of it and frees it later. There is no other function to free it, although currently the buffer is just palloc'd so you could call pfree on it. However, I'd like to not expose that detail to the callers. I'm imagining that in the future we might optimize further, by having a larger e.g. 1 MB buffer, and carve the 8kB blocks from that. Then opportunistically, if you fill the buffers sequentially, bulk_write.c could do one smgrextend() to write the whole 1 MB chunk. I renamed it to bulkw_get_buf() now, and made it return a new BulkWriteBuffer typedef instead of a plain Page. The point of the new typedef is to distinguish a buffer returned by bulkw_get_buf() from a Page or char[BLCKSZ] that you might palloc on your own. That indeed revealed some latent bugs in gistbuild.c where I had mixed up buffers returned by bulkw_alloc_buf() and palloc'd buffers. (The previous version of this patch called a different struct BulkWriteBuffer, but I renamed that to PendingWrite; see below. Don't be confused!) I think this helps a little, but I'm still not very happy with it. I'll give it some more thought after sleeping over it, but in the meanwhile, I'm all ears for suggestions. >> +/*------------------------------------------------------------------------- >> + * >> + * bulk_write.c >> + * Efficiently and reliably populate a new relation >> + * >> + * The assumption is that no other backends access the relation while we are >> + * loading it, so we can take some shortcuts. Alternatively, you can use the >> + * buffer manager as usual, if performance is not critical, but you must not >> + * mix operations through the buffer manager and the bulk loading interface at >> + * the same time. > > From "Alternatively" onward this is is somewhat confusing. Rewrote that to just "Do not mix operations through the regular buffer manager and the bulk loading interface!" >> + * One tricky point is that because we bypass the buffer manager, we need to >> + * register the relation for fsyncing at the next checkpoint ourselves, and >> + * make sure that the relation is correctly fsync by us or the checkpointer >> + * even if a checkpoint happens concurrently. > > "fsync'ed" or such? Otherwise this reads awkwardly for me. Yep, fixed. >> +typedef struct BulkWriteBuffer >> +{ >> + Page page; >> + BlockNumber blkno; >> + bool page_std; >> + int16 order; >> +} BulkWriteBuffer; >> + > > The name makes it sound like this struct itself contains a buffer - but it's > just pointing to one. *BufferRef or such maybe? > > I was wondering how you dealt with the alignment of buffers given the struct > definition, which is what lead me to look at this... I renamed this to PendingWrite, and the field that holds these "pending_writes". Think of it as a queue of writes that haven't been performed yet. >> +/* >> + * Bulk writer state for one relation fork. >> + */ >> +typedef struct BulkWriteState >> +{ >> + /* Information about the target relation we're writing */ >> + SMgrRelation smgr; > > Isn't there a danger of this becoming a dangling pointer? At least until > https://postgr.es/m/CA%2BhUKGJ8NTvqLHz6dqbQnt2c8XCki4r2QvXjBQcXpVwxTY_pvA%40mail.gmail.com > is merged? Good point. I just added a FIXME comment to remind about that, hoping that that patch gets merged soon. If not, I'll come up with a different fix. >> + ForkNumber forknum; >> + bool use_wal; >> + >> + /* We keep several pages buffered, and WAL-log them in batches */ >> + int nbuffered; >> + BulkWriteBuffer buffers[MAX_BUFFERED_PAGES]; >> + >> + /* Current size of the relation */ >> + BlockNumber pages_written; >> + >> + /* The RedoRecPtr at the time that the bulk operation started */ >> + XLogRecPtr start_RedoRecPtr; >> + >> + Page zeropage; /* workspace for filling zeroes */ > > We really should just have one such page in shared memory somewhere... For WAL > writes as well. > > But until then - why do you allocate the page? Seems like we could just use a > static global variable? I made it a static global variable for now. (The palloc way was copied over from nbtsort.c) >> +/* >> + * Write all buffered pages to disk. >> + */ >> +static void >> +bulkw_flush(BulkWriteState *bulkw) >> +{ >> + int nbuffered = bulkw->nbuffered; >> + BulkWriteBuffer *buffers = bulkw->buffers; >> + >> + if (nbuffered == 0) >> + return; >> + >> + if (nbuffered > 1) >> + { >> + int o; >> + >> + qsort(buffers, nbuffered, sizeof(BulkWriteBuffer), buffer_cmp); >> + >> + /* >> + * Eliminate duplicates, keeping the last write of each block. >> + * (buffer_cmp uses 'order' as the last sort key) >> + */ > > Huh - which use cases would actually cause duplicate writes? Hmm, nothing anymore I guess. Many AMs used to write zero pages as a placeholder and come back to fill them in later, but now that bulk_write.c handles that, Removed that, and replaced it with with an assertion in buffer_cmp() that there are no duplicates. -- Heikki Linnakangas Neon (https://neon.tech) --------------DvqAffjbOhl3jxnP12IOUw9l Content-Type: text/x-patch; charset=UTF-8; name="v3-0001-Introduce-a-new-bulk-loading-facility.patch" Content-Disposition: attachment; filename="v3-0001-Introduce-a-new-bulk-loading-facility.patch" Content-Transfer-Encoding: base64 RnJvbSA1MGIxOWRhMWE2ZDRjOTYwODRmYzgzODhlNjRjMWM2NDZlOWI1Mzc4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IFR1ZSwgMTkgU2VwIDIwMjMgMTg6MDk6MzQgKzAzMDAK U3ViamVjdDogW1BBVENIIHYzIDEvMV0gSW50cm9kdWNlIGEgbmV3IGJ1bGsgbG9hZGluZyBm YWNpbGl0eS4KClRoZSBuZXcgZmFjaWxpdHkgbWFrZXMgaXQgZWFzaWVyIHRvIG9wdGltaXpl IGJ1bGsgbG9hZGluZywgYXMgdGhlCmxvZ2ljIGZvciBidWZmZXJpbmcsIFdBTC1sb2dnaW5n LCBhbmQgc3luY2luZyB0aGUgcmVsYXRpb24gb25seSBuZWVkcwp0byBiZSBpbXBsZW1lbnRl ZCBvbmNlLiBJdCdzIGFsc28gbGVzcyBlcnJvci1wcm9uZTogV2UgaGF2ZSBoYWQgYQpudW1i ZXIgb2YgYnVncyBpbiBob3cgYSByZWxhdGlvbiBpcyBmc3luYydkIC0gb3Igbm90IC0gYXQg dGhlIGVuZCBvZiBhCmJ1bGsgbG9hZGluZyBvcGVyYXRpb24uIEJ5IGNlbnRyYWxpemluZyB0 aGF0IGxvZ2ljIHRvIG9uZSBwbGFjZSwgd2UKb25seSBuZWVkIHRvIHdyaXRlIGl0IGNvcnJl Y3RseSBvbmNlLgoKVGhlIG5ldyBmYWNpbGl0eSBpcyBmYXN0ZXIgZm9yIHNtYWxsIHJlbGF0 aW9uczogSW5zdGVhZCBvZiBvZiBjYWxsaW5nCnNtZ3JpbW1lZHN5bmMoKSwgd2UgcmVnaXN0 ZXIgdGhlIGZzeW5jIHRvIGhhcHBlbiBhdCBuZXh0IGNoZWNrcG9pbnQsCndoaWNoIGF2b2lk cyB0aGUgZnN5bmMgbGF0ZW5jeS4gVGhhdCBjYW4gbWFrZSBhIGJpZyBkaWZmZXJlbmNlIGlm IHlvdQphcmUgZS5nLiByZXN0b3JpbmcgYSBzY2hlbWEtb25seSBkdW1wIHdpdGggbG90cyBv ZiByZWxhdGlvbnMuCgpJdCBpcyBhbHNvIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IHdpdGgg bGFyZ2UgcmVsYXRpb25zLCBhcyB0aGUgV0FMCmxvZ2dpbmcgaXMgcGVyZm9ybWVkIG11bHRp cGxlIHBhZ2VzIGF0IGEgdGltZS4gVGhhdCBhdm9pZHMgc29tZSBXQUwKaGVhZGVyIG92ZXJo ZWFkLiBUaGUgc29ydGVkIEdpU1QgaW5kZXggYnVpbGQgZGlkIHRoYXQgYWxyZWFkeSwgdGhp cwptb3ZlcyB0aGUgYnVmZmVyaW5nIHRvIHRoZSBuZXcgZmFjaWxpdHkuCgpUaGUgY2hhbmdl cyB0byBwYWdlaW5zcGVjdCBHaVNUIHRlc3QgbmVlZHMgYW4gZXhwbGFuYXRpb246IEJlZm9y ZSB0aGlzCnBhdGNoLCB0aGUgc29ydGVkIEdpU1QgaW5kZXggYnVpbGQgc2V0IHRoZSBMU04g b24gZXZlcnkgcGFnZSB0byB0aGUKc3BlY2lhbCBHaXN0QnVpbGRMU04gdmFsdWUsIG5vdCB0 aGUgTFNOIG9mIHRoZSBXQUwgcmVjb3JkLCBldmVuIHRob3VnaAp0aGV5IHdlcmUgV0FMLWxv Z2dlZC4gVGhlcmUgd2FzIG5vIHBhcnRpY3VsYXIgbmVlZCBmb3IgaXQsIGl0IGp1c3QKaGFw cGVuZWQgbmF0dXJhbGx5IHdoZW4gd2Ugd3JvdGUgb3V0IHRoZSBwYWdlcyBiZWZvcmUgV0FM LWxvZ2dpbmcKdGhlbS4gTm93IHdlIFdBTC1sb2cgdGhlIHBhZ2VzIGZpcnN0LCBsaWtlIGlu IEItdHJlZSBidWlsZCwgc28gdGhlCnBhZ2VzIGFyZSBzdGFtcGVkIHdpdGggdGhlIHJlY29y ZCdzIHJlYWwgTFNOLiBXaGVuIHRoZSBidWlsZCBpcyBub3QKV0FMLWxvZ2dlZCwgd2Ugc3Rp bGwgdXNlIEdpc3RCdWlsZExTTi4gVG8gbWFrZSB0aGUgdGVzdCBvdXRwdXQKcHJlZGljdGFi bGUsIHVzZSBhbiB1bmxvZ2dlZCBpbmRleC4KClJldmlld2VkLWJ5OiBBbmRyZXMgRnJldW5k CkRpc2N1c3Npb246IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL21lc3NhZ2UtaWQvMzBl OGYzNjYtNThiMy1iMjM5LWM1MjEtNDIyMTIyZGQ1MTUwJTQwaWtpLmZpCi0tLQogY29udHJp Yi9wYWdlaW5zcGVjdC9leHBlY3RlZC9naXN0Lm91dCB8ICAxNCArLQogY29udHJpYi9wYWdl aW5zcGVjdC9zcWwvZ2lzdC5zcWwgICAgICB8ICAxNiArLQogc3JjL2JhY2tlbmQvYWNjZXNz L2dpc3QvZ2lzdGJ1aWxkLmMgICB8IDEyMiArKystLS0tLS0tLQogc3JjL2JhY2tlbmQvYWNj ZXNzL2hlYXAvcmV3cml0ZWhlYXAuYyB8ICA3NSArKy0tLS0tCiBzcmMvYmFja2VuZC9hY2Nl c3MvbmJ0cmVlL25idHJlZS5jICAgIHwgIDMzICstLQogc3JjL2JhY2tlbmQvYWNjZXNzL25i dHJlZS9uYnRzb3J0LmMgICB8IDEzNCArKysrLS0tLS0tLS0KIHNyYy9iYWNrZW5kL2FjY2Vz cy9zcGdpc3Qvc3BnaW5zZXJ0LmMgfCAgNDkgKystLS0KIHNyYy9iYWNrZW5kL2NhdGFsb2cv c3RvcmFnZS5jICAgICAgICAgfCAgNDYgKystLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdy L01ha2VmaWxlICAgICB8ICAgMSArCiBzcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3IvYnVsa193 cml0ZS5jIHwgMzAxICsrKysrKysrKysrKysrKysrKysrKysrKysrCiBzcmMvYmFja2VuZC9z dG9yYWdlL3NtZ3IvbWQuYyAgICAgICAgIHwgIDQzICsrKysKIHNyYy9iYWNrZW5kL3N0b3Jh Z2Uvc21nci9tZXNvbi5idWlsZCAgfCAgIDEgKwogc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdy L3NtZ3IuYyAgICAgICB8ICAzMSArKysKIHNyYy9pbmNsdWRlL3N0b3JhZ2UvYnVsa193cml0 ZS5oICAgICAgfCAgMzggKysrKwogc3JjL2luY2x1ZGUvc3RvcmFnZS9tZC5oICAgICAgICAg ICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS9zdG9yYWdlL3NtZ3IuaCAgICAgICAgICAgIHwg ICAxICsKIHNyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICAgICAgfCAgIDMgKwog MTcgZmlsZXMgY2hhbmdlZCwgNTU2IGluc2VydGlvbnMoKyksIDM1MyBkZWxldGlvbnMoLSkK IGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3IvYnVsa193cml0 ZS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2luY2x1ZGUvc3RvcmFnZS9idWxrX3dyaXRl LmgKCmRpZmYgLS1naXQgYS9jb250cmliL3BhZ2VpbnNwZWN0L2V4cGVjdGVkL2dpc3Qub3V0 IGIvY29udHJpYi9wYWdlaW5zcGVjdC9leHBlY3RlZC9naXN0Lm91dAppbmRleCBkMWFkYmFi OGFlMi4uMmIxZDU0YTYyNzkgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGFnZWluc3BlY3QvZXhw ZWN0ZWQvZ2lzdC5vdXQKKysrIGIvY29udHJpYi9wYWdlaW5zcGVjdC9leHBlY3RlZC9naXN0 Lm91dApAQCAtMSwxMyArMSw2IEBACi0tLSBUaGUgZ2lzdF9wYWdlX29wYXF1ZV9pbmZvKCkg ZnVuY3Rpb24gcHJpbnRzIHRoZSBwYWdlJ3MgTFNOLiBOb3JtYWxseSwKLS0tIHRoYXQncyBj b25zdGFudCAxIChHaXN0QnVpbGRMU04pIG9uIGV2ZXJ5IHBhZ2Ugb2YgYSBmcmVzaGx5IGJ1 aWx0IEdpU1QKLS0tIGluZGV4LiBCdXQgd2l0aCB3YWxfbGV2ZWw9bWluaW1hbCwgdGhlIHdo b2xlIHJlbGF0aW9uIGlzIGR1bXBlZCB0byBXQUwgYXQKLS0tIHRoZSBlbmQgb2YgdGhlIHRy YW5zYWN0aW9uIGlmIGl0J3Mgc21hbGxlciB0aGFuIHdhbF9za2lwX3RocmVzaG9sZCwgd2hp Y2gKLS0tIHVwZGF0ZXMgdGhlIExTTnMuIFdyYXAgdGhlIHRlc3RzIG9uIGdpc3RfcGFnZV9v cGFxdWVfaW5mbygpIGluIHRoZQotLS0gc2FtZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBDUkVB VEUgSU5ERVggc28gdGhhdCB3ZSBzZWUgdGhlIExTTnMgYmVmb3JlCi0tLSB0aGV5IGFyZSBw b3NzaWJseSBvdmVyd3JpdHRlbiBhdCBlbmQgb2YgdHJhbnNhY3Rpb24uCi1CRUdJTjsKLS0t IENyZWF0ZSBhIHRlc3QgdGFibGUgYW5kIEdpU1QgaW5kZXguCi1DUkVBVEUgVEFCTEUgdGVz dF9naXN0IEFTIFNFTEVDVCBwb2ludChpLGkpIHAsIGk6OnRleHQgdCBGUk9NCistLSBUaGUg Z2lzdF9wYWdlX29wYXF1ZV9pbmZvKCkgZnVuY3Rpb24gcHJpbnRzIHRoZSBwYWdlJ3MgTFNO LgorLS0gVXNlIGFuIHVubG9nZ2VkIGluZGV4LCBzbyB0aGF0IHRoZSBMU04gaXMgcHJlZGlj dGFibGUuCitDUkVBVEUgVU5MT0dHRUQgVEFCTEUgdGVzdF9naXN0IEFTIFNFTEVDVCBwb2lu dChpLGkpIHAsIGk6OnRleHQgdCBGUk9NCiAgICAgZ2VuZXJhdGVfc2VyaWVzKDEsMTAwMCkg aTsKIENSRUFURSBJTkRFWCB0ZXN0X2dpc3RfaWR4IE9OIHRlc3RfZ2lzdCBVU0lORyBnaXN0 IChwKTsKIC0tIFBhZ2UgMCBpcyB0aGUgcm9vdCwgdGhlIHJlc3QgYXJlIGxlYWYgcGFnZXMK QEAgLTI5LDcgKzIyLDYgQEAgU0VMRUNUICogRlJPTSBnaXN0X3BhZ2Vfb3BhcXVlX2luZm8o Z2V0X3Jhd19wYWdlKCd0ZXN0X2dpc3RfaWR4JywgMikpOwogIDAvMSB8IDAvMCB8ICAgICAg ICAgMSB8IHtsZWFmfQogKDEgcm93KQogCi1DT01NSVQ7CiBTRUxFQ1QgKiBGUk9NIGdpc3Rf cGFnZV9pdGVtcyhnZXRfcmF3X3BhZ2UoJ3Rlc3RfZ2lzdF9pZHgnLCAwKSwgJ3Rlc3RfZ2lz dF9pZHgnKTsKICBpdGVtb2Zmc2V0IHwgICBjdGlkICAgIHwgaXRlbWxlbiB8IGRlYWQgfCAg ICAgICAgICAgICBrZXlzICAgICAgICAgICAgICAKIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LSstLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlm ZiAtLWdpdCBhL2NvbnRyaWIvcGFnZWluc3BlY3Qvc3FsL2dpc3Quc3FsIGIvY29udHJpYi9w YWdlaW5zcGVjdC9zcWwvZ2lzdC5zcWwKaW5kZXggZDI2MzU0MmJhMTUuLjg1YmM0NGI4MDAw IDEwMDY0NAotLS0gYS9jb250cmliL3BhZ2VpbnNwZWN0L3NxbC9naXN0LnNxbAorKysgYi9j b250cmliL3BhZ2VpbnNwZWN0L3NxbC9naXN0LnNxbApAQCAtMSwxNCArMSw2IEBACi0tLSBU aGUgZ2lzdF9wYWdlX29wYXF1ZV9pbmZvKCkgZnVuY3Rpb24gcHJpbnRzIHRoZSBwYWdlJ3Mg TFNOLiBOb3JtYWxseSwKLS0tIHRoYXQncyBjb25zdGFudCAxIChHaXN0QnVpbGRMU04pIG9u IGV2ZXJ5IHBhZ2Ugb2YgYSBmcmVzaGx5IGJ1aWx0IEdpU1QKLS0tIGluZGV4LiBCdXQgd2l0 aCB3YWxfbGV2ZWw9bWluaW1hbCwgdGhlIHdob2xlIHJlbGF0aW9uIGlzIGR1bXBlZCB0byBX QUwgYXQKLS0tIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uIGlmIGl0J3Mgc21hbGxlciB0 aGFuIHdhbF9za2lwX3RocmVzaG9sZCwgd2hpY2gKLS0tIHVwZGF0ZXMgdGhlIExTTnMuIFdy YXAgdGhlIHRlc3RzIG9uIGdpc3RfcGFnZV9vcGFxdWVfaW5mbygpIGluIHRoZQotLS0gc2Ft ZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBDUkVBVEUgSU5ERVggc28gdGhhdCB3ZSBzZWUgdGhl IExTTnMgYmVmb3JlCi0tLSB0aGV5IGFyZSBwb3NzaWJseSBvdmVyd3JpdHRlbiBhdCBlbmQg b2YgdHJhbnNhY3Rpb24uCi1CRUdJTjsKLQotLS0gQ3JlYXRlIGEgdGVzdCB0YWJsZSBhbmQg R2lTVCBpbmRleC4KLUNSRUFURSBUQUJMRSB0ZXN0X2dpc3QgQVMgU0VMRUNUIHBvaW50KGks aSkgcCwgaTo6dGV4dCB0IEZST00KKy0tIFRoZSBnaXN0X3BhZ2Vfb3BhcXVlX2luZm8oKSBm dW5jdGlvbiBwcmludHMgdGhlIHBhZ2UncyBMU04uCistLSBVc2UgYW4gdW5sb2dnZWQgaW5k ZXgsIHNvIHRoYXQgdGhlIExTTiBpcyBwcmVkaWN0YWJsZS4KK0NSRUFURSBVTkxPR0dFRCBU QUJMRSB0ZXN0X2dpc3QgQVMgU0VMRUNUIHBvaW50KGksaSkgcCwgaTo6dGV4dCB0IEZST00K ICAgICBnZW5lcmF0ZV9zZXJpZXMoMSwxMDAwKSBpOwogQ1JFQVRFIElOREVYIHRlc3RfZ2lz dF9pZHggT04gdGVzdF9naXN0IFVTSU5HIGdpc3QgKHApOwogCkBAIC0xNyw4ICs5LDYgQEAg U0VMRUNUICogRlJPTSBnaXN0X3BhZ2Vfb3BhcXVlX2luZm8oZ2V0X3Jhd19wYWdlKCd0ZXN0 X2dpc3RfaWR4JywgMCkpOwogU0VMRUNUICogRlJPTSBnaXN0X3BhZ2Vfb3BhcXVlX2luZm8o Z2V0X3Jhd19wYWdlKCd0ZXN0X2dpc3RfaWR4JywgMSkpOwogU0VMRUNUICogRlJPTSBnaXN0 X3BhZ2Vfb3BhcXVlX2luZm8oZ2V0X3Jhd19wYWdlKCd0ZXN0X2dpc3RfaWR4JywgMikpOwog Ci1DT01NSVQ7Ci0KIFNFTEVDVCAqIEZST00gZ2lzdF9wYWdlX2l0ZW1zKGdldF9yYXdfcGFn ZSgndGVzdF9naXN0X2lkeCcsIDApLCAndGVzdF9naXN0X2lkeCcpOwogU0VMRUNUICogRlJP TSBnaXN0X3BhZ2VfaXRlbXMoZ2V0X3Jhd19wYWdlKCd0ZXN0X2dpc3RfaWR4JywgMSksICd0 ZXN0X2dpc3RfaWR4JykgTElNSVQgNTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNj ZXNzL2dpc3QvZ2lzdGJ1aWxkLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2lzdC9naXN0YnVp bGQuYwppbmRleCBhNDVlMmZlMzc1NS4uNWI3Y2VmZGNhYWYgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL2FjY2Vzcy9naXN0L2dpc3RidWlsZC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vz cy9naXN0L2dpc3RidWlsZC5jCkBAIC00Myw3ICs0Myw4IEBACiAjaW5jbHVkZSAibWlzY2Fk bWluLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL29wdGltaXplci5oIgogI2luY2x1ZGUgInN0 b3JhZ2UvYnVmbWdyLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9zbWdyLmgiCisjaW5jbHVkZSAi c3RvcmFnZS9idWxrX3dyaXRlLmgiCisKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgog I2luY2x1ZGUgInV0aWxzL3JlbC5oIgogI2luY2x1ZGUgInV0aWxzL3R1cGxlc29ydC5oIgpA QCAtMTA2LDExICsxMDcsOCBAQCB0eXBlZGVmIHN0cnVjdAogCVR1cGxlc29ydHN0YXRlICpz b3J0c3RhdGU7CS8qIHN0YXRlIGRhdGEgZm9yIHR1cGxlc29ydC5jICovCiAKIAlCbG9ja051 bWJlciBwYWdlc19hbGxvY2F0ZWQ7Ci0JQmxvY2tOdW1iZXIgcGFnZXNfd3JpdHRlbjsKIAot CWludAkJCXJlYWR5X251bV9wYWdlczsKLQlCbG9ja051bWJlciByZWFkeV9ibGtub3NbWExS X01BWF9CTE9DS19JRF07Ci0JUGFnZQkJcmVhZHlfcGFnZXNbWExSX01BWF9CTE9DS19JRF07 CisJQnVsa1dyaXRlU3RhdGUgKmJ1bGt3OwogfSBHSVNUQnVpbGRTdGF0ZTsKIAogI2RlZmlu ZSBHSVNUX1NPUlRFRF9CVUlMRF9QQUdFX05VTSA0CkBAIC0xNDIsNyArMTQwLDYgQEAgc3Rh dGljIHZvaWQgZ2lzdF9pbmRleHNvcnRidWlsZF9sZXZlbHN0YXRlX2FkZChHSVNUQnVpbGRT dGF0ZSAqc3RhdGUsCiAJCQkJCQkJCQkJCSAgIEluZGV4VHVwbGUgaXR1cCk7CiBzdGF0aWMg dm9pZCBnaXN0X2luZGV4c29ydGJ1aWxkX2xldmVsc3RhdGVfZmx1c2goR0lTVEJ1aWxkU3Rh dGUgKnN0YXRlLAogCQkJCQkJCQkJCQkJIEdpc3RTb3J0ZWRCdWlsZExldmVsU3RhdGUgKmxl dmVsc3RhdGUpOwotc3RhdGljIHZvaWQgZ2lzdF9pbmRleHNvcnRidWlsZF9mbHVzaF9yZWFk eV9wYWdlcyhHSVNUQnVpbGRTdGF0ZSAqc3RhdGUpOwogCiBzdGF0aWMgdm9pZCBnaXN0SW5p dEJ1ZmZlcmluZyhHSVNUQnVpbGRTdGF0ZSAqYnVpbGRzdGF0ZSk7CiBzdGF0aWMgaW50CWNh bGN1bGF0ZVBhZ2VzUGVyQnVmZmVyKEdJU1RCdWlsZFN0YXRlICpidWlsZHN0YXRlLCBpbnQg bGV2ZWxTdGVwKTsKQEAgLTQwNSwyNyArNDAyLDE4IEBAIGdpc3RfaW5kZXhzb3J0YnVpbGQo R0lTVEJ1aWxkU3RhdGUgKnN0YXRlKQogewogCUluZGV4VHVwbGUJaXR1cDsKIAlHaXN0U29y dGVkQnVpbGRMZXZlbFN0YXRlICpsZXZlbHN0YXRlOwotCVBhZ2UJCXBhZ2U7CisJQnVsa1dy aXRlQnVmZmVyIHJvb3RidWY7CiAKLQlzdGF0ZS0+cGFnZXNfYWxsb2NhdGVkID0gMDsKLQlz dGF0ZS0+cGFnZXNfd3JpdHRlbiA9IDA7Ci0Jc3RhdGUtPnJlYWR5X251bV9wYWdlcyA9IDA7 CisJLyogUmVzZXJ2ZSBibG9jayAwIGZvciB0aGUgcm9vdCBwYWdlICovCisJc3RhdGUtPnBh Z2VzX2FsbG9jYXRlZCA9IDE7CiAKLQkvKgotCSAqIFdyaXRlIGFuIGVtcHR5IHBhZ2UgYXMg YSBwbGFjZWhvbGRlciBmb3IgdGhlIHJvb3QgcGFnZS4gSXQgd2lsbCBiZQotCSAqIHJlcGxh Y2VkIHdpdGggdGhlIHJlYWwgcm9vdCBwYWdlIGF0IHRoZSBlbmQuCi0JICovCi0JcGFnZSA9 IHBhbGxvY19hbGlnbmVkKEJMQ0tTWiwgUEdfSU9fQUxJR05fU0laRSwgTUNYVF9BTExPQ19a RVJPKTsKLQlzbWdyZXh0ZW5kKFJlbGF0aW9uR2V0U21ncihzdGF0ZS0+aW5kZXhyZWwpLCBN QUlOX0ZPUktOVU0sIEdJU1RfUk9PVF9CTEtOTywKLQkJCSAgIHBhZ2UsIHRydWUpOwotCXN0 YXRlLT5wYWdlc19hbGxvY2F0ZWQrKzsKLQlzdGF0ZS0+cGFnZXNfd3JpdHRlbisrOworCXN0 YXRlLT5idWxrdyA9IGJ1bGt3X3N0YXJ0X3JlbChzdGF0ZS0+aW5kZXhyZWwsIE1BSU5fRk9S S05VTSk7CiAKIAkvKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgZm9yIHRoZSBmaXJz dCBsZWFmIHBhZ2UgYmF0Y2guICovCiAJbGV2ZWxzdGF0ZSA9IHBhbGxvYzAoc2l6ZW9mKEdp c3RTb3J0ZWRCdWlsZExldmVsU3RhdGUpKTsKLQlsZXZlbHN0YXRlLT5wYWdlc1swXSA9IHBh Z2U7CisJbGV2ZWxzdGF0ZS0+cGFnZXNbMF0gPSBwYWxsb2MoQkxDS1NaKTsKIAlsZXZlbHN0 YXRlLT5wYXJlbnQgPSBOVUxMOwotCWdpc3Rpbml0cGFnZShwYWdlLCBGX0xFQUYpOworCWdp c3Rpbml0cGFnZShsZXZlbHN0YXRlLT5wYWdlc1swXSwgRl9MRUFGKTsKIAogCS8qCiAJICog RmlsbCBpbmRleCBwYWdlcyB3aXRoIHR1cGxlcyBpbiB0aGUgc29ydGVkIG9yZGVyLgpAQCAt NDU1LDMxICs0NDMsMTYgQEAgZ2lzdF9pbmRleHNvcnRidWlsZChHSVNUQnVpbGRTdGF0ZSAq c3RhdGUpCiAJCWxldmVsc3RhdGUgPSBwYXJlbnQ7CiAJfQogCi0JZ2lzdF9pbmRleHNvcnRi dWlsZF9mbHVzaF9yZWFkeV9wYWdlcyhzdGF0ZSk7Ci0KIAkvKiBXcml0ZSBvdXQgdGhlIHJv b3QgKi8KIAlQYWdlU2V0TFNOKGxldmVsc3RhdGUtPnBhZ2VzWzBdLCBHaXN0QnVpbGRMU04p OwotCVBhZ2VTZXRDaGVja3N1bUlucGxhY2UobGV2ZWxzdGF0ZS0+cGFnZXNbMF0sIEdJU1Rf Uk9PVF9CTEtOTyk7Ci0Jc21ncndyaXRlKFJlbGF0aW9uR2V0U21ncihzdGF0ZS0+aW5kZXhy ZWwpLCBNQUlOX0ZPUktOVU0sIEdJU1RfUk9PVF9CTEtOTywKLQkJCSAgbGV2ZWxzdGF0ZS0+ cGFnZXNbMF0sIHRydWUpOwotCWlmIChSZWxhdGlvbk5lZWRzV0FMKHN0YXRlLT5pbmRleHJl bCkpCi0JCWxvZ19uZXdwYWdlKCZzdGF0ZS0+aW5kZXhyZWwtPnJkX2xvY2F0b3IsIE1BSU5f Rk9SS05VTSwgR0lTVF9ST09UX0JMS05PLAotCQkJCQlsZXZlbHN0YXRlLT5wYWdlc1swXSwg dHJ1ZSk7Ci0KLQlwZnJlZShsZXZlbHN0YXRlLT5wYWdlc1swXSk7CisKKwlyb290YnVmID0g YnVsa3dfZ2V0X2J1ZihzdGF0ZS0+YnVsa3cpOworCW1lbWNweShyb290YnVmLCBsZXZlbHN0 YXRlLT5wYWdlc1swXSwgQkxDS1NaKTsKKwlidWxrd193cml0ZShzdGF0ZS0+YnVsa3csIEdJ U1RfUk9PVF9CTEtOTywgcm9vdGJ1ZiwgdHJ1ZSk7CisKIAlwZnJlZShsZXZlbHN0YXRlKTsK IAotCS8qCi0JICogV2hlbiB3ZSBXQUwtbG9nZ2VkIGluZGV4IHBhZ2VzLCB3ZSBtdXN0IG5v bmV0aGVsZXNzIGZzeW5jIGluZGV4IGZpbGVzLgotCSAqIFNpbmNlIHdlJ3JlIGJ1aWxkaW5n IG91dHNpZGUgc2hhcmVkIGJ1ZmZlcnMsIGEgQ0hFQ0tQT0lOVCBvY2N1cnJpbmcKLQkgKiBk dXJpbmcgdGhlIGJ1aWxkIGhhcyBubyB3YXkgdG8gZmx1c2ggdGhlIHByZXZpb3VzbHkgd3Jp dHRlbiBkYXRhIHRvCi0JICogZGlzayAoaW5kZWVkIGl0IHdvbid0IGtub3cgdGhlIGluZGV4 IGV2ZW4gZXhpc3RzKS4gIEEgY3Jhc2ggbGF0ZXIgb24KLQkgKiB3b3VsZCByZXBsYXkgV0FM IGZyb20gdGhlIGNoZWNrcG9pbnQsIHRoZXJlZm9yZSBpdCB3b3VsZG4ndCByZXBsYXkgb3Vy Ci0JICogZWFybGllciBXQUwgZW50cmllcy4gSWYgd2UgZG8gbm90IGZzeW5jIHRob3NlIHBh Z2VzIGhlcmUsIHRoZXkgbWlnaHQKLQkgKiBzdGlsbCBub3QgYmUgb24gZGlzayB3aGVuIHRo ZSBjcmFzaCBvY2N1cnMuCi0JICovCi0JaWYgKFJlbGF0aW9uTmVlZHNXQUwoc3RhdGUtPmlu ZGV4cmVsKSkKLQkJc21ncmltbWVkc3luYyhSZWxhdGlvbkdldFNtZ3Ioc3RhdGUtPmluZGV4 cmVsKSwgTUFJTl9GT1JLTlVNKTsKKwlidWxrd19maW5pc2goc3RhdGUtPmJ1bGt3KTsKIH0K IAogLyoKQEAgLTUwOSw4ICs0ODIsNyBAQCBnaXN0X2luZGV4c29ydGJ1aWxkX2xldmVsc3Rh dGVfYWRkKEdJU1RCdWlsZFN0YXRlICpzdGF0ZSwKIAkJCWxldmVsc3RhdGUtPmN1cnJlbnRf cGFnZSsrOwogCiAJCWlmIChsZXZlbHN0YXRlLT5wYWdlc1tsZXZlbHN0YXRlLT5jdXJyZW50 X3BhZ2VdID09IE5VTEwpCi0JCQlsZXZlbHN0YXRlLT5wYWdlc1tsZXZlbHN0YXRlLT5jdXJy ZW50X3BhZ2VdID0KLQkJCQlwYWxsb2NfYWxpZ25lZChCTENLU1osIFBHX0lPX0FMSUdOX1NJ WkUsIDApOworCQkJbGV2ZWxzdGF0ZS0+cGFnZXNbbGV2ZWxzdGF0ZS0+Y3VycmVudF9wYWdl XSA9IHBhbGxvYzAoQkxDS1NaKTsKIAogCQluZXdQYWdlID0gbGV2ZWxzdGF0ZS0+cGFnZXNb bGV2ZWxzdGF0ZS0+Y3VycmVudF9wYWdlXTsKIAkJZ2lzdGluaXRwYWdlKG5ld1BhZ2UsIG9s ZF9wYWdlX2ZsYWdzKTsKQEAgLTU3Myw2ICs1NDUsNyBAQCBnaXN0X2luZGV4c29ydGJ1aWxk X2xldmVsc3RhdGVfZmx1c2goR0lTVEJ1aWxkU3RhdGUgKnN0YXRlLAogCWZvciAoOyBkaXN0 ICE9IE5VTEw7IGRpc3QgPSBkaXN0LT5uZXh0KQogCXsKIAkJY2hhcgkgICAqZGF0YTsKKwkJ QnVsa1dyaXRlQnVmZmVyIGJ1ZjsKIAkJUGFnZQkJdGFyZ2V0OwogCiAJCS8qIGNoZWNrIG9u Y2UgcGVyIHBhZ2UgKi8KQEAgLTU4MCw3ICs1NTMsOCBAQCBnaXN0X2luZGV4c29ydGJ1aWxk X2xldmVsc3RhdGVfZmx1c2goR0lTVEJ1aWxkU3RhdGUgKnN0YXRlLAogCiAJCS8qIENyZWF0 ZSBwYWdlIGFuZCBjb3B5IGRhdGEgKi8KIAkJZGF0YSA9IChjaGFyICopIChkaXN0LT5saXN0 KTsKLQkJdGFyZ2V0ID0gcGFsbG9jX2FsaWduZWQoQkxDS1NaLCBQR19JT19BTElHTl9TSVpF LCBNQ1hUX0FMTE9DX1pFUk8pOworCQlidWYgPSBidWxrd19nZXRfYnVmKHN0YXRlLT5idWxr dyk7CisJCXRhcmdldCA9IChQYWdlKSBidWY7CiAJCWdpc3Rpbml0cGFnZSh0YXJnZXQsIGlz bGVhZiA/IEZfTEVBRiA6IDApOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGRpc3QtPmJsb2Nr Lm51bTsgaSsrKQogCQl7CkBAIC01OTMsMjAgKzU2Nyw2IEBAIGdpc3RfaW5kZXhzb3J0YnVp bGRfbGV2ZWxzdGF0ZV9mbHVzaChHSVNUQnVpbGRTdGF0ZSAqc3RhdGUsCiAJCX0KIAkJdW5p b25fdHVwbGUgPSBkaXN0LT5pdHVwOwogCi0JCWlmIChzdGF0ZS0+cmVhZHlfbnVtX3BhZ2Vz ID09IFhMUl9NQVhfQkxPQ0tfSUQpCi0JCQlnaXN0X2luZGV4c29ydGJ1aWxkX2ZsdXNoX3Jl YWR5X3BhZ2VzKHN0YXRlKTsKLQotCQkvKgotCQkgKiBUaGUgcGFnZSBpcyBub3cgY29tcGxl dGUuIEFzc2lnbiBhIGJsb2NrIG51bWJlciB0byBpdCwgYW5kIGFkZCBpdAotCQkgKiB0byB0 aGUgbGlzdCBvZiBmaW5pc2hlZCBwYWdlcy4gKFdlIGRvbid0IHdyaXRlIGl0IG91dCBpbW1l ZGlhdGVseSwKLQkJICogYmVjYXVzZSB3ZSB3YW50IHRvIFdBTC1sb2cgdGhlIHBhZ2VzIGlu IGJhdGNoZXMuKQotCQkgKi8KLQkJYmxrbm8gPSBzdGF0ZS0+cGFnZXNfYWxsb2NhdGVkKys7 Ci0JCXN0YXRlLT5yZWFkeV9ibGtub3Nbc3RhdGUtPnJlYWR5X251bV9wYWdlc10gPSBibGtu bzsKLQkJc3RhdGUtPnJlYWR5X3BhZ2VzW3N0YXRlLT5yZWFkeV9udW1fcGFnZXNdID0gdGFy Z2V0OwotCQlzdGF0ZS0+cmVhZHlfbnVtX3BhZ2VzKys7Ci0JCUl0ZW1Qb2ludGVyU2V0Qmxv Y2tOdW1iZXIoJih1bmlvbl90dXBsZS0+dF90aWQpLCBibGtubyk7Ci0KIAkJLyoKIAkJICog U2V0IHRoZSByaWdodCBsaW5rIHRvIHBvaW50IHRvIHRoZSBwcmV2aW91cyBwYWdlLiBUaGlz IGlzIGp1c3QgZm9yCiAJCSAqIGRlYnVnZ2luZyBwdXJwb3NlczogR2lTVCBvbmx5IGZvbGxv d3MgdGhlIHJpZ2h0IGxpbmsgaWYgYSBwYWdlIGlzCkBAIC02MjEsNiArNTgxLDE1IEBAIGdp c3RfaW5kZXhzb3J0YnVpbGRfbGV2ZWxzdGF0ZV9mbHVzaChHSVNUQnVpbGRTdGF0ZSAqc3Rh dGUsCiAJCSAqLwogCQlpZiAobGV2ZWxzdGF0ZS0+bGFzdF9ibGtubykKIAkJCUdpc3RQYWdl R2V0T3BhcXVlKHRhcmdldCktPnJpZ2h0bGluayA9IGxldmVsc3RhdGUtPmxhc3RfYmxrbm87 CisKKwkJLyoKKwkJICogVGhlIHBhZ2UgaXMgbm93IGNvbXBsZXRlLiBBc3NpZ24gYSBibG9j ayBudW1iZXIgdG8gaXQsIGFuZCBwYXNzIGl0CisJCSAqIHRvIHRoZSBidWxrIHdyaXRlci4K KwkJICovCisJCWJsa25vID0gc3RhdGUtPnBhZ2VzX2FsbG9jYXRlZCsrOworCQlQYWdlU2V0 TFNOKHRhcmdldCwgR2lzdEJ1aWxkTFNOKTsKKwkJYnVsa3dfd3JpdGUoc3RhdGUtPmJ1bGt3 LCBibGtubywgYnVmLCB0cnVlKTsKKwkJSXRlbVBvaW50ZXJTZXRCbG9ja051bWJlcigmKHVu aW9uX3R1cGxlLT50X3RpZCksIGJsa25vKTsKIAkJbGV2ZWxzdGF0ZS0+bGFzdF9ibGtubyA9 IGJsa25vOwogCiAJCS8qCkBAIC02MzEsNyArNjAwLDcgQEAgZ2lzdF9pbmRleHNvcnRidWls ZF9sZXZlbHN0YXRlX2ZsdXNoKEdJU1RCdWlsZFN0YXRlICpzdGF0ZSwKIAkJaWYgKHBhcmVu dCA9PSBOVUxMKQogCQl7CiAJCQlwYXJlbnQgPSBwYWxsb2MwKHNpemVvZihHaXN0U29ydGVk QnVpbGRMZXZlbFN0YXRlKSk7Ci0JCQlwYXJlbnQtPnBhZ2VzWzBdID0gKFBhZ2UpIHBhbGxv Y19hbGlnbmVkKEJMQ0tTWiwgUEdfSU9fQUxJR05fU0laRSwgMCk7CisJCQlwYXJlbnQtPnBh Z2VzWzBdID0gcGFsbG9jKEJMQ0tTWik7CiAJCQlwYXJlbnQtPnBhcmVudCA9IE5VTEw7CiAJ CQlnaXN0aW5pdHBhZ2UocGFyZW50LT5wYWdlc1swXSwgMCk7CiAKQEAgLTY0MSwzOSArNjEw LDYgQEAgZ2lzdF9pbmRleHNvcnRidWlsZF9sZXZlbHN0YXRlX2ZsdXNoKEdJU1RCdWlsZFN0 YXRlICpzdGF0ZSwKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1naXN0X2luZGV4c29ydGJ1aWxk X2ZsdXNoX3JlYWR5X3BhZ2VzKEdJU1RCdWlsZFN0YXRlICpzdGF0ZSkKLXsKLQlpZiAoc3Rh dGUtPnJlYWR5X251bV9wYWdlcyA9PSAwKQotCQlyZXR1cm47Ci0KLQlmb3IgKGludCBpID0g MDsgaSA8IHN0YXRlLT5yZWFkeV9udW1fcGFnZXM7IGkrKykKLQl7Ci0JCVBhZ2UJCXBhZ2Ug PSBzdGF0ZS0+cmVhZHlfcGFnZXNbaV07Ci0JCUJsb2NrTnVtYmVyIGJsa25vID0gc3RhdGUt PnJlYWR5X2Jsa25vc1tpXTsKLQotCQkvKiBDdXJyZW50bHksIHRoZSBibG9ja3MgbXVzdCBi ZSBidWZmZXJlZCBpbiBvcmRlci4gKi8KLQkJaWYgKGJsa25vICE9IHN0YXRlLT5wYWdlc193 cml0dGVuKQotCQkJZWxvZyhFUlJPUiwgInVuZXhwZWN0ZWQgYmxvY2sgbnVtYmVyIHRvIGZs dXNoIEdpU1Qgc29ydGluZyBidWlsZCIpOwotCi0JCVBhZ2VTZXRMU04ocGFnZSwgR2lzdEJ1 aWxkTFNOKTsKLQkJUGFnZVNldENoZWNrc3VtSW5wbGFjZShwYWdlLCBibGtubyk7Ci0JCXNt Z3JleHRlbmQoUmVsYXRpb25HZXRTbWdyKHN0YXRlLT5pbmRleHJlbCksIE1BSU5fRk9SS05V TSwgYmxrbm8sIHBhZ2UsCi0JCQkJICAgdHJ1ZSk7Ci0KLQkJc3RhdGUtPnBhZ2VzX3dyaXR0 ZW4rKzsKLQl9Ci0KLQlpZiAoUmVsYXRpb25OZWVkc1dBTChzdGF0ZS0+aW5kZXhyZWwpKQot CQlsb2dfbmV3cGFnZXMoJnN0YXRlLT5pbmRleHJlbC0+cmRfbG9jYXRvciwgTUFJTl9GT1JL TlVNLCBzdGF0ZS0+cmVhZHlfbnVtX3BhZ2VzLAotCQkJCQkgc3RhdGUtPnJlYWR5X2Jsa25v cywgc3RhdGUtPnJlYWR5X3BhZ2VzLCB0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwg c3RhdGUtPnJlYWR5X251bV9wYWdlczsgaSsrKQotCQlwZnJlZShzdGF0ZS0+cmVhZHlfcGFn ZXNbaV0pOwotCi0Jc3RhdGUtPnJlYWR5X251bV9wYWdlcyA9IDA7Ci19Ci0KIAogLyotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCiAgKiBSb3V0aW5lcyBmb3Igbm9uLXNvcnRlZCBidWlsZApkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvcmV3cml0ZWhlYXAuYyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy9oZWFwL3Jld3JpdGVoZWFwLmMKaW5kZXggNDI0OTU4OTEyYzcuLmFk ODQ4ZTMxYjFkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9yZXdyaXRl aGVhcC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL3Jld3JpdGVoZWFwLmMKQEAg LTg3LDggKzg3LDggQEAKICAqIGlzIG9wdGltaXplZCBmb3IgYnVsayBpbnNlcnRpbmcgYSBs b3Qgb2YgdHVwbGVzLCBrbm93aW5nIHRoYXQgd2UgaGF2ZQogICogZXhjbHVzaXZlIGFjY2Vz cyB0byB0aGUgaGVhcC4gIHJhd19oZWFwX2luc2VydCBidWlsZHMgbmV3IHBhZ2VzIGluCiAg KiBsb2NhbCBzdG9yYWdlLiAgV2hlbiBhIHBhZ2UgaXMgZnVsbCwgb3IgYXQgdGhlIGVuZCBv ZiB0aGUgcHJvY2VzcywKLSAqIHdlIGluc2VydCBpdCB0byBXQUwgYXMgYSBzaW5nbGUgcmVj b3JkIGFuZCB0aGVuIHdyaXRlIGl0IHRvIGRpc2sKLSAqIGRpcmVjdGx5IHRocm91Z2ggc21n ci4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgYW55IGRhdGEgc2VudCB0byB0aGUgbmV3CisgKiB3 ZSBpbnNlcnQgaXQgdG8gV0FMIGFzIGEgc2luZ2xlIHJlY29yZCBhbmQgdGhlbiB3cml0ZSBp dCB0byBkaXNrIHdpdGgKKyAqIHRoZSBidWxrIHNtZ3Igd3JpdGVyLiAgTm90ZSwgaG93ZXZl ciwgdGhhdCBhbnkgZGF0YSBzZW50IHRvIHRoZSBuZXcKICAqIGhlYXAncyBUT0FTVCB0YWJs ZSB3aWxsIGdvIHRocm91Z2ggdGhlIG5vcm1hbCBidWZtZ3IuCiAgKgogICoKQEAgLTExOSw5 ICsxMTksOSBAQAogI2luY2x1ZGUgInJlcGxpY2F0aW9uL2xvZ2ljYWwuaCIKICNpbmNsdWRl ICJyZXBsaWNhdGlvbi9zbG90LmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKKyNp bmNsdWRlICJzdG9yYWdlL2J1bGtfd3JpdGUuaCIKICNpbmNsdWRlICJzdG9yYWdlL2ZkLmgi CiAjaW5jbHVkZSAic3RvcmFnZS9wcm9jYXJyYXkuaCIKLSNpbmNsdWRlICJzdG9yYWdlL3Nt Z3IuaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3Jl bC5oIgogCkBAIC0xMzMsOSArMTMzLDExIEBAIHR5cGVkZWYgc3RydWN0IFJld3JpdGVTdGF0 ZURhdGEKIHsKIAlSZWxhdGlvbglyc19vbGRfcmVsOwkJLyogc291cmNlIGhlYXAgKi8KIAlS ZWxhdGlvbglyc19uZXdfcmVsOwkJLyogZGVzdGluYXRpb24gaGVhcCAqLwotCVBhZ2UJCXJz X2J1ZmZlcjsJCS8qIHBhZ2UgY3VycmVudGx5IGJlaW5nIGJ1aWx0ICovCisKKwlCdWxrV3Jp dGVTdGF0ZSAqcnNfYnVsa3c7CisKKwlCdWxrV3JpdGVCdWZmZXIgcnNfYnVmZmVyOwkvKiBw YWdlIGN1cnJlbnRseSBiZWluZyBidWlsdCAqLwogCUJsb2NrTnVtYmVyIHJzX2Jsb2Nrbm87 CQkvKiBibG9jayB3aGVyZSBwYWdlIHdpbGwgZ28gKi8KLQlib29sCQlyc19idWZmZXJfdmFs aWQ7CS8qIFQgaWYgYW55IHR1cGxlcyBpbiBidWZmZXIgKi8KIAlib29sCQlyc19sb2dpY2Fs X3Jld3JpdGU7IC8qIGRvIHdlIG5lZWQgdG8gZG8gbG9naWNhbCByZXdyaXRpbmcgKi8KIAlU cmFuc2FjdGlvbklkIHJzX29sZGVzdF94bWluOwkvKiBvbGRlc3QgeG1pbiB1c2VkIGJ5IGNh bGxlciB0byBkZXRlcm1pbmUKIAkJCQkJCQkJCSAqIHR1cGxlIHZpc2liaWxpdHkgKi8KQEAg LTI1NSwxNSArMjU3LDE2IEBAIGJlZ2luX2hlYXBfcmV3cml0ZShSZWxhdGlvbiBvbGRfaGVh cCwgUmVsYXRpb24gbmV3X2hlYXAsIFRyYW5zYWN0aW9uSWQgb2xkZXN0X3htCiAKIAlzdGF0 ZS0+cnNfb2xkX3JlbCA9IG9sZF9oZWFwOwogCXN0YXRlLT5yc19uZXdfcmVsID0gbmV3X2hl YXA7Ci0Jc3RhdGUtPnJzX2J1ZmZlciA9IChQYWdlKSBwYWxsb2NfYWxpZ25lZChCTENLU1os IFBHX0lPX0FMSUdOX1NJWkUsIDApOworCXN0YXRlLT5yc19idWZmZXIgPSBOVUxMOwogCS8q IG5ld19oZWFwIG5lZWRuJ3QgYmUgZW1wdHksIGp1c3QgbG9ja2VkICovCiAJc3RhdGUtPnJz X2Jsb2Nrbm8gPSBSZWxhdGlvbkdldE51bWJlck9mQmxvY2tzKG5ld19oZWFwKTsKLQlzdGF0 ZS0+cnNfYnVmZmVyX3ZhbGlkID0gZmFsc2U7CiAJc3RhdGUtPnJzX29sZGVzdF94bWluID0g b2xkZXN0X3htaW47CiAJc3RhdGUtPnJzX2ZyZWV6ZV94aWQgPSBmcmVlemVfeGlkOwogCXN0 YXRlLT5yc19jdXRvZmZfbXVsdGkgPSBjdXRvZmZfbXVsdGk7CiAJc3RhdGUtPnJzX2N4dCA9 IHJ3X2N4dDsKIAorCXN0YXRlLT5yc19idWxrdyA9IGJ1bGt3X3N0YXJ0X3JlbChuZXdfaGVh cCwgTUFJTl9GT1JLTlVNKTsKKwogCS8qIEluaXRpYWxpemUgaGFzaCB0YWJsZXMgdXNlZCB0 byB0cmFjayB1cGRhdGUgY2hhaW5zICovCiAJaGFzaF9jdGwua2V5c2l6ZSA9IHNpemVvZihU aWRIYXNoS2V5KTsKIAloYXNoX2N0bC5lbnRyeXNpemUgPSBzaXplb2YoVW5yZXNvbHZlZFR1 cERhdGEpOwpAQCAtMzE0LDMwICszMTcsMTMgQEAgZW5kX2hlYXBfcmV3cml0ZShSZXdyaXRl U3RhdGUgc3RhdGUpCiAJfQogCiAJLyogV3JpdGUgdGhlIGxhc3QgcGFnZSwgaWYgYW55ICov Ci0JaWYgKHN0YXRlLT5yc19idWZmZXJfdmFsaWQpCisJaWYgKHN0YXRlLT5yc19idWZmZXIp CiAJewotCQlpZiAoUmVsYXRpb25OZWVkc1dBTChzdGF0ZS0+cnNfbmV3X3JlbCkpCi0JCQls b2dfbmV3cGFnZSgmc3RhdGUtPnJzX25ld19yZWwtPnJkX2xvY2F0b3IsCi0JCQkJCQlNQUlO X0ZPUktOVU0sCi0JCQkJCQlzdGF0ZS0+cnNfYmxvY2tubywKLQkJCQkJCXN0YXRlLT5yc19i dWZmZXIsCi0JCQkJCQl0cnVlKTsKLQotCQlQYWdlU2V0Q2hlY2tzdW1JbnBsYWNlKHN0YXRl LT5yc19idWZmZXIsIHN0YXRlLT5yc19ibG9ja25vKTsKLQotCQlzbWdyZXh0ZW5kKFJlbGF0 aW9uR2V0U21ncihzdGF0ZS0+cnNfbmV3X3JlbCksIE1BSU5fRk9SS05VTSwKLQkJCQkgICBz dGF0ZS0+cnNfYmxvY2tubywgc3RhdGUtPnJzX2J1ZmZlciwgdHJ1ZSk7CisJCWJ1bGt3X3dy aXRlKHN0YXRlLT5yc19idWxrdywgc3RhdGUtPnJzX2Jsb2Nrbm8sIHN0YXRlLT5yc19idWZm ZXIsIHRydWUpOworCQlzdGF0ZS0+cnNfYnVmZmVyID0gTlVMTDsKIAl9CiAKLQkvKgotCSAq IFdoZW4gd2UgV0FMLWxvZ2dlZCByZWwgcGFnZXMsIHdlIG11c3Qgbm9uZXRoZWxlc3MgZnN5 bmMgdGhlbS4gIFRoZQotCSAqIHJlYXNvbiBpcyB0aGUgc2FtZSBhcyBpbiBzdG9yYWdlLmMn cyBSZWxhdGlvbkNvcHlTdG9yYWdlKCk6IHdlJ3JlCi0JICogd3JpdGluZyBkYXRhIHRoYXQn cyBub3QgaW4gc2hhcmVkIGJ1ZmZlcnMsIGFuZCBzbyBhIENIRUNLUE9JTlQKLQkgKiBvY2N1 cnJpbmcgZHVyaW5nIHRoZSByZXdyaXRlaGVhcCBvcGVyYXRpb24gd29uJ3QgaGF2ZSBmc3lu YydkIGRhdGEgd2UKLQkgKiB3cm90ZSBiZWZvcmUgdGhlIGNoZWNrcG9pbnQuCi0JICovCi0J aWYgKFJlbGF0aW9uTmVlZHNXQUwoc3RhdGUtPnJzX25ld19yZWwpKQotCQlzbWdyaW1tZWRz eW5jKFJlbGF0aW9uR2V0U21ncihzdGF0ZS0+cnNfbmV3X3JlbCksIE1BSU5fRk9SS05VTSk7 CisJYnVsa3dfZmluaXNoKHN0YXRlLT5yc19idWxrdyk7CiAKIAlsb2dpY2FsX2VuZF9oZWFw X3Jld3JpdGUoc3RhdGUpOwogCkBAIC02MTEsNyArNTk3LDcgQEAgcmV3cml0ZV9oZWFwX2Rl YWRfdHVwbGUoUmV3cml0ZVN0YXRlIHN0YXRlLCBIZWFwVHVwbGUgb2xkX3R1cGxlKQogc3Rh dGljIHZvaWQKIHJhd19oZWFwX2luc2VydChSZXdyaXRlU3RhdGUgc3RhdGUsIEhlYXBUdXBs ZSB0dXApCiB7Ci0JUGFnZQkJcGFnZSA9IHN0YXRlLT5yc19idWZmZXI7CisJUGFnZQkJcGFn ZTsKIAlTaXplCQlwYWdlRnJlZVNwYWNlLAogCQkJCXNhdmVGcmVlU3BhY2U7CiAJU2l6ZQkJ bGVuOwpAQCAtNjY0LDcgKzY1MCw4IEBAIHJhd19oZWFwX2luc2VydChSZXdyaXRlU3RhdGUg c3RhdGUsIEhlYXBUdXBsZSB0dXApCiAJCQkJCQkJCQkJCQkgICBIRUFQX0RFRkFVTFRfRklM TEZBQ1RPUik7CiAKIAkvKiBOb3cgd2UgY2FuIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGVu b3VnaCBmcmVlIHNwYWNlIGFscmVhZHkuICovCi0JaWYgKHN0YXRlLT5yc19idWZmZXJfdmFs aWQpCisJcGFnZSA9IChQYWdlKSBzdGF0ZS0+cnNfYnVmZmVyOworCWlmIChwYWdlKQogCXsK IAkJcGFnZUZyZWVTcGFjZSA9IFBhZ2VHZXRIZWFwRnJlZVNwYWNlKHBhZ2UpOwogCkBAIC02 NzUsMzUgKzY2MiwxOSBAQCByYXdfaGVhcF9pbnNlcnQoUmV3cml0ZVN0YXRlIHN0YXRlLCBI ZWFwVHVwbGUgdHVwKQogCQkJICogY29udGFpbnMgYSB0dXBsZS4gIEhlbmNlLCB1bmxpa2Ug UmVsYXRpb25HZXRCdWZmZXJGb3JUdXBsZSgpLAogCQkJICogZW5mb3JjZSBzYXZlRnJlZVNw YWNlIHVuY29uZGl0aW9uYWxseS4KIAkJCSAqLwotCi0JCQkvKiBYTE9HIHN0dWZmICovCi0J CQlpZiAoUmVsYXRpb25OZWVkc1dBTChzdGF0ZS0+cnNfbmV3X3JlbCkpCi0JCQkJbG9nX25l d3BhZ2UoJnN0YXRlLT5yc19uZXdfcmVsLT5yZF9sb2NhdG9yLAotCQkJCQkJCU1BSU5fRk9S S05VTSwKLQkJCQkJCQlzdGF0ZS0+cnNfYmxvY2tubywKLQkJCQkJCQlwYWdlLAotCQkJCQkJ CXRydWUpOwotCi0JCQkvKgotCQkJICogTm93IHdyaXRlIHRoZSBwYWdlLiBXZSBzYXkgc2tp cEZzeW5jID0gdHJ1ZSBiZWNhdXNlIHRoZXJlJ3Mgbm8KLQkJCSAqIG5lZWQgZm9yIHNtZ3Ig dG8gc2NoZWR1bGUgYW4gZnN5bmMgZm9yIHRoaXMgd3JpdGU7IHdlJ2xsIGRvIGl0Ci0JCQkg KiBvdXJzZWx2ZXMgaW4gZW5kX2hlYXBfcmV3cml0ZS4KLQkJCSAqLwotCQkJUGFnZVNldENo ZWNrc3VtSW5wbGFjZShwYWdlLCBzdGF0ZS0+cnNfYmxvY2tubyk7Ci0KLQkJCXNtZ3JleHRl bmQoUmVsYXRpb25HZXRTbWdyKHN0YXRlLT5yc19uZXdfcmVsKSwgTUFJTl9GT1JLTlVNLAot CQkJCQkgICBzdGF0ZS0+cnNfYmxvY2tubywgcGFnZSwgdHJ1ZSk7Ci0KKwkJCWJ1bGt3X3dy aXRlKHN0YXRlLT5yc19idWxrdywgc3RhdGUtPnJzX2Jsb2Nrbm8sIHN0YXRlLT5yc19idWZm ZXIsIHRydWUpOworCQkJc3RhdGUtPnJzX2J1ZmZlciA9IE5VTEw7CisJCQlwYWdlID0gTlVM TDsKIAkJCXN0YXRlLT5yc19ibG9ja25vKys7Ci0JCQlzdGF0ZS0+cnNfYnVmZmVyX3ZhbGlk ID0gZmFsc2U7CiAJCX0KIAl9CiAKLQlpZiAoIXN0YXRlLT5yc19idWZmZXJfdmFsaWQpCisJ aWYgKCFwYWdlKQogCXsKIAkJLyogSW5pdGlhbGl6ZSBhIG5ldyBlbXB0eSBwYWdlICovCisJ CXN0YXRlLT5yc19idWZmZXIgPSBidWxrd19nZXRfYnVmKHN0YXRlLT5yc19idWxrdyk7CisJ CXBhZ2UgPSAoUGFnZSkgc3RhdGUtPnJzX2J1ZmZlcjsKIAkJUGFnZUluaXQocGFnZSwgQkxD S1NaLCAwKTsKLQkJc3RhdGUtPnJzX2J1ZmZlcl92YWxpZCA9IHRydWU7CiAJfQogCiAJLyog QW5kIG5vdyB3ZSBjYW4gaW5zZXJ0IHRoZSB0dXBsZSBpbnRvIHRoZSBwYWdlICovCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJlZS5jIGIvc3JjL2JhY2tl bmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYwppbmRleCBhODhiMzZhNTg5YS4uMzhmOTU3ZTZm NGMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0cmVlLmMKKysr IGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYwpAQCAtMjksMTEgKzI5LDEx IEBACiAjaW5jbHVkZSAibm9kZXMvZXhlY25vZGVzLmgiCiAjaW5jbHVkZSAicGdzdGF0Lmgi CiAjaW5jbHVkZSAicG9zdG1hc3Rlci9hdXRvdmFjdXVtLmgiCisjaW5jbHVkZSAic3RvcmFn ZS9idWxrX3dyaXRlLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9jb25kaXRpb25fdmFyaWFibGUu aCIKICNpbmNsdWRlICJzdG9yYWdlL2luZGV4ZnNtLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9p cGMuaCIKICNpbmNsdWRlICJzdG9yYWdlL2xtZ3IuaCIKLSNpbmNsdWRlICJzdG9yYWdlL3Nt Z3IuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2lu ZGV4X3NlbGZ1bmNzLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKQEAgLTE1Miwz MiArMTUyLDE3IEBAIHZvaWQKIGJ0YnVpbGRlbXB0eShSZWxhdGlvbiBpbmRleCkKIHsKIAli b29sCQlhbGxlcXVhbGltYWdlID0gX2J0X2FsbGVxdWFsaW1hZ2UoaW5kZXgsIGZhbHNlKTsK LQlCdWZmZXIJCW1ldGFidWY7Ci0JUGFnZQkJbWV0YXBhZ2U7CisJQnVsa1dyaXRlU3RhdGUg KmJ1bGt3OworCUJ1bGtXcml0ZUJ1ZmZlciBtZXRhYnVmOwogCi0JLyoKLQkgKiBJbml0YWxp emUgdGhlIG1ldGFwYWdlLgotCSAqCi0JICogUmVndWxhciBpbmRleCBidWlsZCBieXBhc3Nl cyB0aGUgYnVmZmVyIG1hbmFnZXIgYW5kIHVzZXMgc21nciBmdW5jdGlvbnMKLQkgKiBkaXJl Y3RseSwgd2l0aCBhbiBzbWdyaW1tZWRzeW5jKCkgY2FsbCBhdCB0aGUgZW5kLiAgVGhhdCBt YWtlcyBzZW5zZQotCSAqIHdoZW4gdGhlIGluZGV4IGlzIGxhcmdlLCBidXQgZm9yIGFuIGVt cHR5IGluZGV4LCBpdCdzIGJldHRlciB0byB1c2UgdGhlCi0JICogYnVmZmVyIGNhY2hlIHRv IGF2b2lkIHRoZSBzbWdyaW1tZWRzeW5jKCkuCi0JICovCi0JbWV0YWJ1ZiA9IFJlYWRCdWZm ZXJFeHRlbmRlZChpbmRleCwgSU5JVF9GT1JLTlVNLCBQX05FVywgUkJNX05PUk1BTCwgTlVM TCk7Ci0JQXNzZXJ0KEJ1ZmZlckdldEJsb2NrTnVtYmVyKG1ldGFidWYpID09IEJUUkVFX01F VEFQQUdFKTsKLQlfYnRfbG9ja2J1ZihpbmRleCwgbWV0YWJ1ZiwgQlRfV1JJVEUpOwotCi0J U1RBUlRfQ1JJVF9TRUNUSU9OKCk7Ci0KLQltZXRhcGFnZSA9IEJ1ZmZlckdldFBhZ2UobWV0 YWJ1Zik7Ci0JX2J0X2luaXRtZXRhcGFnZShtZXRhcGFnZSwgUF9OT05FLCAwLCBhbGxlcXVh bGltYWdlKTsKLQlNYXJrQnVmZmVyRGlydHkobWV0YWJ1Zik7Ci0JbG9nX25ld3BhZ2VfYnVm ZmVyKG1ldGFidWYsIHRydWUpOworCWJ1bGt3ID0gYnVsa3dfc3RhcnRfcmVsKGluZGV4LCBJ TklUX0ZPUktOVU0pOwogCi0JRU5EX0NSSVRfU0VDVElPTigpOworCS8qIENvbnN0cnVjdCBt ZXRhcGFnZS4gKi8KKwltZXRhYnVmID0gYnVsa3dfZ2V0X2J1ZihidWxrdyk7CisJX2J0X2lu aXRtZXRhcGFnZSgoUGFnZSkgbWV0YWJ1ZiwgUF9OT05FLCAwLCBhbGxlcXVhbGltYWdlKTsK KwlidWxrd193cml0ZShidWxrdywgQlRSRUVfTUVUQVBBR0UsIG1ldGFidWYsIHRydWUpOwog Ci0JX2J0X3VubG9ja2J1ZihpbmRleCwgbWV0YWJ1Zik7Ci0JUmVsZWFzZUJ1ZmZlcihtZXRh YnVmKTsKKwlidWxrd19maW5pc2goYnVsa3cpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzb3J0LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3Mv bmJ0cmVlL25idHNvcnQuYwppbmRleCBjMjY2NWZjZTQxMS4uNjAzNGQ3ZjYxYjIgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c29ydC5jCisrKyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c29ydC5jCkBAIC0yMywxMyArMjMsOCBAQAogICog bWFueSB1cHBlciBwYWdlcyBpZiB0aGUga2V5cyBhcmUgcmVhc29uYWJsZS1zaXplKSB3aXRo b3V0IHJpc2tpbmcgYSBsb3Qgb2YKICAqIGNhc2NhZGluZyBzcGxpdHMgZHVyaW5nIGVhcmx5 IGluc2VydGlvbnMuCiAgKgotICogRm9ybWVybHkgdGhlIGluZGV4IHBhZ2VzIGJlaW5nIGJ1 aWx0IHdlcmUga2VwdCBpbiBzaGFyZWQgYnVmZmVycywgYnV0Ci0gKiB0aGF0IGlzIG9mIG5v IHZhbHVlIChzaW5jZSBvdGhlciBiYWNrZW5kcyBoYXZlIG5vIGludGVyZXN0IGluIHRoZW0g eWV0KQotICogYW5kIGl0IGNyZWF0ZWQgbG9ja2luZyBwcm9ibGVtcyBmb3IgQ0hFQ0tQT0lO VCwgYmVjYXVzZSB0aGUgdXBwZXItbGV2ZWwKLSAqIHBhZ2VzIHdlcmUgaGVsZCBleGNsdXNp dmUtbG9ja2VkIGZvciBsb25nIHBlcmlvZHMuICBOb3cgd2UganVzdCBidWlsZAotICogdGhl IHBhZ2VzIGluIGxvY2FsIG1lbW9yeSBhbmQgc21ncndyaXRlIG9yIHNtZ3JleHRlbmQgdGhl bSBhcyB3ZSBmaW5pc2gKLSAqIHRoZW0uICBUaGV5IHdpbGwgbmVlZCB0byBiZSByZS1yZWFk IGludG8gc2hhcmVkIGJ1ZmZlcnMgb24gZmlyc3QgdXNlIGFmdGVyCi0gKiB0aGUgYnVpbGQg ZmluaXNoZXMuCisgKiBXZSB1c2UgdGhlIGJ1bGsgc21nciBsb2FkaW5nIGZhY2lsaXR5IHRv IGJ5cGFzcyB0aGUgYnVmZmVyIGNhY2hlIGFuZAorICogV0FMIGxvZyB0aGUgcGFnZXMgZWZm aWNpZW50bHkuCiAgKgogICogVGhpcyBjb2RlIGlzbid0IGNvbmNlcm5lZCBhYm91dCB0aGUg RlNNIGF0IGFsbC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQogICogZm9yIGluaXRpYWxp emluZyB0aGF0LgpAQCAtNTcsNyArNTIsNyBAQAogI2luY2x1ZGUgImV4ZWN1dG9yL2luc3Ry dW1lbnQuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJwZ3N0YXQuaCIK LSNpbmNsdWRlICJzdG9yYWdlL3NtZ3IuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2J1bGtfd3Jp dGUuaCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCQkvKiBwZ3JtaW5jbHVkZSBpZ25v cmUgKi8KICNpbmNsdWRlICJ1dGlscy9yZWwuaCIKICNpbmNsdWRlICJ1dGlscy9zb3J0c3Vw cG9ydC5oIgpAQCAtMjM0LDcgKzIyOSw3IEBAIHR5cGVkZWYgc3RydWN0IEJUQnVpbGRTdGF0 ZQogICovCiB0eXBlZGVmIHN0cnVjdCBCVFBhZ2VTdGF0ZQogewotCVBhZ2UJCWJ0cHNfcGFn ZTsJCS8qIHdvcmtzcGFjZSBmb3IgcGFnZSBidWlsZGluZyAqLworCUJ1bGtXcml0ZUJ1ZmZl ciBidHBzX2J1ZjsJLyogd29ya3NwYWNlIGZvciBwYWdlIGJ1aWxkaW5nICovCiAJQmxvY2tO dW1iZXIgYnRwc19ibGtubzsJCS8qIGJsb2NrICMgdG8gd3JpdGUgdGhpcyBwYWdlIGF0ICov CiAJSW5kZXhUdXBsZQlidHBzX2xvd2tleTsJLyogcGFnZSdzIHN0cmljdCBsb3dlciBib3Vu ZCBwaXZvdCB0dXBsZSAqLwogCU9mZnNldE51bWJlciBidHBzX2xhc3RvZmY7CS8qIGxhc3Qg aXRlbSBvZmZzZXQgbG9hZGVkICovCkBAIC0yNTEsMTEgKzI0Niw5IEBAIHR5cGVkZWYgc3Ry dWN0IEJUV3JpdGVTdGF0ZQogewogCVJlbGF0aW9uCWhlYXA7CiAJUmVsYXRpb24JaW5kZXg7 CisJQnVsa1dyaXRlU3RhdGUgKmJ1bGt3OwogCUJUU2Nhbkluc2VydCBpbnNrZXk7CQkvKiBn ZW5lcmljIGluc2VydGlvbiBzY2Fua2V5ICovCi0JYm9vbAkJYnR3c191c2Vfd2FsOwkvKiBk dW1wIHBhZ2VzIHRvIFdBTD8gKi8KIAlCbG9ja051bWJlciBidHdzX3BhZ2VzX2FsbG9jZWQ7 IC8qICMgcGFnZXMgYWxsb2NhdGVkICovCi0JQmxvY2tOdW1iZXIgYnR3c19wYWdlc193cml0 dGVuOyAvKiAjIHBhZ2VzIHdyaXR0ZW4gb3V0ICovCi0JUGFnZQkJYnR3c196ZXJvcGFnZTsJ Lyogd29ya3NwYWNlIGZvciBmaWxsaW5nIHplcm9lcyAqLwogfSBCVFdyaXRlU3RhdGU7CiAK IApAQCAtMjY3LDcgKzI2MCw3IEBAIHN0YXRpYyB2b2lkIF9idF9zcG9vbChCVFNwb29sICpi dHNwb29sLCBJdGVtUG9pbnRlciBzZWxmLAogc3RhdGljIHZvaWQgX2J0X2xlYWZidWlsZChC VFNwb29sICpidHNwb29sLCBCVFNwb29sICpidHNwb29sMik7CiBzdGF0aWMgdm9pZCBfYnRf YnVpbGRfY2FsbGJhY2soUmVsYXRpb24gaW5kZXgsIEl0ZW1Qb2ludGVyIHRpZCwgRGF0dW0g KnZhbHVlcywKIAkJCQkJCQkgICBib29sICppc251bGwsIGJvb2wgdHVwbGVJc0FsaXZlLCB2 b2lkICpzdGF0ZSk7Ci1zdGF0aWMgUGFnZSBfYnRfYmxuZXdwYWdlKHVpbnQzMiBsZXZlbCk7 CitzdGF0aWMgQnVsa1dyaXRlQnVmZmVyIF9idF9ibG5ld3BhZ2UoQlRXcml0ZVN0YXRlICp3 c3RhdGUsIHVpbnQzMiBsZXZlbCk7CiBzdGF0aWMgQlRQYWdlU3RhdGUgKl9idF9wYWdlc3Rh dGUoQlRXcml0ZVN0YXRlICp3c3RhdGUsIHVpbnQzMiBsZXZlbCk7CiBzdGF0aWMgdm9pZCBf YnRfc2xpZGVsZWZ0KFBhZ2UgcmlnaHRtb3N0cGFnZSk7CiBzdGF0aWMgdm9pZCBfYnRfc29y dGFkZHR1cChQYWdlIHBhZ2UsIFNpemUgaXRlbXNpemUsCkBAIC01NjksMTYgKzU2MiwxNyBA QCBfYnRfbGVhZmJ1aWxkKEJUU3Bvb2wgKmJ0c3Bvb2wsIEJUU3Bvb2wgKmJ0c3Bvb2wyKQog CXdzdGF0ZS5pbnNrZXkgPSBfYnRfbWtzY2Fua2V5KHdzdGF0ZS5pbmRleCwgTlVMTCk7CiAJ LyogX2J0X21rc2NhbmtleSgpIHdvbid0IHNldCBhbGxlcXVhbGltYWdlIHdpdGhvdXQgbWV0 YXBhZ2UgKi8KIAl3c3RhdGUuaW5za2V5LT5hbGxlcXVhbGltYWdlID0gX2J0X2FsbGVxdWFs aW1hZ2Uod3N0YXRlLmluZGV4LCB0cnVlKTsKLQl3c3RhdGUuYnR3c191c2Vfd2FsID0gUmVs YXRpb25OZWVkc1dBTCh3c3RhdGUuaW5kZXgpOwogCiAJLyogcmVzZXJ2ZSB0aGUgbWV0YXBh Z2UgKi8KIAl3c3RhdGUuYnR3c19wYWdlc19hbGxvY2VkID0gQlRSRUVfTUVUQVBBR0UgKyAx OwotCXdzdGF0ZS5idHdzX3BhZ2VzX3dyaXR0ZW4gPSAwOwotCXdzdGF0ZS5idHdzX3plcm9w YWdlID0gTlVMTDsJLyogdW50aWwgbmVlZGVkICovCisKKwl3c3RhdGUuYnVsa3cgPSBidWxr d19zdGFydF9yZWwod3N0YXRlLmluZGV4LCBNQUlOX0ZPUktOVU0pOwogCiAJcGdzdGF0X3By b2dyZXNzX3VwZGF0ZV9wYXJhbShQUk9HUkVTU19DUkVBVEVJRFhfU1VCUEhBU0UsCiAJCQkJ CQkJCSBQUk9HUkVTU19CVFJFRV9QSEFTRV9MRUFGX0xPQUQpOwogCV9idF9sb2FkKCZ3c3Rh dGUsIGJ0c3Bvb2wsIGJ0c3Bvb2wyKTsKKworCWJ1bGt3X2ZpbmlzaCh3c3RhdGUuYnVsa3cp OwogfQogCiAvKgpAQCAtNjEzLDEzICs2MDcsMTUgQEAgX2J0X2J1aWxkX2NhbGxiYWNrKFJl bGF0aW9uIGluZGV4LAogLyoKICAqIGFsbG9jYXRlIHdvcmtzcGFjZSBmb3IgYSBuZXcsIGNs ZWFuIGJ0cmVlIHBhZ2UsIG5vdCBsaW5rZWQgdG8gYW55IHNpYmxpbmdzLgogICovCi1zdGF0 aWMgUGFnZQotX2J0X2JsbmV3cGFnZSh1aW50MzIgbGV2ZWwpCitzdGF0aWMgQnVsa1dyaXRl QnVmZmVyCitfYnRfYmxuZXdwYWdlKEJUV3JpdGVTdGF0ZSAqd3N0YXRlLCB1aW50MzIgbGV2 ZWwpCiB7CisJQnVsa1dyaXRlQnVmZmVyIGJ1ZjsKIAlQYWdlCQlwYWdlOwogCUJUUGFnZU9w YXF1ZSBvcGFxdWU7CiAKLQlwYWdlID0gKFBhZ2UpIHBhbGxvY19hbGlnbmVkKEJMQ0tTWiwg UEdfSU9fQUxJR05fU0laRSwgMCk7CisJYnVmID0gYnVsa3dfZ2V0X2J1Zih3c3RhdGUtPmJ1 bGt3KTsKKwlwYWdlID0gKFBhZ2UpIGJ1ZjsKIAogCS8qIFplcm8gdGhlIHBhZ2UgYW5kIHNl dCB1cCBzdGFuZGFyZCBwYWdlIGhlYWRlciBpbmZvICovCiAJX2J0X3BhZ2Vpbml0KHBhZ2Us IEJMQ0tTWik7CkBAIC02MzQsNjMgKzYzMCwxNyBAQCBfYnRfYmxuZXdwYWdlKHVpbnQzMiBs ZXZlbCkKIAkvKiBNYWtlIHRoZSBQX0hJS0VZIGxpbmUgcG9pbnRlciBhcHBlYXIgYWxsb2Nh dGVkICovCiAJKChQYWdlSGVhZGVyKSBwYWdlKS0+cGRfbG93ZXIgKz0gc2l6ZW9mKEl0ZW1J ZERhdGEpOwogCi0JcmV0dXJuIHBhZ2U7CisJcmV0dXJuIGJ1ZjsKIH0KIAogLyoKICAqIGVt aXQgYSBjb21wbGV0ZWQgYnRyZWUgcGFnZSwgYW5kIHJlbGVhc2UgdGhlIHdvcmtpbmcgc3Rv cmFnZS4KICAqLwogc3RhdGljIHZvaWQKLV9idF9ibHdyaXRlcGFnZShCVFdyaXRlU3RhdGUg KndzdGF0ZSwgUGFnZSBwYWdlLCBCbG9ja051bWJlciBibGtubykKK19idF9ibHdyaXRlcGFn ZShCVFdyaXRlU3RhdGUgKndzdGF0ZSwgQnVsa1dyaXRlQnVmZmVyIGJ1ZiwgQmxvY2tOdW1i ZXIgYmxrbm8pCiB7Ci0JLyogWExPRyBzdHVmZiAqLwotCWlmICh3c3RhdGUtPmJ0d3NfdXNl X3dhbCkKLQl7Ci0JCS8qIFdlIHVzZSB0aGUgWExPR19GUEkgcmVjb3JkIHR5cGUgZm9yIHRo aXMgKi8KLQkJbG9nX25ld3BhZ2UoJndzdGF0ZS0+aW5kZXgtPnJkX2xvY2F0b3IsIE1BSU5f Rk9SS05VTSwgYmxrbm8sIHBhZ2UsIHRydWUpOwotCX0KLQotCS8qCi0JICogSWYgd2UgaGF2 ZSB0byB3cml0ZSBwYWdlcyBub25zZXF1ZW50aWFsbHksIGZpbGwgaW4gdGhlIHNwYWNlIHdp dGgKLQkgKiB6ZXJvZXMgdW50aWwgd2UgY29tZSBiYWNrIGFuZCBvdmVyd3JpdGUuICBUaGlz IGlzIG5vdCBsb2dpY2FsbHkKLQkgKiBuZWNlc3Nhcnkgb24gc3RhbmRhcmQgVW5peCBmaWxl c3lzdGVtcyAodW53cml0dGVuIHNwYWNlIHdpbGwgcmVhZCBhcwotCSAqIHplcm9lcyBhbnl3 YXkpLCBidXQgaXQgc2hvdWxkIGhlbHAgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbi4gVGhlIGR1 bW15Ci0JICogcGFnZXMgYXJlbid0IFdBTC1sb2dnZWQgdGhvdWdoLgotCSAqLwotCXdoaWxl IChibGtubyA+IHdzdGF0ZS0+YnR3c19wYWdlc193cml0dGVuKQotCXsKLQkJaWYgKCF3c3Rh dGUtPmJ0d3NfemVyb3BhZ2UpCi0JCQl3c3RhdGUtPmJ0d3NfemVyb3BhZ2UgPSAoUGFnZSkg cGFsbG9jX2FsaWduZWQoQkxDS1NaLAotCQkJCQkJCQkJCQkJCQkgIFBHX0lPX0FMSUdOX1NJ WkUsCi0JCQkJCQkJCQkJCQkJCSAgTUNYVF9BTExPQ19aRVJPKTsKLQkJLyogZG9uJ3Qgc2V0 IGNoZWNrc3VtIGZvciBhbGwtemVybyBwYWdlICovCi0JCXNtZ3JleHRlbmQoUmVsYXRpb25H ZXRTbWdyKHdzdGF0ZS0+aW5kZXgpLCBNQUlOX0ZPUktOVU0sCi0JCQkJICAgd3N0YXRlLT5i dHdzX3BhZ2VzX3dyaXR0ZW4rKywKLQkJCQkgICB3c3RhdGUtPmJ0d3NfemVyb3BhZ2UsCi0J CQkJICAgdHJ1ZSk7Ci0JfQotCi0JUGFnZVNldENoZWNrc3VtSW5wbGFjZShwYWdlLCBibGtu byk7Ci0KLQkvKgotCSAqIE5vdyB3cml0ZSB0aGUgcGFnZS4gIFRoZXJlJ3Mgbm8gbmVlZCBm b3Igc21nciB0byBzY2hlZHVsZSBhbiBmc3luYyBmb3IKLQkgKiB0aGlzIHdyaXRlOyB3ZSds bCBkbyBpdCBvdXJzZWx2ZXMgYmVmb3JlIGVuZGluZyB0aGUgYnVpbGQuCi0JICovCi0JaWYg KGJsa25vID09IHdzdGF0ZS0+YnR3c19wYWdlc193cml0dGVuKQotCXsKLQkJLyogZXh0ZW5k aW5nIHRoZSBmaWxlLi4uICovCi0JCXNtZ3JleHRlbmQoUmVsYXRpb25HZXRTbWdyKHdzdGF0 ZS0+aW5kZXgpLCBNQUlOX0ZPUktOVU0sIGJsa25vLAotCQkJCSAgIHBhZ2UsIHRydWUpOwot CQl3c3RhdGUtPmJ0d3NfcGFnZXNfd3JpdHRlbisrOwotCX0KLQllbHNlCi0JewotCQkvKiBv dmVyd3JpdGluZyBhIGJsb2NrIHdlIHplcm8tZmlsbGVkIGJlZm9yZSAqLwotCQlzbWdyd3Jp dGUoUmVsYXRpb25HZXRTbWdyKHdzdGF0ZS0+aW5kZXgpLCBNQUlOX0ZPUktOVU0sIGJsa25v LAotCQkJCSAgcGFnZSwgdHJ1ZSk7Ci0JfQotCi0JcGZyZWUocGFnZSk7CisJYnVsa3dfd3Jp dGUod3N0YXRlLT5idWxrdywgYmxrbm8sIGJ1ZiwgdHJ1ZSk7CisJLyogYnVsa3dfd3JpdGUg dG9vayBvd25lcnNoaXAgb2YgJ2J1ZicgKi8KIH0KIAogLyoKQEAgLTcwMyw3ICs2NTMsNyBA QCBfYnRfcGFnZXN0YXRlKEJUV3JpdGVTdGF0ZSAqd3N0YXRlLCB1aW50MzIgbGV2ZWwpCiAJ QlRQYWdlU3RhdGUgKnN0YXRlID0gKEJUUGFnZVN0YXRlICopIHBhbGxvYzAoc2l6ZW9mKEJU UGFnZVN0YXRlKSk7CiAKIAkvKiBjcmVhdGUgaW5pdGlhbCBwYWdlIGZvciBsZXZlbCAqLwot CXN0YXRlLT5idHBzX3BhZ2UgPSBfYnRfYmxuZXdwYWdlKGxldmVsKTsKKwlzdGF0ZS0+YnRw c19idWYgPSBfYnRfYmxuZXdwYWdlKHdzdGF0ZSwgbGV2ZWwpOwogCiAJLyogYW5kIGFzc2ln biBpdCBhIHBhZ2UgcG9zaXRpb24gKi8KIAlzdGF0ZS0+YnRwc19ibGtubyA9IHdzdGF0ZS0+ YnR3c19wYWdlc19hbGxvY2VkKys7CkBAIC04MzksNiArNzg5LDcgQEAgc3RhdGljIHZvaWQK IF9idF9idWlsZGFkZChCVFdyaXRlU3RhdGUgKndzdGF0ZSwgQlRQYWdlU3RhdGUgKnN0YXRl LCBJbmRleFR1cGxlIGl0dXAsCiAJCQkgU2l6ZSB0cnVuY2V4dHJhKQogeworCUJ1bGtXcml0 ZUJ1ZmZlciBuYnVmOwogCVBhZ2UJCW5wYWdlOwogCUJsb2NrTnVtYmVyIG5ibGtubzsKIAlP ZmZzZXROdW1iZXIgbGFzdF9vZmY7CkBAIC04NTMsNyArODA0LDggQEAgX2J0X2J1aWxkYWRk KEJUV3JpdGVTdGF0ZSAqd3N0YXRlLCBCVFBhZ2VTdGF0ZSAqc3RhdGUsIEluZGV4VHVwbGUg aXR1cCwKIAkgKi8KIAlDSEVDS19GT1JfSU5URVJSVVBUUygpOwogCi0JbnBhZ2UgPSBzdGF0 ZS0+YnRwc19wYWdlOworCW5idWYgPSBzdGF0ZS0+YnRwc19idWY7CisJbnBhZ2UgPSAoUGFn ZSkgbmJ1ZjsKIAluYmxrbm8gPSBzdGF0ZS0+YnRwc19ibGtubzsKIAlsYXN0X29mZiA9IHN0 YXRlLT5idHBzX2xhc3RvZmY7CiAJbGFzdF90cnVuY2V4dHJhID0gc3RhdGUtPmJ0cHNfbGFz dGV4dHJhOwpAQCAtOTA5LDYgKzg2MSw3IEBAIF9idF9idWlsZGFkZChCVFdyaXRlU3RhdGUg KndzdGF0ZSwgQlRQYWdlU3RhdGUgKnN0YXRlLCBJbmRleFR1cGxlIGl0dXAsCiAJCS8qCiAJ CSAqIEZpbmlzaCBvZmYgdGhlIHBhZ2UgYW5kIHdyaXRlIGl0IG91dC4KIAkJICovCisJCUJ1 bGtXcml0ZUJ1ZmZlciBvYnVmID0gbmJ1ZjsKIAkJUGFnZQkJb3BhZ2UgPSBucGFnZTsKIAkJ QmxvY2tOdW1iZXIgb2Jsa25vID0gbmJsa25vOwogCQlJdGVtSWQJCWlpOwpAQCAtOTE2LDcg Kzg2OSw4IEBAIF9idF9idWlsZGFkZChCVFdyaXRlU3RhdGUgKndzdGF0ZSwgQlRQYWdlU3Rh dGUgKnN0YXRlLCBJbmRleFR1cGxlIGl0dXAsCiAJCUluZGV4VHVwbGUJb2l0dXA7CiAKIAkJ LyogQ3JlYXRlIG5ldyBwYWdlIG9mIHNhbWUgbGV2ZWwgKi8KLQkJbnBhZ2UgPSBfYnRfYmxu ZXdwYWdlKHN0YXRlLT5idHBzX2xldmVsKTsKKwkJbmJ1ZiA9IF9idF9ibG5ld3BhZ2Uod3N0 YXRlLCBzdGF0ZS0+YnRwc19sZXZlbCk7CisJCW5wYWdlID0gKFBhZ2UpIG5idWY7CiAKIAkJ LyogYW5kIGFzc2lnbiBpdCBhIHBhZ2UgcG9zaXRpb24gKi8KIAkJbmJsa25vID0gd3N0YXRl LT5idHdzX3BhZ2VzX2FsbG9jZWQrKzsKQEAgLTEwMjgsMTAgKzk4MiwxMCBAQCBfYnRfYnVp bGRhZGQoQlRXcml0ZVN0YXRlICp3c3RhdGUsIEJUUGFnZVN0YXRlICpzdGF0ZSwgSW5kZXhU dXBsZSBpdHVwLAogCQl9CiAKIAkJLyoKLQkJICogV3JpdGUgb3V0IHRoZSBvbGQgcGFnZS4g IFdlIG5ldmVyIG5lZWQgdG8gdG91Y2ggaXQgYWdhaW4sIHNvIHdlIGNhbgotCQkgKiBmcmVl IHRoZSBvcGFnZSB3b3Jrc3BhY2UgdG9vLgorCQkgKiBXcml0ZSBvdXQgdGhlIG9sZCBwYWdl LiBfYnRfYmx3cml0ZXBhZ2UgdGFrZXMgb3duZXJzaGlwIG9mIHRoZQorCQkgKiAnb3BhZ2Un IGJ1ZmZlci4KIAkJICovCi0JCV9idF9ibHdyaXRlcGFnZSh3c3RhdGUsIG9wYWdlLCBvYmxr bm8pOworCQlfYnRfYmx3cml0ZXBhZ2Uod3N0YXRlLCBvYnVmLCBvYmxrbm8pOwogCiAJCS8q CiAJCSAqIFJlc2V0IGxhc3Rfb2ZmIHRvIHBvaW50IHRvIG5ldyBwYWdlCkBAIC0xMDY0LDcg KzEwMTgsNyBAQCBfYnRfYnVpbGRhZGQoQlRXcml0ZVN0YXRlICp3c3RhdGUsIEJUUGFnZVN0 YXRlICpzdGF0ZSwgSW5kZXhUdXBsZSBpdHVwLAogCV9idF9zb3J0YWRkdHVwKG5wYWdlLCBp dHVwc3osIGl0dXAsIGxhc3Rfb2ZmLAogCQkJCSAgICFpc2xlYWYgJiYgbGFzdF9vZmYgPT0g UF9GSVJTVEtFWSk7CiAKLQlzdGF0ZS0+YnRwc19wYWdlID0gbnBhZ2U7CisJc3RhdGUtPmJ0 cHNfYnVmID0gbmJ1ZjsKIAlzdGF0ZS0+YnRwc19ibGtubyA9IG5ibGtubzsKIAlzdGF0ZS0+ YnRwc19sYXN0b2ZmID0gbGFzdF9vZmY7CiB9CkBAIC0xMTE2LDcgKzEwNzAsNyBAQCBfYnRf dXBwZXJzaHV0ZG93bihCVFdyaXRlU3RhdGUgKndzdGF0ZSwgQlRQYWdlU3RhdGUgKnN0YXRl KQogCUJUUGFnZVN0YXRlICpzOwogCUJsb2NrTnVtYmVyIHJvb3RibGtubyA9IFBfTk9ORTsK IAl1aW50MzIJCXJvb3RsZXZlbCA9IDA7Ci0JUGFnZQkJbWV0YXBhZ2U7CisJQnVsa1dyaXRl QnVmZmVyIG1ldGFidWY7CiAKIAkvKgogCSAqIEVhY2ggaXRlcmF0aW9uIG9mIHRoaXMgbG9v cCBjb21wbGV0ZXMgb25lIG1vcmUgbGV2ZWwgb2YgdGhlIHRyZWUuCkBAIC0xMTI3LDcgKzEw ODEsNyBAQCBfYnRfdXBwZXJzaHV0ZG93bihCVFdyaXRlU3RhdGUgKndzdGF0ZSwgQlRQYWdl U3RhdGUgKnN0YXRlKQogCQlCVFBhZ2VPcGFxdWUgb3BhcXVlOwogCiAJCWJsa25vID0gcy0+ YnRwc19ibGtubzsKLQkJb3BhcXVlID0gQlRQYWdlR2V0T3BhcXVlKHMtPmJ0cHNfcGFnZSk7 CisJCW9wYXF1ZSA9IEJUUGFnZUdldE9wYXF1ZSgoUGFnZSkgcy0+YnRwc19idWYpOwogCiAJ CS8qCiAJCSAqIFdlIGhhdmUgdG8gbGluayB0aGUgbGFzdCBwYWdlIG9uIHRoaXMgbGV2ZWwg dG8gc29tZXdoZXJlLgpAQCAtMTE2MSw5ICsxMTE1LDkgQEAgX2J0X3VwcGVyc2h1dGRvd24o QlRXcml0ZVN0YXRlICp3c3RhdGUsIEJUUGFnZVN0YXRlICpzdGF0ZSkKIAkJICogVGhpcyBp cyB0aGUgcmlnaHRtb3N0IHBhZ2UsIHNvIHRoZSBJdGVtSWQgYXJyYXkgbmVlZHMgdG8gYmUg c2xpZAogCQkgKiBiYWNrIG9uZSBzbG90LiAgVGhlbiB3ZSBjYW4gZHVtcCBvdXQgdGhlIHBh Z2UuCiAJCSAqLwotCQlfYnRfc2xpZGVsZWZ0KHMtPmJ0cHNfcGFnZSk7Ci0JCV9idF9ibHdy aXRlcGFnZSh3c3RhdGUsIHMtPmJ0cHNfcGFnZSwgcy0+YnRwc19ibGtubyk7Ci0JCXMtPmJ0 cHNfcGFnZSA9IE5VTEw7CS8qIHdyaXRlcGFnZSBmcmVlZCB0aGUgd29ya3NwYWNlICovCisJ CV9idF9zbGlkZWxlZnQoKFBhZ2UpIHMtPmJ0cHNfYnVmKTsKKwkJX2J0X2Jsd3JpdGVwYWdl KHdzdGF0ZSwgcy0+YnRwc19idWYsIHMtPmJ0cHNfYmxrbm8pOworCQlzLT5idHBzX2J1ZiA9 IE5VTEw7CQkvKiB3cml0ZXBhZ2UgdG9vayBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlciAqLwog CX0KIAogCS8qCkBAIC0xMTcyLDEwICsxMTI2LDEwIEBAIF9idF91cHBlcnNodXRkb3duKEJU V3JpdGVTdGF0ZSAqd3N0YXRlLCBCVFBhZ2VTdGF0ZSAqc3RhdGUpCiAJICogc2V0IHRvIHBv aW50IHRvICJQX05PTkUiKS4gIFRoaXMgY2hhbmdlcyB0aGUgaW5kZXggdG8gdGhlICJ2YWxp ZCIgc3RhdGUKIAkgKiBieSBmaWxsaW5nIGluIGEgdmFsaWQgbWFnaWMgbnVtYmVyIGluIHRo ZSBtZXRhcGFnZS4KIAkgKi8KLQltZXRhcGFnZSA9IChQYWdlKSBwYWxsb2NfYWxpZ25lZChC TENLU1osIFBHX0lPX0FMSUdOX1NJWkUsIDApOwotCV9idF9pbml0bWV0YXBhZ2UobWV0YXBh Z2UsIHJvb3RibGtubywgcm9vdGxldmVsLAorCW1ldGFidWYgPSBidWxrd19nZXRfYnVmKHdz dGF0ZS0+YnVsa3cpOworCV9idF9pbml0bWV0YXBhZ2UoKFBhZ2UpIG1ldGFidWYsIHJvb3Ri bGtubywgcm9vdGxldmVsLAogCQkJCQkgd3N0YXRlLT5pbnNrZXktPmFsbGVxdWFsaW1hZ2Up OwotCV9idF9ibHdyaXRlcGFnZSh3c3RhdGUsIG1ldGFwYWdlLCBCVFJFRV9NRVRBUEFHRSk7 CisJX2J0X2Jsd3JpdGVwYWdlKHdzdGF0ZSwgbWV0YWJ1ZiwgQlRSRUVfTUVUQVBBR0UpOwog fQogCiAvKgpAQCAtMTQyMiwxOCArMTM3Niw2IEBAIF9idF9sb2FkKEJUV3JpdGVTdGF0ZSAq d3N0YXRlLCBCVFNwb29sICpidHNwb29sLCBCVFNwb29sICpidHNwb29sMikKIAogCS8qIENs b3NlIGRvd24gZmluYWwgcGFnZXMgYW5kIHdyaXRlIHRoZSBtZXRhcGFnZSAqLwogCV9idF91 cHBlcnNodXRkb3duKHdzdGF0ZSwgc3RhdGUpOwotCi0JLyoKLQkgKiBXaGVuIHdlIFdBTC1s b2dnZWQgaW5kZXggcGFnZXMsIHdlIG11c3Qgbm9uZXRoZWxlc3MgZnN5bmMgaW5kZXggZmls ZXMuCi0JICogU2luY2Ugd2UncmUgYnVpbGRpbmcgb3V0c2lkZSBzaGFyZWQgYnVmZmVycywg YSBDSEVDS1BPSU5UIG9jY3VycmluZwotCSAqIGR1cmluZyB0aGUgYnVpbGQgaGFzIG5vIHdh eSB0byBmbHVzaCB0aGUgcHJldmlvdXNseSB3cml0dGVuIGRhdGEgdG8KLQkgKiBkaXNrIChp bmRlZWQgaXQgd29uJ3Qga25vdyB0aGUgaW5kZXggZXZlbiBleGlzdHMpLiAgQSBjcmFzaCBs YXRlciBvbgotCSAqIHdvdWxkIHJlcGxheSBXQUwgZnJvbSB0aGUgY2hlY2twb2ludCwgdGhl cmVmb3JlIGl0IHdvdWxkbid0IHJlcGxheSBvdXIKLQkgKiBlYXJsaWVyIFdBTCBlbnRyaWVz LiBJZiB3ZSBkbyBub3QgZnN5bmMgdGhvc2UgcGFnZXMgaGVyZSwgdGhleSBtaWdodAotCSAq IHN0aWxsIG5vdCBiZSBvbiBkaXNrIHdoZW4gdGhlIGNyYXNoIG9jY3Vycy4KLQkgKi8KLQlp ZiAod3N0YXRlLT5idHdzX3VzZV93YWwpCi0JCXNtZ3JpbW1lZHN5bmMoUmVsYXRpb25HZXRT bWdyKHdzdGF0ZS0+aW5kZXgpLCBNQUlOX0ZPUktOVU0pOwogfQogCiAvKgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3NwZ2lzdC9zcGdpbnNlcnQuYyBiL3NyYy9iYWNrZW5k L2FjY2Vzcy9zcGdpc3Qvc3BnaW5zZXJ0LmMKaW5kZXggNDQ0M2YxOTE4ZGYuLjMxYjlkNTI0 NGRiIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3Mvc3BnaXN0L3NwZ2luc2VydC5j CisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9zcGdpc3Qvc3BnaW5zZXJ0LmMKQEAgLTI1LDcg KzI1LDcgQEAKICNpbmNsdWRlICJjYXRhbG9nL2luZGV4LmgiCiAjaW5jbHVkZSAibWlzY2Fk bWluLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKLSNpbmNsdWRlICJzdG9yYWdl L3NtZ3IuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2J1bGtfd3JpdGUuaCIKICNpbmNsdWRlICJ1 dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3JlbC5oIgogCkBAIC0xNTUsNDIg KzE1NSwyNyBAQCBzcGdidWlsZChSZWxhdGlvbiBoZWFwLCBSZWxhdGlvbiBpbmRleCwgSW5k ZXhJbmZvICppbmRleEluZm8pCiB2b2lkCiBzcGdidWlsZGVtcHR5KFJlbGF0aW9uIGluZGV4 KQogewotCUJ1ZmZlcgkJbWV0YWJ1ZmZlciwKLQkJCQlyb290YnVmZmVyLAotCQkJCW51bGxi dWZmZXI7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIG1ldGEgcGFnZSBhbmQgcm9vdCBw YWdlcwotCSAqLwotCW1ldGFidWZmZXIgPSBSZWFkQnVmZmVyRXh0ZW5kZWQoaW5kZXgsIElO SVRfRk9SS05VTSwgUF9ORVcsIFJCTV9OT1JNQUwsIE5VTEwpOwotCUxvY2tCdWZmZXIobWV0 YWJ1ZmZlciwgQlVGRkVSX0xPQ0tfRVhDTFVTSVZFKTsKLQlyb290YnVmZmVyID0gUmVhZEJ1 ZmZlckV4dGVuZGVkKGluZGV4LCBJTklUX0ZPUktOVU0sIFBfTkVXLCBSQk1fTk9STUFMLCBO VUxMKTsKLQlMb2NrQnVmZmVyKHJvb3RidWZmZXIsIEJVRkZFUl9MT0NLX0VYQ0xVU0lWRSk7 Ci0JbnVsbGJ1ZmZlciA9IFJlYWRCdWZmZXJFeHRlbmRlZChpbmRleCwgSU5JVF9GT1JLTlVN LCBQX05FVywgUkJNX05PUk1BTCwgTlVMTCk7Ci0JTG9ja0J1ZmZlcihudWxsYnVmZmVyLCBC VUZGRVJfTE9DS19FWENMVVNJVkUpOwotCi0JQXNzZXJ0KEJ1ZmZlckdldEJsb2NrTnVtYmVy KG1ldGFidWZmZXIpID09IFNQR0lTVF9NRVRBUEFHRV9CTEtOTyk7Ci0JQXNzZXJ0KEJ1ZmZl ckdldEJsb2NrTnVtYmVyKHJvb3RidWZmZXIpID09IFNQR0lTVF9ST09UX0JMS05PKTsKLQlB c3NlcnQoQnVmZmVyR2V0QmxvY2tOdW1iZXIobnVsbGJ1ZmZlcikgPT0gU1BHSVNUX05VTExf QkxLTk8pOworCUJ1bGtXcml0ZVN0YXRlICpidWxrdzsKKwlCdWxrV3JpdGVCdWZmZXIgYnVm OwogCi0JU1RBUlRfQ1JJVF9TRUNUSU9OKCk7CisJYnVsa3cgPSBidWxrd19zdGFydF9yZWwo aW5kZXgsIElOSVRfRk9SS05VTSk7CiAKLQlTcEdpc3RJbml0TWV0YXBhZ2UoQnVmZmVyR2V0 UGFnZShtZXRhYnVmZmVyKSk7Ci0JTWFya0J1ZmZlckRpcnR5KG1ldGFidWZmZXIpOwotCVNw R2lzdEluaXRCdWZmZXIocm9vdGJ1ZmZlciwgU1BHSVNUX0xFQUYpOwotCU1hcmtCdWZmZXJE aXJ0eShyb290YnVmZmVyKTsKLQlTcEdpc3RJbml0QnVmZmVyKG51bGxidWZmZXIsIFNQR0lT VF9MRUFGIHwgU1BHSVNUX05VTExTKTsKLQlNYXJrQnVmZmVyRGlydHkobnVsbGJ1ZmZlcik7 CisJLyogQ29uc3RydWN0IG1ldGFwYWdlLiAqLworCWJ1ZiA9IGJ1bGt3X2dldF9idWYoYnVs a3cpOworCVNwR2lzdEluaXRNZXRhcGFnZSgoUGFnZSkgYnVmKTsKKwlidWxrd193cml0ZShi dWxrdywgU1BHSVNUX01FVEFQQUdFX0JMS05PLCBidWYsIHRydWUpOwogCi0JbG9nX25ld3Bh Z2VfYnVmZmVyKG1ldGFidWZmZXIsIHRydWUpOwotCWxvZ19uZXdwYWdlX2J1ZmZlcihyb290 YnVmZmVyLCB0cnVlKTsKLQlsb2dfbmV3cGFnZV9idWZmZXIobnVsbGJ1ZmZlciwgdHJ1ZSk7 CisJLyogTGlrZXdpc2UgZm9yIHRoZSByb290IHBhZ2UuICovCisJYnVmID0gYnVsa3dfZ2V0 X2J1ZihidWxrdyk7CisJU3BHaXN0SW5pdFBhZ2UoKFBhZ2UpIGJ1ZiwgU1BHSVNUX0xFQUYp OworCWJ1bGt3X3dyaXRlKGJ1bGt3LCBTUEdJU1RfUk9PVF9CTEtOTywgYnVmLCB0cnVlKTsK IAotCUVORF9DUklUX1NFQ1RJT04oKTsKKwkvKiBMaWtld2lzZSBmb3IgdGhlIG51bGwtdHVw bGVzIHJvb3QgcGFnZS4gKi8KKwlidWYgPSBidWxrd19nZXRfYnVmKGJ1bGt3KTsKKwlTcEdp c3RJbml0UGFnZSgoUGFnZSkgYnVmLCBTUEdJU1RfTEVBRiB8IFNQR0lTVF9OVUxMUyk7CisJ YnVsa3dfd3JpdGUoYnVsa3csIFNQR0lTVF9OVUxMX0JMS05PLCBidWYsIHRydWUpOwogCi0J VW5sb2NrUmVsZWFzZUJ1ZmZlcihtZXRhYnVmZmVyKTsKLQlVbmxvY2tSZWxlYXNlQnVmZmVy KHJvb3RidWZmZXIpOwotCVVubG9ja1JlbGVhc2VCdWZmZXIobnVsbGJ1ZmZlcik7CisJYnVs a3dfZmluaXNoKGJ1bGt3KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2Nh dGFsb2cvc3RvcmFnZS5jIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9zdG9yYWdlLmMKaW5kZXgg OTNmMDdlNDliNzIuLmMyZDViM2VjYjI4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jYXRh bG9nL3N0b3JhZ2UuYworKysgYi9zcmMvYmFja2VuZC9jYXRhbG9nL3N0b3JhZ2UuYwpAQCAt MjgsNiArMjgsNyBAQAogI2luY2x1ZGUgImNhdGFsb2cvc3RvcmFnZS5oIgogI2luY2x1ZGUg ImNhdGFsb2cvc3RvcmFnZV94bG9nLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCisjaW5j bHVkZSAic3RvcmFnZS9idWxrX3dyaXRlLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9mcmVlc3Bh Y2UuaCIKICNpbmNsdWRlICJzdG9yYWdlL3NtZ3IuaCIKICNpbmNsdWRlICJ1dGlscy9oc2Vh cmNoLmgiCkBAIC00NTEsMTQgKzQ1MiwxMSBAQCB2b2lkCiBSZWxhdGlvbkNvcHlTdG9yYWdl KFNNZ3JSZWxhdGlvbiBzcmMsIFNNZ3JSZWxhdGlvbiBkc3QsCiAJCQkJCUZvcmtOdW1iZXIg Zm9ya051bSwgY2hhciByZWxwZXJzaXN0ZW5jZSkKIHsKLQlQR0lPQWxpZ25lZEJsb2NrIGJ1 ZjsKLQlQYWdlCQlwYWdlOwogCWJvb2wJCXVzZV93YWw7CiAJYm9vbAkJY29weWluZ19pbml0 Zm9yazsKIAlCbG9ja051bWJlciBuYmxvY2tzOwogCUJsb2NrTnVtYmVyIGJsa25vOwotCi0J cGFnZSA9IChQYWdlKSBidWYuZGF0YTsKKwlCdWxrV3JpdGVTdGF0ZSAqYnVsa3c7CiAKIAkv KgogCSAqIFRoZSBpbml0IGZvcmsgZm9yIGFuIHVubG9nZ2VkIHJlbGF0aW9uIGluIG1hbnkg cmVzcGVjdHMgaGFzIHRvIGJlCkBAIC00NzcsMTYgKzQ3NSwyMSBAQCBSZWxhdGlvbkNvcHlT dG9yYWdlKFNNZ3JSZWxhdGlvbiBzcmMsIFNNZ3JSZWxhdGlvbiBkc3QsCiAJdXNlX3dhbCA9 IFhMb2dJc05lZWRlZCgpICYmCiAJCShyZWxwZXJzaXN0ZW5jZSA9PSBSRUxQRVJTSVNURU5D RV9QRVJNQU5FTlQgfHwgY29weWluZ19pbml0Zm9yayk7CiAKKwlidWxrdyA9IGJ1bGt3X3N0 YXJ0X3NtZ3IoZHN0LCBmb3JrTnVtLCB1c2Vfd2FsKTsKKwogCW5ibG9ja3MgPSBzbWdybmJs b2NrcyhzcmMsIGZvcmtOdW0pOwogCiAJZm9yIChibGtubyA9IDA7IGJsa25vIDwgbmJsb2Nr czsgYmxrbm8rKykKIAl7CisJCUJ1bGtXcml0ZUJ1ZmZlciBidWY7CisKIAkJLyogSWYgd2Ug Z290IGEgY2FuY2VsIHNpZ25hbCBkdXJpbmcgdGhlIGNvcHkgb2YgdGhlIGRhdGEsIHF1aXQg Ki8KIAkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKIAotCQlzbWdycmVhZChzcmMsIGZvcmtO dW0sIGJsa25vLCBidWYuZGF0YSk7CisJCWJ1ZiA9IGJ1bGt3X2dldF9idWYoYnVsa3cpOwor CQlzbWdycmVhZChzcmMsIGZvcmtOdW0sIGJsa25vLCAoUGFnZSkgYnVmKTsKIAotCQlpZiAo IVBhZ2VJc1ZlcmlmaWVkRXh0ZW5kZWQocGFnZSwgYmxrbm8sCisJCWlmICghUGFnZUlzVmVy aWZpZWRFeHRlbmRlZCgoUGFnZSkgYnVmLCBibGtubywKIAkJCQkJCQkJCVBJVl9MT0dfV0FS TklORyB8IFBJVl9SRVBPUlRfU1RBVCkpCiAJCXsKIAkJCS8qCkBAIC01MDcsMzQgKzUxMCwx MyBAQCBSZWxhdGlvbkNvcHlTdG9yYWdlKFNNZ3JSZWxhdGlvbiBzcmMsIFNNZ3JSZWxhdGlv biBkc3QsCiAJCX0KIAogCQkvKgotCQkgKiBXQUwtbG9nIHRoZSBjb3BpZWQgcGFnZS4gVW5m b3J0dW5hdGVseSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvZiBhCi0JCSAqIHBhZ2UgdGhp cyBpcywgc28gd2UgaGF2ZSB0byBsb2cgdGhlIGZ1bGwgcGFnZSBpbmNsdWRpbmcgYW55IHVu dXNlZAotCQkgKiBzcGFjZS4KLQkJICovCi0JCWlmICh1c2Vfd2FsKQotCQkJbG9nX25ld3Bh Z2UoJmRzdC0+c21ncl9ybG9jYXRvci5sb2NhdG9yLCBmb3JrTnVtLCBibGtubywgcGFnZSwg ZmFsc2UpOwotCi0JCVBhZ2VTZXRDaGVja3N1bUlucGxhY2UocGFnZSwgYmxrbm8pOwotCi0J CS8qCi0JCSAqIE5vdyB3cml0ZSB0aGUgcGFnZS4gIFdlIHNheSBza2lwRnN5bmMgPSB0cnVl IGJlY2F1c2UgdGhlcmUncyBubwotCQkgKiBuZWVkIGZvciBzbWdyIHRvIHNjaGVkdWxlIGFu IGZzeW5jIGZvciB0aGlzIHdyaXRlOyB3ZSdsbCBkbyBpdAotCQkgKiBvdXJzZWx2ZXMgYmVs b3cuCisJCSAqIFF1ZXVlIHRoZSBwYWdlIGZvciBXQUwtbG9nZ2luZyBhbmQgd3JpdGluZyBv dXQuICBVbmZvcnR1bmF0ZWx5IHdlCisJCSAqIGRvbid0IGtub3cgd2hhdCBraW5kIG9mIGEg cGFnZSB0aGlzIGlzLCBzbyB3ZSBoYXZlIHRvIGxvZyB0aGUgZnVsbAorCQkgKiBwYWdlIGlu Y2x1ZGluZyBhbnkgdW51c2VkIHNwYWNlLgogCQkgKi8KLQkJc21ncmV4dGVuZChkc3QsIGZv cmtOdW0sIGJsa25vLCBidWYuZGF0YSwgdHJ1ZSk7CisJCWJ1bGt3X3dyaXRlKGJ1bGt3LCBi bGtubywgYnVmLCBmYWxzZSk7CiAJfQotCi0JLyoKLQkgKiBXaGVuIHdlIFdBTC1sb2dnZWQg cmVsIHBhZ2VzLCB3ZSBtdXN0IG5vbmV0aGVsZXNzIGZzeW5jIHRoZW0uICBUaGUKLQkgKiBy ZWFzb24gaXMgdGhhdCBzaW5jZSB3ZSdyZSBjb3B5aW5nIG91dHNpZGUgc2hhcmVkIGJ1ZmZl cnMsIGEgQ0hFQ0tQT0lOVAotCSAqIG9jY3VycmluZyBkdXJpbmcgdGhlIGNvcHkgaGFzIG5v IHdheSB0byBmbHVzaCB0aGUgcHJldmlvdXNseSB3cml0dGVuCi0JICogZGF0YSB0byBkaXNr IChpbmRlZWQgaXQgd29uJ3Qga25vdyB0aGUgbmV3IHJlbCBldmVuIGV4aXN0cykuICBBIGNy YXNoCi0JICogbGF0ZXIgb24gd291bGQgcmVwbGF5IFdBTCBmcm9tIHRoZSBjaGVja3BvaW50 LCB0aGVyZWZvcmUgaXQgd291bGRuJ3QKLQkgKiByZXBsYXkgb3VyIGVhcmxpZXIgV0FMIGVu dHJpZXMuIElmIHdlIGRvIG5vdCBmc3luYyB0aG9zZSBwYWdlcyBoZXJlLAotCSAqIHRoZXkg bWlnaHQgc3RpbGwgbm90IGJlIG9uIGRpc2sgd2hlbiB0aGUgY3Jhc2ggb2NjdXJzLgotCSAq LwotCWlmICh1c2Vfd2FsIHx8IGNvcHlpbmdfaW5pdGZvcmspCi0JCXNtZ3JpbW1lZHN5bmMo ZHN0LCBmb3JrTnVtKTsKKwlidWxrd19maW5pc2goYnVsa3cpOwogfQogCiAvKgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL01ha2VmaWxlIGIvc3JjL2JhY2tlbmQv c3RvcmFnZS9zbWdyL01ha2VmaWxlCmluZGV4IDU5NmI1NjQ2NTZmLi4xZDBiOTg3NjRmOSAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL01ha2VmaWxlCisrKyBiL3Ny Yy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQCB0b3Bf YnVpbGRkaXIgPSAuLi8uLi8uLi8uLgogaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvc3JjL01h a2VmaWxlLmdsb2JhbAogCiBPQkpTID0gXAorCWJ1bGtfd3JpdGUubyBcCiAJbWQubyBcCiAJ c21nci5vCiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9idWxrX3dy aXRlLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3IvYnVsa193cml0ZS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4xOTEzYzM5YmYyMQotLS0gL2Rldi9u dWxsCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9idWxrX3dyaXRlLmMKQEAgLTAs MCArMSwzMDEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGJ1bGtfd3JpdGUu YworICoJICBFZmZpY2llbnRseSBhbmQgcmVsaWFibHkgcG9wdWxhdGUgYSBuZXcgcmVsYXRp b24KKyAqCisgKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IG5vIG90aGVyIGJhY2tlbmRzIGFj Y2VzcyB0aGUgcmVsYXRpb24gd2hpbGUgd2UgYXJlCisgKiBsb2FkaW5nIGl0LCBzbyB3ZSBj YW4gdGFrZSBzb21lIHNob3J0Y3V0cy4gIERvIG5vdCBtaXggb3BlcmF0aW9ucyB0aHJvdWdo CisgKiB0aGUgcmVndWxhciBidWZmZXIgbWFuYWdlciBhbmQgdGhlIGJ1bGsgbG9hZGluZyBp bnRlcmZhY2UhCisgKgorICogV2UgYnlwYXNzIHRoZSBidWZmZXIgbWFuYWdlciB0byBhdm9p ZCB0aGUgbG9ja2luZyBvdmVyaGVhZCwgYW5kIGNhbGwKKyAqIHNtZ3JleHRlbmQoKSBkaXJl Y3RseS4gIEEgZG93bnNpZGUgaXMgdGhhdCB0aGUgcGFnZXMgd2lsbCBuZWVkIHRvIGJlCisg KiByZS1yZWFkIGludG8gc2hhcmVkIGJ1ZmZlcnMgb24gZmlyc3QgdXNlIGFmdGVyIHRoZSBi dWlsZCBmaW5pc2hlcy4gIFRoYXQncworICogdXN1YWxseSBhIGdvb2QgdHJhZGVvZmYgZm9y IGxhcmdlIHJlbGF0aW9ucywgYW5kIGZvciBzbWFsbCByZWxhdGlvbnMsIHRoZQorICogb3Zl cmhlYWQgaXNuJ3QgdmVyeSBzaWduaWZpY2FudCBjb21wYXJlZCB0byBjcmVhdGluZyB0aGUg cmVsYXRpb24gaW4gdGhlCisgKiBmaXJzdCBwbGFjZS4KKyAqCisgKiBUaGUgcGFnZXMgYXJl IFdBTC1sb2dnZWQgaWYgbmVlZGVkLiAgVG8gc2F2ZSBvbiBXQUwgaGVhZGVyIG92ZXJoZWFk LCB3ZQorICogV0FMLWxvZyBzZXZlcmFsIHBhZ2VzIGluIG9uZSByZWNvcmQuCisgKgorICog T25lIHRyaWNreSBwb2ludCBpcyB0aGF0IGJlY2F1c2Ugd2UgYnlwYXNzIHRoZSBidWZmZXIg bWFuYWdlciwgd2UgbmVlZCB0bworICogcmVnaXN0ZXIgdGhlIHJlbGF0aW9uIGZvciBmc3lu Y2luZyBhdCB0aGUgbmV4dCBjaGVja3BvaW50IG91cnNlbHZlcywgYW5kCisgKiBtYWtlIHN1 cmUgdGhhdCB0aGUgcmVsYXRpb24gaXMgY29ycmVjdGx5IGZzeW5jJ2QgYnkgdXMgb3IgdGhl IGNoZWNrcG9pbnRlcgorICogZXZlbiBpZiBhIGNoZWNrcG9pbnQgaGFwcGVucyBjb25jdXJy ZW50bHkuCisgKgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDIzLCBQ b3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICogUG9ydGlvbnMgQ29weXJp Z2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEK KyAqCisgKgorICogSURFTlRJRklDQVRJT04KKyAqCSAgc3JjL2JhY2tlbmQvc3RvcmFnZS9z bWdyL2J1bGtfd3JpdGUuYworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5j bHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgImFjY2Vzcy94bG9naW5zZXJ0LmgiCisj aW5jbHVkZSAiYWNjZXNzL3hsb2dyZWNvcmQuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2J1Zm1n ci5oIgorI2luY2x1ZGUgInN0b3JhZ2UvYnVmcGFnZS5oIgorI2luY2x1ZGUgInN0b3JhZ2Uv YnVsa193cml0ZS5oIgorI2luY2x1ZGUgInN0b3JhZ2UvcHJvYy5oIgorI2luY2x1ZGUgInN0 b3JhZ2Uvc21nci5oIgorI2luY2x1ZGUgInV0aWxzL3JlbC5oIgorCisjZGVmaW5lIE1BWF9Q RU5ESU5HX1dSSVRFUyBYTFJfTUFYX0JMT0NLX0lECisKK3N0YXRpYyBjb25zdCBQR0lPQWxp Z25lZEJsb2NrIHplcm9fYnVmZmVyID0ge3swfX07CS8qIHdvcnRoIEJMQ0tTWiAqLworCit0 eXBlZGVmIHN0cnVjdCBQZW5kaW5nV3JpdGUKK3sKKwlCdWxrV3JpdGVCdWZmZXIgYnVmOwor CUJsb2NrTnVtYmVyIGJsa25vOworCWJvb2wJCXBhZ2Vfc3RkOworfSBQZW5kaW5nV3JpdGU7 CisKKy8qCisgKiBCdWxrIHdyaXRlciBzdGF0ZSBmb3Igb25lIHJlbGF0aW9uIGZvcmsuCisg Ki8KK3R5cGVkZWYgc3RydWN0IEJ1bGtXcml0ZVN0YXRlCit7CisJLyogSW5mb3JtYXRpb24g YWJvdXQgdGhlIHRhcmdldCByZWxhdGlvbiB3ZSdyZSB3cml0aW5nICovCisJLyoKKwkgKiBG SVhNRTogJ3NtZ3InIG1pZ2h0IGdldCBpbnZhbGlkYXRlZC4gSG9wZWZ1bGx5CisJICogaHR0 cHM6Ly9wb3N0Z3IuZXMvbS9DQSUyQmhVS0dKOE5UdnFMSHo2ZHFiUW50MmM4WENraTRyMlF2 WGpCUWNYcFZ3eFRZX3B2QSU0MG1haWwuZ21haWwuY29tCisJICogaXMgbWVyZ2VkIGJlZm9y ZSB0aGlzLgorCSAqLworCVNNZ3JSZWxhdGlvbiBzbWdyOworCUZvcmtOdW1iZXIJZm9ya251 bTsKKwlib29sCQl1c2Vfd2FsOworCisJLyogV2Uga2VlcCBzZXZlcmFsIHdyaXRlcyBxdWV1 ZWQsIGFuZCBXQUwtbG9nIHRoZW0gaW4gYmF0Y2hlcyAqLworCWludAkJCW5wZW5kaW5nOwor CVBlbmRpbmdXcml0ZSBwZW5kaW5nX3dyaXRlc1tNQVhfUEVORElOR19XUklURVNdOworCisJ LyogQ3VycmVudCBzaXplIG9mIHRoZSByZWxhdGlvbiAqLworCUJsb2NrTnVtYmVyIHBhZ2Vz X3dyaXR0ZW47CisKKwkvKiBUaGUgUmVkb1JlY1B0ciBhdCB0aGUgdGltZSB0aGF0IHRoZSBi dWxrIG9wZXJhdGlvbiBzdGFydGVkICovCisJWExvZ1JlY1B0cglzdGFydF9SZWRvUmVjUHRy OworCisJTWVtb3J5Q29udGV4dCBtZW1jeHQ7Cit9IEJ1bGtXcml0ZVN0YXRlOworCitzdGF0 aWMgdm9pZCBidWxrd19mbHVzaChCdWxrV3JpdGVTdGF0ZSAqYnVsa3cpOworCisvKgorICog U3RhcnQgYSBidWxrIHdyaXRlIG9wZXJhdGlvbiBvbiBhIHJlbGF0aW9uIGZvcmsuCisgKi8K K0J1bGtXcml0ZVN0YXRlICoKK2J1bGt3X3N0YXJ0X3JlbChSZWxhdGlvbiByZWwsIEZvcmtO dW1iZXIgZm9ya251bSkKK3sKKwlyZXR1cm4gYnVsa3dfc3RhcnRfc21ncihSZWxhdGlvbkdl dFNtZ3IocmVsKSwKKwkJCQkJCQlmb3JrbnVtLAorCQkJCQkJCVJlbGF0aW9uTmVlZHNXQUwo cmVsKSB8fCBmb3JrbnVtID09IElOSVRfRk9SS05VTSk7Cit9CisKKy8qCisgKiBTdGFydCBh IGJ1bGsgd3JpdGUgb3BlcmF0aW9uIG9uIGEgcmVsYXRpb24gZm9yay4KKyAqCisgKiBUaGlz IGlzIGxpa2UgYnVsa3dfc3RhcnRfcmVsLCBidXQgY2FuIGJlIHVzZWQgd2l0aG91dCBhIHJl bGNhY2hlIGVudHJ5LgorICovCitCdWxrV3JpdGVTdGF0ZSAqCitidWxrd19zdGFydF9zbWdy KFNNZ3JSZWxhdGlvbiBzbWdyLCBGb3JrTnVtYmVyIGZvcmtudW0sIGJvb2wgdXNlX3dhbCkK K3sKKwlCdWxrV3JpdGVTdGF0ZSAqYnVsa3c7CisKKwlidWxrdyA9IHBhbGxvYyhzaXplb2Yo QnVsa1dyaXRlU3RhdGUpKTsKKwlidWxrdy0+c21nciA9IHNtZ3I7CisJYnVsa3ctPmZvcmtu dW0gPSBmb3JrbnVtOworCWJ1bGt3LT51c2Vfd2FsID0gdXNlX3dhbDsKKworCWJ1bGt3LT5u cGVuZGluZyA9IDA7CisJYnVsa3ctPnBhZ2VzX3dyaXR0ZW4gPSAwOworCisJYnVsa3ctPnN0 YXJ0X1JlZG9SZWNQdHIgPSBHZXRSZWRvUmVjUHRyKCk7CisKKwkvKgorCSAqIFJlbWVtYmVy IHRoZSBtZW1vcnkgY29udGV4dC4gIFdlIHdpbGwgdXNlIGl0IHRvIGFsbG9jYXRlIGFsbCB0 aGUKKwkgKiBidWZmZXJzIGxhdGVyLgorCSAqLworCWJ1bGt3LT5tZW1jeHQgPSBDdXJyZW50 TWVtb3J5Q29udGV4dDsKKworCXJldHVybiBidWxrdzsKK30KKworLyoKKyAqIEZpbmlzaCBi dWxrIHdyaXRlIG9wZXJhdGlvbi4KKyAqCisgKiBUaGlzIFdBTC1sb2dzIGFuZCBmbHVzaGVz IGFueSByZW1haW5pbmcgcGVuZGluZyB3cml0ZXMgdG8gZGlzaywgYW5kIGZzeW5jcworICog dGhlIHJlbGF0aW9uIGlmIG5lZWRlZC4KKyAqLwordm9pZAorYnVsa3dfZmluaXNoKEJ1bGtX cml0ZVN0YXRlICpidWxrdykKK3sKKwkvKiBXQUwtbG9nIGFuZCBmbHVzaCBhbnkgcmVtYWlu aW5nIHBhZ2VzICovCisJYnVsa3dfZmx1c2goYnVsa3cpOworCisJLyoKKwkgKiBXaGVuIHdl IHdyb3RlIG91dCB0aGUgcGFnZXMsIHdlIHBhc3NlZCBza2lwRnN5bmM9dHJ1ZSB0byBhdm9p ZCB0aGUKKwkgKiBvdmVyaGVhZCBvZiByZWdpc3RlcmluZyBhbGwgdGhlIHdyaXRlcyB3aXRo IHRoZSBjaGVja3BvaW50ZXIuICBSZWdpc3RlcgorCSAqIHRoZSB3aG9sZSByZWxhdGlvbiBu b3cuCisJICoKKwkgKiBUaGVyZSBpcyBvbmUgaG9sZSBpbiB0aGF0IGlkZWE6IElmIGEgY2hl Y2twb2ludCBvY2N1cnJlZCB3aGlsZSB3ZSB3ZXJlCisJICogd3JpdGluZyB0aGUgcGFnZXMs IGl0IGFscmVhZHkgbWlzc2VkIGZzeW5jaW5nIHRoZSBwYWdlcyB3ZSBoYWQgd3JpdHRlbgor CSAqIGJlZm9yZSB0aGUgY2hlY2twb2ludCBzdGFydGVkLiAgQSBjcmFzaCBsYXRlciBvbiB3 b3VsZCByZXBsYXkgdGhlIFdBTAorCSAqIHN0YXJ0aW5nIGZyb20gdGhlIGNoZWNrcG9pbnQs IHRoZXJlZm9yZSBpdCB3b3VsZG4ndCByZXBsYXkgb3VyIGVhcmxpZXIKKwkgKiBXQUwgcmVj b3Jkcy4gIFNvIGlmIGEgY2hlY2twb2ludCBzdGFydGVkIGFmdGVyIHRoZSBidWxrIHdyaXRl LCBmc3luYworCSAqIHRoZSBmaWxlcyBub3cuCisJICovCisJaWYgKCFTbWdySXNUZW1wKGJ1 bGt3LT5zbWdyKSkKKwl7CisJCS8qCisJCSAqIFByZXZlbnQgYSBjaGVja3BvaW50IGZyb20g c3RhcnRpbmcgYmV0d2VlbiB0aGUgR2V0UmVkb1JlY1B0cigpIGFuZAorCQkgKiBzbWdycmVn aXN0ZXJzeW5jKCkgY2FsbHMuCisJCSAqLworCQlBc3NlcnQoKE15UHJvYy0+ZGVsYXlDaGtw dEZsYWdzICYgREVMQVlfQ0hLUFRfU1RBUlQpID09IDApOworCQlNeVByb2MtPmRlbGF5Q2hr cHRGbGFncyB8PSBERUxBWV9DSEtQVF9TVEFSVDsKKworCQlpZiAoYnVsa3ctPnN0YXJ0X1Jl ZG9SZWNQdHIgIT0gR2V0UmVkb1JlY1B0cigpKQorCQl7CisJCQkvKgorCQkJICogQSBjaGVj a3BvaW50IG9jY3VycmVkIGFuZCBpdCBkaWRuJ3Qga25vdyBhYm91dCBvdXIgd3JpdGVzLCBz bworCQkJICogZnN5bmMoKSB0aGUgcmVsYXRpb24gb3Vyc2VsdmVzLgorCQkJICovCisJCQlN eVByb2MtPmRlbGF5Q2hrcHRGbGFncyAmPSB+REVMQVlfQ0hLUFRfU1RBUlQ7CisJCQlzbWdy aW1tZWRzeW5jKGJ1bGt3LT5zbWdyLCBidWxrdy0+Zm9ya251bSk7CisJCQllbG9nKERFQlVH MSwgImZsdXNoZWQgcmVsYXRpb24gYmVjYXVzZSBhIGNoZWNrcG9pbnQgb2NjdXJyZWQgY29u Y3VycmVudGx5Iik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzbWdycmVnaXN0ZXJzeW5jKGJ1 bGt3LT5zbWdyLCBidWxrdy0+Zm9ya251bSk7CisJCQlNeVByb2MtPmRlbGF5Q2hrcHRGbGFn cyAmPSB+REVMQVlfQ0hLUFRfU1RBUlQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK2J1 ZmZlcl9jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBQZW5k aW5nV3JpdGUgKmJ1ZmEgPSAoY29uc3QgUGVuZGluZ1dyaXRlICopIGE7CisJY29uc3QgUGVu ZGluZ1dyaXRlICpidWZiID0gKGNvbnN0IFBlbmRpbmdXcml0ZSAqKSBiOworCisJLyogV2Ug c2hvdWxkIG5vdCBzZWUgZHVwbGljYXRlZCB3cml0ZXMgZm9yIHRoZSBzYW1lIGJsb2NrICov CisJQXNzZXJ0KGJ1ZmEtPmJsa25vICE9IGJ1ZmItPmJsa25vKTsKKwlpZiAoYnVmYS0+Ymxr bm8gPiBidWZiLT5ibGtubykKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9 CisKKy8qCisgKiBGaW5pc2ggYWxsIHRoZSBwZW5kaW5nIHdyaXRlcy4KKyAqLworc3RhdGlj IHZvaWQKK2J1bGt3X2ZsdXNoKEJ1bGtXcml0ZVN0YXRlICpidWxrdykKK3sKKwlpbnQJCQlu cGVuZGluZyA9IGJ1bGt3LT5ucGVuZGluZzsKKwlQZW5kaW5nV3JpdGUgKnBlbmRpbmdfd3Jp dGVzID0gYnVsa3ctPnBlbmRpbmdfd3JpdGVzOworCisJaWYgKG5wZW5kaW5nID09IDApCisJ CXJldHVybjsKKworCWlmIChucGVuZGluZyA+IDEpCisJCXFzb3J0KHBlbmRpbmdfd3JpdGVz LCBucGVuZGluZywgc2l6ZW9mKFBlbmRpbmdXcml0ZSksIGJ1ZmZlcl9jbXApOworCisJaWYg KGJ1bGt3LT51c2Vfd2FsKQorCXsKKwkJQmxvY2tOdW1iZXIgYmxrbm9zW01BWF9QRU5ESU5H X1dSSVRFU107CisJCVBhZ2UJCXBhZ2VzW01BWF9QRU5ESU5HX1dSSVRFU107CisJCWJvb2wJ CXBhZ2Vfc3RkID0gdHJ1ZTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IG5wZW5kaW5nOyBp KyspCisJCXsKKwkJCWJsa25vc1tpXSA9IHBlbmRpbmdfd3JpdGVzW2ldLmJsa25vOworCQkJ cGFnZXNbaV0gPSBwZW5kaW5nX3dyaXRlc1tpXS5idWYtPmRhdGE7CisKKwkJCS8qCisJCQkg KiBJZiBhbnkgb2YgdGhlIHBhZ2VzIHVzZSAhcGFnZV9zdGQsIHdlIGxvZyB0aGVtIGFsbCBh cyBzdWNoLgorCQkJICogVGhhdCdzIGEgYml0IHdhc3RlZnVsLCBidXQgaW4gcHJhY3RpY2Us IGEgbWl4IG9mIHN0YW5kYXJkIGFuZAorCQkJICogbm9uLXN0YW5kYXJkIHBhZ2UgbGF5b3V0 IGlzIHJhcmUuICBOb25lIG9mIHRoZSBidWlsdC1pbiBBTXMgZG8KKwkJCSAqIHRoYXQuCisJ CQkgKi8KKwkJCWlmICghcGVuZGluZ193cml0ZXNbaV0ucGFnZV9zdGQpCisJCQkJcGFnZV9z dGQgPSBmYWxzZTsKKwkJfQorCQlsb2dfbmV3cGFnZXMoJmJ1bGt3LT5zbWdyLT5zbWdyX3Js b2NhdG9yLmxvY2F0b3IsIGJ1bGt3LT5mb3JrbnVtLAorCQkJCQkgbnBlbmRpbmcsIGJsa25v cywgcGFnZXMsIHBhZ2Vfc3RkKTsKKwl9CisKKwlmb3IgKGludCBpID0gMDsgaSA8IG5wZW5k aW5nOyBpKyspCisJeworCQlCbG9ja051bWJlciBibGtubyA9IHBlbmRpbmdfd3JpdGVzW2ld LmJsa25vOworCQlQYWdlCQlwYWdlID0gcGVuZGluZ193cml0ZXNbaV0uYnVmLT5kYXRhOwor CisJCVBhZ2VTZXRDaGVja3N1bUlucGxhY2UocGFnZSwgYmxrbm8pOworCisJCWlmIChibGtu byA+PSBidWxrdy0+cGFnZXNfd3JpdHRlbikKKwkJeworCQkJLyoKKwkJCSAqIElmIHdlIGhh dmUgdG8gd3JpdGUgcGFnZXMgbm9uc2VxdWVudGlhbGx5LCBmaWxsIGluIHRoZSBzcGFjZQor CQkJICogd2l0aCB6ZXJvZXMgdW50aWwgd2UgY29tZSBiYWNrIGFuZCBvdmVyd3JpdGUuICBU aGlzIGlzIG5vdAorCQkJICogbG9naWNhbGx5IG5lY2Vzc2FyeSBvbiBzdGFuZGFyZCBVbml4 IGZpbGVzeXN0ZW1zICh1bndyaXR0ZW4KKwkJCSAqIHNwYWNlIHdpbGwgcmVhZCBhcyB6ZXJv ZXMgYW55d2F5KSwgYnV0IGl0IHNob3VsZCBoZWxwIHRvIGF2b2lkCisJCQkgKiBmcmFnbWVu dGF0aW9uLiAgVGhlIGR1bW15IHBhZ2VzIGFyZW4ndCBXQUwtbG9nZ2VkIHRob3VnaC4KKwkJ CSAqLworCQkJd2hpbGUgKGJsa25vID4gYnVsa3ctPnBhZ2VzX3dyaXR0ZW4pCisJCQl7CisJ CQkJLyogZG9uJ3Qgc2V0IGNoZWNrc3VtIGZvciBhbGwtemVybyBwYWdlICovCisJCQkJc21n cmV4dGVuZChidWxrdy0+c21nciwgYnVsa3ctPmZvcmtudW0sCisJCQkJCQkgICBidWxrdy0+ cGFnZXNfd3JpdHRlbisrLAorCQkJCQkJICAgJnplcm9fYnVmZmVyLAorCQkJCQkJICAgdHJ1 ZSk7CisJCQl9CisKKwkJCXNtZ3JleHRlbmQoYnVsa3ctPnNtZ3IsIGJ1bGt3LT5mb3JrbnVt LCBibGtubywgcGFnZSwgdHJ1ZSk7CisJCQlidWxrdy0+cGFnZXNfd3JpdHRlbiA9IHBlbmRp bmdfd3JpdGVzW2ldLmJsa25vICsgMTsKKwkJfQorCQllbHNlCisJCQlzbWdyd3JpdGUoYnVs a3ctPnNtZ3IsIGJ1bGt3LT5mb3JrbnVtLCBibGtubywgcGFnZSwgdHJ1ZSk7CisJCXBmcmVl KHBhZ2UpOworCX0KKworCWJ1bGt3LT5ucGVuZGluZyA9IDA7Cit9CisKKy8qCisgKiBRdWV1 ZSB3cml0ZSBvZiAnYnVmJy4KKyAqCisgKiBOQjogdGhpcyB0YWtlcyBvd25lcnNoaXAgb2Yg J2J1ZichCisgKgorICogWW91IGFyZSBvbmx5IGFsbG93ZWQgdG8gd3JpdGUgYSBnaXZlbiBi bG9jayBvbmNlIGFzIHBhcnQgb2Ygb25lIGJ1bGsgd3JpdGUKKyAqIG9wZXJhdGlvbi4KKyAq Lwordm9pZAorYnVsa3dfd3JpdGUoQnVsa1dyaXRlU3RhdGUgKmJ1bGt3LCBCbG9ja051bWJl ciBibG9ja251bSwgQnVsa1dyaXRlQnVmZmVyIGJ1ZiwgYm9vbCBwYWdlX3N0ZCkKK3sKKwli dWxrdy0+cGVuZGluZ193cml0ZXNbYnVsa3ctPm5wZW5kaW5nXS5idWYgPSBidWY7CisJYnVs a3ctPnBlbmRpbmdfd3JpdGVzW2J1bGt3LT5ucGVuZGluZ10uYmxrbm8gPSBibG9ja251bTsK KwlidWxrdy0+cGVuZGluZ193cml0ZXNbYnVsa3ctPm5wZW5kaW5nXS5wYWdlX3N0ZCA9IHBh Z2Vfc3RkOworCisJYnVsa3ctPm5wZW5kaW5nKys7CisKKwlpZiAoYnVsa3ctPm5wZW5kaW5n ID09IE1BWF9QRU5ESU5HX1dSSVRFUykKKwkJYnVsa3dfZmx1c2goYnVsa3cpOworfQorCisv KgorICogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIHdoaWNoIGNhbiBsYXRlciBiZSB3cml0dGVu IHdpdGggYnVsa3dfd3JpdGUoKS4KKyAqCisgKiBUaGVyZSBpcyBubyBmdW5jdGlvbiB0byBm cmVlIGEgYnVmZmVyLiAgV2hlbiB5b3UgcGFzcyBpdCB0byBidWxrd193cml0ZSgpLAorICog aXQgdGFrZXMgb3duZXJzaGlwIGFuZCBmcmVlcyBpdCB3aGVuIGl0J3Mgbm8gbG9uZ2VyIG5l ZWRlZC4KKyAqCisgKiBUaGlzIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIHNpbXBs ZSBwYWxsb2MsIGJ1dCBjb3VsZCBiZSBpbXBsZW1lbnRlZAorICogdXNpbmcgYSByaW5nIGJ1 ZmZlciBvciBsYXJnZXIgY2h1bmtzIGluIHRoZSBmdXR1cmUsIHNvIGRvbid0IHJlbHkgb24g aXQuCisgKi8KK0J1bGtXcml0ZUJ1ZmZlcgorYnVsa3dfZ2V0X2J1ZihCdWxrV3JpdGVTdGF0 ZSAqYnVsa3cpCit7CisJcmV0dXJuIE1lbW9yeUNvbnRleHRBbGxvY0FsaWduZWQoYnVsa3ct Pm1lbWN4dCwgQkxDS1NaLCBQR19JT19BTElHTl9TSVpFLCAwKTsKK30KZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9tZC5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9z bWdyL21kLmMKaW5kZXggZmRlY2JhZDE3MDkuLjM0M2VlNTEwNDhlIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9zdG9yYWdlL3NtZ3IvbWQuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdl L3NtZ3IvbWQuYwpAQCAtMTA4Miw2ICsxMDgyLDQ5IEBAIG1kdHJ1bmNhdGUoU01nclJlbGF0 aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwgQmxvY2tOdW1iZXIgbmJsb2NrcykKIAl9 CiB9CiAKKy8qCisgKiBtZHJlZ2lzdGVyc3luYygpIC0tIE1hcmsgd2hvbGUgcmVsYXRpb24g YXMgbmVlZGluZyBmc3luYworICovCit2b2lkCittZHJlZ2lzdGVyc3luYyhTTWdyUmVsYXRp b24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKQoreworCWludAkJCXNlZ25vOworCWludAkJ CW1pbl9pbmFjdGl2ZV9zZWc7CisKKwkvKgorCSAqIE5PVEU6IG1kbmJsb2NrcyBtYWtlcyBz dXJlIHdlIGhhdmUgb3BlbmVkIGFsbCBhY3RpdmUgc2VnbWVudHMsIHNvIHRoYXQKKwkgKiB0 aGUgbG9vcCBiZWxvdyB3aWxsIGdldCB0aGVtIGFsbCEKKwkgKi8KKwltZG5ibG9ja3MocmVs biwgZm9ya251bSk7CisKKwltaW5faW5hY3RpdmVfc2VnID0gc2Vnbm8gPSByZWxuLT5tZF9u dW1fb3Blbl9zZWdzW2ZvcmtudW1dOworCisJLyoKKwkgKiBUZW1wb3JhcmlseSBvcGVuIGlu YWN0aXZlIHNlZ21lbnRzLCB0aGVuIGNsb3NlIHRoZW0gYWZ0ZXIgc3luYy4gIFRoZXJlCisJ ICogbWF5IGJlIHNvbWUgaW5hY3RpdmUgc2VnbWVudHMgbGVmdCBvcGVuZWQgYWZ0ZXIgZXJy b3IsIGJ1dCB0aGF0IGlzCisJICogaGFybWxlc3MuICBXZSBkb24ndCBib3RoZXIgdG8gY2xl YW4gdGhlbSB1cCBhbmQgdGFrZSBhIHJpc2sgb2YgZnVydGhlcgorCSAqIHRyb3VibGUuICBU aGUgbmV4dCBtZGNsb3NlKCkgd2lsbCBzb29uIGNsb3NlIHRoZW0uCisJICovCisJd2hpbGUg KF9tZGZkX29wZW5zZWcocmVsbiwgZm9ya251bSwgc2Vnbm8sIDApICE9IE5VTEwpCisJCXNl Z25vKys7CisKKwl3aGlsZSAoc2Vnbm8gPiAwKQorCXsKKwkJTWRmZFZlYyAgICAqdiA9ICZy ZWxuLT5tZF9zZWdfZmRzW2ZvcmtudW1dW3NlZ25vIC0gMV07CisKKwkJcmVnaXN0ZXJfZGly dHlfc2VnbWVudChyZWxuLCBmb3JrbnVtLCB2KTsKKworCQkvKiBDbG9zZSBpbmFjdGl2ZSBz ZWdtZW50cyBpbW1lZGlhdGVseSAqLworCQlpZiAoc2Vnbm8gPiBtaW5faW5hY3RpdmVfc2Vn KQorCQl7CisJCQlGaWxlQ2xvc2Uodi0+bWRmZF92ZmQpOworCQkJX2ZkdmVjX3Jlc2l6ZShy ZWxuLCBmb3JrbnVtLCBzZWdubyAtIDEpOworCQl9CisKKwkJc2Vnbm8tLTsKKwl9Cit9CisK IC8qCiAgKiBtZGltbWVkc3luYygpIC0tIEltbWVkaWF0ZWx5IHN5bmMgYSByZWxhdGlvbiB0 byBzdGFibGUgc3RvcmFnZS4KICAqCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdl L3NtZ3IvbWVzb24uYnVpbGQgYi9zcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3IvbWVzb24uYnVp bGQKaW5kZXggZTFiYTZlZDc0YjguLjEzMzYyMmE2NTI4IDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9zdG9yYWdlL3NtZ3IvbWVzb24uYnVpbGQKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFn ZS9zbWdyL21lc29uLmJ1aWxkCkBAIC0xLDYgKzEsNyBAQAogIyBDb3B5cmlnaHQgKGMpIDIw MjItMjAyMywgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKIAogYmFja2Vu ZF9zb3VyY2VzICs9IGZpbGVzKAorICAnYnVsa193cml0ZS5jJywKICAgJ21kLmMnLAogICAn c21nci5jJywKICkKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9zbWdy LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jCmluZGV4IDVkMGYzZDUxNWMz Li45Zjc0MDVlM2M4OCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL3Nt Z3IuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jCkBAIC02NSw2ICs2 NSw3IEBAIHR5cGVkZWYgc3RydWN0IGZfc21ncgogCXZvaWQJCSgqc21ncl90cnVuY2F0ZSkg KFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCiAJCQkJCQkJCSAgQmxv Y2tOdW1iZXIgbmJsb2Nrcyk7CiAJdm9pZAkJKCpzbWdyX2ltbWVkc3luYykgKFNNZ3JSZWxh dGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0pOworCXZvaWQJCSgqc21ncl9yZWdpc3Rl cnN5bmMpIChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKTsKIH0gZl9z bWdyOwogCiBzdGF0aWMgY29uc3QgZl9zbWdyIHNtZ3Jzd1tdID0gewpAQCAtODYsNiArODcs NyBAQCBzdGF0aWMgY29uc3QgZl9zbWdyIHNtZ3Jzd1tdID0gewogCQkuc21ncl9uYmxvY2tz ID0gbWRuYmxvY2tzLAogCQkuc21ncl90cnVuY2F0ZSA9IG1kdHJ1bmNhdGUsCiAJCS5zbWdy X2ltbWVkc3luYyA9IG1kaW1tZWRzeW5jLAorCQkuc21ncl9yZWdpc3RlcnN5bmMgPSBtZHJl Z2lzdGVyc3luYywKIAl9CiB9OwogCkBAIC01NzYsNiArNTc4LDE0IEBAIHNtZ3JyZWFkKFNN Z3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIEJsb2NrTnVtYmVyIGJsb2Nr bnVtLAogICogb24gZGlzayBhdCByZXR1cm4sIG9ubHkgZHVtcGVkIG91dCB0byB0aGUga2Vy bmVsLiAgSG93ZXZlciwKICAqIHByb3Zpc2lvbnMgd2lsbCBiZSBtYWRlIHRvIGZzeW5jIHRo ZSB3cml0ZSBiZWZvcmUgdGhlIG5leHQgY2hlY2twb2ludC4KICAqCisgKiBOQjogVGhlIG1l Y2hhbmlzbSB0byBlbnN1cmUgZnN5bmMgYXQgbmV4dCBjaGVja3BvaW50IGFzc3VtZXMgdGhh dCB0aGVyZSBpcworICogc29tZXRoaW5nIHRoYXQgcHJldmVudHMgYSBjb25jdXJyZW50IGNo ZWNrcG9pbnQgZnJvbSAicmFjaW5nIGFoZWFkIiBvZiB0aGUKKyAqIHdyaXRlLiAgT25lIHdh eSB0byBwcmV2ZW50IHRoYXQgaXMgYnkgaG9sZGluZyBhIGxvY2sgb24gdGhlIGJ1ZmZlcjsg dGhlCisgKiBidWZmZXIgbWFuYWdlcidzIHdyaXRlcyBhcmUgcHJvdGVjdGVkIGJ5IHRoYXQu ICBUaGUgYnVsayB3cml0ZXIgZmFjaWxpdHkgaW4KKyAqIGJ1bGtfd3JpdGUuYyBjaGVja3Mg dGhlIHJlZG8gcG9pbnRlciBhbmQgYW5kIGNhbGxzIHNtZ3JpbW1lZHN5bmMoKSBpZiBhCisg KiBjaGVja3BvaW50IGhhcHBlbmVkOyB0aGF0IHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IG5v IG90aGVyIGJhY2tlbmQgY2FuIGJlCisgKiBjb25jdXJyZW50bHkgbW9kaWZ5IHRoZSBwYWdl LgorICoKICAqIHNraXBGc3luYyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGVyIHdpbGwgbWFr ZSBvdGhlciBwcm92aXNpb25zIHRvCiAgKiBmc3luYyB0aGUgcmVsYXRpb24sIHNvIHdlIG5l ZWRuJ3QgYm90aGVyLiAgVGVtcG9yYXJ5IHJlbGF0aW9ucyBhbHNvCiAgKiBkbyBub3QgcmVx dWlyZSBmc3luYy4KQEAgLTY5NCw2ICs3MDQsMjQgQEAgc21ncnRydW5jYXRlKFNNZ3JSZWxh dGlvbiByZWxuLCBGb3JrTnVtYmVyICpmb3JrbnVtLCBpbnQgbmZvcmtzLCBCbG9ja051bWJl ciAqbmIKIAl9CiB9CiAKKy8qCisgKiBzbWdycmVnaXN0ZXJzeW5jKCkgLS0gUmVxdWVzdCBh IHJlbGF0aW9uIHRvIGJlIHN5bmMnZCBhdCBuZXh0IGNoZWNrcG9pbnQKKyAqCisgKiBUaGlz IGNhbiBiZSB1c2VkIGFmdGVyIGNhbGxpbmcgc21ncndyaXRlKCkgb3Igc21ncmV4dGVuZCgp IHdpdGggc2tpcEZzeW5jID0KKyAqIHRydWUsIHRvIHJlZ2lzdGVyIHRoZSBmc3luY3MgdGhh dCB3ZXJlIHNraXBwZWQgZWFybGllci4KKyAqCisgKiBOb3RlOiBiZSBtaW5kZnVsIHRoYXQg YSBjaGVja3BvaW50IGNvdWxkIGFscmVhZHkgaGF2ZSBoYXBwZW5lZCBiZXR3ZWVuIHRoZQor ICogc21ncndyaXRlIG9yIHNtZ3JleHRlbmQgY2FsbHMgYW5kIHRoaXMhICBJbiB0aGF0IGNh c2UsIHRoZSBjaGVja3BvaW50CisgKiBhbHJlYWR5IG1pc3NlZCBmc3luY2luZyB0aGlzIHJl bGF0aW9uLCBhbmQgeW91IHNob3VsZCB1c2Ugc21ncmltbWVkc3luYworICogaW5zdGVhZC4g IE1vc3QgY2FsbGVycyBzaG91bGQgdXNlIHRoZSBidWxrIGxvYWRpbmcgZmFjaWxpdHkgaW4g YnVsa193cml0ZS5jCisgKiBpbnN0ZWFkLCB3aGljaCBoYW5kbGVzIGFsbCB0aGF0LgorICov Cit2b2lkCitzbWdycmVnaXN0ZXJzeW5jKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVy IGZvcmtudW0pCit7CisJc21ncnN3W3JlbG4tPnNtZ3Jfd2hpY2hdLnNtZ3JfcmVnaXN0ZXJz eW5jKHJlbG4sIGZvcmtudW0pOworfQorCiAvKgogICogc21ncmltbWVkc3luYygpIC0tIEZv cmNlIHRoZSBzcGVjaWZpZWQgcmVsYXRpb24gdG8gc3RhYmxlIHN0b3JhZ2UuCiAgKgpAQCAt NzE2LDYgKzc0NCw5IEBAIHNtZ3J0cnVuY2F0ZShTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051 bWJlciAqZm9ya251bSwgaW50IG5mb3JrcywgQmxvY2tOdW1iZXIgKm5iCiAgKiBOb3RlIHRo YXQgeW91IG5lZWQgdG8gZG8gRmx1c2hSZWxhdGlvbkJ1ZmZlcnMoKSBmaXJzdCBpZiB0aGVy ZSBpcwogICogYW55IHBvc3NpYmlsaXR5IHRoYXQgdGhlcmUgYXJlIGRpcnR5IGJ1ZmZlcnMg Zm9yIHRoZSByZWxhdGlvbjsKICAqIG90aGVyd2lzZSB0aGUgc3luYyBpcyBub3QgdmVyeSBt ZWFuaW5nZnVsLgorICoKKyAqIE1vc3QgY2FsbGVycyBzaG91bGQgdXNlIHRoZSBidWxrIGxv YWRpbmcgZmFjaWxpdHkgaW4gYnVsa193cml0ZS5jCisgKiBpbnN0ZWFkIG9mIGNhbGxpbmcg dGhpcyBkaXJlY3RseS4KICAqLwogdm9pZAogc21ncmltbWVkc3luYyhTTWdyUmVsYXRpb24g cmVsbiwgRm9ya051bWJlciBmb3JrbnVtKQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3Rv cmFnZS9idWxrX3dyaXRlLmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1bGtfd3JpdGUuaApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNGRlZmFmMjAxMjUKLS0t IC9kZXYvbnVsbAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1bGtfd3JpdGUuaApAQCAt MCwwICsxLDM4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBidWxrX3dyaXRl LmgKKyAqCSAgRWZmaWNpZW50bHkgYW5kIHJlbGlhYmx5IHBvcHVsYXRlIGEgbmV3IHJlbGF0 aW9uCisgKgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDIzLCBQb3N0 Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICogUG9ydGlvbnMgQ29weXJpZ2h0 IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKKyAq CisgKiBzcmMvaW5jbHVkZS9zdG9yYWdlL2J1bGtfd3JpdGUuaAorICoKKyAqLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorICovCisjaWZuZGVmIEJVTEtfV1JJVEVfSAorI2RlZmluZSBCVUxLX1dS SVRFX0gKKwordHlwZWRlZiBzdHJ1Y3QgQnVsa1dyaXRlU3RhdGUgQnVsa1dyaXRlU3RhdGU7 CisKKy8qCisgKiBUZW1wb3JhcnkgYnVmZmVyIHRvIGhvbGQgYSBwYWdlIHRvIHVudGlsIGl0 J3Mgd3JpdHRlbiBvdXQuIFVzZQorICogYnVsa3dfZ2V0X2J1ZigpIHRvIHJlc2VydmUgb25l IG9mIHRoZXNlLiAgVGhpcyBpcyBhIHNlcGFyYXRlIHR5cGVkZWYgdG8KKyAqIG1ha2UgZGlz dGluZ3Vpc2ggZnJvbSBvdGhlciBibG9jay1zaXplZCBidWZmZXJzIHBhc3NlZCBhcm91bmQg aW4gdGhlCisgKiBzeXN0ZW0uCisgKi8KK3R5cGVkZWYgUEdJT0FsaWduZWRCbG9jayAqQnVs a1dyaXRlQnVmZmVyOworCisvKiBmb3J3YXJkIGRlY2xhcmVkIGZyb20gc21nci5oICovCitz dHJ1Y3QgU01nclJlbGF0aW9uRGF0YTsKKworZXh0ZXJuIEJ1bGtXcml0ZVN0YXRlICpidWxr d19zdGFydF9yZWwoUmVsYXRpb24gcmVsLCBGb3JrTnVtYmVyIGZvcmtudW0pOworZXh0ZXJu IEJ1bGtXcml0ZVN0YXRlICpidWxrd19zdGFydF9zbWdyKHN0cnVjdCBTTWdyUmVsYXRpb25E YXRhICpzbWdyLCBGb3JrTnVtYmVyIGZvcmtudW0sIGJvb2wgdXNlX3dhbCk7CisKK2V4dGVy biBCdWxrV3JpdGVCdWZmZXIgYnVsa3dfZ2V0X2J1ZihCdWxrV3JpdGVTdGF0ZSAqYnVsa3cp OworZXh0ZXJuIHZvaWQgYnVsa3dfd3JpdGUoQnVsa1dyaXRlU3RhdGUgKmJ1bGt3LCBCbG9j a051bWJlciBibG9ja251bSwgQnVsa1dyaXRlQnVmZmVyIGJ1ZiwgYm9vbCBwYWdlX3N0ZCk7 CisKK2V4dGVybiB2b2lkIGJ1bGt3X2ZpbmlzaChCdWxrV3JpdGVTdGF0ZSAqYnVsa3cpOwor CisjZW5kaWYJCQkJCQkJLyogQlVMS19XUklURV9IICovCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9zdG9yYWdlL21kLmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL21kLmgKaW5kZXggOTQx ODc5ZWU2YTguLjIyNTcwMTI3MWQyIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdl L21kLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9tZC5oCkBAIC00Miw2ICs0Miw3IEBA IGV4dGVybiBCbG9ja051bWJlciBtZG5ibG9ja3MoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtO dW1iZXIgZm9ya251bSk7CiBleHRlcm4gdm9pZCBtZHRydW5jYXRlKFNNZ3JSZWxhdGlvbiBy ZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCiAJCQkJCSAgIEJsb2NrTnVtYmVyIG5ibG9ja3Mp OwogZXh0ZXJuIHZvaWQgbWRpbW1lZHN5bmMoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1i ZXIgZm9ya251bSk7CitleHRlcm4gdm9pZCBtZHJlZ2lzdGVyc3luYyhTTWdyUmVsYXRpb24g cmVsbiwgRm9ya051bWJlciBmb3JrbnVtKTsKIAogZXh0ZXJuIHZvaWQgRm9yZ2V0RGF0YWJh c2VTeW5jUmVxdWVzdHMoT2lkIGRiaWQpOwogZXh0ZXJuIHZvaWQgRHJvcFJlbGF0aW9uRmls ZXMoUmVsRmlsZUxvY2F0b3IgKmRlbHJlbHMsIGludCBuZGVscmVscywgYm9vbCBpc1JlZG8p OwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9zbWdyLmggYi9zcmMvaW5jbHVk ZS9zdG9yYWdlL3NtZ3IuaAppbmRleCBhOWExNzlhYWJhYy4uY2M1YTkxZGM2MjQgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oCisrKyBiL3NyYy9pbmNsdWRlL3N0 b3JhZ2Uvc21nci5oCkBAIC0xMDcsNiArMTA3LDcgQEAgZXh0ZXJuIEJsb2NrTnVtYmVyIHNt Z3JuYmxvY2tzX2NhY2hlZChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVt KTsKIGV4dGVybiB2b2lkIHNtZ3J0cnVuY2F0ZShTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051 bWJlciAqZm9ya251bSwKIAkJCQkJCSBpbnQgbmZvcmtzLCBCbG9ja051bWJlciAqbmJsb2Nr cyk7CiBleHRlcm4gdm9pZCBzbWdyaW1tZWRzeW5jKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3Jr TnVtYmVyIGZvcmtudW0pOworZXh0ZXJuIHZvaWQgc21ncnJlZ2lzdGVyc3luYyhTTWdyUmVs YXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKTsKIGV4dGVybiB2b2lkIEF0RU9YYWN0 X1NNZ3Iodm9pZCk7CiBleHRlcm4gYm9vbCBQcm9jZXNzQmFycmllclNtZ3JSZWxlYXNlKHZv aWQpOwogCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCBi L3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4IGRiYTM0OThhMTNlLi44 NWI4NDkxZmQ0OSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKQEAgLTMyNyw2ICsz MjcsOCBAQCBCdWlsZEFjY3VtdWxhdG9yCiBCdWlsdGluU2NyaXB0CiBCdWxrSW5zZXJ0U3Rh dGUKIEJ1bGtJbnNlcnRTdGF0ZURhdGEKK0J1bGtXcml0ZUJ1ZmZlcgorQnVsa1dyaXRlU3Rh dGUKIENBQ0hFU0lHTgogQ0FDX3N0YXRlCiBDQ0Zhc3RFcXVhbEZOCkBAIC0yMDA1LDYgKzIw MDcsNyBAQCBQZW5kaW5nRnN5bmNFbnRyeQogUGVuZGluZ1JlbERlbGV0ZQogUGVuZGluZ1Jl bFN5bmMKIFBlbmRpbmdVbmxpbmtFbnRyeQorUGVuZGluZ1dyaXRlCiBQZW5kaW5nV3JpdGVi YWNrCiBQZXJMb2NrVGFnRW50cnkKIFBlcmxJbnRlcnByZXRlcgotLSAKMi4zOS4yCgo= --------------DvqAffjbOhl3jxnP12IOUw9l--