From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2, URIBL_BLACK autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 8986 invoked from network); 26 Sep 2022 22:42:28 -0000 Received: from second.openwall.net (193.110.157.125) by inbox.vuxu.org with ESMTPUTF8; 26 Sep 2022 22:42:28 -0000 Received: (qmail 3637 invoked by uid 550); 26 Sep 2022 22:42:25 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 3602 invoked from network); 26 Sep 2022 22:42:24 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=android.com; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date; bh=DmiIUG17U2QXQy5qptzKbKmMIwAHl+bPeWLRXYCNFac=; b=b3pKp9Kire0MBu2XhMsGrfNlD9qU6DdW5Ytu+w7MI+SwFg2q9t9QiT1VVywErFLK1O rUFhzl/gpL8gXtkWbizpKT5M6eBC73PKIKhmKS0bgTN3CXhJIT1lLsUdzeZCAqKbNEYE rkG3xO+2xU5Lxh6g334JTrYvUzx5iW4vWQLYaTXamb0Rcu7HYgZJsOfMUAl5OP6nM36F HEI/TOaIGuV0cFZmEj5YEdRqZHg62h3BWxR9GhzleScJg1+7KW+ITrc4CeNM3y2p5H18 k2QB8bNWSOQ0pD1xGvqCxrEmNsMOVJAVEhi6BTe7vvb5thdFzQ1MUoi0SDVQck+GrQuB 9ZzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date; bh=DmiIUG17U2QXQy5qptzKbKmMIwAHl+bPeWLRXYCNFac=; b=ke5IDpH/BhBRCDVTt17XQOMrdCQ4hn9rTs1XBaOnjoe3xEzpAvZv9FeA6c6nNBy3/E Itecow3zG5TAJZNWIM2aC3kL4S27d8fHQH1PJmza8XDxu/fT5BF3o0j9YLNPJGrWqqNB nh1s9TOeOhRiM3Ec8izMVMZTljUBWMo4yvpaJAGeUJ0EIBCN5OJotFf6+1lYLzfhjqsc 6QndAbKrzMGm5599vBp3AQRQkWsXcMwzvjkDVk/cZ3Qe0X+3SSIckClbS/82q2BuwWNe rE+nFf6i3gbsoSk0pfIRiwcdodxO7pf52PAWNvW9P+tjpXiXlEQc5ltNR7GgSY2DYuxl WdRw== X-Gm-Message-State: ACrzQf2as9XMEq4RMTbPFZxkx6v3kQI/NXn1mkH1zg2T8IoOat9lBaGk 6TQ/bNywnSrmSuQXFa655J9LyWPoOGY4voNzGxjmxHQEL90= X-Google-Smtp-Source: AMsMyM6qw09VxH1IdIAFt/Rc9VTvNgZzMfsMrowoTHvQc4d2p94jk4bF5SYmT/At8otjS+dYDjaJ+lK3wWWPX6nmL3E= X-Received: by 2002:a05:6638:3282:b0:33f:6ed0:4c83 with SMTP id f2-20020a056638328200b0033f6ed04c83mr13227888jav.96.1664232132515; Mon, 26 Sep 2022 15:42:12 -0700 (PDT) MIME-Version: 1.0 References: <20220820094308.GK1320090@port70.net> <20220823081802.GM1320090@port70.net> In-Reply-To: From: Colin Cross Date: Mon, 26 Sep 2022 15:42:01 -0700 Message-ID: To: Colin Cross , musl@lists.openwall.com, Ryan Prichard Content-Type: multipart/mixed; boundary="00000000000015d12105e99c3d6c" Subject: Re: [musl] Running musl executables without a preinstalled dynamic linker --00000000000015d12105e99c3d6c Content-Type: text/plain; charset="UTF-8" On Mon, Sep 26, 2022 at 3:38 PM Colin Cross wrote: > > On Tue, Aug 23, 2022 at 1:18 AM Szabolcs Nagy wrote: > > > > * Colin Cross [2022-08-22 17:22:06 -0700]: > > > On Sat, Aug 20, 2022 at 2:43 AM Szabolcs Nagy wrote: > > > > i would not use Scrt1.o though, the same toolchain should be > > > > usable for normal linking and relinterp linking, just use a > > > > different name like Xcrt1.o. > > > > > > Is there some way to get gcc/clang to use Xcrt1.o without using > > > -nostdlib and passing all the crtbegin/end objects manually? > > > > this requires compiler changes (new cmdline flag) but then i think > > the code is upstreamable. > > I've used relinterp.o for now, and selected instead of Scrt1.o in > musl-gcc.specs and ld.musl-clang. > > > > > > > i would make Xcrt1.o self-contained and size optimized: it only > > > > runs at start up, this is a different requirement from the -O3 > > > > build of normal string functions. and then there is no dependency > > > > on libc internals (which may have various instrumentations that > > > > does not work in Xcrt1.o). > > > > > > Doesn't this same logic apply to most of the code in dynlink.c? My > > > main worry with a self contained implementation is that it requires > > > reimplementations of various string functions that are easy to get > > > wrong. The current prototype reuses the C versions of musl's string > > > functions, but implements its own syscall wrappers to avoid > > > interactions with musl internals like errno. > > > > dynlink is in libc.so so it can use code from there. > > > > but moving libc code into the executable has different constraints. > > so you will have to make random decisions that string functions are > > in but errno is out, wrt which libc internal makes sense in the exe. > > > > i would just keep a separate implementation (or at least compile > > the code separately). string functions are easy to implement if > > you dont try to optimize them imo. then you have full control over > > what is going on in the exe entry code. > > I left the reimplementations of string functions and syscalls as > suggested. Patch attached. --00000000000015d12105e99c3d6c Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Add-entry-point-to-find-dynamic-loader-relative-to-t.patch" Content-Disposition: attachment; filename="0001-Add-entry-point-to-find-dynamic-loader-relative-to-t.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l8jctxek0 RnJvbSAwZGY0NjAxODhiOTVmNzkyNzIwMDNiZDBlNWMxMmJjZWIyYTNjMjVmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBDb2xpbiBDcm9zcyA8Y2Nyb3NzQGFuZHJvaWQuY29tPgpEYXRl OiBUaHUsIDIyIFNlcCAyMDIyIDE5OjE0OjAxIC0wNzAwClN1YmplY3Q6IFtQQVRDSF0gQWRkIGVu dHJ5IHBvaW50IHRvIGZpbmQgZHluYW1pYyBsb2FkZXIgcmVsYXRpdmUgdG8gdGhlCiBleGVjdXRh YmxlCgpEaXN0cmlidXRpbmcgYmluYXJpZXMgYnVpbHQgYWdhaW5zdCBtdXNsIHRvIHN5c3RlbXMg dGhhdCBkb24ndCBhbHJlYWR5CmhhdmUgbXVzbCBpcyBwcm9ibGVtYXRpYyBkdWUgdG8gdGhlIGhh cmRjb2RlZCBhYnNvbHV0ZSBwYXRoIHRvIHRoZQpkeW5hbWljIGxvYWRlciAoZS5nLiAvbGliL2xk LW11c2wtJEFSQ0guc28uMSkgaW4gdGhlIFBUX0lOVEVSUCBoZWFkZXIuClRoaXMgcGF0Y2ggYWRk cyBhIGZlYXR1cmUgdG8gYXZvaWQgdGhlIHByb2JsZW0gYnkgbGVhdmluZyBvdXQgUFRfSU5URVJQ CmFuZCByZXBsYWNpbmcgU2NydDEubyB3aXRoIGFuIGVudHJ5IHBvaW50IHRoYXQgY2FuIGZpbmQg dGhlIGR5bmFtaWMKbG9hZGVyIHVzaW5nIERUX1JVTlBBVEggb3IgTERfTElCUkFSWV9QQVRILgoK VGhlIGVudHJ5IHBvaW50IGlzIGluIGNydC9yZWxpbnRlcnAuYy4gIEl0IHVzZXMgYXV4dmFsIHRv IGdldCB0aGUKcHJvZ3JhbSBoZWFkZXJzIGFuZCBmaW5kIHRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhl IGJpbmFyeSwgdGhlbgpzZWFyY2hlcyBMRF9MSUJSQVJZX1BBVEggb3IgRFRfUlVOUEFUSCBmb3Ig dGhlIGR5bmFtaWMgbG9hZGVyLgpPbmNlIGZvdW5kLCBpdCBtbWFwcyB0aGUgbG9hZGVyIHNpbWls YXIgdG8gdGhlIHdheSB0aGUga2VybmVsCmRvZXMgd2hlbiBQVF9JTlRFUlAgaXMgc2V0LiAgVGhl IG11c2wgbG9hZGVyIHVzZXMgUFRfSU5URVJQIHRvIHNldAp0aGUgcGF0aCB0byB0aGUgbG9hZGVy IGluIHRoZSBzaGFyZWQgbGlicmFyeSBpbmZvIGV4cG9ydGVkIHRvIHRoZQpkZWJ1Z2dlciwgc28g cmVsaW50ZXJwIGNyZWF0ZXMgYSBjb3B5IG9mIHRoZSBwcm9ncmFtIGhlYWRlcnMKd2l0aCB0aGUg UFRfSU5URVJQIGVudHJ5IGFkZGVkIHBvaW50aW5nIHRvIHRoZSBmb3VuZCBsb2NhdGlvbiBvZgp0 aGUgZHluYW1pYyBsb2FkZXIuICBJdCB1cGRhdGVzIEFUX0JBU0UgdG8gcG9pbnQgdG8gdGhlIGFk ZHJlc3MKb2YgdGhlIGR5bmFtaWMgbG9hZGVyLCB0aGVuIGp1bXBzIHRvIHRoZSBsb2FkZXJzIGVu dHJ5IHBvaW50LgoKVGhlIGR5bmFtaWMgbG9hZGVyIHRoZW4gbG9hZHMgc2hhcmVkIGxpYnJhcmll cyBhbmQgaGFuZGxlcwpyZWxvY2F0aW9ucyBiZWZvcmUganVtcGluZyB0byB0aGUgZXhlY3V0YWJs ZSdzIGVudHJ5IHBvaW50LCB3aGljaCBpcwp0aGUgZW50cnkgcG9pbnQgaW4gcmVsaW50ZXJwLmMg YWdhaW4uICBSZWxpbnRlcnAgZGV0ZWN0cyB0aGF0CnJlbG9jYXRpb25zIGhhdmUgYmVlbiBwZXJm b3JtZWQgYW5kIGNhbGxzIF9fbGliY19zdGFydF9tYWluLCB0aGUKc2FtZSB3YXkgU2NydDEubyB3 b3VsZCBoYXZlLgoKU2luY2UgcmVsaW50ZXJwIHJ1bnMgYmVmb3JlIHJlbG9jYXRpb25zIGhhdmUg YmVlbiBwZXJmb3JtZWQgaXQgaGFzCnRvIGF2b2lkIHJlZmVyZWNpbmcgYW55IGxpYmMgZnVuY3Rp b25zLiAgVGhhdCBtZWFucyByZWltcGxlbWVudGluZwp0aGUgZmV3IHN5c2NhbGxzIGFuZCBzdHJp bmcgZnVuY3Rpb25zIHRoYXQgaXQgdXNlcywgYW5kIGF2b2lkaW5nCmltcGxpY2l0IGNhbGxzIHRv IG1lbWNweSBhbmQgbWVtc2V0IHRoYXQgbWF5ICBiZSBpbnNlcnRlZCBieSB0aGUKY29tcGlsZXIu CgpFbmFibGluZyByZWxpbnRlcnAgaXMgaGFuZGxlZCBpbiB0aGUgc3BlYyBmaWxlIGZvciBnY2Mg YW5kIGluCnRoZSBsaW5rZXIgc2NyaXB0IGZvciBjbGFuZyB2aWEgYSAtcmVsaW50ZXJwIGFyZ3Vt ZW50LgoKTm9ybWFsbHkgZ2RiIGFuZCBsbGRiIGxvb2sgZm9yIGEgc3ltYm9sIG5hbWVkICJfZGxf ZGVidWdfc3RhdGUiIGluCnRoZSBpbnRlcnByZXRlciB0byBnZXQgbm90aWZpZWQgd2hlbiB0aGUg ZHluYW1pYyBsb2FkZXIgaGFzIG1vZGlmaWVkCnRoZSBsaXN0IG9mIHNoYXJlZCBsaWJyYXJpZXMu ICBXaGVuIHVzaW5nIHJlbGludGVycCB0aGUgZGVidWdnZXIgaXMKbm90IGF3YXJlIG9mIHRoZSBp bnRlcnByZXRlciAoYXQgcHJvY2VzcyBsYXVuY2ggUFRfSU5URVJQIGlzIHVuc2V0CmFuZCBhdXh2 IEFUX0JBU0UgaXMgMCkgc28gaXQgZG9lc24ndCBrbm93IHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBz eW1ib2wuCgpUaGV5IGZhbGwgYmFjayB0byBsb29raW5nIGluIHRoZSBleGVjdXRhYmxlLCBzbyB3 ZSBjYW4gcHJvdmlkZSBhIHN5bWJvbAppbiByZWxpbnRlcnAuYyBmb3IgaXQgdG8gZmluZC4gIFRo ZSBkeW5hbWljIGxvYWRlciBpcyB0aGVuIG1vZGlmaWVkCnRvIGFsc28gZmluZCB0aGUgc3ltYm9s IGluIHRoZSBleGVjdHVhYmxlIGFuZCB0byBjYWxsIGl0IGZyb20gaXRzIG93bgpfZGxfZGVidWdf c3RhdGUgZnVuY3Rpb24uCgpUaGUgc2FtZSB0ZXN0cyBpbiBsaWJjX3Rlc3QgcGFzcyB3aXRoIG9y IHdpdGhvdXQgTERGTEFHUyArPSAtcmVsaW50ZXJwCndpdGggYm90aCBtdXNsLWdjYyBhbmQgbXVz bC1jbGFuZy4KClJ5YW4gUHJpY2hhcmQgKHJwcmljaGFyZEBnb29nbGUuY29tKSBhdXRob3JlZCB0 aGUgb3JpZ2luYWwgcHJvdG90eXBlCm9mIHJlbGludGVycC4KLS0tCiBNYWtlZmlsZSAgICAgICAg ICAgICAgICB8ICAgMiArLQogY3J0L3JlbGludGVycC5jICAgICAgICAgfCA4OTYgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogbGRzby9keW5saW5rLmMgICAgICAgICAg fCAgIDkgKwogdG9vbHMvbGQubXVzbC1jbGFuZy5pbiAgfCAgMjYgKy0KIHRvb2xzL211c2wtY2xh bmcuaW4gICAgIHwgIDE3ICstCiB0b29scy9tdXNsLWdjYy5zcGVjcy5zaCB8ICAgNCArLQogNiBm aWxlcyBjaGFuZ2VkLCA5NDggaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBt b2RlIDEwMDY0NCBjcnQvcmVsaW50ZXJwLmMKCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2Vm aWxlCmluZGV4IGU4Y2M0NDM2Li45YjM4MDI0YiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIv TWFrZWZpbGUKQEAgLTExMyw3ICsxMTMsNyBAQCBvYmovY3J0L2NydDEubyBvYmovY3J0L3NjcnQx Lm8gb2JqL2NydC9yY3J0MS5vIG9iai9sZHNvL2Rsc3RhcnQubG86ICQoc3JjZGlyKS9hcgogCiBv YmovY3J0L3JjcnQxLm86ICQoc3JjZGlyKS9sZHNvL2Rsc3RhcnQuYwogCi1vYmovY3J0L1NjcnQx Lm8gb2JqL2NydC9yY3J0MS5vOiBDRkxBR1NfQUxMICs9IC1mUElDCitvYmovY3J0L1NjcnQxLm8g b2JqL2NydC9yY3J0MS5vIG9iai9jcnQvcmVsaW50ZXJwLm86IENGTEFHU19BTEwgKz0gLWZQSUMK IAogT1BUSU1JWkVfU1JDUyA9ICQod2lsZGNhcmQgJChPUFRJTUlaRV9HTE9CUzolPSQoc3JjZGly KS9zcmMvJSkpCiAkKE9QVElNSVpFX1NSQ1M6JChzcmNkaXIpLyUuYz1vYmovJS5vKSAkKE9QVElN SVpFX1NSQ1M6JChzcmNkaXIpLyUuYz1vYmovJS5sbyk6IENGTEFHUyArPSAtTzMKZGlmZiAtLWdp dCBhL2NydC9yZWxpbnRlcnAuYyBiL2NydC9yZWxpbnRlcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMC4uZmE2OGJkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnQvcmVsaW50 ZXJwLmMKQEAgLTAsMCArMSw4OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFu ZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0 IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0 aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns YWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1 Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0 aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRh dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0 cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisg KiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI QUxMIFRIRQorICogQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S IEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqIEJVVCBOT1QgTElNSVRF RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUwor ICogT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP V0VWRVIgQ0FVU0VECisgKiBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVH TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBV U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP RgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGVy cm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW5rLmg+CisjaW5jbHVkZSA8 c3RkYWxpZ24uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+Cisj aW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMv cGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+ CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJyZWxvYy5oIgorI2luY2x1ZGUgInN5 c2NhbGwuaCIKKworI2lmbmRlZiBMT0FERVJfUEFUSAorI2RlZmluZSBMT0FERVJfUEFUSCAibGli Yy5zbyIKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgRW50cnlGdW5jKHZvaWQpOworCisvLyBhcm02 NCBkb2Vzbid0IGhhdmUgYSBjb25zdGFudCBwYWdlIHNpemUgYW5kIGhhcyB0byB1c2UgdGhlIHZh bHVlIGZyb20gQVRfUEFHRVNaLgorI2lmbmRlZiBQQUdFX1NJWkUKKyNkZWZpbmUgUEFHRV9TSVpF IGdfcGFnZV9zaXplCisjZW5kaWYKKworI2RlZmluZSBQQUdFX1NUQVJUKHgpICgoeCkgJiAofihQ QUdFX1NJWkUtMSkpKQorI2RlZmluZSBQQUdFX0VORCh4KSBQQUdFX1NUQVJUKCh4KSArIChQQUdF X1NJWkUgLSAxKSkKKworI2RlZmluZSBTVEFSVCAiX3N0YXJ0IgorI2luY2x1ZGUgImNydF9hcmNo LmgiCisKK2ludCBtYWluKCk7Cit3ZWFrIHZvaWQgX2luaXQoKTsKK3dlYWsgdm9pZCBfZmluaSgp OworaW50IF9fbGliY19zdGFydF9tYWluKGludCAoKikoKSwgaW50LCBjaGFyICoqLCB2b2lkICgq KSgpLCB2b2lkKCopKCksIHZvaWQoKikoKSk7CisKK3N0YXRpYyBFbGZXKFBoZHIpIHJlcGxhY2Vt ZW50X3BoZHJfdGFibGVbNjRdOworc3RhdGljIGNoYXIgcmVwbGFjZW1lbnRfaW50ZXJwW1BBVEhf TUFYXTsKKworc3RhdGljIGJvb2wgZ19kZWJ1ZyA9IGZhbHNlOworc3RhdGljIGNvbnN0IGNoYXIq IGdfcHJvZ19uYW1lID0gTlVMTDsKK3N0YXRpYyB1aW50cHRyX3QgZ19wYWdlX3NpemUgPSAwOwor c3RhdGljIGludCBnX2Vycm5vID0gMDsKKworX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlk ZGVuIikpKSBleHRlcm4gRWxmVyhEeW4pIF9EWU5BTUlDW107CisKK19fYXR0cmlidXRlX18oKHVz ZWQpKQorc3RhdGljIGxvbmcgcmlfc2V0X2Vycm5vKHVuc2lnbmVkIGxvbmcgdmFsKSB7CisJaWYg KHZhbCA+IC00MDk2VUwpIHsKKwkJZ19lcnJubyA9IC12YWw7CisJCXJldHVybiAtMTsKKwl9CisJ cmV0dXJuIHZhbDsKK30KKworI2RlZmluZSByaV9zeXNjYWxsKC4uLikgcmlfc2V0X2Vycm5vKF9f c3lzY2FsbChfX1ZBX0FSR1NfXykpCisKK3N0YXRpYyBzc2l6ZV90IHJpX3dyaXRlKGludCBmZCwg Y29uc3Qgdm9pZCogYnVmLCBzaXplX3QgYW10KSB7CisJcmV0dXJuIHJpX3N5c2NhbGwoU1lTX3dy aXRlLCBmZCwgYnVmLCBhbXQpOworfQorCitfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCitzdGF0 aWMgdm9pZCByaV9leGl0KGludCBzdGF0dXMpIHsKKwlyaV9zeXNjYWxsKFNZU19leGl0LCBzdGF0 dXMpOworCV9fYnVpbHRpbl91bnJlYWNoYWJsZSgpOworfQorCitzdGF0aWMgaW50IHJpX29wZW4o Y29uc3QgY2hhciogcGF0aCwgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSkgeworCXJldHVybiByaV9z eXNjYWxsKFNZU19vcGVuYXQsIEFUX0ZEQ1dELCBwYXRoLCBmbGFncywgbW9kZSk7Cit9CisKK3N0 YXRpYyBpbnQgcmlfY2xvc2UoaW50IGZkKSB7CisJcmV0dXJuIHJpX3N5c2NhbGwoU1lTX2Nsb3Nl LCBmZCk7Cit9CisKK3N0YXRpYyBvZmZfdCByaV9sc2VlayhpbnQgZmQsIG9mZl90IG9mZnNldCwg aW50IHdoZW5jZSkgeworCXJldHVybiByaV9zeXNjYWxsKFNZU19sc2VlaywgZmQsIG9mZnNldCwg d2hlbmNlKTsKK30KKworc3RhdGljIHNzaXplX3QgcmlfcmVhZGxpbmsoY29uc3QgY2hhciogcGF0 aCwgY2hhciogYnVmLCBzaXplX3Qgc2l6ZSkgeworCXJldHVybiByaV9zeXNjYWxsKFNZU19yZWFk bGlua2F0LCBBVF9GRENXRCwgcGF0aCwgYnVmLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQqIHJp X21tYXAodm9pZCogYWRkciwgc2l6ZV90IGxlbmd0aCwgaW50IHByb3QsIGludCBmbGFncywgaW50 IGZkLCBvZmZfdCBvZmZzZXQpIHsKKyNpZmRlZiBTWVNfbW1hcDIKKwlyZXR1cm4gKHZvaWQqKXJp X3N5c2NhbGwoU1lTX21tYXAyLCBhZGRyLCBsZW5ndGgsIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0 L1NZU0NBTExfTU1BUDJfVU5JVCk7CisjZWxzZQorCXJldHVybiAodm9pZCopcmlfc3lzY2FsbChT WVNfbW1hcCwgYWRkciwgbGVuZ3RoLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCk7CisjZW5kaWYK K30KKworc3RhdGljIHZvaWQqIHJpX211bm1hcCh2b2lkKiBhZGRyLCBzaXplX3QgbGVuZ3RoKSB7 CisJcmV0dXJuICh2b2lkKilyaV9zeXNjYWxsKFNZU19tdW5tYXAsIGFkZHIsIGxlbmd0aCk7Cit9 CisKK3N0YXRpYyBpbnQgcmlfbXByb3RlY3Qodm9pZCogYWRkciwgc2l6ZV90IGxlbiwgaW50IHBy b3QpIHsKKwlyZXR1cm4gcmlfc3lzY2FsbChTWVNfbXByb3RlY3QsIGFkZHIsIGxlbiwgcHJvdCk7 Cit9CisKK3N0YXRpYyBzaXplX3Qgcmlfc3RybGVuKGNvbnN0IGNoYXIqIHNyYykgeworCWZvciAo c2l6ZV90IGxlbiA9IDA7OyArK2xlbikgeworCQlpZiAoc3JjW2xlbl0gPT0gJ1wwJykgcmV0dXJu IGxlbjsKKwl9Cit9CisKK3N0YXRpYyBjaGFyKiByaV9zdHJjcHkoY2hhciogZHN0LCBjb25zdCBj aGFyKiBzcmMpIHsKKwljaGFyKiByZXN1bHQgPSBkc3Q7CisJd2hpbGUgKCgqZHN0ID0gKnNyYykg IT0gJ1wwJykgeworCQkrK2RzdDsKKwkJKytzcmM7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisK K3N0YXRpYyBjaGFyKiByaV9zdHJjYXQoY2hhciogZHN0LCBjb25zdCBjaGFyKiBzcmMpIHsKKwly aV9zdHJjcHkoZHN0ICsgcmlfc3RybGVuKGRzdCksIHNyYyk7CisJcmV0dXJuIGRzdDsKK30KKwor c3RhdGljIHZvaWQqIHJpX21lbXNldCh2b2lkKiBkc3QsIGludCB2YWwsIHNpemVfdCBsZW4pIHsK Kwlmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCSgoY2hhciopZHN0KVtpXSA9 IHZhbDsKKwl9CisJcmV0dXJuIGRzdDsKK30KKworX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCitz dGF0aWMgdm9pZCogcmlfbWVtY3B5KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjLCBzaXplX3Qg bGVuKSB7CisJZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkoKGNoYXIqKWRz dClbaV0gPSAoKGNoYXIqKXNyYylbaV07CisJfQorCXJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyBp bnQgcmlfc3RybmNtcChjb25zdCBjaGFyKiB4LCBjb25zdCBjaGFyICp5LCBzaXplX3QgbWF4bGVu KSB7CisJZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKKwkJaWYgKGkgPT0gbWF4bGVuKSByZXR1 cm4gMDsKKwkJaW50IHJlc3VsdCA9ICh1bnNpZ25lZCBjaGFyKXhbaV0gLSAodW5zaWduZWQgY2hh cil5W2ldOworCQlpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CisJCWlmICh4W2ldID09 ICdcMCcpIHJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCByaV9zdHJjbXAoY29uc3QgY2hh ciogeCwgY29uc3QgY2hhciAqeSkgeworCXJldHVybiByaV9zdHJuY21wKHgsIHksIFNJWkVfTUFY KTsKK30KKworc3RhdGljIGNoYXIqIHJpX3N0cnJjaHIoY29uc3QgY2hhciogc3RyLCBpbnQgY2gp IHsKKwljaGFyKiByZXN1bHQgPSBOVUxMOworCXdoaWxlICh0cnVlKSB7CisJCWlmICgqc3RyID09 IGNoKSByZXN1bHQgPSAoY2hhciopc3RyOworCQlpZiAoKnN0ciA9PSAnXDAnKSBicmVhazsKKwkJ KytzdHI7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjaGFyKiByaV9zdHJjaHIo Y29uc3QgY2hhciogc3RyLCBpbnQgY2gpIHsKKwl3aGlsZSAoKnN0cikgeworCQlpZiAoKnN0ciA9 PSBjaCkgcmV0dXJuIChjaGFyKilzdHI7CisJCSsrc3RyOworCX0KKwlyZXR1cm4gTlVMTDsKK30K Kworc3RhdGljIHZvaWQgcmlfZGlybmFtZShjaGFyKiBwYXRoKSB7CisJY2hhciogbGFzdF9zbGFz aCA9IHJpX3N0cnJjaHIocGF0aCwgJy8nKTsKKwlpZiAobGFzdF9zbGFzaCA9PSBOVUxMKSB7CisJ CXBhdGhbMF0gPSAnLic7ICAgLy8gcmV0dXJucyAiLiIKKwkJcGF0aFsxXSA9ICdcMCc7CisJfSBl bHNlIGlmIChsYXN0X3NsYXNoID09IHBhdGgpIHsKKwkJcGF0aFsxXSA9ICdcMCc7ICAvLyByZXR1 cm5zICIvIgorCX0gZWxzZSB7CisJCSpsYXN0X3NsYXNoID0gJ1wwJzsKKwl9Cit9CisKK3N0YXRp YyB2b2lkIG91dF9zdHJfbihjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBuKSB7CisJcmlfd3JpdGUo U1RERVJSX0ZJTEVOTywgc3RyLCBuKTsKK30KKworc3RhdGljIHZvaWQgb3V0X3N0cihjb25zdCBj aGFyKiBzdHIpIHsKKwlvdXRfc3RyX24oc3RyLCByaV9zdHJsZW4oc3RyKSk7Cit9CisKK3N0YXRp YyBjaGFyKiB1bF90b19zdHIodW5zaWduZWQgbG9uZyBpLCBjaGFyKiBvdXQsIHVuc2lnbmVkIGNo YXIgYmFzZSkgeworCWNoYXIgYnVmWzY1XTsKKwljaGFyKiBjdXIgPSAmYnVmWzY1XTsKKwkqLS1j dXIgPSAnXDAnOworCWRvIHsKKwkJKi0tY3VyID0gIjAxMjM0NTY3ODlhYmNkZWYiW2kgJSBiYXNl XTsKKwkJaSAvPSBiYXNlOworCX0gd2hpbGUgKGkgPiAwKTsKKwlyZXR1cm4gcmlfc3RyY3B5KG91 dCwgY3VyKTsKK30KKworc3RhdGljIGNoYXIqIGxfdG9fc3RyKGxvbmcgaSwgY2hhciogb3V0LCB1 bnNpZ25lZCBjaGFyIGJhc2UpIHsKKwlpZiAoaSA8IDApIHsKKwkJKm91dCA9ICctJzsKKwkJdWxf dG9fc3RyKC0odW5zaWduZWQgbG9uZylpLCBvdXQgKyAxLCBiYXNlKTsKKwkJcmV0dXJuIG91dDsK Kwl9IGVsc2UgeworCQlyZXR1cm4gdWxfdG9fc3RyKGksIG91dCwgYmFzZSk7CisJfQorfQorCitz dGF0aWMgY29uc3QgY2hhciogcmlfc3RyZXJyb3IoaW50IGVycikgeworCXN3aXRjaCAoZXJyKSB7 CisJY2FzZSBFUEVSTTogcmV0dXJuICJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCI7CisJY2FzZSBF Tk9FTlQ6IHJldHVybiAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSI7CisJY2FzZSBFSU86IHJl dHVybiAiSS9PIGVycm9yIjsKKwljYXNlIEVOWElPOiByZXR1cm4gIk5vIHN1Y2ggZGV2aWNlIG9y IGFkZHJlc3MiOworCWNhc2UgRUFHQUlOOiByZXR1cm4gIlRyeSBhZ2FpbiI7CisJY2FzZSBFTk9N RU06IHJldHVybiAiT3V0IG9mIG1lbW9yeSI7CisJY2FzZSBFQUNDRVM6IHJldHVybiAiUGVybWlz c2lvbiBkZW5pZWQiOworCWNhc2UgRU5PREVWOiByZXR1cm4gIk5vIHN1Y2ggZGV2aWNlIjsKKwlj YXNlIEVOT1RESVI6IHJldHVybiAiTm90IGEgZGlyZWN0b3J5IjsKKwljYXNlIEVJTlZBTDogcmV0 dXJuICJJbnZhbGlkIGFyZ3VtZW50IjsKKwljYXNlIEVORklMRTogcmV0dXJuICJGaWxlIHRhYmxl IG92ZXJmbG93IjsKKwljYXNlIEVNRklMRTogcmV0dXJuICJUb28gbWFueSBvcGVuIGZpbGVzIjsK KwljYXNlIEVTUElQRTogcmV0dXJuICJJbGxlZ2FsIHNlZWsiOworCWNhc2UgRU5BTUVUT09MT05H OiByZXR1cm4gIkZpbGUgbmFtZSB0b28gbG9uZyI7CisJY2FzZSBFTE9PUDogcmV0dXJuICJUb28g bWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCI7CisJfQorCXN0YXRpYyBjaGFyIGJ1Zls2 NF07CisJcmlfc3RyY3B5KGJ1ZiwgIlVua25vd24gZXJyb3IgIik7CisJbF90b19zdHIoZXJyLCBi dWYgKyByaV9zdHJsZW4oYnVmKSwgMTApOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lk IG91dHYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKSB7CisJY2hhciBidWZbNjVdOworCXdo aWxlICh0cnVlKSB7CisJCWlmIChmbXRbMF0gPT0gJ1wwJykgYnJlYWs7CisKKyNkZWZpbmUgTlVN X0ZNVChudW1fZm10LCB0eXBlLCBmdW5jLCBiYXNlKSAgICAgICAgICAgICAgICAgIFwKKwkJaWYg KCFyaV9zdHJuY21wKGZtdCwgbnVtX2ZtdCwgc2l6ZW9mKG51bV9mbXQpIC0gMSkpIHsgICBcCisJ CQlvdXRfc3RyKGZ1bmModmFfYXJnKGFwLCB0eXBlKSwgYnVmLCBiYXNlKSk7ICAgICAgICAgICBc CisJCQlmbXQgKz0gc2l6ZW9mKG51bV9mbXQpIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisJCX0KKwkJTlVNX0ZNVCgiJWQiLCAgaW50LCAgICAgICAgICAgbF90b19zdHIsICAx MCk7CisJCU5VTV9GTVQoIiVsZCIsIGxvbmcsICAgICAgICAgIGxfdG9fc3RyLCAgMTApOworCQlO VU1fRk1UKCIldSIsICB1bnNpZ25lZCBpbnQsICB1bF90b19zdHIsIDEwKTsKKwkJTlVNX0ZNVCgi JWx1IiwgdW5zaWduZWQgbG9uZywgdWxfdG9fc3RyLCAxMCk7CisJCU5VTV9GTVQoIiV6dSIsIHNp emVfdCwgICAgICAgIHVsX3RvX3N0ciwgMTApOworCQlOVU1fRk1UKCIleCIsICB1bnNpZ25lZCBp bnQsICB1bF90b19zdHIsIDE2KTsKKwkJTlVNX0ZNVCgiJWx4IiwgdW5zaWduZWQgbG9uZywgdWxf dG9fc3RyLCAxNik7CisJCU5VTV9GTVQoIiV6eCIsIHNpemVfdCwgICAgICAgIHVsX3RvX3N0ciwg MTYpOworI3VuZGVmIE5VTV9GTVQKKworCQlpZiAoIXJpX3N0cm5jbXAoZm10LCAiJXAiLCAyKSkg eworCQkJb3V0X3N0cih1bF90b19zdHIoKHVuc2lnbmVkIGxvbmcpdmFfYXJnKGFwLCB2b2lkKiks IGJ1ZiwgMTYpKTsKKwkJCWZtdCArPSAyOworCQl9IGVsc2UgaWYgKCFyaV9zdHJuY21wKGZtdCwg IiVzIiwgMikpIHsKKwkJCWNvbnN0IGNoYXIqIGFyZyA9IHZhX2FyZyhhcCwgY29uc3QgY2hhciop OworCQkJb3V0X3N0cihhcmcgPyBhcmcgOiAiKG51bGwpIik7CisJCQlmbXQgKz0gMjsKKwkJfSBl bHNlIGlmICghcmlfc3RybmNtcChmbXQsICIlJSIsIDIpKSB7CisJCQlvdXRfc3RyKCIlIik7CisJ CQlmbXQgKz0gMjsKKwkJfSBlbHNlIGlmIChmbXRbMF0gPT0gJyUnKSB7CisJCQlidWZbMF0gPSBm bXRbMV07CisJCQlidWZbMV0gPSAnXDAnOworCQkJb3V0X3N0cigicmVsaW50ZXJwIGVycm9yOiB1 bnJlY29nbml6ZWQgb3V0cHV0IHNwZWNpZmllcjogJyUiKTsKKwkJCW91dF9zdHIoYnVmKTsKKwkJ CW91dF9zdHIoIidcbiIpOworCQkJcmlfZXhpdCgxKTsKKwkJfSBlbHNlIHsKKwkJCXNpemVfdCBs ZW4gPSAwOworCQkJd2hpbGUgKGZtdFtsZW5dICE9ICdcMCcgJiYgZm10W2xlbl0gIT0gJyUnKSAr K2xlbjsKKwkJCW91dF9zdHJfbihmbXQsIGxlbik7CisJCQlmbXQgKz0gbGVuOworCQl9CisJfQor fQorCitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpCitzdGF0aWMgdm9pZCBk ZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworCWlmICghZ19kZWJ1ZykgcmV0dXJuOworCW91 dF9zdHIoInJlbGludGVycDogIik7CisKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQp OworCW91dHYoZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlvdXRfc3RyKCJcbiIpOworfQorCitf X2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSwgbm9yZXR1cm4pKQorc3RhdGljIHZv aWQgZmF0YWwoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKwlvdXRfc3RyKCJyZWxpbnRlcnA6ICIp OworCWlmIChnX3Byb2dfbmFtZSkgeworCQlvdXRfc3RyKGdfcHJvZ19uYW1lKTsKKwkJb3V0X3N0 cigiOiAiKTsKKwl9CisJb3V0X3N0cigiZmF0YWwgZXJyb3I6ICIpOworCisJdmFfbGlzdCBhcDsK Kwl2YV9zdGFydChhcCwgZm10KTsKKwlvdXR2KGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJb3V0 X3N0cigiXG4iKTsKKwlyaV9leGl0KDEpOworfQorCitzdGF0aWMgdm9pZCogb3B0aW1pemVyX2Jh cnJpZXIodm9pZCogdmFsKSB7CisJX19hc21fXyB2b2xhdGlsZSAoIm5vcCIgOjogInIiKCZ2YWwp IDogIm1lbW9yeSIpOworCXJldHVybiB2YWw7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNp Z25lZCBsb25nIGtleTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworfSBBdXhFbnRyeTsKKwordHlw ZWRlZiBzdHJ1Y3QgeworCWludCBhcmdjOworCWNoYXIgKiphcmd2OworCWNoYXIgKiplbnZwOwor CXNpemVfdCBlbnZwX2NvdW50OworCUF1eEVudHJ5KiBhdXh2OworCXNpemVfdCBhdXh2X2NvdW50 OworfSBLZXJuZWxBcmd1bWVudHM7CisKK3N0YXRpYyBLZXJuZWxBcmd1bWVudHMgcmVhZF9hcmdz KHZvaWQqIHJhd19hcmdzKSB7CisJS2VybmVsQXJndW1lbnRzIHJlc3VsdDsKKwlyZXN1bHQuYXJn YyA9ICoobG9uZyopcmF3X2FyZ3M7CisJcmVzdWx0LmFyZ3YgPSAoY2hhcioqKSgodm9pZCoqKXJh d19hcmdzICsgMSk7CisJcmVzdWx0LmVudnAgPSByZXN1bHQuYXJndiArIHJlc3VsdC5hcmdjICsg MTsKKworCWNoYXIqKiBlbnZwID0gcmVzdWx0LmVudnA7CisJd2hpbGUgKCplbnZwICE9IE5VTEwp ICsrZW52cDsKKwlyZXN1bHQuZW52cF9jb3VudCA9IGVudnAgLSByZXN1bHQuZW52cDsKKwkrK2Vu dnA7CisKKwlyZXN1bHQuYXV4diA9IChBdXhFbnRyeSopZW52cDsKKwlzaXplX3QgY291bnQgPSAw OworCXdoaWxlIChyZXN1bHQuYXV4dltjb3VudF0ua2V5ICE9IDApIHsKKwkJKytjb3VudDsKKwl9 CisJcmVzdWx0LmF1eHZfY291bnQgPSBjb3VudDsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0 aWMgdm9pZCBkdW1wX2F1eHYoY29uc3QgS2VybmVsQXJndW1lbnRzKiBhcmdzKSB7CisJZm9yIChz aXplX3QgaSA9IDA7IGkgPCBhcmdzLT5hdXh2X2NvdW50OyArK2kpIHsKKwkJY29uc3QgY2hhciog bmFtZSA9ICIiOworCQlzd2l0Y2ggKGFyZ3MtPmF1eHZbaV0ua2V5KSB7CisJCWNhc2UgQVRfQkFT RTogbmFtZSA9ICIgW0FUX0JBU0VdIjsgYnJlYWs7CisJCWNhc2UgQVRfRUdJRDogbmFtZSA9ICIg W0FUX0VHSURdIjsgYnJlYWs7CisJCWNhc2UgQVRfRU5UUlk6IG5hbWUgPSAiIFtBVF9FTlRSWV0i OyBicmVhazsKKwkJY2FzZSBBVF9FVUlEOiBuYW1lID0gIiBbQVRfRVVJRF0iOyBicmVhazsKKwkJ Y2FzZSBBVF9HSUQ6IG5hbWUgPSAiIFtBVF9HSURdIjsgYnJlYWs7CisJCWNhc2UgQVRfUEFHRVNa OiBuYW1lID0gIiBbQVRfUEFHRVNaXSI7IGJyZWFrOworCQljYXNlIEFUX1BIRFI6IG5hbWUgPSAi IFtBVF9QSERSXSI7IGJyZWFrOworCQljYXNlIEFUX1BIRU5UOiBuYW1lID0gIiBbQVRfUEhFTlRd IjsgYnJlYWs7CisJCWNhc2UgQVRfUEhOVU06IG5hbWUgPSAiIFtBVF9QSE5VTV0iOyBicmVhazsK KwkJY2FzZSBBVF9TRUNVUkU6IG5hbWUgPSAiIFtBVF9TRUNVUkVdIjsgYnJlYWs7CisJCWNhc2Ug QVRfU1lTSU5GTzogbmFtZSA9ICIgW0FUX1NZU0lORk9dIjsgYnJlYWs7CisJCWNhc2UgQVRfU1lT SU5GT19FSERSOiBuYW1lID0gIiBbQVRfU1lTSU5GT19FSERSXSI7IGJyZWFrOworCQljYXNlIEFU X1VJRDogbmFtZSA9ICIgW0FUX1VJRF0iOyBicmVhazsKKwkJfQorCQlkZWJ1ZygiICAlbHUgPT4g MHglbHglcyIsIGFyZ3MtPmF1eHZbaV0ua2V5LCBhcmdzLT5hdXh2W2ldLnZhbHVlLCBuYW1lKTsK Kwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJpX2dldGF1eHZhbChjb25zdCBLZXJuZWxB cmd1bWVudHMqIGFyZ3MsIHVuc2lnbmVkIGxvbmcga2luZCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBib29sIGFsbG93X21pc3NpbmcpIHsKKwlmb3IgKHNpemVfdCBpID0gMDsg aSA8IGFyZ3MtPmF1eHZfY291bnQ7ICsraSkgeworCQlpZiAoYXJncy0+YXV4dltpXS5rZXkgPT0g a2luZCkgcmV0dXJuIGFyZ3MtPmF1eHZbaV0udmFsdWU7CisJfQorCWlmICghYWxsb3dfbWlzc2lu ZykgZmF0YWwoImNvdWxkIG5vdCBmaW5kIGF1eCB2ZWN0b3IgZW50cnkgJWx1Iiwga2luZCk7CisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWxmX2ZsYWdzX3RvX3Byb3QoaW50IGZsYWdzKSB7 CisJaW50IHJlc3VsdCA9IDA7CisJaWYgKGZsYWdzICYgUEZfUikgcmVzdWx0IHw9IFBST1RfUkVB RDsKKwlpZiAoZmxhZ3MgJiBQRl9XKSByZXN1bHQgfD0gUFJPVF9XUklURTsKKwlpZiAoZmxhZ3Mg JiBQRl9YKSByZXN1bHQgfD0gUFJPVF9FWEVDOworCXJldHVybiByZXN1bHQ7Cit9CisKK3R5cGVk ZWYgc3RydWN0IHsKKwlpbnQgZmQ7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKK30gT3BlbmVkTG9h ZGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCogYmFzZV9hZGRyOworCUVudHJ5RnVuYyog ZW50cnk7Cit9IExvYWRlZEludGVycDsKKworc3RhdGljIExvYWRlZEludGVycCBsb2FkX2ludGVy cChjb25zdCBPcGVuZWRMb2FkZXIgKmxvYWRlciwgRWxmVyhFaGRyKSogaGRyKSB7CisJRWxmVyhQ aGRyKSogcGhkciA9IChFbGZXKFBoZHIpKikoKGNoYXIqKWhkciArIGhkci0+ZV9waG9mZik7CisJ c2l6ZV90IHBoZHJfY291bnQgPSBoZHItPmVfcGhudW07CisKKwlzaXplX3QgbWF4X3ZhZGRyID0g MDsKKworCS8vIEZpbmQgdGhlIHZpcnR1YWwgYWRkcmVzcyBleHRlbnQuCisJZm9yIChzaXplX3Qg aSA9IDA7IGkgPCBwaGRyX2NvdW50OyArK2kpIHsKKwkJaWYgKHBoZHJbaV0ucF90eXBlID09IFBU X0xPQUQpIHsKKwkJCW1heF92YWRkciA9IFBBR0VfRU5EKE1BWChtYXhfdmFkZHIsIHBoZHJbaV0u cF92YWRkciArIHBoZHJbaV0ucF9tZW1zeikpOworCQl9CisJfQorCisJLy8gTWFwIGFuIGFyZWEg dG8gZml0IHRoZSBsb2FkZXIuCisJdm9pZCogbG9hZGVyX3ZhZGRyID0gcmlfbW1hcChOVUxMLCBt YXhfdmFkZHIsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKKwlpZiAobG9hZGVy X3ZhZGRyID09ICh2b2lkKilNQVBfRkFJTEVEKSB7CisJCWZhdGFsKCJyZXNlcnZhdGlvbiBtbWFw IG9mIDB4JXp4IGJ5dGVzIGZvciAlcyBmYWlsZWQ6ICVzIiwgbWF4X3ZhZGRyLCBsb2FkZXItPnBh dGgsCisJCSAgICAgIHJpX3N0cmVycm9yKGdfZXJybm8pKTsKKwl9CisKKwkvLyBNYXAgZWFjaCBQ VF9MT0FELgorCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGhkcl9jb3VudDsgKytpKSB7CisJCWlm IChwaGRyW2ldLnBfdHlwZSA9PSBQVF9MT0FEKSB7CisJCQlzaXplX3Qgc3RhcnQgPSBQQUdFX1NU QVJUKHBoZHJbaV0ucF92YWRkcik7CisJCQljb25zdCBzaXplX3QgZW5kID0gUEFHRV9FTkQocGhk cltpXS5wX3ZhZGRyICsgcGhkcltpXS5wX21lbXN6KTsKKwkJCWlmIChwaGRyW2ldLnBfZmlsZXN6 ID4gMCkgeworCQkJCWNvbnN0IHNpemVfdCBmaWxlX2VuZCA9IHBoZHJbaV0ucF92YWRkciArIHBo ZHJbaV0ucF9maWxlc3o7CisJCQkJdm9pZCogdG1wID0gcmlfbW1hcCgoY2hhciopbG9hZGVyX3Zh ZGRyICsgc3RhcnQsCisJCQkJICAgICAgICAgICAgICAgICAgICBmaWxlX2VuZCAtIHN0YXJ0LAor CQkJCSAgICAgICAgICAgICAgICAgICAgZWxmX2ZsYWdzX3RvX3Byb3QocGhkcltpXS5wX2ZsYWdz KSwKKwkJCQkgICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBsb2Fk ZXItPmZkLCBQQUdFX1NUQVJUKHBoZHJbaV0ucF9vZmZzZXQpKTsKKwkJCQlpZiAodG1wID09ICh2 b2lkKilNQVBfRkFJTEVEKSB7CisJCQkJCWZhdGFsKCJQVF9MT0FEIG1tYXAgZmFpbGVkICglcyBz ZWdtZW50ICMlenUpOiAlcyIsIGxvYWRlci0+cGF0aCwgaSwKKwkJCQkJICAgICAgcmlfc3RyZXJy b3IoZ19lcnJubykpOworCQkJCX0KKwkJCQlzdGFydCA9IGZpbGVfZW5kOworCQkJCWlmIChwaGRy W2ldLnBfZmxhZ3MgJiBQRl9XKSB7CisJCQkJCS8vIFRoZSBieXRlcyBiZXR3ZWVuIHBfZmlsZXN6 IGFuZCBQQUdFX0VORChwX2ZpbGVzeikgY3VycmVudGx5IGNvbWUgZnJvbSB0aGUgZmlsZSBtYXBw aW5nLAorCQkJCQkvLyBidXQgdGhleSBuZWVkIHRvIGJlIHplcm9lZC4gKEFwcGFyZW50bHkgdGhp cyB6ZXJvaW5nIGlzbid0IG5lY2Vzc2FyeSBpZiB0aGUgc2VnbWVudCBpc24ndAorCQkJCQkvLyB3 cml0YWJsZSwgYW5kIHplcm9pbmcgYSBub24td3JpdGFibGUgcGFnZSB3b3VsZCBiZSBpbmNvbnZl bmllbnQuKQorCQkJCQlyaV9tZW1zZXQoKGNoYXIqKWxvYWRlcl92YWRkciArIHN0YXJ0LCAnXDAn LCBQQUdFX0VORChzdGFydCkgLSBzdGFydCk7CisJCQkJfQorCQkJCXN0YXJ0ID0gUEFHRV9FTkQo c3RhcnQpOworCQkJfQorCQkJaWYgKHN0YXJ0IDwgZW5kKSB7CisJCQkJLy8gVGhlIG1lbW9yeSBp cyBhbHJlYWR5IHplcm9lZCwgYmVjYXVzZSBpdCBjb21lcyBmcm9tIGFuIGFub255bW91cyBmaWxl IG1hcHBpbmcuIEp1c3Qgc2V0CisJCQkJLy8gdGhlIHByb3RlY3Rpb25zIGNvcnJlY3RseS4KKwkJ CQlpbnQgcmVzdWx0ID0gcmlfbXByb3RlY3QoKGNoYXIqKWxvYWRlcl92YWRkciArIHN0YXJ0LCBl bmQgLSBzdGFydCwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgZWxmX2ZsYWdzX3RvX3By b3QocGhkcltpXS5wX2ZsYWdzKSk7CisJCQkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQkJCWZhdGFs KCJtcHJvdGVjdCBvZiBQVF9MT0FEIGZhaWxlZCAoJXMgc2VnbWVudCAjJXp1KTogJXMiLCBsb2Fk ZXItPnBhdGgsIGksCisJCQkJCSAgICAgIHJpX3N0cmVycm9yKGdfZXJybm8pKTsKKwkJCQl9CisJ CQl9CisJCX0KKwl9CisKKwlyZXR1cm4gKExvYWRlZEludGVycCkgeworCQkuYmFzZV9hZGRyID0g bG9hZGVyX3ZhZGRyLAorCQkuZW50cnkgPSAoRW50cnlGdW5jKikoKHVpbnRwdHJfdClsb2FkZXJf dmFkZHIgKyBoZHItPmVfZW50cnkpLAorCX07Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKwlFbGZX KFBoZHIpKiBwaGRyOworCXNpemVfdCBwaGRyX2NvdW50OworCXVpbnRwdHJfdCBsb2FkX2JpYXM7 CisJdWludHB0cl90IHBhZ2Vfc2l6ZTsKKwljaGFyKiBzZWFyY2hfcGF0aHM7CisJRWxmVyhFaGRy KSogZWhkcjsKKwlFbGZXKFBoZHIpKiBmaXJzdF9sb2FkOworCWJvb2wgc2VjdXJlOworfSBFeGVJ bmZvOworCitzdGF0aWMgRXhlSW5mbyBnZXRfZXhlX2luZm8oY29uc3QgS2VybmVsQXJndW1lbnRz KiBhcmdzKSB7CisJRXhlSW5mbyByZXN1bHQgPSB7IDAgfTsKKwlyZXN1bHQucGhkciA9IChFbGZX KFBoZHIpKilyaV9nZXRhdXh2YWwoYXJncywgQVRfUEhEUiwgZmFsc2UpOworCXJlc3VsdC5waGRy X2NvdW50ID0gcmlfZ2V0YXV4dmFsKGFyZ3MsIEFUX1BITlVNLCBmYWxzZSk7CisJcmVzdWx0LnBh Z2Vfc2l6ZSA9IHJpX2dldGF1eHZhbChhcmdzLCBBVF9QQUdFU1osIGZhbHNlKTsKKworCXVuc2ln bmVkIGxvbmcgdWlkID0gcmlfZ2V0YXV4dmFsKGFyZ3MsIEFUX1VJRCwgZmFsc2UpOworCXVuc2ln bmVkIGxvbmcgZXVpZCA9IHJpX2dldGF1eHZhbChhcmdzLCBBVF9FVUlELCBmYWxzZSk7CisJdW5z aWduZWQgbG9uZyBnaWQgPSByaV9nZXRhdXh2YWwoYXJncywgQVRfR0lELCBmYWxzZSk7CisJdW5z aWduZWQgbG9uZyBlZ2lkID0gcmlfZ2V0YXV4dmFsKGFyZ3MsIEFUX0VHSUQsIGZhbHNlKTsKKwl1 bnNpZ25lZCBsb25nIHNlY3VyZSA9IHJpX2dldGF1eHZhbChhcmdzLCBBVF9TRUNVUkUsIHRydWUp OworCXJlc3VsdC5zZWN1cmUgPSB1aWQgIT0gZXVpZCB8fCBnaWQgIT0gZWdpZCB8fCBzZWN1cmU7 CisKKwlkZWJ1Zygib3JpZyBwaGRyICAgICA9ICVwIiwgKHZvaWQqKXJlc3VsdC5waGRyKTsKKwlk ZWJ1Zygib3JpZyBwaG51bSAgICA9ICV6dSIsIHJlc3VsdC5waGRyX2NvdW50KTsKKworCWZvciAo c2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0LnBoZHJfY291bnQ7ICsraSkgeworCQlpZiAocmVzdWx0 LnBoZHJbaV0ucF90eXBlID09IFBUX0RZTkFNSUMpIHsKKwkJCXJlc3VsdC5sb2FkX2JpYXMgPSAo dWludHB0cl90KSZfRFlOQU1JQyAtIHJlc3VsdC5waGRyW2ldLnBfdmFkZHI7CisJCX0KKwl9CisJ ZGVidWcoImxvYWRfYmlhcyAgICAgPSAweCVseCIsICh1bnNpZ25lZCBsb25nKXJlc3VsdC5sb2Fk X2JpYXMpOworCisJZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHQucGhkcl9jb3VudDsgKytp KSB7CisJCUVsZlcoUGhkcikqIHBoZHIgPSAmcmVzdWx0LnBoZHJbaV07CisJCWlmIChwaGRyLT5w X3R5cGUgIT0gUFRfTE9BRCkgY29udGludWU7CisJCXJlc3VsdC5maXJzdF9sb2FkID0gcGhkcjsK KwkJaWYgKHBoZHItPnBfb2Zmc2V0ICE9IDApIHsKKwkJCWZhdGFsKCJleHBlY3RlZCB6ZXJvIHBf b2Zmc2V0IGZvciBmaXJzdCBQVF9MT0FELCBmb3VuZCAweCV6eCBpbnN0ZWFkIiwKKwkJCSAgICAg IChzaXplX3QpcGhkci0+cF9vZmZzZXQpOworCQl9CisJCXJlc3VsdC5laGRyID0gKEVsZlcoRWhk cikqKShwaGRyLT5wX3ZhZGRyICsgcmVzdWx0LmxvYWRfYmlhcyk7CisJCWJyZWFrOworCX0KKwlk ZWJ1ZygiZWhkciAgICAgICAgICA9ICVwIiwgKHZvaWQqKXJlc3VsdC5laGRyKTsKKworCUVsZlco V29yZCkgcnVucGF0aF9vZmZzZXQgPSAtMTsKKwljaGFyKiBzdHJ0YWIgPSBOVUxMOworCWZvciAo RWxmVyhEeW4pKiBkeW4gPSBfRFlOQU1JQzsgZHluLT5kX3RhZyAhPSBEVF9OVUxMOyBkeW4rKykg eworCQlzd2l0Y2ggKGR5bi0+ZF90YWcpIHsKKwkJY2FzZSBEVF9SVU5QQVRIOgorCQkJcnVucGF0 aF9vZmZzZXQgPSBkeW4tPmRfdW4uZF92YWw7CisJCQlicmVhazsKKwkJY2FzZSBEVF9SUEFUSDoK KwkJCWlmIChydW5wYXRoX29mZnNldCA9PSAtMSkgcnVucGF0aF9vZmZzZXQgPSBkeW4tPmRfdW4u ZF92YWw7CisJCQlicmVhazsKKwkJY2FzZSBEVF9TVFJUQUI6CisJCQlzdHJ0YWIgPSAoY2hhciop KGR5bi0+ZF91bi5kX3B0ciArIHJlc3VsdC5sb2FkX2JpYXMpOworCQkJYnJlYWs7CisJCX0KKwl9 CisKKwlpZiAoc3RydGFiICYmIHJ1bnBhdGhfb2Zmc2V0ICE9IC0xKSB7CisJCXJlc3VsdC5zZWFy Y2hfcGF0aHMgPSBzdHJ0YWIgKyBydW5wYXRoX29mZnNldDsKKwkJZGVidWcoImR0X3J1bnBhdGgg ICAgPSAlcyIsIHJlc3VsdC5zZWFyY2hfcGF0aHMpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQor CisvLyBMb2FkZXJzIHR5cGljYWxseSByZWFkIHRoZSBQVF9JTlRFUlAgb2YgdGhlIGV4ZWN1dGFi bGUsIGUuZy4gdG8gc2V0IGEgcGF0aG5hbWUgb24gdGhlIGxvYWRlci4KKy8vIGdsaWJjIGluc2lz dHMgb24gdGhlIGV4ZWN1dGFibGUgaGF2aW5nIFBUX0lOVEVSUCwgYW5kIGFib3J0cyBpZiBpdCdz IG1pc3NpbmcuICBNdXNsIHBhc3NlcyBpdAorLy8gdG8gZGVidWdnZXJzIHRvIGZpbmQgc3ltYm9s cyBmb3IgdGhlIGxvYWRlciwgd2hpY2ggaW5jbHVkZXMgYWxsIHRoZSBsaWJjIHN5bWJvbHMuCisv LworLy8gTWFrZSBhIGNvcHkgb2YgdGhlIHBoZHIgdGFibGUgYW5kIGluc2VydCBQVF9JTlRFUlAg aW50byB0aGUgY29weS4KKy8vCitzdGF0aWMgdm9pZCBpbnNlcnRfcHRfaW50ZXJwX2ludG9fcGhk cl90YWJsZShjb25zdCBLZXJuZWxBcmd1bWVudHMqIGFyZ3MsIGNvbnN0IEV4ZUluZm8qIGV4ZSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIq IGxvYWRlcl9yZWFscGF0aCkgeworCS8vIFJlc2VydmUgZXh0cmEgc3BhY2UgZm9yIHRoZSBpbnNl cnRlZCBQVF9QSERSIGFuZCBQVF9JTlRFUlAgc2VnbWVudHMgYW5kIGEgbnVsbCB0ZXJtaW5hdG9y LgorCWlmIChleGUtPnBoZHJfY291bnQgKyAzID4gc2l6ZW9mKHJlcGxhY2VtZW50X3BoZHJfdGFi bGUpIC8gc2l6ZW9mKHJlcGxhY2VtZW50X3BoZHJfdGFibGVbMF0pKSB7CisJCWZhdGFsKCJ0b28g bWFueSBwaGRyIHRhYmxlIGVudHJpZXMgaW4gZXhlY3V0YWJsZSIpOworCX0KKworCUVsZlcoUGhk cikgbmV3UGhkciA9IHsKKwkJLnBfdHlwZSA9IFBUX1BIRFIsCisJCS8vIFRoZSByZXBsYWNlbWVu dCBwaGRyIGlzIGluIHRoZSBCU1Mgc2VjdGlvbiwgd2hpY2ggaGFzIG5vIGZpbGUgbG9jYXRpb24u CisJCS8vIFVzZSAwIGZvciB0aGUgb2Zmc2V0LiAgSWYgdGhpcyBjYXVzZXMgYSBwcm9ibGVtIHRo ZSByZXBsYWNlbWVudCBwaGRyIGNvdWxkCisJCS8vIGJlIG1vdmVkIHRvIHRoZSBkYXRhIHNlY3Rp b24gYW5kIHRoZSBjb3JyZWN0IHBfb2Zmc2V0IGNhbGN1bGF0ZWQuCisJCS5wX29mZnNldCA9IDAs CisJCS5wX3ZhZGRyID0gKHVpbnRwdHJfdCkmcmVwbGFjZW1lbnRfcGhkcl90YWJsZSAtIGV4ZS0+ bG9hZF9iaWFzLAorCQkucF9wYWRkciA9ICh1aW50cHRyX3QpJnJlcGxhY2VtZW50X3BoZHJfdGFi bGUgLSBleGUtPmxvYWRfYmlhcywKKwkJLnBfbWVtc3ogPSAoZXhlLT5waGRyX2NvdW50ICsgMSkg KiBzaXplb2YoRWxmVyhQaGRyKSksCisJCS5wX2ZpbGVzeiA9IChleGUtPnBoZHJfY291bnQgKyAx KSAqIHNpemVvZihFbGZXKFBoZHIpKSwKKwkJLnBfZmxhZ3MgPSBQRl9SLAorCQkucF9hbGlnbiA9 IGFsaWdub2YoRWxmVyhQaGRyKSksCisJfTsKKworCUVsZlcoUGhkciopIGN1ciA9IHJlcGxhY2Vt ZW50X3BoZHJfdGFibGU7CisJaWYgKGV4ZS0+cGhkclswXS5wX3R5cGUgIT0gUFRfUEhEUikgewor CQkvLyBsZC5iZmQgZG9lcyBub3QgaW5zZXJ0IGEgUFRfUEhEUiBpZiB0aGVyZSBpcyBubyBQVF9J TlRFUlAsIGZha2Ugb25lLgorCQkvLyBJdCBoYXMgdG8gYmUgZmlyc3QuICBXZSdyZSBhZGRpbmcg YW4gZW50cnkgc28gaW5jcmVhc2UgbWVtc3ogYW5kIGZpbGVzei4KKwkJbmV3UGhkci5wX21lbXN6 ICs9IHNpemVvZihFbGZXKFBoZHIpKTsKKwkJbmV3UGhkci5wX2ZpbGVzeiArPSBzaXplb2YoRWxm VyhQaGRyKSk7CisJCSpjdXIgPSBuZXdQaGRyOworCQkrK2N1cjsKKwl9CisKKwlmb3IgKHNpemVf dCBpID0gMDsgaSA8IGV4ZS0+cGhkcl9jb3VudDsgKytpKSB7CisJCXN3aXRjaCAoZXhlLT5waGRy W2ldLnBfdHlwZSkgeworCQljYXNlIDA6CisJCQlmYXRhbCgidW5leHBlY3RlZCBudWxsIHBoZHIg ZW50cnkgYXQgaW5kZXggJXp1IiwgaSk7CisJCQlicmVhazsKKwkJY2FzZSBQVF9QSERSOgorCQkJ KmN1ciA9IG5ld1BoZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSpjdXIgPSBleGUtPnBo ZHJbaV07CisJCX0KKwkJKytjdXI7CisJfQorCisJLy8gSW5zZXJ0IFBUX0lOVEVSUCBhdCB0aGUg ZW5kLgorCWN1ci0+cF90eXBlID0gUFRfSU5URVJQOworCWN1ci0+cF9vZmZzZXQgPSAwOworCWN1 ci0+cF92YWRkciA9ICh1aW50cHRyX3QpJnJlcGxhY2VtZW50X2ludGVycCAtIGV4ZS0+bG9hZF9i aWFzOworCWN1ci0+cF9wYWRkciA9IGN1ci0+cF92YWRkcjsKKwljdXItPnBfZmlsZXN6ID0gcmlf c3RybGVuKHJlcGxhY2VtZW50X2ludGVycCkgKyAxOworCWN1ci0+cF9tZW1zeiA9IHJpX3N0cmxl bihyZXBsYWNlbWVudF9pbnRlcnApICsgMTsKKwljdXItPnBfZmxhZ3MgPSBQRl9SOworCWN1ci0+ cF9hbGlnbiA9IDE7CisJKytjdXI7CisKKwlyaV9zdHJjcHkocmVwbGFjZW1lbnRfaW50ZXJwLCBs b2FkZXJfcmVhbHBhdGgpOworCisJZGVidWcoIm5ldyBwaGRyICAgICAgPSAlcCIsICh2b2lkKikm cmVwbGFjZW1lbnRfcGhkcl90YWJsZSk7CisJZGVidWcoIm5ldyBwaG51bSAgICAgPSAlenUiLCBj dXIgLSByZXBsYWNlbWVudF9waGRyX3RhYmxlKTsKKworCS8vIFVwZGF0ZSB0aGUgYXV4IHZlY3Rv ciB3aXRoIHRoZSBuZXcgcGhkcitwaG51bS4KKwlmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3Mt PmF1eHZfY291bnQ7ICsraSkgeworCQlpZiAoYXJncy0+YXV4dltpXS5rZXkgPT0gQVRfUEhEUikg eworCQkJYXJncy0+YXV4dltpXS52YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZyZXBsYWNlbWVudF9w aGRyX3RhYmxlOworCQl9IGVsc2UgaWYgKGFyZ3MtPmF1eHZbaV0ua2V5ID09IEFUX1BITlVNKSB7 CisJCQlhcmdzLT5hdXh2W2ldLnZhbHVlID0gY3VyIC0gcmVwbGFjZW1lbnRfcGhkcl90YWJsZTsK KwkJfQorCX0KKworCS8vIEFUX1BIRFIgYW5kIEFUX1BITlVNIGFyZSBub3cgdXBkYXRlZCB0byBw b2ludCB0byB0aGUgcmVwbGFjZW1lbnQgcHJvZ3JhbQorCS8vIGhlYWRlcnMsIGJ1dCB0aGUgZV9w aG9mZiBhbmQgZV9waG51bSBpbiB0aGUgRUxGIGhlYWRlcnMgc3RpbGwgcG9pbnQgdG8gdGhlCisJ Ly8gb3JpZ2luYWwgcHJvZ3JhbSBoZWFkZXJzLiAgZHlubGluay5jIGRvZXNuJ3QgdXNlIGVfcGhv ZmYgdmFsdWUgZnJvbSB0aGUKKwkvLyBtYWluIGFwcGxpY2F0aW9uJ3MgcHJvZ3JhbSBoZWFkZXJz LiAgVGhlIGVfcGhvZmYgYW5kIGVfcGhudW0gdmFsdWVzIGNvdWxkCisJLy8gYmUgdXBkYXRlZCwg YnV0IHRoYXQgd291bGQgcmVxdWlyZSB1c2luZyBtcHJvdGVjdCB0byBhbGxvdyBtb2RpZmljYXRp b25zCisJLy8gdG8gdGhlIHJlYWQtb25seSBmaXJzdCBwYWdlLgorfQorCitzdGF0aWMgdm9pZCBy ZWFscGF0aF9mZChpbnQgZmQsIGNvbnN0IGNoYXIqIG9yaWdfcGF0aCwgY2hhciogb3V0LCBzaXpl X3QgbGVuKSB7CisJY2hhciBwYXRoWzY0XTsKKwlyaV9zdHJjcHkocGF0aCwgIi9wcm9jL3NlbGYv ZmQvIik7CisJdWxfdG9fc3RyKGZkLCBwYXRoICsgcmlfc3RybGVuKHBhdGgpLCAxMCk7CisJc3Np emVfdCByZXN1bHQgPSByaV9yZWFkbGluayhwYXRoLCBvdXQsIGxlbik7CisJaWYgKHJlc3VsdCA9 PSAtMSkgZmF0YWwoImNvdWxkIG5vdCBnZXQgcmVhbHBhdGggb2YgJXM6ICVzIiwgb3JpZ19wYXRo LCByaV9zdHJlcnJvcihnX2Vycm5vKSk7CisJaWYgKChzaXplX3QpcmVzdWx0ID49IGxlbikgZmF0 YWwoInJlYWxwYXRoIG9mICVzIHRvbyBsb25nIiwgb3JpZ19wYXRoKTsKK30KKworc3RhdGljIGlu dCBvcGVuX2xvYWRlcihjb25zdCBjaGFyKiBwYXRoLCBPcGVuZWRMb2FkZXIqIGxvYWRlcikgewor CWRlYnVnKCJ0cnlpbmcgdG8gb3BlbiAnJXMnIiwgcGF0aCk7CisJbG9hZGVyLT5mZCA9IHJpX29w ZW4ocGF0aCwgT19SRE9OTFksIDApOworCWlmIChsb2FkZXItPmZkIDwgMCkgeworCQlkZWJ1Zygi Y291bGQgbm90IG9wZW4gbG9hZGVyICVzOiAlcyIsIHBhdGgsIHJpX3N0cmVycm9yKGdfZXJybm8p KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlYWxwYXRoX2ZkKGxvYWRlci0+ZmQsIHBhdGgsIGxv YWRlci0+cGF0aCwgc2l6ZW9mKGxvYWRlci0+cGF0aCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgb3Blbl9yZWxfbG9hZGVyKGNvbnN0IGNoYXIqIGRpciwgY29uc3QgY2hhciogcmVs LCBPcGVuZWRMb2FkZXIqIGxvYWRlcikgeworCWNoYXIgYnVmW1BBVEhfTUFYXTsKKworCXNpemVf dCBkaXJfbGVuID0gcmlfc3RybGVuKGRpcik7CisKKwlpZiAoZGlyX2xlbiArIChkaXJfbGVuID09 IDAgPyAxIDogMCkgKyByaV9zdHJsZW4ocmVsKSArIDIgPiBzaXplb2YoYnVmKSkgeworCQlkZWJ1 ZygicGF0aCB0byBsb2FkZXIgZXhjZWVkcyBQQVRIX01BWDogJXMvJXMiLCBkaXIsIHJlbCk7CisJ CXJldHVybiAxOworCX0KKworCWlmIChkaXJfbGVuID09IDApIHsKKwkJcmlfc3RyY3B5KGJ1Ziwg Ii4iKTsKKwl9IGVsc2UgeworCQlyaV9zdHJjcHkoYnVmLCBkaXIpOworCQlpZiAoZGlyW2Rpcl9s ZW4tMV0gIT0gJy8nKSB7CisJCQlyaV9zdHJjYXQoYnVmLCAiLyIpOworCQl9CisJfQorCXJpX3N0 cmNhdChidWYsIHJlbCk7CisKKwlyZXR1cm4gb3Blbl9sb2FkZXIoYnVmLCBsb2FkZXIpOworfQor CitzdGF0aWMgdm9pZCBnZXRfb3JpZ2luKGNoYXIqIGJ1Ziwgc2l6ZV90IGJ1Zl9sZW4pIHsKKwlz c2l6ZV90IGxlbiA9IHJpX3JlYWRsaW5rKCIvcHJvYy9zZWxmL2V4ZSIsIGJ1ZiwgYnVmX2xlbik7 CisJaWYgKGxlbiA8PSAwIHx8IChzaXplX3QpbGVuID49IGJ1Zl9sZW4pIHsKKwkJZmF0YWwoImNv dWxkIG5vdCByZWFkbGluayAvcHJvYy9zZWxmL2V4ZTogJXMiLCByaV9zdHJlcnJvcihnX2Vycm5v KSk7CisJfQorCWJ1ZltsZW5dID0gJ1wwJzsKKworCXJpX2Rpcm5hbWUoYnVmKTsKK30KKworc3Rh dGljIGludCBzZWFyY2hfcGF0aF9saXN0X2Zvcl9sb2FkZXIoY29uc3QgY2hhciogbG9hZGVyX3Jl bF9wYXRoLCBjb25zdCBjaGFyKiBzZWFyY2hfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNlYXJjaF9wYXRoX25hbWUsIGJvb2wgZXhwYW5k X29yaWdpbiwgT3BlbmVkTG9hZGVyICpsb2FkZXIpIHsKKwljaGFyIG9yaWdpbl9idWZbUEFUSF9N QVhdOworCWNoYXIqIG9yaWdpbiA9IE5VTEw7CisKKwljb25zdCBjaGFyKiBwID0gc2VhcmNoX3Bh dGg7CisJd2hpbGUgKHAgJiYgcFswXSkgeworCQljb25zdCBjaGFyKiBzdGFydCA9IHA7CisJCWNv bnN0IGNoYXIqIGVuZCA9IHJpX3N0cmNocihwLCAnOicpOworCQlpZiAoZW5kID09IE5VTEwpIHsK KwkJCWVuZCA9IHN0YXJ0ICsgcmlfc3RybGVuKHApOworCQkJcCA9IE5VTEw7CisJCX0gZWxzZSB7 CisJCQlwID0gZW5kICsgMTsKKwkJfQorCQlzaXplX3QgbiA9IGVuZCAtIHN0YXJ0OworCQljaGFy IHNlYXJjaF9wYXRoX2VudHJ5W1BBVEhfTUFYXTsKKwkJaWYgKG4gPj0gc2l6ZW9mKHNlYXJjaF9w YXRoX2VudHJ5KSkgeworCQkJLy8gVG9vIGxvbmcsIHNraXAuCisJCQlkZWJ1ZygiJXMgZW50cnkg dG9vIGxvbmc6ICVzIiwgc2VhcmNoX3BhdGhfbmFtZSwgc3RhcnQpOworCQkJY29udGludWU7CisJ CX0KKworCQlyaV9tZW1jcHkoc2VhcmNoX3BhdGhfZW50cnksIHN0YXJ0LCBuKTsKKwkJc2VhcmNo X3BhdGhfZW50cnlbbl0gPSAnXDAnOworCisJCWNoYXIgYnVmW1BBVEhfTUFYXTsKKwkJY2hhciog ZCA9IE5VTEw7CisJCWlmIChleHBhbmRfb3JpZ2luKSB7CisJCQlkID0gcmlfc3RyY2hyKHNlYXJj aF9wYXRoX2VudHJ5LCAnJCcpOworCQl9CisJCWlmIChkICYmICghcmlfc3RybmNtcChkLCAiJE9S SUdJTiIsIDcpIHx8ICFyaV9zdHJuY21wKGQsICIke09SSUdJTn0iLCA5KSkpIHsKKwkJCWlmICgh b3JpZ2luKSB7CisJCQkJZ2V0X29yaWdpbihvcmlnaW5fYnVmLCBzaXplb2Yob3JpZ2luX2J1Zikp OworCQkJCW9yaWdpbiA9IG9yaWdpbl9idWY7CisJCQl9CisKKwkJCXNpemVfdCBzID0gNzsKKwkJ CWlmIChkWzFdID09ICd7JykgeworCQkJCXMgKz0gMjsKKwkJCX0KKwkJCXJpX21lbWNweShidWYs IHNlYXJjaF9wYXRoX2VudHJ5LCBkIC0gc2VhcmNoX3BhdGhfZW50cnkpOworCQkJYnVmW2QgLSBz ZWFyY2hfcGF0aF9lbnRyeV0gPSAnXDAnOworCQkJaWYgKHJpX3N0cmxlbihidWYpICsgcmlfc3Ry bGVuKG9yaWdpbikgKyByaV9zdHJsZW4oZCtzKSA+PSBzaXplb2YoYnVmKSkgeworCQkJCWRlYnVn KCJwYXRoIHRvIGxvYWRlciAlcyVzJXMgdG9vIGxvbmciLCBidWYsIG9yaWdpbiwgZCtzKTsKKwkJ CQljb250aW51ZTsKKwkJCX0KKworCQkJcmlfc3RyY2F0KGJ1Ziwgb3JpZ2luKTsKKwkJCXJpX3N0 cmNhdChidWYsIGQrcyk7CisJCQlkZWJ1ZygidHJ5aW5nIGxvYWRlciAlcyBhdCAlcyIsIGxvYWRl cl9yZWxfcGF0aCwgYnVmKTsKKwkJfSBlbHNlIHsKKwkJCXJpX3N0cmNweShidWYsIHNlYXJjaF9w YXRoX2VudHJ5KTsKKwkJfQorCQlpZiAoIW9wZW5fcmVsX2xvYWRlcihidWYsIGxvYWRlcl9yZWxf cGF0aCwgbG9hZGVyKSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9 CisKK3N0YXRpYyBpbnQgZmluZF9hbmRfb3Blbl9sb2FkZXIoY29uc3QgRXhlSW5mbyogZXhlLCBj b25zdCBjaGFyKiBsZF9saWJyYXJ5X3BhdGgsIE9wZW5lZExvYWRlciogbG9hZGVyKSB7CisJY29u c3QgY2hhciogbG9hZGVyX3JlbF9wYXRoID0gTE9BREVSX1BBVEg7CisKKwlpZiAobG9hZGVyX3Jl bF9wYXRoWzBdID09ICcvJykgeworCQlyZXR1cm4gb3Blbl9sb2FkZXIobG9hZGVyX3JlbF9wYXRo LCBsb2FkZXIpOworCX0KKworCWlmIChleGUtPnNlY3VyZSkgeworCQlmYXRhbCgicmVsaW50ZXJw IG5vdCBzdXBwb3J0ZWQgZm9yIHNlY3VyZSBleGVjdXRhYmxlcyIpOworCX0KKworCWlmICghc2Vh cmNoX3BhdGhfbGlzdF9mb3JfbG9hZGVyKGxvYWRlcl9yZWxfcGF0aCwgbGRfbGlicmFyeV9wYXRo LCAiTERfTElCUkFSWV9QQVRIIiwgZmFsc2UsIGxvYWRlcikpIHsKKwkJcmV0dXJuIDA7CisJfQor CisJaWYgKCFleGUtPnNlYXJjaF9wYXRocyB8fCByaV9zdHJsZW4oZXhlLT5zZWFyY2hfcGF0aHMp ID09IDApIHsKKwkJLy8gSWYgbm8gRFRfUlVOUEFUSCBzZWFyY2ggcmVsYXRpdmUgdG8gdGhlIGV4 ZS4KKwkJY2hhciBvcmlnaW5bUEFUSF9NQVhdOworCQlnZXRfb3JpZ2luKG9yaWdpbiwgc2l6ZW9m KG9yaWdpbikpOworCQlyZXR1cm4gb3Blbl9yZWxfbG9hZGVyKG9yaWdpbiwgbG9hZGVyX3JlbF9w YXRoLCBsb2FkZXIpOworCX0KKworCWlmICghc2VhcmNoX3BhdGhfbGlzdF9mb3JfbG9hZGVyKGxv YWRlcl9yZWxfcGF0aCwgZXhlLT5zZWFyY2hfcGF0aHMsICJycGF0aCIsIHRydWUsIGxvYWRlcikp IHsKKwkJcmV0dXJuIDA7CisJfQorCisJZmF0YWwoInVuYWJsZSB0byBmaW5kIGxvYWRlciAlcyBp biBycGF0aCAlcyIsIGxvYWRlcl9yZWxfcGF0aCwgZXhlLT5zZWFyY2hfcGF0aHMpOworfQorCisv LyBVc2UgYSB0cmljayB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZXhlY3V0YWJsZSBoYXMgYmVl biByZWxvY2F0ZWQgeWV0LiBUaGlzIHZhcmlhYmxlIHBvaW50cyB0bworLy8gYSB2YXJpYWJsZSBp biBsaWJjLiBJdCB3aWxsIGJlIE5VTEwgaWYgYW5kIG9ubHkgaWYgdGhlIHByb2dyYW0gaGFzbid0 IGJlZW4gbGlua2VkIHlldC4gVGhpcworLy8gc2hvdWxkIGFjY29tbW9kYXRlIHRoZXNlIHNpdHVh dGlvbnM6CisvLyAgLSBUaGUgcHJvZ3JhbSB3YXMgYWN0dWFsbHkgc3RhdGljYWxseS1saW5rZWQg aW5zdGVhZC4KKy8vICAtIEVpdGhlciBhIFBJRSBvciBub24tUElFIGR5bmFtaWMgZXhlY3V0YWJs ZS4KKy8vICAtIEFueSBzaXR1YXRpb24gd2hlcmUgdGhlIGxvYWRlciBjYWxscyB0aGUgZXhlY3V0 YWJsZSdzIF9zdGFydDoKKy8vICAgICAtIEluIG5vcm1hbCBvcGVyYXRpb24sIHRoZSBrZXJuZWwg Y2FsbHMgdGhlIGV4ZWN1dGFibGUncyBfc3RhcnQsIF9zdGFydCBqdW1wcyB0byB0aGUgbG9hZGVy J3MKKy8vICAgICAgIGVudHJ5IHBvaW50LCB3aGljaCBqdW1wcyB0byBfc3RhcnQgYWdhaW4gYWZ0 ZXIgbGlua2luZyBpdC4KKy8vICAgICAtIFRoZSBleGVjdXRhYmxlIGFjdHVhbGx5IGhhcyBpdHMg UFRfSU5URVJQIHNldCBhZnRlciBhbGwuCisvLyAgICAgLSBUaGUgdXNlciBydW5zIHRoZSBsb2Fk ZXIsIHBhc3NpbmcgaXQgdGhlIHBhdGggb2YgdGhlIGV4ZWN1dGFibGUuCisvLyBUaGlzIEMgZmls ZSBtdXN0IGFsd2F5cyBiZSBjb21waWxlZCBhcyBQSUMsIG9yIGVsc2UgdGhlIGxpbmtlciB3aWxs IHVzZSBhIENPUFkgcmVsb2NhdGlvbiBhbmQKKy8vIGR1cGxpY2F0ZSAiZW52aXJvbiIgaW50byB0 aGUgZXhlY3V0YWJsZS4KK3N0YXRpYyBib29sIGlzX2V4ZV9yZWxvY2F0ZWQodm9pZCkgeworCS8v IFVzZSB0aGUgR09UIHRvIGdldCB0aGUgYWRkcmVzcyBvZiBlbnZpcm9uLgorCWV4dGVybiBjaGFy KiogZW52aXJvbjsKKwl2b2lkKiByZWFkX2Vudmlyb24gPSBvcHRpbWl6ZXJfYmFycmllcigmZW52 aXJvbik7CisJZGVidWcoInJlYWRfZW52aXJvbiA9ICVwIiwgcmVhZF9lbnZpcm9uKTsKKwlyZXR1 cm4gcmVhZF9lbnZpcm9uICE9IE5VTEw7Cit9CisKK3ZvaWQgX3N0YXJ0X2MobG9uZyogcmF3X2Fy Z3MpIHsKKwljb25zdCBLZXJuZWxBcmd1bWVudHMgYXJncyA9IHJlYWRfYXJncyhyYXdfYXJncyk7 CisJY29uc3QgY2hhciogbGRfbGlicmFyeV9wYXRoID0gTlVMTDsKKworCWZvciAoc2l6ZV90IGkg PSAwOyBpIDwgYXJncy5lbnZwX2NvdW50OyArK2kpIHsKKwkJaWYgKCFyaV9zdHJjbXAoYXJncy5l bnZwW2ldLCAiUkVMSU5URVJQX0RFQlVHPTEiKSkgeworCQkJZ19kZWJ1ZyA9IHRydWU7CisJCX0K KwkJaWYgKCFyaV9zdHJuY21wKGFyZ3MuZW52cFtpXSwgIkxEX0xJQlJBUllfUEFUSD0iLCAxNikp IHsKKwkJCWxkX2xpYnJhcnlfcGF0aCA9IGFyZ3MuZW52cFtpXSArIDE2OworCQl9CisJfQorCWlm IChhcmdzLmFyZ2MgPj0gMSkgeworCQlnX3Byb2dfbmFtZSA9IGFyZ3MuYXJndlswXTsKKwl9CisK KwlpZiAoaXNfZXhlX3JlbG9jYXRlZCgpKSB7CisJCWRlYnVnKCJleGUgaXMgYWxyZWFkeSByZWxv Y2F0ZWQsIHN0YXJ0aW5nIG1haW4gZXhlY3V0YWJsZSIpOworCQlpbnQgYXJnYyA9IHJhd19hcmdz WzBdOworCQljaGFyICoqYXJndiA9ICh2b2lkICopKHJhd19hcmdzKzEpOworCQlfX2xpYmNfc3Rh cnRfbWFpbihtYWluLCBhcmdjLCBhcmd2LCBfaW5pdCwgX2ZpbmksIDApOworCX0KKworCWRlYnVn KCJlbnRlcmluZyByZWxpbnRlcnAiKTsKKworCWNvbnN0IEV4ZUluZm8gZXhlID0gZ2V0X2V4ZV9p bmZvKCZhcmdzKTsKKwlnX3BhZ2Vfc2l6ZSA9IGV4ZS5wYWdlX3NpemU7CisKKwlPcGVuZWRMb2Fk ZXIgbG9hZGVyOworCWlmIChmaW5kX2FuZF9vcGVuX2xvYWRlcigmZXhlLCBsZF9saWJyYXJ5X3Bh dGgsICZsb2FkZXIpKSB7CisJCWZhdGFsKCJmYWlsZWQgdG8gb3BlbiBsb2FkZXIiKTsKKwl9CisJ b2ZmX3QgbGVuID0gcmlfbHNlZWsobG9hZGVyLmZkLCAwLCBTRUVLX0VORCk7CisJaWYgKGxlbiA9 PSAob2ZmX3QpLTEpIGZhdGFsKCJsc2VlayBvbiAlcyBmYWlsZWQ6ICVzIiwgbG9hZGVyLnBhdGgs IHJpX3N0cmVycm9yKGdfZXJybm8pKTsKKworCXZvaWQqIGxvYWRlcl9kYXRhID0gcmlfbW1hcChO VUxMLCBsZW4sIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGxvYWRlci5mZCwgMCk7CisJaWYgKGxv YWRlcl9kYXRhID09ICh2b2lkKilNQVBfRkFJTEVEKSB7CisJCWZhdGFsKCJjb3VsZCBub3QgbW1h cCAlczogJXMiLCBsb2FkZXIucGF0aCwgcmlfc3RyZXJyb3IoZ19lcnJubykpOworCX0KKworCUxv YWRlZEludGVycCBpbnRlcnAgPSBsb2FkX2ludGVycCgmbG9hZGVyLCAoRWxmVyhFaGRyKSopbG9h ZGVyX2RhdGEpOworCWlmIChyaV9tdW5tYXAobG9hZGVyX2RhdGEsIGxlbikgIT0gMCkgZmF0YWwo Im11bm1hcCBmYWlsZWQ6ICVzIiwgcmlfc3RyZXJyb3IoZ19lcnJubykpOworCisJZGVidWcoIm9y aWdpbmFsIGF1eHY6Iik7CisJZHVtcF9hdXh2KCZhcmdzKTsKKworCS8vIENyZWF0ZSBhIHZpcnR1 YWwgcGhkciB0YWJsZSB0aGF0IGluY2x1ZGVzIFBUX0lOVEVSUCwgZm9yIHRoZSBiZW5lZml0IG9m IGxvYWRlcnMgdGhhdCByZWFkIHRoZQorCS8vIGV4ZWN1dGFibGUgUFRfSU5URVJQLgorCWluc2Vy dF9wdF9pbnRlcnBfaW50b19waGRyX3RhYmxlKCZhcmdzLCAmZXhlLCBsb2FkZXIucGF0aCk7CisJ cmlfY2xvc2UobG9hZGVyLmZkKTsKKworCS8vIFRPRE86IC9wcm9jL3BpZC9hdXh2IGlzbid0IHVw ZGF0ZWQgd2l0aCB0aGUgbmV3IGF1eHYgdmVjdG9yLiBJcyBpdCBwb3NzaWJsZSB0byB1cGRhdGUg aXQ/CisJLy8gWFhYOiBJZiB3ZSB0cnkgdG8gdXBkYXRlIGl0LCB3ZSdkIHVzZSBwcmN0bChQUl9T RVRfTU0sIFBSX1NFVF9NTV9BVVhWLCAmdmVjLCBzaXplLCAwKQorCS8vIE1heWJlIHVwZGF0aW5n IGl0IHdvdWxkIGJlIHVzZWZ1bCBhcyBhIHdheSB0byBjb21tdW5pY2F0ZSB0aGUgbG9hZGVyJ3Mg YmFzZSB0byBhIGRlYnVnZ2VyLgorCS8vIGUuZy4gbGxkYiB1c2VzIEFUX0JBU0UgaW4gdGhlIGF1 eCB2ZWN0b3IsIGJ1dCBpdCBjYWNoZXMgdGhlIHZhbHVlcyBhdCBwcm9jZXNzIHN0YXJ0dXAsIHNv CisJLy8gaXQgd291bGRuJ3QgY3VycmVudGx5IG5vdGljZSBhIGNoYW5nZWQgdmFsdWUuCisKKwkv LyBUaGUgbG9hZGVyIHVzZXMgQVRfQkFTRSB0byBsb2NhdGUgaXRzZWxmLCBzbyBzZWFyY2ggZm9y IHRoZSBlbnRyeSBhbmQgdXBkYXRlIGl0LiBFdmVuIHRob3VnaAorCS8vIGl0cyB2YWx1ZSBpcyBh bHdheXMgemVybywgdGhlIGtlcm5lbCBzdGlsbCBpbmNsdWRlcyB0aGUgZW50cnlbMF0uIElmIHRo aXMgY2hhbmdlcyAob3Igd2Ugd2FudAorCS8vIHRvIG1ha2Ugd2Vha2VyIGFzc3VtcHRpb25zIGFi b3V0IHRoZSBrZXJuZWwncyBiZWhhdmlvciksIHRoZW4gd2UgY2FuIGNvcHkgdGhlIGtlcm5lbCBh cmd1bWVudHMKKwkvLyBvbnRvIHRoZSBzdGFjayAoZS5nLiB1c2luZyBhbGxvY2EpIGJlZm9yZSBq dW1waW5nIHRvIHRoZSBsb2FkZXIncyBlbnRyeSBwb2ludC4KKwkvLyBbMF0gaHR0cHM6Ly9naXRo dWIuY29tL3RvcnZhbGRzL2xpbnV4L2Jsb2IvdjUuMTMvZnMvYmluZm10X2VsZi5jI0wyNjMKKwlm b3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3MuYXV4dl9jb3VudDsgKytpKSB7CisJCWlmIChhcmdz LmF1eHZbaV0ua2V5ID09IEFUX0JBU0UpIHsKKwkJCWFyZ3MuYXV4dltpXS52YWx1ZSA9ICh1bnNp Z25lZCBsb25nKWludGVycC5iYXNlX2FkZHI7CisJCQlkZWJ1ZygibmV3IGF1eHY6Iik7CisJCQlk dW1wX2F1eHYoJmFyZ3MpOworCQkJZGVidWcoInRyYW5zZmVycmluZyB0byByZWFsIGxvYWRlciIp OworCQkJQ1JUSk1QKGludGVycC5lbnRyeSwgcmF3X2FyZ3MpOworCQl9CisJfQorCWZhdGFsKCJB VF9CQVNFIG5vdCBmb3VuZCBpbiBhdXggdmVjdG9yIik7Cit9CisKKworLy8gTm9ybWFsbHkgZ2Ri IGFuZCBsbGRiIGxvb2sgZm9yIGEgc3ltYm9sIG5hbWVkICJfZGxfZGVidWdfc3RhdGUiIGluIHRo ZQorLy8gaW50ZXJwcmV0ZXIgdG8gZ2V0IG5vdGlmaWVkIHdoZW4gdGhlIGR5bmFtaWMgbG9hZGVy IGhhcyBtb2RpZmllZCB0aGUKKy8vIGxpc3Qgb2Ygc2hhcmVkIGxpYnJhcmllcy4gIFdoZW4gdXNp bmcgcmVsaW50ZXJwLCB0aGUgZGVidWdnZXIgaXMgbm90CisvLyBhd2FyZSBvZiB0aGUgaW50ZXJw cmV0ZXIgKFBUX0lOVEVSUCBpcyB1bnNldCBhbmQgYXV4diBBVF9CQVNFIGlzIDApIHNvIGl0Cisv LyBkb2Vzbid0IGtub3cgd2hlcmUgdG8gbG9vayBmb3IgdGhlIHN5bWJvbC4gIEl0IGZhbGxzIGJh Y2sgdG8gbG9va2luZyBpbiB0aGUKKy8vIGV4ZWN1dGFibGUsIHNvIHByb3ZpZGUgYSBzeW1ib2wg Zm9yIGl0IHRvIGZpbmQuICBUaGUgZHluYW1pYyBsb2FkZXIgd2lsbAorLy8gbmVlZCB0byBmb3J3 YXJkIGl0cyBjYWxscyB0byBpdHMgb3duIF9kbF9kZWJ1Z19zdGF0ZSBzeW1ib2wgdG8gdGhpcyBv bmUuCisvLworLy8gVGhpcyBoYXMgdG8gYmUgZGVmaW5lZCBpbiBhIC5jIGZpbGUgYmVjYXVzZSBs bGRiIGxvb2tzIGZvciBhIHN5bWJvbCB3aXRoCisvLyBEV0FSRiBsYW5ndWFnZSB0eXBlIERXX0xB TkdfQy4KK2V4dGVybiB2b2lkIF9kbF9kZWJ1Z19zdGF0ZSgpIHsKK30KZGlmZiAtLWdpdCBhL2xk c28vZHlubGluay5jIGIvbGRzby9keW5saW5rLmMKaW5kZXggMDNmNWZkNTkuLjUyNmEzOTcxIDEw MDY0NAotLS0gYS9sZHNvL2R5bmxpbmsuYworKysgYi9sZHNvL2R5bmxpbmsuYwpAQCAtMTUwLDYg KzE1MCw3IEBAIHN0YXRpYyBzdHJ1Y3QgZmRwaWNfbG9hZG1hcCAqYXBwX2xvYWRtYXA7CiBzdGF0 aWMgc3RydWN0IGZkcGljX2R1bW15X2xvYWRtYXAgYXBwX2R1bW15X2xvYWRtYXA7CiAKIHN0cnVj dCBkZWJ1ZyAqX2RsX2RlYnVnX2FkZHIgPSAmZGVidWc7CitzdGF0aWMgdm9pZCAoKmV4ZV9kbF9k ZWJ1Z19zdGF0ZSkodm9pZCkgPSAwOwogCiBleHRlcm4gaGlkZGVuIGludCBfX21hbGxvY19yZXBs YWNlZDsKIApAQCAtMTU4Miw2ICsxNTgzLDggQEAgdm9pZCBfX2xpYmNfc3RhcnRfaW5pdCh2b2lk KQogCiBzdGF0aWMgdm9pZCBkbF9kZWJ1Z19zdGF0ZSh2b2lkKQogeworCWlmIChleGVfZGxfZGVi dWdfc3RhdGUpCisJCWV4ZV9kbF9kZWJ1Z19zdGF0ZSgpOwogfQogCiB3ZWFrX2FsaWFzKGRsX2Rl YnVnX3N0YXRlLCBfZGxfZGVidWdfc3RhdGUpOwpAQCAtMjAwNyw2ICsyMDEwLDEyIEBAIHZvaWQg X19kbHMzKHNpemVfdCAqc3AsIHNpemVfdCAqYXV4dikKIAlpZiAoZmluZF9zeW0oaGVhZCwgImFs aWduZWRfYWxsb2MiLCAxKS5kc28gIT0gJmxkc28pCiAJCV9fYWxpZ25lZF9hbGxvY19yZXBsYWNl ZCA9IDE7CiAKKwkvKiBEZXRlcm1pbmUgaWYgYW5vdGhlciBEU08gaXMgcHJvdmlkaW5nIHRoZSBf ZGxfZGVidWdfc3RhdGUgc3ltYm9sCisJICogYW5kIGZvcndhcmQgY2FsbHMgdG8gaXQuICovCisJ c3RydWN0IHN5bWRlZiBkZWJ1Z19zeW0gPSBmaW5kX3N5bShoZWFkLCAiX2RsX2RlYnVnX3N0YXRl IiwgMSk7CisJaWYgKGRlYnVnX3N5bS5kc28gIT0gJmxkc28pCisJCWV4ZV9kbF9kZWJ1Z19zdGF0 ZSA9ICh2b2lkICgqKSh2b2lkKSlsYWRkcihkZWJ1Z19zeW0uZHNvLCBkZWJ1Z19zeW0uc3ltLT5z dF92YWx1ZSk7CisKIAkvKiBTd2l0Y2ggdG8gcnVudGltZSBtb2RlOiBhbnkgZnVydGhlciBmYWls dXJlcyBpbiB0aGUgZHluYW1pYwogCSAqIGxpbmtlciBhcmUgYSByZXBvcnRhYmxlIGZhaWx1cmUg cmF0aGVyIHRoYW4gYSBmYXRhbCBzdGFydHVwCiAJICogZXJyb3IuICovCmRpZmYgLS1naXQgYS90 b29scy9sZC5tdXNsLWNsYW5nLmluIGIvdG9vbHMvbGQubXVzbC1jbGFuZy5pbgppbmRleCA5Mzc2 M2Q2Yi4uYWVjMWM2YWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xkLm11c2wtY2xhbmcuaW4KKysrIGIv dG9vbHMvbGQubXVzbC1jbGFuZy5pbgpAQCAtMywxMCArMywxOSBAQCBjYz0iQENDQCIKIGxpYmNf bGliPSJATElCRElSQCIKIGxkc289IkBMRFNPQCIKIGNsZWFyZWQ9CityZWxpbnRlcnA9CiBzaGFy ZWQ9CiB1c2VybGlua2Rpcj0KIHVzZXJsaW5rPQogCitmb3IgeCA7IGRvCisgICAgY2FzZSAiJHgi IGluCisJLXJlbGludGVycCkKKwkgICAgcmVsaW50ZXJwPTEKKwkgICAgOzsKKyAgICBlc2FjCitk b25lCisKIGZvciB4IDsgZG8KICAgICB0ZXN0ICIkY2xlYXJlZCIgfHwgc2V0IC0tIDsgY2xlYXJl ZD0xCiAKQEAgLTI5LDYgKzM4LDEzIEBAIGZvciB4IDsgZG8KICAgICAgICAgY3J0YmVnaW4qLm98 Y3J0ZW5kKi5vKQogICAgICAgICAgICAgc2V0IC0tICIkQCIgJCgkY2MgLXByaW50LWZpbGUtbmFt ZT0keCkKICAgICAgICAgICAgIDs7CisJKi9TY3J0MS5vfCovY3J0MS5vKQorICAgICAgICAgICAg aWYgdGVzdCAkcmVsaW50ZXJwOyB0aGVuCisgICAgICAgICAgICAgICAgc2V0IC0tICIkQCIgJGxp YmNfbGliL3JlbGludGVycC5vCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2V0 IC0tICIkQCIgIiR4IgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CiAgICAgICAgIC1s Z2NjfC1sZ2NjX2VoKQogICAgICAgICAgICAgZmlsZT1saWIke3gjLWx9LmEKICAgICAgICAgICAg IHNldCAtLSAiJEAiICQoJGNjIC1wcmludC1maWxlLW5hbWU9JGZpbGUpCkBAIC0zNiw2ICs1Miw4 IEBAIGZvciB4IDsgZG8KICAgICAgICAgLWwqKQogICAgICAgICAgICAgdGVzdCAiJHVzZXJsaW5r IiAmJiBzZXQgLS0gIiRAIiAiJHgiCiAgICAgICAgICAgICA7OworCS1yZWxpbnRlcnApCisJICAg IDs7CiAgICAgICAgIC1zaGFyZWQpCiAgICAgICAgICAgICBzaGFyZWQ9MQogICAgICAgICAgICAg c2V0IC0tICIkQCIgLXNoYXJlZApAQCAtNDgsNCArNjYsMTAgQEAgZm9yIHggOyBkbwogICAgIGVz YWMKIGRvbmUKIAotZXhlYyAkKCRjYyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAtbm9zdGRsaWIgIiRA IiAtbGMgLWR5bmFtaWMtbGlua2VyICIkbGRzbyIKK2lmIHRlc3QgJHJlbGludGVycDsgdGhlbgor ICAgIGR5bmFtaWNfbGlua2VyX2ZsYWdzPSItbm8tZHluYW1pYy1saW5rZXIiCitlbHNlCisgICAg ZHluYW1pY19saW5rZXJfZmxhZ3M9Ii1keW5hbWljLWxpbmtlciAkbGRzbyIKK2ZpCisKK2V4ZWMg JCgkY2MgLXByaW50LXByb2ctbmFtZT1sZCkgLW5vc3RkbGliICIkQCIgLWxjICRkeW5hbWljX2xp bmtlcl9mbGFncwpkaWZmIC0tZ2l0IGEvdG9vbHMvbXVzbC1jbGFuZy5pbiBiL3Rvb2xzL211c2wt Y2xhbmcuaW4KaW5kZXggNjIzZGU2ZjYuLmU3MTI4M2VlIDEwMDY0NAotLS0gYS90b29scy9tdXNs LWNsYW5nLmluCisrKyBiL3Rvb2xzL211c2wtY2xhbmcuaW4KQEAgLTgsMTAgKzgsMjIgQEAgdGhp c2Rpcj0iYGNkICIkKGRpcm5hbWUgIiQwIikiOyBwd2RgIgogIyBwcmV2ZW50IGNsYW5nIGZyb20g cnVubmluZyB0aGUgbGlua2VyIChhbmQgZXJyb3JpbmcpIG9uIG5vIGlucHV0Lgogc2ZsYWdzPQog ZWZsYWdzPQorCitjbGVhcmVkPQorCiBmb3IgeCA7IGRvCisgICAgdGVzdCAiJGNsZWFyZWQiIHx8 IHNldCAtLSA7IGNsZWFyZWQ9MQogICAgIGNhc2UgIiR4IiBpbgotICAgICAgICAtbCopIGlucHV0 PTEgOzsKLSAgICAgICAgKikgaW5wdXQ9IDs7CisgICAgICAgIC1sKikKKwkgICAgaW5wdXQ9MQor CSAgICBzZXQgLS0gIiRAIiAiJHgiCisJICAgIDs7CisJLXJlbGludGVycCkKKwkgICAgcmVsaW50 ZXJwX2ZsYWdzPS1XbCwtcmVsaW50ZXJwIDs7CisgICAgICAgICopCisJICAgIGlucHV0PQorCSAg ICBzZXQgLS0gIiRAIiAiJHgiCisJICAgIDs7CiAgICAgZXNhYwogICAgIGlmIHRlc3QgIiRpbnB1 dCIgOyB0aGVuCiAgICAgICAgIHNmbGFncz0iLWwtdXNlci1zdGFydCIKQEAgLTIxLDYgKzMzLDcg QEAgZm9yIHggOyBkbwogZG9uZQogCiBleGVjICRjYyBcCisgICAgJHJlbGludGVycF9mbGFncyBc CiAgICAgLUIiJHRoaXNkaXIiIFwKICAgICAtZnVzZS1sZD1tdXNsLWNsYW5nIFwKICAgICAtc3Rh dGljLWxpYmdjYyBcCmRpZmYgLS1naXQgYS90b29scy9tdXNsLWdjYy5zcGVjcy5zaCBiL3Rvb2xz L211c2wtZ2NjLnNwZWNzLnNoCmluZGV4IDMwNDkyNTc0Li4wOTUyNzNlMCAxMDA2NDQKLS0tIGEv dG9vbHMvbXVzbC1nY2Muc3BlY3Muc2gKKysrIGIvdG9vbHMvbXVzbC1nY2Muc3BlY3Muc2gKQEAg LTE3LDEzICsxNywxMyBAQCBjYXQgPDxFT0YKIGxpYmdjYy5hJXMgJTppZi1leGlzdHMobGliZ2Nj X2VoLmElcykKIAogKnN0YXJ0ZmlsZToKLSV7IXNoYXJlZDogJGxpYmRpci9TY3J0MS5vfSAkbGli ZGlyL2NydGkubyBjcnRiZWdpblMubyVzCisleyFzaGFyZWQ6ICV7cmVsaW50ZXJwOiAkbGliZGly L3JlbGludGVycC5vfSAleyFyZWxpbnRlcnA6ICRsaWJkaXIvU2NydDEub319ICRsaWJkaXIvY3J0 aS5vIGNydGJlZ2luUy5vJXMKIAogKmVuZGZpbGU6CiBjcnRlbmRTLm8lcyAkbGliZGlyL2NydG4u bwogCiAqbGluazoKLS1keW5hbWljLWxpbmtlciAkbGRzbyAtbm9zdGRsaWIgJXtzaGFyZWQ6LXNo YXJlZH0gJXtzdGF0aWM6LXN0YXRpY30gJXtyZHluYW1pYzotZXhwb3J0LWR5bmFtaWN9Cisle3Jl bGludGVycDogLW5vLWR5bmFtaWMtbGlua2VyfSAleyFyZWxpbnRlcnA6IC1keW5hbWljLWxpbmtl ciAkbGRzb30gLW5vc3RkbGliICV7c2hhcmVkOi1zaGFyZWR9ICV7c3RhdGljOi1zdGF0aWN9ICV7 cmR5bmFtaWM6LWV4cG9ydC1keW5hbWljfQogCiAqZXNwX2xpbms6CiAKLS0gCjIuMzcuMy45OTgu ZzU3N2U1OTE0M2YtZ29vZwoK --00000000000015d12105e99c3d6c--