From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from cmo-0001.xspmail.jp ([202.238.198.168]) by ewsd; Thu Oct 15 23:42:53 -0400 2020 Received: from cmr-0000.xspmail.jp ([202.238.198.117]) by cmo with ESMTP id TGdAkT54NL3UqTGdmkv9T6; Fri, 16 Oct 2020 12:42:50 +0900 Received: from titan.jitaku.localdomain ([180.146.253.22]) by cmr with ESMTPA id TGdmkC7NwZlg9TGdmkDYuW; Fri, 16 Oct 2020 12:42:50 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hera.eonet.ne.jp; s=x01; t=1602819770; i=kokamoto@hera.eonet.ne.jp; bh=k+mQr1KqL0EyfAJYIgNs836uO1Xc5zGTYJLrKZh6Ywo=; h=To:Subject:Date:From:In-Reply-To; b=MZ9V16KJ/gbkemyQ+scYewwJSl9PsBagkec0a96tbSdKtCWzk+8upCO8aGpJulmUV MV6ZI2XV3U5rd9cAVVipdVwURE9LGlYEsGIF+V9MroAyqGX+1hz0kk377nR8GyTD/d RJU0jLhnYwA4OAtzgAzj0uwKs4UaViQK5FuhB0srKeOiKtjkT4ouFPKJmAtgh/JAH9 GuaLAbA8CBKq6AdJMV3uJds4wAhqvHT+5kmi8J3pd5ouXG1NmKEcyQkEh6MK7L+395 kpofKKMP9yYUP9zv4OY+JGXEUsIEMNMO6SoNqEZDk9X5ecZNvqDJVRjT0Uhzk2nXl1 I8M+Fj5b2e1Aw== Message-ID: <95EAD3571F321A2E03AF2D2A7E8BCCEB@hera.eonet.ne.jp> To: 9front@9front.org Subject: Re: [9front] rpi3 wifi Date: Fri, 16 Oct 2020 12:42:48 +0900 From: kokamoto@hera.eonet.ne.jp In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="upas-cvgadubxdchlyyhmovgkfjuozu" List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: progressive self-signing-scale information-aware configuration controller This is a multi-part message in MIME format. --upas-cvgadubxdchlyyhmovgkfjuozu Content-Disposition: inline Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit I got success on my rpi3B terminal, and the following is my report: Plan 9 Console 127 holes free 0x0051a000 0x19243000 416452608 416452608 bytes free Plan 9 from Bell Labs board rev: 0xa02082 firmware rev: 1574098197 cpu0: 1200MHz ARM Coretex-A53 r0p4 fp: 32 registers, simd fp: arm arch CFPv3+ with null subarch; rev 4 "l0: 4330: 10Mbps port 0x0 irq -1 ea 000000000000 498M memory: 403M kernel data, 595M user, 3574M swap cpu1: 1200MHz ARM Coretex-A53 r0p4 cpu2: 1200MHz ARM Coretex-A53 r0p4 cpu3: 1200MHz ARM Coretex-A53 r0p4 ether4330: chip 43430 rev 1 type 1 ether4330: firmware ready ether4330: addr xxxxxxxxxxxx /dev/sdM0: BCM SDHost Controller /dev/sdM0/data /dev/sdM0/dos dos /dev/sdM0/fs hjfs /dev/sdM0/nvram /dev/sdM0/plan9 bootargs is (tcp, tls, il, local!device) local!/dev/sdM0/fs <==== term% aux/wpa -s aterm-dcc371-g -p2 /net/ether0 <==== passwd: xxxxxxxxxxxxx term% ip/ipconfig -g 192.168.11.1 ether /net/ether0 add 192.168.11.19 255.255.255.0 192.168.11.5 192.168.11.5 <==== term% abaco http://google.co.jp OK! I got goole. Problem: I cannot boot this machine from network fs. My cmdlin.txt is: console=0 ether0=type=4330 essid=aterm-dcc371-g wpapsk=xxxxxxxxxxxxx wificrypt=wpa2 fs=192.168.11.5 auth=192.168.11.5 bootargs=tls nora6= However, thos essid etc are not accepted by the booting kernel. Kenji PS: by the way, I remember someone reported this for arm64, I forgot to archive it, please let me know the place --upas-cvgadubxdchlyyhmovgkfjuozu Content-Type: message/rfc822 Content-Disposition: inline Return-Path: 9front-bounces@ewsd.inri.net Received: from cmi-0001.m.xspmail.jp (LHLO cmi-0001.xspmail.jp) (100.120.21.2) by zmbs-0041.m.xspmail.jp with LMTP; Tue, 13 Oct 2020 21:17:21 +0900 (JST) Received: from ewsd.inri.net ([107.191.116.128]) by cmi with ESMTP id SJEzkSBHx9G5PSJF0k1LEm; Tue, 13 Oct 2020 21:17:21 +0900 X-Country-Code: US Authentication-Results: cmi-0001.xspmail.jp; dkim=pass header.d=gmail.com header.b=AGH4jUDc; dmarc=pass header.from=gmail.com; x-token-a=pass; x-token-b=pass Received-SPF: PASS identity=mailfrom; envelope-from="9front-bounces@ewsd.inri.net" Received: from mail-qk1-f171.google.com ([209.85.222.171]) by ewsd; Tue Oct 13 08:16:45 -0400 2020 Received: by mail-qk1-f171.google.com with SMTP id a23so20505654qkg.13 for <9front@9front.org>; Tue, 13 Oct 2020 05:16:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=S64sn9UaNON0WlK70VcikSiukJEBozHTb0QIpg+IEIU=; b=AGH4jUDcbuWGNGkELqZq8y+i4hEzjeaXEVp7EsIhPSZkGeFNX1W/1Jqv9hLvKlU7cn WYPcOPp73rLUtNXkdobGYkGwz3danl4wY76g9dQD0djU77mo0btdBLr3kHCMUXpEZZNS ujGeLUhcdm0WLNamEqsHI8HJTwQHZnsK7QEpMX5R0MS64aLcoKYmKTnNI3Q1d50xHOAG ZohOJWANEhyGAXcqoVKWEeLvQlu/cvRtxjAvY9e1x0vacYkXDK16KYHXnF1mXLNQaM2O dnY74FrPh6genEO72hO5d3b0FoatV1CGSZzd84BW1X3TzOWgIbdHgQCVOwYiLVu8LO1S y1VA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=S64sn9UaNON0WlK70VcikSiukJEBozHTb0QIpg+IEIU=; b=OPv8v8t+H2/mcOte0Y1Gw+q2UnEWCfoJ3LEWHXNM30+kbEEd7UhPUib8GXN+NrHSC8 3JILEMUTjAYP4ODyge9AgLigbrX62agIZphPagIdvHdKOalgd7/BVi2jCdMs8eFmfiNr jf4FCw+eLcuxRyfw7z6Kg11NvdHO9AqT+NsCEvlgqijzXqBtw+CF2GlyX6lhm8vOylnv POLEhzro01xx2wu1i3O9Po8nC2ecdBnjpuBi2x40D3Pmvvi4qHsjquLOiE1qF5gBAwOI 2/AIbFZJtF9rfw8X0LLqeVo8W72+FWq0ahaf4O2NH8AdPvqFpSDFXdcxTyCU6+0d89bc roRg== X-Gm-Message-State: AOAM533YzQ/majzb3DZNTgVdPD0kpuOTwXnOJzwF9psWUqIvLedm3BdS c7x8vt6QCmEtt4OynnN7S3TvmO80It+AP9ZrCa5X/m4T X-Google-Smtp-Source: ABdhPJxa6Vv8E/oG1bYQGrQTcwkH6HARhL89Ba5ovHEfDCEIhDA5eioIIjKDp+rdK4c1GkvaHYsCumolpAd7le6KvWo= X-Received: by 2002:a37:aa51:: with SMTP id t78mr13898432qke.170.1602591399603; Tue, 13 Oct 2020 05:16:39 -0700 (PDT) MIME-Version: 1.0 References: <20200823052639.GA72726@wopr> In-Reply-To: <20200823052639.GA72726@wopr> From: Eli Cohen Date: Tue, 13 Oct 2020 05:16:28 -0700 Message-ID: To: 9front@9front.org Content-Type: multipart/mixed; boundary="0000000000001849ce05b18c6346" List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: anonymous high-performance base storage Subject: Re: [9front] rpi3 wifi Reply-To: 9front@9front.org Precedence: bulk --0000000000001849ce05b18c6346 Content-Type: text/plain; charset="UTF-8" I managed to get this working with the 32-bit kernel, though it doesn't like my access point it isn't really clean enough to be included... I'm using the linux firmware, I dunno if that makes a difference --0000000000001849ce05b18c6346 Content-Type: application/octet-stream; name="pi2wifi.diff" Content-Disposition: attachment; filename="pi2wifi.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kg7xgwuu0 ZGlmZiAtciA0NGVhZTlhN2U5OGIgc3lzL3NyYy85L2JjbS9lbW1jLmMKLS0tIGEvc3lzL3NyYy85 L2JjbS9lbW1jLmMJU3VuIE9jdCAxMSAxNDo1OTo0OSAyMDIwICswMjAwCisrKyBiL3N5cy9zcmMv OS9iY20vZW1tYy5jCVR1ZSBPY3QgMTMgMDU6MDk6NDkgMjAyMCAtMDcwMApAQCAtMTAsNyArMTAs NyBAQAogCQkyMi0yNyAoUDEgaGVhZGVyKQogCQkzNC0zOSAod2lmaSAtIHBpMyBvbmx5KQogCXVz aW5nIEFMVDMgZnVuY3Rpb24gdG8gYWN0aXZhdGUgdGhlIHJlcXVpcmVkIHJvdXRpbmcKLSovCisg Ki8KIAogI2luY2x1ZGUgInUuaCIKICNpbmNsdWRlICIuLi9wb3J0L2xpYi5oIgpAQCAtMzQsMTIg KzM0LDExIEBACiAJR29JZGxlCQk9IDAsCQkvKiBtbWMvc2RpbyBnbyBpZGxlIHN0YXRlICovCiAJ TU1DU2VsZWN0CT0gNywJCS8qIG1tYy9zZCBjYXJkIHNlbGVjdCBjb21tYW5kICovCiAJU2V0YnVz d2lkdGgJPSA2LAkJLyogbW1jL3NkIHNldCBidXMgd2lkdGggY29tbWFuZCAqLwotCiAJU3dpdGNo ZnVuYwk9IDYsCQkvKiBtbWMvc2Qgc3dpdGNoIGZ1bmN0aW9uIGNvbW1hbmQgKi8KLQlWb2x0YWdl c3dpdGNoCT0gMTEsCQkvKiBtZC9zZGlvIHN3aXRjaCB0byAxLjhWICovCi0JSU9SV2RpcmVjdAk9 IDUyLAkJLyogc2RpbyByZWFkL3dyaXRlIGRpcmVjdCBjb21tYW5kICovCi0JSU9SV2V4dGVuZGVk CT0gNTMsCQkvKiBzZGlvIHJlYWQvd3JpdGUgZXh0ZW5kZWQgY29tbWFuZCAqLwotCUFwcGNtZAkJ PSA1NSwJCS8qIG1tYy9zZCBhcHBsaWNhdGlvbiBjb21tYW5kIHByZWZpeCAqLworCVZvbHRhZ2Vz d2l0Y2ggPSAxMSwJCS8qIG1kL3NkaW8gc3dpdGNoIHRvIDEuOFYgKi8KKwlJT1JXZGlyZWN0ID0g NTIsCQkvKiBzZGlvIHJlYWQvd3JpdGUgZGlyZWN0IGNvbW1hbmQgKi8KKwlJT1JXZXh0ZW5kZWQg PSA1MywJCS8qIHNkaW8gcmVhZC93cml0ZSBleHRlbmRlZCBjb21tYW5kICovCisJQXBwY21kID0g NTUsCQkJLyogbW1jL3NkIGFwcGxpY2F0aW9uIGNvbW1hbmQgcHJlZml4ICovCiB9OwogCiBlbnVt IHsKQEAgLTcyLDcgKzcxLDcgQEAKIAlTbG90aXNydmVyCQk9IDB4ZmM+PjIsCiAKIAkvKiBDb250 cm9sMCAqLwotCUhpc3BlZWQJCQk9IDE8PDIsCQorCUhpc3BlZWQJCQk9IDE8PDIsCiAJRHdpZHRo NAkJCT0gMTw8MSwKIAlEd2lkdGgxCQkJPSAwPDwxLAogCkBAIC0xMjIsNyArMTIxLDcgQEAKIAlD Y3JjZXJyCQk9IDE8PDE3LAogCUN0b2VycgkJPSAxPDwxNiwKIAlFcnIJCT0gMTw8MTUsCi0JQ2Fy ZGludHIJPSAxPDw4LAkJLyogbm90IGluIEJyb2FkY29tIGRhdGFzaGVldCAqLworCUNhcmRpbnRy CT0gMTw8OCwKIAlDYXJkaW5zZXJ0CT0gMTw8NiwJCS8qIG5vdCBpbiBCcm9hZGNvbSBkYXRhc2hl ZXQgKi8KIAlSZWFkcmR5CQk9IDE8PDUsCiAJV3JpdGVyZHkJPSAxPDw0LApAQCAtMTU4LDcgKzE1 Nyw3IEBACiBbMjVdIFJlc3A0OCB8IElzZGF0YSB8IEhvc3QyY2FyZCB8IE11bHRpYmxvY2sgfCBC bGtjbnRlbiB8IEl4Y2hrZW4gfCBDcmNjaGtlbiwKIFs0MV0gUmVzcDQ4LAogWzUyXSBSZXNwNDgg fCBJeGNoa2VuIHwgQ3JjY2hrZW4sCi1bNTNdIFJlc3A0OCB8IEl4Y2hrZW4gfCBDcmNjaGtlbiB8 IElzZGF0YSwKK1s1M10gUmVzcDQ4CXwgSXhjaGtlbiB8IENyY2Noa2VuIHwgSXNkYXRhLAogWzU1 XSBSZXNwNDggfCBJeGNoa2VuIHwgQ3JjY2hrZW4sCiB9OwogCkBAIC0xODIsNyArMTgxLDcgQEAK IAl1MzJpbnQgKnIgPSAodTMyaW50KilFTU1DUkVHUzsKIAogCWlmKDApcHJpbnQoIldSICUyLjJ1 eCAldXhcbiIsIHJlZzw8MiwgdmFsKTsKLQltaWNyb2RlbGF5KGVtbWMuZmFzdGNsb2NrID8gMjog MjApOworCW1pY3JvZGVsYXkoZW1tYy5mYXN0Y2xvY2s/IDIgOiAyMCk7CiAJY29oZXJlbmNlKCk7 CiAJcltyZWddID0gdmFsOwogfQpAQCAtMjg4LDYgKzI4NywyNCBAQAogCWludHJlbmFibGUoSVJR bW1jLCBtbWNpbnRlcnJ1cHQsIG5pbCwgQlVTVU5LTk9XTiwgIm1tYyIpOwogfQogCitpbnQKK3Nk aW9jYXJkaW50cihpbnQgd2FpdCkKK3sKKwl1MzJpbnQgKnI7CisJaW50IGk7CisKKwlyID0gKHUz MmludCopRU1NQ1JFR1M7CisJV1IoSW50ZXJydXB0LCBDYXJkaW50cik7CisJd2hpbGUoKChpID0g cltJbnRlcnJ1cHRdKSAmIENhcmRpbnRyKSA9PSAwKXsKKwkJaWYoIXdhaXQpCisJCQlyZXR1cm4g MDsKKwkJV1IoSXJwdGVuLCByW0lycHRlbl0gfCBDYXJkaW50cik7CisJCXNsZWVwKCZlbW1jLmNh cmRyLCBjYXJkaW50cmVhZHksIDApOworCX0KKwlXUihJbnRlcnJ1cHQsIENhcmRpbnRyKTsKKwly ZXR1cm4gaTsKK30KKwogc3RhdGljIGludAogZW1tY2NtZCh1MzJpbnQgY21kLCB1MzJpbnQgYXJn LCB1MzJpbnQgKnJlc3ApCiB7CkBAIC0zMTksOCArMzM2LDcgQEAKIAkJV1IoQ29udHJvbDAsIHJb Q29udHJvbDBdICYgfihEd2lkdGg0fEhpc3BlZWQpKTsKIAkJZW1tY2NsayhJbml0ZnJlcSk7CiAJ fQotCWlmKChyW1N0YXR1c10gJiBEYXRpbmhpYml0KSAmJgotCSAgICgoYyAmIElzZGF0YSkgfHwg KGMgJiBSZXNwbWFzaykgPT0gUmVzcDQ4YnVzeSkpeworCWlmKHJbU3RhdHVzXSAmIENtZGluaGli aXQpewogCQlwcmludCgiZW1tY2NtZDogbmVlZCB0byByZXNldCBDbWRpbmhpYml0IGludHIgJXV4 IHN0YXQgJXV4XG4iLAogCQkJcltJbnRlcnJ1cHRdLCByW1N0YXR1c10pOwogCQlXUihDb250cm9s MSwgcltDb250cm9sMV0gfCBTcnN0Y21kKTsKQEAgLTMyOSw4ICszNDUsOCBAQAogCQl3aGlsZShy W1N0YXR1c10gJiBDbWRpbmhpYml0KQogCQkJOwogCX0KLQlpZigoYyAmIElzZGF0YSB8fCAoYyAm IFJlc3BtYXNrKSA9PSBSZXNwNDhidXN5KSAmJgotCSAgICByW1N0YXR1c10gJiBEYXRpbmhpYml0 KXsKKwlpZigocltTdGF0dXNdICYgRGF0aW5oaWJpdCkgJiYKKwkgICAoKGMgJiBJc2RhdGEpIHx8 IChjICYgUmVzcG1hc2spID09IFJlc3A0OGJ1c3kpKXsKIAkJcHJpbnQoImVtbWNjbWQ6IG5lZWQg dG8gcmVzZXQgRGF0aW5oaWJpdCBpbnRyICV1eCBzdGF0ICV1eFxuIiwKIAkJCXJbSW50ZXJydXB0 XSwgcltTdGF0dXNdKTsKIAkJV1IoQ29udHJvbDEsIHJbQ29udHJvbDFdIHwgU3JzdGRhdGEpOwpA QCAtNDM1LDcgKzQ1MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBl bW1jaW9zZXR1cChpbnQgd3JpdGUsIHZvaWQgKmJ1ZiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQog ewogCVVTRUQod3JpdGUpOwpAQCAtNDY0LDYgKzQ4MCw4IEBACiAJCQkmcltEYXRhXSwgYnVmLCBs ZW4pOwogCWlmKGRtYXdhaXQoRG1hQ2hhbkVtbWMpIDwgMCkKIAkJZXJyb3IoRWlvKTsKKwlpZigh d3JpdGUpCisJCWNhY2hlZGludnNlKGJ1ZiwgbGVuKTsKIAlXUihJcnB0ZW4sIHJbSXJwdGVuXXxE YXRhZG9uZXxFcnIpOwogCXRzbGVlcCgmZW1tYy5yLCBkYXRhZG9uZSwgMCwgMzAwMCk7CiAJaSA9 IHJbSW50ZXJydXB0XSZ+Q2FyZGludHI7CkBAIC01MDgsNSArNTI2LDQgQEAKIAllbW1jY21kLAog CWVtbWNpb3NldHVwLAogCWVtbWNpbywKLQkuaGlnaHNwZWVkID0gMSwKIH07CmRpZmYgLXIgNDRl YWU5YTdlOThiIHN5cy9zcmMvOS9iY20vZXRoZXI0MzMwLmMKLS0tIC9kZXYvbnVsbAlUaHUgSmFu IDAxIDAwOjAwOjAwIDE5NzAgKzAwMDAKKysrIGIvc3lzL3NyYy85L2JjbS9ldGhlcjQzMzAuYwlU dWUgT2N0IDEzIDA1OjA5OjQ5IDIwMjAgLTA3MDAKQEAgLTAsMCArMSwyMzk2IEBACisvKgorICog QnJvYWRjb20gYmNtNDMzMCB3aWZpIChzZGlvIGludGVyZmFjZSkKKyAqLworCisjaW5jbHVkZSAi dS5oIgorI2luY2x1ZGUgIi4uL3BvcnQvbGliLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVk ZSAiZGF0LmgiCisjaW5jbHVkZSAiZm5zLmgiCisjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICIu Li9wb3J0L2Vycm9yLmgiCisjaW5jbHVkZSAiLi4vcG9ydC9uZXRpZi5oIgorI2luY2x1ZGUgIi4u L3BvcnQvc2QuaCIKKworZXh0ZXJuIGludCBzZGlvY2FyZGludHIoaW50KTsKKworI2luY2x1ZGUg Ii4uL3BvcnQvZXRoZXJpZi5oIgorI2RlZmluZSBDQUNIRUxJTkVTWiA2NAkvKiB0ZW1wICovCisK K2VudW17CisJU0RJT0RFQlVHID0gMCwKKwlTQkRFQlVHID0gMCwKKwlFVkVOVERFQlVHID0gMCwK KwlWQVJERUJVRyA9IDAsCisJRldERUJVRyAgPSAwLAorCisJQ29yZXNjYW5zeiA9IDUxMiwKKwlV cGxvYWRzeiA9IDIwNDgsCisKKwlXaWZpY2hhbiA9IDAsCQkvKiBkZWZhdWx0IGNoYW5uZWwgKi8K KwlGaXJtd2FyZWNtcAk9IDEsCisKKwlBUk1jbTMJCT0gMHg4MkEsCisJQVJNN3RkbWkJPSAweDgy NSwKKwlBUk1jcjQJCT0gMHg4M0UsCisKKwlGbjAJPSAwLAorCUZuMSAJPSAxLAorCUZuMgk9IDIs CisJRmJyMQk9IDB4MTAwLAorCUZicjIJPSAweDIwMCwKKworCS8qIENDQ1IgKi8KKwlJb2VuYWJs ZQk9IDB4MDIsCisJSW9yZWFkeQkJPSAweDAzLAorCUludGVuYWJsZQk9IDB4MDQsCisJSW50cGVu ZAkJPSAweDA1LAorCUlvYWJvcnQJCT0gMHgwNiwKKwlCdXNpZmMJCT0gMHgwNywKKwlDYXBhYmls aXR5CT0gMHgwOCwKKwlCbGtzaXplCQk9IDB4MTAsCisJSGlnaHNwZWVkCT0gMHgxMywKKworCS8q IFNESU9Db21tYW5kcyAqLworCUdPX0lETEVfU1RBVEUJCT0gMCwKKwlTRU5EX1JFTEFUSVZFX0FE RFIJPSAzLAorCUlPX1NFTkRfT1BfQ09ORAkJPSA1LAorCVNFTEVDVF9DQVJECQk9IDcsCisJVk9M VEFHRV9TV0lUQ0ggCQk9IDExLAorCUlPX1JXX0RJUkVDVCAJCT0gNTIsCisJSU9fUldfRVhURU5E RUQgCQk9IDUzLAorCisJLyogU0VMRUNUX0NBUkQgYXJncyAqLworCVJjYXNoaWZ0CT0gMTYsCisK KwkvKiBTRU5EX09QX0NPTkQgYXJncyAqLworCUhjcwk9IDE8PDMwLAkvKiBob3N0IHN1cHBvcnRz IFNESEMgJiBTRFhDICovCisJVjNfMwk9IDM8PDIwLAkvKiAzLjItMy40IHZvbHRzICovCisJVjJf OAk9IDM8PDE1LAkvKiAyLjctMi45IHZvbHRzICovCisJVjJfMAk9IDE8PDgsCQkvKiAyLjAtMi4x IHZvbHRzICovCisJUzE4Ugk9IDE8PDI0LAkvKiBzd2l0Y2ggdG8gMS44ViByZXF1ZXN0ICovCisK KwkvKiBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUgKGFjY2VzcyB0byBjb3JlcyBvbiBjaGlwKSAq LworCVNid3NpemUJPSAweDgwMDAsCisJU2IzMmJpdAk9IDB4ODAwMCwKKwlTYmFkZHIJPSAweDEw MDBhLAorCQlFbnVtYmFzZQk9IAkweDE4MDAwMDAwLAorCUZyYW1lY3RsPSAweDEwMDBkLAorCQlS ZmhhbHQJCT0JMHgwMSwKKwkJV2ZoYWx0CQk9CTB4MDIsCisJQ2xrY3NyCT0gMHgxMDAwZSwKKwkJ Rm9yY2VBTFAJPQkweDAxLAkvKiBhY3RpdmUgbG93LXBvd2VyIGNsb2NrICovCisJCUZvcmNlSFQJ CT0gCTB4MDIsCS8qIGhpZ2ggdGhyb3VnaHB1dCBjbG9jayAqLworCQlGb3JjZUlMUAk9CTB4MDQs CS8qIGlkbGUgbG93LXBvd2VyIGNsb2NrICovCisJCVJlcUFMUAkJPQkweDA4LAorCQlSZXFIVAkJ PQkweDEwLAorCQlOb2h3cmVxCQk9CTB4MjAsCisJCUFMUGF2YWlsCT0JMHg0MCwKKwkJSFRhdmFp bAkJPQkweDgwLAorCVB1bGx1cHMJPSAweDEwMDBmLAorCVdmcm1jbnQJPSAweDEwMDE5LAorCVJm cm1jbnQJPSAweDEwMDFiLAorCQkKKwkvKiBjb3JlIGNvbnRyb2wgcmVncyAqLworCUlvY3RybAkJ PSAweDQwOCwKKwlSZXNldGN0cmwJPSAweDgwMCwKKworCS8qIHNvY3JhbSByZWdzICovCisJQ29y ZWluZm8JPSAweDAwLAorCUJhbmtpZHgJCT0gMHgxMCwKKwlCYW5raW5mbwk9IDB4NDAsCisJQmFu a3BkYQkJPSAweDQ0LAorCisJLyogYXJtY3I0IHJlZ3MgKi8KKwlDcjRDYXAJCT0gMHgwNCwKKwlD cjRCYW5raWR4CT0gMHg0MCwKKwlDcjRCYW5raW5mbwk9IDB4NDQsCisJQ3I0Q3B1aGFsdAk9IDB4 MjAsCisKKwkvKiBjaGlwY29tbW9uIHJlZ3MgKi8KKwlHcGlvcHVsbHVwCT0gMHg1OCwKKwlHcGlv cHVsbGRvd24JPSAweDVjLAorCUNoaXBjdGxhZGRyCT0gMHg2NTAsCisJQ2hpcGN0bGRhdGEJPSAw eDY1NCwKKworCS8qIHNkaW8gY29yZSByZWdzICovCisJSW50c3RhdHVzCT0gMHgyMCwKKwkJRmNz dGF0ZQkJPSAxPDw0LAorCQlGY2NoYW5nZQk9IDE8PDUsCisJCUZyYW1lSW50CT0gMTw8NiwKKwkJ TWFpbGJveEludAk9IDE8PDcsCisJSW50bWFzawkJPSAweDI0LAorCVNibWJveAkJPSAweDQwLAor CVNibWJveGRhdGEJPSAweDQ4LAorCUhvc3RtYm94ZGF0YT0gMHg0YywKKwkJRndyZWFkeQkJPSAw eDgwLAorCisJLyogd2lmaSBjb250cm9sIGNvbW1hbmRzICovCisJR2V0VmFyCT0gMjYyLAorCVNl dFZhcgk9IDI2MywKKworCS8qIHN0YXR1cyAqLworCURpc2Nvbm5lY3RlZD0JMCwKKwlDb25uZWN0 aW5nLAorCUNvbm5lY3RlZCwKK307CisKK3R5cGVkZWYgc3RydWN0IEN0bHIgQ3RscjsKKworZW51 bXsKKwlXcGEJCT0gMSwKKwlXZXAJCT0gMiwKKwlXcGEyCQk9IDMsCisJV05hbWVMZW4JPSAzMiwK KwlXTktleXMJCT0gNCwKKwlXS2V5TGVuCQk9IDMyLAorCVdNaW5LZXlMZW4JPSA1LAorCVdNYXhL ZXlMZW4JPSAxMywKK307CisKK3R5cGVkZWYgc3RydWN0IFdLZXkgV0tleTsKK3N0cnVjdCBXS2V5 Cit7CisJdXNob3J0CWxlbjsKKwljaGFyCWRhdFtXS2V5TGVuXTsKK307CisKK3N0cnVjdCBDdGxy IHsKKwlFdGhlcioJZWRldjsKKwlRTG9jawljbWRsb2NrOworCVFMb2NrCXBrdGxvY2s7CisJUUxv Y2sJdGxvY2s7CisJUUxvY2sJYWxvY2s7CisJTG9jawl0eHdpbmxvY2s7CisJUmVuZGV6CWNtZHI7 CisJUmVuZGV6CWpvaW5yOworCWludAlqb2luc3RhdHVzOworCWludAljcnlwdG90eXBlOworCWlu dAljaGFuaWQ7CisJY2hhcgllc3NpZFtXTmFtZUxlbiArIDFdOworCVdLZXkJa2V5c1tXTktleXNd OworCUJsb2NrCSpyc3A7CisJQmxvY2sJKnNjYW5iOworCWludAlzY2Fuc2VjczsKKwlpbnQJc3Rh dHVzOworCWludAljaGlwaWQ7CisJaW50CWNoaXByZXY7CisJaW50CWFybWNvcmU7CisJY2hhcgkq cmVndWZpbGU7CisJdW5pb24geworCQl1MzJpbnQgaTsKKwkJdWNoYXIgY1s0XTsKKwl9IHJlc2V0 dmVjOworCXVsb25nCWNoaXBjb21tb247CisJdWxvbmcJYXJtY3RsOworCXVsb25nCWFybXJlZ3M7 CisJdWxvbmcJZDExY3RsOworCXVsb25nCXNvY3JhbXJlZ3M7CisJdWxvbmcJc29jcmFtY3RsOwor CXVsb25nCXNkcmVnczsKKwlpbnQJc2Rpb3JldjsKKwlpbnQJc29jcmFtcmV2OworCXVsb25nCXNv Y3JhbXNpemU7CisJdWxvbmcJcmFtYmFzZTsKKwlzaG9ydAlyZXFpZDsKKwl1Y2hhcglmY21hc2s7 CisJdWNoYXIJdHh3aW5kb3c7CisJdWNoYXIJdHhzZXE7CisJdWNoYXIJcnhzZXE7Cit9OworCitl bnVteworCUNNYXV0aCwKKwlDTWNoYW5uZWwsCisJQ01jcnlwdCwKKwlDTWVzc2lkLAorCUNNa2V5 MSwKKwlDTWtleTIsCisJQ01rZXkzLAorCUNNa2V5NCwKKwlDTXJ4a2V5LAorCUNNcnhrZXkwLAor CUNNcnhrZXkxLAorCUNNcnhrZXkyLAorCUNNcnhrZXkzLAorCUNNdHhrZXksCisJQ01kZWJ1ZywK KwlDTWpvaW4sCit9OworCitzdGF0aWMgQ21kdGFiIGNtZHNbXSA9IHsKKwl7Q01hdXRoLAkiYXV0 aCIsIDJ9LAorCXtDTWNoYW5uZWwsCSJjaGFubmVsIiwgMn0sCisJe0NNY3J5cHQsCSJjcnlwdCIs IDJ9LAorCXtDTWVzc2lkLAkiZXNzaWQiLCAyfSwKKwl7Q01rZXkxLAkia2V5MSIsCTJ9LAorCXtD TWtleTIsCSJrZXkxIiwJMn0sCisJe0NNa2V5MywJImtleTEiLAkyfSwKKwl7Q01rZXk0LAkia2V5 MSIsCTJ9LAorCXtDTXJ4a2V5LAkicnhrZXkiLCAzfSwKKwl7Q01yeGtleTAsCSJyeGtleTAiLCAz fSwKKwl7Q01yeGtleTEsCSJyeGtleTEiLCAzfSwKKwl7Q01yeGtleTIsCSJyeGtleTIiLCAzfSwK Kwl7Q01yeGtleTMsCSJyeGtleTMiLCAzfSwKKwl7Q010eGtleSwJInR4a2V5IiwgM30sCisJe0NN ZGVidWcsCSJkZWJ1ZyIsIDJ9LAorCXtDTWpvaW4sCSJqb2luIiwgNX0sCit9OworCit0eXBlZGVm IHN0cnVjdCBTZHBjbSBTZHBjbTsKK3R5cGVkZWYgc3RydWN0IENtZCBDbWQ7CitzdHJ1Y3QgU2Rw Y20geworCXVjaGFyCWxlblsyXTsKKwl1Y2hhcglsZW5ja1syXTsKKwl1Y2hhcglzZXE7CisJdWNo YXIJY2hhbmZsZzsKKwl1Y2hhcgluZXh0bGVuOworCXVjaGFyCWRvZmZzZXQ7CisJdWNoYXIJZmNt YXNrOworCXVjaGFyCXdpbmRvdzsKKwl1Y2hhcgl2ZXJzaW9uOworCXVjaGFyCXBhZDsKK307CisK K3N0cnVjdCBDbWQgeworCXVjaGFyCWNtZFs0XTsKKwl1Y2hhcglsZW5bNF07CisJdWNoYXIJZmxh Z3NbMl07CisJdWNoYXIJaWRbMl07CisJdWNoYXIJc3RhdHVzWzRdOworfTsKKworc3RhdGljIGNo YXIgY29uZmlnNDAxODFbXSA9ICJiY21kaGQuY2FsLjQwMTgxIjsKK3N0YXRpYyBjaGFyIGNvbmZp ZzQwMTgzW10gPSAiYmNtZGhkLmNhbC40MDE4My4yNk1IeiI7CisKK3N0cnVjdCB7CisJaW50IGNo aXBpZDsKKwlpbnQgY2hpcHJldjsKKwljaGFyICpmd2ZpbGU7CisJY2hhciAqY2ZnZmlsZTsKKwlj aGFyICpyZWd1ZmlsZTsKK30gZmlybXdhcmVbXSA9IHsKKwl7IDB4NDMzMCwgMywJImZ3X2JjbTQw MTgzYjEuYmluIiwgY29uZmlnNDAxODMsIDAgfSwKKwl7IDB4NDMzMCwgNCwJImZ3X2JjbTQwMTgz YjIuYmluIiwgY29uZmlnNDAxODMsIDAgfSwKKwl7IDQzMzYyLCAwLAkiZndfYmNtNDAxODFhMC5i aW4iLCBjb25maWc0MDE4MSwgMCB9LAorCXsgNDMzNjIsIDEsCSJmd19iY200MDE4MWEyLmJpbiIs IGNvbmZpZzQwMTgxLCAwIH0sCisJeyA0MzQzMCwgMSwJImJyY21mbWFjNDM0MzAtc2Rpby5iaW4i LCAiYnJjbWZtYWM0MzQzMC1zZGlvLnR4dCIsIDAgfSwKKwl7IDB4NDM0NSwgNiwgImJyY21mbWFj NDM0NTUtc2Rpby5iaW4iLCAiYnJjbWZtYWM0MzQ1NS1zZGlvLnR4dCIsICJicmNtZm1hYzQzNDU1 LXNkaW8uY2xtX2Jsb2IiIH0sCit9OworCitzdGF0aWMgUUxvY2sgc2Rpb2xvY2s7CitzdGF0aWMg aW50IGlvZGVidWc7CisKK3N0YXRpYyB2b2lkIGV0aGVyYmNtaW50cih2b2lkICopOworc3RhdGlj IHZvaWQgYmNtZXZlbnQoQ3RsciosIHVjaGFyKiwgaW50KTsKK3N0YXRpYyB2b2lkIHdsc2NhbnJl c3VsdChFdGhlciosIHVjaGFyKiwgaW50KTsKK3N0YXRpYyB2b2lkIHdsc2V0dmFyKEN0bHIqLCBj aGFyKiwgdm9pZCosIGludCk7CisKK3N0YXRpYyB1Y2hhcioKK3B1dDIodWNoYXIgKnAsIHNob3J0 IHYpCit7CisJcFswXSA9IHY7CisJcFsxXSA9IHYgPj4gODsKKwlyZXR1cm4gcCArIDI7Cit9CisK K3N0YXRpYyB1Y2hhcioKK3B1dDQodWNoYXIgKnAsIGxvbmcgdikKK3sKKwlwWzBdID0gdjsKKwlw WzFdID0gdiA+PiA4OworCXBbMl0gPSB2ID4+IDE2OworCXBbM10gPSB2ID4+IDI0OworCXJldHVy biBwICsgNDsKK30KKworc3RhdGljIHVzaG9ydAorZ2V0Mih1Y2hhciAqcCkKK3sKKwlyZXR1cm4g cFswXSB8IHBbMV08PDg7Cit9CisKK3N0YXRpYyB1bG9uZworZ2V0NCh1Y2hhciAqcCkKK3sKKwly ZXR1cm4gcFswXSB8IHBbMV08PDggfCBwWzJdPDwxNiB8IHBbM108PDI0OworfQorCitzdGF0aWMg dm9pZAorZHVtcChjaGFyICpzLCB2b2lkICphLCBpbnQgbikKK3sKKwlpbnQgaTsKKwl1Y2hhciAq cDsKKworCXAgPSBhOworCXByaW50KCIlczoiLCBzKTsKKwlmb3IoaSA9IDA7IGkgPCBuOyBpKysp CisJCXByaW50KCIlYyUyLjJ4IiwgaSYxNT8gJyAnIDogJ1xuJywgKnArKyk7CisJcHJpbnQoIlxu Iik7Cit9CisKKy8qCisgKiBTRElPIGNvbW11bmljYXRpb24gd2l0aCBkb25nbGUKKyAqLworc3Rh dGljIHVsb25nCitzZGlvY21kX2xvY2tlZChpbnQgY21kLCB1bG9uZyBhcmcpCit7CisJdTMyaW50 IHJlc3BbNF07CisKKwlzZGlvLmNtZChjbWQsIGFyZywgcmVzcCk7CisJcmV0dXJuIHJlc3BbMF07 Cit9CisKK3N0YXRpYyB1bG9uZworc2Rpb2NtZChpbnQgY21kLCB1bG9uZyBhcmcpCit7CisJdWxv bmcgcjsKKworCXFsb2NrKCZzZGlvbG9jayk7CisJaWYod2FzZXJyb3IoKSl7CisJCWlmKFNESU9E RUJVRykgcHJpbnQoInNkaW9jbWQgZXJyb3I6IGNtZCAlZCBhcmcgJWx1eFxuIiwgY21kLCBhcmcp OworCQlxdW5sb2NrKCZzZGlvbG9jayk7CisJCW5leHRlcnJvcigpOworCX0KKwlyID0gc2Rpb2Nt ZF9sb2NrZWQoY21kLCBhcmcpOworCXF1bmxvY2soJnNkaW9sb2NrKTsKKwlwb3BlcnJvcigpOwor CXJldHVybiByOworCit9CisKK3N0YXRpYyB1bG9uZwordHJ5c2Rpb2NtZChpbnQgY21kLCB1bG9u ZyBhcmcpCit7CisJdWxvbmcgcjsKKworCWlmKHdhc2Vycm9yKCkpCisJCXJldHVybiAwOworCXIg PSBzZGlvY21kKGNtZCwgYXJnKTsKKwlwb3BlcnJvcigpOworCXJldHVybiByOworfQorCitzdGF0 aWMgaW50CitzZGlvcmQoaW50IGZuLCBpbnQgYWRkcikKK3sKKwlpbnQgcjsKKworCXIgPSBzZGlv Y21kKElPX1JXX0RJUkVDVCwgKDA8PDMxKXwoKGZuJjcpPDwyOCl8KChhZGRyJjB4MUZGRkYpPDw5 KSk7CisJaWYociAmIDB4Q0YwMCl7CisJCXByaW50KCJldGhlcjQzMzA6IHNkaW9yZCgleCwgJXgp IGZhaWw6ICUyLjJ1eCAlMi4ydXhcbiIsIGZuLCBhZGRyLCAocj4+OCkmMHhGRiwgciYweEZGKTsK KwkJZXJyb3IoRWlvKTsKKwl9CisJcmV0dXJuIHIgJiAweEZGOworfQorCitzdGF0aWMgdm9pZAor c2Rpb3dyKGludCBmbiwgaW50IGFkZHIsIGludCBkYXRhKQoreworCWludCByOworCWludCByZXRy eTsKKworCXIgPSAwOworCWZvcihyZXRyeSA9IDA7IHJldHJ5IDwgMTA7IHJldHJ5KyspeworCQly ID0gc2Rpb2NtZChJT19SV19ESVJFQ1QsICgxPDwzMSl8KChmbiY3KTw8MjgpfCgoYWRkciYweDFG RkZGKTw8OSl8KGRhdGEmMHhGRikpOworCQlpZigociAmIDB4Q0YwMCkgPT0gMCkKKwkJCXJldHVy bjsKKwl9CisJcHJpbnQoImV0aGVyNDMzMDogc2Rpb3dyKCV4LCAleCwgJXgpIGZhaWw6ICUyLjJ1 eCAlMi4ydXhcbiIsIGZuLCBhZGRyLCBkYXRhLCAocj4+OCkmMHhGRiwgciYweEZGKTsKKwllcnJv cihFaW8pOworfQorCitzdGF0aWMgdm9pZAorc2Rpb3J3ZXh0KGludCBmbiwgaW50IHdyaXRlLCB2 b2lkICphLCBpbnQgbGVuLCBpbnQgYWRkciwgaW50IGluY3IpCit7CisJaW50IGJzaXplLCBibGss IGJjb3VudCwgbTsKKworCWJzaXplID0gZm4gPT0gRm4yPyA1MTIgOiA2NDsKKwl3aGlsZShsZW4g PiAwKXsKKwkJaWYobGVuID49IDUxMSpic2l6ZSl7CisJCQlibGsgPSAxOworCQkJYmNvdW50ID0g NTExOworCQkJbSA9IGJjb3VudCpic2l6ZTsKKwkJfWVsc2UgaWYobGVuID4gYnNpemUpeworCQkJ YmxrID0gMTsKKwkJCWJjb3VudCA9IGxlbi9ic2l6ZTsKKwkJCW0gPSBiY291bnQqYnNpemU7CisJ CX1lbHNleworCQkJYmxrID0gMDsKKwkJCWJjb3VudCA9IGxlbjsKKwkJCW0gPSBiY291bnQ7CisJ CX0KKwkJcWxvY2soJnNkaW9sb2NrKTsKKwkJaWYod2FzZXJyb3IoKSl7CisJCQlwcmludCgiZXRo ZXI0MzMwOiBzZGlvcndleHQgZmFpbDogJXNcbiIsIHVwLT5lcnJzdHIpOworCQkJcXVubG9jaygm c2Rpb2xvY2spOworCQkJbmV4dGVycm9yKCk7CisJCX0KKwkJaWYoYmxrKQorCQkJc2Rpby5pb3Nl dHVwKHdyaXRlLCBhLCBic2l6ZSwgYmNvdW50KTsKKwkJZWxzZQorCQkJc2Rpby5pb3NldHVwKHdy aXRlLCBhLCBiY291bnQsIDEpOworCQlzZGlvY21kX2xvY2tlZChJT19SV19FWFRFTkRFRCwKKwkJ CXdyaXRlPDwzMSB8IChmbiY3KTw8MjggfCBibGs8PDI3IHwgaW5jcjw8MjYgfCAoYWRkciYweDFG RkZGKTw8OSB8IChiY291bnQmMHgxRkYpKTsKKwkJc2Rpby5pbyh3cml0ZSwgYSwgbSk7CisJCXF1 bmxvY2soJnNkaW9sb2NrKTsKKwkJcG9wZXJyb3IoKTsKKwkJbGVuIC09IG07CisJCWEgPSAoY2hh ciopYSArIG07CisJCWlmKGluY3IpCisJCQlhZGRyICs9IG07CisJfQorfQorCitzdGF0aWMgdm9p ZAorc2Rpb3NldChpbnQgZm4sIGludCBhZGRyLCBpbnQgYml0cykKK3sKKwlzZGlvd3IoZm4sIGFk ZHIsIHNkaW9yZChmbiwgYWRkcikgfCBiaXRzKTsKK30KKwkKK3N0YXRpYyB2b2lkCitzZGlvaW5p dCh2b2lkKQoreworCXVsb25nIG9jciwgcmNhOworCWludCBpOworCisJLy8gZGlzY29ubmVjdCBl bW1jIGZyb20gU0QgY2FyZCAoY29ubmVjdCBzZGhvc3QgaW5zdGVhZCkKKwlmb3IoaSA9IDQ4OyBp IDw9IDUzOyBpKyspCisJCWdwaW9zZWwoaSwgQWx0MCk7CisJLy8gY29ubmVjdCBlbW1jIHRvIHdp ZmkKKwlmb3IoaSA9IDM0OyBpIDw9IDM5OyBpKyspeworCQlncGlvc2VsKGksIEFsdDMpOworCQlp ZihpID09IDM0KQorCQkJZ3Bpb3B1bGxvZmYoaSk7CisJCWVsc2UKKwkJCWdwaW9wdWxsdXAoaSk7 CisJfQorCXNkaW8uaW5pdCgpOworCXNkaW8uZW5hYmxlKCk7CisJc2Rpb2NtZChHT19JRExFX1NU QVRFLCAwKTsKKwlvY3IgPSB0cnlzZGlvY21kKElPX1NFTkRfT1BfQ09ORCwgMCk7CisJaSA9IDA7 CisJd2hpbGUoKG9jciAmICgxPDwzMSkpID09IDApeworCQlpZigrK2kgPiA1KXsKKwkJCXByaW50 KCJldGhlcjQzMzA6IG5vIHJlc3BvbnNlIHRvIHNkaW8gYWNjZXNzOiBvY3IgPSAlbHV4XG4iLCBv Y3IpOworCQkJZXJyb3IoRWlvKTsKKwkJfQorCQlvY3IgPSB0cnlzZGlvY21kKElPX1NFTkRfT1Bf Q09ORCwgVjNfMyk7CisJCXRzbGVlcCgmdXAtPnNsZWVwLCByZXR1cm4wLCBuaWwsIDEwMCk7CisJ fQorCXJjYSA9IHNkaW9jbWQoU0VORF9SRUxBVElWRV9BRERSLCAwKSA+PiBSY2FzaGlmdDsKKwlz ZGlvY21kKFNFTEVDVF9DQVJELCByY2EgPDwgUmNhc2hpZnQpOworCXNkaW9zZXQoRm4wLCBIaWdo c3BlZWQsIDIpOworCXNkaW9zZXQoRm4wLCBCdXNpZmMsIDIpOwkvLyBidXMgd2lkdGggNAorCXNk aW93cihGbjAsIEZicjErQmxrc2l6ZSwgNjQpOworCXNkaW93cihGbjAsIEZicjErQmxrc2l6ZSsx LCA2ND4+OCk7CisJc2Rpb3dyKEZuMCwgRmJyMitCbGtzaXplLCA1MTIpOworCXNkaW93cihGbjAs IEZicjIrQmxrc2l6ZSsxLCA1MTI+PjgpOworCXNkaW9zZXQoRm4wLCBJb2VuYWJsZSwgMTw8Rm4x KTsKKwlzZGlvd3IoRm4wLCBJbnRlbmFibGUsIDApOworCWZvcihpID0gMDsgIShzZGlvcmQoRm4w LCBJb3JlYWR5KSAmIDE8PEZuMSk7IGkrKyl7CisJCWlmKGkgPT0gMTApeworCQkJcHJpbnQoImV0 aGVyNDMzMDogY2FuJ3QgZW5hYmxlIFNESU8gZnVuY3Rpb25cbiIpOworCQkJZXJyb3IoRWlvKTsK KwkJfQorCQl0c2xlZXAoJnVwLT5zbGVlcCwgcmV0dXJuMCwgbmlsLCAxMDApOworCX0KK30KKwor c3RhdGljIHZvaWQKK3NkaW9yZXNldCh2b2lkKQoreworCXNkaW93cihGbjAsIElvYWJvcnQsIDE8 PDMpOwkvKiByZXNldCAqLworfQorCitzdGF0aWMgdm9pZAorc2Rpb2Fib3J0KGludCBmbikKK3sK KwlzZGlvd3IoRm4wLCBJb2Fib3J0LCBmbik7Cit9CisKKy8qCisgKiBDaGlwIHJlZ2lzdGVyIGFu ZCBtZW1vcnkgYWNjZXNzIHZpYSBTRElPCisgKi8KKworc3RhdGljIHZvaWQKK2NmZ3codWxvbmcg b2ZmLCBpbnQgdmFsKQoreworCXNkaW93cihGbjEsIG9mZiwgdmFsKTsKK30KKworc3RhdGljIGlu dAorY2Zncih1bG9uZyBvZmYpCit7CisJcmV0dXJuIHNkaW9yZChGbjEsIG9mZik7Cit9CisKK3N0 YXRpYyB1bG9uZworY2ZncmVhZGwoaW50IGZuLCB1bG9uZyBvZmYpCit7CisJdWNoYXIgY2J1Zlsy KkNBQ0hFTElORVNaXTsKKwl1Y2hhciAqcDsKKworCXAgPSAodWNoYXIqKVJPVU5EKCh1aW50cHRy KWNidWYsIENBQ0hFTElORVNaKTsKKwltZW1zZXQocCwgMCwgNCk7CisJc2Rpb3J3ZXh0KGZuLCAw LCBwLCA0LCBvZmZ8U2IzMmJpdCwgMSk7CisJaWYoU0RJT0RFQlVHKSBwcmludCgiY2ZncmVhZGwg JWx1eDogJTIuMnggJTIuMnggJTIuMnggJTIuMnhcbiIsIG9mZiwgcFswXSwgcFsxXSwgcFsyXSwg cFszXSk7CisJcmV0dXJuIHBbMF0gfCBwWzFdPDw4IHwgcFsyXTw8MTYgfCBwWzNdPDwyNDsKK30K Kworc3RhdGljIHZvaWQKK2NmZ3dyaXRlbChpbnQgZm4sIHVsb25nIG9mZiwgdTMyaW50IGRhdGEp Cit7CisJdWNoYXIgY2J1ZlsyKkNBQ0hFTElORVNaXTsKKwl1Y2hhciAqcDsKKwlpbnQgcmV0cnk7 CisKKwlwID0gKHVjaGFyKilST1VORCgodWludHB0ciljYnVmLCBDQUNIRUxJTkVTWik7CisJcHV0 NChwLCBkYXRhKTsKKwlpZihTRElPREVCVUcpIHByaW50KCJjZmd3cml0ZWwgJWx1eDogJTIuMngg JTIuMnggJTIuMnggJTIuMnhcbiIsIG9mZiwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSk7CisJcmV0 cnkgPSAwOworCXdoaWxlKHdhc2Vycm9yKCkpeworCQlwcmludCgiZXRoZXI0MzMwOiBjZmd3cml0 ZWwgcmV0cnkgJWx1eCAldXhcbiIsIG9mZiwgZGF0YSk7CisJCXNkaW9hYm9ydChmbik7CisJCWlm KCsrcmV0cnkgPT0gMykKKwkJCW5leHRlcnJvcigpOworCX0KKwlzZGlvcndleHQoZm4sIDEsIHAs IDQsIG9mZnxTYjMyYml0LCAxKTsKKwlwb3BlcnJvcigpOworfQorCitzdGF0aWMgdm9pZAorc2J3 aW5kb3codWxvbmcgYWRkcikKK3sKKwlhZGRyICY9IH4oU2J3c2l6ZS0xKTsKKwljZmd3KFNiYWRk ciwgYWRkcj4+OCk7CisJY2ZndyhTYmFkZHIrMSwgYWRkcj4+MTYpOworCWNmZ3coU2JhZGRyKzIs IGFkZHI+PjI0KTsKK30KKworc3RhdGljIHZvaWQKK3NicncoaW50IGZuLCBpbnQgd3JpdGUsIHVj aGFyICpidWYsIGludCBsZW4sIHVsb25nIG9mZikKK3sKKwlpbnQgbjsKKwlVU0VEKGZuKTsKKwor CWlmKHdhc2Vycm9yKCkpeworCQlwcmludCgiZXRoZXI0MzMwOiBzYnJ3IGVyciBvZmYgJWx1eCBs ZW4gJXVkXG4iLCBvZmYsIGxlbik7CisJCW5leHRlcnJvcigpOworCX0KKwlpZih3cml0ZSl7CisJ CWlmKGxlbiA+PSA0KXsKKwkJCW4gPSBsZW47CisJCQluICY9IH4zOworCQkJc2Rpb3J3ZXh0KEZu MSwgd3JpdGUsIGJ1Ziwgbiwgb2ZmfFNiMzJiaXQsIDEpOworCQkJb2ZmICs9IG47CisJCQlidWYg Kz0gbjsKKwkJCWxlbiAtPSBuOworCQl9CisJCXdoaWxlKGxlbiA+IDApeworCQkJc2Rpb3dyKEZu MSwgb2ZmfFNiMzJiaXQsICpidWYpOworCQkJb2ZmKys7CisJCQlidWYrKzsKKwkJCWxlbi0tOwor CQl9CisJfWVsc2V7CisJCWlmKGxlbiA+PSA0KXsKKwkJCW4gPSBsZW47CisJCQluICY9IH4zOwor CQkJc2Rpb3J3ZXh0KEZuMSwgd3JpdGUsIGJ1Ziwgbiwgb2ZmfFNiMzJiaXQsIDEpOworCQkJb2Zm ICs9IG47CisJCQlidWYgKz0gbjsKKwkJCWxlbiAtPSBuOworCQl9CisJCXdoaWxlKGxlbiA+IDAp eworCQkJKmJ1ZiA9IHNkaW9yZChGbjEsIG9mZnxTYjMyYml0KTsKKwkJCW9mZisrOworCQkJYnVm Kys7CisJCQlsZW4tLTsKKwkJfQorCX0KKwlwb3BlcnJvcigpOworfQorCitzdGF0aWMgdm9pZAor c2JtZW0oaW50IHdyaXRlLCB1Y2hhciAqYnVmLCBpbnQgbGVuLCB1bG9uZyBvZmYpCit7CisJdWxv bmcgbjsKKworCW4gPSBST1VORFVQKG9mZiwgU2J3c2l6ZSkgLSBvZmY7CisJaWYobiA9PSAwKQor CQluID0gU2J3c2l6ZTsKKwl3aGlsZShsZW4gPiAwKXsKKwkJaWYobiA+IGxlbikKKwkJCW4gPSBs ZW47CisJCXNid2luZG93KG9mZik7CisJCXNicncoRm4xLCB3cml0ZSwgYnVmLCBuLCBvZmYgJiAo U2J3c2l6ZS0xKSk7CisJCW9mZiArPSBuOworCQlidWYgKz0gbjsKKwkJbGVuIC09IG47CisJCW4g PSBTYndzaXplOworCX0KK30KKworc3RhdGljIHZvaWQKK3BhY2tldHJ3KGludCB3cml0ZSwgdWNo YXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgbjsKKwlpbnQgcmV0cnk7CisKKwluID0gMjA0ODsK Kwl3aGlsZShsZW4gPiAwKXsKKwkJaWYobiA+IGxlbikKKwkJCW4gPSBST1VORChsZW4sIDQpOwor CQlyZXRyeSA9IDA7CisJCXdoaWxlKHdhc2Vycm9yKCkpeworCQkJc2Rpb2Fib3J0KEZuMik7CisJ CQlpZigrK3JldHJ5ID09IDMpCisJCQkJbmV4dGVycm9yKCk7CisJCX0KKwkJc2Rpb3J3ZXh0KEZu Miwgd3JpdGUsIGJ1ZiwgbiwgRW51bWJhc2UsIDApOworCQlwb3BlcnJvcigpOworCQlidWYgKz0g bjsKKwkJbGVuIC09IG47CisJfQorfQorCisvKgorICogQ29uZmlndXJhdGlvbiBhbmQgY29udHJv bCBvZiBjaGlwIGNvcmVzIHZpYSBTaWxpY29uIEJhY2twbGFuZQorICovCisKK3N0YXRpYyB2b2lk CitzYmRpc2FibGUodWxvbmcgcmVncywgaW50IHByZSwgaW50IGlvY3RsKQoreworCXNid2luZG93 KHJlZ3MpOworCWlmKChjZmdyZWFkbChGbjEsIHJlZ3MgKyBSZXNldGN0cmwpICYgMSkgIT0gMCl7 CisJCWNmZ3dyaXRlbChGbjEsIHJlZ3MgKyBJb2N0cmwsIDN8aW9jdGwpOworCQljZmdyZWFkbChG bjEsIHJlZ3MgKyBJb2N0cmwpOworCQlyZXR1cm47CisJfQorCWNmZ3dyaXRlbChGbjEsIHJlZ3Mg KyBJb2N0cmwsIDN8cHJlKTsKKwljZmdyZWFkbChGbjEsIHJlZ3MgKyBJb2N0cmwpOworCWNmZ3dy aXRlbChGbjEsIHJlZ3MgKyBSZXNldGN0cmwsIDEpOworCW1pY3JvZGVsYXkoMTApOworCXdoaWxl KChjZmdyZWFkbChGbjEsIHJlZ3MgKyBSZXNldGN0cmwpICYgMSkgPT0gMCkKKwkJOworCWNmZ3dy aXRlbChGbjEsIHJlZ3MgKyBJb2N0cmwsIDN8aW9jdGwpOworCWNmZ3JlYWRsKEZuMSwgcmVncyAr IElvY3RybCk7Cit9CisKK3N0YXRpYyB2b2lkCitzYnJlc2V0KHVsb25nIHJlZ3MsIGludCBwcmUs IGludCBpb2N0bCkKK3sKKwlzYmRpc2FibGUocmVncywgcHJlLCBpb2N0bCk7CisJc2J3aW5kb3co cmVncyk7CisJaWYoU0JERUJVRykgcHJpbnQoInNicmVzZXQgJSNwICUjbHV4ICUjbHV4IC0+Iiwg KHZvaWQqKXJlZ3MsCisJCWNmZ3JlYWRsKEZuMSwgcmVncytJb2N0cmwpLCBjZmdyZWFkbChGbjEs IHJlZ3MrUmVzZXRjdHJsKSk7CisJd2hpbGUoKGNmZ3JlYWRsKEZuMSwgcmVncyArIFJlc2V0Y3Ry bCkgJiAxKSAhPSAwKXsKKwkJY2Znd3JpdGVsKEZuMSwgcmVncyArIFJlc2V0Y3RybCwgMCk7CisJ CW1pY3JvZGVsYXkoNDApOworCX0KKwljZmd3cml0ZWwoRm4xLCByZWdzICsgSW9jdHJsLCAxfGlv Y3RsKTsKKwljZmdyZWFkbChGbjEsIHJlZ3MgKyBJb2N0cmwpOworCWlmKFNCREVCVUcpIHByaW50 KCIlI2x1eCAlI2x1eFxuIiwKKwkJY2ZncmVhZGwoRm4xLCByZWdzK0lvY3RybCksIGNmZ3JlYWRs KEZuMSwgcmVncytSZXNldGN0cmwpKTsKK30KKworc3RhdGljIHZvaWQKK2NvcmVzY2FuKEN0bHIg KmN0bCwgdWxvbmcgcikKK3sKKwl1Y2hhciAqYnVmOworCWludCBpLCBjb3JlaWQsIGNvcmVyZXY7 CisJdWxvbmcgYWRkcjsKKworCWJ1ZiA9IHNkbWFsbG9jKENvcmVzY2Fuc3opOworCWlmKGJ1ZiA9 PSBuaWwpCisJCWVycm9yKEVub21lbSk7CisJc2JtZW0oMCwgYnVmLCBDb3Jlc2NhbnN6LCByKTsK Kwljb3JlaWQgPSAwOworCWNvcmVyZXYgPSAwOworCWZvcihpID0gMDsgaSA8IENvcmVzY2Fuc3o7 IGkgKz0gNCl7CisJCXN3aXRjaChidWZbaV0mMHhGKXsKKwkJY2FzZSAweEY6CS8qIGVuZCAqLwor CQkJc2RmcmVlKGJ1Zik7CisJCQlyZXR1cm47CisJCWNhc2UgMHgxOgkvKiBjb3JlIGluZm8gKi8K KwkJCWlmKChidWZbaSs0XSYweEYpICE9IDB4MSkKKwkJCQlicmVhazsKKwkJCWNvcmVpZCA9IChi dWZbaSsxXSB8IGJ1ZltpKzJdPDw4KSAmIDB4RkZGOworCQkJaSArPSA0OworCQkJY29yZXJldiA9 IGJ1ZltpKzNdOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNToJLyogYWRkcmVzcyAqLworCQkJYWRk ciA9IGJ1ZltpKzFdPDw4IHwgYnVmW2krMl08PDE2IHwgYnVmW2krM108PDI0OworCQkJYWRkciAm PSB+MHhGRkY7CisJCQlpZihTQkRFQlVHKSBwcmludCgiY29yZSAleCAlcyAlI3BcbiIsIGNvcmVp ZCwgYnVmW2ldJjB4QzA/ICJjdGwiIDogIm1lbSIsICh2b2lkKilhZGRyKTsKKwkJCXN3aXRjaChj b3JlaWQpeworCQkJY2FzZSAweDgwMDoKKwkJCQlpZigoYnVmW2ldICYgMHhDMCkgPT0gMCkKKwkJ CQkJY3RsLT5jaGlwY29tbW9uID0gYWRkcjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVJNY20zOgor CQkJY2FzZSBBUk03dGRtaToKKwkJCWNhc2UgQVJNY3I0OgorCQkJCWN0bC0+YXJtY29yZSA9IGNv cmVpZDsKKwkJCQlpZihidWZbaV0gJiAweEMwKXsKKwkJCQkJaWYoY3RsLT5hcm1jdGwgPT0gMCkK KwkJCQkJCWN0bC0+YXJtY3RsID0gYWRkcjsKKwkJCQl9ZWxzZXsKKwkJCQkJaWYoY3RsLT5hcm1y ZWdzID09IDApCisJCQkJCQljdGwtPmFybXJlZ3MgPSBhZGRyOworCQkJCX0KKwkJCQlicmVhazsK KwkJCWNhc2UgMHg4MEU6CisJCQkJaWYoYnVmW2ldICYgMHhDMCkKKwkJCQkJY3RsLT5zb2NyYW1j dGwgPSBhZGRyOworCQkJCWVsc2UgaWYoY3RsLT5zb2NyYW1yZWdzID09IDApCisJCQkJCWN0bC0+ c29jcmFtcmVncyA9IGFkZHI7CisJCQkJY3RsLT5zb2NyYW1yZXYgPSBjb3JlcmV2OworCQkJCWJy ZWFrOworCQkJY2FzZSAweDgyOToKKwkJCQlpZigoYnVmW2ldICYgMHhDMCkgPT0gMCkKKwkJCQkJ Y3RsLT5zZHJlZ3MgPSBhZGRyOworCQkJCWN0bC0+c2Rpb3JldiA9IGNvcmVyZXY7CisJCQkJYnJl YWs7CisJCQljYXNlIDB4ODEyOgorCQkJCWlmKGJ1ZltpXSAmIDB4QzApCisJCQkJCWN0bC0+ZDEx Y3RsID0gYWRkcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlzZGZyZWUoYnVmKTsKK30K Kworc3RhdGljIHZvaWQKK3JhbXNjYW4oQ3RsciAqY3RsKQoreworCXVsb25nIHIsIG4sIHNpemU7 CisJaW50IGJhbmtzLCBpOworCisJaWYoY3RsLT5hcm1jb3JlID09IEFSTWNyNCl7CisJCXIgPSBj dGwtPmFybXJlZ3M7CisJCXNid2luZG93KHIpOworCQluID0gY2ZncmVhZGwoRm4xLCByICsgQ3I0 Q2FwKTsKKwkJaWYoU0JERUJVRykgcHJpbnQoImNyNCBiYW5rcyAlbHV4XG4iLCBuKTsKKwkJYmFu a3MgPSAoKG4+PjQpICYgMHhGKSArIChuICYgMHhGKTsKKwkJc2l6ZSA9IDA7CisJCWZvcihpID0g MDsgaSA8IGJhbmtzOyBpKyspeworCQkJY2Znd3JpdGVsKEZuMSwgciArIENyNEJhbmtpZHgsIGkp OworCQkJbiA9IGNmZ3JlYWRsKEZuMSwgciArIENyNEJhbmtpbmZvKTsKKwkJCWlmKFNCREVCVUcp IHByaW50KCJiYW5rICVkIHJlZyAlbHV4IHNpemUgJWx1ZFxuIiwgaSwgbiwgODE5MiAqICgobiAm IDB4M0YpICsgMSkpOworCQkJc2l6ZSArPSA4MTkyICogKChuICYgMHgzRikgKyAxKTsKKwkJfQor CQljdGwtPnNvY3JhbXNpemUgPSBzaXplOworCQljdGwtPnJhbWJhc2UgPSAweDE5ODAwMDsKKwkJ cmV0dXJuOworCX0KKwlpZihjdGwtPnNvY3JhbXJldiA8PSA3IHx8IGN0bC0+c29jcmFtcmV2ID09 IDEyKXsKKwkJcHJpbnQoImV0aGVyNDMzMDogU09DUkFNIHJldiAlZCBub3Qgc3VwcG9ydGVkXG4i LCBjdGwtPnNvY3JhbXJldik7CisJCWVycm9yKEVpbyk7CisJfQorCXNicmVzZXQoY3RsLT5zb2Ny YW1jdGwsIDAsIDApOworCXIgPSBjdGwtPnNvY3JhbXJlZ3M7CisJc2J3aW5kb3cocik7CisJbiA9 IGNmZ3JlYWRsKEZuMSwgciArIENvcmVpbmZvKTsKKwlpZihTQkRFQlVHKSBwcmludCgic29jcmFt cmV2ICVkIGNvcmVpbmZvICVsdXhcbiIsIGN0bC0+c29jcmFtcmV2LCBuKTsKKwliYW5rcyA9IChu Pj40KSAmIDB4RjsKKwlzaXplID0gMDsKKwlmb3IoaSA9IDA7IGkgPCBiYW5rczsgaSsrKXsKKwkJ Y2Znd3JpdGVsKEZuMSwgciArIEJhbmtpZHgsIGkpOworCQluID0gY2ZncmVhZGwoRm4xLCByICsg QmFua2luZm8pOworCQlpZihTQkRFQlVHKSBwcmludCgiYmFuayAlZCByZWcgJWx1eCBzaXplICVs dWRcbiIsIGksIG4sIDgxOTIgKiAoKG4gJiAweDNGKSArIDEpKTsKKwkJc2l6ZSArPSA4MTkyICog KChuICYgMHgzRikgKyAxKTsKKwl9CisJY3RsLT5zb2NyYW1zaXplID0gc2l6ZTsKKwljdGwtPnJh bWJhc2UgPSAwOworCWlmKGN0bC0+Y2hpcGlkID09IDQzNDMwKXsKKwkJY2Znd3JpdGVsKEZuMSwg ciArIEJhbmtpZHgsIDMpOworCQljZmd3cml0ZWwoRm4xLCByICsgQmFua3BkYSwgMCk7CisJfQor fQorCitzdGF0aWMgdm9pZAorc2Jpbml0KEN0bHIgKmN0bCkKK3sKKwl1bG9uZyByOworCWludCBj aGlwaWQ7CisJY2hhciBidWZbMTZdOworCisJc2J3aW5kb3coRW51bWJhc2UpOworCXIgPSBjZmdy ZWFkbChGbjEsIEVudW1iYXNlKTsKKwljaGlwaWQgPSByICYgMHhGRkZGOworCXNwcmludChidWYs IGNoaXBpZCA+IDQzMDAwID8gIiVkIiA6ICIlI3giLCBjaGlwaWQpOworCXByaW50KCJldGhlcjQz MzA6IGNoaXAgJXMgcmV2ICVsZCB0eXBlICVsZFxuIiwgYnVmLCAocj4+MTYpJjB4RiwgKHI+PjI4 KSYweEYpOworCXN3aXRjaChjaGlwaWQpeworCQljYXNlIDB4NDMzMDoKKwkJY2FzZSA0MzM2MjoK KwkJY2FzZSA0MzQzMDoKKwkJY2FzZSAweDQzNDU6CisJCQljdGwtPmNoaXBpZCA9IGNoaXBpZDsK KwkJCWN0bC0+Y2hpcHJldiA9IChyPj4xNikmMHhGOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJ CQlwcmludCgiZXRoZXI0MzMwOiBjaGlwaWQgJSN4ICglZCkgbm90IHN1cHBvcnRlZFxuIiwgY2hp cGlkLCBjaGlwaWQpOworCQkJZXJyb3IoRWlvKTsKKwl9CisJciA9IGNmZ3JlYWRsKEZuMSwgRW51 bWJhc2UgKyA2Myo0KTsKKwljb3Jlc2NhbihjdGwsIHIpOworCWlmKGN0bC0+YXJtY3RsID09IDAg fHwgY3RsLT5kMTFjdGwgPT0gMCB8fAorCSAgIChjdGwtPmFybWNvcmUgPT0gQVJNY20zICYmIChj dGwtPnNvY3JhbWN0bCA9PSAwIHx8IGN0bC0+c29jcmFtcmVncyA9PSAwKSkpCisJCWVycm9yKCJj b3Jlc2NhbiBkaWRuJ3QgZmluZCBlc3NlbnRpYWwgY29yZXNcbiIpOworCWlmKGN0bC0+YXJtY29y ZSA9PSBBUk1jcjQpCisJCXNicmVzZXQoY3RsLT5hcm1jdGwsIENyNENwdWhhbHQsIENyNENwdWhh bHQpOworCWVsc2UJCisJCXNiZGlzYWJsZShjdGwtPmFybWN0bCwgMCwgMCk7CisJc2JyZXNldChj dGwtPmQxMWN0bCwgOHw0LCA0KTsKKwlyYW1zY2FuKGN0bCk7CisJaWYoU0JERUJVRykgcHJpbnQo IkFSTSAlI3AgRDExICUjcCBTT0NSQU0gJSNwLCUjcCAlbHVkIGJ5dGVzIEAgJSNwXG4iLAorCQko dm9pZCopY3RsLT5hcm1jdGwsICh2b2lkKiljdGwtPmQxMWN0bCwgKHZvaWQqKWN0bC0+c29jcmFt Y3RsLCAodm9pZCopY3RsLT5zb2NyYW1yZWdzLCBjdGwtPnNvY3JhbXNpemUsICh2b2lkKiljdGwt PnJhbWJhc2UpOworCWNmZ3coQ2xrY3NyLCAwKTsKKwltaWNyb2RlbGF5KDEwKTsKKwlpZihTQkRF QlVHKSBwcmludCgiY2hpcGNsazogJXhcbiIsIGNmZ3IoQ2xrY3NyKSk7CisJY2ZndyhDbGtjc3Is IE5vaHdyZXEgfCBSZXFBTFApOworCXdoaWxlKChjZmdyKENsa2NzcikgJiAoSFRhdmFpbHxBTFBh dmFpbCkpID09IDApCisJCW1pY3JvZGVsYXkoMTApOworCWNmZ3coQ2xrY3NyLCBOb2h3cmVxIHwg Rm9yY2VBTFApOworCW1pY3JvZGVsYXkoNjUpOworCWlmKFNCREVCVUcpIHByaW50KCJjaGlwY2xr OiAleFxuIiwgY2ZncihDbGtjc3IpKTsKKwljZmd3KFB1bGx1cHMsIDApOworCXNid2luZG93KGN0 bC0+Y2hpcGNvbW1vbik7CisJY2Znd3JpdGVsKEZuMSwgY3RsLT5jaGlwY29tbW9uICsgR3Bpb3B1 bGx1cCwgMCk7CisJY2Znd3JpdGVsKEZuMSwgY3RsLT5jaGlwY29tbW9uICsgR3Bpb3B1bGxkb3du LCAwKTsKKwlpZihjdGwtPmNoaXBpZCAhPSAweDQzMzAgJiYgY3RsLT5jaGlwaWQgIT0gNDMzNjIp CisJCXJldHVybjsKKwljZmd3cml0ZWwoRm4xLCBjdGwtPmNoaXBjb21tb24gKyBDaGlwY3RsYWRk ciwgMSk7CisJaWYoY2ZncmVhZGwoRm4xLCBjdGwtPmNoaXBjb21tb24gKyBDaGlwY3RsYWRkcikg IT0gMSkKKwkJcHJpbnQoImV0aGVyNDMzMDogY2FuJ3Qgc2V0IENoaXBjdGxhZGRyXG4iKTsKKwll bHNleworCQlyID0gY2ZncmVhZGwoRm4xLCBjdGwtPmNoaXBjb21tb24gKyBDaGlwY3RsZGF0YSk7 CisJCWlmKFNCREVCVUcpIHByaW50KCJjaGlwY29tbW9uIFBNVSAoJWx1eCkgJWx1eCIsIGNmZ3Jl YWRsKEZuMSwgY3RsLT5jaGlwY29tbW9uICsgQ2hpcGN0bGFkZHIpLCByKTsKKwkJLyogc2V0IFNE SU8gZHJpdmUgc3RyZW5ndGggPj0gNm1BICovCisJCXIgJj0gfjB4MzgwMDsKKwkJaWYoY3RsLT5j aGlwaWQgPT0gMHg0MzMwKQorCQkJciB8PSAzPDwxMTsKKwkJZWxzZQorCQkJciB8PSA3PDwxMTsK KwkJY2Znd3JpdGVsKEZuMSwgY3RsLT5jaGlwY29tbW9uICsgQ2hpcGN0bGRhdGEsIHIpOworCQlp ZihTQkRFQlVHKSBwcmludCgiLT4gJWx1eCAoPSAlbHV4KVxuIiwgciwgY2ZncmVhZGwoRm4xLCBj dGwtPmNoaXBjb21tb24gKyBDaGlwY3RsZGF0YSkpOworCX0KK30KKworc3RhdGljIHZvaWQKK3Ni ZW5hYmxlKEN0bHIgKmN0bCkKK3sKKwlpbnQgaTsKKworCWlmKFNCREVCVUcpIHByaW50KCJlbmFi bGluZyBIVCBjbG9jay4uLiIpOworCWNmZ3coQ2xrY3NyLCAwKTsKKwlkZWxheSgxKTsKKwljZmd3 KENsa2NzciwgUmVxSFQpOworCWZvcihpID0gMDsgKGNmZ3IoQ2xrY3NyKSAmIEhUYXZhaWwpID09 IDA7IGkrKyl7CisJCWlmKGkgPT0gNTApeworCQkJcHJpbnQoImV0aGVyNDMzMDogY2FuJ3QgZW5h YmxlIEhUIGNsb2NrOiBjc3IgJXhcbiIsIGNmZ3IoQ2xrY3NyKSk7CisJCQllcnJvcihFaW8pOwor CQl9CisJCXRzbGVlcCgmdXAtPnNsZWVwLCByZXR1cm4wLCBuaWwsIDEwMCk7CisJfQorCWNmZ3co Q2xrY3NyLCBjZmdyKENsa2NzcikgfCBGb3JjZUhUKTsKKwlkZWxheSgxMCk7CisJaWYoU0JERUJV RykgcHJpbnQoImNoaXBjbGs6ICV4XG4iLCBjZmdyKENsa2NzcikpOworCXNid2luZG93KGN0bC0+ c2RyZWdzKTsKKwljZmd3cml0ZWwoRm4xLCBjdGwtPnNkcmVncyArIFNibWJveGRhdGEsIDQgPDwg MTYpOwkvKiBwcm90b2NvbCB2ZXJzaW9uICovCisJY2Znd3JpdGVsKEZuMSwgY3RsLT5zZHJlZ3Mg KyBJbnRtYXNrLCBGcmFtZUludCB8IE1haWxib3hJbnQgfCBGY2NoYW5nZSk7CisJc2Rpb3NldChG bjAsIElvZW5hYmxlLCAxPDxGbjIpOworCWZvcihpID0gMDsgIShzZGlvcmQoRm4wLCBJb3JlYWR5 KSAmIDE8PEZuMik7IGkrKyl7CisJCWlmKGkgPT0gMTApeworCQkJcHJpbnQoImV0aGVyNDMzMDog Y2FuJ3QgZW5hYmxlIFNESU8gZnVuY3Rpb24gMiAtIGlvcmVhZHkgJXhcbiIsIHNkaW9yZChGbjAs IElvcmVhZHkpKTsKKwkJCWVycm9yKEVpbyk7CisJCX0KKwkJdHNsZWVwKCZ1cC0+c2xlZXAsIHJl dHVybjAsIG5pbCwgMTAwKTsKKwl9CisJc2Rpb3dyKEZuMCwgSW50ZW5hYmxlLCAoMTw8Rm4xKSB8 ICgxPDxGbjIpIHwgMSk7Cit9CisKKworLyoKKyAqIEZpcm13YXJlIGFuZCBjb25maWcgZmlsZSB1 cGxvYWRpbmcKKyAqLworCisvKgorICogQ29uZGVuc2UgY29uZmlnIGZpbGUgY29udGVudHMgKGlu IGJ1ZmZlciBidWYgd2l0aCBsZW5ndGggbikKKyAqIHRvICd2YXI9dmFsdWVcMCcgbGlzdCBmb3Ig ZmlybXdhcmU6CisgKgktIHJlbW92ZSBjb21tZW50cyAoc3RhcnRpbmcgd2l0aCAnIycpIGFuZCBi bGFuayBsaW5lcworICoJLSByZW1vdmUgY2FycmlhZ2UgcmV0dXJucworICoJLSBjb252ZXJ0IG5l d2xpbmVzIHRvIG51bGxzCisgKgktIG1hcmsgZW5kIHdpdGggdHdvIG51bGxzCisgKgktIHBhZCB3 aXRoIG51bGxzIHRvIG11bHRpcGxlIG9mIDQgYnl0ZXMgdG90YWwgbGVuZ3RoCisgKi8KK3N0YXRp YyBpbnQKK2NvbmRlbnNlKHVjaGFyICpidWYsIGludCBuKQoreworCXVjaGFyICpwLCAqZXAsICps cCwgKm9wOworCWludCBjLCBza2lwcGluZzsKKworCXNraXBwaW5nID0gMDsJLyogdHJ1ZSBpZiBp biBhIGNvbW1lbnQgKi8KKwllcCA9IGJ1ZiArIG47CS8qIGVuZCBvZiBpbnB1dCAqLworCW9wID0g YnVmOwkvKiBlbmQgb2Ygb3V0cHV0ICovCisJbHAgPSBidWY7CS8qIHN0YXJ0IG9mIGN1cnJlbnQg b3V0cHV0IGxpbmUgKi8KKwlmb3IocCA9IGJ1ZjsgcCA8IGVwOyBwKyspeworCQlzd2l0Y2goYyA9 ICpwKXsKKwkJY2FzZSAnIyc6CisJCQlza2lwcGluZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAn XDAnOgorCQljYXNlICdcbic6CisJCQlza2lwcGluZyA9IDA7CisJCQlpZihvcCAhPSBscCl7CisJ CQkJKm9wKysgPSAnXDAnOworCQkJCWxwID0gb3A7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAn XHInOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZighc2tpcHBpbmcpCisJCQkJKm9wKysg PSBjOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYoIXNraXBwaW5nICYmIG9wICE9IGxwKQorCQkq b3ArKyA9ICdcMCc7CisJKm9wKysgPSAnXDAnOworCWZvcihuID0gb3AgLSBidWY7IG4gJiAwMzsg bisrKQorCQkqb3ArKyA9ICdcMCc7CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBUcnkgdG8gZmlu ZCBmaXJtd2FyZSBmaWxlIGluIC9ib290IG9yIGluIC9zeXMvbGliL2Zpcm13YXJlLgorICogVGhy b3cgYW4gZXJyb3IgaWYgbm90IGZvdW5kLgorICovCitzdGF0aWMgQ2hhbioKK2ZpbmRmaXJtd2Fy ZShjaGFyICpmaWxlKQoreworCWNoYXIgbmJ1Zls2NF07CisJQ2hhbiAqYzsKKworCWlmKCF3YXNl cnJvcigpKXsKKwkJc25wcmludChuYnVmLCBzaXplb2YgbmJ1ZiwgIi9ib290LyVzIiwgZmlsZSk7 CisJCWMgPSBuYW1lYyhuYnVmLCBBb3BlbiwgT1JFQUQsIDApOworCQlwb3BlcnJvcigpOworCX1l bHNlIGlmKCF3YXNlcnJvcigpKXsKKwkJc25wcmludChuYnVmLCBzaXplb2YgbmJ1ZiwgIi9zeXMv bGliL2Zpcm13YXJlLyVzIiwgZmlsZSk7CisJCWMgPSBuYW1lYyhuYnVmLCBBb3BlbiwgT1JFQUQs IDApOworCQlwb3BlcnJvcigpOworCX1lbHNleworCQljID0gbmlsOworCQlzbnByaW50KHVwLT5n ZW5idWYsIHNpemVvZiB1cC0+Z2VuYnVmLCAiY2FuJ3QgZmluZCAlcyBpbiAvYm9vdCBvciAvc3lz L2xpYi9maXJtd2FyZSIsIGZpbGUpOworCQllcnJvcih1cC0+Z2VuYnVmKTsKKwl9CisJcmV0dXJu IGM7CQorfQorCitzdGF0aWMgaW50Cit1cGxvYWQoQ3RsciAqY3RsLCBjaGFyICpmaWxlLCBpbnQg aXNjb25maWcpCit7CisJQ2hhbiAqYzsKKwl1Y2hhciAqYnVmOworCXVjaGFyICpjYnVmOworCWlu dCBvZmYsIG47CisKKwlidWYgPSBjYnVmID0gbmlsOworCWMgPSBmaW5kZmlybXdhcmUoZmlsZSk7 CisJaWYod2FzZXJyb3IoKSl7CisJCWNjbG9zZShjKTsKKwkJc2RmcmVlKGJ1Zik7CisJCXNkZnJl ZShjYnVmKTsKKwkJbmV4dGVycm9yKCk7CisJfQorCWJ1ZiA9IHNkbWFsbG9jKFVwbG9hZHN6KTsK KwlpZihidWYgPT0gbmlsKQorCQllcnJvcihFbm9tZW0pOworCWlmKEZpcm13YXJlY21wKXsKKwkJ Y2J1ZiA9IHNkbWFsbG9jKFVwbG9hZHN6KTsKKwkJaWYoY2J1ZiA9PSBuaWwpCisJCQllcnJvcihF bm9tZW0pOworCX0KKwlvZmYgPSAwOworCWZvcig7Oyl7CisJCW4gPSBkZXZ0YWJbYy0+dHlwZV0t PnJlYWQoYywgYnVmLCBVcGxvYWRzeiwgb2ZmKTsKKwkJaWYobiA8PSAwKQorCQkJYnJlYWs7CisJ CWlmKGlzY29uZmlnKXsKKwkJCW4gPSBjb25kZW5zZShidWYsIG4pOworCQkJb2ZmID0gY3RsLT5z b2NyYW1zaXplIC0gbiAtIDQ7CisJCX1lbHNlIGlmKG9mZiA9PSAwKQorCQkJbWVtbW92ZShjdGwt PnJlc2V0dmVjLmMsIGJ1Ziwgc2l6ZW9mKGN0bC0+cmVzZXR2ZWMuYykpOworCQl3aGlsZShuJjMp CisJCQlidWZbbisrXSA9IDA7CisJCXNibWVtKDEsIGJ1ZiwgbiwgY3RsLT5yYW1iYXNlICsgb2Zm KTsKKwkJaWYoaXNjb25maWcpCisJCQlicmVhazsKKwkJb2ZmICs9IG47CisJfQorCWlmKEZpcm13 YXJlY21wKXsKKwkJaWYoRldERUJVRykgcHJpbnQoImNvbXBhcmUuLi4iKTsKKwkJaWYoIWlzY29u ZmlnKQorCQkJb2ZmID0gMDsKKwkJZm9yKDs7KXsKKwkJCWlmKCFpc2NvbmZpZyl7CisJCQkJbiA9 IGRldnRhYltjLT50eXBlXS0+cmVhZChjLCBidWYsIFVwbG9hZHN6LCBvZmYpOworCQkJCWlmKG4g PD0gMCkKKwkJCQkJYnJlYWs7CisJCQl3aGlsZShuJjMpCisJCQkJYnVmW24rK10gPSAwOworCQkJ fQorCQkJc2JtZW0oMCwgY2J1ZiwgbiwgY3RsLT5yYW1iYXNlICsgb2ZmKTsKKwkJCWlmKG1lbWNt cChidWYsIGNidWYsIG4pICE9IDApeworCQkJCXByaW50KCJldGhlcjQzMzA6IGZpcm13YXJlIGxv YWQgZmFpbGVkIG9mZnNldCAlZFxuIiwgb2ZmKTsKKwkJCQllcnJvcihFaW8pOworCQkJfQorCQkJ aWYoaXNjb25maWcpCisJCQkJYnJlYWs7CisJCQlvZmYgKz0gbjsKKwkJfQorCX0KKwlpZihGV0RF QlVHKSBwcmludCgiXG4iKTsKKwlwb3BlcnJvcigpOworCWNjbG9zZShjKTsKKwlzZGZyZWUoYnVm KTsKKwlzZGZyZWUoY2J1Zik7CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBVcGxvYWQgcmVndWxh dG9yeSBmaWxlICguY2xtKSB0byBmaXJtd2FyZS4KKyAqIFBhY2tldCBmb3JtYXQgaXMKKyAqCVsy XWZsYWcgWzJddHlwZSBbNF1sZW4gWzRdY3JjIFtsZW5dZGF0YQorICovCitzdGF0aWMgdm9pZAor cmVndWxvYWQoQ3RsciAqY3RsLCBjaGFyICpmaWxlKQoreworCUNoYW4gKmM7CisJdWNoYXIgKmJ1 ZjsKKwlpbnQgb2ZmLCBuLCBmbGFnOworCWVudW0geworCQlSZWd1aGRyID0gMisyKzQrNCwKKwkJ UmVndXN6CT0gMTQwMCwKKwkJUmVndXR5cAk9IDIsCisJCUZsYWdjbG0JPSAxPDwxMiwKKwkJRmly c3Rwa3Q9IDE8PDEsCisJCUxhc3Rwa3QJPSAxPDwyLAorCX07CisKKwlidWYgPSBuaWw7CisJYyA9 IGZpbmRmaXJtd2FyZShmaWxlKTsKKwlpZih3YXNlcnJvcigpKXsKKwkJY2Nsb3NlKGMpOworCQlm cmVlKGJ1Zik7CisJCW5leHRlcnJvcigpOworCX0KKwlidWYgPSBtYWxsb2MoUmVndWhkcitSZWd1 c3orMSk7CisJaWYoYnVmID09IG5pbCkKKwkJZXJyb3IoRW5vbWVtKTsKKwlwdXQyKGJ1ZisyLCBS ZWd1dHlwKTsKKwlwdXQyKGJ1Zis4LCAwKTsKKwlvZmYgPSAwOworCWZsYWcgPSBGbGFnY2xtIHwg Rmlyc3Rwa3Q7CisJd2hpbGUoKGZsYWcmTGFzdHBrdCkgPT0gMCl7CisJCW4gPSBkZXZ0YWJbYy0+ dHlwZV0tPnJlYWQoYywgYnVmK1JlZ3VoZHIsIFJlZ3VzeisxLCBvZmYpOworCQlpZihuIDw9IDAp CisJCQlicmVhazsKKwkJaWYobiA9PSBSZWd1c3orMSkKKwkJCS0tbjsKKwkJZWxzZXsKKwkJCXdo aWxlKG4mNykKKwkJCQlidWZbUmVndWhkcituKytdID0gMDsKKwkJCWZsYWcgfD0gTGFzdHBrdDsK KwkJfQorCQlwdXQyKGJ1ZiswLCBmbGFnKTsKKwkJcHV0NChidWYrNCwgbik7CisJCXdsc2V0dmFy KGN0bCwgImNsbWxvYWQiLCBidWYsIFJlZ3VoZHIgKyBuKTsKKwkJb2ZmICs9IG47CisJCWZsYWcg Jj0gfkZpcnN0cGt0OworCX0KKwlwb3BlcnJvcigpOworCWNjbG9zZShjKTsKKwlmcmVlKGJ1Zik7 Cit9CisKK3N0YXRpYyB2b2lkCitmd2xvYWQoQ3RsciAqY3RsKQoreworCXVjaGFyIGJ1Zls0XTsK Kwl1aW50IGksIG47CisKKwlpID0gMDsKKwl3aGlsZShmaXJtd2FyZVtpXS5jaGlwaWQgIT0gY3Rs LT5jaGlwaWQgfHwKKwkJICAgZmlybXdhcmVbaV0uY2hpcHJldiAhPSBjdGwtPmNoaXByZXYpewor CQlpZigrK2kgPT0gbmVsZW0oZmlybXdhcmUpKXsKKwkJCXByaW50KCJldGhlcjQzMzA6IG5vIGZp cm13YXJlIGZvciBjaGlwaWQgJXggKCVkKSBjaGlwcmV2ICVkXG4iLAorCQkJCWN0bC0+Y2hpcGlk LCBjdGwtPmNoaXBpZCwgY3RsLT5jaGlwcmV2KTsKKwkJCWVycm9yKCJubyBmaXJtd2FyZSIpOwor CQl9CisJfQorCWN0bC0+cmVndWZpbGUgPSBmaXJtd2FyZVtpXS5yZWd1ZmlsZTsKKwljZmd3KENs a2NzciwgUmVxQUxQKTsKKwl3aGlsZSgoY2ZncihDbGtjc3IpICYgQUxQYXZhaWwpID09IDApCisJ CW1pY3JvZGVsYXkoMTApOworCW1lbXNldChidWYsIDAsIDQpOworCXNibWVtKDEsIGJ1ZiwgNCwg Y3RsLT5yYW1iYXNlICsgY3RsLT5zb2NyYW1zaXplIC0gNCk7CisJaWYoRldERUJVRykgcHJpbnQo ImZpcm13YXJlIGxvYWQuLi4iKTsKKwl1cGxvYWQoY3RsLCBmaXJtd2FyZVtpXS5md2ZpbGUsIDAp OworCWlmKEZXREVCVUcpIHByaW50KCJjb25maWcgbG9hZC4uLiIpOworCW4gPSB1cGxvYWQoY3Rs LCBmaXJtd2FyZVtpXS5jZmdmaWxlLCAxKTsKKwluIC89IDQ7CisJbiA9IChuICYgMHhGRkZGKSB8 ICh+biA8PCAxNik7CisJcHV0NChidWYsIG4pOworCXNibWVtKDEsIGJ1ZiwgNCwgY3RsLT5yYW1i YXNlICsgY3RsLT5zb2NyYW1zaXplIC0gNCk7CisJaWYoY3RsLT5hcm1jb3JlID09IEFSTWNyNCl7 CisJCXNid2luZG93KGN0bC0+c2RyZWdzKTsKKwkJY2Znd3JpdGVsKEZuMSwgY3RsLT5zZHJlZ3Mg KyBJbnRzdGF0dXMsIH4wKTsKKwkJaWYoY3RsLT5yZXNldHZlYy5pICE9IDApeworCQkJaWYoU0JE RUJVRykgcHJpbnQoIiV1eFxuIiwgY3RsLT5yZXNldHZlYy5pKTsKKwkJCXNibWVtKDEsIGN0bC0+ cmVzZXR2ZWMuYywgc2l6ZW9mKGN0bC0+cmVzZXR2ZWMuYyksIDApOworCQl9CisJCXNicmVzZXQo Y3RsLT5hcm1jdGwsIENyNENwdWhhbHQsIDApOworCX1lbHNlCisJCXNicmVzZXQoY3RsLT5hcm1j dGwsIDAsIDApOworfQorCisvKgorICogQ29tbXVuaWNhdGlvbiBvZiBkYXRhIGFuZCBjb250cm9s IHBhY2tldHMKKyAqLworCit2b2lkCitpbnR3YWl0KEN0bHIgKmN0bHIsIGludCB3YWl0KQorewor CXVsb25nIGludHMsIG1ib3g7CisJaW50IGk7CisKKwlpZih3YXNlcnJvcigpKQorCQlyZXR1cm47 CisJZm9yKDs7KXsKKwkJc2Rpb2NhcmRpbnRyKHdhaXQpOworCQlzYndpbmRvdyhjdGxyLT5zZHJl Z3MpOworCQlpID0gc2Rpb3JkKEZuMCwgSW50cGVuZCk7CisJCWlmKGkgPT0gMCl7CisJCQl0c2xl ZXAoJnVwLT5zbGVlcCwgcmV0dXJuMCwgMCwgMTApOworCQkJY29udGludWU7CisJCX0KKwkJaW50 cyA9IGNmZ3JlYWRsKEZuMSwgY3Rsci0+c2RyZWdzICsgSW50c3RhdHVzKTsKKwkJY2Znd3JpdGVs KEZuMSwgY3Rsci0+c2RyZWdzICsgSW50c3RhdHVzLCBpbnRzKTsKKwkJaWYoMCkgcHJpbnQoIklO VFM6ICgleCkgJWx1eCAtPiAlbHV4XG4iLCBpLCBpbnRzLCBjZmdyZWFkbChGbjEsIGN0bHItPnNk cmVncyArIEludHN0YXR1cykpOworCQlpZihpbnRzICYgTWFpbGJveEludCl7CisJCQltYm94ID0g Y2ZncmVhZGwoRm4xLCBjdGxyLT5zZHJlZ3MgKyBIb3N0bWJveGRhdGEpOworCQkJY2Znd3JpdGVs KEZuMSwgY3Rsci0+c2RyZWdzICsgU2JtYm94LCAyKTsJLyogYWNrICovCisJCQlpZihtYm94ICYg MHg4KQorCQkJCXByaW50KCJldGhlcjQzMzA6IGZpcm13YXJlIHJlYWR5XG4iKTsKKwkJfQorCQlp ZihpbnRzICYgRnJhbWVJbnQpCisJCQlicmVhazsKKwl9CisJcG9wZXJyb3IoKTsKK30KKworc3Rh dGljIEJsb2NrKgord2xyZWFkcGt0KEN0bHIgKmN0bCkKK3sKKwlCbG9jayAqYjsKKwlTZHBjbSAq cDsKKwlpbnQgbGVuLCBsZW5jazsKKworCWIgPSBhbGxvY2IoMjA0OCk7CisJcCA9IChTZHBjbSop Yi0+d3A7CisJcWxvY2soJmN0bC0+cGt0bG9jayk7CisJZm9yKDs7KXsKKwkJcGFja2V0cncoMCwg Yi0+d3AsIHNpemVvZigqcCkpOworCQlsZW4gPSBwLT5sZW5bMF0gfCBwLT5sZW5bMV08PDg7CisJ CWlmKGxlbiA9PSAwKXsKKwkJCWZyZWViKGIpOworCQkJYiA9IG5pbDsKKwkJCWJyZWFrOworCQl9 CisJCWxlbmNrID0gcC0+bGVuY2tbMF0gfCBwLT5sZW5ja1sxXTw8ODsKKwkJaWYobGVuY2sgIT0g KGxlbiBeIDB4RkZGRikgfHwKKwkJICAgbGVuIDwgc2l6ZW9mKCpwKSB8fCBsZW4gPiAyMDQ4KXsK KwkJCXByaW50KCJldGhlcjQzMzA6IHdscmVhZHBrdCBlcnJvciBsZW4gJS40eCBsZW5jayAlLjR4 XG4iLCBsZW4sIGxlbmNrKTsKKwkJCWNmZ3coRnJhbWVjdGwsIFJmaGFsdCk7CisJCQl3aGlsZShj ZmdyKFJmcm1jbnQrMSkpCisJCQkJOworCQkJd2hpbGUoY2ZncihSZnJtY250KSkKKwkJCQk7CisJ CQljb250aW51ZTsKKwkJfQorCQlpZihsZW4gPiBzaXplb2YoKnApKQorCQkJcGFja2V0cncoMCwg Yi0+d3AgKyBzaXplb2YoKnApLCBsZW4gLSBzaXplb2YoKnApKTsKKwkJYi0+d3AgKz0gbGVuOwor CQlicmVhazsKKwl9CisJcXVubG9jaygmY3RsLT5wa3Rsb2NrKTsKKwlyZXR1cm4gYjsKK30KKwor c3RhdGljIHZvaWQKK3R4c3RhcnQoRXRoZXIgKmVkZXYpCit7CisJQ3RsciAqY3RsOworCVNkcGNt ICpwOworCUJsb2NrICpiOworCWludCBsZW4sIG9mZjsKKworCWN0bCA9IGVkZXYtPmN0bHI7CisJ aWYoIWNhbnFsb2NrKCZjdGwtPnRsb2NrKSkKKwkJcmV0dXJuOworCWlmKHdhc2Vycm9yKCkpewor CQlxdW5sb2NrKCZjdGwtPnRsb2NrKTsKKwkJcmV0dXJuOworCX0KKwlmb3IoOzspeworCQlsb2Nr KCZjdGwtPnR4d2lubG9jayk7CisJCWlmKGN0bC0+dHhzZXEgPT0gY3RsLT50eHdpbmRvdyl7CisJ CQkvL3ByaW50KCJmIik7CisJCQl1bmxvY2soJmN0bC0+dHh3aW5sb2NrKTsKKwkJCWJyZWFrOwor CQl9CisJCWlmKGN0bC0+ZmNtYXNrICYgMTw8Mil7CisJCQkvL3ByaW50KCJ4Iik7CisJCQl1bmxv Y2soJmN0bC0+dHh3aW5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJCXVubG9jaygmY3RsLT50eHdp bmxvY2spOworCQliID0gcWdldChlZGV2LT5vcSk7CisJCWlmKGIgPT0gbmlsKQorCQkJYnJlYWs7 CisJCW9mZiA9ICgodWludHB0ciliLT5ycCAmIDMpICsgc2l6ZW9mKFNkcGNtKTsKKwkJYiA9IHBh ZGJsb2NrKGIsIG9mZiArIDQpOworCQlsZW4gPSBCTEVOKGIpOworCQlwID0gKFNkcGNtKiliLT5y cDsKKwkJbWVtc2V0KHAsIDAsIG9mZik7CS8qIFRPRE86IHJlZmFjdG9yIGR1cCBjb2RlICovCisJ CXB1dDIocC0+bGVuLCBsZW4pOworCQlwdXQyKHAtPmxlbmNrLCB+bGVuKTsKKwkJcC0+Y2hhbmZs ZyA9IDI7CisJCXAtPnNlcSA9IGN0bC0+dHhzZXE7CisJCXAtPmRvZmZzZXQgPSBvZmY7CisJCXB1 dDQoYi0+cnAgKyBvZmYsIDB4MjApOwkvKiBCREMgaGVhZGVyICovCisJCWlmKGlvZGVidWcpIGR1 bXAoInNlbmQiLCBiLT5ycCwgbGVuKTsKKwkJcWxvY2soJmN0bC0+cGt0bG9jayk7CisJCWlmKHdh c2Vycm9yKCkpeworCQkJaWYoaW9kZWJ1ZykgcHJpbnQoImhhbHQgZnJhbWUgJXggJXhcbiIsIGNm Z3IoV2ZybWNudCsxKSwgY2ZncihXZnJtY250KzEpKTsKKwkJCWNmZ3coRnJhbWVjdGwsIFdmaGFs dCk7CisJCQl3aGlsZShjZmdyKFdmcm1jbnQrMSkpCisJCQkJOworCQkJd2hpbGUoY2ZncihXZnJt Y250KSkKKwkJCQk7CisJCQlxdW5sb2NrKCZjdGwtPnBrdGxvY2spOworCQkJbmV4dGVycm9yKCk7 CisJCX0KKwkJcGFja2V0cncoMSwgYi0+cnAsIGxlbik7CisJCWN0bC0+dHhzZXErKzsKKwkJcG9w ZXJyb3IoKTsKKwkJcXVubG9jaygmY3RsLT5wa3Rsb2NrKTsKKwkJZnJlZWIoYik7CisJfQorCXBv cGVycm9yKCk7CisJcXVubG9jaygmY3RsLT50bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitycHJv Yyh2b2lkICphKQoreworCUV0aGVyICplZGV2OworCUN0bHIgKmN0bDsKKwlCbG9jayAqYjsKKwlT ZHBjbSAqcDsKKwlDbWQgKnE7CisJaW50IGZsb3dzdGFydDsKKwlpbnQgYmRjOworCisJZWRldiA9 IGE7CisJY3RsID0gZWRldi0+Y3RscjsKKwlmbG93c3RhcnQgPSAwOworCWZvcig7Oyl7CisJCWlm KGZsb3dzdGFydCl7CisJCQkvL3ByaW50KCJGIik7CisJCQlmbG93c3RhcnQgPSAwOworCQkJdHhz dGFydChlZGV2KTsKKwkJfQorCQliID0gd2xyZWFkcGt0KGN0bCk7CisJCWlmKGIgPT0gbmlsKXsK KwkJCWludHdhaXQoY3RsLCAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXAgPSAoU2RwY20qKWIt PnJwOworCQlpZihwLT53aW5kb3cgIT0gY3RsLT50eHdpbmRvdyB8fCBwLT5mY21hc2sgIT0gY3Rs LT5mY21hc2speworCQkJbG9jaygmY3RsLT50eHdpbmxvY2spOworCQkJaWYocC0+d2luZG93ICE9 IGN0bC0+dHh3aW5kb3cpeworCQkJCWlmKGN0bC0+dHhzZXEgPT0gY3RsLT50eHdpbmRvdykKKwkJ CQkJZmxvd3N0YXJ0ID0gMTsKKwkJCQljdGwtPnR4d2luZG93ID0gcC0+d2luZG93OworCQkJfQor CQkJaWYocC0+ZmNtYXNrICE9IGN0bC0+ZmNtYXNrKXsKKwkJCQlpZigocC0+ZmNtYXNrICYgMTw8 MikgPT0gMCkKKwkJCQkJZmxvd3N0YXJ0ID0gMTsKKwkJCQljdGwtPmZjbWFzayA9IHAtPmZjbWFz azsKKwkJCX0KKwkJCXVubG9jaygmY3RsLT50eHdpbmxvY2spOworCQl9CisJCXN3aXRjaChwLT5j aGFuZmxnICYgMHhGKXsKKwkJY2FzZSAwOgorCQkJaWYoaW9kZWJ1ZykgZHVtcCgicnNwIiwgYi0+ cnAsIEJMRU4oYikpOworCQkJaWYoQkxFTihiKSA8IHNpemVvZihTZHBjbSkgKyBzaXplb2YoQ21k KSkKKwkJCQlicmVhazsKKwkJCXEgPSAoQ21kKikoYi0+cnAgKyBzaXplb2YoKnApKTsKKwkJCWlm KChxLT5pZFswXSB8IHEtPmlkWzFdPDw4KSAhPSBjdGwtPnJlcWlkKQorCQkJCWJyZWFrOworCQkJ Y3RsLT5yc3AgPSBiOworCQkJd2FrZXVwKCZjdGwtPmNtZHIpOworCQkJY29udGludWU7CisJCWNh c2UgMToKKwkJCWlmKGlvZGVidWcpIGR1bXAoImV2ZW50IiwgYi0+cnAsIEJMRU4oYikpOworCQkJ aWYoQkxFTihiKSA+IHAtPmRvZmZzZXQgKyA0KXsKKwkJCQliZGMgPSA0ICsgKGItPnJwW3AtPmRv ZmZzZXQgKyAzXSA8PCAyKTsKKwkJCQlpZihCTEVOKGIpID4gcC0+ZG9mZnNldCArIGJkYyl7CisJ CQkJCWItPnJwICs9IHAtPmRvZmZzZXQgKyBiZGM7CS8qIHNraXAgQkRDIGhlYWRlciAqLworCQkJ CQliY21ldmVudChjdGwsIGItPnJwLCBCTEVOKGIpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJ fQorCQkJaWYoaW9kZWJ1ZyAmJiBCTEVOKGIpICE9IHAtPmRvZmZzZXQpCisJCQkJcHJpbnQoInNo b3J0IGV2ZW50ICVsZCAlZFxuIiwgQkxFTihiKSwgcC0+ZG9mZnNldCk7CisJCQlicmVhazsKKwkJ Y2FzZSAyOgorCQkJaWYoaW9kZWJ1ZykgZHVtcCgicGFja2V0IiwgYi0+cnAsIEJMRU4oYikpOwor CQkJaWYoQkxFTihiKSA+IHAtPmRvZmZzZXQgKyA0KXsKKwkJCQliZGMgPSA0ICsgKGItPnJwW3At PmRvZmZzZXQgKyAzXSA8PCAyKTsKKwkJCQlpZihCTEVOKGIpID49IHAtPmRvZmZzZXQgKyBiZGMg KyBFVEhFUkhEUlNJWkUpeworCQkJCQliLT5ycCArPSBwLT5kb2Zmc2V0ICsgYmRjOwkvKiBza2lw IEJEQyBoZWFkZXIgKi8KKwkJCQkJZXRoZXJpcShlZGV2LCBiKTsKKwkJCQkJY29udGludWU7CisJ CQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkdW1wKCJldGhlcjQzMzA6IGJh ZCBwYWNrZXQiLCBiLT5ycCwgQkxFTihiKSk7CisJCQlicmVhazsKKwkJfQorCQlmcmVlYihiKTsK Kwl9Cit9CisKK3N0YXRpYyB2b2lkCitsaW5rZG93bihDdGxyICpjdGwpCit7CisJRXRoZXIgKmVk ZXY7CisJTmV0ZmlsZSAqZjsKKwlpbnQgaTsKKworCWVkZXYgPSBjdGwtPmVkZXY7CisJaWYoZWRl diA9PSBuaWwgfHwgY3RsLT5zdGF0dXMgIT0gQ29ubmVjdGVkKQorCQlyZXR1cm47CisJY3RsLT5z dGF0dXMgPSBEaXNjb25uZWN0ZWQ7CisJLyogc2VuZCBlb2YgdG8gYXV4L3dwYSAqLworCWZvcihp ID0gMDsgaSA8IGVkZXYtPm5maWxlOyBpKyspeworCQlmID0gZWRldi0+ZltpXTsKKwkJaWYoZiA9 PSBuaWwgfHwgZi0+aW4gPT0gbmlsIHx8IGYtPmludXNlID09IDAgfHwgZi0+dHlwZSAhPSAweDg4 OGUpCisJCQljb250aW51ZTsKKwkJcXdyaXRlKGYtPmluLCAwLCAwKTsKKwl9Cit9CisKKy8qCisg KiBDb21tYW5kIGludGVyZmFjZSBiZXR3ZWVuIGhvc3QgYW5kIGZpcm13YXJlCisgKi8KKworc3Rh dGljIGNoYXIgKmV2ZW50bmFtZXNbXSA9IHsKKwlbMF0gPSAic2V0IHNzaWQiLAorCVsxXSA9ICJq b2luIiwKKwlbMl0gPSAic3RhcnQiLAorCVszXSA9ICJhdXRoIiwKKwlbNF0gPSAiYXV0aCBpbmQi LAorCVs1XSA9ICJkZWF1dGgiLAorCVs2XSA9ICJkZWF1dGggaW5kIiwKKwlbN10gPSAiYXNzb2Mi LAorCVs4XSA9ICJhc3NvYyBpbmQiLAorCVs5XSA9ICJyZWFzc29jIiwKKwlbMTBdID0gInJlYXNz b2MgaW5kIiwKKwlbMTFdID0gImRpc2Fzc29jIiwKKwlbMTJdID0gImRpc2Fzc29jIGluZCIsCisJ WzEzXSA9ICJxdWlldCBzdGFydCIsCisJWzE0XSA9ICJxdWlldCBlbmQiLAorCVsxNV0gPSAiYmVh Y29uIHJ4IiwKKwlbMTZdID0gImxpbmsiLAorCVsxN10gPSAibWljIGVycm9yIiwKKwlbMThdID0g Im5kaXMgbGluayIsCisJWzE5XSA9ICJyb2FtIiwKKwlbMjBdID0gInR4ZmFpbCIsCisJWzIxXSA9 ICJwbWtpZCBjYWNoZSIsCisJWzIyXSA9ICJyZXRyb2dyYWRlIHRzZiIsCisJWzIzXSA9ICJwcnVu ZSIsCisJWzI0XSA9ICJhdXRvYXV0aCIsCisJWzI1XSA9ICJlYXBvbCBtc2ciLAorCVsyNl0gPSAi c2NhbiBjb21wbGV0ZSIsCisJWzI3XSA9ICJhZGR0cyBpbmQiLAorCVsyOF0gPSAiZGVsdHMgaW5k IiwKKwlbMjldID0gImJjbnNlbnQgaW5kIiwKKwlbMzBdID0gImJjbnJ4IG1zZyIsCisJWzMxXSA9 ICJiY25sb3N0IG1zZyIsCisJWzMyXSA9ICJyb2FtIHByZXAiLAorCVszM10gPSAicGZuIG5ldCBm b3VuZCIsCisJWzM0XSA9ICJwZm4gbmV0IGxvc3QiLAorCVszNV0gPSAicmVzZXQgY29tcGxldGUi LAorCVszNl0gPSAiam9pbiBzdGFydCIsCisJWzM3XSA9ICJyb2FtIHN0YXJ0IiwKKwlbMzhdID0g ImFzc29jIHN0YXJ0IiwKKwlbMzldID0gImlic3MgYXNzb2MiLAorCVs0MF0gPSAicmFkaW8iLAor CVs0MV0gPSAicHNtIHdhdGNoZG9nIiwKKwlbNDRdID0gInByb2JyZXEgbXNnIiwKKwlbNDVdID0g InNjYW4gY29uZmlybSBpbmQiLAorCVs0Nl0gPSAicHNrIHN1cCIsCisJWzQ3XSA9ICJjb3VudHJ5 IGNvZGUgY2hhbmdlZCIsCisJWzQ4XSA9ICJleGNlZWRlZCBtZWRpdW0gdGltZSIsCisJWzQ5XSA9 ICJpY3YgZXJyb3IiLAorCVs1MF0gPSAidW5pY2FzdCBkZWNvZGUgZXJyb3IiLAorCVs1MV0gPSAi bXVsdGljYXN0IGRlY29kZSBlcnJvciIsCisJWzUyXSA9ICJ0cmFjZSIsCisJWzUzXSA9ICJidGEg aGNpIGV2ZW50IiwKKwlbNTRdID0gImlmIiwKKwlbNTVdID0gInAycCBkaXNjIGxpc3RlbiBjb21w bGV0ZSIsCisJWzU2XSA9ICJyc3NpIiwKKwlbNTddID0gInBmbiBzY2FuIGNvbXBsZXRlIiwKKwlb NThdID0gImV4dGxvZyBtc2ciLAorCVs1OV0gPSAiYWN0aW9uIGZyYW1lIiwKKwlbNjBdID0gImFj dGlvbiBmcmFtZSBjb21wbGV0ZSIsCisJWzYxXSA9ICJwcmUgYXNzb2MgaW5kIiwKKwlbNjJdID0g InByZSByZWFzc29jIGluZCIsCisJWzYzXSA9ICJjaGFubmVsIGFkb3B0ZWQiLAorCVs2NF0gPSAi YXAgc3RhcnRlZCIsCisJWzY1XSA9ICJkZnMgYXAgc3RvcCIsCisJWzY2XSA9ICJkZnMgYXAgcmVz dW1lIiwKKwlbNjddID0gIndhaSBzdGEgZXZlbnQiLAorCVs2OF0gPSAid2FpIG1zZyIsCisJWzY5 XSA9ICJlc2NhbiByZXN1bHQiLAorCVs3MF0gPSAiYWN0aW9uIGZyYW1lIG9mZiBjaGFuIGNvbXBs ZXRlIiwKKwlbNzFdID0gInByb2JyZXNwIG1zZyIsCisJWzcyXSA9ICJwMnAgcHJvYnJlcSBtc2ci LAorCVs3M10gPSAiZGNzIHJlcXVlc3QiLAorCVs3NF0gPSAiZmlmbyBjcmVkaXQgbWFwIiwKKwlb NzVdID0gImFjdGlvbiBmcmFtZSByeCIsCisJWzc2XSA9ICJ3YWtlIGV2ZW50IiwKKwlbNzddID0g InJtIGNvbXBsZXRlIiwKKwlbNzhdID0gImh0c2ZzeW5jIiwKKwlbNzldID0gIm92ZXJsYXkgcmVx IiwKKwlbODBdID0gImNzYSBjb21wbGV0ZSBpbmQiLAorCVs4MV0gPSAiZXhjZXNzIHBtIHdha2Ug ZXZlbnQiLAorCVs4Ml0gPSAicGZuIHNjYW4gbm9uZSIsCisJWzgzXSA9ICJwZm4gc2NhbiBhbGxn b25lIiwKKwlbODRdID0gImd0ayBwbHVtYmVkIiwKKwlbODVdID0gImFzc29jIGluZCBuZGlzIiwK KwlbODZdID0gInJlYXNzb2MgaW5kIG5kaXMiLAorCVs4N10gPSAiYXNzb2MgcmVxIGllIiwKKwlb ODhdID0gImFzc29jIHJlc3AgaWUiLAorCVs4OV0gPSAiYXNzb2MgcmVjcmVhdGVkIiwKKwlbOTBd ID0gImFjdGlvbiBmcmFtZSByeCBuZGlzIiwKKwlbOTFdID0gImF1dGggcmVxIiwKKwlbOTJdID0g InRkbHMgcGVlciBldmVudCIsCisJWzEyN10gPSAiYmNtYyBjcmVkaXQgc3VwcG9ydCIKK307CisK K3N0YXRpYyBjaGFyKgorZXZzdHJpbmcodWludCBldmVudCkKK3sKKwlzdGF0aWMgY2hhciBidWZb MTJdOworCisJaWYoZXZlbnQgPj0gbmVsZW0oZXZlbnRuYW1lcykgfHwgZXZlbnRuYW1lc1tldmVu dF0gPT0gMCl7CisJCS8qIG5vdCByZWVudHJhbnQgYnV0IG9ubHkgY2FsbGVkIGZyb20gb25lIGtw cm9jICovCisJCXNucHJpbnQoYnVmLCBzaXplb2YgYnVmLCAiJWQiLCBldmVudCk7CisJCXJldHVy biBidWY7CisJfQorCXJldHVybiBldmVudG5hbWVzW2V2ZW50XTsKK30KKworc3RhdGljIHZvaWQK K2JjbWV2ZW50KEN0bHIgKmN0bCwgdWNoYXIgKnAsIGludCBsZW4pCit7CisJaW50IGZsYWdzOwor CWxvbmcgZXZlbnQsIHN0YXR1cywgcmVhc29uOworCisJaWYobGVuIDwgRVRIRVJIRFJTSVpFICsg MTAgKyA0NikKKwkJcmV0dXJuOworCXAgKz0gRVRIRVJIRFJTSVpFICsgMTA7CQkJLyogc2tpcCBi Y21fZXRoZXIgaGVhZGVyICovCisJbGVuIC09IEVUSEVSSERSU0laRSArIDEwOworCWZsYWdzID0g bmhnZXRzKHAgKyAyKTsKKwlldmVudCA9IG5oZ2V0cyhwICsgNik7CisJc3RhdHVzID0gbmhnZXRs KHAgKyA4KTsKKwlyZWFzb24gPSBuaGdldGwocCArIDEyKTsKKwlpZihFVkVOVERFQlVHKQorCQlw cmludCgiZXRoZXI0MzMwOiBbJXNdIHN0YXR1cyAlbGQgZmxhZ3MgJSN4IHJlYXNvbiAlbGRcbiIs IAorCQkJZXZzdHJpbmcoZXZlbnQpLCBzdGF0dXMsIGZsYWdzLCByZWFzb24pOworCXN3aXRjaChl dmVudCl7CisJY2FzZSAxOToJLyogRV9ST0FNICovCisJCWlmKHN0YXR1cyA9PSAwKQorCQkJYnJl YWs7CisJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAwOgkJLyogRV9TRVRfU1NJRCAqLworCQlj dGwtPmpvaW5zdGF0dXMgPSAxICsgc3RhdHVzOworCQl3YWtldXAoJmN0bC0+am9pbnIpOworCQli cmVhazsKKwljYXNlIDE2OgkvKiBFX0xJTksgKi8KKwkJaWYoZmxhZ3MmMSkJLyogbGluayB1cCAq LworCQkJYnJlYWs7CisJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSA1OgkJLyogRV9ERUFVVEgg Ki8KKwljYXNlIDY6CQkvKiBFX0RFQVVUSF9JTkQgKi8KKwljYXNlIDEyOgkvKiBFX0RJU0FTU09D X0lORCAqLworCQlsaW5rZG93bihjdGwpOworCQlicmVhazsKKwljYXNlIDI2OgkvKiBFX1NDQU5f Q09NUExFVEUgKi8KKwkJYnJlYWs7CisJY2FzZSA2OToJLyogRV9FU0NBTl9SRVNVTFQgKi8KKwkJ d2xzY2FucmVzdWx0KGN0bC0+ZWRldiwgcCArIDQ4LCBsZW4gLSA0OCk7CisJCWJyZWFrOworCWRl ZmF1bHQ6CisJCWlmKHN0YXR1cyl7CisJCQlpZighRVZFTlRERUJVRykKKwkJCQlwcmludCgiZXRo ZXI0MzMwOiBbJXNdIGVycm9yIHN0YXR1cyAlbGQgZmxhZ3MgJSN4IHJlYXNvbiAlbGRcbiIsCisJ CQkJCWV2c3RyaW5nKGV2ZW50KSwgc3RhdHVzLCBmbGFncywgcmVhc29uKTsKKwkJCWR1bXAoImV2 ZW50IiwgcCwgbGVuKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAoram9pbmRvbmUodm9pZCAq YSkKK3sKKwlyZXR1cm4gKChDdGxyKilhKS0+am9pbnN0YXR1czsKK30KKworc3RhdGljIGludAor d2FpdGpvaW4oQ3RsciAqY3RsKQoreworCWludCBuOworCisJc2xlZXAoJmN0bC0+am9pbnIsIGpv aW5kb25lLCBjdGwpOworCW4gPSBjdGwtPmpvaW5zdGF0dXM7CisJY3RsLT5qb2luc3RhdHVzID0g MDsKKwlyZXR1cm4gbiAtIDE7Cit9CisKK3N0YXRpYyBpbnQKK2NtZGRvbmUodm9pZCAqYSkKK3sK KwlyZXR1cm4gKChDdGxyKilhKS0+cnNwICE9IG5pbDsKK30KKworc3RhdGljIHZvaWQKK3dsY21k KEN0bHIgKmN0bCwgaW50IHdyaXRlLCBpbnQgb3AsIHZvaWQgKmRhdGEsIGludCBkbGVuLCB2b2lk ICpyZXMsIGludCBybGVuKQoreworCUJsb2NrICpiOworCVNkcGNtICpwOworCUNtZCAqcTsKKwlp bnQgbGVuLCB0bGVuOworCisJaWYod3JpdGUpCisJCXRsZW4gPSBkbGVuICsgcmxlbjsKKwllbHNl CisJCXRsZW4gPSBNQVgoZGxlbiwgcmxlbik7CisJbGVuID0gc2l6ZW9mKFNkcGNtKSArIHNpemVv ZihDbWQpICsgdGxlbjsKKwliID0gYWxsb2NiKGxlbik7CisJcWxvY2soJmN0bC0+Y21kbG9jayk7 CisJaWYod2FzZXJyb3IoKSl7CisJCWZyZWViKGIpOworCQlxdW5sb2NrKCZjdGwtPmNtZGxvY2sp OworCQluZXh0ZXJyb3IoKTsKKwl9CisJbWVtc2V0KGItPndwLCAwLCBsZW4pOworCXFsb2NrKCZj dGwtPnBrdGxvY2spOworCXAgPSAoU2RwY20qKWItPndwOworCXB1dDIocC0+bGVuLCBsZW4pOwor CXB1dDIocC0+bGVuY2ssIH5sZW4pOworCXAtPnNlcSA9IGN0bC0+dHhzZXE7CisJcC0+ZG9mZnNl dCA9IHNpemVvZihTZHBjbSk7CisJYi0+d3AgKz0gc2l6ZW9mKCpwKTsKKwkKKwlxID0gKENtZCop Yi0+d3A7CisJcHV0NChxLT5jbWQsIG9wKTsKKwlwdXQ0KHEtPmxlbiwgdGxlbik7CisJcHV0Mihx LT5mbGFncywgd3JpdGU/IDIgOiAwKTsKKwlwdXQyKHEtPmlkLCArK2N0bC0+cmVxaWQpOworCXB1 dDQocS0+c3RhdHVzLCAwKTsKKwliLT53cCArPSBzaXplb2YoKnEpOworCisJaWYoZGxlbiA+IDAp CisJCW1lbW1vdmUoYi0+d3AsIGRhdGEsIGRsZW4pOworCWlmKHdyaXRlKQorCQltZW1tb3ZlKGIt PndwICsgZGxlbiwgcmVzLCBybGVuKTsKKwliLT53cCArPSB0bGVuOworCisJaWYoaW9kZWJ1Zykg ZHVtcCgiY21kIiwgYi0+cnAsIGxlbik7CisJcGFja2V0cncoMSwgYi0+cnAsIGxlbik7CisJY3Rs LT50eHNlcSsrOworCXF1bmxvY2soJmN0bC0+cGt0bG9jayk7CisJZnJlZWIoYik7CisJYiA9IG5p bDsKKwlVU0VEKGIpOworCXNsZWVwKCZjdGwtPmNtZHIsIGNtZGRvbmUsIGN0bCk7CisJYiA9IGN0 bC0+cnNwOworCWN0bC0+cnNwID0gbmlsOworCWFzc2VydChiICE9IG5pbCk7CisJcCA9IChTZHBj bSopYi0+cnA7CisJcSA9IChDbWQqKShiLT5ycCArIHAtPmRvZmZzZXQpOworCWlmKHEtPnN0YXR1 c1swXSB8IHEtPnN0YXR1c1sxXSB8IHEtPnN0YXR1c1syXSB8IHEtPnN0YXR1c1szXSl7CisJCXBy aW50KCJldGhlcjQzMzA6IGNtZCAlZCBlcnJvciBzdGF0dXMgJWxkXG4iLCBvcCwgZ2V0NChxLT5z dGF0dXMpKTsKKwkJZHVtcCgiZXRoZXI0MzMwOiBjbWQgZXJyb3IiLCBiLT5ycCwgQkxFTihiKSk7 CisJCWVycm9yKCJ3bGNtZCBlcnJvciIpOworCX0KKwlpZighd3JpdGUpCisJCW1lbW1vdmUocmVz LCBxICsgMSwgcmxlbik7CisJZnJlZWIoYik7CisJcXVubG9jaygmY3RsLT5jbWRsb2NrKTsKKwlw b3BlcnJvcigpOworfQorCitzdGF0aWMgdm9pZAord2xjbWRpbnQoQ3RsciAqY3RsLCBpbnQgb3As IGludCB2YWwpCit7CisJdWNoYXIgYnVmWzRdOworCisJcHV0NChidWYsIHZhbCk7CisJd2xjbWQo Y3RsLCAxLCBvcCwgYnVmLCA0LCBuaWwsIDApOworfQorCitzdGF0aWMgdm9pZAord2xnZXR2YXIo Q3RsciAqY3RsLCBjaGFyICpuYW1lLCB2b2lkICp2YWwsIGludCBsZW4pCit7CisJd2xjbWQoY3Rs LCAwLCBHZXRWYXIsIG5hbWUsIHN0cmxlbihuYW1lKSArIDEsIHZhbCwgbGVuKTsKK30KKworc3Rh dGljIHZvaWQKK3dsc2V0dmFyKEN0bHIgKmN0bCwgY2hhciAqbmFtZSwgdm9pZCAqdmFsLCBpbnQg bGVuKQoreworCWlmKFZBUkRFQlVHKXsKKwkJY2hhciBidWZbMzJdOworCQlzbnByaW50KGJ1Ziwg c2l6ZW9mIGJ1ZiwgIndsc2V0dmFyICVzOiIsIG5hbWUpOworCQlkdW1wKGJ1ZiwgdmFsLCBsZW4p OworCX0KKwl3bGNtZChjdGwsIDEsIFNldFZhciwgbmFtZSwgc3RybGVuKG5hbWUpICsgMSwgdmFs LCBsZW4pOworfQorCitzdGF0aWMgdm9pZAord2xzZXRpbnQoQ3RsciAqY3RsLCBjaGFyICpuYW1l LCBpbnQgdmFsKQoreworCXVjaGFyIGJ1Zls0XTsKKworCXB1dDQoYnVmLCB2YWwpOworCXdsc2V0 dmFyKGN0bCwgbmFtZSwgYnVmLCA0KTsKK30KKworc3RhdGljIHZvaWQKK3dsd2Vwa2V5KEN0bHIg KmN0bCwgaW50IGkpCit7CisJdWNoYXIgcGFyYW1zWzE2NF07CisJdWNoYXIgKnA7CisKKwltZW1z ZXQocGFyYW1zLCAwLCBzaXplb2YgcGFyYW1zKTsKKwlwID0gcGFyYW1zOworCXAgPSBwdXQ0KHAs IGkpOwkJLyogaW5kZXggKi8KKwlwID0gcHV0NChwLCBjdGwtPmtleXNbaV0ubGVuKTsKKwltZW1t b3ZlKHAsIGN0bC0+a2V5c1tpXS5kYXQsIGN0bC0+a2V5c1tpXS5sZW4pOworCXAgKz0gMzIgKyAx OCo0OwkJLyoga2V5ZGF0YSwgcGFkICovCisJaWYoY3RsLT5rZXlzW2ldLmxlbiA9PSBXTWluS2V5 TGVuKQorCQlwID0gcHV0NChwLCAxKTsJCS8qIGFsZ28gPSBXRVAxICovCisJZWxzZQorCQlwID0g cHV0NChwLCAzKTsJCS8qIGFsZ28gPSBXRVAxMjggKi8KKwlwdXQ0KHAsIDIpOwkJLyogZmxhZ3Mg PSBQcmltYXJ5a2V5ICovCisKKwl3bHNldHZhcihjdGwsICJ3c2VjX2tleSIsIHBhcmFtcywgc2l6 ZW9mIHBhcmFtcyk7Cit9CisKK3N0YXRpYyB2b2lkCittZW1yZXZlcnNlKGNoYXIgKmRzdCwgY2hh ciAqc3JjLCBpbnQgbGVuKQoreworCXNyYyArPSBsZW47CisJd2hpbGUobGVuLS0gPiAwKQorCQkq ZHN0KysgPSAqLS1zcmM7Cit9CisKK3N0YXRpYyB2b2lkCit3bHdwYWtleShDdGxyICpjdGwsIGlu dCBpZCwgdXZsb25nIGl2LCB1Y2hhciAqZWEpCit7CisJdWNoYXIgcGFyYW1zWzE2NF07CisJdWNo YXIgKnA7CisJaW50IHBhaXJ3aXNlOworCisJaWYoaWQgPT0gQ01yeGtleSkKKwkJcmV0dXJuOwor CXBhaXJ3aXNlID0gKGlkID09IENNcnhrZXkgfHwgaWQgPT0gQ010eGtleSk7CisJbWVtc2V0KHBh cmFtcywgMCwgc2l6ZW9mIHBhcmFtcyk7CisJcCA9IHBhcmFtczsKKwlpZihwYWlyd2lzZSkKKwkJ cCA9IHB1dDQocCwgMCk7CisJZWxzZQorCQlwID0gcHV0NChwLCBpZCAtIENNcnhrZXkwKTsJLyog Z3JvdXAga2V5IGlkICovCisJcCA9IHB1dDQocCwgY3RsLT5rZXlzWzBdLmxlbik7CisJbWVtbW92 ZSgoY2hhciopcCwgIGN0bC0+a2V5c1swXS5kYXQsIGN0bC0+a2V5c1swXS5sZW4pOworCXAgKz0g MzIgKyAxOCo0OwkJLyoga2V5ZGF0YSwgcGFkICovCisJaWYoY3RsLT5jcnlwdG90eXBlID09IFdw YSkKKwkJcCA9IHB1dDQocCwgMik7CS8qIGFsZ28gPSBUS0lQICovCisJZWxzZQorCQlwID0gcHV0 NChwLCA0KTsJLyogYWxnbyA9IEFFU19DQ00gKi8KKwlpZihwYWlyd2lzZSkKKwkJcCA9IHB1dDQo cCwgMCk7CisJZWxzZQorCQlwID0gcHV0NChwLCAyKTsJCS8qIGZsYWdzID0gUHJpbWFyeWtleSAq LworCXAgKz0gMyo0OworCXAgPSBwdXQ0KHAsIDApOyAvL3BhaXJ3aXNlKTsJCS8qIGl2IGluaXRp YWxpc2VkICovCisJcCArPSA0OworCXAgPSBwdXQ0KHAsIGl2Pj4xNik7CS8qIGl2IGhpZ2ggKi8K KwlwID0gcHV0MihwLCBpdiYweEZGRkYpOwkvKiBpdiBsb3cgKi8KKwlwICs9IDIgKyAyKjQ7CQkv KiBhbGlnbiwgcGFkICovCisJaWYocGFpcndpc2UpCisJCW1lbW1vdmUocCwgZWEsIEVhZGRybGVu KTsKKworCXdsc2V0dmFyKGN0bCwgIndzZWNfa2V5IiwgcGFyYW1zLCBzaXplb2YgcGFyYW1zKTsK K30KKworc3RhdGljIHZvaWQKK3dsam9pbihDdGxyICpjdGwsIGNoYXIgKnNzaWQsIGludCBjaGFu KQoreworCXVjaGFyIHBhcmFtc1s3Ml07CisJdWNoYXIgKnA7CisJaW50IG47CisKKwlpZihjaGFu ICE9IDApCisJCWNoYW4gfD0gMHgyYjAwOwkJLyogMjBNaHogY2hhbm5lbCB3aWR0aCAqLworCXAg PSBwYXJhbXM7CisJbiA9IHN0cmxlbihzc2lkKTsKKwluID0gTUlOKG4sIDMyKTsKKwlwID0gcHV0 NChwLCBuKTsKKwltZW1tb3ZlKHAsIHNzaWQsIG4pOworCW1lbXNldChwICsgbiwgMCwgMzIgLSBu KTsKKwlwICs9IDMyOworCXAgPSBwdXQ0KHAsIDB4ZmYpOwkvKiBzY2FuIHR5cGUgKi8KKwlpZihj aGFuICE9IDApeworCQlwID0gcHV0NChwLCAyKTsJCS8qIG51bSBwcm9iZXMgKi8KKwkJcCA9IHB1 dDQocCwgMTIwKTsJLyogYWN0aXZlIHRpbWUgKi8KKwkJcCA9IHB1dDQocCwgMzkwKTsJLyogcGFz c2l2ZSB0aW1lICovCisJfWVsc2V7CisJCXAgPSBwdXQ0KHAsIC0xKTsJLyogbnVtIHByb2JlcyAq LworCQlwID0gcHV0NChwLCAtMSk7CS8qIGFjdGl2ZSB0aW1lICovCisJCXAgPSBwdXQ0KHAsIC0x KTsJLyogcGFzc2l2ZSB0aW1lICovCisJfQorCXAgPSBwdXQ0KHAsIC0xKTsJLyogaG9tZSB0aW1l ICovCisJbWVtc2V0KHAsIDB4RkYsIEVhZGRybGVuKTsJLyogYnNzaWQgKi8KKwlwICs9IEVhZGRy bGVuOworCXAgPSBwdXQyKHAsIDApOwkJLyogcGFkICovCisJaWYoY2hhbiAhPSAwKXsKKwkJcCA9 IHB1dDQocCwgMSk7CQkvKiBudW0gY2hhbnMgKi8KKwkJcCA9IHB1dDIocCwgY2hhbik7CS8qIGNo YW4gc3BlYyAqLworCQlwID0gcHV0MihwLCAwKTsJCS8qIHBhZCAqLworCQlhc3NlcnQocCA9PSBw YXJhbXMgKyBzaXplb2YocGFyYW1zKSk7CisJfWVsc2V7CisJCXAgPSBwdXQ0KHAsIDApOwkJLyog bnVtIGNoYW5zICovCisJCWFzc2VydChwID09IHBhcmFtcyArIHNpemVvZihwYXJhbXMpIC0gNCk7 CisJfQorCisJd2xzZXR2YXIoY3RsLCAiam9pbiIsIHBhcmFtcywgY2hhbj8gc2l6ZW9mIHBhcmFt cyA6IHNpemVvZiBwYXJhbXMgLSA0KTsKKwljdGwtPnN0YXR1cyA9IENvbm5lY3Rpbmc7CisJc3dp dGNoKHdhaXRqb2luKGN0bCkpeworCQljYXNlIDA6CisJCQljdGwtPnN0YXR1cyA9IENvbm5lY3Rl ZDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQljdGwtPnN0YXR1cyA9IERpc2Nvbm5lY3RlZDsK KwkJCWVycm9yKCJ3aWZpIGpvaW46IG5ldHdvcmsgbm90IGZvdW5kIik7CisJCWNhc2UgMToKKwkJ CWN0bC0+c3RhdHVzID0gRGlzY29ubmVjdGVkOworCQkJZXJyb3IoIndpZmkgam9pbjogZmFpbGVk Iik7CisJCWRlZmF1bHQ6CisJCQljdGwtPnN0YXR1cyA9IERpc2Nvbm5lY3RlZDsKKwkJCWVycm9y KCJ3aWZpIGpvaW46IGVycm9yIik7CisJfQorfQorCitzdGF0aWMgdm9pZAord2xzY2Fuc3RhcnQo Q3RsciAqY3RsKQoreworCS8qIHZlcnNpb25bNF0gYWN0aW9uWzJdIHN5bmNfaWRbMl0gc3NpZGxl bls0XSBzc2lkWzMyXSBic3NpZFs2XSBic3NfdHlwZVsxXQorCQlzY2FuX3R5cGVbMV0gbnByb2Jl c1s0XSBhY3RpdmVfdGltZVs0XSBwYXNzaXZlX3RpbWVbNF0gaG9tZV90aW1lWzRdCisJCW5jaGFu c1syXSBuc3NpZHNbMl0gY2hhbnNbbmNoYW5zXVsyXSBzc2lkc1tuc3NpZHNdWzMyXSAqLworCS8q IGhhY2sgLSB0aGlzIGlzIG9ubHkgY29ycmVjdCBvbiBhIGxpdHRsZS1lbmRpYW4gY3B1ICovCisJ c3RhdGljIHVjaGFyIHBhcmFtc1s0KzIrMis0KzMyKzYrMSsxKzQqNCsyKzIrMTQqMiszMis0XSA9 IHsKKwkJMSwwLDAsMCwKKwkJMSwwLAorCQkweDM0LDB4MTIsCisJCTAsMCwwLDAsCisJCTAsMCww LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAs MCwKKwkJMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisJCTIsCisJCTAsCisJCTB4ZmYs MHhmZiwweGZmLDB4ZmYsCisJCTB4ZmYsMHhmZiwweGZmLDB4ZmYsCisJCTB4ZmYsMHhmZiwweGZm LDB4ZmYsCisJCTB4ZmYsMHhmZiwweGZmLDB4ZmYsCisJCTE0LDAsCisJCTEsMCwKKwkJMHgwMSww eDJiLDB4MDIsMHgyYiwweDAzLDB4MmIsMHgwNCwweDJiLDB4MDUsMHgyZSwweDA2LDB4MmUsMHgw NywweDJlLAorCQkweDA4LDB4MmIsMHgwOSwweDJiLDB4MGEsMHgyYiwweDBiLDB4MmIsMHgwYyww eDJiLDB4MGQsMHgyYiwweDBlLDB4MmIsCisJCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCww LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwl9OworCisJd2xjbWRpbnQoY3Rs LCA0OSwgMCk7CS8qIFBBU1NJVkVfU0NBTiAqLworCXdsc2V0dmFyKGN0bCwgImVzY2FuIiwgcGFy YW1zLCBzaXplb2YgcGFyYW1zKTsKK30KKworc3RhdGljIHVjaGFyKgorZ2V0dGx2KHVjaGFyICpw LCB1Y2hhciAqZXAsIGludCB0YWcpCit7CisJaW50IGxlbjsKKworCXdoaWxlKHAgKyAxIDwgZXAp eworCQlsZW4gPSBwWzFdOworCQlpZihwICsgMiArIGxlbiA+IGVwKQorCQkJcmV0dXJuIG5pbDsK KwkJaWYocFswXSA9PSB0YWcpCisJCQlyZXR1cm4gcDsKKwkJcCArPSAyICsgbGVuOworCX0KKwly ZXR1cm4gbmlsOworfQorCitzdGF0aWMgdm9pZAorYWRkc2NhbihCbG9jayAqYnAsIHVjaGFyICpw LCBpbnQgbGVuKQoreworCWNoYXIgYnNzaWRbMjRdOworCWNoYXIgKmF1dGgsICphdXRoMjsKKwl1 Y2hhciAqdCwgKmV0OworCWludCBpZWxlbjsKKwlzdGF0aWMgdWNoYXIgd3BhaWUxWzRdID0geyAw eDAwLCAweDUwLCAweGYyLCAweDAxIH07CisKKwlzbnByaW50KGJzc2lkLCBzaXplb2YgYnNzaWQs ICI7YnNzaWQ9JUUiLCBwICsgOCk7CisJaWYoc3Ryc3RyKChjaGFyKilicC0+cnAsIGJzc2lkKSAh PSBuaWwpCisJCXJldHVybjsKKwlicC0+d3AgPSAodWNoYXIqKXNlcHJpbnQoKGNoYXIqKWJwLT53 cCwgKGNoYXIqKWJwLT5saW0sCisJCSJzc2lkPSUuKnMlcztzaWduYWw9JWQ7bm9pc2U9JWQ7Y2hh bj0lZCIsCisJCXBbMThdLCAoY2hhciopcCsxOSwgYnNzaWQsCisJCShzaG9ydClnZXQyKHArNzgp LCAoc2lnbmVkIGNoYXIpcFs4MF0sCisJCWdldDIocCs3MikgJiAweEYpOworCWF1dGggPSBhdXRo MiA9ICIiOworCWlmKGdldDIocCArIDE2KSAmIDB4MTApCisJCWF1dGggPSAiO3dlcCI7CisJaWVs ZW4gPSBnZXQ0KHAgKyAweDc4KTsKKwlpZihpZWxlbiA+IDApeworCQl0ID0gcCArIGdldDQocCAr IDB4NzQpOworCQlldCA9IHQgKyBpZWxlbjsKKwkJaWYoZXQgPiBwICsgbGVuKQorCQkJcmV0dXJu OworCQlpZihnZXR0bHYodCwgZXQsIDB4MzApICE9IG5pbCl7CisJCQlhdXRoID0gIiI7CisJCQlh dXRoMiA9ICI7d3BhMiI7CisJCX0KKwkJd2hpbGUoKHQgPSBnZXR0bHYodCwgZXQsIDB4ZGQpKSAh PSBuaWwpeworCQkJaWYodFsxXSA+IDQgJiYgbWVtY21wKHQrMiwgd3BhaWUxLCA0KSA9PSAwKXsK KwkJCQlhdXRoID0gIjt3cGEiOworCQkJCWJyZWFrOworCQkJfQorCQkJdCArPSAyICsgdFsxXTsK KwkJfQorCX0KKwlicC0+d3AgPSAodWNoYXIqKXNlcHJpbnQoKGNoYXIqKWJwLT53cCwgKGNoYXIq KWJwLT5saW0sCisJCSIlcyVzXG4iLCBhdXRoLCBhdXRoMik7Cit9CisKKworc3RhdGljIHZvaWQK K3dsc2NhbnJlc3VsdChFdGhlciAqZWRldiwgdWNoYXIgKnAsIGludCBsZW4pCit7CisJQ3RsciAq Y3RscjsKKwlOZXRmaWxlICoqZXAsICpmLCAqKmZwOworCUJsb2NrICpicDsKKwlpbnQgbmJzcywg aTsKKworCWN0bHIgPSBlZGV2LT5jdGxyOworCWlmKGdldDQocCkgPiBsZW4pCisJCXJldHVybjsK KwkvKiBUT0RPOiBtb3JlIHN5bnRheCBjaGVja2luZyAqLworCWJwID0gY3Rsci0+c2NhbmI7CisJ aWYoYnAgPT0gbmlsKQorCQljdGxyLT5zY2FuYiA9IGJwID0gYWxsb2NiKDgxOTIpOworCW5ic3Mg PSBnZXQyKHArMTApOworCXAgKz0gMTI7CisJbGVuIC09IDEyOworCWlmKDApIGR1bXAoIlNDQU4i LCBwLCBsZW4pOworCWlmKG5ic3MpeworCQlhZGRzY2FuKGJwLCBwLCBsZW4pOworCQlyZXR1cm47 CisJfQorCWkgPSBlZGV2LT5zY2FuOworCWVwID0gJmVkZXYtPmZbTnR5cGVzXTsKKwlmb3IoZnAg PSBlZGV2LT5mOyBmcCA8IGVwICYmIGkgPiAwOyBmcCsrKXsKKwkJZiA9ICpmcDsKKwkJaWYoZiA9 PSBuaWwgfHwgZi0+c2NhbiA9PSAwKQorCQkJY29udGludWU7CisJCWlmKGkgPT0gMSkKKwkJCXFw YXNzKGYtPmluLCBicCk7CisJCWVsc2UKKwkJCXFwYXNzKGYtPmluLCBjb3B5YmxvY2soYnAsIEJM RU4oYnApKSk7CisJCWktLTsKKwl9CisJaWYoaSkKKwkJZnJlZWIoYnApOworCWN0bHItPnNjYW5i ID0gbmlsOworfQorCitzdGF0aWMgdm9pZAorbHByb2Modm9pZCAqYSkKK3sKKwlFdGhlciAqZWRl djsKKwlDdGxyICpjdGxyOworCWludCBzZWNzOworCisJZWRldiA9IGE7CisJY3RsciA9IGVkZXYt PmN0bHI7CisJc2VjcyA9IDA7CisJZm9yKDs7KXsKKwkJdHNsZWVwKCZ1cC0+c2xlZXAsIHJldHVy bjAsIDAsIDEwMDApOworCQlpZihjdGxyLT5zY2Fuc2Vjcyl7CisJCQlpZihzZWNzID09IDApewor CQkJCWlmKHdhc2Vycm9yKCkpCisJCQkJCWN0bHItPnNjYW5zZWNzID0gMDsKKwkJCQllbHNlewor CQkJCQl3bHNjYW5zdGFydChjdGxyKTsKKwkJCQkJcG9wZXJyb3IoKTsKKwkJCQl9CisJCQkJc2Vj cyA9IGN0bHItPnNjYW5zZWNzOworCQkJfQorCQkJLS1zZWNzOworCQl9ZWxzZQorCQkJc2VjcyA9 IDA7CisJfQorfQorCitzdGF0aWMgdm9pZAord2xpbml0KEV0aGVyICplZGV2LCBDdGxyICpjdGxy KQoreworCXVjaGFyIGVhW0VhZGRybGVuXTsKKwl1Y2hhciBldmVudG1hc2tbMTZdOworCWNoYXIg dmVyc2lvblsxMjhdOworCWNoYXIgKnA7CisJc3RhdGljIHVjaGFyIGtlZXBhbGl2ZVsxMl0gPSB7 MSwgMCwgMTEsIDAsIDB4ZDgsIDB4ZDYsIDAsIDAsIDAsIDAsIDAsIDB9OworCisJd2xnZXR2YXIo Y3RsciwgImN1cl9ldGhlcmFkZHIiLCBlYSwgRWFkZHJsZW4pOworCW1lbW1vdmUoZWRldi0+ZWEs IGVhLCBFYWRkcmxlbik7CisJbWVtbW92ZShlZGV2LT5hZGRyLCBlYSwgRWFkZHJsZW4pOworCXBy aW50KCJldGhlcjQzMzA6IGFkZHIgJUVcbiIsIGVkZXYtPmVhKTsKKwl3bHNldGludChjdGxyLCAi YXNzb2NfbGlzdGVuIiwgMTApOworCWlmKGN0bHItPmNoaXBpZCA9PSA0MzQzMCB8fCBjdGxyLT5j aGlwaWQgPT0gMHg0MzQ1KQorCQl3bGNtZGludChjdGxyLCAweDU2LCAwKTsJLyogcG93ZXJzYXZl IG9mZiAqLworCWVsc2UKKwkJd2xjbWRpbnQoY3RsciwgMHg1NiwgMik7CS8qIHBvd2Vyc2F2ZSBG QVNUICovCisJd2xzZXRpbnQoY3RsciwgImJ1czp0eGdsb20iLCAwKTsKKwl3bHNldGludChjdGxy LCAiYmNuX3RpbWVvdXQiLCAxMCk7CisJd2xzZXRpbnQoY3RsciwgImFzc29jX3JldHJ5X21heCIs IDMpOworCWlmKGN0bHItPmNoaXBpZCA9PSAweDQzMzApeworCQl3bHNldGludChjdGxyLCAiYnRj X3dpcmUiLCA0KTsKKwkJd2xzZXRpbnQoY3RsciwgImJ0Y19tb2RlIiwgMSk7CisJCXdsc2V0dmFy KGN0bHIsICJta2VlcF9hbGl2ZSIsIGtlZXBhbGl2ZSwgMTEpOworCX0KKwltZW1zZXQoZXZlbnRt YXNrLCAweEZGLCBzaXplb2YgZXZlbnRtYXNrKTsKKyNkZWZpbmUgRU5BQkxFKG4pCWV2ZW50bWFz a1tuLzhdIHw9IDE8PChuJTgpCisjZGVmaW5lIERJU0FCTEUobikJZXZlbnRtYXNrW24vOF0gJj0g figxPDwobiU4KSkKKwlESVNBQkxFKDQwKTsJLyogRV9SQURJTyAqLworCURJU0FCTEUoNDQpOwkv KiBFX1BST0JSRVFfTVNHICovCisJRElTQUJMRSg1NCk7CS8qIEVfSUYgKi8KKwlESVNBQkxFKDcx KTsJLyogRV9QUk9CUkVTUF9NU0cgKi8KKwlESVNBQkxFKDIwKTsJLyogRV9UWEZBSUwgKi8KKwlE SVNBQkxFKDEyNCk7CS8qID8gKi8KKwl3bHNldHZhcihjdGxyLCAiZXZlbnRfbXNncyIsIGV2ZW50 bWFzaywgc2l6ZW9mIGV2ZW50bWFzayk7CisJd2xjbWRpbnQoY3RsciwgMHhiOSwgMHgyOCk7CS8q IFNFVF9TQ0FOX0NIQU5ORUxfVElNRSAqLworCXdsY21kaW50KGN0bHIsIDB4YmIsIDB4MjgpOwkv KiBTRVRfU0NBTl9VTkFTU09DX1RJTUUgKi8KKwl3bGNtZGludChjdGxyLCAweDEwMiwgMHg4Mik7 CS8qIFNFVF9TQ0FOX1BBU1NJVkVfVElNRSAqLworCXdsY21kaW50KGN0bHIsIDIsIDApOwkJLyog VVAgKi8KKwltZW1zZXQodmVyc2lvbiwgMCwgc2l6ZW9mIHZlcnNpb24pOworCXdsZ2V0dmFyKGN0 bHIsICJ2ZXIiLCB2ZXJzaW9uLCBzaXplb2YgdmVyc2lvbiAtIDEpOworCWlmKChwID0gc3RyY2hy KHZlcnNpb24sICdcbicpKSAhPSBuaWwpCisJCSpwID0gJ1wwJzsKKwlpZigwKSBwcmludCgiZXRo ZXI0MzMwOiAlc1xuIiwgdmVyc2lvbik7CisJd2xzZXRpbnQoY3RsciwgInJvYW1fb2ZmIiwgMSk7 CisJd2xjbWRpbnQoY3RsciwgMHgxNCwgMSk7CS8qIFNFVF9JTkZSQSAxICovCisJd2xjbWRpbnQo Y3RsciwgMTAsIDApOwkJLyogU0VUX1BST01JU0MgKi8KKwkvL3dsY21kaW50KGN0bHIsIDB4OGUs IDApOwkvKiBTRVRfQkFORCAwICovCisJLy93bHNldGludChjdGxyLCAid3NlYyIsIDEpOworCXds Y21kaW50KGN0bHIsIDIsIDEpOwkJLyogVVAgKi8KKwljdGxyLT5rZXlzWzBdLmxlbiA9IFdNaW5L ZXlMZW47CisJLy93bHdlcGtleShjdGxyLCAwKTsKK30KKworLyoKKyAqIFBsYW4gOSBkcml2ZXIg aW50ZXJmYWNlCisgKi8KKworc3RhdGljIGxvbmcKK2V0aGVyYmNtaWZzdGF0KEV0aGVyKiBlZGV2 LCB2b2lkKiBhLCBsb25nIG4sIHVsb25nIG9mZnNldCkKK3sKKwlDdGxyICpjdGxyOworCWNoYXIg KnA7CisJaW50IGw7CisJc3RhdGljIGNoYXIgKmNyeXB0b25hbWVbNF0gPSB7CisJCVswXQkib2Zm IiwKKwkJW1dlcF0JIndlcCIsCisJCVtXcGFdCSJ3cGEiLAorCQlbV3BhMl0JIndwYTIiLAorCX07 CisJLyogdGhlc2Ugc3RyaW5ncyBhcmUga25vd24gYnkgYXV4L3dwYSAqLworCXN0YXRpYyBjaGFy KiBjb25uZWN0c3RhdGVbXSA9IHsKKwkJW0Rpc2Nvbm5lY3RlZF0JPSAidW5hc3NvY2lhdGVkIiwK KwkJW0Nvbm5lY3RpbmddID0gImNvbm5lY3RpbmciLAorCQlbQ29ubmVjdGVkXSA9ICJhc3NvY2lh dGVkIiwKKwl9OworCisJY3RsciA9IGVkZXYtPmN0bHI7CisJaWYoY3RsciA9PSBuaWwpCisJCXJl dHVybiAwOworCXAgPSBtYWxsb2MoUkVBRFNUUik7CisJbCA9IDA7CisKKwlsICs9IHNucHJpbnQo cCtsLCBSRUFEU1RSLWwsICJjaGFubmVsOiAlZFxuIiwgY3Rsci0+Y2hhbmlkKTsKKwlsICs9IHNu cHJpbnQocCtsLCBSRUFEU1RSLWwsICJlc3NpZDogJXNcbiIsIGN0bHItPmVzc2lkKTsKKwlsICs9 IHNucHJpbnQocCtsLCBSRUFEU1RSLWwsICJjcnlwdDogJXNcbiIsIGNyeXB0b25hbWVbY3Rsci0+ Y3J5cHRvdHlwZV0pOworCWwgKz0gc25wcmludChwK2wsIFJFQURTVFItbCwgIm9xOiAlZFxuIiwg cWxlbihlZGV2LT5vcSkpOworCWwgKz0gc25wcmludChwK2wsIFJFQURTVFItbCwgInR4d2luOiAl ZFxuIiwgY3Rsci0+dHh3aW5kb3cpOworCWwgKz0gc25wcmludChwK2wsIFJFQURTVFItbCwgInR4 c2VxOiAlZFxuIiwgY3Rsci0+dHhzZXEpOworCWwgKz0gc25wcmludChwK2wsIFJFQURTVFItbCwg InN0YXR1czogJXNcbiIsIGNvbm5lY3RzdGF0ZVtjdGxyLT5zdGF0dXNdKTsKKwlVU0VEKGwpOwor CW4gPSByZWFkc3RyKG9mZnNldCwgYSwgbiwgcCk7CisJZnJlZShwKTsKKwlyZXR1cm4gbjsKK30K Kworc3RhdGljIHZvaWQKK2V0aGVyYmNtdHJhbnNtaXQoRXRoZXIgKmVkZXYpCit7CisJQ3RsciAq Y3RscjsKKworCWN0bHIgPSBlZGV2LT5jdGxyOworCWlmKGN0bHIgPT0gbmlsKQorCQlyZXR1cm47 CisJdHhzdGFydChlZGV2KTsKK30KKworc3RhdGljIGludAorcGFyc2VoZXgoY2hhciAqYnVmLCBp bnQgYnVmbGVuLCBjaGFyICphKQoreworCWludCBpLCBrLCBuOworCisJayA9IDA7CisJZm9yKGkg PSAwO2sgPCBidWZsZW4gJiYgKmE7IGkrKyl7CisJCWlmKCphID49ICcwJyAmJiAqYSA8PSAnOScp CisJCQluID0gKmErKyAtICcwJzsKKwkJZWxzZSBpZigqYSA+PSAnYScgJiYgKmEgPD0gJ2YnKQor CQkJbiA9ICphKysgLSAnYScgKyAxMDsKKwkJZWxzZSBpZigqYSA+PSAnQScgJiYgKmEgPD0gJ0Yn KQorCQkJbiA9ICphKysgLSAnQScgKyAxMDsKKwkJZWxzZQorCQkJYnJlYWs7CisKKwkJaWYoaSAm IDEpeworCQkJYnVmW2tdIHw9IG47CisJCQlrKys7CisJCX0KKwkJZWxzZQorCQkJYnVmW2tdID0g bjw8NDsKKwl9CisJaWYoaSAmIDEpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gazsKK30KKworc3Rh dGljIGludAord2VwcGFyc2VrZXkoV0tleSoga2V5LCBjaGFyKiBhKSAKK3sKKwlpbnQgaSwgaywg bGVuLCBuOworCWNoYXIgYnVmW1dNYXhLZXlMZW5dOworCisJbGVuID0gc3RybGVuKGEpOworCWlm KGxlbiA9PSBXTWluS2V5TGVuIHx8IGxlbiA9PSBXTWF4S2V5TGVuKXsKKwkJbWVtc2V0KGtleS0+ ZGF0LCAwLCBzaXplb2Yoa2V5LT5kYXQpKTsKKwkJbWVtbW92ZShrZXktPmRhdCwgYSwgbGVuKTsK KwkJa2V5LT5sZW4gPSBsZW47CisKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgaWYobGVuID09IFdN aW5LZXlMZW4qMiB8fCBsZW4gPT0gV01heEtleUxlbioyKXsKKwkJayA9IDA7CisJCWZvcihpID0g MDsgaSA8IGxlbjsgaSsrKXsKKwkJCWlmKCphID49ICcwJyAmJiAqYSA8PSAnOScpCisJCQkJbiA9 ICphKysgLSAnMCc7CisJCQllbHNlIGlmKCphID49ICdhJyAmJiAqYSA8PSAnZicpCisJCQkJbiA9 ICphKysgLSAnYScgKyAxMDsKKwkJCWVsc2UgaWYoKmEgPj0gJ0EnICYmICphIDw9ICdGJykKKwkJ CQluID0gKmErKyAtICdBJyArIDEwOworCQkJZWxzZQorCQkJCXJldHVybiAtMTsKKwkKKwkJCWlm KGkgJiAxKXsKKwkJCQlidWZba10gfD0gbjsKKwkJCQlrKys7CisJCQl9CisJCQllbHNlCisJCQkJ YnVmW2tdID0gbjw8NDsKKwkJfQorCisJCW1lbXNldChrZXktPmRhdCwgMCwgc2l6ZW9mKGtleS0+ ZGF0KSk7CisJCW1lbW1vdmUoa2V5LT5kYXQsIGJ1Ziwgayk7CisJCWtleS0+bGVuID0gazsKKwor CQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK3dwYXBhcnNl a2V5KFdLZXkgKmtleSwgdXZsb25nICppdnAsIGNoYXIgKmEpCit7CisJaW50IGxlbjsKKwljaGFy ICplOworCisJaWYoY2lzdHJuY21wKGEsICJ0a2lwOiIsIDUpID09IDAgfHwgY2lzdHJuY21wKGEs ICJjY21wOiIsIDUpID09IDApCisJCWEgKz0gNTsKKwllbHNlCisJCXJldHVybiAxOworCWxlbiA9 IHBhcnNlaGV4KGtleS0+ZGF0LCBzaXplb2Yoa2V5LT5kYXQpLCBhKTsKKwlpZihsZW4gPD0gMCkK KwkJcmV0dXJuIDE7CisJa2V5LT5sZW4gPSBsZW47CisJYSArPSAyKmxlbjsKKwlpZigqYSsrICE9 ICdAJykKKwkJcmV0dXJuIDE7CisJKml2cCA9IHN0cnRvdWxsKGEsICZlLCAxNik7CisJaWYoZSA9 PSBhKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRhdXRo KEN0bHIgKmN0bHIsIENtZGJ1ZiAqY2IsIGNoYXIgKmEpCit7CisJdWNoYXIgd3BhaWVbMzJdOwor CWludCBpOworCisJaSA9IHBhcnNlaGV4KChjaGFyKil3cGFpZSwgc2l6ZW9mIHdwYWllLCBhKTsK KwlpZihpIDwgMiB8fCBpICE9IHdwYWllWzFdICsgMikKKwkJY21kZXJyb3IoY2IsICJiYWQgd3Bh IGllIHN5bnRheCIpOworCWlmKHdwYWllWzBdID09IDB4ZGQpCisJCWN0bHItPmNyeXB0b3R5cGUg PSBXcGE7CisJZWxzZSBpZih3cGFpZVswXSA9PSAweDMwKQorCQljdGxyLT5jcnlwdG90eXBlID0g V3BhMjsKKwllbHNlCisJCWNtZGVycm9yKGNiLCAiYmFkIHdwYSBpZSIpOworCXdsc2V0dmFyKGN0 bHIsICJ3cGFpZSIsIHdwYWllLCBpKTsKKwlpZihjdGxyLT5jcnlwdG90eXBlID09IFdwYSl7CisJ CXdsc2V0aW50KGN0bHIsICJ3cGFfYXV0aCIsIDR8Mik7CS8qIGF1dGhfcHNrIHwgYXV0aF91bnNw ZWNpZmllZCAqLworCQl3bHNldGludChjdGxyLCAiYXV0aCIsIDApOworCQl3bHNldGludChjdGxy LCAid3NlYyIsIDIpOwkJLyogdGtpcCAqLworCQl3bHNldGludChjdGxyLCAid3BhX2F1dGgiLCA0 KTsJCS8qIGF1dGhfcHNrICovCisJfWVsc2V7CisJCXdsc2V0aW50KGN0bHIsICJ3cGFfYXV0aCIs IDB4ODB8MHg0MCk7CS8qIGF1dGhfcHNrIHwgYXV0aF91bnNwZWNpZmllZCAqLworCQl3bHNldGlu dChjdGxyLCAiYXV0aCIsIDApOworCQl3bHNldGludChjdGxyLCAid3NlYyIsIDQpOwkJLyogYWVz ICovCisJCXdsc2V0aW50KGN0bHIsICJ3cGFfYXV0aCIsIDB4ODApOwkvKiBhdXRoX3BzayAqLwor CX0KK30KKworc3RhdGljIGludAorc2V0Y3J5cHQoQ3RsciAqY3RsciwgQ21kYnVmKiwgY2hhciAq YSkKK3sKKwlpZihjaXN0cmNtcChhLCAid2VwIikgPT0gMCB8fCBjaXN0cmNtcChhLCAib24iKSA9 PSAwKQorCQljdGxyLT5jcnlwdG90eXBlID0gV2VwOworCWVsc2UgaWYoY2lzdHJjbXAoYSwgIm9m ZiIpID09IDAgfHwgY2lzdHJjbXAoYSwgIm5vbmUiKSA9PSAwKQorCQljdGxyLT5jcnlwdG90eXBl ID0gMDsKKwllbHNlCisJCXJldHVybiAwOworCXdsc2V0aW50KGN0bHIsICJhdXRoIiwgY3Rsci0+ Y3J5cHRvdHlwZSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBsb25nCitldGhlcmJjbWN0bChF dGhlciogZWRldiwgdm9pZCogYnVmLCBsb25nIG4pCit7CisJQ3RsciAqY3RscjsKKwlDbWRidWYg KmNiOworCUNtZHRhYiAqY3Q7CisJdWNoYXIgZWFbRWFkZHJsZW5dOworCXV2bG9uZyBpdjsKKwlp bnQgaTsKKworCWlmKChjdGxyID0gZWRldi0+Y3RscikgPT0gbmlsKQorCQllcnJvcihFbm9uZXhp c3QpOworCVVTRUQoY3Rscik7CisKKwljYiA9IHBhcnNlY21kKGJ1Ziwgbik7CisJaWYod2FzZXJy b3IoKSl7CisJCWZyZWUoY2IpOworCQluZXh0ZXJyb3IoKTsKKwl9CisJY3QgPSBsb29rdXBjbWQo Y2IsIGNtZHMsIG5lbGVtKGNtZHMpKTsKKwlzd2l0Y2goY3QtPmluZGV4KXsKKwljYXNlIENNYXV0 aDoKKwkJc2V0YXV0aChjdGxyLCBjYiwgY2ItPmZbMV0pOworCQlpZihjdGxyLT5lc3NpZFswXSkK KwkJCXdsam9pbihjdGxyLCBjdGxyLT5lc3NpZCwgY3Rsci0+Y2hhbmlkKTsKKwkJYnJlYWs7CisJ Y2FzZSBDTWNoYW5uZWw6CisJCWlmKChpID0gYXRvaShjYi0+ZlsxXSkpIDwgMCB8fCBpID4gMTYp CisJCQljbWRlcnJvcihjYiwgImJhZCBjaGFubmVsIG51bWJlciIpOworCQkvL3dsY21kaW50KGN0 bHIsIDMwLCBpKTsJLyogU0VUX0NIQU5ORUwgKi8KKwkJY3Rsci0+Y2hhbmlkID0gaTsKKwkJYnJl YWs7CisJY2FzZSBDTWNyeXB0OgorCQlpZihzZXRjcnlwdChjdGxyLCBjYiwgY2ItPmZbMV0pKXsK KwkJCWlmKGN0bHItPmVzc2lkWzBdKQorCQkJCXdsam9pbihjdGxyLCBjdGxyLT5lc3NpZCwgY3Rs ci0+Y2hhbmlkKTsKKwkJfWVsc2UKKwkJCWNtZGVycm9yKGNiLCAiYmFkIGNyeXB0IHR5cGUiKTsK KwkJYnJlYWs7CisJY2FzZSBDTWVzc2lkOgorCQlpZihjaXN0cmNtcChjYi0+ZlsxXSwgImRlZmF1 bHQiKSA9PSAwKQorCQkJbWVtc2V0KGN0bHItPmVzc2lkLCAwLCBzaXplb2YoY3Rsci0+ZXNzaWQp KTsKKwkJZWxzZXsKKwkJCXN0cm5jcHkoY3Rsci0+ZXNzaWQsIGNiLT5mWzFdLCBzaXplb2YoY3Rs ci0+ZXNzaWQpIC0gMSk7CisJCQljdGxyLT5lc3NpZFtzaXplb2YoY3Rsci0+ZXNzaWQpIC0gMV0g PSAnXDAnOworCQl9CisJCWlmKCF3YXNlcnJvcigpKXsKKwkJCXdsam9pbihjdGxyLCBjdGxyLT5l c3NpZCwgY3Rsci0+Y2hhbmlkKTsKKwkJCXBvcGVycm9yKCk7CisJCX0KKwkJYnJlYWs7CisJY2Fz ZSBDTWpvaW46CS8qIGpvaW4gZXNzaWQgY2hhbm5lbCB3ZXB8b258b2ZmfHdwYWtleSAqLworCQlp ZihzdHJjbXAoY2ItPmZbMV0sICIiKSAhPSAwKXsJLyogZW1wdHkgc3RyaW5nIGZvciBubyBjaGFu Z2UgKi8KKwkJCWlmKGNpc3RyY21wKGNiLT5mWzFdLCAiZGVmYXVsdCIpICE9IDApeworCQkJCXN0 cm5jcHkoY3Rsci0+ZXNzaWQsIGNiLT5mWzFdLCBzaXplb2YoY3Rsci0+ZXNzaWQpLTEpOworCQkJ CWN0bHItPmVzc2lkW3NpemVvZihjdGxyLT5lc3NpZCktMV0gPSAwOworCQkJfWVsc2UKKwkJCQlt ZW1zZXQoY3Rsci0+ZXNzaWQsIDAsIHNpemVvZihjdGxyLT5lc3NpZCkpOworCQl9ZWxzZSBpZihj dGxyLT5lc3NpZFswXSA9PSAwKQorCQkJY21kZXJyb3IoY2IsICJlc3NpZCBub3Qgc2V0Iik7CisJ CWlmKChpID0gYXRvaShjYi0+ZlsyXSkpID49IDAgJiYgaSA8PSAxNikKKwkJCWN0bHItPmNoYW5p ZCA9IGk7CisJCWVsc2UKKwkJCWNtZGVycm9yKGNiLCAiYmFkIGNoYW5uZWwgbnVtYmVyIik7CisJ CWlmKCFzZXRjcnlwdChjdGxyLCBjYiwgY2ItPmZbM10pKQorCQkJc2V0YXV0aChjdGxyLCBjYiwg Y2ItPmZbM10pOworCQlpZihjdGxyLT5lc3NpZFswXSkKKwkJCXdsam9pbihjdGxyLCBjdGxyLT5l c3NpZCwgY3Rsci0+Y2hhbmlkKTsKKwkJYnJlYWs7CisJY2FzZSBDTWtleTE6CisJY2FzZSBDTWtl eTI6CisJY2FzZSBDTWtleTM6CisJY2FzZSBDTWtleTQ6CisJCWkgPSBjdC0+aW5kZXggLSBDTWtl eTE7CisJCWlmKHdlcHBhcnNla2V5KCZjdGxyLT5rZXlzW2ldLCBjYi0+ZlsxXSkpCisJCQljbWRl cnJvcihjYiwgImJhZCBXRVAga2V5IHN5bnRheCIpOworCQl3bHNldGludChjdGxyLCAid3NlYyIs IDEpOwkvKiB3ZXAgZW5hYmxlZCAqLworCQl3bHdlcGtleShjdGxyLCBpKTsKKwkJYnJlYWs7CisJ Y2FzZSBDTXJ4a2V5OgorCWNhc2UgQ01yeGtleTA6CisJY2FzZSBDTXJ4a2V5MToKKwljYXNlIENN cnhrZXkyOgorCWNhc2UgQ01yeGtleTM6CisJY2FzZSBDTXR4a2V5OgorCQlpZihwYXJzZWV0aGVy KGVhLCBjYi0+ZlsxXSkgPCAwKQorCQkJY21kZXJyb3IoY2IsICJiYWQgZXRoZXIgYWRkciIpOwor CQlpZih3cGFwYXJzZWtleSgmY3Rsci0+a2V5c1swXSwgJml2LCBjYi0+ZlsyXSkpCisJCQljbWRl cnJvcihjYiwgImJhZCB3cGEga2V5Iik7CisJCXdsd3Bha2V5KGN0bHIsIGN0LT5pbmRleCwgaXYs IGVhKTsKKwkJYnJlYWs7CisJY2FzZSBDTWRlYnVnOgorCQlpb2RlYnVnID0gYXRvaShjYi0+Zlsx XSk7CisJCWJyZWFrOworCX0KKwlwb3BlcnJvcigpOworCWZyZWUoY2IpOworCXJldHVybiBuOwor fQorCitzdGF0aWMgdm9pZAorZXRoZXJiY21zY2FuKHZvaWQgKmEsIHVpbnQgc2VjcykKK3sKKwlF dGhlciogZWRldjsKKwlDdGxyKiBjdGxyOworCisJZWRldiA9IGE7CisJY3RsciA9IGVkZXYtPmN0 bHI7CisJY3Rsci0+c2NhbnNlY3MgPSBzZWNzOworfQorCitzdGF0aWMgdm9pZAorZXRoZXJiY21h dHRhY2goRXRoZXIqIGVkZXYpCit7CisJQ3RsciAqY3RscjsKKworCWN0bHIgPSBlZGV2LT5jdGxy OworCXFsb2NrKCZjdGxyLT5hbG9jayk7CisJaWYod2FzZXJyb3IoKSl7CisJCXByaW50KCJldGhl cjQzMzA6IGF0dGFjaCBmYWlsZWQ6ICVzXG4iLCB1cC0+ZXJyc3RyKTsKKwkJcXVubG9jaygmY3Rs ci0+YWxvY2spOworCQluZXh0ZXJyb3IoKTsKKwl9CisJaWYoY3Rsci0+ZWRldiA9PSBuaWwpewor CQlpZihjdGxyLT5jaGlwaWQgPT0gMCl7CisJCQlzZGlvaW5pdCgpOworCQkJc2Jpbml0KGN0bHIp OworCQl9CisJCWZ3bG9hZChjdGxyKTsKKwkJc2JlbmFibGUoY3Rscik7CisJCWtwcm9jKCJ3aWZp cmVhZGVyIiwgcnByb2MsIGVkZXYpOworCQlrcHJvYygid2lmaXRpbWVyIiwgbHByb2MsIGVkZXYp OworCQlpZihjdGxyLT5yZWd1ZmlsZSkKKwkJCXJlZ3Vsb2FkKGN0bHIsIGN0bHItPnJlZ3VmaWxl KTsKKwkJd2xpbml0KGVkZXYsIGN0bHIpOworCQljdGxyLT5lZGV2ID0gZWRldjsKKwl9CisJcXVu bG9jaygmY3Rsci0+YWxvY2spOworCXBvcGVycm9yKCk7Cit9CisKK3N0YXRpYyB2b2lkCitldGhl cmJjbXNodXRkb3duKEV0aGVyKikKK3sKKwlzZGlvcmVzZXQoKTsKK30KKworCitzdGF0aWMgaW50 CitldGhlcmJjbXBucChFdGhlciogZWRldikKK3sKKwlDdGxyICpjdGxyOworCisJc3RhdGljIGlu dCBkb25lID0gMDsKKwlpZihkb25lKQorCQlyZXR1cm4gLTE7CisJZG9uZSA9IDE7CisKKwljdGxy ID0gbWFsbG9jKHNpemVvZihDdGxyKSk7CisJY3Rsci0+Y2hhbmlkID0gV2lmaWNoYW47CisJZWRl di0+Y3RsciA9IGN0bHI7CisJZWRldi0+YXR0YWNoID0gZXRoZXJiY21hdHRhY2g7CisJZWRldi0+ dHJhbnNtaXQgPSBldGhlcmJjbXRyYW5zbWl0OworCWVkZXYtPmlmc3RhdCA9IGV0aGVyYmNtaWZz dGF0OworCWVkZXYtPmN0bCA9IGV0aGVyYmNtY3RsOworCWVkZXYtPnNjYW5icyA9IGV0aGVyYmNt c2NhbjsKKwllZGV2LT5zaHV0ZG93biA9IGV0aGVyYmNtc2h1dGRvd247CisJZWRldi0+YXJnID0g ZWRldjsKKworCXJldHVybiAwOworfQorCit2b2lkCitldGhlcjQzMzBsaW5rKHZvaWQpCit7CisJ YWRkZXRoZXJjYXJkKCI0MzMwIiwgZXRoZXJiY21wbnApOworfQpkaWZmIC1yIDQ0ZWFlOWE3ZTk4 YiBzeXMvc3JjLzkvYmNtL21rZmlsZQotLS0gYS9zeXMvc3JjLzkvYmNtL21rZmlsZQlTdW4gT2N0 IDExIDE0OjU5OjQ5IDIwMjAgKzAyMDAKKysrIGIvc3lzL3NyYy85L2JjbS9ta2ZpbGUJVHVlIE9j dCAxMyAwNTowOTo0OSAyMDIwIC0wNzAwCkBAIC0xLDUgKzEsNSBAQAogQ09ORj1waTIKLUNPTkZM SVNUPXBpIHBpMgorQ09ORkxJU1Q9cGkgcGkyIHBpMndpZmkKIENSQVBMSVNUPXBpZiBwaWNwdWYK IEVYVFJBQ09QSUVTPQogCmRpZmYgLXIgNDRlYWU5YTdlOThiIHN5cy9zcmMvOS9iY20vcGkyd2lm aQotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9zeXMv c3JjLzkvYmNtL3BpMndpZmkJVHVlIE9jdCAxMyAwNTowOTo0OSAyMDIwIC0wNzAwCkBAIC0wLDAg KzEsNjAgQEAKK2RldgorCXJvb3QKKwljb25zCisJc3dhcAorCWVudgorCXBpcGUKKwlwcm9jCisJ bW50CisJc3J2CisJc2hyCisJZHVwCisJYXJjaAorCXNzbAorCXRscworCWNhcAorCWZzCisJZXRo ZXIJbmV0aWYKKwlpcAkJYXJwIGNoYW5kaWFsIGlwIGlwdjYgaXBhdXggaXByb3V0ZSBuZXRsb2cg bnVsbG1lZGl1bSBwa3RtZWRpdW0gaW5mZXJubworCWRyYXcJc2NyZWVuIHN3Y3Vyc29yCisJbW91 c2UJbW91c2UKKwl1YXJ0CWdwaW8KKwlncGlvCWdwaW8KKwlzZAorCXVzYgorCitsaW5rCisJbG9v cGJhY2ttZWRpdW0KKwlldGhlcm1lZGl1bQorCWFyY2hiY20yCisJdXNiZHdjCisJc2Rob3N0CisJ ZXRoZXI0MzMwCWVtbWMKKworaXAKKwl0Y3AKKwl1ZHAKKwlpcGlmYworCWljbXAKKwlpY21wNgor CWlwbXV4CisKK21pc2MKKwlhcm12NworCXVhcnRtaW5pCisJc2RtbWMJZW1tYworCWRtYQorCXZj b3JlCisJdmZwMwljb3Byb2MKKwlpcnEKKworcG9ydAorCWludCBjcHVzZXJ2ZXIgPSAwOworCiti b290ZGlyCisJLyRvYmp0eXBlL2Jpbi9wYXFmcworCS8kb2JqdHlwZS9iaW4vYXV0aC9mYWN0b3R1 bQorCWJvb3Rmcy5wYXEKKwlib290CisJL3N5cy9saWIvZmlybXdhcmUvYnJjbWZtYWM0MzQzMC1z ZGlvLmJpbgorCS9zeXMvbGliL2Zpcm13YXJlL2JyY21mbWFjNDM0MzAtc2Rpby50eHQKZGlmZiAt ciA0NGVhZTlhN2U5OGIgc3lzL3NyYy85L2JjbS9zZGhvc3QuYwotLS0gL2Rldi9udWxsCVRodSBK YW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9zeXMvc3JjLzkvYmNtL3NkaG9zdC5jCVR1 ZSBPY3QgMTMgMDU6MDk6NDkgMjAyMCAtMDcwMApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIGJj bTI4MzUgc2Rob3N0IGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxNiBSaWNoYXJk IE1pbGxlciA8ci5taWxsZXJAYWNtLm9yZz4KKyAqLworCisjaW5jbHVkZSAidS5oIgorI2luY2x1 ZGUgIi4uL3BvcnQvbGliLmgiCisjaW5jbHVkZSAiLi4vcG9ydC9lcnJvci5oIgorI2luY2x1ZGUg Im1lbS5oIgorI2luY2x1ZGUgImRhdC5oIgorI2luY2x1ZGUgImZucy5oIgorI2luY2x1ZGUgImlv LmgiCisjaW5jbHVkZSAiLi4vcG9ydC9zZC5oIgorCitleHRlcm4gU0RpbyAqc2RjYXJkbGluazsK KworI2RlZmluZSBTREhPU1RSRUdTCShWSVJUSU8rMHgyMDIwMDApCisKKyNkZWZpbmUgRklFTEQo diwgbywgdykJKCgodikgJiAoKDE8PCh3KSktMSkpPDwobykpCisjZGVmaW5lIEZDTFIoZCwgbywg dykJKChkKSAmIH4oKCgxPDwodykpLTEpPDwobykpKQorI2RlZmluZSBGSU5TKGQsIG8sIHcsIHYp IChGQ0xSKChkKSwgKG8pLCAodykpfEZJRUxEKCh2KSwgKG8pLCAodykpKQorCitlbnVtIHsKKwlF eHRmcmVxCQk9IDI1MCpNaHosCS8qIGd1ZXNzIGV4dGVybmFsIGNsb2NrIGZyZXF1ZW5jeSBpZiB2 Y29yZSBkb2Vzbid0IHNheSAqLworCUluaXRmcmVxCT0gNDAwMDAwLAkvKiBpbml0aWFsaXNhdGlv biBmcmVxdWVuY3kgZm9yIE1NQyAqLworCVNEZnJlcQkJPSAyNSpNaHosCS8qIHN0YW5kYXJkIFNE IGZyZXF1ZW5jeSAqLworCVNEZnJlcWhzCT0gNTAqTWh6LAkvKiBTRCBoaWdoIHNwZWVkIGZyZXF1 ZW5jeSAqLworCUZpZm9EZXB0aAk9IDQsCQkvKiAiTGltaXQgZmlmbyB1c2FnZSBkdWUgdG8gc2ls aWNvbiBidWciIChsaW51eCBkcml2ZXIpICovCisKKwlHb0lkbGUJCT0gMCwJCS8qIG1tYy9zZGlv IGdvIGlkbGUgc3RhdGUgKi8KKwlNTUNTZWxlY3QJPSA3LAkJLyogbW1jL3NkIGNhcmQgc2VsZWN0 IGNvbW1hbmQgKi8KKwlTZXRidXN3aWR0aAk9IDYsCQkvKiBtbWMvc2Qgc2V0IGJ1cyB3aWR0aCBj b21tYW5kICovCisJU3dpdGNoZnVuYwk9IDYsCQkvKiBtbWMvc2Qgc3dpdGNoIGZ1bmN0aW9uIGNv bW1hbmQgKi8KKwlTdG9wdHJhbnNtaXNzaW9uID0gMTIsCS8qIG1tYy9zZCBzdG9wIHRyYW5zbWlz c2lvbiBjb21tYW5kICovCisJQXBwY21kID0gNTUsCQkJLyogbW1jL3NkIGFwcGxpY2F0aW9uIGNv bW1hbmQgcHJlZml4ICovCit9OworCitlbnVtIHsKKwkvKiBDb250cm9sbGVyIHJlZ2lzdGVycyAq LworCUNtZAkJPSAweDAwPj4yLAorCUFyZwkJPSAweDA0Pj4yLAorCVRpbWVvdXQJCT0gMHgwOD4+ MiwKKwlDbGtkaXYJCT0gMHgwYz4+MiwKKworCVJlc3AwCQk9IDB4MTA+PjIsCisJUmVzcDEJCT0g MHgxND4+MiwKKwlSZXNwMgkJPSAweDE4Pj4yLAorCVJlc3AzCQk9IDB4MWM+PjIsCisKKwlTdGF0 dXMJCT0gMHgyMD4+MiwKKwlQb3dlcm9uCQk9IDB4MzA+PjIsCisJRGJnbW9kZQkJPSAweDM0Pj4y LAorCUhjb25maWcJCT0gMHgzOD4+MiwKKwlCbGtzaXplCQk9IDB4M2M+PjIsCisJRGF0YQkJPSAw eDQwPj4yLAorCUJsa2NvdW50CT0gMHg1MD4+MiwKKworCS8qIENtZCAqLworCVN0YXJ0CQk9IDE8 PDE1LAorCUZhaWxlZAkJPSAxPDwxNCwKKwlSZXNwbWFzawk9IDc8PDksCisJUmVzcDQ4YnVzeQk9 IDQ8PDksCisJUmVzcG5vbmUJPSAyPDw5LAorCVJlc3AxMzYJCT0gMTw8OSwKKwlSZXNwNDgJCT0g MDw8OSwKKwlIb3N0MmNhcmQJPSAxPDw3LAorCUNhcmQyaG9zdAk9IDE8PDYsCisKKwkvKiBTdGF0 dXMgKi8KKwlCdXN5aW50CQk9IDE8PDEwLAorCUJsa2ludAkJPSAxPDw5LAorCVNkaW9pbnQJCT0g MTw8OCwKKwlSZXd0aW1lb3V0CT0gMTw8NywKKwlDbWR0aW1lb3V0CT0gMTw8NiwKKwlDcmNlcnJv cgk9IDM8PDQsCisJRmlmb2Vycm9yCT0gMTw8MywKKwlEYXRhZmxhZwk9IDE8PDAsCisJSW50c3Rh dHVzCT0gKEJ1c3lpbnR8QmxraW50fFNkaW9pbnR8RGF0YWZsYWcpLAorCUVycnN0YXR1cwk9IChS ZXd0aW1lb3V0fENtZHRpbWVvdXR8Q3JjZXJyb3J8Rmlmb2Vycm9yKSwKKworCS8qIEhjb25maWcg Ki8KKwlCdXN5aW50RW4JPSAxPDwxMCwKKwlCbGtpbnRFbgk9IDE8PDgsCisJU2Rpb2ludEVuCT0g MTw8NSwKKwlEYXRhaW50RW4JPSAxPDw0LAorCVNsb3djYXJkCT0gMTw8MywKKwlFeHRidXM0CQk9 IDE8PDIsCisJSW50YnVzd2lkZQk9IDE8PDEsCisJQ21kcmVsZWFzZQk9IDE8PDAsCit9OworCitz dGF0aWMgaW50IGNtZGluZm9bNjRdID0geworWzBdICBTdGFydCB8IFJlc3Bub25lLAorWzJdICBT dGFydCB8IFJlc3AxMzYsCitbM10gIFN0YXJ0IHwgUmVzcDQ4LAorWzVdICBTdGFydCB8IFJlc3A0 OCwKK1s2XSAgU3RhcnQgfCBSZXNwNDgsCitbNjNdICBTdGFydCB8IFJlc3A0OCB8IENhcmQyaG9z dCwKK1s3XSAgU3RhcnQgfCBSZXNwNDhidXN5LAorWzhdICBTdGFydCB8IFJlc3A0OCwKK1s5XSAg U3RhcnQgfCBSZXNwMTM2LAorWzExXSBTdGFydCB8IFJlc3A0OCwKK1sxMl0gU3RhcnQgfCBSZXNw NDhidXN5LAorWzEzXSBTdGFydCB8IFJlc3A0OCwKK1sxNl0gU3RhcnQgfCBSZXNwNDgsCitbMTdd IFN0YXJ0IHwgUmVzcDQ4IHwgQ2FyZDJob3N0LAorWzE4XSBTdGFydCB8IFJlc3A0OCB8IENhcmQy aG9zdCwKK1syNF0gU3RhcnQgfCBSZXNwNDggfCBIb3N0MmNhcmQsCitbMjVdIFN0YXJ0IHwgUmVz cDQ4IHwgSG9zdDJjYXJkLAorWzQxXSBTdGFydCB8IFJlc3A0OCwKK1s1Ml0gU3RhcnQgfCBSZXNw NDgsCitbNTNdIFN0YXJ0IHwgUmVzcDQ4LAorWzU1XSBTdGFydCB8IFJlc3A0OCwKK307CisKK3R5 cGVkZWYgc3RydWN0IEN0bHIgQ3RscjsKKworc3RydWN0IEN0bHIgeworCVJlbmRleglyOworCWlu dAliY291bnQ7CisJaW50CWRvbmU7CisJdWxvbmcJZXh0Y2xrOworCWludAlhcHBjbWQ7Cit9Owor CitzdGF0aWMgQ3RsciBzZGhvc3Q7CisKK3N0YXRpYyB2b2lkIHNkaG9zdGludGVycnVwdChVcmVn Kiwgdm9pZCopOworCitzdGF0aWMgdm9pZAorV1IoaW50IHJlZywgdTMyaW50IHZhbCkKK3sKKwl1 MzJpbnQgKnIgPSAodTMyaW50KilTREhPU1RSRUdTOworCisJaWYoMClwcmludCgiV1IgJTIuMnV4 ICV1eFxuIiwgcmVnPDwyLCB2YWwpOworCXJbcmVnXSA9IHZhbDsKK30KKworc3RhdGljIGludAor ZGF0YWRvbmUodm9pZCopCit7CisJcmV0dXJuIHNkaG9zdC5kb25lOworfQorCitzdGF0aWMgdm9p ZAorc2Rob3N0Y2xvY2sodWludCBmcmVxKQoreworCXVpbnQgZGl2OworCisJZGl2ID0gc2Rob3N0 LmV4dGNsayAvIGZyZXE7CisJaWYoc2Rob3N0LmV4dGNsayAvIGZyZXEgPiBmcmVxKQorCQlkaXYr KzsKKwlpZihkaXYgPCAyKQorCQlkaXYgPSAyOworCVdSKENsa2RpdiwgZGl2IC0gMik7Cit9CisK K3N0YXRpYyBpbnQKK3NkaG9zdGluaXQodm9pZCkKK3sKKwl1MzJpbnQgKnI7CisJdWxvbmcgY2xr OworCWludCBpOworCisJLyogZGlzY29ubmVjdCBlbW1jIGFuZCBjb25uZWN0IHNkaG9zdCB0byBT RCBjYXJkIGdwaW8gcGlucyAqLworCWZvcihpID0gNDg7IGkgPD0gNTM7IGkrKykKKwkJZ3Bpb3Nl bChpLCBBbHQwKTsKKwljbGsgPSBnZXRjbGtyYXRlKENsa0NvcmUpOworCWlmKGNsayA9PSAwKXsK KwkJY2xrID0gRXh0ZnJlcTsKKwkJcHJpbnQoInNkaG9zdDogYXNzdW1pbmcgZXh0ZXJuYWwgY2xv Y2sgJWx1ZCBNaHpcbiIsIGNsay8xMDAwMDAwKTsKKwl9CisJc2Rob3N0LmV4dGNsayA9IGNsazsK KwlzZGhvc3RjbG9jayhJbml0ZnJlcSk7CisJciA9ICh1MzJpbnQqKVNESE9TVFJFR1M7CisJV1Io UG93ZXJvbiwgMCk7CisJV1IoVGltZW91dCwgMHhGMDAwMDApOworCVdSKERiZ21vZGUsIEZJTlMo cltEYmdtb2RlXSwgOSwgMTAsIChGaWZvRGVwdGggfCBGaWZvRGVwdGg8PDUpKSk7CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQKK3NkaG9zdGlucXVpcnkoY2hhciAqaW5xdWlyeSwgaW50IGlu cWxlbikKK3sKKwlyZXR1cm4gc25wcmludChpbnF1aXJ5LCBpbnFsZW4sICJCQ00gU0RIb3N0IENv bnRyb2xsZXIiKTsKK30KKworc3RhdGljIHZvaWQKK3NkaG9zdGVuYWJsZSh2b2lkKQoreworCXUz MmludCAqcjsKKworCXIgPSAodTMyaW50KilTREhPU1RSRUdTOworCVVTRUQocik7CisJV1IoUG93 ZXJvbiwgMSk7CisJZGVsYXkoMTApOworCVdSKEhjb25maWcsIEludGJ1c3dpZGUgfCBTbG93Y2Fy ZCB8IEJ1c3lpbnRFbik7CisJV1IoQ2xrZGl2LCAweDdGRik7CisJaW50cmVuYWJsZShJUlFzZGhv c3QsIHNkaG9zdGludGVycnVwdCwgbmlsLCAwLCAic2Rob3N0Iik7Cit9CisKK3N0YXRpYyBpbnQK K3NkaG9zdGNtZCh1MzJpbnQgY21kLCB1MzJpbnQgYXJnLCB1MzJpbnQgKnJlc3ApCit7CisJdTMy aW50ICpyOworCXUzMmludCBjOworCWludCBpOworCXVsb25nIG5vdzsKKworCXIgPSAodTMyaW50 KilTREhPU1RSRUdTOworCWFzc2VydChjbWQgPCBuZWxlbShjbWRpbmZvKSAmJiBjbWRpbmZvW2Nt ZF0gIT0gMCk7CisJYyA9IGNtZCB8IGNtZGluZm9bY21kXTsKKwkvKgorCSAqIENNRDYgbWF5IGJl IFNldGJ1c3dpZHRoIG9yIFN3aXRjaGZ1bmMgZGVwZW5kaW5nIG9uIEFwcGNtZCBwcmVmaXgKKwkg Ki8KKwlpZihjbWQgPT0gU3dpdGNoZnVuYyAmJiAhc2Rob3N0LmFwcGNtZCkKKwkJYyB8PSBDYXJk Mmhvc3Q7CisJaWYoY21kICE9IFN0b3B0cmFuc21pc3Npb24gJiYgKGkgPSAocltEYmdtb2RlXSAm IDB4RikpID4gMil7CisJCXByaW50KCJzZGhvc3Q6IHByZXZpb3VzIGNvbW1hbmQgc3R1Y2s6IERi Zz0lZCBDbWQ9JXV4XG4iLCBpLCByW0NtZF0pOworCQllcnJvcihFaW8pOworCX0KKwkvKgorCSAq IEdvSWRsZSBpbmRpY2F0ZXMgbmV3IGNhcmQgaW5zZXJ0aW9uOiByZXNldCBidXMgd2lkdGggJiBz cGVlZAorCSAqLworCWlmKGNtZCA9PSBHb0lkbGUpeworCQlXUihIY29uZmlnLCByW0hjb25maWdd ICYgfkV4dGJ1czQpOworCQlzZGhvc3RjbG9jayhJbml0ZnJlcSk7CisJfQorCisJaWYocltTdGF0 dXNdICYgKEVycnN0YXR1c3xEYXRhZmxhZykpCisJCVdSKFN0YXR1cywgRXJyc3RhdHVzfERhdGFm bGFnKTsKKwlzZGhvc3QuZG9uZSA9IDA7CisJV1IoQXJnLCBhcmcpOworCVdSKENtZCwgYyk7CisJ bm93ID0gbS0+dGlja3M7CisJd2hpbGUoKChpPXJbQ21kXSkmKFN0YXJ0fEZhaWxlZCkpID09IFN0 YXJ0KQorCQlpZihtLT50aWNrcy1ub3cgPiBIWikKKwkJCWJyZWFrOworCWlmKChpJihTdGFydHxG YWlsZWQpKSAhPSAwKXsKKwkJaWYocltTdGF0dXNdICE9IENtZHRpbWVvdXQpCisJCQlwcmludCgi c2Rob3N0OiBjbWQgJXV4IGFyZyAldXggZXJyb3Igc3RhdCAldXhcbiIsIGksIGFyZywgcltTdGF0 dXNdKTsKKwkJaSA9IHJbU3RhdHVzXTsKKwkJV1IoU3RhdHVzLCBpKTsKKwkJZXJyb3IoRWlvKTsK Kwl9CisJc3dpdGNoKGMgJiBSZXNwbWFzayl7CisJY2FzZSBSZXNwMTM2OgorCQlyZXNwWzBdID0g cltSZXNwMF07CisJCXJlc3BbMV0gPSByW1Jlc3AxXTsKKwkJcmVzcFsyXSA9IHJbUmVzcDJdOwor CQlyZXNwWzNdID0gcltSZXNwM107CisJCWJyZWFrOworCWNhc2UgUmVzcDQ4OgorCWNhc2UgUmVz cDQ4YnVzeToKKwkJcmVzcFswXSA9IHJbUmVzcDBdOworCQlicmVhazsKKwljYXNlIFJlc3Bub25l OgorCQlyZXNwWzBdID0gMDsKKwkJYnJlYWs7CisJfQorCWlmKChjICYgUmVzcG1hc2spID09IFJl c3A0OGJ1c3kpeworCQl0c2xlZXAoJnNkaG9zdC5yLCBkYXRhZG9uZSwgMCwgMzAwMCk7CisJfQor CXN3aXRjaChjbWQpIHsKKwljYXNlIE1NQ1NlbGVjdDoKKwkJLyoKKwkJICogT25jZSBjYXJkIGlz IHNlbGVjdGVkLCB1c2UgZmFzdGVyIGNsb2NrCisJCSAqLworCQlkZWxheSgxKTsKKwkJc2Rob3N0 Y2xvY2soU0RmcmVxKTsKKwkJZGVsYXkoMSk7CisJCWJyZWFrOworCWNhc2UgU2V0YnVzd2lkdGg6 CisJCWlmKHNkaG9zdC5hcHBjbWQpeworCQkJLyoKKwkJCSAqIElmIGNhcmQgYnVzIHdpZHRoIGNo YW5nZXMsIGNoYW5nZSBob3N0IGJ1cyB3aWR0aAorCQkJICovCisJCQlzd2l0Y2goYXJnKXsKKwkJ CWNhc2UgMDoKKwkJCQlXUihIY29uZmlnLCByW0hjb25maWddICYgfkV4dGJ1czQpOworCQkJCWJy ZWFrOworCQkJY2FzZSAyOgorCQkJCVdSKEhjb25maWcsIHJbSGNvbmZpZ10gfCBFeHRidXM0KTsK KwkJCQlicmVhazsKKwkJCX0KKwkJfWVsc2V7CisJCQkvKgorCQkJICogSWYgY2FyZCBzd2l0Y2hl ZCBpbnRvIGhpZ2ggc3BlZWQgbW9kZSwgaW5jcmVhc2UgY2xvY2sgc3BlZWQKKwkJCSAqLworCQkJ aWYoKGFyZyYweDgwMDAwMDBGKSA9PSAweDgwMDAwMDAxKXsKKwkJCQlkZWxheSgxKTsKKwkJCQlz ZGhvc3RjbG9jayhTRGZyZXFocyk7CisJCQkJZGVsYXkoMSk7CisJCQl9CisJCX0KKwkJYnJlYWs7 CisJfQorCXNkaG9zdC5hcHBjbWQgPSAoY21kID09IEFwcGNtZCk7CisJcmV0dXJuIDA7Cit9CisK K3ZvaWQKK3NkaG9zdGlvc2V0dXAoaW50IHdyaXRlLCB2b2lkICpidWYsIGludCBic2l6ZSwgaW50 IGJjb3VudCkKK3sKKwlVU0VEKHdyaXRlKTsKKwlVU0VEKGJ1Zik7CisKKwlzZGhvc3QuYmNvdW50 ID0gYmNvdW50OworCVdSKEJsa3NpemUsIGJzaXplKTsKKwlXUihCbGtjb3VudCwgYmNvdW50KTsK K30KKworc3RhdGljIHZvaWQKK3NkaG9zdGlvKGludCB3cml0ZSwgdWNoYXIgKmJ1ZiwgaW50IGxl bikKK3sKKwl1MzJpbnQgKnI7CisJaW50IHBpb2xlbjsKKwl1MzJpbnQgdzsKKworCXIgPSAodTMy aW50KilTREhPU1RSRUdTOworCWFzc2VydCgobGVuJjMpID09IDApOworCWFzc2VydCgoKCh1aW50 cHRyKWJ1ZikmMykgPT0gMCk7CisJb2theSgxKTsKKwlpZih3YXNlcnJvcigpKXsKKwkJb2theSgw KTsKKwkJbmV4dGVycm9yKCk7CisJfQorCS8qCisJICogQWNjb3JkaW5nIHRvIGNvbW1lbnRzIGlu IHRoZSBsaW51eCBkcml2ZXIsIHRoZSBoYXJkd2FyZSAiZG9lc24ndAorCSAqIG1hbmFnZSB0aGUg RklGTyBEUkVRcyBwcm9wZXJseSBmb3IgbXVsdGktYmxvY2sgdHJhbnNmZXJzIiBvbiBpbnB1dCwK KwkgKiBzbyB0aGUgZG1hIG11c3QgYmUgc3RvcHBlZCBlYXJseSBhbmQgdGhlIGxhc3QgMyB3b3Jk cyBmZXRjaGVkIHdpdGggcGlvCisJICovCisJcGlvbGVuID0gMDsKKwlpZighd3JpdGUgJiYgc2Ro b3N0LmJjb3VudCA+IDEpeworCQlwaW9sZW4gPSAoRmlmb0RlcHRoLTEpICogc2l6ZW9mKHUzMmlu dCk7CisJCWxlbiAtPSBwaW9sZW47CisJfQorCWlmKHdyaXRlKQorCQlkbWFzdGFydChEbWFDaGFu U2Rob3N0LCBEbWFEZXZTZGhvc3QsIERtYU0yRCwKKwkJCWJ1ZiwgJnJbRGF0YV0sIGxlbik7CisJ ZWxzZQorCQlkbWFzdGFydChEbWFDaGFuU2Rob3N0LCBEbWFEZXZTZGhvc3QsIERtYUQyTSwKKwkJ CSZyW0RhdGFdLCBidWYsIGxlbik7CisJaWYoZG1hd2FpdChEbWFDaGFuU2Rob3N0KSA8IDApCisJ CWVycm9yKEVpbyk7CisJaWYoIXdyaXRlKXsKKwkJY2FjaGVkaW52c2UoYnVmLCBsZW4pOworCQli dWYgKz0gbGVuOworCQlmb3IoOyBwaW9sZW4gPiAwOyBwaW9sZW4gLT0gc2l6ZW9mKHUzMmludCkp eworCQkJaWYoKHJbRGJnbW9kZV0gJiAweDFGMDApID09IDApeworCQkJCXByaW50KCJzZGhvc3Q6 IEZJRk8gZW1wdHkgYWZ0ZXIgc2hvcnQgZG1hIHJlYWRcbiIpOworCQkJCWVycm9yKEVpbyk7CisJ CQl9CisJCQl3ID0gcltEYXRhXTsKKwkJCSooKHUzMmludCopYnVmKSA9IHc7CisJCQlidWYgKz0g c2l6ZW9mKHUzMmludCk7CisJCX0KKwl9CisJcG9wZXJyb3IoKTsKKwlva2F5KDApOworfQorCitz dGF0aWMgdm9pZAorc2Rob3N0aW50ZXJydXB0KFVyZWcqLCB2b2lkKikKK3sJCisJdTMyaW50ICpy OworCWludCBpOworCisJciA9ICh1MzJpbnQqKVNESE9TVFJFR1M7CisJaSA9IHJbU3RhdHVzXTsK KwlXUihTdGF0dXMsIGkpOworCWlmKGkgJiBCdXN5aW50KXsKKwkJc2Rob3N0LmRvbmUgPSAxOwor CQl3YWtldXAoJnNkaG9zdC5yKTsKKwl9Cit9CisKK1NEaW8gc2Rpb2hvc3QgPSB7CisJInNkaG9z dCIsCisJc2Rob3N0aW5pdCwKKwlzZGhvc3RlbmFibGUsCisJc2Rob3N0aW5xdWlyeSwKKwlzZGhv c3RjbWQsCisJc2Rob3N0aW9zZXR1cCwKKwlzZGhvc3RpbywKK307CisKK3ZvaWQKK3NkaG9zdGxp bmsodm9pZCkKK3sKKwlzZGNhcmRsaW5rID0gJnNkaW9ob3N0OworfQpkaWZmIC1yIDQ0ZWFlOWE3 ZTk4YiBzeXMvc3JjLzkvYmNtL3NkbW1jLmMKLS0tIC9kZXYvbnVsbAlUaHUgSmFuIDAxIDAwOjAw OjAwIDE5NzAgKzAwMDAKKysrIGIvc3lzL3NyYy85L2JjbS9zZG1tYy5jCVR1ZSBPY3QgMTMgMDU6 MDk6NDkgMjAyMCAtMDcwMApAQCAtMCwwICsxLDM1NSBAQAorLyoKKyAqIG1tYyAvIHNkIG1lbW9y eSBjYXJkCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTIgUmljaGFyZCBNaWxsZXIgPHIubWlsbGVy QGFjbS5vcmc+CisgKgorICogQXNzdW1lcyBvbmx5IG9uZSBjYXJkIG9uIHRoZSBidXMKKyAqLwor CisjaW5jbHVkZSAidS5oIgorI2luY2x1ZGUgIi4uL3BvcnQvbGliLmgiCisjaW5jbHVkZSAiLi4v cG9ydC9lcnJvci5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgImRhdC5oIgorI2luY2x1 ZGUgImZucy5oIgorI2luY2x1ZGUgImlvLmgiCisKKyNpbmNsdWRlICIuLi9wb3J0L3NkLmgiCisK KyNkZWZpbmUgQ1NEKGVuZCwgc3RhcnQpCXJiaXRzKGNzZCwgc3RhcnQsIChlbmQpLShzdGFydCkr MSkKKwordHlwZWRlZiBzdHJ1Y3QgQ3RsciBDdGxyOworCitlbnVtIHsKKwlJbml0dGltZW91dAk9 IDE1LAorCU11bHRpYmxvY2sJPSAxLAorCisJLyogQ29tbWFuZHMgKi8KKwlHT19JRExFX1NUQVRF CT0gMCwKKwlBTExfU0VORF9DSUQJPSAyLAorCVNFTkRfUkVMQVRJVkVfQUREUj0gMywKKwlTV0lU Q0hfRlVOQwk9IDYsCisJU0VMRUNUX0NBUkQJPSA3LAorCVNEX1NFTkRfSUZfQ09ORAk9IDgsCisJ U0VORF9DU0QJPSA5LAorCVNUT1BfVFJBTlNNSVNTSU9OPSAxMiwKKwlTRU5EX1NUQVRVUwk9IDEz LAorCVNFVF9CTE9DS0xFTgk9IDE2LAorCVJFQURfU0lOR0xFX0JMT0NLPSAxNywKKwlSRUFEX01V TFRJUExFX0JMT0NLPSAxOCwKKwlXUklURV9CTE9DSwk9IDI0LAorCVdSSVRFX01VTFRJUExFX0JM T0NLPSAyNSwKKwlBUFBfQ01ECQk9IDU1LAkvKiBwcmVmaXggZm9yIGZvbGxvd2luZyBhcHAtc3Bl Y2lmaWMgY29tbWFuZHMgKi8KKwlTRVRfQlVTX1dJRFRICT0gNiwKKwlTRF9TRU5EX09QX0NPTkQJ PSA0MSwKKworCS8qIENvbW1hbmQgYXJndW1lbnRzICovCisJLyogU0RfU0VORF9JRl9DT05EICov CisJVm9sdGFnZQkJPSAxPDw4LAorCUNoZWNrcGF0dGVybgk9IDB4NDIsCisKKwkvKiBTRUxFQ1Rf Q0FSRCAqLworCVJjYXNoaWZ0CT0gMTYsCisKKwkvKiBTRF9TRU5EX09QX0NPTkQgKi8KKwlIY3MJ PSAxPDwzMCwJLyogaG9zdCBzdXBwb3J0cyBTREhDICYgU0RYQyAqLworCUNjcwk9IDE8PDMwLAkv KiBjYXJkIGlzIFNESEMgb3IgU0RYQyAqLworCVYzXzMJPSAzPDwyMCwJLyogMy4yLTMuNCB2b2x0 cyAqLworCisJLyogU0VUX0JVU19XSURUSCAqLworCVdpZHRoMQk9IDA8PDAsCisJV2lkdGg0CT0g Mjw8MCwKKworCS8qIFNXSVRDSF9GVU5DICovCisJRGZsdHNwZWVkCT0gMDw8MCwKKwlIaXNwZWVk CQk9IDE8PDAsCisJQ2hlY2tmdW5jCT0gMHgwMEZGRkZGMCwKKwlTZXRmdW5jCQk9IDB4ODBGRkZG RjAsCisJRnVuY2J5dGVzCT0gNjQsCisKKwkvKiBPQ1IgKG9wZXJhdGluZyBjb25kaXRpb25zIHJl Z2lzdGVyKSAqLworCVBvd2VydXAJPSAxPDwzMSwKK307CisKK3N0cnVjdCBDdGxyIHsKKwlTRGV2 CSpkZXY7CisJU0RpbwkqaW87CisJLyogU0QgY2FyZCByZWdpc3RlcnMgKi8KKwl1MTZpbnQJcmNh OworCXUzMmludAlvY3I7CisJdTMyaW50CWNpZFs0XTsKKwl1MzJpbnQJY3NkWzRdOworfTsKKwor U0RpbyAqc2RjYXJkbGluazsKKworZXh0ZXJuIFNEaWZjIHNkbW1jaWZjOworCitzdGF0aWMgdWlu dAorcmJpdHModTMyaW50ICpwLCB1aW50IHN0YXJ0LCB1aW50IGxlbikKK3sKKwl1aW50IHcsIG9m ZiwgdjsKKworCXcgICA9IHN0YXJ0IC8gMzI7CisJb2ZmID0gc3RhcnQgJSAzMjsKKwlpZihvZmYg PT0gMCkKKwkJdiA9IHBbd107CisJZWxzZQorCQl2ID0gcFt3XSA+PiBvZmYgfCBwW3crMV0gPDwg KDMyLW9mZik7CisJaWYobGVuIDwgMzIpCisJCXJldHVybiB2ICYgKCgxPDxsZW4pIC0gMSk7CisJ ZWxzZQorCQlyZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQKK2lkZW50aWZ5KFNEdW5pdCAqdW5p dCwgdTMyaW50ICpjc2QpCit7CisJdWludCBjc2l6ZSwgbXVsdDsKKworCXVuaXQtPnNlY3NpemUg PSAxIDw8IENTRCg4MywgODApOworCXN3aXRjaChDU0QoMTI3LCAxMjYpKXsKKwljYXNlIDA6CQkJ CS8qIENTRCB2ZXJzaW9uIDEgKi8KKwkJY3NpemUgPSBDU0QoNzMsIDYyKTsKKwkJbXVsdCA9IENT RCg0OSwgNDcpOworCQl1bml0LT5zZWN0b3JzID0gKGNzaXplKzEpICogKDE8PChtdWx0KzIpKTsK KwkJYnJlYWs7CisJY2FzZSAxOgkJCQkvKiBDU0QgdmVyc2lvbiAyICovCisJCWNzaXplID0gQ1NE KDY5LCA0OCk7CisJCXVuaXQtPnNlY3RvcnMgPSAoY3NpemUrMSkgKiA1MTJMTCpLaUIgLyB1bml0 LT5zZWNzaXplOworCQlicmVhazsKKwl9CisJaWYodW5pdC0+c2Vjc2l6ZSA9PSAxMDI0KXsKKwkJ dW5pdC0+c2VjdG9ycyA8PD0gMTsKKwkJdW5pdC0+c2Vjc2l6ZSA9IDUxMjsKKwl9Cit9CisKK3N0 YXRpYyBTRGV2KgorbW1jcG5wKHZvaWQpCit7CisJU0RldiAqc2RldjsKKwlDdGxyICpjdGw7CisK KwlpZihzZGNhcmRsaW5rID09IG5pbCkKKwkJc2RjYXJkbGluayA9ICZzZGlvOworCWlmKHNkY2Fy ZGxpbmstPmluaXQoKSA8IDApCisJCXJldHVybiBuaWw7CisJc2RldiA9IG1hbGxvYyhzaXplb2Yo U0RldikpOworCWlmKHNkZXYgPT0gbmlsKQorCQlyZXR1cm4gbmlsOworCWN0bCA9IG1hbGxvYyhz aXplb2YoQ3RscikpOworCWlmKGN0bCA9PSBuaWwpeworCQlmcmVlKHNkZXYpOworCQlyZXR1cm4g bmlsOworCX0KKwlzZGV2LT5pZG5vID0gJ00nOworCXNkZXYtPmlmYyA9ICZzZG1tY2lmYzsKKwlz ZGV2LT5udW5pdCA9IDE7CisJc2Rldi0+Y3RsciA9IGN0bDsKKwljdGwtPmRldiA9IHNkZXY7CisJ Y3RsLT5pbyA9IHNkY2FyZGxpbms7CisJcmV0dXJuIHNkZXY7Cit9CisKK3N0YXRpYyBpbnQKK21t Y3ZlcmlmeShTRHVuaXQgKnVuaXQpCit7CisJaW50IG47CisJQ3RsciAqY3RsOworCisJY3RsID0g dW5pdC0+ZGV2LT5jdGxyOworCW4gPSBjdGwtPmlvLT5pbnF1aXJ5KChjaGFyKikmdW5pdC0+aW5x dWlyeVs4XSwgc2l6ZW9mKHVuaXQtPmlucXVpcnkpLTgpOworCWlmKG4gPCAwKQorCQlyZXR1cm4g MDsKKwl1bml0LT5pbnF1aXJ5WzBdID0gMDsKKwl1bml0LT5pbnF1aXJ5WzFdID0gMHg4MDsKKwl1 bml0LT5pbnF1aXJ5WzRdID0gc2l6ZW9mKHVuaXQtPmlucXVpcnkpLTQ7CisJcmV0dXJuIDE7Cit9 CisKK3N0YXRpYyBpbnQKK21tY2VuYWJsZShTRGV2KiBkZXYpCit7CisJQ3RsciAqY3RsOworCisJ Y3RsID0gZGV2LT5jdGxyOworCWN0bC0+aW8tPmVuYWJsZSgpOworCXJldHVybiAxOworfQorCitz dGF0aWMgdm9pZAorbW1jc3dpdGNoZnVuYyhTRGlvICppbywgaW50IGFyZykKK3sKKwl1Y2hhciAq YnVmOworCWludCBuOworCXUzMmludCByWzRdOworCisJbiA9IEZ1bmNieXRlczsKKwlidWYgPSBz ZG1hbGxvYyhuKTsKKwlpZih3YXNlcnJvcigpKXsKKwkJcHJpbnQoIm1tY3N3aXRjaGZ1bmMgZXJy b3JcbiIpOworCQlzZGZyZWUoYnVmKTsKKwkJbmV4dGVycm9yKCk7CisJfQorCWlvLT5pb3NldHVw KDAsIGJ1ZiwgbiwgMSk7CisJaW8tPmNtZChTV0lUQ0hfRlVOQywgYXJnLCByKTsKKwlpby0+aW8o MCwgYnVmLCBuKTsKKwlzZGZyZWUoYnVmKTsKKwlwb3BlcnJvcigpOworfQorCitzdGF0aWMgaW50 CittbWNvbmxpbmUoU0R1bml0ICp1bml0KQoreworCWludCBoY3MsIGk7CisJdTMyaW50IHJbNF07 CisJQ3RsciAqY3RsOworCVNEaW8gKmlvOworCisJY3RsID0gdW5pdC0+ZGV2LT5jdGxyOworCWlv ID0gY3RsLT5pbzsKKwlhc3NlcnQodW5pdC0+c3Vibm8gPT0gMCk7CisKKwlpZih3YXNlcnJvcigp KXsKKwkJdW5pdC0+c2VjdG9ycyA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZih1bml0LT5zZWN0 b3JzICE9IDApeworCQlpby0+Y21kKFNFTkRfU1RBVFVTLCBjdGwtPnJjYTw8UmNhc2hpZnQsIHIp OworCQlwb3BlcnJvcigpOworCQlyZXR1cm4gMTsKKwl9CisJaWYod2FzZXJyb3IoKSl7CisJCXVu aXQtPnNlY3RvcnMgPSAwOworCQlwb3BlcnJvcigpOworCQlyZXR1cm4gMjsKKwl9CisJaW8tPmNt ZChHT19JRExFX1NUQVRFLCAwLCByKTsKKwloY3MgPSAwOworCWlmKCF3YXNlcnJvcigpKXsKKwkJ aW8tPmNtZChTRF9TRU5EX0lGX0NPTkQsIFZvbHRhZ2V8Q2hlY2twYXR0ZXJuLCByKTsKKwkJaWYo clswXSA9PSAoVm9sdGFnZXxDaGVja3BhdHRlcm4pKQkvKiBTRCAyLjAgb3IgYWJvdmUgKi8KKwkJ CWhjcyA9IEhjczsKKwkJcG9wZXJyb3IoKTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgSW5pdHRpbWVv dXQ7IGkrKyl7CisJCWRlbGF5KDEwMCk7CisJCWlvLT5jbWQoQVBQX0NNRCwgMCwgcik7CisJCWlv LT5jbWQoU0RfU0VORF9PUF9DT05ELCBoY3N8VjNfMywgcik7CisJCWlmKHJbMF0gJiBQb3dlcnVw KQorCQkJYnJlYWs7CisJfQorCWlmKGkgPT0gSW5pdHRpbWVvdXQpeworCQlwcmludCgic2RtbWM6 IGNhcmQgd29uJ3QgcG93ZXIgdXBcbiIpOworCQllcnJvcihFaW8pOworCX0KKwlwb3BlcnJvcigp OworCWN0bC0+b2NyID0gclswXTsKKwlpby0+Y21kKEFMTF9TRU5EX0NJRCwgMCwgcik7CisJbWVt bW92ZShjdGwtPmNpZCwgciwgc2l6ZW9mIGN0bC0+Y2lkKTsKKwlpby0+Y21kKFNFTkRfUkVMQVRJ VkVfQUREUiwgMCwgcik7CisJY3RsLT5yY2EgPSByWzBdPj4xNjsKKwlpby0+Y21kKFNFTkRfQ1NE LCBjdGwtPnJjYTw8UmNhc2hpZnQsIHIpOworCW1lbW1vdmUoY3RsLT5jc2QsIHIsIHNpemVvZiBj dGwtPmNzZCk7CisJaWRlbnRpZnkodW5pdCwgY3RsLT5jc2QpOworCWlvLT5jbWQoU0VMRUNUX0NB UkQsIGN0bC0+cmNhPDxSY2FzaGlmdCwgcik7CisJaW8tPmNtZChTRVRfQkxPQ0tMRU4sIHVuaXQt PnNlY3NpemUsIHIpOworCWlvLT5jbWQoQVBQX0NNRCwgY3RsLT5yY2E8PFJjYXNoaWZ0LCByKTsK Kwlpby0+Y21kKFNFVF9CVVNfV0lEVEgsIFdpZHRoNCwgcik7CisJaWYoIXdhc2Vycm9yKCkpewor CQltbWNzd2l0Y2hmdW5jKGlvLCBIaXNwZWVkfFNldGZ1bmMpOworCQlwb3BlcnJvcigpOworCX0K Kwlwb3BlcnJvcigpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CittbWNyY3RsKFNEdW5p dCAqdW5pdCwgY2hhciAqcCwgaW50IGwpCit7CisJQ3RsciAqY3RsOworCWludCBpLCBuOworCisJ Y3RsID0gdW5pdC0+ZGV2LT5jdGxyOworCWFzc2VydCh1bml0LT5zdWJubyA9PSAwKTsKKwlpZih1 bml0LT5zZWN0b3JzID09IDApeworCQltbWNvbmxpbmUodW5pdCk7CisJCWlmKHVuaXQtPnNlY3Rv cnMgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwluID0gc25wcmludChwLCBsLCAicmNhICU0LjR1 eCBvY3IgJTguOHV4XG5jaWQgIiwgY3RsLT5yY2EsIGN0bC0+b2NyKTsKKwlmb3IoaSA9IG5lbGVt KGN0bC0+Y2lkKS0xOyBpID49IDA7IGktLSkKKwkJbiArPSBzbnByaW50KHArbiwgbC1uLCAiJTgu OHV4IiwgY3RsLT5jaWRbaV0pOworCW4gKz0gc25wcmludChwK24sIGwtbiwgIiBjc2QgIik7CisJ Zm9yKGkgPSBuZWxlbShjdGwtPmNzZCktMTsgaSA+PSAwOyBpLS0pCisJCW4gKz0gc25wcmludChw K24sIGwtbiwgIiU4Ljh1eCIsIGN0bC0+Y3NkW2ldKTsKKwluICs9IHNucHJpbnQocCtuLCBsLW4s ICJcbmdlb21ldHJ5ICVsbHVkICVsZCAlbGxkIDI1NSA2M1xuIiwKKwkJdW5pdC0+c2VjdG9ycywg dW5pdC0+c2Vjc2l6ZSwgdW5pdC0+c2VjdG9ycyAvICgyNTUqNjMpKTsKKwlyZXR1cm4gbjsKK30K Kworc3RhdGljIGxvbmcKK21tY2JpbyhTRHVuaXQgKnVuaXQsIGludCBsdW4sIGludCB3cml0ZSwg dm9pZCAqZGF0YSwgbG9uZyBuYiwgdXZsb25nIGJubykKK3sKKwlpbnQgbGVuLCB0cmllczsKKwl1 bG9uZyBiOworCXUzMmludCByWzRdOworCXVjaGFyICpidWY7CisJQ3RsciAqY3RsOworCVNEaW8g KmlvOworCisJVVNFRChsdW4pOworCWN0bCA9IHVuaXQtPmRldi0+Y3RscjsKKwlpbyA9IGN0bC0+ aW87CisJYXNzZXJ0KHVuaXQtPnN1Ym5vID09IDApOworCWlmKHVuaXQtPnNlY3RvcnMgPT0gMCkK KwkJZXJyb3IoIm1lZGlhIGNoYW5nZSIpOworCWJ1ZiA9IGRhdGE7CisJbGVuID0gdW5pdC0+c2Vj c2l6ZTsKKwlpZihNdWx0aWJsb2NrKXsKKwkJYiA9IGJubzsKKwkJdHJpZXMgPSAwOworCQl3aGls ZSh3YXNlcnJvcigpKQorCQkJaWYoKyt0cmllcyA9PSAzKQorCQkJCW5leHRlcnJvcigpOworCQlp by0+aW9zZXR1cCh3cml0ZSwgYnVmLCBsZW4sIG5iKTsKKwkJaWYod2FzZXJyb3IoKSl7CisJCQlp by0+Y21kKFNUT1BfVFJBTlNNSVNTSU9OLCAwLCByKTsKKwkJCW5leHRlcnJvcigpOworCQl9CisJ CWlvLT5jbWQod3JpdGU/IFdSSVRFX01VTFRJUExFX0JMT0NLOiBSRUFEX01VTFRJUExFX0JMT0NL LAorCQkJY3RsLT5vY3IgJiBDY3M/IGI6IGIgKiBsZW4sIHIpOworCQlpby0+aW8od3JpdGUsIGJ1 ZiwgbmIgKiBsZW4pOworCQlwb3BlcnJvcigpOworCQlpby0+Y21kKFNUT1BfVFJBTlNNSVNTSU9O LCAwLCByKTsKKwkJcG9wZXJyb3IoKTsKKwkJYiArPSBuYjsKKwl9ZWxzZXsKKwkJZm9yKGIgPSBi bm87IGIgPCBibm8gKyBuYjsgYisrKXsKKwkJCWlvLT5pb3NldHVwKHdyaXRlLCBidWYsIGxlbiwg MSk7CisJCQlpby0+Y21kKHdyaXRlPyBXUklURV9CTE9DSyA6IFJFQURfU0lOR0xFX0JMT0NLLAor CQkJCWN0bC0+b2NyICYgQ2NzPyBiOiBiICogbGVuLCByKTsKKwkJCWlvLT5pbyh3cml0ZSwgYnVm LCBsZW4pOworCQkJYnVmICs9IGxlbjsKKwkJfQorCX0KKwlyZXR1cm4gKGIgLSBibm8pICogbGVu OworfQorCitzdGF0aWMgaW50CittbWNyaW8oU0RyZXEqKQoreworCXJldHVybiAtMTsKK30KKwor U0RpZmMgc2RtbWNpZmMgPSB7CisJLm5hbWUJPSAibW1jIiwKKwkucG5wCT0gbW1jcG5wLAorCS5l bmFibGUJPSBtbWNlbmFibGUsCisJLnZlcmlmeQk9IG1tY3ZlcmlmeSwKKwkub25saW5lCT0gbW1j b25saW5lLAorCS5yY3RsCT0gbW1jcmN0bCwKKwkuYmlvCT0gbW1jYmlvLAorCS5yaW8JPSBtbWNy aW8sCit9Owo= --0000000000001849ce05b18c6346-- --upas-cvgadubxdchlyyhmovgkfjuozu--