Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kwIWI-0001Qr-07 for pgsql-hackers@arkaria.postgresql.org; Mon, 04 Jan 2021 05:35:06 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kwIWG-0004RO-Ol for pgsql-hackers@arkaria.postgresql.org; Mon, 04 Jan 2021 05:35:04 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kwIWG-0004RH-4a for pgsql-hackers@lists.postgresql.org; Mon, 04 Jan 2021 05:35:04 +0000 Received: from oss.nttdata.com ([49.212.34.109]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kwIW7-0006B0-SA for pgsql-hackers@postgresql.org; Mon, 04 Jan 2021 05:35:03 +0000 Received: from oss.nttdata.com (localhost [127.0.0.1]) by oss.nttdata.com (Postfix) with ESMTP id E455E623EC; Mon, 4 Jan 2021 14:34:50 +0900 (JST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.102.3 at oss.nttdata.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_8f8bf0e3c818b3b2e47212e92f9f6c6f" Date: Mon, 04 Jan 2021 14:34:50 +0900 From: torikoshia To: Kasahara Tatsuhito Cc: Tom Lane , Fujii Masao , Georgios Kokolatos , PostgreSQL-development Subject: Re: Get memory contexts of an arbitrary backend process In-Reply-To: References: <0271f440ac77f2a4180e0e56ebd944d1@oss.nttdata.com> <270ec80dbbebfb5c6f2b9fdd7a7858b5@oss.nttdata.com> <160502083340.7362.4386116585349115146.pgcf@coridan.postgresql.org> <064d510f2d33edc37dfd6b8f3b6bd30e@oss.nttdata.com> <1685539.1606959410@sss.pgh.pa.us> <83ff0aff04fffc95cbd1fc1637a0fccc@oss.nttdata.com> <28e1feb71b94ac9918830bc4a0c1844f@oss.nttdata.com> Message-ID: <9a59401241e9269254e70c8e0ef1cc7a@oss.nttdata.com> X-Sender: torikoshia@oss.nttdata.com User-Agent: Roundcube Webmail/1.1.9 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --=_8f8bf0e3c818b3b2e47212e92f9f6c6f Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed On Fri, Dec 25, 2020 at 6:08 PM Kasahara Tatsuhito wrote: Thanks for reviewing and kind suggestion! >> Attached a rewritten patch. > Thanks for updating patch. > > But when I had applyed the patch to the current HEAD and did make, I > got an error due to duplicate OIDs. > You need to rebase the patch. Assigned another OID. >> Accordingly, I also slightly modified the basic design as below. >> >> --- >> # Communication flow between the dumper and the requester >> - (1) When requesting memory context dumping, the dumper changes >> the struct on the shared memory state from 'ACCEPTABLE' to >> 'REQUESTING'. >> - (2) The dumper sends the signal to the dumper process and wait on >> the latch. >> - (3) When the dumper noticed the signal, it changes the state to >> 'DUMPING'. >> - (4) When the dumper completes dumping, it changes the state to >> 'DONE' and set the latch. >> - (5) The requestor reads the dump file and shows it to the user. >> Finally, the requestor removes the dump file and reset the shared >> memory state to 'ACCEPTABLE'. >> >> # Query cancellation >> - When the requestor cancels dumping, e.g. signaling using ctrl-C, >> the requestor changes the state of the shared memory to 'CANCELING'. >> - The dumper checks the state when it tries to change the state to >> 'DONE' at (4), and if the state is 'CANCELING', it initializes the >> dump file and reset the shared memory state to 'ACCEPTABLE'. >> >> # Cleanup dump file and the shared memory >> - In the normal case, the dumper removes the dump file and resets >> the shared memory entry as described in (5). >> - When something like query cancellation or process termination >> happens on the dumper after (1) and before (3), in other words, >> the state is 'REQUESTING', the requestor does the cleanup. >> - When something happens on the dumper or the requestor after (3) >> and before (4), in other words, the state is 'DUMPING', the dumper >> does the cleanup. Specifically, if the requestor cancels the query, >> it just changes the state to 'CANCELING' and the dumper notices it >> and cleans up things later. >> OTOH, when the dumper fails to dump, it cleans up the dump file and >> reset the shared memory state. >> - When something happens on the requestor after (4), i.e., the state >> is 'DONE', the requestor does the cleanup. >> - In the case of receiving SIGKILL or power failure, all dump files >> are removed in the crash recovery process. >> --- > If the dumper is terminated before it dumps, the requestor will appear > to enter an > infinite loop because the status of mcxtdumpShmem will not change. > The following are the steps to reproduce. > >  - session1 >    BEGIN; LOCK TABLE t; >    - session2 >      SELECT * FROM t; -- wait >      - session3 >        select pg_get_target_backend_memory_contexts(); > -- wait >  - session1 >    select pg_terminate_backend(); -- kill session2 >      - session3 waits forever. > > Therefore, you may need to set mcxtdumpShmem->dump_status to > MCXTDUMPSTATUS_CANCELING > or other status before the dumper terminates. In this case, it may be difficult for the dumper to change dump_status because it's waiting for latch and dump_memory_contexts() is not called yet. Instead, it's possible for the requestor to check the existence of the dumper process periodically during waiting. I added this logic to the attached patch. > Also, although I have not been able to reproduce it, I believe that > with the current design, > if the requestor disappears right after the dumper dumps the memory > information, > the dump file will remain. > Since the current design appears to allow only one requestor per > instance, when the requestor > requests a dump, it might be a good idea to delete any remaining dump > files, if any. Although I'm not sure when the dump file remains, deleting any remaining dump files seems good for safety. I also added this idea to the attached patch. > The following are comments on the code. > > +   proc = BackendPidGetProc(dst_pid); > + > +   if (proc == NULL) > +   { > +       ereport(WARNING, > +               (errmsg("PID %d is not a PostgreSQL server process", > dst_pid))); > + > +       return (Datum) 1; > +   } > For now, background writer, checkpointer and WAL writer are belong to > the auxiliary process. > Therefore, if we specify the PIDs of these processes for > pg_get_target_backend_memory_contexts(), > "PID xxxx is not a PostgreSQL server process" whould be outoput. > This confuses the user. > How about use AuxiliaryPidGetProc() to determine these processes? Thanks and I modified the patch to output the below message when it's an auxiliary process. | PID %d is not a PostgreSQL backend process but an auxiliary process. > > +               ereport(INFO, > +                   (errmsg("The request has failed and now PID %d is > requsting dumping.", > +                       mcxtdumpShmem->src_pid))); > + > +               LWLockRelease(McxtDumpLock); > You can release LWLock before ereport. Modified to release the lock before ereport. > +   Assert(mcxtdumpShmem->dump_status = MCXTDUMPSTATUS_REQUESTING); > typo? > It might be "mcxtdumpShmem->dump_status == MCXTDUMPSTATUS_REQUESTING". Ops, it's a serious typo. Fixed it. > +           ereport(INFO, > +                   (errmsg("PID %d is looked up by another process", > pid))); > This message is not accurate. > Because, in the current design, only one session can request a dump, > so if there are multiple requests, this message will be output even if > the > request is for a PID that is not looked up. Exactly. Modified the message as below. | Only one session can dump at a time and another session is dumping currently. > +   if (fpout == NULL) > +   { > +       ereport(LOG, > +               (errcode_for_file_access(), > +                errmsg("could not write memory context file \"%s\": > %m", > +                       dumpfile))); > It would be better to use "dump file" instead of "memory context file". > > +static void > +McxtReqKill(int code, Datum arg) > The function McxtReqKill looks like it should have a different name. > (Since it doesn't do any kill). > How about McxtReqcCleanup or something similar? Thanks for your idea and I changed the name to McxtReqCleanup. Regards, --=_8f8bf0e3c818b3b2e47212e92f9f6c6f Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v6-0001-Add-pg_get_target_backend_memory_contexts-to-coll.patch Content-Disposition: attachment; filename=v6-0001-Add-pg_get_target_backend_memory_contexts-to-coll.patch; size=34426 RnJvbSBkN2Q5OWE1Mjc4YzUzM2NlYWU0NjViNjczYjFkNjlmNmNlNTFlZTg5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBdHN1c2hpIFRvcmlrb3NoaSA8dG9yaWtvc2hpYUBvc3MubnR0 ZGF0YS5jb20+CkRhdGU6IE1vbiwgNCBKYW4gMjAyMSAxMjo0MzoxOCArMDkwMApTdWJqZWN0OiBb UEFUQ0ggdjZdIEFmdGVyIGNvbW1pdCAzZTk4YzBiYWZiMjhkZSwgd2UgY2FuIGRpc3BsYXkgdGhl IHVzYWdlIG9mCiB0aGUgbWVtb3J5IGNvbnRleHRzIHVzaW5nIHBnX2JhY2tlbmRfbWVtb3J5X2Nv bnRleHRzIHN5c3RlbSB2aWV3LiBIb3dldmVyLAogaXRzIHRhcmdldCBpcyBsaW1pdGVkIHRvIHRo ZSBwcm9jZXNzIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IHNlc3Npb24uIFRoaXMKIHBhdGNoIGlu dHJvZHVjZXMgcGdfZ2V0X3RhcmdldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cygpIGFuZCBtYWtl cyBpdAogcG9zc2libGUgdG8gY29sbGVjdCBtZW1vcnkgY29udGV4dHMgb2YgdGhlIHNwZWNpZmll ZCBwcm9jZXNzLgoKLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMgICAgICAg ICAgICB8ICAgNyArCiBzcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV92aWV3cy5zcWwgICAgICAg ICB8ICAgMyArLQogc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wZ3N0YXQuYyAgICAgICAgICAgICAg fCAgIDMgKwogc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vYmFzZWJhY2t1cC5jICAgICAgICAgfCAg IDMgKwogc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5jICAgICAgICAgICAgICAgfCAgIDIg Kwogc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvcHJvY3NpZ25hbC5jICAgICAgICAgfCAgIDQgKwog c3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL2x3bG9ja25hbWVzLnR4dCAgICAgfCAgIDEgKwogc3Jj L2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jICAgICAgICAgICAgICAgICAgfCAgIDUgKwogc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L21jeHRmdW5jcy5jICAgICAgICAgICAgfCA3MzAgKysrKysrKysrKysr KysrKysrLQogc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9nbG9iYWxzLmMgICAgICAgICAgICAgfCAg IDEgKwogc3JjL2Jpbi9pbml0ZGIvaW5pdGRiLmMgICAgICAgICAgICAgICAgICAgICAgfCAgIDMg Ky0KIHNyYy9iaW4vcGdfYmFzZWJhY2t1cC90LzAxMF9wZ19iYXNlYmFja3VwLnBsIHwgICA0ICst CiBzcmMvYmluL3BnX3Jld2luZC9maWxlbWFwLmMgICAgICAgICAgICAgICAgICB8ICAgMyArCiBz cmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0ICAgICAgICAgICAgICB8ICAxMiArLQogc3Jj L2luY2x1ZGUvbWlzY2FkbWluLmggICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL2lu Y2x1ZGUvcGdzdGF0LmggICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMgKy0KIHNyYy9pbmNs dWRlL3N0b3JhZ2UvcHJvY3NpZ25hbC5oICAgICAgICAgICAgIHwgICAxICsKIHNyYy9pbmNsdWRl L3V0aWxzL21jeHRmdW5jcy5oICAgICAgICAgICAgICAgIHwgIDQ0ICsrCiAxOCBmaWxlcyBjaGFu Z2VkLCA4MDkgaW5zZXJ0aW9ucygrKSwgMjEgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2 NDQgc3JjL2luY2x1ZGUvdXRpbHMvbWN4dGZ1bmNzLmgKCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9n LmMKaW5kZXggZWRlOTNhZDdmZC4uNGNhYjQ3YTYxZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv YWNjZXNzL3RyYW5zYW0veGxvZy5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hs b2cuYwpAQCAtNzMsNiArNzMsNyBAQAogI2luY2x1ZGUgInN0b3JhZ2Uvc3luYy5oIgogI2luY2x1 ZGUgInV0aWxzL2J1aWx0aW5zLmgiCiAjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCisjaW5jbHVkZSAi dXRpbHMvbWN4dGZ1bmNzLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRl ICJ1dGlscy9wc19zdGF0dXMuaCIKICNpbmNsdWRlICJ1dGlscy9yZWxtYXBwZXIuaCIKQEAgLTY5 OTMsNiArNjk5NCwxMiBAQCBTdGFydHVwWExPRyh2b2lkKQogCQkgKi8KIAkJcGdzdGF0X3Jlc2V0 X2FsbCgpOwogCisJCS8qCisJCSAqIFJlc2V0IGR1bXAgZmlsZXMgaW4gcGdfbWVtdXNhZ2UsIGJl Y2F1c2UgdGFyZ2V0IHByb2Nlc3NlcyBkbworCQkgKiBub3QgZXhpc3QgYW55IG1vcmUuCisJCSAq LworCQlSZW1vdmVNZW1jeHRGaWxlKDApOworCiAJCS8qCiAJCSAqIElmIHRoZXJlIHdhcyBhIGJh Y2t1cCBsYWJlbCBmaWxlLCBpdCdzIGRvbmUgaXRzIGpvYiBhbmQgdGhlIGluZm8KIAkJICogaGFz IG5vdyBiZWVuIHByb3BhZ2F0ZWQgaW50byBwZ19jb250cm9sLiAgV2UgbXVzdCBnZXQgcmlkIG9m IHRoZQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmlld3Muc3FsIGIv c3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmlld3Muc3FsCmluZGV4IGFiNDYwM2M2OWIuLjgx NzY2OWNkNGYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lzdGVtX3ZpZXdzLnNx bAorKysgYi9zcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV92aWV3cy5zcWwKQEAgLTU1OCw3ICs1 NTgsOCBAQCBDUkVBVEUgVklFVyBwZ19iYWNrZW5kX21lbW9yeV9jb250ZXh0cyBBUwogICAgIFNF TEVDVCAqIEZST00gcGdfZ2V0X2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzKCk7CiAKIFJFVk9LRSBB TEwgT04gcGdfYmFja2VuZF9tZW1vcnlfY29udGV4dHMgRlJPTSBQVUJMSUM7Ci1SRVZPS0UgRVhF Q1VURSBPTiBGVU5DVElPTiBwZ19nZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMoKSBGUk9NIFBV QkxJQzsKK1JFVk9LRSBFWEVDVVRFIE9OIEZVTkNUSU9OIHBnX2dldF9iYWNrZW5kX21lbW9yeV9j b250ZXh0cyBGUk9NIFBVQkxJQzsKK1JFVk9LRSBFWEVDVVRFIE9OIEZVTkNUSU9OIHBnX2dldF90 YXJnZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMgRlJPTSBQVUJMSUM7CiAKIC0tIFN0YXRpc3Rp Y3Mgdmlld3MKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wZ3N0YXQuYyBi L3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvcGdzdGF0LmMKaW5kZXggM2YyNGEzM2VmMS4uOGViMmQw NjJiMCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wZ3N0YXQuYworKysgYi9z cmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bnc3RhdC5jCkBAIC00MDQ1LDYgKzQwNDUsOSBAQCBwZ3N0 YXRfZ2V0X3dhaXRfaXBjKFdhaXRFdmVudElQQyB3KQogCQljYXNlIFdBSVRfRVZFTlRfWEFDVF9H Uk9VUF9VUERBVEU6CiAJCQlldmVudF9uYW1lID0gIlhhY3RHcm91cFVwZGF0ZSI7CiAJCQlicmVh azsKKwkJY2FzZSBXQUlUX0VWRU5UX0RVTVBfTUVNT1JZX0NPTlRFWFQ6CisJCQlldmVudF9uYW1l ID0gIkR1bXBNZW1vcnlDb250ZXh0IjsKKwkJCWJyZWFrOwogCQkJLyogbm8gZGVmYXVsdCBjYXNl LCBzbyB0aGF0IGNvbXBpbGVyIHdpbGwgd2FybiAqLwogCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvcmVwbGljYXRpb24vYmFzZWJhY2t1cC5jIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24v YmFzZWJhY2t1cC5jCmluZGV4IDBmNTQ2MzU1NTAuLmM2N2U3MWQ3OWIgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL3JlcGxpY2F0aW9uL2Jhc2ViYWNrdXAuYworKysgYi9zcmMvYmFja2VuZC9yZXBs aWNhdGlvbi9iYXNlYmFja3VwLmMKQEAgLTE4NCw2ICsxODQsOSBAQCBzdGF0aWMgY29uc3QgY2hh ciAqY29uc3QgZXhjbHVkZURpckNvbnRlbnRzW10gPQogCS8qIENvbnRlbnRzIHplcm9lZCBvbiBz dGFydHVwLCBzZWUgU3RhcnR1cFNVQlRSQU5TKCkuICovCiAJInBnX3N1YnRyYW5zIiwKIAorCS8q IFNraXAgbWVtb3J5IGNvbnRleHQgZHVtcCBmaWxlcy4gKi8KKwkicGdfbWVtdXNhZ2UiLAorCiAJ LyogZW5kIG9mIGxpc3QgKi8KIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3Rv cmFnZS9pcGMvaXBjaS5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5jCmluZGV4IGY5 YmJlOTdiNTAuLjE4YTFkZDVhNzQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBj L2lwY2kuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMKQEAgLTQ1LDYgKzQ1 LDcgQEAKICNpbmNsdWRlICJzdG9yYWdlL3Byb2NzaWduYWwuaCIKICNpbmNsdWRlICJzdG9yYWdl L3NpbnZhbGFkdC5oIgogI2luY2x1ZGUgInN0b3JhZ2Uvc3Bpbi5oIgorI2luY2x1ZGUgInV0aWxz L21jeHRmdW5jcy5oIgogI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKIAogLyogR1VDcyAqLwpA QCAtMjY3LDYgKzI2OCw3IEBAIENyZWF0ZVNoYXJlZE1lbW9yeUFuZFNlbWFwaG9yZXModm9pZCkK IAlCVHJlZVNobWVtSW5pdCgpOwogCVN5bmNTY2FuU2htZW1Jbml0KCk7CiAJQXN5bmNTaG1lbUlu aXQoKTsKKwlNY3h0RHVtcFNobWVtSW5pdCgpOwogCiAjaWZkZWYgRVhFQ19CQUNLRU5ECiAKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NzaWduYWwuYyBiL3NyYy9iYWNr ZW5kL3N0b3JhZ2UvaXBjL3Byb2NzaWduYWwuYwppbmRleCA1ODNlZmFlY2ZmLi4xMDZlMTI1Y2My IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9jc2lnbmFsLmMKKysrIGIv c3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvcHJvY3NpZ25hbC5jCkBAIC0yOCw2ICsyOCw3IEBACiAj aW5jbHVkZSAic3RvcmFnZS9zaG1lbS5oIgogI2luY2x1ZGUgInN0b3JhZ2Uvc2ludmFsLmgiCiAj aW5jbHVkZSAidGNvcC90Y29wcHJvdC5oIgorI2luY2x1ZGUgInV0aWxzL21jeHRmdW5jcy5oIgog CiAvKgogICogVGhlIFNJR1VTUjEgc2lnbmFsIGlzIG11bHRpcGxleGVkIHRvIHN1cHBvcnQgc2ln bmFsaW5nIG11bHRpcGxlIGV2ZW50CkBAIC01NjcsNiArNTY4LDkgQEAgcHJvY3NpZ25hbF9zaWd1 c3IxX2hhbmRsZXIoU0lHTkFMX0FSR1MpCiAJaWYgKENoZWNrUHJvY1NpZ25hbChQUk9DU0lHX0JB UlJJRVIpKQogCQlIYW5kbGVQcm9jU2lnbmFsQmFycmllckludGVycnVwdCgpOwogCisJaWYgKENo ZWNrUHJvY1NpZ25hbChQUk9DU0lHX0RVTVBfTUVNQ1hUKSkKKwkJSGFuZGxlUHJvY1NpZ25hbER1 bXBNZW1vcnlDb250ZXh0KCk7CisKIAlpZiAoQ2hlY2tQcm9jU2lnbmFsKFBST0NTSUdfUkVDT1ZF UllfQ09ORkxJQ1RfREFUQUJBU0UpKQogCQlSZWNvdmVyeUNvbmZsaWN0SW50ZXJydXB0KFBST0NT SUdfUkVDT1ZFUllfQ09ORkxJQ1RfREFUQUJBU0UpOwogCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9zdG9yYWdlL2xtZ3IvbHdsb2NrbmFtZXMudHh0IGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdy L2x3bG9ja25hbWVzLnR4dAppbmRleCA3NzQyOTJmZDk0Li42YjRmZjZmMDhiIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvbHdsb2NrbmFtZXMudHh0CisrKyBiL3NyYy9iYWNr ZW5kL3N0b3JhZ2UvbG1nci9sd2xvY2tuYW1lcy50eHQKQEAgLTUzLDMgKzUzLDQgQEAgWGFjdFRy dW5jYXRpb25Mb2NrCQkJCQk0NAogIyA0NSB3YXMgWGFjdFRydW5jYXRpb25Mb2NrIHVudGlsIHJl bW92YWwgb2YgQmFja2VuZFJhbmRvbUxvY2sKIFdyYXBMaW1pdHNWYWN1dW1Mb2NrCQkJCTQ2CiBO b3RpZnlRdWV1ZVRhaWxMb2NrCQkJCQk0NworTWN4dER1bXBMb2NrCQkJCQk0OApkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jIGIvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jl cy5jCmluZGV4IGRmYTBkNjg1YTguLmUwN2VjYzQzZjcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3Rjb3AvcG9zdGdyZXMuYworKysgYi9zcmMvYmFja2VuZC90Y29wL3Bvc3RncmVzLmMKQEAgLTc2 LDYgKzc2LDcgQEAKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCiAjaW5jbHVkZSAidGNvcC91 dGlsaXR5LmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCisjaW5jbHVkZSAidXRpbHMv bWN4dGZ1bmNzLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGls cy9wc19zdGF0dXMuaCIKICNpbmNsdWRlICJ1dGlscy9zbmFwbWdyLmgiCkBAIC01NDAsNiArNTQx LDEwIEBAIFByb2Nlc3NDbGllbnRSZWFkSW50ZXJydXB0KGJvb2wgYmxvY2tlZCkKIAkJLyogUHJv Y2VzcyBub3RpZnkgaW50ZXJydXB0cywgaWYgYW55ICovCiAJCWlmIChub3RpZnlJbnRlcnJ1cHRQ ZW5kaW5nKQogCQkJUHJvY2Vzc05vdGlmeUludGVycnVwdCgpOworCisJCS8qIFByb2Nlc3MgbWVt b3J5IGNvbnRleHRzIGR1bXAgaW50ZXJydXB0cywgaWYgYW55ICovCisJCWlmIChQcm9jU2lnbmFs RHVtcE1lbW9yeUNvbnRleHRQZW5kaW5nKQorCQkJUHJvY2Vzc0R1bXBNZW1vcnlDb250ZXh0SW50 ZXJydXB0KCk7CiAJfQogCWVsc2UgaWYgKFByb2NEaWVQZW5kaW5nKQogCXsKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9tY3h0ZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9tY3h0ZnVuY3MuYwppbmRleCBjMDJmYTQ3NTUwLi5jNTJhZTJhZWEyIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC91dGlscy9hZHQvbWN4dGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L21jeHRmdW5jcy5jCkBAIC0xNSwzMCArMTUsMTAwIEBACiAKICNpbmNsdWRlICJwb3N0Z3Jl cy5oIgogCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lu Y2x1ZGUgImNvbW1vbi9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgogI2luY2x1ZGUg Im1pc2NhZG1pbi5oIgogI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgiCisjaW5jbHVkZSAicGdzdGF0 LmgiCisjaW5jbHVkZSAic3RvcmFnZS9pcGMuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2xhdGNoLmgi CisjaW5jbHVkZSAic3RvcmFnZS9wcm9jLmgiCisjaW5jbHVkZSAic3RvcmFnZS9wcm9jYXJyYXku aCIKKyNpbmNsdWRlICJzdG9yYWdlL3Byb2NzaWduYWwuaCIKKyNpbmNsdWRlICJzdG9yYWdlL3No bWVtLmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9tY3h0 ZnVuY3MuaCIKKworLyogVGhlIG1heCBieXRlcyBmb3Igc2hvd2luZyBuYW1lcyBhbmQgaWRlbnRp ZmllcnMgb2YgTWVtb3J5Q29udGV4dC4gKi8KKyNkZWZpbmUgTUVNT1JZX0NPTlRFWFRfRElTUExB WV9TSVpFCTEwMjQKKworLyogTnVtYmVyIG9mIGNvbHVtbnMgaW4gcGdfYmFja2VuZF9tZW1vcnlf Y29udGV4dHMgdmlldyAqLworI2RlZmluZSBQR19HRVRfQkFDS0VORF9NRU1PUllfQ09OVEVYVFNf Q09MUwk5CisKKy8qIFNoYXJlZCBtZW1vcnkgc3RydWN0IGZvciBtYW5hZ2luZyB0aGUgc3RhdHVz IG9mIG1lbW9yeSBjb250ZXh0IGR1bXAuICovCitzdGF0aWMgbWN4dGR1bXBTaG1lbVN0cnVjdCAq bWN4dGR1bXBTaG1lbSA9ICBOVUxMOwogCi0vKiAtLS0tLS0tLS0tCi0gKiBUaGUgbWF4IGJ5dGVz IGZvciBzaG93aW5nIGlkZW50aWZpZXJzIG9mIE1lbW9yeUNvbnRleHQuCi0gKiAtLS0tLS0tLS0t CisvKgorICogTWN4dFJlcUNsZWFudXAKKyAqCQlFcnJvciBjbGVhbnVwIGNhbGxiYWNrIGZvciBt ZW1vcnkgY29udGV4dCByZXF1ZXN0b3IuCiAgKi8KLSNkZWZpbmUgTUVNT1JZX0NPTlRFWFRfSURF TlRfRElTUExBWV9TSVpFCTEwMjQKK3N0YXRpYyB2b2lkCitNY3h0UmVxQ2xlYW51cChpbnQgY29k ZSwgRGF0dW0gYXJnKQoreworCWludAkJZHN0X3BpZCA9IERhdHVtR2V0SW50MzIoYXJnKTsKKwor CUxXTG9ja0FjcXVpcmUoTWN4dER1bXBMb2NrLCBMV19FWENMVVNJVkUpOworCisJaWYgKG1jeHRk dW1wU2htZW0tPnNyY19waWQgIT0gTXlQcm9jUGlkKQorCXsKKwkJLyoKKwkJICogSWYgdGhlIHJl cXVlc3RvciBpcyBub3QgbWUsIHNpbXBseSBleGl0LgorCQkgKi8KKwkJTFdMb2NrUmVsZWFzZShN Y3h0RHVtcExvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKG1jeHRkdW1wU2htZW0tPmR1bXBf c3RhdHVzID09IE1DWFREVU1QU1RBVFVTX1JFUVVFU1RJTkcpCisJeworCQkvKgorCQkgKiBTaW5j ZSB0aGUgZHVtcGVyIGhhcyBub3QgcmVjZWl2ZWQgdGhlIGR1bXAgb3JkZXIgeWV0LCBjbGVhbiB1 cAorCQkgKiB0aGluZ3MgYnkgbXlzZWxmLgorCQkgKi8KKwkJbWN4dGR1bXBTaG1lbS0+ZHN0X3Bp ZCA9IDA7CisJCW1jeHRkdW1wU2htZW0tPnNyY19waWQgPSAwOworCQltY3h0ZHVtcFNobWVtLT5k dW1wX3N0YXR1cyA9IE1DWFREVU1QU1RBVFVTX0FDQ0VQVEFCTEU7CisJfQorCWVsc2UgaWYgKG1j eHRkdW1wU2htZW0tPmR1bXBfc3RhdHVzID09IE1DWFREVU1QU1RBVFVTX0RVTVBJTkcpCisJewor CQkvKgorCQkgKiBTaW5jZSB0aGUgZHVtcGVyIGhhcyByZWNlaXZlZCB0aGUgcmVxdWVzdCBhbHJl YWR5LAorCQkgKiByZXF1ZXN0b3IganVzdCBjaGFuZ2UgdGhlIHN0YXR1cyBhbmQgdGhlIGR1bXBl ciBjbGVhbnMgdXAKKwkJICogdGhpbmdzIGxhdGVyLgorCQkgKi8KKwkJbWN4dGR1bXBTaG1lbS0+ ZHVtcF9zdGF0dXMgPSBNQ1hURFVNUFNUQVRVU19DQU5DRUxJTkc7CisJfQorCWVsc2UgaWYgKG1j eHRkdW1wU2htZW0tPmR1bXBfc3RhdHVzID09IE1DWFREVU1QU1RBVFVTX0RPTkUpCisJeworCQkv KgorCQkgKiBTaW5jZSB0aGUgZHVtcGVyIGhhcyBhbHJlYWR5IGZpbmlzaGVkIGR1bXBpbmcsIGNs ZWFuIHVwIHRoaW5ncworCQkgKiBieSBteXNlbGYuCisJCSAqLworCQltY3h0ZHVtcFNobWVtLT5k c3RfcGlkID0gMDsKKwkJbWN4dGR1bXBTaG1lbS0+c3JjX3BpZCA9IDA7CisJCW1jeHRkdW1wU2ht ZW0tPmR1bXBfc3RhdHVzID0gTUNYVERVTVBTVEFUVVNfQUNDRVBUQUJMRTsKKworCQlSZW1vdmVN ZW1jeHRGaWxlKGRzdF9waWQpOworCX0KKwlMV0xvY2tSZWxlYXNlKE1jeHREdW1wTG9jayk7Cit9 CiAKIC8qCiAgKiBQdXRNZW1vcnlDb250ZXh0c1N0YXRzVHVwbGVTdG9yZQogICoJCU9uZSByZWN1 cnNpb24gbGV2ZWwgZm9yIHBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cy4KKyAqCisgKiBO b3RlOiBXaGVuIGZwb3V0IGlzIG5vdCBOVUxMLCBmZXJyb3IoKSBjaGVjayBtdXN0IGJlIGRvbmUg YnkgdGhlIGNhbGxlci4KICAqLwogc3RhdGljIHZvaWQKIFB1dE1lbW9yeUNvbnRleHRzU3RhdHNU dXBsZVN0b3JlKFR1cGxlc3RvcmVzdGF0ZSAqdHVwc3RvcmUsCiAJCQkJCQkJCVR1cGxlRGVzYyB0 dXBkZXNjLCBNZW1vcnlDb250ZXh0IGNvbnRleHQsCi0JCQkJCQkJCWNvbnN0IGNoYXIgKnBhcmVu dCwgaW50IGxldmVsKQorCQkJCQkJCQljb25zdCBjaGFyICpwYXJlbnQsIGludCBsZXZlbCwgRklM RSAqZnBvdXQpCiB7Ci0jZGVmaW5lIFBHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19DT0xT CTkKLQogCURhdHVtCQl2YWx1ZXNbUEdfR0VUX0JBQ0tFTkRfTUVNT1JZX0NPTlRFWFRTX0NPTFNd OwogCWJvb2wJCW51bGxzW1BHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19DT0xTXTsKKwlj aGFyCQljbGlwcGVkX2lkZW50W01FTU9SWV9DT05URVhUX0RJU1BMQVlfU0laRV07CiAJTWVtb3J5 Q29udGV4dENvdW50ZXJzIHN0YXQ7CiAJTWVtb3J5Q29udGV4dCBjaGlsZDsKIAljb25zdCBjaGFy ICpuYW1lOwpAQCAtNzQsMTQgKzE0NCwxMiBAQCBQdXRNZW1vcnlDb250ZXh0c1N0YXRzVHVwbGVT dG9yZShUdXBsZXN0b3Jlc3RhdGUgKnR1cHN0b3JlLAogCWlmIChpZGVudCkKIAl7CiAJCWludAkJ aWRsZW4gPSBzdHJsZW4oaWRlbnQpOwotCQljaGFyCQljbGlwcGVkX2lkZW50W01FTU9SWV9DT05U RVhUX0lERU5UX0RJU1BMQVlfU0laRV07Ci0KIAkJLyoKIAkJICogU29tZSBpZGVudGlmaWVycyBz dWNoIGFzIFNRTCBxdWVyeSBzdHJpbmcgY2FuIGJlIHZlcnkgbG9uZywKIAkJICogdHJ1bmNhdGUg b3ZlcnNpemUgaWRlbnRpZmllcnMuCiAJCSAqLwotCQlpZiAoaWRsZW4gPj0gTUVNT1JZX0NPTlRF WFRfSURFTlRfRElTUExBWV9TSVpFKQotCQkJaWRsZW4gPSBwZ19tYmNsaXBsZW4oaWRlbnQsIGlk bGVuLCBNRU1PUllfQ09OVEVYVF9JREVOVF9ESVNQTEFZX1NJWkUgLSAxKTsKKwkJaWYgKGlkbGVu ID49IE1FTU9SWV9DT05URVhUX0RJU1BMQVlfU0laRSkKKwkJCWlkbGVuID0gcGdfbWJjbGlwbGVu KGlkZW50LCBpZGxlbiwgTUVNT1JZX0NPTlRFWFRfRElTUExBWV9TSVpFIC0gMSk7CiAKIAkJbWVt Y3B5KGNsaXBwZWRfaWRlbnQsIGlkZW50LCBpZGxlbik7CiAJCWNsaXBwZWRfaWRlbnRbaWRsZW5d ID0gJ1wwJzsKQEAgLTEwMSwxOCArMTY5LDIwNyBAQCBQdXRNZW1vcnlDb250ZXh0c1N0YXRzVHVw bGVTdG9yZShUdXBsZXN0b3Jlc3RhdGUgKnR1cHN0b3JlLAogCXZhbHVlc1s2XSA9IEludDY0R2V0 RGF0dW0oc3RhdC5mcmVlc3BhY2UpOwogCXZhbHVlc1s3XSA9IEludDY0R2V0RGF0dW0oc3RhdC5m cmVlY2h1bmtzKTsKIAl2YWx1ZXNbOF0gPSBJbnQ2NEdldERhdHVtKHN0YXQudG90YWxzcGFjZSAt IHN0YXQuZnJlZXNwYWNlKTsKLQl0dXBsZXN0b3JlX3B1dHZhbHVlcyh0dXBzdG9yZSwgdHVwZGVz YywgdmFsdWVzLCBudWxscyk7CisKKwkvKgorCSAqIFNpbmNlIHBnX2dldF9iYWNrZW5kX21lbW9y eV9jb250ZXh0cygpIGlzIGNhbGxlZCBmcm9tIGxvY2FsIHByb2Nlc3MsCisJICogc2ltcGx5IHB1 dCB0dXBsZXMuCisJICovCisJaWYoZnBvdXQgPT0gTlVMTCkKKwkJdHVwbGVzdG9yZV9wdXR2YWx1 ZXModHVwc3RvcmUsIHR1cGRlc2MsIHZhbHVlcywgbnVsbHMpOworCisJLyoKKwkgKiBXcml0ZSBv dXQgdGhlIGN1cnJlbnQgbWVtb3J5IGNvbnRleHQgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YK KwkgKiAia2V5OiB2YWx1ZSIgcGFpcnMgdG8gdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSByZXF1 ZXN0b3IuCisJICovCisJZWxzZQorCXsKKwkJLyoKKwkJICogTWFrZSBlYWNoIG1lbW9yeSBjb250 ZXh0IGluZm9ybWF0aW9uIHN0YXJ0cyB3aXRoICdEJy4KKwkJICogVGhpcyBpcyBjaGVja2VkIGJ5 IHRoZSByZXF1ZXN0b3Igd2hlbiByZWFkaW5nIHRoZSBmaWxlLgorCQkgKi8KKwkJZnB1dGMoJ0Qn LCBmcG91dCk7CisKKwkJZnByaW50ZihmcG91dCwKKwkJCSJuYW1lOiAlcywgaWRlbnQ6ICVzLCBw YXJlbnQ6ICVzLCBsZXZlbDogJWQsIHRvdGFsX2J5dGVzOiAlbHUsIFwKKwkJCXRvdGFsX25ibG9j a3M6ICVsdSwgZnJlZV9ieXRlczogJWx1LCBmcmVlX2NodW5rczogJWx1LCB1c2VkX2J5dGVzOiAl bHUsXG4iLAorCQkJbmFtZSwKKwkJCWlkZW50ID8gY2xpcHBlZF9pZGVudCA6ICJub25lIiwKKwkJ CXBhcmVudCA/IHBhcmVudCA6ICJub25lIiwgbGV2ZWwsCisJCQlzdGF0LnRvdGFsc3BhY2UsCisJ CQlzdGF0Lm5ibG9ja3MsCisJCQlzdGF0LmZyZWVzcGFjZSwKKwkJCXN0YXQuZnJlZWNodW5rcywK KwkJCXN0YXQudG90YWxzcGFjZSAtIHN0YXQuZnJlZXNwYWNlKTsKKwl9CiAKIAlmb3IgKGNoaWxk ID0gY29udGV4dC0+Zmlyc3RjaGlsZDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4 dGNoaWxkKQogCXsKIAkJUHV0TWVtb3J5Q29udGV4dHNTdGF0c1R1cGxlU3RvcmUodHVwc3RvcmUs IHR1cGRlc2MsCi0JCQkJCQkJCSAgY2hpbGQsIG5hbWUsIGxldmVsICsgMSk7CisJCQkJCQkJCSAg Y2hpbGQsIG5hbWUsIGxldmVsICsgMSwgZnBvdXQpOworCX0KK30KKworLyoKKyAqIFNldHVwTWN4 dGR1bXBTaGVtCisgKiAJCVNldHVwIHNoYXJlZCBtZW1vcnkgc3RydWN0IGZvciBkdW1waW5nIHNw ZWNpZmllZCBQSUQuCisgKi8KK3N0YXRpYyB2b2lkCitTZXR1cE1jeHRkdW1wU2htZW0oaW50IHBp ZCkKK3sKKwkvKgorCSAqIFdlIG9ubHkgYWxsb3cgb25lIHNlc3Npb24gcGVyIHRhcmdldCBwcm9j ZXNzIHRvIHJlcXVlc3QgbWVtb3J5CisJICogY29udGV4dHMgZHVtcCBhdCBhIHRpbWUuCisJICog SWYgc29tZW9uZSB1c2VzIG1jeHRkdW1wU2htZW0sIHdhaXQgdW50aWwgaXQgd2FzIGNoYW5nZWQg dG8gYWNjZXB0YWJsZS4KKwkgKi8KKwl3aGlsZSAodHJ1ZSkKKwl7CisJCUxXTG9ja0FjcXVpcmUo TWN4dER1bXBMb2NrLCBMV19FWENMVVNJVkUpOworCisJCWlmIChtY3h0ZHVtcFNobWVtLT5kdW1w X3N0YXR1cyA9PSBNQ1hURFVNUFNUQVRVU19BQ0NFUFRBQkxFKQorCQl7CisJCQltY3h0ZHVtcFNo bWVtLT5kdW1wX3N0YXR1cyA9IE1DWFREVU1QU1RBVFVTX1JFUVVFU1RJTkc7CisJCQltY3h0ZHVt cFNobWVtLT5zcmNfcGlkID0gTXlQcm9jUGlkOworCQkJbWN4dGR1bXBTaG1lbS0+ZHN0X3BpZCA9 IHBpZDsKKworCQkJLyoKKwkJCSAqIER1bXAgZmlsZXMgc2hvdWxkIG5vdCBleGlzdCBub3csIGJ1 dCBkZWxldGUgYW55IG9mCisJCQkgKiB0aGVtIGp1c3QgaW4gY2FzZS4KKwkJCSAqCisJCQkgKiBO b3RlOiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2Ugb25seSBvbmUgc2Vzc2lvbiBjYW4KKwkJCSAq IHJlcXVlc3QgbWVtb3J5IGNvbnRleHRzIHBlciBpbnN0YW5jZS4KKwkJCSAqLworCQkJUmVtb3Zl TWVtY3h0RmlsZSgwKTsKKworCQkJTFdMb2NrUmVsZWFzZShNY3h0RHVtcExvY2spOworCisJCQly ZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJCQllcmVwb3J0KElORk8sCisJCQkJCShlcnJtc2co Ik9ubHkgb25lIHNlc3Npb24gY2FuIGR1bXAgYXQgYSB0aW1lIGFuZCBhbm90aGVyIHNlc3Npb24g aXMgZHVtcGluZyBjdXJyZW50bHkuIikpKTsKKworCQkJTFdMb2NrUmVsZWFzZShNY3h0RHVtcExv Y2spOworCisJCQlwZ191c2xlZXAoNTAwMDAwMEwpOworCQl9CisJfQorfQorCisvKgorICogUHV0 RHVtcGVkVmFsdWVzT25UdXBsZXN0b3JlCisgKgkJUmVhZCBzcGVjaWZpZWQgbWVtb3J5IGNvbnRl eHQgZHVtcCBmaWxlIGFuZCBwdXQgaXRzIHZhbHVlcworICoJCW9uIHRoZSB0dXBsZXN0b3JlLgor ICovCitzdGF0aWMgdm9pZAorUHV0RHVtcGVkVmFsdWVzT25UdXBsZXN0b3JlKGNoYXIgKmR1bXBm aWxlLCBUdXBsZXN0b3Jlc3RhdGUgKnR1cHN0b3JlLAorCQkJCQkJCQlUdXBsZURlc2MgdHVwZGVz YywgaW50IHBpZCkKK3sKKwlGSUxFCSAJKmZwaW47CisJaW50CQlmb3JtYXRfaWQ7CisKKwlpZiAo KGZwaW4gPSBBbGxvY2F0ZUZpbGUoZHVtcGZpbGUsICJyIikpID09IE5VTEwpCisJeworCQlpZiAo ZXJybm8gIT0gRU5PRU5UKQorCQkJZXJlcG9ydChMT0csIChlcnJjb2RlX2Zvcl9maWxlX2FjY2Vz cygpLAorCQkJCWVycm1zZygiY291bGQgbm90IG9wZW4gbWVtb3J5IGNvbnRleHQgZHVtcCBmaWxl IFwiJXNcIjogJW0iLAorCQkJCQlkdW1wZmlsZSkpKTsKIAl9CisKKwkvKiBWZXJpZnkgaXQncyBv ZiB0aGUgZXhwZWN0ZWQgZm9ybWF0LiAqLworCWlmIChmcmVhZCgmZm9ybWF0X2lkLCAxLCBzaXpl b2YoZm9ybWF0X2lkKSwgZnBpbikgIT0gc2l6ZW9mKGZvcm1hdF9pZCkgfHwKKwkJZm9ybWF0X2lk ICE9IFBHX01DWFRfRklMRV9GT1JNQVRfSUQpCisJeworCQllcmVwb3J0KFdBUk5JTkcsCisJCQkJ KGVycm1zZygiY29ycnVwdGVkIG1lbW9yeSBjb250ZXh0IGR1bXAgZmlsZSBcIiVzXCIiLCBkdW1w ZmlsZSkpKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFJlYWQgZHVtcCBmaWxlIGFuZCBwdXQg dmFsdWVzIG9uIHR1cGxlIHN0b3JlLiAqLworCXdoaWxlICh0cnVlKQorCXsKKwkJRGF0dW0JCXZh bHVlc1tQR19HRVRfQkFDS0VORF9NRU1PUllfQ09OVEVYVFNfQ09MU107CisJCWJvb2wJCW51bGxz W1BHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19DT0xTXTsKKwkJY2hhciAJCW5hbWVbTUVN T1JZX0NPTlRFWFRfRElTUExBWV9TSVpFXTsKKwkJY2hhciAJCXBhcmVudFtNRU1PUllfQ09OVEVY VF9ESVNQTEFZX1NJWkVdOworCQljaGFyIAkJY2xpcHBlZF9pZGVudFtNRU1PUllfQ09OVEVYVF9E SVNQTEFZX1NJWkVdOworCQlpbnQgCQlsZXZlbDsKKwkJU2l6ZQl0b3RhbF9ieXRlczsKKwkJU2l6 ZQl0b3RhbF9uYmxvY2tzOworCQlTaXplCWZyZWVfYnl0ZXM7CisJCVNpemUJZnJlZV9jaHVua3M7 CisJCVNpemUJdXNlZF9ieXRlczsKKworCQltZW1zZXQodmFsdWVzLCAwLCBzaXplb2YodmFsdWVz KSk7CisJCW1lbXNldChudWxscywgMCwgc2l6ZW9mKG51bGxzKSk7CisKKwkJc3dpdGNoIChmZ2V0 YyhmcGluKSkKKwkJeworCQkJLyogJ0QnCUEgbWVtb3J5IGNvbnRleHQgaW5mb3JtYXRpb24gZm9s bG93cyAqLworCQkJY2FzZSAnRCc6CisJCQkJaWYgKGZzY2FuZihmcGluLCAibmFtZTogJTEwMjNb XixdLCBpZGVudDogJTEwMjNbXixdLCBwYXJlbnQ6ICUxMDIzW14sXSwgXAorCQkJCQlsZXZlbDog JWQsIHRvdGFsX2J5dGVzOiAlbHUsIHRvdGFsX25ibG9ja3M6ICVsdSwgXAorCQkJCQlmcmVlX2J5 dGVzOiAlbHUsIGZyZWVfY2h1bmtzOiAlbHUsIHVzZWRfYnl0ZXM6ICVsdSxcbiIsCisJCQkJCW5h bWUsIGNsaXBwZWRfaWRlbnQsIHBhcmVudCwgJmxldmVsLCAmdG90YWxfYnl0ZXMsICZ0b3RhbF9u YmxvY2tzLAorCQkJCQkJJmZyZWVfYnl0ZXMsICZmcmVlX2NodW5rcywgJnVzZWRfYnl0ZXMpCisJ CQkJCSE9IFBHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19DT0xTKQorCQkJCXsKKwkJCQkJ ZXJlcG9ydChXQVJOSU5HLAorCQkJCQkJKGVycm1zZygiY29ycnVwdGVkIG1lbW9yeSBjb250ZXh0 IGR1bXAgZmlsZSBcIiVzXCIiLAorCQkJCQkJCWR1bXBmaWxlKSkpOworCQkJCQlnb3RvIGRvbmU7 CisJCQkJfQorCisJCQkJdmFsdWVzWzBdID0gQ1N0cmluZ0dldFRleHREYXR1bShuYW1lKTsKKwor CQkJCWlmIChzdHJjbXAoY2xpcHBlZF9pZGVudCwgIm5vbmUiKSkKKwkJCQkJdmFsdWVzWzFdID0g Q1N0cmluZ0dldFRleHREYXR1bShjbGlwcGVkX2lkZW50KTsKKwkJCQllbHNlCisJCQkJCW51bGxz WzFdID0gdHJ1ZTsKKworCQkJCWlmIChzdHJjbXAocGFyZW50LCAibm9uZSIpKQorCQkJCQl2YWx1 ZXNbMl0gPSBDU3RyaW5nR2V0VGV4dERhdHVtKHBhcmVudCk7CisJCQkJZWxzZQorCQkJCQludWxs c1syXSA9IHRydWU7CisKKwkJCQl2YWx1ZXNbM10gPSBJbnQzMkdldERhdHVtKGxldmVsKTsKKwkJ CQl2YWx1ZXNbNF0gPSBJbnQ2NEdldERhdHVtKHRvdGFsX2J5dGVzKTsKKwkJCQl2YWx1ZXNbNV0g PSBJbnQ2NEdldERhdHVtKHRvdGFsX25ibG9ja3MpOworCQkJCXZhbHVlc1s2XSA9IEludDY0R2V0 RGF0dW0oZnJlZV9ieXRlcyk7CisJCQkJdmFsdWVzWzddID0gSW50NjRHZXREYXR1bShmcmVlX2No dW5rcyk7CisJCQkJdmFsdWVzWzhdID0gSW50NjRHZXREYXR1bSh1c2VkX2J5dGVzKTsKKworCQkJ CXR1cGxlc3RvcmVfcHV0dmFsdWVzKHR1cHN0b3JlLCB0dXBkZXNjLCB2YWx1ZXMsIG51bGxzKTsK KwkJCQlicmVhazsKKworCQkJY2FzZSAnRSc6CisJCQkJZ290byBkb25lOworCisJCQlkZWZhdWx0 OgorCQkJCWVyZXBvcnQoV0FSTklORywKKwkJCQkJCShlcnJtc2coImNvcnJ1cHRlZCBtZW1vcnkg Y29udGV4dCBkdW1wIGZpbGUgXCIlc1wiIiwKKwkJCQkJCQlkdW1wZmlsZSkpKTsKKwkJCQlnb3Rv IGRvbmU7CisJCX0KKwl9Citkb25lOgorCUZyZWVGaWxlKGZwaW4pOworCXVubGluayhkdW1wZmls ZSk7CisKKwlMV0xvY2tBY3F1aXJlKE1jeHREdW1wTG9jaywgTFdfRVhDTFVTSVZFKTsKKworCUFz c2VydChtY3h0ZHVtcFNobWVtLT5zcmNfcGlkID09IE15UHJvY1BpZCk7CisKKwltY3h0ZHVtcFNo bWVtLT5kc3RfcGlkID0gMDsKKwltY3h0ZHVtcFNobWVtLT5zcmNfcGlkID0gMDsKKwltY3h0ZHVt cFNobWVtLT5kdW1wX3N0YXR1cyA9IE1DWFREVU1QU1RBVFVTX0FDQ0VQVEFCTEU7CisKKwlMV0xv Y2tSZWxlYXNlKE1jeHREdW1wTG9jayk7CiB9CiAKIC8qCiAgKiBwZ19nZXRfYmFja2VuZF9tZW1v cnlfY29udGV4dHMKLSAqCQlTUUwgU1JGIHNob3dpbmcgYmFja2VuZCBtZW1vcnkgY29udGV4dC4K KyAqCQlTUUwgU1JGIHNob3dpbmcgbG9jYWwgYmFja2VuZCBtZW1vcnkgY29udGV4dC4KICAqLwog RGF0dW0KIHBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cyhQR19GVU5DVElPTl9BUkdTKQpA QCAtMTQ4LDEwICs0MDUsNDUzIEBAIHBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cyhQR19G VU5DVElPTl9BUkdTKQogCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKIAogCVB1 dE1lbW9yeUNvbnRleHRzU3RhdHNUdXBsZVN0b3JlKHR1cHN0b3JlLCB0dXBkZXNjLAotCQkJCQkJ CQlUb3BNZW1vcnlDb250ZXh0LCBOVUxMLCAwKTsKKwkJCQkJCQlUb3BNZW1vcnlDb250ZXh0LCAi IiwgMCwgTlVMTCk7CisKKwkvKiBjbGVhbiB1cCBhbmQgcmV0dXJuIHRoZSB0dXBsZXN0b3JlICov CisJdHVwbGVzdG9yZV9kb25lc3RvcmluZyh0dXBzdG9yZSk7CisKKwlyZXR1cm4gKERhdHVtKSAw OworfQorCisvKgorICogcGdfZ2V0X3RhcmdldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cworICoJ CVNRTCBTUkYgc2hvd2luZyBzcGVjaWZpZWQgcHJvY2VzcydzIGJhY2tlbmQgbWVtb3J5IGNvbnRl eHQuCisgKi8KK0RhdHVtCitwZ19nZXRfdGFyZ2V0X2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzKFBH X0ZVTkNUSU9OX0FSR1MpCit7CisJaW50CQlkc3RfcGlkID0gUEdfR0VUQVJHX0lOVDMyKDApOwor CisJUmV0dXJuU2V0SW5mbyAqcnNpbmZvID0gKFJldHVyblNldEluZm8gKikgZmNpbmZvLT5yZXN1 bHRpbmZvOworCVR1cGxlRGVzYwl0dXBkZXNjOworCVR1cGxlc3RvcmVzdGF0ZSAqdHVwc3RvcmU7 CisJTWVtb3J5Q29udGV4dCBwZXJfcXVlcnlfY3R4OworCU1lbW9yeUNvbnRleHQgb2xkY29udGV4 dDsKKwljaGFyCQlkdW1wZmlsZVtNQVhQR1BBVEhdOworCVBHUFJPQwkgCSpwcm9jOworCVBnQmFj a2VuZFN0YXR1cyAqYmVlbnRyeTsKKworCWlmIChkc3RfcGlkID09IE15UHJvY1BpZCkKKwl7CisJ CXBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cyhmY2luZm8pOworCQlyZXR1cm4gKERhdHVt KSAwOworCX0KKworCXNucHJpbnRmKGR1bXBmaWxlLCBzaXplb2YoZHVtcGZpbGUpLCAiJXMvJWQi LCBQR19NRU1VU0FHRV9ESVIsIGRzdF9waWQpOworCisJLyogY2hlY2sgdG8gc2VlIGlmIGNhbGxl ciBzdXBwb3J0cyB1cyByZXR1cm5pbmcgYSB0dXBsZXN0b3JlICovCisJaWYgKHJzaW5mbyA9PSBO VUxMIHx8ICFJc0EocnNpbmZvLCBSZXR1cm5TZXRJbmZvKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJ CQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJIGVycm1zZygi c2V0LXZhbHVlZCBmdW5jdGlvbiBjYWxsZWQgaW4gY29udGV4dCB0aGF0IGNhbm5vdCBhY2NlcHQg YSBzZXQiKSkpOworCWlmICghKHJzaW5mby0+YWxsb3dlZE1vZGVzICYgU0ZSTV9NYXRlcmlhbGl6 ZSkpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9T VVBQT1JURUQpLAorCQkJCSBlcnJtc2coIm1hdGVyaWFsaXplIG1vZGUgcmVxdWlyZWQsIGJ1dCBp dCBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIGNvbnRleHQiKSkpOworCisJLyogQnVpbGQgYSB0dXBs ZSBkZXNjcmlwdG9yIGZvciBvdXIgcmVzdWx0IHR5cGUgKi8KKwlpZiAoZ2V0X2NhbGxfcmVzdWx0 X3R5cGUoZmNpbmZvLCBOVUxMLCAmdHVwZGVzYykgIT0gVFlQRUZVTkNfQ09NUE9TSVRFKQorCQll bG9nKEVSUk9SLCAicmV0dXJuIHR5cGUgbXVzdCBiZSBhIHJvdyB0eXBlIik7CisKKwlwZXJfcXVl cnlfY3R4ID0gcnNpbmZvLT5lY29udGV4dC0+ZWN4dF9wZXJfcXVlcnlfbWVtb3J5OworCW9sZGNv bnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocGVyX3F1ZXJ5X2N0eCk7CisKKwl0dXBzdG9y ZSA9IHR1cGxlc3RvcmVfYmVnaW5faGVhcCh0cnVlLCBmYWxzZSwgd29ya19tZW0pOworCXJzaW5m by0+cmV0dXJuTW9kZSA9IFNGUk1fTWF0ZXJpYWxpemU7CisJcnNpbmZvLT5zZXRSZXN1bHQgPSB0 dXBzdG9yZTsKKwlyc2luZm8tPnNldERlc2MgPSB0dXBkZXNjOworCisJTWVtb3J5Q29udGV4dFN3 aXRjaFRvKG9sZGNvbnRleHQpOworCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHRoZSB0YXJnZXQg cHJvY2VzcyBpcyBQb3N0Z3JlU1FMIGJhY2tlbmQgcHJvY2Vzcy4KKwkgKi8KKwlwcm9jID0gQmFj a2VuZFBpZEdldFByb2MoZHN0X3BpZCk7CisKKwlpZiAocHJvYyA9PSBOVUxMKQorCXsKKwkJcHJv YyA9IEF1eGlsaWFyeVBpZEdldFByb2MoZHN0X3BpZCk7CisKKwkJaWYgKHByb2MgPT0gTlVMTCkK KwkJCWVyZXBvcnQoV0FSTklORywKKwkJCQkoZXJybXNnKCJQSUQgJWQgaXMgbm90IGEgUG9zdGdy ZVNRTCBzZXJ2ZXIgcHJvY2Vzcy4iLCBkc3RfcGlkKSkpOworCQllbHNlCisJCQllcmVwb3J0KFdB Uk5JTkcsCisJCQkJKGVycm1zZygiUElEICVkIGlzIG5vdCBhIFBvc3RncmVTUUwgYmFja2VuZCBw cm9jZXNzIGJ1dCBhbiBhdXhpbGlhcnkgcHJvY2Vzcy4iLCBkc3RfcGlkKSkpOworCisJCXR1cGxl c3RvcmVfZG9uZXN0b3JpbmcodHVwc3RvcmUpOworCQlyZXR1cm4gKERhdHVtKSAxOworCX0KKwor CWJlZW50cnkgPSBwZ3N0YXRfZmV0Y2hfc3RhdF9iZWVudHJ5KHByb2MtPmJhY2tlbmRJZCk7CisK KwlpZiAoYmVlbnRyeS0+c3RfYmFja2VuZFR5cGUgIT0gQl9CQUNLRU5EKQorCXsKKwkJZXJlcG9y dChXQVJOSU5HLAorCQkJCShlcnJtc2coIlBJRCAlZCBpcyBub3QgYSBQb3N0Z3JlU1FMIGJhY2tl bmQgcHJvY2VzcyIsIGRzdF9waWQpKSk7CisKKwkJdHVwbGVzdG9yZV9kb25lc3RvcmluZyh0dXBz dG9yZSk7CisJCXJldHVybiAoRGF0dW0pIDE7CisJfQorCisJLyoKKwkgKiBUaGUgRU5TVVJFIHN0 dWZmIGVuc3VyZXMgd2UgY2xlYW4gdXAgdGhlIHNoYXJlZCBtZW1vcnkgc3RydWN0IGFuZCBmaWxl cworCSAqIG9uIGZhaWx1cmUuCisJICovCisJUEdfRU5TVVJFX0VSUk9SX0NMRUFOVVAoTWN4dFJl cUNsZWFudXAsIChEYXR1bSkgSW50MzJHZXREYXR1bShkc3RfcGlkKSk7CisJeworCQlTZXR1cE1j eHRkdW1wU2htZW0oZHN0X3BpZCk7CisKKwkJU2VuZFByb2NTaWduYWwoZHN0X3BpZCwgUFJPQ1NJ R19EVU1QX01FTUNYVCwgSW52YWxpZEJhY2tlbmRJZCk7CisKKwkJLyogV2FpdCB1bnRpbCB0YXJn ZXQgcHJvY2VzcyBmaW5pc2hlcyBkdW1waW5nIGZpbGUuICovCisJCWZvciAoOzspCisJCXsKKwkJ CS8qIENoZWNrIGZvciBkdW1wIGNhbmNlbCByZXF1ZXN0LiAqLworCQkJQ0hFQ0tfRk9SX0lOVEVS UlVQVFMoKTsKKworCQkJLyogTXVzdCByZXNldCB0aGUgbGF0Y2ggYmVmb3JlIHRlc3Rpbmcgc3Rh dGUuICovCisJCQlSZXNldExhdGNoKE15TGF0Y2gpOworCisJCQlMV0xvY2tBY3F1aXJlKE1jeHRE dW1wTG9jaywgTFdfU0hBUkVEKTsKKworCQkJaWYgKG1jeHRkdW1wU2htZW0tPnNyY19waWQgIT0g TXlQcm9jUGlkKQorCQkJeworCQkJCS8qCisJCQkJICogSXQgc2VlbXMgdGhlIGR1bXBlciBleGl0 ZWQgYW5kIHN1YnNlcXVlbnRseSBhbm90aGVyCisJCQkJICogcHJvY2VzcyBpcyByZXF1ZXN0aW5n IGR1bXBpbmcuCisJCQkJICovCisJCQkJTFdMb2NrUmVsZWFzZShNY3h0RHVtcExvY2spOworCisJ CQkJZXJlcG9ydChJTkZPLAorCQkJCQkoZXJybXNnKCJUaGUgcmVxdWVzdCBoYXMgZmFpbGVkIGFu ZCBub3cgUElEICVkIGlzIHJlcXVzdGluZyBkdW1waW5nLiIsCisJCQkJCQltY3h0ZHVtcFNobWVt LT5zcmNfcGlkKSkpOworCisJCQkJdHVwbGVzdG9yZV9kb25lc3RvcmluZyh0dXBzdG9yZSk7CisK KwkJCQlyZXR1cm4gKERhdHVtKSAwOworCQkJfQorCQkJZWxzZSBpZiAobWN4dGR1bXBTaG1lbS0+ ZHVtcF9zdGF0dXMgPT0gTUNYVERVTVBTVEFUVVNfQUNDRVBUQUJMRSkKKwkJCXsKKwkJCQkvKgor CQkJCSAqIER1bXBlciBzZWVtcyB0byBoYXZlIGNsZWFuZWQgdXAgdGhpbmdzIGFscmVhZHkgYmVj YXVzZQorCQkJCSAqIG9mIGZhaWx1cmVzIG9yIGNhbmNlbGxhdGlvbi4KKwkJCQkgKiBTaW5jZSB0 aGUgZHVtcGVyIGhhcyBhbHJlYWR5IHJlbW92ZWQgdGhlIGR1bXAgZmlsZSwKKwkJCQkgKiBzaW1w bHkgZXhpdC4KKwkJCQkgKi8KKwkJCQlMV0xvY2tSZWxlYXNlKE1jeHREdW1wTG9jayk7CisJCQkJ dHVwbGVzdG9yZV9kb25lc3RvcmluZyh0dXBzdG9yZSk7CisKKwkJCQlyZXR1cm4gKERhdHVtKSAw OworCQkJfQorCQkJZWxzZSBpZiAobWN4dGR1bXBTaG1lbS0+ZHVtcF9zdGF0dXMgPT0gTUNYVERV TVBTVEFUVVNfQ0FOQ0VMSU5HKQorCQkJeworCQkJCS8qCisJCQkJICogUmVxdWVzdCBoYXMgYmVl biBjYW5jZWxlZC4gRXhpdCB3aXRob3V0IGR1bXBpbmcuCisJCQkJICovCisJCQkJTFdMb2NrUmVs ZWFzZShNY3h0RHVtcExvY2spOworCQkJCXR1cGxlc3RvcmVfZG9uZXN0b3JpbmcodHVwc3RvcmUp OworCisJCQkJcmV0dXJuIChEYXR1bSkgMDsKKwkJCX0KKworCQkJZWxzZSBpZiAobWN4dGR1bXBT aG1lbS0+ZHVtcF9zdGF0dXMgPT0gTUNYVERVTVBTVEFUVVNfRE9ORSkKKwkJCXsKKwkJCQkvKiBE dW1waW5nIGhhcyBjb21wbGV0ZWQuICovCisJCQkJTFdMb2NrUmVsZWFzZShNY3h0RHVtcExvY2sp OworCQkJCWJyZWFrOworCQkJfQorCQkJLyoKKwkJCSAqIFRoZSBkdW1wZXIgbXVzdCBiZSBpbiB0 aGUgbWlkZGxlIG9mIGEgZHVtcGluZyBvciB0aGUgcmVxdWVzdAorCQkJICogaGFzbid0IGJlZW4g cmVhY2hlZCB5ZXQuCisJCQkgKi8KKwkJCUFzc2VydChtY3h0ZHVtcFNobWVtLT5kdW1wX3N0YXR1 cyA9PSBNQ1hURFVNUFNUQVRVU19SRVFVRVNUSU5HIHx8CisJCQkJbWN4dGR1bXBTaG1lbS0+ZHVt cF9zdGF0dXMgPT0gTUNYVERVTVBTVEFUVVNfRFVNUElORyk7CisKKwkJCS8qCisJCQkgKiBBbHRo b3VnaCB3ZSBoYXZlIGNoZWNrZWQgdGhlIHRhcmdldCBwcm9jZXNzLAorCQkJICogaXQgbWlnaHQg aGF2ZSBiZWVuIHRlcm1pbmF0ZWQgYWZ0ZXIgdGhlIGNoZWNrLgorCQkJICogRW5zdXJlIGl0IGFn YWluLgorCQkJICovCisJCQlwcm9jID0gQmFja2VuZFBpZEdldFByb2MoZHN0X3BpZCk7CisKKwkJ CWlmIChwcm9jID09IE5VTEwpCisJCQl7CisJCQkJZXJlcG9ydChXQVJOSU5HLAorCQkJCQkJKGVy cm1zZygiUElEICVkIHNlZW1zIHRvIGV4aXQgYmVmb3JlIGR1bXBpbmcuIiwgZHN0X3BpZCkpKTsK KworCQkJCS8qIEluaXRpYWxpemUgdGhlIHNoYXJlZCBtZW1vcnkgYW5kIGV4aXQuICovCisJCQkJ TFdMb2NrUmVsZWFzZShNY3h0RHVtcExvY2spOworCQkJCUxXTG9ja0FjcXVpcmUoTWN4dER1bXBM b2NrLCBMV19FWENMVVNJVkUpOworCisJCQkJbWN4dGR1bXBTaG1lbS0+ZHN0X3BpZCA9IDA7CisJ CQkJbWN4dGR1bXBTaG1lbS0+c3JjX3BpZCA9IDA7CisJCQkJbWN4dGR1bXBTaG1lbS0+ZHVtcF9z dGF0dXMgPSBNQ1hURFVNUFNUQVRVU19BQ0NFUFRBQkxFOworCisJCQkJTFdMb2NrUmVsZWFzZShN Y3h0RHVtcExvY2spOworCisJCQkJdHVwbGVzdG9yZV9kb25lc3RvcmluZyh0dXBzdG9yZSk7CisJ CQkJcmV0dXJuIChEYXR1bSkgMTsKKwkJCX0KKwkJCUxXTG9ja1JlbGVhc2UoTWN4dER1bXBMb2Nr KTsKKworCQkJLyoKKwkJCSAqIFdhaXQuIFdlIGV4cGVjdCB0byBnZXQgYSBsYXRjaCBzaWduYWwg YmFjayBmcm9tIHRoZSBkdW1wZXIuCisJCQkgKiBVc2UgYSB0aW1lb3V0IHRvIGVuYWJsZSBjYW5j ZWxsYXRpb24uCisJCQkgKi8KKwkJCSh2b2lkKSBXYWl0TGF0Y2goTXlMYXRjaCwKKwkJCQkJV0xf TEFUQ0hfU0VUIHwgV0xfVElNRU9VVCB8IFdMX0VYSVRfT05fUE1fREVBVEgsCisJCQkJCTEwMDBM LCBXQUlUX0VWRU5UX0RVTVBfTUVNT1JZX0NPTlRFWFQpOworCQl9CisJfQorCVBHX0VORF9FTlNV UkVfRVJST1JfQ0xFQU5VUChNY3h0UmVxQ2xlYW51cCwgKERhdHVtKSBJbnQzMkdldERhdHVtKGRz dF9waWQpKTsKKworCS8qIFJlYWQgdmFsdWVzIGZyb20gdGhlIGR1bXAgZmlsZSBhbmQgcHV0IHRo ZW0gb24gdHVwbGVzdG9yZS4gKi8KKwlQdXREdW1wZWRWYWx1ZXNPblR1cGxlc3RvcmUoZHVtcGZp bGUsIHR1cHN0b3JlLCB0dXBkZXNjLCBkc3RfcGlkKTsKIAogCS8qIGNsZWFuIHVwIGFuZCByZXR1 cm4gdGhlIHR1cGxlc3RvcmUgKi8KIAl0dXBsZXN0b3JlX2RvbmVzdG9yaW5nKHR1cHN0b3JlKTsK IAogCXJldHVybiAoRGF0dW0pIDA7CiB9CisKKy8qCisgKiBkdW1wX21lbW9yeV9jb250ZXh0cwor ICogCQlEdW1wIGxvY2FsIG1lbW9yeSBjb250ZXh0cyB0byBhIGZpbGUuCisgKi8KK3N0YXRpYyB2 b2lkCitkdW1wX21lbW9yeV9jb250ZXh0cyh2b2lkKQoreworCUZJTEUJCSpmcG91dDsKKwljaGFy CQlkdW1wZmlsZVtNQVhQR1BBVEhdOworCWludAkJZm9ybWF0X2lkOworCXBpZF90CQlzcmNfcGlk OworCVBHUFJPQwkgCSpzcmNfcHJvYzsKKworCXNucHJpbnRmKGR1bXBmaWxlLCBzaXplb2YoZHVt cGZpbGUpLCAiJXMvJWQiLCBQR19NRU1VU0FHRV9ESVIsIE15UHJvY1BpZCk7CisKKwlMV0xvY2tB Y3F1aXJlKE1jeHREdW1wTG9jaywgTFdfRVhDTFVTSVZFKTsKKworCWlmIChtY3h0ZHVtcFNobWVt LT5kdW1wX3N0YXR1cyA9PSBNQ1hURFVNUFNUQVRVU19BQ0NFUFRBQkxFKQorCXsKKwkJLyoKKwkJ ICogVGhlIHJlcXVlc3RvciBjYW5jZWxlZCB0aGUgcmVxdWVzdCBhbmQgaW5pdGlhbGl6ZWQKKwkJ ICogdGhlIHNoYXJlZCBtZW1vcnkuIFNpbXBseSBleGl0LgorCQkgKi8KKwkJTFdMb2NrUmVsZWFz ZShNY3h0RHVtcExvY2spOworCisJCXJldHVybjsKKwl9CisKKwlpZiAobWN4dGR1bXBTaG1lbS0+ ZHVtcF9zdGF0dXMgPT0gTUNYVERVTVBTVEFUVVNfQ0FOQ0VMSU5HKQorCXsKKwkJLyoKKwkJICog VGhlIHJlcXVlc3RvciBjYW5jZWxlZCB0aGUgcmVxdWVzdC4KKwkJICogSW5pdGlhbGl6ZSB0aGUg c2hhcmVkIG1lbW9yeSBhbmQgZXhpdC4KKwkJICovCisJCW1jeHRkdW1wU2htZW0tPmRzdF9waWQg PSAwOworCQltY3h0ZHVtcFNobWVtLT5zcmNfcGlkID0gMDsKKwkJbWN4dGR1bXBTaG1lbS0+ZHVt cF9zdGF0dXMgPSBNQ1hURFVNUFNUQVRVU19BQ0NFUFRBQkxFOworCisJCUxXTG9ja1JlbGVhc2Uo TWN4dER1bXBMb2NrKTsKKworCQlyZXR1cm47CisJfQorCisJQXNzZXJ0KG1jeHRkdW1wU2htZW0t PmR1bXBfc3RhdHVzID09IE1DWFREVU1QU1RBVFVTX1JFUVVFU1RJTkcpOworCisJbWN4dGR1bXBT aG1lbS0+ZHVtcF9zdGF0dXMgPSBNQ1hURFVNUFNUQVRVU19EVU1QSU5HOworCXNyY19waWQgPSBt Y3h0ZHVtcFNobWVtLT5zcmNfcGlkOworCisJTFdMb2NrUmVsZWFzZShNY3h0RHVtcExvY2spOwor CisJZnBvdXQgPSBBbGxvY2F0ZUZpbGUoZHVtcGZpbGUsICJ3Iik7CisKKwlpZiAoZnBvdXQgPT0g TlVMTCkKKwl7CisJCWVyZXBvcnQoTE9HLAorCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2Vzcygp LAorCQkJCSBlcnJtc2coImNvdWxkIG5vdCB3cml0ZSBkdW1wIGZpbGUgXCIlc1wiOiAlbSIsCisJ CQkJCQlkdW1wZmlsZSkpKTsKKwkJRnJlZUZpbGUoZnBvdXQpOworCisJCUxXTG9ja0FjcXVpcmUo TWN4dER1bXBMb2NrLCBMV19FWENMVVNJVkUpOworCisJCW1jeHRkdW1wU2htZW0tPmRzdF9waWQg PSAwOworCQltY3h0ZHVtcFNobWVtLT5zcmNfcGlkID0gMDsKKwkJbWN4dGR1bXBTaG1lbS0+ZHVt cF9zdGF0dXMgPSBNQ1hURFVNUFNUQVRVU19BQ0NFUFRBQkxFOworCisJCUxXTG9ja1JlbGVhc2Uo TWN4dER1bXBMb2NrKTsKKworCQlyZXR1cm47CisJfQorCWZvcm1hdF9pZCA9IFBHX01DWFRfRklM RV9GT1JNQVRfSUQ7CisJZndyaXRlKCZmb3JtYXRfaWQsIHNpemVvZihmb3JtYXRfaWQpLCAxLCBm cG91dCk7CisKKwkvKiBMb29rIGludG8gZWFjaCBtZW1vcnkgY29udGV4dCBmcm9tIFRvcE1lbW9y eUNvbnRleHQgcmVjdXJzaXZlbHkuICovCisJUHV0TWVtb3J5Q29udGV4dHNTdGF0c1R1cGxlU3Rv cmUoTlVMTCwgTlVMTCwKKwkJCQkJCQlUb3BNZW1vcnlDb250ZXh0LCBOVUxMLCAwLCBmcG91dCk7 CisKKwkvKgorCSAqIE1ha2UgZHVtcCBmaWxlIGVuZHMgd2l0aCAnRScuCisJICogVGhpcyBpcyBj aGVja2VkIGJ5IHRoZSByZXF1ZXN0b3IgbGF0ZXIuCisJICovCisJZnB1dGMoJ0UnLCBmcG91dCk7 CisKKwlpZiAoZmVycm9yKGZwb3V0KSkKKwl7CisJCWVyZXBvcnQoTE9HLAorCQkJCShlcnJjb2Rl X2Zvcl9maWxlX2FjY2VzcygpLAorCQkJCSBlcnJtc2coImNvdWxkIG5vdCB3cml0ZSBkdW1wIGZp bGUgXCIlc1wiOiAlbSIsCisJCQkJCQlkdW1wZmlsZSkpKTsKKwkJRnJlZUZpbGUoZnBvdXQpOwor CQl1bmxpbmsoZHVtcGZpbGUpOworCisJCUxXTG9ja0FjcXVpcmUoTWN4dER1bXBMb2NrLCBMV19F WENMVVNJVkUpOworCisJCW1jeHRkdW1wU2htZW0tPmRzdF9waWQgPSAwOworCQltY3h0ZHVtcFNo bWVtLT5zcmNfcGlkID0gMDsKKwkJbWN4dGR1bXBTaG1lbS0+ZHVtcF9zdGF0dXMgPSBNQ1hURFVN UFNUQVRVU19BQ0NFUFRBQkxFOworCisJCUxXTG9ja1JlbGVhc2UoTWN4dER1bXBMb2NrKTsKKwor CQlyZXR1cm47CisJfQorCisJLyogTm8gbW9yZSBvdXRwdXQgdG8gYmUgZG9uZS4gQ2xvc2UgZmls ZS4gKi8KKwllbHNlIGlmIChGcmVlRmlsZShmcG91dCkgPCAwKQorCXsKKwkJZXJlcG9ydChMT0cs CisJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCisJCQkJIGVycm1zZygiY291bGQgbm90 IGNsb3NlIGR1bXAgZmlsZSBcIiVzXCI6ICVtIiwKKwkJCQkJCWR1bXBmaWxlKSkpOworCX0KKwor CUxXTG9ja0FjcXVpcmUoTWN4dER1bXBMb2NrLCBMV19FWENMVVNJVkUpOworCisJaWYgKG1jeHRk dW1wU2htZW0tPmR1bXBfc3RhdHVzID09IE1DWFREVU1QU1RBVFVTX0NBTkNFTElORykKKwl7CisJ CS8qIER1cmluZyBkdW1waW5nLCB0aGUgcmVxdWVzdG9yIGNhbmNlbGVkIHRoZSByZXF1ZXN0LiAq LworCQl1bmxpbmsoZHVtcGZpbGUpOworCisJCW1jeHRkdW1wU2htZW0tPmRzdF9waWQgPSAwOwor CQltY3h0ZHVtcFNobWVtLT5zcmNfcGlkID0gMDsKKwkJbWN4dGR1bXBTaG1lbS0+ZHVtcF9zdGF0 dXMgPSBNQ1hURFVNUFNUQVRVU19BQ0NFUFRBQkxFOworCisJCUxXTG9ja1JlbGVhc2UoTWN4dER1 bXBMb2NrKTsKKworCQlyZXR1cm47CisJfQorCisJLyogRHVtcGluZyBoYXMgc3VjY2VlZGVkLCBu b3RpZnkgaXQgdG8gdGhlIHJlcXVlc3Rvci4gKi8KKwltY3h0ZHVtcFNobWVtLT5kdW1wX3N0YXR1 cyA9IE1DWFREVU1QU1RBVFVTX0RPTkU7CisJTFdMb2NrUmVsZWFzZShNY3h0RHVtcExvY2spOwor CXNyY19wcm9jID0gQmFja2VuZFBpZEdldFByb2Moc3JjX3BpZCk7CisJU2V0TGF0Y2goJihzcmNf cHJvYy0+cHJvY0xhdGNoKSk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBQcm9jZXNzRHVtcE1l bW9yeUNvbnRleHRJbnRlcnJ1cHQKKyAqCQlUaGUgcG9ydGlvbiBvZiBtZW1vcnkgY29udGV4dCBk dW1wIGludGVycnVwdCBoYW5kbGluZyB0aGF0IHJ1bnMKKyAqCQlvdXRzaWRlIG9mIHRoZSBzaWdu YWwgaGFuZGxlci4KKyAqLwordm9pZAorUHJvY2Vzc0R1bXBNZW1vcnlDb250ZXh0SW50ZXJydXB0 KHZvaWQpCit7CisJUHJvY1NpZ25hbER1bXBNZW1vcnlDb250ZXh0UGVuZGluZyA9IGZhbHNlOwor CWR1bXBfbWVtb3J5X2NvbnRleHRzKCk7Cit9CisKKy8qCisgKiBIYW5kbGVQcm9jU2lnbmFsRHVt cE1lbW9yeUNvbnRleHQKKyAqIAkJSGFuZGxlIHJlY2VpcHQgb2YgYW4gaW50ZXJydXB0IGluZGlj YXRpbmcgYSBtZW1vcnkgY29udGV4dCBkdW1wLgorICoJCVNpZ25hbCBoYW5kbGVyIHBvcnRpb24g b2YgaW50ZXJydXB0IGhhbmRsaW5nLgorICovCit2b2lkCitIYW5kbGVQcm9jU2lnbmFsRHVtcE1l bW9yeUNvbnRleHQodm9pZCkKK3sKKwlQcm9jU2lnbmFsRHVtcE1lbW9yeUNvbnRleHRQZW5kaW5n ID0gdHJ1ZTsKK30KKworLyoKKyAqIE1jeHREdW1wU2htZW1Jbml0CisgKiAJCUluaXRpYWxpemUg bWN4dGR1bXAgc2hhcmVkIG1lbW9yeSBzdHJ1Y3QuCisgKi8KK3ZvaWQKK01jeHREdW1wU2htZW1J bml0KHZvaWQpCit7CisJYm9vbAkJZm91bmQ7CisKKwltY3h0ZHVtcFNobWVtID0gKG1jeHRkdW1w U2htZW1TdHJ1Y3QgKikKKwkJU2htZW1Jbml0U3RydWN0KCJNZW1vcnkgQ29udGV4dCBEdW1wIERh dGEiLAorCQkJCQkJc2l6ZW9mKG1jeHRkdW1wU2htZW1TdHJ1Y3QpLAorCQkJCQkJJmZvdW5kKTsK KwlpZiAoIWZvdW5kKQorCXsKKwkJbWN4dGR1bXBTaG1lbS0+ZHN0X3BpZCA9IDA7CisJCW1jeHRk dW1wU2htZW0tPnNyY19waWQgPSAwOworCQltY3h0ZHVtcFNobWVtLT5kdW1wX3N0YXR1cyA9IE1D WFREVU1QU1RBVFVTX0FDQ0VQVEFCTEU7CisJfQorfQorCisvKgorICogUmVtb3ZlTWVtY3h0Rmls ZQorICoJIAlSZW1vdmUgZHVtcCBmaWxlcy4KKyAqLwordm9pZAorUmVtb3ZlTWVtY3h0RmlsZShp bnQgcGlkKQoreworCURJUgkJKmRpcjsKKwlzdHJ1Y3QgCWRpcmVudCAqZHVtcGZpbGU7CisKKwlp ZiAocGlkID09IDApCisJeworCQkvKiBkZWxldGUgYWxsIGR1bXAgZmlsZXMgKi8KKwkJZGlyID0g QWxsb2NhdGVEaXIoUEdfTUVNVVNBR0VfRElSKTsKKwkJd2hpbGUgKChkdW1wZmlsZSA9IFJlYWRE aXIoZGlyLCBQR19NRU1VU0FHRV9ESVIpKSAhPSBOVUxMKQorCQl7CisJCQljaGFyCQlkdW1wZmls ZXBhdGhbMzJdOworCisJCQlpZiAoc3RyY21wKGR1bXBmaWxlLT5kX25hbWUsICIuIikgPT0gMCB8 fCBzdHJjbXAoZHVtcGZpbGUtPmRfbmFtZSwgIi4uIikgPT0gMCkKKwkJCQljb250aW51ZTsKKwor CQkJc3ByaW50ZihkdW1wZmlsZXBhdGgsICIlcy8lcyIsIFBHX01FTVVTQUdFX0RJUiwgZHVtcGZp bGUtPmRfbmFtZSk7CisKKwkJCWVyZXBvcnQoREVCVUcyLAorCQkJCQkoZXJybXNnKCJyZW1vdmlu ZyBmaWxlIFwiJXNcIiIsIGR1bXBmaWxlcGF0aCkpKTsKKworCQkJaWYgKHVubGluayhkdW1wZmls ZXBhdGgpIDwgMCkKKwkJCXsKKwkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZV9mb3Jf ZmlsZV9hY2Nlc3MoKSwKKwkJCQkJIGVycm1zZygiY291bGQgbm90IHJlbW92ZSBmaWxlIFwiJXNc IjogJW0iLCBkdW1wZmlsZXBhdGgpKSk7CisJCQl9CisJCX0KKwkJRnJlZURpcihkaXIpOworCX0K KwllbHNlCisJeworCQkvKiBkZWxldGUgc3BlY2lmaWVkIGR1bXAgZmlsZSAqLworCQljaGFyCQlz dHJfcGlkWzEyXTsKKwkJY2hhcgkJZHVtcGZpbGVwYXRoWzMyXTsKKwkJc3RydWN0IAkJc3RhdCBz dGF0X3RtcDsKKworCQlwZ19sdG9hKHBpZCwgc3RyX3BpZCk7CisJCXNwcmludGYoZHVtcGZpbGVw YXRoLCAiJXMvJXMiLCBQR19NRU1VU0FHRV9ESVIsIHN0cl9waWQpOworCisJCWVyZXBvcnQoREVC VUcyLAorCQkJCShlcnJtc2coInJlbW92aW5nIGZpbGUgXCIlc1wiIiwgZHVtcGZpbGVwYXRoKSkp OworCisJCWlmIChzdGF0KGR1bXBmaWxlcGF0aCwgJnN0YXRfdG1wKSA9PSAwKQorCQl7CisJCQlp ZiAodW5saW5rKGR1bXBmaWxlcGF0aCkgPCAwKQorCQkJeworCQkJCWVyZXBvcnQoRVJST1IsCisJ CQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJCQkgZXJybXNnKCJjb3VsZCBub3Qg cmVtb3ZlIGZpbGUgXCIlc1wiOiAlbSIsIGR1bXBmaWxlcGF0aCkpKTsKKwkJCX0KKwkJfQorCX0K K30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2luaXQvZ2xvYmFscy5jIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvaW5pdC9nbG9iYWxzLmMKaW5kZXggM2Q1ZDZjYzAzMy4uZjg1MzI2ZmQ2MCAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9nbG9iYWxzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvaW5pdC9nbG9iYWxzLmMKQEAgLTMzLDYgKzMzLDcgQEAgdm9sYXRpbGUgc2ln X2F0b21pY190IFByb2NEaWVQZW5kaW5nID0gZmFsc2U7CiB2b2xhdGlsZSBzaWdfYXRvbWljX3Qg Q2xpZW50Q29ubmVjdGlvbkxvc3QgPSBmYWxzZTsKIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBJZGxl SW5UcmFuc2FjdGlvblNlc3Npb25UaW1lb3V0UGVuZGluZyA9IGZhbHNlOwogdm9sYXRpbGUgc2ln X2F0b21pY190IFByb2NTaWduYWxCYXJyaWVyUGVuZGluZyA9IGZhbHNlOwordm9sYXRpbGUgc2ln X2F0b21pY190IFByb2NTaWduYWxEdW1wTWVtb3J5Q29udGV4dFBlbmRpbmcgPSBmYWxzZTsKIHZv bGF0aWxlIHVpbnQzMiBJbnRlcnJ1cHRIb2xkb2ZmQ291bnQgPSAwOwogdm9sYXRpbGUgdWludDMy IFF1ZXJ5Q2FuY2VsSG9sZG9mZkNvdW50ID0gMDsKIHZvbGF0aWxlIHVpbnQzMiBDcml0U2VjdGlv bkNvdW50ID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9iaW4vaW5pdGRiL2luaXRkYi5jIGIvc3JjL2Jp bi9pbml0ZGIvaW5pdGRiLmMKaW5kZXggNDQ1M2FlYjBmMC4uZWQ5MGE0YTMzOSAxMDA2NDQKLS0t IGEvc3JjL2Jpbi9pbml0ZGIvaW5pdGRiLmMKKysrIGIvc3JjL2Jpbi9pbml0ZGIvaW5pdGRiLmMK QEAgLTIyMSw3ICsyMjEsOCBAQCBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3ViZGlyc1tdID0g ewogCSJwZ194YWN0IiwKIAkicGdfbG9naWNhbCIsCiAJInBnX2xvZ2ljYWwvc25hcHNob3RzIiwK LQkicGdfbG9naWNhbC9tYXBwaW5ncyIKKwkicGdfbG9naWNhbC9tYXBwaW5ncyIsCisJInBnX21l bXVzYWdlIgogfTsKIAogCmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wMTBf cGdfYmFzZWJhY2t1cC5wbCBiL3NyYy9iaW4vcGdfYmFzZWJhY2t1cC90LzAxMF9wZ19iYXNlYmFj a3VwLnBsCmluZGV4IGY2NzRhN2M5NGUuLjM0MGE4MGZjMTEgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4v cGdfYmFzZWJhY2t1cC90LzAxMF9wZ19iYXNlYmFja3VwLnBsCisrKyBiL3NyYy9iaW4vcGdfYmFz ZWJhY2t1cC90LzAxMF9wZ19iYXNlYmFja3VwLnBsCkBAIC02LDcgKzYsNyBAQCB1c2UgRmlsZTo6 QmFzZW5hbWUgcXcoYmFzZW5hbWUgZGlybmFtZSk7CiB1c2UgRmlsZTo6UGF0aCBxdyhybXRyZWUp OwogdXNlIFBvc3RncmVzTm9kZTsKIHVzZSBUZXN0TGliOwotdXNlIFRlc3Q6Ok1vcmUgdGVzdHMg PT4gMTA5OwordXNlIFRlc3Q6Ok1vcmUgdGVzdHMgPT4gMTEwOwogCiBwcm9ncmFtX2hlbHBfb2so J3BnX2Jhc2ViYWNrdXAnKTsKIHByb2dyYW1fdmVyc2lvbl9vaygncGdfYmFzZWJhY2t1cCcpOwpA QCAtMTI0LDcgKzEyNCw3IEBAIGlzX2RlZXBseSgKIAogIyBDb250ZW50cyBvZiB0aGVzZSBkaXJl Y3RvcmllcyBzaG91bGQgbm90IGJlIGNvcGllZC4KIGZvcmVhY2ggbXkgJGRpcm5hbWUgKAotCXF3 KHBnX2R5bnNobWVtIHBnX25vdGlmeSBwZ19yZXBsc2xvdCBwZ19zZXJpYWwgcGdfc25hcHNob3Rz IHBnX3N0YXRfdG1wIHBnX3N1YnRyYW5zKQorCXF3KHBnX2R5bnNobWVtIHBnX25vdGlmeSBwZ19y ZXBsc2xvdCBwZ19zZXJpYWwgcGdfc25hcHNob3RzIHBnX3N0YXRfdG1wIHBnX3N1YnRyYW5zIHBn X21lbXVzYWdlKQogICApCiB7CiAJaXNfZGVlcGx5KApkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9wZ19y ZXdpbmQvZmlsZW1hcC5jIGIvc3JjL2Jpbi9wZ19yZXdpbmQvZmlsZW1hcC5jCmluZGV4IDI2MThi NGM5NTcuLjMzZGE1NzA1OTggMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfcmV3aW5kL2ZpbGVtYXAu YworKysgYi9zcmMvYmluL3BnX3Jld2luZC9maWxlbWFwLmMKQEAgLTExOSw2ICsxMTksOSBAQCBz dGF0aWMgY29uc3QgY2hhciAqZXhjbHVkZURpckNvbnRlbnRzW10gPQogCS8qIENvbnRlbnRzIHpl cm9lZCBvbiBzdGFydHVwLCBzZWUgU3RhcnR1cFNVQlRSQU5TKCkuICovCiAJInBnX3N1YnRyYW5z IiwKIAorCS8qIFNraXAgbWVtb3J5IGNvbnRleHQgZHVtcGVkIGZpbGVzLiAqLworCSJwZ19tZW11 c2FnZSIsCisKIAkvKiBlbmQgb2YgbGlzdCAqLwogCU5VTEwKIH07CmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9j LmRhdAppbmRleCBkN2I1NWY1N2VhLi40ZThhYTQ2ZTQ4IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVk ZS9jYXRhbG9nL3BnX3Byb2MuZGF0CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5k YXQKQEAgLTc4NTIsMTUgKzc4NTIsMjUgQEAKIAogIyBtZW1vcnkgY29udGV4dCBvZiBsb2NhbCBi YWNrZW5kCiB7IG9pZCA9PiAnMjI4MicsCi0gIGRlc2NyID0+ICdpbmZvcm1hdGlvbiBhYm91dCBh bGwgbWVtb3J5IGNvbnRleHRzIG9mIGxvY2FsIGJhY2tlbmQnLAogICBwcm9uYW1lID0+ICdwZ19n ZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMnLCBwcm9yb3dzID0+ICcxMDAnLAogICBwcm9yZXRz ZXQgPT4gJ3QnLCBwcm92b2xhdGlsZSA9PiAndicsIHByb3BhcmFsbGVsID0+ICdyJywKICAgcHJv cmV0dHlwZSA9PiAncmVjb3JkJywgcHJvYXJndHlwZXMgPT4gJycsCiAgIHByb2FsbGFyZ3R5cGVz ID0+ICd7dGV4dCx0ZXh0LHRleHQsaW50NCxpbnQ4LGludDgsaW50OCxpbnQ4LGludDh9JywKICAg cHJvYXJnbW9kZXMgPT4gJ3tvLG8sbyxvLG8sbyxvLG8sb30nLAogICBwcm9hcmduYW1lcyA9PiAn e25hbWUsIGlkZW50LCBwYXJlbnQsIGxldmVsLCB0b3RhbF9ieXRlcywgdG90YWxfbmJsb2Nrcywg ZnJlZV9ieXRlcywgZnJlZV9jaHVua3MsIHVzZWRfYnl0ZXN9JywKKyAgZGVzY3IgPT4gJ2luZm9y bWF0aW9uIGFib3V0IGFsbCBtZW1vcnkgY29udGV4dHMgb2YgbG9jYWwgYmFja2VuZCcsCiAgIHBy b3NyYyA9PiAncGdfZ2V0X2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzJyB9LAogCisjIG1lbW9yeSBj b250ZXh0IG9mIHNwZWNpZmllZCBiYWNrZW5kCit7IG9pZCA9PiAnNDU0MycsCisgIGRlc2NyID0+ ICdpbmZvcm1hdGlvbiBhYm91dCBhbGwgbWVtb3J5IGNvbnRleHRzIG9mIHNwZWNpZmllZCBiYWNr ZW5kJywKKyAgcHJvbmFtZSA9PiAncGdfZ2V0X3RhcmdldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0 cycsIHByb3Jvd3MgPT4gJzEwMCcsIHByb2lzc3RyaWN0ID0+ICdmJywKKyAgcHJvcmV0c2V0ID0+ ICd0JywgcHJvdm9sYXRpbGUgPT4gJ3YnLCBwcm9wYXJhbGxlbCA9PiAncicsIHByb3JldHR5cGUg PT4gJ3JlY29yZCcsCisgIHByb2FyZ3R5cGVzID0+ICdpbnQ0JywgcHJvYWxsYXJndHlwZXMgPT4g J3tpbnQ0LHRleHQsdGV4dCx0ZXh0LGludDQsaW50OCxpbnQ4LGludDgsaW50OCxpbnQ4fScsCisg IHByb2FyZ21vZGVzID0+ICd7aSxvLG8sbyxvLG8sbyxvLG8sb30nLAorICBwcm9hcmduYW1lcyA9 PiAne3BpZCwgbmFtZSwgaWRlbnQsIHBhcmVudCwgbGV2ZWwsIHRvdGFsX2J5dGVzLCB0b3RhbF9u YmxvY2tzLCBmcmVlX2J5dGVzLCBmcmVlX2NodW5rcywgdXNlZF9ieXRlc30nLAorICBwcm9zcmMg PT4gJ3BnX2dldF90YXJnZXRfYmFja2VuZF9tZW1vcnlfY29udGV4dHMnIH0sCisKICMgbm9uLXBl cnNpc3RlbnQgc2VyaWVzIGdlbmVyYXRvcgogeyBvaWQgPT4gJzEwNjYnLCBkZXNjciA9PiAnbm9u LXBlcnNpc3RlbnQgc2VyaWVzIGdlbmVyYXRvcicsCiAgIHByb25hbWUgPT4gJ2dlbmVyYXRlX3Nl cmllcycsIHByb3Jvd3MgPT4gJzEwMDAnLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbWlzY2Fk bWluLmggYi9zcmMvaW5jbHVkZS9taXNjYWRtaW4uaAppbmRleCAyYzcxZGI3OWMwLi43ODEyZmEy NDk5IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9taXNjYWRtaW4uaAorKysgYi9zcmMvaW5jbHVk ZS9taXNjYWRtaW4uaApAQCAtODMsNiArODMsNyBAQCBleHRlcm4gUEdETExJTVBPUlQgdm9sYXRp bGUgc2lnX2F0b21pY190IFF1ZXJ5Q2FuY2VsUGVuZGluZzsKIGV4dGVybiBQR0RMTElNUE9SVCB2 b2xhdGlsZSBzaWdfYXRvbWljX3QgUHJvY0RpZVBlbmRpbmc7CiBleHRlcm4gUEdETExJTVBPUlQg dm9sYXRpbGUgc2lnX2F0b21pY190IElkbGVJblRyYW5zYWN0aW9uU2Vzc2lvblRpbWVvdXRQZW5k aW5nOwogZXh0ZXJuIFBHRExMSU1QT1JUIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBQcm9jU2lnbmFs QmFycmllclBlbmRpbmc7CitleHRlcm4gUEdETExJTVBPUlQgdm9sYXRpbGUgc2lnX2F0b21pY190 IFByb2NTaWduYWxEdW1wTWVtb3J5Q29udGV4dFBlbmRpbmc7CiAKIGV4dGVybiBQR0RMTElNUE9S VCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgQ2xpZW50Q29ubmVjdGlvbkxvc3Q7CiAKZGlmZiAtLWdp dCBhL3NyYy9pbmNsdWRlL3Bnc3RhdC5oIGIvc3JjL2luY2x1ZGUvcGdzdGF0LmgKaW5kZXggM2E3 ZTE5OTc1MC4uYjM2NWRkN2JlNCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvcGdzdGF0LmgKKysr IGIvc3JjL2luY2x1ZGUvcGdzdGF0LmgKQEAgLTk2NCw3ICs5NjQsOCBAQCB0eXBlZGVmIGVudW0K IAlXQUlUX0VWRU5UX1JFUExJQ0FUSU9OX1NMT1RfRFJPUCwKIAlXQUlUX0VWRU5UX1NBRkVfU05B UFNIT1QsCiAJV0FJVF9FVkVOVF9TWU5DX1JFUCwKLQlXQUlUX0VWRU5UX1hBQ1RfR1JPVVBfVVBE QVRFCisJV0FJVF9FVkVOVF9YQUNUX0dST1VQX1VQREFURSwKKwlXQUlUX0VWRU5UX0RVTVBfTUVN T1JZX0NPTlRFWFQKIH0gV2FpdEV2ZW50SVBDOwogCiAvKiAtLS0tLS0tLS0tCmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NzaWduYWwuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uv cHJvY3NpZ25hbC5oCmluZGV4IDRhZTdkYzMzYjguLmQwMjUzODFhZTggMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL3N0b3JhZ2UvcHJvY3NpZ25hbC5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uv cHJvY3NpZ25hbC5oCkBAIC0zNCw2ICszNCw3IEBAIHR5cGVkZWYgZW51bQogCVBST0NTSUdfUEFS QUxMRUxfTUVTU0FHRSwJLyogbWVzc2FnZSBmcm9tIGNvb3BlcmF0aW5nIHBhcmFsbGVsIGJhY2tl bmQgKi8KIAlQUk9DU0lHX1dBTFNORF9JTklUX1NUT1BQSU5HLAkvKiBhc2sgd2Fsc2VuZGVycyB0 byBwcmVwYXJlIGZvciBzaHV0ZG93biAgKi8KIAlQUk9DU0lHX0JBUlJJRVIsCQkJLyogZ2xvYmFs IGJhcnJpZXIgaW50ZXJydXB0ICAqLworCVBST0NTSUdfRFVNUF9NRU1DWFQsCQkvKiByZXF1ZXN0 IGR1bXBpbmcgbWVtb3J5IGNvbnRleHQgaW50ZXJydXB0ICovCiAKIAkvKiBSZWNvdmVyeSBjb25m bGljdCByZWFzb25zICovCiAJUFJPQ1NJR19SRUNPVkVSWV9DT05GTElDVF9EQVRBQkFTRSwKZGlm ZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL21jeHRmdW5jcy5oIGIvc3JjL2luY2x1ZGUvdXRp bHMvbWN4dGZ1bmNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uZWZm MmM2MmNiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL21jeHRmdW5jcy5o CkBAIC0wLDAgKzEsNDQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIG1jeHRmdW5jcy5o CisgKgkgIERlY2xhcmF0aW9ucyBmb3Igc2hvd2luZyBiYWNrZW5kIG1lbW9yeSBjb250ZXh0Lgor ICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDIwLCBQb3N0Z3JlU1FMIEdsb2Jh bCBEZXZlbG9wbWVudCBHcm91cAorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdl bnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKKyAqCisgKgorICogSURFTlRJRklD QVRJT04KKyAqCSAgc3JjL2JhY2tlbmQvdXRpbHMvbWN4dGZ1bmNzLmgKKyAqCisgKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyAqLworI2lmbmRlZiBNQ1hUX0gKKyNkZWZpbmUgTUNYVF9ICisKKy8qIERpcmVj dG9yeSB0byBzdG9yZSBkdW1wZWQgbWVtb3J5IGZpbGVzICovCisjZGVmaW5lIFBHX01FTVVTQUdF X0RJUgkJInBnX21lbXVzYWdlIgorCisjZGVmaW5lIFBHX01DWFRfRklMRV9GT1JNQVRfSUQJMHgw MUI1QkM5RQorCit0eXBlZGVmIGVudW0gTWN4dER1bXBTdGF0dXMKK3sKKwlNQ1hURFVNUFNUQVRV U19BQ0NFUFRBQkxFLAkJLyogbm8gb25lIGlzIHJlcXVlc3RpbmcgZHVtcGluZyAqLworCU1DWFRE VU1QU1RBVFVTX1JFUVVFU1RJTkcsCQkvKiByZXF1ZXN0IGhhcyBiZWVuIGlzc3VlZCwgYnV0IGR1 bXBlciBoYXMgbm90IHJlY2VpdmVkIGl0IHlldCAqLworCU1DWFREVU1QU1RBVFVTX0RVTVBJTkcs CQkJLyogZHVtcGVyIGlzIGR1bXBpbmcgZmlsZXMgKi8KKwlNQ1hURFVNUFNUQVRVU19ET05FLAkJ CS8qIGR1bXBlciBoYXMgZmluaXNoZWQgZHVtcGluZyBhbmQgdGhlIHJlcXVlc3RvciBpcyB3b3Jr aW5nICovCisJTUNYVERVTVBTVEFUVVNfQ0FOQ0VMSU5HCQkvKiByZXF1ZXN0b3IgY2FuY2VsZWQg dGhlIGR1bXBpbmcgKi8KK30gTWN4dER1bXBTdGF0dXM7CisKK3R5cGVkZWYgc3RydWN0IG1jeHRk dW1wU2htZW1TdHJ1Y3QKK3sKKwlwaWRfdAkJZHN0X3BpZDsJCS8qIHBpZCBvZiB0aGUgc2lnbmFs IHJlY2VpdmVyICovCisJcGlkX3QJCXNyY19waWQ7CQkvKiBwaWQgb2YgdGhlIHNpZ25hbCBzZW5k ZXIgKi8KKwlNY3h0RHVtcFN0YXR1cwlkdW1wX3N0YXR1czsJCS8qIGR1bXAgc3RhdHVzICovCit9 IG1jeHRkdW1wU2htZW1TdHJ1Y3Q7CisKK2V4dGVybiB2b2lkIFByb2Nlc3NEdW1wTWVtb3J5Q29u dGV4dEludGVycnVwdCh2b2lkKTsKK2V4dGVybiB2b2lkIEhhbmRsZVByb2NTaWduYWxEdW1wTWVt b3J5Q29udGV4dCh2b2lkKTsKK2V4dGVybiB2b2lkIE1jeHREdW1wU2htZW1Jbml0KHZvaWQpOwor ZXh0ZXJuIHZvaWQgUmVtb3ZlTWN4dER1bXBGaWxlKGludCk7CitleHRlcm4gdm9pZCBSZW1vdmVN ZW1jeHRGaWxlKGludCk7CisjZW5kaWYJCQkJCQkJLyogTUNYVF9IICovCi0tIAoyLjE4LjEKCg== --=_8f8bf0e3c818b3b2e47212e92f9f6c6f--