From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 21B2138518AC for ; Mon, 21 Nov 2022 16:35:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 21B2138518AC Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1669048532; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=PzxRPF55pBO7NacNxZJhlhu/d2e5foEr3a+Pf5NbHd8=; b=eKhlefJSdd6d7Pxz308klIaMLWk1hvaC73FAe0ja6acW+xqRGMPG6SKOJwbIPDUR7Mcr60 n8ozhETI5JMHj8An6M47OloK+KPZ5jdj11Tr4cgasiuFJj0OJLLgqSFg/JtKhG48fl4F2Z nfgoFP5cCZiMCl2lwIF2ZmOqwrkG0p4= Received: from mail-yw1-f199.google.com (mail-yw1-f199.google.com [209.85.128.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-642-JR_KQ-ThPSeXSwP__9MS6g-1; Mon, 21 Nov 2022 11:35:30 -0500 X-MC-Unique: JR_KQ-ThPSeXSwP__9MS6g-1 Received: by mail-yw1-f199.google.com with SMTP id 00721157ae682-38f92b4b3f2so116689067b3.1 for ; Mon, 21 Nov 2022 08:35:30 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=PzxRPF55pBO7NacNxZJhlhu/d2e5foEr3a+Pf5NbHd8=; b=m7MU2g5ayX0gEXdgjCjHpu0kaBJSYiW8bzZrPL7eD8VhMYJVcFNUFEQYUsyEKM4kzA MuGeY+DD16b0AG5qPuVP86/aUx9d++WxxzPnpLKz4laANp3cngozwHYcLLpz8YD5e9wQ 5zK/cYN9b46d3pH8gV29FEBXZeG69zdrzHLjupL7pXkVr6ajgX6xiKnVFTvt/uTxF+nk 9W2lND0njP868k1c8CSNqBl6VA5S7SAbQ8kFOwSNyGs549TEnn8uR4f08yiETMuj7VWp ep5lRBQFw6ymb/SxUVgC/TRIhayWrQZozlRapgSxP+lNnruCr9NF12AVAGwbU2Q5APyq LwNg== X-Gm-Message-State: ANoB5pn2cJDGjJ2rfE3h1N98Skqc40iZ1iNRxoLO2m+5bgl0ukOBHZhe XChLOpHqVk7AHySpKihE6Ut5bkin389c8HSW2Gelj30//8JXTewfP3asQumq42Q/2Ko8CpsZHuG lvSjU1WoxcpxHjxza8wXGRwNl6myafYYXHQ== X-Received: by 2002:a81:5c07:0:b0:370:4db0:6a3c with SMTP id q7-20020a815c07000000b003704db06a3cmr18130299ywb.179.1669048530191; Mon, 21 Nov 2022 08:35:30 -0800 (PST) X-Google-Smtp-Source: AA0mqf5SgMzBEHLGchO5dCi1NEjq0/yKiRYjSFB9WaYWuZaRew+zEyzFVlRqIY72Q54sz58sAzVr/FkfGQRgTdx4Kwk= X-Received: by 2002:a81:5c07:0:b0:370:4db0:6a3c with SMTP id q7-20020a815c07000000b003704db06a3cmr18130278ywb.179.1669048529892; Mon, 21 Nov 2022 08:35:29 -0800 (PST) MIME-Version: 1.0 From: Aldy Hernandez Date: Mon, 21 Nov 2022 17:35:18 +0100 Message-ID: Subject: [PATCH] Remove legacy VRP (maybe?) To: Jakub Jelinek , Richard Biener , "MacLeod, Andrew" , gcc-patches X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="000000000000bcec5405edfda4aa" X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_ASCII_DIVIDERS,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000bcec5405edfda4aa Content-Type: text/plain; charset="UTF-8" I've been playing around with removing the legacy VRP code for the next release. It's a layered onion to get this right, but the first bit is pretty straightforward and may be useful for this release. Basically, it entails removing the old VRP pass itself, along with value_range_equiv which have no producers left. The current users of value_range_equiv don't put anything in the equivalence bitmaps, so they're basically behaving like plain value_range. I removed as much as possible without having to change any behavior, and this is what I came up with. Is this something that would be useful for this release? Would it help release managers have less unused cruft in the tree? Neither Andrew nor I have any strong feelings here. We don't foresee the legacy code changing at all in the offseason, so we can just accumulate these patches in local trees. Thoughts? Aldy --000000000000bcec5405edfda4aa Content-Type: text/x-patch; charset="US-ASCII"; name="0002-Remove-value_range_equiv.patch" Content-Disposition: attachment; filename="0002-Remove-value_range_equiv.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lar03utk0 RnJvbSAxYjc2OTFhOTA2YTQwNzYzMDkyZDZmN2E5YWY3NjAzZjJhOWE2MWQ4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogU2F0LCAxOSBOb3YgMjAyMiAxNzo0NDowMiArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92 ZSB2YWx1ZV9yYW5nZV9lcXVpdi4KCi0tLQogZ2NjL01ha2VmaWxlLmluICAgICAgICAgICAgfCAg IDEgLQogZ2NjL2dpbXBsZS1hcnJheS1ib3VuZHMuY2MgfCAgIDMgLQogZ2NjL3RyZWUtdnJwLmNj ICAgICAgICAgICAgfCAgIDUgKy0KIGdjYy92YWx1ZS1xdWVyeS5jYyAgICAgICAgIHwgIDI1ICst LQogZ2NjL3ZhbHVlLXF1ZXJ5LmggICAgICAgICAgfCAgIDUgKy0KIGdjYy92YWx1ZS1yYW5nZS1l cXVpdi5jYyAgIHwgMzMwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGdj Yy92YWx1ZS1yYW5nZS1lcXVpdi5oICAgIHwgIDkwIC0tLS0tLS0tLS0KIGdjYy92ci12YWx1ZXMu Y2MgICAgICAgICAgIHwgIDk4ICsrKy0tLS0tLS0tCiBnY2MvdnItdmFsdWVzLmggICAgICAgICAg ICB8ICAgNyArLQogOSBmaWxlcyBjaGFuZ2VkLCAzNCBpbnNlcnRpb25zKCspLCA1MzAgZGVsZXRp b25zKC0pCiBkZWxldGUgbW9kZSAxMDA2NDQgZ2NjL3ZhbHVlLXJhbmdlLWVxdWl2LmNjCiBkZWxl dGUgbW9kZSAxMDA2NDQgZ2NjL3ZhbHVlLXJhbmdlLWVxdWl2LmgKCmRpZmYgLS1naXQgYS9nY2Mv TWFrZWZpbGUuaW4gYi9nY2MvTWFrZWZpbGUuaW4KaW5kZXggNWFkNjM4ZjU5ZDguLjg2ZTMxZWIx NWY3IDEwMDY0NAotLS0gYS9nY2MvTWFrZWZpbGUuaW4KKysrIGIvZ2NjL01ha2VmaWxlLmluCkBA IC0xNzE2LDcgKzE3MTYsNiBAQCBPQkpTID0gXAogCXZhbHVlLXBvaW50ZXItZXF1aXYubyBcCiAJ dmFsdWUtcXVlcnkubyBcCiAJdmFsdWUtcmFuZ2UubyBcCi0JdmFsdWUtcmFuZ2UtZXF1aXYubyBc CiAJdmFsdWUtcmFuZ2UtcHJldHR5LXByaW50Lm8gXAogCXZhbHVlLXJhbmdlLXN0b3JhZ2UubyBc CiAJdmFsdWUtcmVsYXRpb24ubyBcCmRpZmYgLS1naXQgYS9nY2MvZ2ltcGxlLWFycmF5LWJvdW5k cy5jYyBiL2djYy9naW1wbGUtYXJyYXktYm91bmRzLmNjCmluZGV4IGZiZjQ0OGUwNDVkLi4xZWFm ZDNmZDNlMSAxMDA2NDQKLS0tIGEvZ2NjL2dpbXBsZS1hcnJheS1ib3VuZHMuY2MKKysrIGIvZ2Nj L2dpbXBsZS1hcnJheS1ib3VuZHMuY2MKQEAgLTQ2LDkgKzQ2LDYgQEAgYXJyYXlfYm91bmRzX2No ZWNrZXI6OmFycmF5X2JvdW5kc19jaGVja2VyIChzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmMsCiAgIC8q IE5vLW9wLiAgKi8KIH0KIAotLy8gVGhpcyBwdXJwb3NlbHkgcmV0dXJucyBhIHZhbHVlX3Jhbmdl LCBub3QgYSB2YWx1ZV9yYW5nZV9lcXVpdiwgdG8KLS8vIGJyZWFrIHRoZSBkZXBlbmRlbmN5IG9u IGVxdWl2YWxlbmNlcyBmb3IgdGhpcyBwYXNzLgotCiBjb25zdCB2YWx1ZV9yYW5nZSAqCiBhcnJh eV9ib3VuZHNfY2hlY2tlcjo6Z2V0X3ZhbHVlX3JhbmdlIChjb25zdF90cmVlIG9wLCBnaW1wbGUg KnN0bXQpCiB7CmRpZmYgLS1naXQgYS9nY2MvdHJlZS12cnAuY2MgYi9nY2MvdHJlZS12cnAuY2MK aW5kZXggODY5NzgwODZjZmIuLmRmMmYxZWFlMjAzIDEwMDY0NAotLS0gYS9nY2MvdHJlZS12cnAu Y2MKKysrIGIvZ2NjL3RyZWUtdnJwLmNjCkBAIC01ODIsMTAgKzU4Miw5IEBAIGNvbXBhcmVfdmFs dWVzICh0cmVlIHZhbDEsIHRyZWUgdmFsMikKIHN0YXRpYyBib29sCiBzdXBwb3J0ZWRfdHlwZXNf cCAodmFsdWVfcmFuZ2UgKnZyLAogCQkgICB0cmVlIHR5cGUwLAotCQkgICB0cmVlIHR5cGUxID0g TlVMTCkKKwkJICAgdHJlZSA9IE5VTEwpCiB7Ci0gIGlmICghdmFsdWVfcmFuZ2VfZXF1aXY6OnN1 cHBvcnRzX3AgKHR5cGUwKQotICAgICAgfHwgKHR5cGUxICYmICF2YWx1ZV9yYW5nZV9lcXVpdjo6 c3VwcG9ydHNfcCAodHlwZTEpKSkKKyAgaWYgKCF2YWx1ZV9yYW5nZTo6c3VwcG9ydHNfcCAodHlw ZTApKQogICAgIHsKICAgICAgIHZyLT5zZXRfdmFyeWluZyAodHlwZTApOwogICAgICAgcmV0dXJu IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZ2NjL3ZhbHVlLXF1ZXJ5LmNjIGIvZ2NjL3ZhbHVlLXF1ZXJ5 LmNjCmluZGV4IGU4OTg4ZWQ2N2UwLi5mODkyMjVkNzQ4YSAxMDA2NDQKLS0tIGEvZ2NjL3ZhbHVl LXF1ZXJ5LmNjCisrKyBiL2djYy92YWx1ZS1xdWVyeS5jYwpAQCAtMjgsNyArMjgsNiBAQCBhbG9u ZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUg InNzYS5oIgogI2luY2x1ZGUgInRyZWUtcHJldHR5LXByaW50LmgiCiAjaW5jbHVkZSAiZm9sZC1j b25zdC5oIgotI2luY2x1ZGUgInZhbHVlLXJhbmdlLWVxdWl2LmgiCiAjaW5jbHVkZSAidmFsdWUt cXVlcnkuaCIKICNpbmNsdWRlICJhbGxvYy1wb29sLmgiCiAjaW5jbHVkZSAiZ2ltcGxlLXJhbmdl LmgiCkBAIC0xNDMsMzQgKzE0MiwyMiBAQCByYW5nZV9xdWVyeTo6ZHVtcCAoRklMRSAqKQogewog fQogCi0vLyB2YWx1YXRpb25fcXVlcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdmFsdWVfcmFuZ2Vf ZXF1aXYncy4KKy8vIHZhbHVhdGlvbl9xdWVyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB2YWx1ZV9y YW5nZSdzLgogCi1jbGFzcyBlcXVpdl9hbGxvY2F0b3IgOiBwdWJsaWMgb2JqZWN0X2FsbG9jYXRv cjx2YWx1ZV9yYW5nZV9lcXVpdj4KK2NsYXNzIGVxdWl2X2FsbG9jYXRvciA6IHB1YmxpYyBvYmpl Y3RfYWxsb2NhdG9yPHZhbHVlX3JhbmdlPgogewogcHVibGljOgogICBlcXVpdl9hbGxvY2F0b3Ig KCkKLSAgICA6IG9iamVjdF9hbGxvY2F0b3I8dmFsdWVfcmFuZ2VfZXF1aXY+ICgiZXF1aXZfYWxs b2NhdG9yIHBvb2wiKSB7IH0KKyAgICA6IG9iamVjdF9hbGxvY2F0b3I8dmFsdWVfcmFuZ2U+ICgi ZXF1aXZfYWxsb2NhdG9yIHBvb2wiKSB7IH0KIH07CiAKLXZhbHVlX3JhbmdlX2VxdWl2ICoKLXJh bmdlX3F1ZXJ5OjphbGxvY2F0ZV92YWx1ZV9yYW5nZV9lcXVpdiAoKQotewotICByZXR1cm4gbmV3 IChlcXVpdl9hbGxvYy0+YWxsb2NhdGUgKCkpIHZhbHVlX3JhbmdlX2VxdWl2OwotfQotCi12b2lk Ci1yYW5nZV9xdWVyeTo6ZnJlZV92YWx1ZV9yYW5nZV9lcXVpdiAodmFsdWVfcmFuZ2VfZXF1aXYg KnYpCi17Ci0gIGVxdWl2X2FsbG9jLT5yZW1vdmUgKHYpOwotfQotCi1jb25zdCBjbGFzcyB2YWx1 ZV9yYW5nZV9lcXVpdiAqCitjb25zdCB2YWx1ZV9yYW5nZSAqCiByYW5nZV9xdWVyeTo6Z2V0X3Zh bHVlX3JhbmdlIChjb25zdF90cmVlIGV4cHIsIGdpbXBsZSAqc3RtdCkKIHsKICAgaW50X3Jhbmdl X21heCByOwogICBpZiAocmFuZ2Vfb2ZfZXhwciAociwgY29uc3RfY2FzdDx0cmVlPiAoZXhwciks IHN0bXQpKQotICAgIHJldHVybiBuZXcgKGVxdWl2X2FsbG9jLT5hbGxvY2F0ZSAoKSkgdmFsdWVf cmFuZ2VfZXF1aXYgKHIpOwotICByZXR1cm4gbmV3IChlcXVpdl9hbGxvYy0+YWxsb2NhdGUgKCkp IHZhbHVlX3JhbmdlX2VxdWl2IChUUkVFX1RZUEUgKGV4cHIpKTsKKyAgICByZXR1cm4gbmV3IChl cXVpdl9hbGxvYy0+YWxsb2NhdGUgKCkpIHZhbHVlX3JhbmdlIChyKTsKKyAgcmV0dXJuIG5ldyAo ZXF1aXZfYWxsb2MtPmFsbG9jYXRlICgpKSB2YWx1ZV9yYW5nZSAoVFJFRV9UWVBFIChleHByKSk7 CiB9CiAKIHJhbmdlX3F1ZXJ5OjpyYW5nZV9xdWVyeSAoKQpkaWZmIC0tZ2l0IGEvZ2NjL3ZhbHVl LXF1ZXJ5LmggYi9nY2MvdmFsdWUtcXVlcnkuaAppbmRleCBiOGU2ZmVkZmIyOC4uYjg2MGQ2NmRm MjAgMTAwNjQ0Ci0tLSBhL2djYy92YWx1ZS1xdWVyeS5oCisrKyBiL2djYy92YWx1ZS1xdWVyeS5o CkBAIC0xMDYsMTMgKzEwNiwxMCBAQCBwdWJsaWM6CiAKICAgLy8gREVQUkVDQVRFRDogVGhpcyBt ZXRob2QgaXMgdXNlZCBmcm9tIHZyLXZhbHVlcy4gIFRoZSBwbGFuIGlzIHRvCiAgIC8vIHJld3Jp dGUgYWxsIHVzZXMgb2YgaXQgdG8gdGhlIGFib3ZlIEFQSS4KLSAgdmlydHVhbCBjb25zdCBjbGFz cyB2YWx1ZV9yYW5nZV9lcXVpdiAqZ2V0X3ZhbHVlX3JhbmdlIChjb25zdF90cmVlLAotCQkJCQkJ CSAgZ2ltcGxlICogPSBOVUxMKTsKKyAgdmlydHVhbCBjb25zdCB2YWx1ZV9yYW5nZSAqZ2V0X3Zh bHVlX3JhbmdlIChjb25zdF90cmVlLCBnaW1wbGUgKiA9IE5VTEwpOwogICB2aXJ0dWFsIHZvaWQg ZHVtcCAoRklMRSAqKTsKIAogcHJvdGVjdGVkOgotICBjbGFzcyB2YWx1ZV9yYW5nZV9lcXVpdiAq YWxsb2NhdGVfdmFsdWVfcmFuZ2VfZXF1aXYgKCk7Ci0gIHZvaWQgZnJlZV92YWx1ZV9yYW5nZV9l cXVpdiAoY2xhc3MgdmFsdWVfcmFuZ2VfZXF1aXYgKik7CiAgIGJvb2wgZ2V0X3RyZWVfcmFuZ2Ug KHZyYW5nZSAmdiwgdHJlZSBleHByLCBnaW1wbGUgKnN0bXQpOwogICBib29sIGdldF9hcml0aF9l eHByX3JhbmdlICh2cmFuZ2UgJnIsIHRyZWUgZXhwciwgZ2ltcGxlICpzdG10KTsKICAgcmVsYXRp b25fb3JhY2xlICptX29yYWNsZTsKZGlmZiAtLWdpdCBhL2djYy92YWx1ZS1yYW5nZS1lcXVpdi5j YyBiL2djYy92YWx1ZS1yYW5nZS1lcXVpdi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggYmQ1OGU1YTkwYmMuLjAwMDAwMDAwMDAwCi0tLSBhL2djYy92YWx1ZS1yYW5nZS1lcXVpdi5j YworKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKiBTdXBwb3J0IHJvdXRpbmVzIGZv ciB2YWx1ZSByYW5nZXMgd2l0aCBlcXVpdmFsZW5jZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMjAt MjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQg b2YgR0NDLgotCi1HQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247 IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9u LgotCi1HQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh aWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4g IElmIG5vdCBzZWUKLTxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNs dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLSNpbmNsdWRlICJjb3JldHlwZXMu aCIKLSNpbmNsdWRlICJiYWNrZW5kLmgiCi0jaW5jbHVkZSAidHJlZS5oIgotI2luY2x1ZGUgImdp bXBsZS5oIgotI2luY2x1ZGUgInNzYS5oIgotI2luY2x1ZGUgInRyZWUtcHJldHR5LXByaW50Lmgi Ci0jaW5jbHVkZSAidmFsdWUtcmFuZ2UtZXF1aXYuaCIKLQotdmFsdWVfcmFuZ2VfZXF1aXY6OnZh bHVlX3JhbmdlX2VxdWl2ICh0cmVlIG1pbiwgdHJlZSBtYXgsIGJpdG1hcCBlcXVpdiwKLQkJCQkg ICAgICB2YWx1ZV9yYW5nZV9raW5kIGtpbmQpCi17Ci0gIG1fZXF1aXYgPSBOVUxMOwotICBzZXQg KG1pbiwgbWF4LCBlcXVpdiwga2luZCk7Ci19Ci0KLXZhbHVlX3JhbmdlX2VxdWl2Ojp2YWx1ZV9y YW5nZV9lcXVpdiAoY29uc3QgdmFsdWVfcmFuZ2UgJm90aGVyKQotewotICBtX2VxdWl2ID0gTlVM TDsKLSAgc2V0IChvdGhlci5taW4oKSwgb3RoZXIubWF4ICgpLCBOVUxMLCBvdGhlci5raW5kICgp KTsKLX0KLQotdm9pZAotdmFsdWVfcmFuZ2VfZXF1aXY6OnNldCAodHJlZSBtaW4sIHRyZWUgbWF4 LCBiaXRtYXAgZXF1aXYsCi0JCQl2YWx1ZV9yYW5nZV9raW5kIGtpbmQpCi17Ci0gIHZhbHVlX3Jh bmdlOjpzZXQgKG1pbiwgbWF4LCBraW5kKTsKLSAgc2V0X2VxdWl2IChlcXVpdik7Ci0gIGlmIChm bGFnX2NoZWNraW5nKQotICAgIGNoZWNrICgpOwotfQotCi12b2lkCi12YWx1ZV9yYW5nZV9lcXVp djo6c2V0ICh0cmVlIG1pbiwgdHJlZSBtYXgsIHZhbHVlX3JhbmdlX2tpbmQga2luZCkKLXsKLSAg c2V0IChtaW4sIG1heCwgbV9lcXVpdiwga2luZCk7Ci19Ci0KLXZvaWQKLXZhbHVlX3JhbmdlX2Vx dWl2OjpzZXQgKHRyZWUgdmFsKQotewotICBnY2NfYXNzZXJ0IChUUkVFX0NPREUgKHZhbCkgPT0g U1NBX05BTUUgfHwgaXNfZ2ltcGxlX21pbl9pbnZhcmlhbnQgKHZhbCkpOwotICBpZiAoVFJFRV9P VkVSRkxPV19QICh2YWwpKQotICAgIHZhbCA9IGRyb3BfdHJlZV9vdmVyZmxvdyAodmFsKTsKLSAg c2V0ICh2YWwsIHZhbCk7Ci19Ci0KLXZvaWQKLXZhbHVlX3JhbmdlX2VxdWl2OjpzZXRfdW5kZWZp bmVkICgpCi17Ci0gIHNldCAoTlVMTCwgTlVMTCwgTlVMTCwgVlJfVU5ERUZJTkVEKTsKLX0KLQot dm9pZAotdmFsdWVfcmFuZ2VfZXF1aXY6OnNldF92YXJ5aW5nICh0cmVlIHR5cGUpCi17Ci0gIHZh bHVlX3JhbmdlOjpzZXRfdmFyeWluZyAodHlwZSk7Ci0gIGVxdWl2X2NsZWFyICgpOwotfQotCi0v KiBMaWtlIHNldCwgYnV0IGtlZXAgdGhlIGVxdWl2YWxlbmNlcyBpbiBwbGFjZS4gICovCi0KLXZv aWQKLXZhbHVlX3JhbmdlX2VxdWl2Ojp1cGRhdGUgKHRyZWUgbWluLCB0cmVlIG1heCwgdmFsdWVf cmFuZ2Vfa2luZCBraW5kKQotewotICBzZXQgKG1pbiwgbWF4LAotICAgICAgIChraW5kICE9IFZS X1VOREVGSU5FRCAmJiBraW5kICE9IFZSX1ZBUllJTkcpID8gbV9lcXVpdiA6IE5VTEwsIGtpbmQp OwotfQotCi0vKiBDb3B5IHZhbHVlX3JhbmdlIGluIEZST00gaW50byBUSElTIHdoaWxlIGF2b2lk aW5nIGJpdG1hcCBzaGFyaW5nLgotCi0gICBOb3RlOiBUaGUgY29kZSB0aGF0IGF2b2lkcyB0aGUg Yml0bWFwIHNoYXJpbmcgbG9va3MgYXQgdGhlIGV4aXN0aW5nCi0gICB0aGlzLT5tX2VxdWl2LCBz byB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkIHRvIGluaXRhbGl6ZSBhbgotICAgb2JqZWN0 LiAgVXNlIHRoZSBjb25zdHJ1Y3RvcnMgZm9yIGluaXRpYWxpemF0aW9uLiAgKi8KLQotdm9pZAot dmFsdWVfcmFuZ2VfZXF1aXY6OmRlZXBfY29weSAoY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKmZy b20pCi17Ci0gIHNldCAoZnJvbS0+bWluICgpLCBmcm9tLT5tYXggKCksIGZyb20tPm1fZXF1aXYs IGZyb20tPmtpbmQgKCkpOwotfQotCi12b2lkCi12YWx1ZV9yYW5nZV9lcXVpdjo6bW92ZSAodmFs dWVfcmFuZ2VfZXF1aXYgKmZyb20pCi17Ci0gIHNldCAoZnJvbS0+bWluICgpLCBmcm9tLT5tYXgg KCksIE5VTEwsIGZyb20tPmtpbmQgKCkpOwotICBtX2VxdWl2ID0gZnJvbS0+bV9lcXVpdjsKLSAg ZnJvbS0+bV9lcXVpdiA9IE5VTEw7Ci19Ci0KLXZvaWQKLXZhbHVlX3JhbmdlX2VxdWl2OjpzZXRf ZXF1aXYgKGJpdG1hcCBlcXVpdikKLXsKLSAgaWYgKHVuZGVmaW5lZF9wICgpIHx8IHZhcnlpbmdf cCAoKSkKLSAgICBlcXVpdiA9IE5VTEw7Ci0gIC8qIFNpbmNlIHVwZGF0aW5nIHRoZSBlcXVpdmFs ZW5jZSBzZXQgaW52b2x2ZXMgZGVlcCBjb3B5aW5nIHRoZQotICAgICBiaXRtYXBzLCBvbmx5IGRv IGl0IGlmIGFic29sdXRlbHkgbmVjZXNzYXJ5LgotCi0gICAgIEFsbCBlcXVpdmFsZW5jZSBiaXRt YXBzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUgc2FtZSBvYnN0YWNrLiAgU28KLSAgICAgd2UgY2Fu IHVzZSB0aGUgb2JzdGFjayBhc3NvY2lhdGVkIHdpdGggRVFVSVYgdG8gYWxsb2NhdGUgdnItPmVx dWl2LiAgKi8KLSAgaWYgKG1fZXF1aXYgPT0gTlVMTAotICAgICAgJiYgZXF1aXYgIT0gTlVMTCkK LSAgICBtX2VxdWl2ID0gQklUTUFQX0FMTE9DIChlcXVpdi0+b2JzdGFjayk7Ci0KLSAgaWYgKGVx dWl2ICE9IG1fZXF1aXYpCi0gICAgewotICAgICAgaWYgKGVxdWl2ICYmICFiaXRtYXBfZW1wdHlf cCAoZXF1aXYpKQotCWJpdG1hcF9jb3B5IChtX2VxdWl2LCBlcXVpdik7Ci0gICAgICBlbHNlCi0J Yml0bWFwX2NsZWFyIChtX2VxdWl2KTsKLSAgICB9Ci19Ci0KLXZvaWQKLXZhbHVlX3JhbmdlX2Vx dWl2OjpjaGVjayAoKQotewotICB2YWx1ZV9yYW5nZTo6dmVyaWZ5X3JhbmdlICgpOwotICBzd2l0 Y2ggKGtpbmQgKCkpCi0gICAgewotICAgIGNhc2UgVlJfVU5ERUZJTkVEOgotICAgIGNhc2UgVlJf VkFSWUlORzoKLSAgICAgIGdjY19hc3NlcnQgKCFtX2VxdWl2IHx8IGJpdG1hcF9lbXB0eV9wICht X2VxdWl2KSk7Ci0gICAgZGVmYXVsdDo7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0 aGUgYml0bWFwcyBCMSBhbmQgQjIgYXJlIGVxdWFsLiAgKi8KLQotc3RhdGljIGJvb2wKLXZyX2Jp dG1hcF9lcXVhbF9wIChjb25zdF9iaXRtYXAgYjEsIGNvbnN0X2JpdG1hcCBiMikKLXsKLSAgcmV0 dXJuIChiMSA9PSBiMgotCSAgfHwgKCghYjEgfHwgYml0bWFwX2VtcHR5X3AgKGIxKSkKLQkgICAg ICAmJiAoIWIyIHx8IGJpdG1hcF9lbXB0eV9wIChiMikpKQotCSAgfHwgKGIxICYmIGIyCi0JICAg ICAgJiYgYml0bWFwX2VxdWFsX3AgKGIxLCBiMikpKTsKLX0KLQotLyogUmV0dXJucyBUUlVFIGlm IFRISVMgPT0gT1RIRVIuICBJZ25vcmVzIHRoZSBlcXVpdmFsZW5jZSBiaXRtYXAgaWYKLSAgIElH Tk9SRV9FUVVJVlMgaXMgVFJVRS4gICovCi0KLWJvb2wKLXZhbHVlX3JhbmdlX2VxdWl2OjplcXVh bF9wIChjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAmb3RoZXIsCi0JCQkgICAgYm9vbCBpZ25vcmVf ZXF1aXZzKSBjb25zdAotewotICByZXR1cm4gKHZhbHVlX3JhbmdlOjpvcGVyYXRvcj09IChvdGhl cikKLQkgICYmIChpZ25vcmVfZXF1aXZzIHx8IHZyX2JpdG1hcF9lcXVhbF9wIChtX2VxdWl2LCBv dGhlci5tX2VxdWl2KSkpOwotfQotCi12b2lkCi12YWx1ZV9yYW5nZV9lcXVpdjo6ZXF1aXZfY2xl YXIgKCkKLXsKLSAgaWYgKG1fZXF1aXYpCi0gICAgYml0bWFwX2NsZWFyIChtX2VxdWl2KTsKLX0K LQotLyogQWRkIFZBUiBhbmQgVkFSJ3MgZXF1aXZhbGVuY2Ugc2V0IChWQVJfVlIpIHRvIHRoZSBl cXVpdmFsZW5jZQotICAgYml0bWFwLiAgSWYgbm8gZXF1aXZhbGVuY2UgdGFibGUgaGFzIGJlZW4g Y3JlYXRlZCwgT0JTVEFDSyBpcyB0aGUKLSAgIG9ic3RhY2sgdG8gdXNlIChOVUxMIGZvciB0aGUg ZGVmYXVsdCBvYnN0YWNrKS4KLQotICAgVGhpcyBpcyB0aGUgY2VudHJhbCBwb2ludCB3aGVyZSBl cXVpdmFsZW5jZSBwcm9jZXNzaW5nIGNhbiBiZQotICAgdHVybmVkIG9uL29mZi4gICovCi0KLXZv aWQKLXZhbHVlX3JhbmdlX2VxdWl2OjplcXVpdl9hZGQgKGNvbnN0X3RyZWUgdmFyLAotCQkJICAg ICAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZhcl92ciwKLQkJCSAgICAgIGJpdG1hcF9vYnN0 YWNrICpvYnN0YWNrKQotewotICBpZiAoIW1fZXF1aXYpCi0gICAgbV9lcXVpdiA9IEJJVE1BUF9B TExPQyAob2JzdGFjayk7Ci0gIHVuc2lnbmVkIHZlciA9IFNTQV9OQU1FX1ZFUlNJT04gKHZhcik7 Ci0gIGJpdG1hcF9zZXRfYml0IChtX2VxdWl2LCB2ZXIpOwotICBpZiAodmFyX3ZyICYmIHZhcl92 ci0+bV9lcXVpdikKLSAgICBiaXRtYXBfaW9yX2ludG8gKG1fZXF1aXYsIHZhcl92ci0+bV9lcXVp dik7Ci19Ci0KLXZvaWQKLXZhbHVlX3JhbmdlX2VxdWl2OjpsZWdhY3lfdmVyYm9zZV9pbnRlcnNl Y3QgKGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICpvdGhlcikKLXsKLSAgaWYgKGR1bXBfZmlsZSAm JiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChkdW1w X2ZpbGUsICJJbnRlcnNlY3RpbmdcbiAgIik7Ci0gICAgICBkdW1wX3ZhbHVlX3JhbmdlIChkdW1w X2ZpbGUsIHRoaXMpOwotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG5hbmRcbiAgIik7Ci0g ICAgICBkdW1wX3ZhbHVlX3JhbmdlIChkdW1wX2ZpbGUsIG90aGVyKTsKLSAgICAgIGZwcmludGYg KGR1bXBfZmlsZSwgIlxuIik7Ci0gICAgfQotCi0gIC8qIElmIFRISVMgaXMgdmFyeWluZyB3ZSB3 YW50IHRvIHBpY2sgdXAgZXF1aXZhbGVuY2VzIGZyb20gT1RIRVIuCi0gICAgIEp1c3Qgc3BlY2lh bC1jYXNlIHRoaXMgaGVyZSByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZml4dXAgYWZ0ZXIgdGhlCi0g ICAgIGZhY3QuICAqLwotICBpZiAodGhpcy0+dmFyeWluZ19wICgpKQotICAgIHRoaXMtPmRlZXBf Y29weSAob3RoZXIpOwotICBlbHNlCi0gICAgewotICAgICAgbGVnYWN5X2ludGVyc2VjdCAodGhp cywgb3RoZXIpOwotICAgICAgaWYgKHZhcnlpbmdfcCAoKSB8fCB1bmRlZmluZWRfcCAoKSkKLQll cXVpdl9jbGVhciAoKTsKLQotICAgICAgLyogSWYgdGhlIHJlc3VsdCBpcyBWUl9VTkRFRklORUQg dGhlcmUgaXMgbm8gbmVlZCB0byBtZXNzIHdpdGgKLQkgZXF1aXZhbGVuY2llcy4gICovCi0gICAg ICBpZiAoIXVuZGVmaW5lZF9wICgpKQotCXsKLQkgIC8qIFRoZSByZXN1bHRpbmcgc2V0IG9mIGVx dWl2YWxlbmNlcyBmb3IgcmFuZ2UgaW50ZXJzZWN0aW9uCi0JICAgICBpcyB0aGUgdW5pb24gb2Yg dGhlIHR3byBzZXRzLiAgKi8KLQkgIGlmIChtX2VxdWl2ICYmIG90aGVyLT5tX2VxdWl2ICYmIG1f ZXF1aXYgIT0gb3RoZXItPm1fZXF1aXYpCi0JICAgIGJpdG1hcF9pb3JfaW50byAobV9lcXVpdiwg b3RoZXItPm1fZXF1aXYpOwotCSAgZWxzZSBpZiAob3RoZXItPm1fZXF1aXYgJiYgIW1fZXF1aXYp Ci0JICAgIHsKLQkgICAgICAvKiBBbGwgZXF1aXZhbGVuY2UgYml0bWFwcyBhcmUgYWxsb2NhdGVk IGZyb20gdGhlIHNhbWUKLQkJIG9ic3RhY2suICBTbyB3ZSBjYW4gdXNlIHRoZSBvYnN0YWNrIGFz c29jaWF0ZWQgd2l0aAotCQkgVlIgdG8gYWxsb2NhdGUgdGhpcy0+bV9lcXVpdi4gICovCi0JICAg ICAgbV9lcXVpdiA9IEJJVE1BUF9BTExPQyAob3RoZXItPm1fZXF1aXYtPm9ic3RhY2spOwotCSAg ICAgIGJpdG1hcF9jb3B5IChtX2VxdWl2LCBvdGhlci0+bV9lcXVpdik7Ci0JICAgIH0KLQl9Ci0g ICAgfQotCi0gIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0g ICAgewotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAidG9cbiAgIik7Ci0gICAgICBkdW1wX3Zh bHVlX3JhbmdlIChkdW1wX2ZpbGUsIHRoaXMpOwotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAi XG4iKTsKLSAgICB9Ci19Ci0KLXZvaWQKLXZhbHVlX3JhbmdlX2VxdWl2OjpsZWdhY3lfdmVyYm9z ZV91bmlvbl8gKGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICpvdGhlcikKLXsKLSAgaWYgKGR1bXBf ZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLSAgICB7Ci0gICAgICBmcHJpbnRm IChkdW1wX2ZpbGUsICJNZWV0aW5nXG4gICIpOwotICAgICAgZHVtcF92YWx1ZV9yYW5nZSAoZHVt cF9maWxlLCB0aGlzKTsKLSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuYW5kXG4gICIpOwot ICAgICAgZHVtcF92YWx1ZV9yYW5nZSAoZHVtcF9maWxlLCBvdGhlcik7Ci0gICAgICBmcHJpbnRm IChkdW1wX2ZpbGUsICJcbiIpOwotICAgIH0KLQotICAvKiBJZiBUSElTIGlzIHVuZGVmaW5lZCB3 ZSB3YW50IHRvIHBpY2sgdXAgZXF1aXZhbGVuY2VzIGZyb20gT1RIRVIuCi0gICAgIEp1c3Qgc3Bl Y2lhbC1jYXNlIHRoaXMgaGVyZSByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZml4dXAgYWZ0ZXIgdGhl IGZhY3QuICAqLwotICBpZiAodGhpcy0+dW5kZWZpbmVkX3AgKCkpCi0gICAgdGhpcy0+ZGVlcF9j b3B5IChvdGhlcik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsZWdhY3lfdW5pb24gKHRoaXMsIG90 aGVyKTsKLSAgICAgIGlmICh2YXJ5aW5nX3AgKCkgfHwgdW5kZWZpbmVkX3AgKCkpCi0JZXF1aXZf Y2xlYXIgKCk7Ci0KLSAgICAgIC8qIFRoZSByZXN1bHRpbmcgc2V0IG9mIGVxdWl2YWxlbmNlcyBp cyBhbHdheXMgdGhlIGludGVyc2VjdGlvbiBvZgotCSB0aGUgdHdvIHNldHMuICAqLwotICAgICAg aWYgKHRoaXMtPm1fZXF1aXYgJiYgb3RoZXItPm1fZXF1aXYgJiYgdGhpcy0+bV9lcXVpdiAhPSBv dGhlci0+bV9lcXVpdikKLQliaXRtYXBfYW5kX2ludG8gKHRoaXMtPm1fZXF1aXYsIG90aGVyLT5t X2VxdWl2KTsKLSAgICAgIGVsc2UgaWYgKHRoaXMtPm1fZXF1aXYgJiYgIW90aGVyLT5tX2VxdWl2 KQotCWJpdG1hcF9jbGVhciAodGhpcy0+bV9lcXVpdik7Ci0gICAgfQotCi0gIGlmIChkdW1wX2Zp bGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0gICAgewotICAgICAgZnByaW50ZiAo ZHVtcF9maWxlLCAidG9cbiAgIik7Ci0gICAgICBkdW1wX3ZhbHVlX3JhbmdlIChkdW1wX2ZpbGUs IHRoaXMpOwotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG4iKTsKLSAgICB9Ci19Ci0KLXZv aWQKLXZhbHVlX3JhbmdlX2VxdWl2OjpkdW1wIChGSUxFICpmaWxlKSBjb25zdAotewotICB2YWx1 ZV9yYW5nZTo6ZHVtcCAoZmlsZSk7Ci0gIGlmICgoa2luZCAoKSA9PSBWUl9SQU5HRSB8fCBraW5k ICgpID09IFZSX0FOVElfUkFOR0UpCi0gICAgICAmJiBtX2VxdWl2KQotICAgIHsKLSAgICAgIGJp dG1hcF9pdGVyYXRvciBiaTsKLSAgICAgIHVuc2lnbmVkIGksIGMgPSAwOwotCi0gICAgICBmcHJp bnRmIChmaWxlLCAiICBFUVVJVkFMRU5DRVM6IHsgIik7Ci0gICAgICBFWEVDVVRFX0lGX1NFVF9J Tl9CSVRNQVAgKG1fZXF1aXYsIDAsIGksIGJpKQotCXsKLQkgIHByaW50X2dlbmVyaWNfZXhwciAo ZmlsZSwgc3NhX25hbWUgKGkpKTsKLQkgIGZwcmludGYgKGZpbGUsICIgIik7Ci0JICBjKys7Ci0J fQotICAgICAgZnByaW50ZiAoZmlsZSwgIn0gKCV1IGVsZW1lbnRzKSIsIGMpOwotICAgIH0KLX0K LQotdm9pZAotdmFsdWVfcmFuZ2VfZXF1aXY6OmR1bXAgKCkgY29uc3QKLXsKLSAgZHVtcCAoc3Rk ZXJyKTsKLX0KLQotdm9pZAotZHVtcF92YWx1ZV9yYW5nZSAoRklMRSAqZmlsZSwgY29uc3QgdmFs dWVfcmFuZ2VfZXF1aXYgKnZyKQotewotICBpZiAoIXZyKQotICAgIGZwcmludGYgKGZpbGUsICJb XSIpOwotICBlbHNlCi0gICAgdnItPmR1bXAgKGZpbGUpOwotfQotCi1ERUJVR19GVU5DVElPTiB2 b2lkCi1kZWJ1ZyAoY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyKQotewotICBkdW1wX3ZhbHVl X3JhbmdlIChzdGRlcnIsIHZyKTsKLX0KLQotREVCVUdfRlVOQ1RJT04gdm9pZAotZGVidWcgKGNv bnN0IHZhbHVlX3JhbmdlX2VxdWl2ICZ2cikKLXsKLSAgZHVtcF92YWx1ZV9yYW5nZSAoc3RkZXJy LCAmdnIpOwotfQpkaWZmIC0tZ2l0IGEvZ2NjL3ZhbHVlLXJhbmdlLWVxdWl2LmggYi9nY2MvdmFs dWUtcmFuZ2UtZXF1aXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4MDE0ZGY4 MzQuLjAwMDAwMDAwMDAwCi0tLSBhL2djYy92YWx1ZS1yYW5nZS1lcXVpdi5oCisrKyAvZGV2L251 bGwKQEAgLTEsOTAgKzAsMCBAQAotLyogU3VwcG9ydCByb3V0aW5lcyBmb3IgdmFsdWUgcmFuZ2Vz IHdpdGggZXF1aXZhbGVuY2VzLgotICAgQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KLQotR0ND IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkK LWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAzLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0NDIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVS Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UKLWFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCi08 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIEdDQ19WQUxVRV9S QU5HRV9FUVVJVl9ICi0jZGVmaW5lIEdDQ19WQUxVRV9SQU5HRV9FUVVJVl9ICi0KLSNpbmNsdWRl ICJ2YWx1ZS1yYW5nZS5oIgotCi0vKiBOb3RlIHZhbHVlX3JhbmdlX2VxdWl2IGNhbm5vdCBjdXJy ZW50bHkgYmUgdXNlZCB3aXRoIEdDIG1lbW9yeSwKLSAgIG9ubHkgdmFsdWVfcmFuZ2UgaXMgZnVs bHkgc2V0IHVwIGZvciB0aGlzLiAgKi8KLWNsYXNzIEdUWSgodXNlcikpIHZhbHVlX3JhbmdlX2Vx dWl2IDogcHVibGljIHZhbHVlX3JhbmdlCi17Ci0gcHVibGljOgotICB2YWx1ZV9yYW5nZV9lcXVp diAoKSA6IHZhbHVlX3JhbmdlICgpIHsgbV9lcXVpdiA9IE5VTEw7IH0KLSAgdmFsdWVfcmFuZ2Vf ZXF1aXYgKGNvbnN0IHZhbHVlX3JhbmdlICYpOwotICAvKiBEZWVwLWNvcGllcyBlcXVpdiBiaXRt YXAgYXJndW1lbnQuICAqLwotICB2YWx1ZV9yYW5nZV9lcXVpdiAodHJlZSwgdHJlZSwgYml0bWFw ID0gTlVMTCwgdmFsdWVfcmFuZ2Vfa2luZCA9IFZSX1JBTkdFKTsKLQotICAvKiBTaGFsbG93LWNv cGllcyBlcXVpdiBiaXRtYXAuICAqLwotICB2YWx1ZV9yYW5nZV9lcXVpdiAoY29uc3QgdmFsdWVf cmFuZ2VfZXF1aXYgJikgLyogPSBkZWxldGUgKi87Ci0gIC8qIFNoYWxsb3ctY29waWVzIGVxdWl2 IGJpdG1hcC4gICovCi0gIHZhbHVlX3JhbmdlX2VxdWl2JiBvcGVyYXRvcj0oY29uc3QgdmFsdWVf cmFuZ2VfZXF1aXYgJikgLyogPSBkZWxldGUgKi87Ci0KLSAgLyogVmlydHVhbCBkZXN0cnVjdG9y LiAgKi8KLSAgdmlydHVhbCB+dmFsdWVfcmFuZ2VfZXF1aXYgKCkgPSBkZWZhdWx0OwotCi0gIC8q IE1vdmUgZXF1aXYgYml0bWFwIGZyb20gc291cmNlIHJhbmdlLiAgKi8KLSAgdm9pZCBtb3ZlICh2 YWx1ZV9yYW5nZV9lcXVpdiAqKTsKLQotICAvKiBMZWF2ZXMgZXF1aXYgYml0bWFwIGFsb25lLiAg Ki8KLSAgdmlydHVhbCB2b2lkIHNldCAodHJlZSwgdHJlZSwgdmFsdWVfcmFuZ2Vfa2luZCA9IFZS X1JBTkdFKSBvdmVycmlkZTsKLSAgdm9pZCB1cGRhdGUgKHRyZWUsIHRyZWUsIHZhbHVlX3Jhbmdl X2tpbmQgPSBWUl9SQU5HRSk7Ci0gIC8qIERlZXAtY29waWVzIGVxdWl2IGJpdG1hcCBhcmd1bWVu dC4gICovCi0gIHZvaWQgc2V0ICh0cmVlLCB0cmVlLCBiaXRtYXAsIHZhbHVlX3JhbmdlX2tpbmQg PSBWUl9SQU5HRSk7Ci0gIHZvaWQgc2V0ICh0cmVlKTsKLQotICBib29sIG9wZXJhdG9yPT0gKGNv bnN0IHZhbHVlX3JhbmdlX2VxdWl2ICYpIGNvbnN0IC8qID0gZGVsZXRlICovOwotICBib29sIG9w ZXJhdG9yIT0gKGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICYpIGNvbnN0IC8qID0gZGVsZXRlICov OwotICB2b2lkIGxlZ2FjeV92ZXJib3NlX2ludGVyc2VjdCAoY29uc3QgdmFsdWVfcmFuZ2VfZXF1 aXYgKik7Ci0gIHZvaWQgbGVnYWN5X3ZlcmJvc2VfdW5pb25fIChjb25zdCB2YWx1ZV9yYW5nZV9l cXVpdiAqKTsKLSAgYm9vbCBlcXVhbF9wIChjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAmLCBib29s IGlnbm9yZV9lcXVpdnMpIGNvbnN0OwotCi0gIC8qIFR5cGVzIG9mIHZhbHVlIHJhbmdlcy4gICov Ci0gIHZvaWQgc2V0X3VuZGVmaW5lZCAoKSBvdmVycmlkZTsKLSAgdm9pZCBzZXRfdmFyeWluZyAo dHJlZSkgb3ZlcnJpZGU7Ci0KLSAgLyogRXF1aXZhbGVuY2UgYml0bWFwIG1ldGhvZHMuICAqLwot ICBiaXRtYXAgZXF1aXYgKCkgY29uc3QgeyByZXR1cm4gbV9lcXVpdjsgfQotICB2b2lkIGVxdWl2 X2NsZWFyICgpOwotICB2b2lkIGVxdWl2X2FkZCAoY29uc3RfdHJlZSwgY29uc3QgdmFsdWVfcmFu Z2VfZXF1aXYgKiwKLQkJICBiaXRtYXBfb2JzdGFjayAqID0gTlVMTCk7Ci0KLSAgLyogTWlzYyBt ZXRob2RzLiAgKi8KLSAgdm9pZCBkZWVwX2NvcHkgKGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICop OwotICB2b2lkIGR1bXAgKEZJTEUgKikgY29uc3Q7Ci0gIHZvaWQgZHVtcCAoKSBjb25zdDsKLSAg c3RhdGljIGJvb2wgc3VwcG9ydHNfcCAodHJlZSB0eXBlKQotICB7Ci0gICAgcmV0dXJuIElOVEVH UkFMX1RZUEVfUCAodHlwZSkgfHwgUE9JTlRFUl9UWVBFX1AgKHR5cGUpOwotICB9Ci0KLSBwcml2 YXRlOgotICAvKiBEZWVwLWNvcGllcyBiaXRtYXAgYXJndW1lbnQuICAqLwotICB2b2lkIHNldF9l cXVpdiAoYml0bWFwKTsKLSAgdm9pZCBjaGVjayAoKTsKLQotICAvKiBTZXQgb2YgU1NBIG5hbWVz IHdob3NlIHZhbHVlIHJhbmdlcyBhcmUgZXF1aXZhbGVudCB0byB0aGlzIG9uZS4KLSAgICAgVGhp cyBzZXQgaXMgb25seSB2YWxpZCB3aGVuIFRZUEUgaXMgVlJfUkFOR0Ugb3IgVlJfQU5USV9SQU5H RS4gICovCi0gIGJpdG1hcCBtX2VxdWl2OwotfTsKLQotZXh0ZXJuIHZvaWQgZHVtcF92YWx1ZV9y YW5nZSAoRklMRSAqLCBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqKTsKLQotI2VuZGlmIC8vIEdD Q19WQUxVRV9SQU5HRV9FUVVJVl9ICmRpZmYgLS1naXQgYS9nY2MvdnItdmFsdWVzLmNjIGIvZ2Nj L3ZyLXZhbHVlcy5jYwppbmRleCBhMTAzYzA4YmEzNS4uNzk4YmZkYzkwNGEgMTAwNjQ0Ci0tLSBh L2djYy92ci12YWx1ZXMuY2MKKysrIGIvZ2NjL3ZyLXZhbHVlcy5jYwpAQCAtMjE1LDggKzIxNSw4 IEBAIGNoZWNrX2Zvcl9iaW5hcnlfb3Bfb3ZlcmZsb3cgKHJhbmdlX3F1ZXJ5ICpxdWVyeSwKIAog CiBzdGF0aWMgdHJlZQotY29tcGFyZV9yYW5nZXMgKGVudW0gdHJlZV9jb2RlIGNvbXAsIGNvbnN0 IHZhbHVlX3JhbmdlX2VxdWl2ICp2cjAsCi0JCWNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICp2cjEs IGJvb2wgKnN0cmljdF9vdmVyZmxvd19wKQorY29tcGFyZV9yYW5nZXMgKGVudW0gdHJlZV9jb2Rl IGNvbXAsIGNvbnN0IHZhbHVlX3JhbmdlICp2cjAsCisJCWNvbnN0IHZhbHVlX3JhbmdlICp2cjEs IGJvb2wgKnN0cmljdF9vdmVyZmxvd19wKQogewogICAvKiBWQVJZSU5HIG9yIFVOREVGSU5FRCBy YW5nZXMgY2Fubm90IGJlIGNvbXBhcmVkLiAgKi8KICAgaWYgKHZyMC0+dmFyeWluZ19wICgpCkBA IC02MTksMTkgKzYxOSwyMCBAQCBib3VuZHNfb2ZfdmFyX2luX2xvb3AgKHRyZWUgKm1pbiwgdHJl ZSAqbWF4LCByYW5nZV9xdWVyeSAqcXVlcnksCiAgICBvciBhIHN5bWJvbGljIHJhbmdlIGNvbnRh aW5pbmcgdGhlIFNTQV9OQU1FIG9ubHkgaWYgdGhlIHZhbHVlIHJhbmdlCiAgICBpcyB2YXJ5aW5n IG9yIHVuZGVmaW5lZC4gIFVzZXMgVEVNIGFzIHN0b3JhZ2UgZm9yIHRoZSBhbHRlcm5hdGUgcmFu Z2UuICAqLwogCi1jb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqCi1zaW1wbGlmeV91c2luZ19yYW5n ZXM6OmdldF92cl9mb3JfY29tcGFyaXNvbiAoaW50IGksIHZhbHVlX3JhbmdlX2VxdWl2ICp0ZW0s Citjb25zdCB2YWx1ZV9yYW5nZSAqCitzaW1wbGlmeV91c2luZ19yYW5nZXM6OmdldF92cl9mb3Jf Y29tcGFyaXNvbiAoaW50IGksIHZhbHVlX3JhbmdlICp0ZW0sCiAJCQkJCSAgICAgIGdpbXBsZSAq cykKIHsKICAgLyogU2hhbGxvdy1jb3B5IGVxdWl2IGJpdG1hcC4gICovCi0gIGNvbnN0IHZhbHVl X3JhbmdlX2VxdWl2ICp2ciA9IHF1ZXJ5LT5nZXRfdmFsdWVfcmFuZ2UgKHNzYV9uYW1lIChpKSwg cyk7CisgIGNvbnN0IHZhbHVlX3JhbmdlICp2ciA9IHF1ZXJ5LT5nZXRfdmFsdWVfcmFuZ2UgKHNz YV9uYW1lIChpKSwgcyk7CiAKICAgLyogSWYgbmFtZSBOX2kgZG9lcyBub3QgaGF2ZSBhIHZhbGlk IHJhbmdlLCB1c2UgTl9pIGFzIGl0cyBvd24KICAgICAgcmFuZ2UuICBUaGlzIGFsbG93cyB1cyB0 byBjb21wYXJlIGFnYWluc3QgbmFtZXMgdGhhdCBtYXkKICAgICAgaGF2ZSBOX2kgaW4gdGhlaXIg cmFuZ2VzLiAgKi8KICAgaWYgKHZyLT52YXJ5aW5nX3AgKCkgfHwgdnItPnVuZGVmaW5lZF9wICgp KQogICAgIHsKLSAgICAgIHRlbS0+c2V0IChzc2FfbmFtZSAoaSkpOworICAgICAgdHJlZSBzc2Eg PSBzc2FfbmFtZSAoaSk7CisgICAgICB0ZW0tPnNldCAoc3NhLCBzc2EpOwogICAgICAgcmV0dXJu IHRlbTsKICAgICB9CiAKQEAgLTY0Niw3NyArNjQ3LDI2IEBAIHNpbXBsaWZ5X3VzaW5nX3Jhbmdl czo6Z2V0X3ZyX2Zvcl9jb21wYXJpc29uIChpbnQgaSwgdmFsdWVfcmFuZ2VfZXF1aXYgKnRlbSwK IHRyZWUKIHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6Y29tcGFyZV9uYW1lX3dpdGhfdmFsdWUKIAkJ CQkoZW51bSB0cmVlX2NvZGUgY29tcCwgdHJlZSB2YXIsIHRyZWUgdmFsLAotCQkJCSBib29sICpz dHJpY3Rfb3ZlcmZsb3dfcCwgYm9vbCB1c2VfZXF1aXZfcCwKLQkJCQkgZ2ltcGxlICpzKQorCQkJ CSBib29sICpzdHJpY3Rfb3ZlcmZsb3dfcCwgZ2ltcGxlICpzKQogewotICAvKiBHZXQgdGhlIHNl dCBvZiBlcXVpdmFsZW5jZXMgZm9yIFZBUi4gICovCi0gIGJpdG1hcCBlID0gcXVlcnktPmdldF92 YWx1ZV9yYW5nZSAodmFyLCBzKS0+ZXF1aXYgKCk7Ci0KICAgLyogU3RhcnQgYXQgLTEuICBTZXQg aXQgdG8gMCBpZiB3ZSBkbyBhIGNvbXBhcmlzb24gd2l0aG91dCByZWx5aW5nCiAgICAgIG9uIG92 ZXJmbG93LCBvciAxIGlmIGFsbCBjb21wYXJpc29ucyByZWx5IG9uIG92ZXJmbG93LiAgKi8KICAg aW50IHVzZWRfc3RyaWN0X292ZXJmbG93ID0gLTE7CiAKICAgLyogQ29tcGFyZSB2YXJzJyB2YWx1 ZSByYW5nZSB3aXRoIHZhbC4gICovCi0gIHZhbHVlX3JhbmdlX2VxdWl2IHRlbV92cjsKLSAgY29u c3QgdmFsdWVfcmFuZ2VfZXF1aXYgKmVxdWl2X3ZyCisgIHZhbHVlX3JhbmdlIHRlbV92cjsKKyAg Y29uc3QgdmFsdWVfcmFuZ2UgKmVxdWl2X3ZyCiAgICAgPSBnZXRfdnJfZm9yX2NvbXBhcmlzb24g KFNTQV9OQU1FX1ZFUlNJT04gKHZhciksICZ0ZW1fdnIsIHMpOwogICBib29sIHNvcCA9IGZhbHNl OwogICB0cmVlIHJldHZhbCA9IGNvbXBhcmVfcmFuZ2Vfd2l0aF92YWx1ZSAoY29tcCwgZXF1aXZf dnIsIHZhbCwgJnNvcCk7CiAgIGlmIChyZXR2YWwpCiAgICAgdXNlZF9zdHJpY3Rfb3ZlcmZsb3cg PSBzb3AgPyAxIDogMDsKIAotICAvKiBJZiB0aGUgZXF1aXYgc2V0IGlzIGVtcHR5IHdlIGhhdmUg ZG9uZSBhbGwgd29yayB3ZSBuZWVkIHRvIGRvLiAgKi8KLSAgaWYgKGUgPT0gTlVMTCkKLSAgICB7 Ci0gICAgICBpZiAocmV0dmFsICYmIHVzZWRfc3RyaWN0X292ZXJmbG93ID4gMCkKLQkqc3RyaWN0 X292ZXJmbG93X3AgPSB0cnVlOwotICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0KLSAgdW5z aWduZWQgaTsKLSAgYml0bWFwX2l0ZXJhdG9yIGJpOwotICBFWEVDVVRFX0lGX1NFVF9JTl9CSVRN QVAgKGUsIDAsIGksIGJpKQotICAgIHsKLSAgICAgIHRyZWUgbmFtZSA9IHNzYV9uYW1lIChpKTsK LSAgICAgIGlmICghbmFtZSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKCF1c2VfZXF1aXZfcAot CSAgJiYgIVNTQV9OQU1FX0lTX0RFRkFVTFRfREVGIChuYW1lKQotCSAgJiYgcHJvcF9zaW11bGF0 ZV9hZ2Fpbl9wIChTU0FfTkFNRV9ERUZfU1RNVCAobmFtZSkpKQotCWNvbnRpbnVlOwotCi0gICAg ICBlcXVpdl92ciA9IGdldF92cl9mb3JfY29tcGFyaXNvbiAoaSwgJnRlbV92ciwgcyk7Ci0gICAg ICBzb3AgPSBmYWxzZTsKLSAgICAgIHRyZWUgdCA9IGNvbXBhcmVfcmFuZ2Vfd2l0aF92YWx1ZSAo Y29tcCwgZXF1aXZfdnIsIHZhbCwgJnNvcCk7Ci0gICAgICBpZiAodCkKLQl7Ci0JICAvKiBJZiB3 ZSBnZXQgZGlmZmVyZW50IGFuc3dlcnMgZnJvbSBkaWZmZXJlbnQgbWVtYmVycwotCSAgICAgb2Yg dGhlIGVxdWl2YWxlbmNlIHNldCB0aGlzIGNoZWNrIG11c3QgYmUgaW4gYSBkZWFkCi0JICAgICBj b2RlIHJlZ2lvbi4gIEZvbGRpbmcgaXQgdG8gYSB0cmFwIHJlcHJlc2VudGF0aW9uCi0JICAgICB3 b3VsZCBiZSBjb3JyZWN0IGhlcmUuICBGb3Igbm93IGp1c3QgcmV0dXJuIGRvbid0LWtub3cuICAq LwotCSAgaWYgKHJldHZhbCAhPSBOVUxMCi0JICAgICAgJiYgdCAhPSByZXR2YWwpCi0JICAgIHsK LQkgICAgICByZXR2YWwgPSBOVUxMX1RSRUU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHJl dHZhbCA9IHQ7Ci0KLQkgIGlmICghc29wKQotCSAgICB1c2VkX3N0cmljdF9vdmVyZmxvdyA9IDA7 Ci0JICBlbHNlIGlmICh1c2VkX3N0cmljdF9vdmVyZmxvdyA8IDApCi0JICAgIHVzZWRfc3RyaWN0 X292ZXJmbG93ID0gMTsKLQl9Ci0gICAgfQotCiAgIGlmIChyZXR2YWwgJiYgdXNlZF9zdHJpY3Rf b3ZlcmZsb3cgPiAwKQogICAgICpzdHJpY3Rfb3ZlcmZsb3dfcCA9IHRydWU7Ci0KICAgcmV0dXJu IHJldHZhbDsKIH0KIAotCiAvKiBHaXZlbiBhIGNvbXBhcmlzb24gY29kZSBDT01QIGFuZCBuYW1l cyBOMSBhbmQgTjIsIGNvbXBhcmUgYWxsIHRoZQogICAgcmFuZ2VzIGVxdWl2YWxlbnQgdG8gTjEg YWdhaW5zdCBhbGwgdGhlIHJhbmdlcyBlcXVpdmFsZW50IHRvIE4yCiAgICB0byBkZXRlcm1pbmUg dGhlIHZhbHVlIG9mIE4xIENPTVAgTjIuICBSZXR1cm4gdGhlIHNhbWUgdmFsdWUKQEAgLTcyOCwx MCArNjc4LDEwIEBAIHRyZWUKIHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6Y29tcGFyZV9uYW1lcyAo ZW51bSB0cmVlX2NvZGUgY29tcCwgdHJlZSBuMSwgdHJlZSBuMiwKIAkJCQkgICAgICBib29sICpz dHJpY3Rfb3ZlcmZsb3dfcCwgZ2ltcGxlICpzKQogewotICAvKiBDb21wYXJlIHRoZSByYW5nZXMg b2YgZXZlcnkgbmFtZSBlcXVpdmFsZW50IHRvIE4xIGFnYWluc3QgdGhlCi0gICAgIHJhbmdlcyBv ZiBldmVyeSBuYW1lIGVxdWl2YWxlbnQgdG8gTjIuICAqLwotICBiaXRtYXAgZTEgPSBxdWVyeS0+ Z2V0X3ZhbHVlX3JhbmdlIChuMSwgcyktPmVxdWl2ICgpOwotICBiaXRtYXAgZTIgPSBxdWVyeS0+ Z2V0X3ZhbHVlX3JhbmdlIChuMiwgcyktPmVxdWl2ICgpOworICAvKiA/PyBUaGVzZSBiaXRtYXBz IGFyZSBOVUxMIGFzIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IGVxdWl2YWxlbmNlcworICAgICBh dmFpbGFibGUgaW4gdGhlIHZhbHVlX3JhbmdlKi4gICovCisgIGJpdG1hcCBlMSA9IE5VTEw7Cisg IGJpdG1hcCBlMiA9IE5VTEw7CiAKICAgLyogVXNlIHRoZSBmYWtlIGJpdG1hcHMgaWYgZTEgb3Ig ZTIgYXJlIG5vdCBhdmFpbGFibGUuICAqLwogICBzdGF0aWMgYml0bWFwIHNfZTEgPSBOVUxMLCBz X2UyID0gTlVMTDsKQEAgLTc4MCw4ICs3MzAsOCBAQCBzaW1wbGlmeV91c2luZ19yYW5nZXM6OmNv bXBhcmVfbmFtZXMgKGVudW0gdHJlZV9jb2RlIGNvbXAsIHRyZWUgbjEsIHRyZWUgbjIsCiAgICAg ICBpZiAoIXNzYV9uYW1lIChpMSkpCiAJY29udGludWU7CiAKLSAgICAgIHZhbHVlX3JhbmdlX2Vx dWl2IHRlbV92cjE7Ci0gICAgICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIxID0gZ2V0X3Zy X2Zvcl9jb21wYXJpc29uIChpMSwgJnRlbV92cjEsIHMpOworICAgICAgdmFsdWVfcmFuZ2UgdGVt X3ZyMTsKKyAgICAgIGNvbnN0IHZhbHVlX3JhbmdlICp2cjEgPSBnZXRfdnJfZm9yX2NvbXBhcmlz b24gKGkxLCAmdGVtX3ZyMSwgcyk7CiAKICAgICAgIHRyZWUgdCA9IE5VTExfVFJFRSwgcmV0dmFs ID0gTlVMTF9UUkVFOwogICAgICAgYml0bWFwX2l0ZXJhdG9yIGJpMjsKQEAgLTc5Myw5ICs3NDMs OCBAQCBzaW1wbGlmeV91c2luZ19yYW5nZXM6OmNvbXBhcmVfbmFtZXMgKGVudW0gdHJlZV9jb2Rl IGNvbXAsIHRyZWUgbjEsIHRyZWUgbjIsCiAKIAkgIGJvb2wgc29wID0gZmFsc2U7CiAKLQkgIHZh bHVlX3JhbmdlX2VxdWl2IHRlbV92cjI7Ci0JICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIy ID0gZ2V0X3ZyX2Zvcl9jb21wYXJpc29uIChpMiwgJnRlbV92cjIsCi0JCQkJCQkJCXMpOworCSAg dmFsdWVfcmFuZ2UgdGVtX3ZyMjsKKwkgIGNvbnN0IHZhbHVlX3JhbmdlICp2cjIgPSBnZXRfdnJf Zm9yX2NvbXBhcmlzb24gKGkyLCAmdGVtX3ZyMiwgcyk7CiAKIAkgIHQgPSBjb21wYXJlX3Jhbmdl cyAoY29tcCwgdnIxLCB2cjIsICZzb3ApOwogCSAgaWYgKHQpCkBAIC04NDQsNyArNzkzLDcgQEAg c2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjp2cnBfZXZhbHVhdGVfY29uZGl0aW9uYWxfd2FybnZfd2l0 aF9vcHNfdXNpbmdfcmFuZ2VzCiAgICAgKGVudW0gdHJlZV9jb2RlIGNvZGUsIHRyZWUgb3AwLCB0 cmVlIG9wMSwgYm9vbCAqIHN0cmljdF9vdmVyZmxvd19wLAogICAgICBnaW1wbGUgKnMpCiB7Ci0g IGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICp2cjAsICp2cjE7CisgIGNvbnN0IHZhbHVlX3Jhbmdl ICp2cjAsICp2cjE7CiAgIHZyMCA9IChUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUpID8gcXVl cnktPmdldF92YWx1ZV9yYW5nZSAob3AwLCBzKSA6IE5VTEw7CiAgIHZyMSA9IChUUkVFX0NPREUg KG9wMSkgPT0gU1NBX05BTUUpID8gcXVlcnktPmdldF92YWx1ZV9yYW5nZSAob3AxLCBzKSA6IE5V TEw7CiAKQEAgLTkyNSw3ICs4NzQsNyBAQCBzaW1wbGlmeV91c2luZ19yYW5nZXM6OnZycF9ldmFs dWF0ZV9jb25kaXRpb25hbF93YXJudl93aXRoX29wcwogCSAgICB9CiAJICBlbHNlCiAJICAgIGdj Y191bnJlYWNoYWJsZSAoKTsKLQkgIGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICp2cjAgPSBxdWVy eS0+Z2V0X3ZhbHVlX3JhbmdlIChvcDAsIHN0bXQpOworCSAgY29uc3QgdmFsdWVfcmFuZ2UgKnZy MCA9IHF1ZXJ5LT5nZXRfdmFsdWVfcmFuZ2UgKG9wMCwgc3RtdCk7CiAJICAvKiBJZiB2cm8sIHRo ZSByYW5nZSBmb3IgT1AwIHRvIHBhc3MgdGhlIG92ZXJmbG93IHRlc3QsIGhhcwogCSAgICAgbm8g aW50ZXJzZWN0aW9uIHdpdGggKnZyMCwgT1AwJ3Mga25vd24gcmFuZ2UsIHRoZW4gdGhlCiAJICAg ICBvdmVyZmxvdyB0ZXN0IGNhbid0IHBhc3MsIHNvIHJldHVybiB0aGUgbm9kZSBmb3IgZmFsc2Uu CkBAIC05NTUsMTEgKzkwNCwxMCBAQCBzaW1wbGlmeV91c2luZ19yYW5nZXM6OnZycF9ldmFsdWF0 ZV9jb25kaXRpb25hbF93YXJudl93aXRoX29wcwogICAgICAgJiYgdXNlX2VxdWl2X3ApCiAgICAg cmV0dXJuIGNvbXBhcmVfbmFtZXMgKGNvZGUsIG9wMCwgb3AxLCBzdHJpY3Rfb3ZlcmZsb3dfcCwg c3RtdCk7CiAgIGVsc2UgaWYgKFRSRUVfQ09ERSAob3AwKSA9PSBTU0FfTkFNRSkKLSAgICByZXR1 cm4gY29tcGFyZV9uYW1lX3dpdGhfdmFsdWUgKGNvZGUsIG9wMCwgb3AxLAotCQkJCSAgICBzdHJp Y3Rfb3ZlcmZsb3dfcCwgdXNlX2VxdWl2X3AsIHN0bXQpOworICAgIHJldHVybiBjb21wYXJlX25h bWVfd2l0aF92YWx1ZSAoY29kZSwgb3AwLCBvcDEsIHN0cmljdF9vdmVyZmxvd19wLCBzdG10KTsK ICAgZWxzZSBpZiAoVFJFRV9DT0RFIChvcDEpID09IFNTQV9OQU1FKQogICAgIHJldHVybiBjb21w YXJlX25hbWVfd2l0aF92YWx1ZSAoc3dhcF90cmVlX2NvbXBhcmlzb24gKGNvZGUpLCBvcDEsIG9w MCwKLQkJCQkgICAgc3RyaWN0X292ZXJmbG93X3AsIHVzZV9lcXVpdl9wLCBzdG10KTsKKwkJCQkg ICAgc3RyaWN0X292ZXJmbG93X3AsIHN0bXQpOwogICByZXR1cm4gTlVMTF9UUkVFOwogfQogCkBA IC0xMjUwLDcgKzExOTgsNyBAQCBzaW1wbGlmeV91c2luZ19yYW5nZXM6OnNpbXBsaWZ5X2Rpdl9v cl9tb2RfdXNpbmdfcmFuZ2VzCiAgIGlmIChyaHNfY29kZSA9PSBUUlVOQ19NT0RfRVhQUgogICAg ICAgJiYgVFJFRV9DT0RFIChvcDEpID09IFNTQV9OQU1FKQogICAgIHsKLSAgICAgIGNvbnN0IHZh bHVlX3JhbmdlX2VxdWl2ICp2cjEgPSBxdWVyeS0+Z2V0X3ZhbHVlX3JhbmdlIChvcDEsIHN0bXQp OworICAgICAgY29uc3QgdmFsdWVfcmFuZ2UgKnZyMSA9IHF1ZXJ5LT5nZXRfdmFsdWVfcmFuZ2Ug KG9wMSwgc3RtdCk7CiAgICAgICBpZiAocmFuZ2VfaW50X2NzdF9wICh2cjEpKQogCW9wMW1pbiA9 IHZyMS0+bWluICgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2djYy92ci12YWx1ZXMuaCBiL2djYy92 ci12YWx1ZXMuaAppbmRleCA4ZWU4Y2MxMmY4Yi4uOTgwNGFhZjgzZDEgMTAwNjQ0Ci0tLSBhL2dj Yy92ci12YWx1ZXMuaAorKysgYi9nY2MvdnItdmFsdWVzLmgKQEAgLTIwLDcgKzIwLDYgQEAgYWxv bmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICNpZm5kZWYg R0NDX1ZSX1ZBTFVFU19ICiAjZGVmaW5lIEdDQ19WUl9WQUxVRVNfSAogCi0jaW5jbHVkZSAidmFs dWUtcmFuZ2UtZXF1aXYuaCIKICNpbmNsdWRlICJ2YWx1ZS1xdWVyeS5oIgogCiAvLyBBYnN0cmFj dCBjbGFzcyB0byByZXR1cm4gYSByYW5nZSBmb3IgYSBnaXZlbiBTU0EuCkBAIC01NCwxMSArNTMs OSBAQCBwcml2YXRlOgogCiAgIGJvb2wgdHdvX3ZhbHVlZF92YWxfcmFuZ2VfcCAodHJlZSwgdHJl ZSAqLCB0cmVlICosIGdpbXBsZSAqKTsKICAgYm9vbCBvcF93aXRoX2Jvb2xlYW5fdmFsdWVfcmFu Z2VfcCAodHJlZSwgZ2ltcGxlICopOwotICB0cmVlIGNvbXBhcmVfbmFtZV93aXRoX3ZhbHVlIChl bnVtIHRyZWVfY29kZSwgdHJlZSwgdHJlZSwgYm9vbCAqLCBib29sLAotCQkJCWdpbXBsZSAqKTsK KyAgdHJlZSBjb21wYXJlX25hbWVfd2l0aF92YWx1ZSAoZW51bSB0cmVlX2NvZGUsIHRyZWUsIHRy ZWUsIGJvb2wgKiwgZ2ltcGxlICopOwogICB0cmVlIGNvbXBhcmVfbmFtZXMgKGVudW0gdHJlZV9j b2RlLCB0cmVlLCB0cmVlLCBib29sICosIGdpbXBsZSAqcyk7Ci0gIGNvbnN0IHZhbHVlX3Jhbmdl X2VxdWl2ICpnZXRfdnJfZm9yX2NvbXBhcmlzb24gKGludCwgdmFsdWVfcmFuZ2VfZXF1aXYgKiwK LQkJCQkJCSAgZ2ltcGxlICpzKTsKKyAgY29uc3QgdmFsdWVfcmFuZ2UgKmdldF92cl9mb3JfY29t cGFyaXNvbiAoaW50LCB2YWx1ZV9yYW5nZSAqLCBnaW1wbGUgKnMpOwogICB0cmVlIHZycF9ldmFs dWF0ZV9jb25kaXRpb25hbF93YXJudl93aXRoX29wc191c2luZ19yYW5nZXMgKGVudW0gdHJlZV9j b2RlLAogCQkJCQkJCSAgICAgdHJlZSwgdHJlZSwKIAkJCQkJCQkgICAgIGJvb2wgKiwgZ2ltcGxl ICpzKTsKLS0gCjIuMzguMQoK --000000000000bcec5405edfda4aa Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Remove-unused-legacy-VRP-code.patch" Content-Disposition: attachment; filename="0001-Remove-unused-legacy-VRP-code.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lar03utw1 RnJvbSAwMDExYzFkMDQ5OGYyNWMyMzE4NDRmNGE0ZmY3NTAxOWI5YTQ4ZDk5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogU2F0LCAxOSBOb3YgMjAyMiAxMToxMToyNSArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92 ZSB1bnVzZWQgKGxlZ2FjeSkgVlJQIGNvZGUuCgotLS0KIGdjYy9kb2MvaW52b2tlLnRleGkgfCAg IDEwIC0KIGdjYy9wYXJhbXMub3B0ICAgICAgfCAgIDIxIC0KIGdjYy9yYW5nZS1vcC5jYyAgICAg fCAgIDI4ICsKIGdjYy90cmVlLXZycC5jYyAgICAgfCAzODM4ICsrKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGdjYy90cmVlLXZycC5oICAgICAgfCAgIDI1IC0KIGdj Yy92YWx1ZS1yYW5nZS5jYyAgfCAgIDI4IC0KIGdjYy92YWx1ZS1yYW5nZS5oICAgfCAgICAxIC0K IGdjYy92ci12YWx1ZXMuY2MgICAgfCAxODcxICstLS0tLS0tLS0tLS0tLS0tLS0tLQogZ2NjL3Zy LXZhbHVlcy5oICAgICB8ICAxMDAgKy0KIDkgZmlsZXMgY2hhbmdlZCwgMjUzIGluc2VydGlvbnMo KyksIDU2NjkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy9pbnZva2UudGV4aSBi L2djYy9kb2MvaW52b2tlLnRleGkKaW5kZXggMzMwZGE2ZWI1ZDQuLmUyOTc1MjVkZjMxIDEwMDY0 NAotLS0gYS9nY2MvZG9jL2ludm9rZS50ZXhpCisrKyBiL2djYy9kb2MvaW52b2tlLnRleGkKQEAg LTE1NzgxLDE5ICsxNTc4MSw5IEBAIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtYXktZGVmcyB3ZSBh bmFseXplIHdoZW4gbG9va2luZyBmb3IgYSBtdXN0LWRlZgogc3BlY2lmeWluZyB0aGUgZHluYW1p YyB0eXBlIG9mIGFuIG9iamVjdCB0aGF0IGludm9rZXMgYSB2aXJ0dWFsIGNhbGwKIHdlIG1heSBi ZSBhYmxlIHRvIGRldmlydHVhbGl6ZSBzcGVjdWxhdGl2ZWx5LgogCi1AaXRlbSBtYXgtdnJwLXN3 aXRjaC1hc3NlcnRpb25zCi1UaGUgbWF4aW11bSBudW1iZXIgb2YgYXNzZXJ0aW9ucyB0byBhZGQg YWxvbmcgdGhlIGRlZmF1bHQgZWRnZSBvZiBhIHN3aXRjaAotc3RhdGVtZW50IGR1cmluZyBWUlAu Ci0KIEBpdGVtIGV2cnAtc3BhcnNlLXRocmVzaG9sZAogTWF4aW11bSBudW1iZXIgb2YgYmFzaWMg YmxvY2tzIGJlZm9yZSBFVlJQIHVzZXMgYSBzcGFyc2UgY2FjaGUuCiAKLUBpdGVtIHZycDEtbW9k ZQotU3BlY2lmaWVzIHRoZSBtb2RlIFZSUCBwYXNzIDEgc2hvdWxkIG9wZXJhdGUgaW4uCi0KLUBp dGVtIHZycDItbW9kZQotU3BlY2lmaWVzIHRoZSBtb2RlIFZSUCBwYXNzIDIgc2hvdWxkIG9wZXJh dGUgaW4uCi0KIEBpdGVtIHJhbmdlci1kZWJ1ZwogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGRlYnVn IG91dHB1dCB0byBiZSBpc3N1ZWQgZm9yIHJhbmdlcy4KIApkaWZmIC0tZ2l0IGEvZ2NjL3BhcmFt cy5vcHQgYi9nY2MvcGFyYW1zLm9wdAppbmRleCBhMzRmZWUxOTNmYy4uYzFkY2I3ZWE0ODcgMTAw NjQ0Ci0tLSBhL2djYy9wYXJhbXMub3B0CisrKyBiL2djYy9wYXJhbXMub3B0CkBAIC03NDYsMTAg Kzc0Niw2IEBAIE1heC4gc2l6ZSBvZiB2YXIgdHJhY2tpbmcgaGFzaCB0YWJsZXMuCiBDb21tb24g Sm9pbmVkIFVJbnRlZ2VyIFZhcihwYXJhbV9tYXhfZmluZF9iYXNlX3Rlcm1fdmFsdWVzKSBJbml0 KDIwMCkgUGFyYW0gT3B0aW1pemF0aW9uCiBNYXhpbXVtIG51bWJlciBvZiBWQUxVRXMgaGFuZGxl ZCBkdXJpbmcgYSBzaW5nbGUgZmluZF9iYXNlX3Rlcm0gY2FsbC4KIAotLXBhcmFtPW1heC12cnAt c3dpdGNoLWFzc2VydGlvbnM9Ci1Db21tb24gSm9pbmVkIFVJbnRlZ2VyIFZhcihwYXJhbV9tYXhf dnJwX3N3aXRjaF9hc3NlcnRpb25zKSBJbml0KDEwKSBQYXJhbSBPcHRpbWl6YXRpb24KLU1heGlt dW0gbnVtYmVyIG9mIGFzc2VydGlvbnMgdG8gYWRkIGFsb25nIHRoZSBkZWZhdWx0IGVkZ2Ugb2Yg YSBzd2l0Y2ggc3RhdGVtZW50IGR1cmluZyBWUlAuCi0KIC1wYXJhbT1taW4tY3Jvc3NqdW1wLWlu c25zPQogQ29tbW9uIEpvaW5lZCBVSW50ZWdlciBWYXIocGFyYW1fbWluX2Nyb3NzanVtcF9pbnNu cykgSW5pdCg1KSBJbnRlZ2VyUmFuZ2UoMSwgNjU1MzYpIFBhcmFtIE9wdGltaXphdGlvbgogVGhl IG1pbmltdW0gbnVtYmVyIG9mIG1hdGNoaW5nIGluc3RydWN0aW9ucyB0byBjb25zaWRlciBmb3Ig Y3Jvc3NqdW1waW5nLgpAQCAtMTE2NSwyMSArMTE2MSw0IEBAIFRoZSBtYXhpbXVtIGZhY3RvciB3 aGljaCB0aGUgbG9vcCB2ZWN0b3JpemVyIGFwcGxpZXMgdG8gdGhlIGNvc3Qgb2Ygc3RhdGVtZW50 cyBpCiBDb21tb24gSm9pbmVkIFVJbnRlZ2VyIFZhcihwYXJhbV92ZWN0X2luZHVjdGlvbl9mbG9h dCkgSW5pdCgxKSBJbnRlZ2VyUmFnZSgwLCAxKSBQYXJhbSBPcHRpbWl6YXRpb24KIEVuYWJsZSBs b29wIHZlY3Rvcml6YXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgaW5kdWN0aW9ucy4KIAotLXBhcmFt PXZycDEtbW9kZT0KLUNvbW1vbiBKb2luZWQgVmFyKHBhcmFtX3ZycDFfbW9kZSkgRW51bSh2cnBf bW9kZSkgSW5pdChWUlBfTU9ERV9SQU5HRVIpIFBhcmFtIE9wdGltaXphdGlvbgotLS1wYXJhbT12 cnAxLW1vZGU9W3ZycHxyYW5nZXJdIFNwZWNpZmllcyB0aGUgbW9kZSBWUlAxIHNob3VsZCBvcGVy YXRlIGluLgotCi0tcGFyYW09dnJwMi1tb2RlPQotQ29tbW9uIEpvaW5lZCBWYXIocGFyYW1fdnJw Ml9tb2RlKSBFbnVtKHZycF9tb2RlKSBJbml0KFZSUF9NT0RFX1JBTkdFUikgUGFyYW0gT3B0aW1p emF0aW9uCi0tLXBhcmFtPXZycDItbW9kZT1bdnJwfHJhbmdlcl0gU3BlY2lmaWVzIHRoZSBtb2Rl IFZSUDIgc2hvdWxkIG9wZXJhdGUgaW4uCi0KLUVudW0KLU5hbWUodnJwX21vZGUpIFR5cGUoZW51 bSB2cnBfbW9kZSkgVW5rbm93bkVycm9yKHVua25vd24gdnJwIG1vZGUgJXFzKQotCi1FbnVtVmFs dWUKLUVudW0odnJwX21vZGUpIFN0cmluZyh2cnApIFZhbHVlKFZSUF9NT0RFX1ZSUCkKLQotRW51 bVZhbHVlCi1FbnVtKHZycF9tb2RlKSBTdHJpbmcocmFuZ2VyKSBWYWx1ZShWUlBfTU9ERV9SQU5H RVIpCi0KIDsgVGhpcyBjb21tZW50IGlzIHRvIGVuc3VyZSB3ZSByZXRhaW4gdGhlIGJsYW5rIGxp bmUgYWJvdmUuCmRpZmYgLS1naXQgYS9nY2MvcmFuZ2Utb3AuY2MgYi9nY2MvcmFuZ2Utb3AuY2MK aW5kZXggNmZhM2IxNTE1OTYuLmNhMWMzOGM5MzA3IDEwMDY0NAotLS0gYS9nY2MvcmFuZ2Utb3Au Y2MKKysrIGIvZ2NjL3JhbmdlLW9wLmNjCkBAIC0zMDgyLDYgKzMwODIsMzQgQEAgc2V0X25vbnpl cm9fcmFuZ2VfZnJvbV9tYXNrIChpcmFuZ2UgJnIsIHRyZWUgdHlwZSwgY29uc3QgaXJhbmdlICZs aHMpCiAgICAgci5zZXRfdmFyeWluZyAodHlwZSk7CiB9CiAKKy8qIEZpbmQgb3V0IHNtYWxsZXN0 IFJFUyB3aGVyZSBSRVMgPiBWQUwgJiYgKFJFUyAmIE1BU0spID09IFJFUywgaWYgYW55CisgICAo b3RoZXJ3aXNlIHJldHVybiBWQUwpLiAgVkFMIGFuZCBNQVNLIG11c3QgYmUgemVyby1leHRlbmRl ZCBmb3IKKyAgIHByZWNpc2lvbiBQUkVDLiAgSWYgU0dOQklUIGlzIG5vbi16ZXJvLCBmaXJzdCB4 b3IgVkFMIHdpdGggU0dOQklUCisgICAodG8gdHJhbnNmb3JtIHNpZ25lZCB2YWx1ZXMgaW50byB1 bnNpZ25lZCkgYW5kIGF0IHRoZSBlbmQgeG9yCisgICBTR05CSVQgYmFjay4gICovCisKK3dpZGVf aW50CittYXNrZWRfaW5jcmVtZW50IChjb25zdCB3aWRlX2ludCAmdmFsX2luLCBjb25zdCB3aWRl X2ludCAmbWFzaywKKwkJICBjb25zdCB3aWRlX2ludCAmc2duYml0LCB1bnNpZ25lZCBpbnQgcHJl YykKK3sKKyAgd2lkZV9pbnQgYml0ID0gd2k6Om9uZSAocHJlYyksIHJlczsKKyAgdW5zaWduZWQg aW50IGk7CisKKyAgd2lkZV9pbnQgdmFsID0gdmFsX2luIF4gc2duYml0OworICBmb3IgKGkgPSAw OyBpIDwgcHJlYzsgaSsrLCBiaXQgKz0gYml0KQorICAgIHsKKyAgICAgIHJlcyA9IG1hc2s7Cisg ICAgICBpZiAoKHJlcyAmIGJpdCkgPT0gMCkKKwljb250aW51ZTsKKyAgICAgIHJlcyA9IGJpdCAt IDE7CisgICAgICByZXMgPSB3aTo6Yml0X2FuZF9ub3QgKHZhbCArIGJpdCwgcmVzKTsKKyAgICAg IHJlcyAmPSBtYXNrOworICAgICAgaWYgKHdpOjpndHVfcCAocmVzLCB2YWwpKQorCXJldHVybiBy ZXMgXiBzZ25iaXQ7CisgICAgfQorICByZXR1cm4gdmFsIF4gc2duYml0OworfQorCiAvLyBUaGlz IHdhcyBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMiBh bmQKIC8vIGFkanVzdGVkIHRvIHdvcmsgd2l0aCBpcmFuZ2VzLgogCmRpZmYgLS1naXQgYS9nY2Mv dHJlZS12cnAuY2MgYi9nY2MvdHJlZS12cnAuY2MKaW5kZXggYTQ3NGQ5ZDExZTUuLjg2OTc4MDg2 Y2ZiIDEwMDY0NAotLS0gYS9nY2MvdHJlZS12cnAuY2MKKysrIGIvZ2NjL3RyZWUtdnJwLmNjCkBA IC0yMjksMTA5ICsyMjksNiBAQCByZW1vdmVfdW5yZWFjaGFibGU6OnJlbW92ZV9hbmRfdXBkYXRl X2dsb2JhbHMgKGJvb2wgZmluYWxfcCkKICAgcmV0dXJuIGNoYW5nZTsKIH0KIAotLyogU2V0IG9m IFNTQSBuYW1lcyBmb3VuZCBsaXZlIGR1cmluZyB0aGUgUlBPIHRyYXZlcnNhbCBvZiB0aGUgZnVu Y3Rpb24KLSAgIGZvciBzdGlsbCBhY3RpdmUgYmFzaWMtYmxvY2tzLiAgKi8KLWNsYXNzIGxpdmVf bmFtZXMKLXsKLXB1YmxpYzoKLSAgbGl2ZV9uYW1lcyAoKTsKLSAgfmxpdmVfbmFtZXMgKCk7Ci0g IHZvaWQgc2V0ICh0cmVlLCBiYXNpY19ibG9jayk7Ci0gIHZvaWQgY2xlYXIgKHRyZWUsIGJhc2lj X2Jsb2NrKTsKLSAgdm9pZCBtZXJnZSAoYmFzaWNfYmxvY2sgZGVzdCwgYmFzaWNfYmxvY2sgc3Jj KTsKLSAgYm9vbCBsaXZlX29uX2Jsb2NrX3AgKHRyZWUsIGJhc2ljX2Jsb2NrKTsKLSAgYm9vbCBs aXZlX29uX2VkZ2VfcCAodHJlZSwgZWRnZSk7Ci0gIGJvb2wgYmxvY2tfaGFzX2xpdmVfbmFtZXNf cCAoYmFzaWNfYmxvY2spOwotICB2b2lkIGNsZWFyX2Jsb2NrIChiYXNpY19ibG9jayk7Ci0KLXBy aXZhdGU6Ci0gIHNiaXRtYXAgKmxpdmU7Ci0gIHVuc2lnbmVkIG51bV9ibG9ja3M7Ci0gIHZvaWQg aW5pdF9iaXRtYXBfaWZfbmVlZGVkIChiYXNpY19ibG9jayk7Ci19OwotCi12b2lkCi1saXZlX25h bWVzOjppbml0X2JpdG1hcF9pZl9uZWVkZWQgKGJhc2ljX2Jsb2NrIGJiKQotewotICB1bnNpZ25l ZCBpID0gYmItPmluZGV4OwotICBpZiAoIWxpdmVbaV0pCi0gICAgewotICAgICAgbGl2ZVtpXSA9 IHNiaXRtYXBfYWxsb2MgKG51bV9zc2FfbmFtZXMpOwotICAgICAgYml0bWFwX2NsZWFyIChsaXZl W2ldKTsKLSAgICB9Ci19Ci0KLWJvb2wKLWxpdmVfbmFtZXM6OmJsb2NrX2hhc19saXZlX25hbWVz X3AgKGJhc2ljX2Jsb2NrIGJiKQotewotICB1bnNpZ25lZCBpID0gYmItPmluZGV4OwotICByZXR1 cm4gbGl2ZVtpXSAmJiBiaXRtYXBfZW1wdHlfcCAobGl2ZVtpXSk7Ci19Ci0KLXZvaWQKLWxpdmVf bmFtZXM6OmNsZWFyX2Jsb2NrIChiYXNpY19ibG9jayBiYikKLXsKLSAgdW5zaWduZWQgaSA9IGJi LT5pbmRleDsKLSAgaWYgKGxpdmVbaV0pCi0gICAgewotICAgICAgc2JpdG1hcF9mcmVlIChsaXZl W2ldKTsKLSAgICAgIGxpdmVbaV0gPSBOVUxMOwotICAgIH0KLX0KLQotdm9pZAotbGl2ZV9uYW1l czo6bWVyZ2UgKGJhc2ljX2Jsb2NrIGRlc3QsIGJhc2ljX2Jsb2NrIHNyYykKLXsKLSAgaW5pdF9i aXRtYXBfaWZfbmVlZGVkIChkZXN0KTsKLSAgaW5pdF9iaXRtYXBfaWZfbmVlZGVkIChzcmMpOwot ICBiaXRtYXBfaW9yIChsaXZlW2Rlc3QtPmluZGV4XSwgbGl2ZVtkZXN0LT5pbmRleF0sIGxpdmVb c3JjLT5pbmRleF0pOwotfQotCi12b2lkCi1saXZlX25hbWVzOjpzZXQgKHRyZWUgbmFtZSwgYmFz aWNfYmxvY2sgYmIpCi17Ci0gIGluaXRfYml0bWFwX2lmX25lZWRlZCAoYmIpOwotICBiaXRtYXBf c2V0X2JpdCAobGl2ZVtiYi0+aW5kZXhdLCBTU0FfTkFNRV9WRVJTSU9OIChuYW1lKSk7Ci19Ci0K LXZvaWQKLWxpdmVfbmFtZXM6OmNsZWFyICh0cmVlIG5hbWUsIGJhc2ljX2Jsb2NrIGJiKQotewot ICB1bnNpZ25lZCBpID0gYmItPmluZGV4OwotICBpZiAobGl2ZVtpXSkKLSAgICBiaXRtYXBfY2xl YXJfYml0IChsaXZlW2ldLCBTU0FfTkFNRV9WRVJTSU9OIChuYW1lKSk7Ci19Ci0KLWxpdmVfbmFt ZXM6OmxpdmVfbmFtZXMgKCkKLXsKLSAgbnVtX2Jsb2NrcyA9IGxhc3RfYmFzaWNfYmxvY2tfZm9y X2ZuIChjZnVuKTsKLSAgbGl2ZSA9IFhDTkVXVkVDIChzYml0bWFwLCBudW1fYmxvY2tzKTsKLX0K LQotbGl2ZV9uYW1lczo6fmxpdmVfbmFtZXMgKCkKLXsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsg aSA8IG51bV9ibG9ja3M7ICsraSkKLSAgICBpZiAobGl2ZVtpXSkKLSAgICAgIHNiaXRtYXBfZnJl ZSAobGl2ZVtpXSk7Ci0gIFhERUxFVEVWRUMgKGxpdmUpOwotfQotCi1ib29sCi1saXZlX25hbWVz OjpsaXZlX29uX2Jsb2NrX3AgKHRyZWUgbmFtZSwgYmFzaWNfYmxvY2sgYmIpCi17Ci0gIHJldHVy biAobGl2ZVtiYi0+aW5kZXhdCi0JICAmJiBiaXRtYXBfYml0X3AgKGxpdmVbYmItPmluZGV4XSwg U1NBX05BTUVfVkVSU0lPTiAobmFtZSkpKTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIFNT QSBuYW1lIE5BTUUgaXMgbGl2ZSBvbiB0aGUgZWRnZSBFLiAgKi8KLQotYm9vbAotbGl2ZV9uYW1l czo6bGl2ZV9vbl9lZGdlX3AgKHRyZWUgbmFtZSwgZWRnZSBlKQotewotICByZXR1cm4gbGl2ZV9v bl9ibG9ja19wIChuYW1lLCBlLT5kZXN0KTsKLX0KLQotCiAvKiBWUl9UWVBFIGRlc2NyaWJlcyBh IHJhbmdlIHdpdGggbWluaW51bSB2YWx1ZSAqTUlOIGFuZCBtYXhpbXVtCiAgICB2YWx1ZSAqTUFY LiAgUmVzdHJpY3QgdGhlIHJhbmdlIHRvIHRoZSBzZXQgb2YgdmFsdWVzIHRoYXQgaGF2ZQogICAg bm8gYml0cyBzZXQgb3V0c2lkZSBOT05aRVJPX0JJVFMuICBVcGRhdGUgKk1JTiBhbmQgKk1BWCBh bmQKQEAgLTQxNyw3ICszMTQsNyBAQCByYW5nZV9pbnRfY3N0X3AgKGNvbnN0IHZhbHVlX3Jhbmdl ICp2cikKICAgIG90aGVyd2lzZS4gIFdlIG9ubHkgaGFuZGxlIGFkZGl0aXZlIG9wZXJhdGlvbnMg YW5kIHNldCBORUcgdG8gdHJ1ZSBpZiB0aGUKICAgIHN5bWJvbCBpcyBuZWdhdGVkIGFuZCBJTlYg dG8gdGhlIGludmFyaWFudCBwYXJ0LCBpZiBhbnkuICAqLwogCi10cmVlCitzdGF0aWMgdHJlZQog Z2V0X3NpbmdsZV9zeW1ib2wgKHRyZWUgdCwgYm9vbCAqbmVnLCB0cmVlICppbnYpCiB7CiAgIGJv b2wgbmVnXzsKQEAgLTQ2OCwyNCArMzY1LDYgQEAgZ2V0X3NpbmdsZV9zeW1ib2wgKHRyZWUgdCwg Ym9vbCAqbmVnLCB0cmVlICppbnYpCiAgIHJldHVybiB0OwogfQogCi0vKiBUaGUgcmV2ZXJzZSBv cGVyYXRpb246IGJ1aWxkIGEgc3ltYm9saWMgZXhwcmVzc2lvbiB3aXRoIFRZUEUKLSAgIGZyb20g c3ltYm9sIFNZTSwgbmVnYXRlZCBhY2NvcmRpbmcgdG8gTkVHLCBhbmQgaW52YXJpYW50IElOVi4g ICovCi0KLXN0YXRpYyB0cmVlCi1idWlsZF9zeW1ib2xpY19leHByICh0cmVlIHR5cGUsIHRyZWUg c3ltLCBib29sIG5lZywgdHJlZSBpbnYpCi17Ci0gIGNvbnN0IGJvb2wgcG9pbnRlcl9wID0gUE9J TlRFUl9UWVBFX1AgKHR5cGUpOwotICB0cmVlIHQgPSBzeW07Ci0KLSAgaWYgKG5lZykKLSAgICB0 ID0gYnVpbGQxIChORUdBVEVfRVhQUiwgdHlwZSwgdCk7Ci0KLSAgaWYgKGludGVnZXJfemVyb3Ag KGludikpCi0gICAgcmV0dXJuIHQ7Ci0KLSAgcmV0dXJuIGJ1aWxkMiAocG9pbnRlcl9wID8gUE9J TlRFUl9QTFVTX0VYUFIgOiBQTFVTX0VYUFIsIHR5cGUsIHQsIGludik7Ci19Ci0KIC8qIFJldHVy bgogICAgMSBpZiBWQUwgPCBWQUwyCiAgICAwIGlmICEoVkFMIDwgVkFMMikKQEAgLTY5Nyw0MTEg KzU3Niw2IEBAIGNvbXBhcmVfdmFsdWVzICh0cmVlIHZhbDEsIHRyZWUgdmFsMikKICAgcmV0dXJu IGNvbXBhcmVfdmFsdWVzX3dhcm52ICh2YWwxLCB2YWwyLCAmc29wKTsKIH0KIAotLyogSWYgQk9V TkQgd2lsbCBpbmNsdWRlIGEgc3ltYm9saWMgYm91bmQsIGFkanVzdCBpdCBhY2NvcmRpbmdseSwK LSAgIG90aGVyd2lzZSBsZWF2ZSBpdCBhcyBpcy4KLQotICAgQ09ERSBpcyB0aGUgb3JpZ2luYWwg b3BlcmF0aW9uIHRoYXQgY29tYmluZWQgdGhlIGJvdW5kcyAoUExVU19FWFBSCi0gICBvciBNSU5V U19FWFBSKS4KLQotICAgVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgb3JpZ2luYWwgb3BlcmF0aW9u LgotCi0gICBTWU1fT1BuIGlzIHRoZSBzeW1ib2xpYyBmb3IgT1BuIGlmIGl0IGhhcyBhIHN5bWJv bGljLgotCi0gICBORUdfT1BuIGlzIFRSVUUgaWYgdGhlIE9QbiB3YXMgbmVnYXRlZC4gICovCi0K LXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3ltYm9saWNfYm91bmQgKHRyZWUgJmJvdW5kLCBlbnVtIHRy ZWVfY29kZSBjb2RlLCB0cmVlIHR5cGUsCi0JCSAgICAgICB0cmVlIHN5bV9vcDAsIHRyZWUgc3lt X29wMSwKLQkJICAgICAgIGJvb2wgbmVnX29wMCwgYm9vbCBuZWdfb3AxKQotewotICBib29sIG1p bnVzX3AgPSAoY29kZSA9PSBNSU5VU19FWFBSKTsKLSAgLyogSWYgdGhlIHJlc3VsdCBib3VuZCBp cyBjb25zdGFudCwgd2UncmUgZG9uZTsgb3RoZXJ3aXNlLCBidWlsZCB0aGUKLSAgICAgc3ltYm9s aWMgbG93ZXIgYm91bmQuICAqLwotICBpZiAoc3ltX29wMCA9PSBzeW1fb3AxKQotICAgIDsKLSAg ZWxzZSBpZiAoc3ltX29wMCkKLSAgICBib3VuZCA9IGJ1aWxkX3N5bWJvbGljX2V4cHIgKHR5cGUs IHN5bV9vcDAsCi0JCQkJIG5lZ19vcDAsIGJvdW5kKTsKLSAgZWxzZSBpZiAoc3ltX29wMSkKLSAg ICB7Ci0gICAgICAvKiBXZSBtYXkgbm90IG5lZ2F0ZSBpZiB0aGF0IG1pZ2h0IGludHJvZHVjZQot CSB1bmRlZmluZWQgb3ZlcmZsb3cuICAqLwotICAgICAgaWYgKCFtaW51c19wCi0JICB8fCBuZWdf b3AxCi0JICB8fCBUWVBFX09WRVJGTE9XX1dSQVBTICh0eXBlKSkKLQlib3VuZCA9IGJ1aWxkX3N5 bWJvbGljX2V4cHIgKHR5cGUsIHN5bV9vcDEsCi0JCQkJICAgICBuZWdfb3AxIF4gbWludXNfcCwg Ym91bmQpOwotICAgICAgZWxzZQotCWJvdW5kID0gTlVMTF9UUkVFOwotICAgIH0KLX0KLQotLyog Q29tYmluZSBPUDEgYW5kIE9QMSwgd2hpY2ggYXJlIHR3byBwYXJ0cyBvZiBhIGJvdW5kLCBpbnRv IG9uZSB3aWRlCi0gICBpbnQgYm91bmQgYWNjb3JkaW5nIHRvIENPREUuICBDT0RFIGlzIHRoZSBv cGVyYXRpb24gY29tYmluaW5nIHRoZQotICAgYm91bmQgKGVpdGhlciBhIFBMVVNfRVhQUiBvciBh IE1JTlVTX0VYUFIpLgotCi0gICBUWVBFIGlzIHRoZSB0eXBlIG9mIHRoZSBjb21iaW5lIG9wZXJh dGlvbi4KLQotICAgV0kgaXMgdGhlIHdpZGUgaW50IHRvIHN0b3JlIHRoZSByZXN1bHQuCi0KLSAg IE9WRiBpcyAtMSBpZiBhbiB1bmRlcmZsb3cgb2NjdXJyZWQsICsxIGlmIGFuIG92ZXJmbG93IG9j Y3VycmVkIG9yIDAKLSAgIGlmIG92ZXIvdW5kZXJmbG93IG9jY3VycmVkLiAgKi8KLQotc3RhdGlj IHZvaWQKLWNvbWJpbmVfYm91bmQgKGVudW0gdHJlZV9jb2RlIGNvZGUsIHdpZGVfaW50ICZ3aSwg d2k6Om92ZXJmbG93X3R5cGUgJm92ZiwKLQkgICAgICAgdHJlZSB0eXBlLCB0cmVlIG9wMCwgdHJl ZSBvcDEpCi17Ci0gIGJvb2wgbWludXNfcCA9IChjb2RlID09IE1JTlVTX0VYUFIpOwotICBjb25z dCBzaWdub3Agc2duID0gVFlQRV9TSUdOICh0eXBlKTsKLSAgY29uc3QgdW5zaWduZWQgaW50IHBy ZWMgPSBUWVBFX1BSRUNJU0lPTiAodHlwZSk7Ci0KLSAgLyogQ29tYmluZSB0aGUgYm91bmRzLCBp ZiBhbnkuICAqLwotICBpZiAob3AwICYmIG9wMSkKLSAgICB7Ci0gICAgICBpZiAobWludXNfcCkK LQl3aSA9IHdpOjpzdWIgKHdpOjp0b193aWRlIChvcDApLCB3aTo6dG9fd2lkZSAob3AxKSwgc2du LCAmb3ZmKTsKLSAgICAgIGVsc2UKLQl3aSA9IHdpOjphZGQgKHdpOjp0b193aWRlIChvcDApLCB3 aTo6dG9fd2lkZSAob3AxKSwgc2duLCAmb3ZmKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wMCkKLSAg ICB3aSA9IHdpOjp0b193aWRlIChvcDApOwotICBlbHNlIGlmIChvcDEpCi0gICAgewotICAgICAg aWYgKG1pbnVzX3ApCi0Jd2kgPSB3aTo6bmVnICh3aTo6dG9fd2lkZSAob3AxKSwgJm92Zik7Ci0g ICAgICBlbHNlCi0Jd2kgPSB3aTo6dG9fd2lkZSAob3AxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB3 aSA9IHdpOjpzaHdpICgwLCBwcmVjKTsKLX0KLQotLyogR2l2ZW4gYSByYW5nZSBpbiBbV01JTiwg V01BWF0sIGFkanVzdCBpdCBmb3IgcG9zc2libGUgb3ZlcmZsb3cgYW5kCi0gICBwdXQgdGhlIHJl c3VsdCBpbiBWUi4KLQotICAgVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgcmFuZ2UuCi0KLSAgIE1J Tl9PVkYgYW5kIE1BWF9PVkYgaW5kaWNhdGUgd2hhdCB0eXBlIG9mIG92ZXJmbG93LCBpZiBhbnks Ci0gICBvY2N1cnJlZCB3aGlsZSBvcmlnaW5hbGx5IGNhbGN1bGF0aW5nIFdNSU4gb3IgV01BWC4g IC0xIGluZGljYXRlcwotICAgdW5kZXJmbG93LiAgKzEgaW5kaWNhdGVzIG92ZXJmbG93LiAgMCBp bmRpY2F0ZXMgbmVpdGhlci4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfdmFsdWVfcmFuZ2Vfd2l0 aF9vdmVyZmxvdyAodmFsdWVfcmFuZ2Vfa2luZCAma2luZCwgdHJlZSAmbWluLCB0cmVlICZtYXgs Ci0JCQkgICAgICAgdHJlZSB0eXBlLAotCQkJICAgICAgIGNvbnN0IHdpZGVfaW50ICZ3bWluLCBj b25zdCB3aWRlX2ludCAmd21heCwKLQkJCSAgICAgICB3aTo6b3ZlcmZsb3dfdHlwZSBtaW5fb3Zm LAotCQkJICAgICAgIHdpOjpvdmVyZmxvd190eXBlIG1heF9vdmYpCi17Ci0gIGNvbnN0IHNpZ25v cCBzZ24gPSBUWVBFX1NJR04gKHR5cGUpOwotICBjb25zdCB1bnNpZ25lZCBpbnQgcHJlYyA9IFRZ UEVfUFJFQ0lTSU9OICh0eXBlKTsKLQotICAvKiBGb3Igb25lIGJpdCBwcmVjaXNpb24gaWYgbWF4 IDwgbWluLCB0aGVuIHRoZSBzd2FwcGVkCi0gICAgIHJhbmdlIGNvdmVycyBhbGwgdmFsdWVzLiAg Ki8KLSAgaWYgKHByZWMgPT0gMSAmJiB3aTo6bHRfcCAod21heCwgd21pbiwgc2duKSkKLSAgICB7 Ci0gICAgICBraW5kID0gVlJfVkFSWUlORzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYg KFRZUEVfT1ZFUkZMT1dfV1JBUFMgKHR5cGUpKQotICAgIHsKLSAgICAgIC8qIElmIG92ZXJmbG93 IHdyYXBzLCB0cnVuY2F0ZSB0aGUgdmFsdWVzIGFuZCBhZGp1c3QgdGhlCi0JIHJhbmdlIGtpbmQg YW5kIGJvdW5kcyBhcHByb3ByaWF0ZWx5LiAgKi8KLSAgICAgIHdpZGVfaW50IHRtaW4gPSB3aWRl X2ludDo6ZnJvbSAod21pbiwgcHJlYywgc2duKTsKLSAgICAgIHdpZGVfaW50IHRtYXggPSB3aWRl X2ludDo6ZnJvbSAod21heCwgcHJlYywgc2duKTsKLSAgICAgIGlmICgobWluX292ZiAhPSB3aTo6 T1ZGX05PTkUpID09IChtYXhfb3ZmICE9IHdpOjpPVkZfTk9ORSkpCi0JewotCSAgLyogSWYgdGhl IGxpbWl0cyBhcmUgc3dhcHBlZCwgd2Ugd3JhcHBlZCBhcm91bmQgYW5kIGNvdmVyCi0JICAgICB0 aGUgZW50aXJlIHJhbmdlLiAgKi8KLQkgIGlmICh3aTo6Z3RfcCAodG1pbiwgdG1heCwgc2duKSkK LQkgICAga2luZCA9IFZSX1ZBUllJTkc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBraW5kID0g VlJfUkFOR0U7Ci0JICAgICAgLyogTm8gb3ZlcmZsb3cgb3IgYm90aCBvdmVyZmxvdyBvciB1bmRl cmZsb3cuICBUaGUKLQkJIHJhbmdlIGtpbmQgc3RheXMgVlJfUkFOR0UuICAqLwotCSAgICAgIG1p biA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHRtaW4pOwotCSAgICAgIG1heCA9IHdpZGVfaW50 X3RvX3RyZWUgKHR5cGUsIHRtYXgpOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxz ZSBpZiAoKG1pbl9vdmYgPT0gd2k6Ok9WRl9VTkRFUkZMT1cgJiYgbWF4X292ZiA9PSB3aTo6T1ZG X05PTkUpCi0JICAgICAgIHx8IChtYXhfb3ZmID09IHdpOjpPVkZfT1ZFUkZMT1cgJiYgbWluX292 ZiA9PSB3aTo6T1ZGX05PTkUpKQotCXsKLQkgIC8qIE1pbiB1bmRlcmZsb3cgb3IgbWF4IG92ZXJm bG93LiAgVGhlIHJhbmdlIGtpbmQKLQkgICAgIGNoYW5nZXMgdG8gVlJfQU5USV9SQU5HRS4gICov Ci0JICBib29sIGNvdmVycyA9IGZhbHNlOwotCSAgd2lkZV9pbnQgdGVtID0gdG1pbjsKLQkgIHRt aW4gPSB0bWF4ICsgMTsKLQkgIGlmICh3aTo6Y21wICh0bWluLCB0bWF4LCBzZ24pIDwgMCkKLQkg ICAgY292ZXJzID0gdHJ1ZTsKLQkgIHRtYXggPSB0ZW0gLSAxOwotCSAgaWYgKHdpOjpjbXAgKHRt YXgsIHRlbSwgc2duKSA+IDApCi0JICAgIGNvdmVycyA9IHRydWU7Ci0JICAvKiBJZiB0aGUgYW50 aS1yYW5nZSB3b3VsZCBjb3ZlciBub3RoaW5nLCBkcm9wIHRvIHZhcnlpbmcuCi0JICAgICBMaWtl d2lzZSBpZiB0aGUgYW50aS1yYW5nZSBib3VuZHMgYXJlIG91dHNpZGUgb2YgdGhlCi0JICAgICB0 eXBlcyB2YWx1ZXMuICAqLwotCSAgaWYgKGNvdmVycyB8fCB3aTo6Y21wICh0bWluLCB0bWF4LCBz Z24pID4gMCkKLQkgICAgewotCSAgICAgIGtpbmQgPSBWUl9WQVJZSU5HOwotCSAgICAgIHJldHVy bjsKLQkgICAgfQotCSAga2luZCA9IFZSX0FOVElfUkFOR0U7Ci0JICBtaW4gPSB3aWRlX2ludF90 b190cmVlICh0eXBlLCB0bWluKTsKLQkgIG1heCA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHRt YXgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBPdGhlciB1bmRlcmZs b3cgYW5kL29yIG92ZXJmbG93LCBkcm9wIHRvIFZSX1ZBUllJTkcuICAqLwotCSAga2luZCA9IFZS X1ZBUllJTkc7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8q IElmIG92ZXJmbG93IGRvZXMgbm90IHdyYXAsIHNhdHVyYXRlIHRvIHRoZSB0eXBlcyBtaW4vbWF4 Ci0JIHZhbHVlLiAgKi8KLSAgICAgIHdpZGVfaW50IHR5cGVfbWluID0gd2k6Om1pbl92YWx1ZSAo cHJlYywgc2duKTsKLSAgICAgIHdpZGVfaW50IHR5cGVfbWF4ID0gd2k6Om1heF92YWx1ZSAocHJl Yywgc2duKTsKLSAgICAgIGtpbmQgPSBWUl9SQU5HRTsKLSAgICAgIGlmIChtaW5fb3ZmID09IHdp OjpPVkZfVU5ERVJGTE9XKQotCW1pbiA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHR5cGVfbWlu KTsKLSAgICAgIGVsc2UgaWYgKG1pbl9vdmYgPT0gd2k6Ok9WRl9PVkVSRkxPVykKLQltaW4gPSB3 aWRlX2ludF90b190cmVlICh0eXBlLCB0eXBlX21heCk7Ci0gICAgICBlbHNlCi0JbWluID0gd2lk ZV9pbnRfdG9fdHJlZSAodHlwZSwgd21pbik7Ci0KLSAgICAgIGlmIChtYXhfb3ZmID09IHdpOjpP VkZfVU5ERVJGTE9XKQotCW1heCA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHR5cGVfbWluKTsK LSAgICAgIGVsc2UgaWYgKG1heF9vdmYgPT0gd2k6Ok9WRl9PVkVSRkxPVykKLQltYXggPSB3aWRl X2ludF90b190cmVlICh0eXBlLCB0eXBlX21heCk7Ci0gICAgICBlbHNlCi0JbWF4ID0gd2lkZV9p bnRfdG9fdHJlZSAodHlwZSwgd21heCk7Ci0gICAgfQotfQotCi0vKiBGb2xkIHR3byB2YWx1ZSBy YW5nZSdzIG9mIGEgUE9JTlRFUl9QTFVTX0VYUFIgaW50byBWUi4gICovCi0KLXN0YXRpYyB2b2lk Ci1leHRyYWN0X3JhbmdlX2Zyb21fcG9pbnRlcl9wbHVzX2V4cHIgKHZhbHVlX3JhbmdlICp2ciwK LQkJCQkgICAgICBlbnVtIHRyZWVfY29kZSBjb2RlLAotCQkJCSAgICAgIHRyZWUgZXhwcl90eXBl LAotCQkJCSAgICAgIGNvbnN0IHZhbHVlX3JhbmdlICp2cjAsCi0JCQkJICAgICAgY29uc3QgdmFs dWVfcmFuZ2UgKnZyMSkKLXsKLSAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoUE9JTlRFUl9UWVBFX1Ag KGV4cHJfdHlwZSkKLQkJICAgICAgICYmIGNvZGUgPT0gUE9JTlRFUl9QTFVTX0VYUFIpOwotICAv KiBGb3IgcG9pbnRlciB0eXBlcywgd2UgYXJlIHJlYWxseSBvbmx5IGludGVyZXN0ZWQgaW4gYXNz ZXJ0aW5nCi0gICAgIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIG5vbi1OVUxM LgotICAgICBXaXRoIC1mbm8tZGVsZXRlLW51bGwtcG9pbnRlci1jaGVja3Mgd2UgbmVlZCB0byBi ZSBtb3JlCi0gICAgIGNvbnNlcnZhdGl2ZS4gIEFzIHNvbWUgb2JqZWN0IG1pZ2h0IHJlc2lkZSBh dCBhZGRyZXNzIDAsCi0gICAgIHRoZW4gc29tZSBvZmZzZXQgY291bGQgYmUgYWRkZWQgdG8gaXQg YW5kIHRoZSBzYW1lIG9mZnNldAotICAgICBzdWJ0cmFjdGVkIGFnYWluIGFuZCB0aGUgcmVzdWx0 IHdvdWxkIGJlIE5VTEwuCi0gICAgIEUuZy4KLSAgICAgc3RhdGljIGludCBhWzEyXTsgd2hlcmUg JmFbMF0gaXMgTlVMTCBhbmQKLSAgICAgcHRyID0gJmFbNl07Ci0gICAgIHB0ciAtPSA2OwotICAg ICBwdHIgd2lsbCBiZSBOVUxMIGhlcmUsIGV2ZW4gd2hlbiB0aGVyZSBpcyBQT0lOVEVSX1BMVVNf RVhQUgotICAgICB3aGVyZSB0aGUgZmlyc3QgcmFuZ2UgZG9lc24ndCBpbmNsdWRlIHplcm8gYW5k IHRoZSBzZWNvbmQgb25lCi0gICAgIGRvZXNuJ3QgZWl0aGVyLiAgQXMgdGhlIHNlY29uZCBvcGVy YW5kIGlzIHNpemV0eXBlICh1bnNpZ25lZCksCi0gICAgIGNvbnNpZGVyIGFsbCByYW5nZXMgd2hl cmUgdGhlIE1TQiBjb3VsZCBiZSBzZXQgYXMgcG9zc2libGUKLSAgICAgc3VidHJhY3Rpb25zIHdo ZXJlIHRoZSByZXN1bHQgbWlnaHQgYmUgTlVMTC4gICovCi0gIGlmICgoIXJhbmdlX2luY2x1ZGVz X3plcm9fcCAodnIwKQotICAgICAgIHx8ICFyYW5nZV9pbmNsdWRlc196ZXJvX3AgKHZyMSkpCi0g ICAgICAmJiAhVFlQRV9PVkVSRkxPV19XUkFQUyAoZXhwcl90eXBlKQotICAgICAgJiYgKGZsYWdf ZGVsZXRlX251bGxfcG9pbnRlcl9jaGVja3MKLQkgIHx8IChyYW5nZV9pbnRfY3N0X3AgKHZyMSkK LQkgICAgICAmJiAhdHJlZV9pbnRfY3N0X3NpZ25fYml0ICh2cjEtPm1heCAoKSkpKSkKLSAgICB2 ci0+c2V0X25vbnplcm8gKGV4cHJfdHlwZSk7Ci0gIGVsc2UgaWYgKHZyMC0+emVyb19wICgpICYm IHZyMS0+emVyb19wICgpKQotICAgIHZyLT5zZXRfemVybyAoZXhwcl90eXBlKTsKLSAgZWxzZQot ICAgIHZyLT5zZXRfdmFyeWluZyAoZXhwcl90eXBlKTsKLX0KLQotLyogRXh0cmFjdCByYW5nZSBp bmZvcm1hdGlvbiBmcm9tIGEgUExVUy9NSU5VU19FWFBSIGFuZCBzdG9yZSB0aGUKLSAgIHJlc3Vs dCBpbiAqVlIuICAqLwotCi1zdGF0aWMgdm9pZAotZXh0cmFjdF9yYW5nZV9mcm9tX3BsdXNfbWlu dXNfZXhwciAodmFsdWVfcmFuZ2UgKnZyLAotCQkJCSAgICBlbnVtIHRyZWVfY29kZSBjb2RlLAot CQkJCSAgICB0cmVlIGV4cHJfdHlwZSwKLQkJCQkgICAgY29uc3QgdmFsdWVfcmFuZ2UgKnZyMF8s Ci0JCQkJICAgIGNvbnN0IHZhbHVlX3JhbmdlICp2cjFfKQotewotICBnY2NfY2hlY2tpbmdfYXNz ZXJ0IChjb2RlID09IFBMVVNfRVhQUiB8fCBjb2RlID09IE1JTlVTX0VYUFIpOwotCi0gIHZhbHVl X3JhbmdlIHZyMCA9ICp2cjBfLCB2cjEgPSAqdnIxXzsKLSAgdmFsdWVfcmFuZ2UgdnJ0ZW0wLCB2 cnRlbTE7Ci0KLSAgLyogTm93IGNhbm9uaWNhbGl6ZSBhbnRpLXJhbmdlcyB0byByYW5nZXMgd2hl biB0aGV5IGFyZSBub3Qgc3ltYm9saWMKLSAgICAgYW5kIGV4cHJlc3MgfltdIG9wIFggYXMgKFtd JyBvcCBYKSBVIChbXScnIG9wIFgpLiAgKi8KLSAgaWYgKHZyMC5raW5kICgpID09IFZSX0FOVElf UkFOR0UKLSAgICAgICYmIHJhbmdlc19mcm9tX2FudGlfcmFuZ2UgKCZ2cjAsICZ2cnRlbTAsICZ2 cnRlbTEpKQotICAgIHsKLSAgICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV9wbHVzX21pbnVzX2V4cHIg KHZyLCBjb2RlLCBleHByX3R5cGUsICZ2cnRlbTAsIHZyMV8pOwotICAgICAgaWYgKCF2cnRlbTEu dW5kZWZpbmVkX3AgKCkpCi0JewotCSAgdmFsdWVfcmFuZ2UgdnJyZXM7Ci0JICBleHRyYWN0X3Jh bmdlX2Zyb21fcGx1c19taW51c19leHByICgmdnJyZXMsIGNvZGUsIGV4cHJfdHlwZSwKLQkJCQkJ ICAgICAgJnZydGVtMSwgdnIxXyk7Ci0JICB2ci0+dW5pb25fICh2cnJlcyk7Ci0JfQotICAgICAg cmV0dXJuOwotICAgIH0KLSAgLyogTGlrZXdpc2UgZm9yIFggb3AgfltdLiAgKi8KLSAgaWYgKHZy MS5raW5kICgpID09IFZSX0FOVElfUkFOR0UKLSAgICAgICYmIHJhbmdlc19mcm9tX2FudGlfcmFu Z2UgKCZ2cjEsICZ2cnRlbTAsICZ2cnRlbTEpKQotICAgIHsKLSAgICAgIGV4dHJhY3RfcmFuZ2Vf ZnJvbV9wbHVzX21pbnVzX2V4cHIgKHZyLCBjb2RlLCBleHByX3R5cGUsIHZyMF8sICZ2cnRlbTAp OwotICAgICAgaWYgKCF2cnRlbTEudW5kZWZpbmVkX3AgKCkpCi0JewotCSAgdmFsdWVfcmFuZ2Ug dnJyZXM7Ci0JICBleHRyYWN0X3JhbmdlX2Zyb21fcGx1c19taW51c19leHByICgmdnJyZXMsIGNv ZGUsIGV4cHJfdHlwZSwKLQkJCQkJICAgICAgdnIwXywgJnZydGVtMSk7Ci0JICB2ci0+dW5pb25f ICh2cnJlcyk7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB2YWx1ZV9yYW5nZV9raW5k IGtpbmQ7Ci0gIHZhbHVlX3JhbmdlX2tpbmQgdnIwX2tpbmQgPSB2cjAua2luZCAoKSwgdnIxX2tp bmQgPSB2cjEua2luZCAoKTsKLSAgdHJlZSB2cjBfbWluID0gdnIwLm1pbiAoKSwgdnIwX21heCA9 IHZyMC5tYXggKCk7Ci0gIHRyZWUgdnIxX21pbiA9IHZyMS5taW4gKCksIHZyMV9tYXggPSB2cjEu bWF4ICgpOwotICB0cmVlIG1pbiA9IE5VTExfVFJFRSwgbWF4ID0gTlVMTF9UUkVFOwotCi0gIC8q IFRoaXMgd2lsbCBub3JtYWxpemUgdGhpbmdzIHN1Y2ggdGhhdCBjYWxjdWxhdGluZwotICAgICBb MCwwXSAtIFZSX1ZBUllJTkcgaXMgbm90IGRyb3BwZWQgdG8gdmFyeWluZywgYnV0IGlzCi0gICAg IGNhbGN1bGF0ZWQgYXMgW01JTisxLCBNQVhdLiAgKi8KLSAgaWYgKHZyMC52YXJ5aW5nX3AgKCkp Ci0gICAgewotICAgICAgdnIwX2tpbmQgPSBWUl9SQU5HRTsKLSAgICAgIHZyMF9taW4gPSB2cnBf dmFsX21pbiAoZXhwcl90eXBlKTsKLSAgICAgIHZyMF9tYXggPSB2cnBfdmFsX21heCAoZXhwcl90 eXBlKTsKLSAgICB9Ci0gIGlmICh2cjEudmFyeWluZ19wICgpKQotICAgIHsKLSAgICAgIHZyMV9r aW5kID0gVlJfUkFOR0U7Ci0gICAgICB2cjFfbWluID0gdnJwX3ZhbF9taW4gKGV4cHJfdHlwZSk7 Ci0gICAgICB2cjFfbWF4ID0gdnJwX3ZhbF9tYXggKGV4cHJfdHlwZSk7Ci0gICAgfQotCi0gIGNv bnN0IGJvb2wgbWludXNfcCA9IChjb2RlID09IE1JTlVTX0VYUFIpOwotICB0cmVlIG1pbl9vcDAg PSB2cjBfbWluOwotICB0cmVlIG1pbl9vcDEgPSBtaW51c19wID8gdnIxX21heCA6IHZyMV9taW47 Ci0gIHRyZWUgbWF4X29wMCA9IHZyMF9tYXg7Ci0gIHRyZWUgbWF4X29wMSA9IG1pbnVzX3AgPyB2 cjFfbWluIDogdnIxX21heDsKLSAgdHJlZSBzeW1fbWluX29wMCA9IE5VTExfVFJFRTsKLSAgdHJl ZSBzeW1fbWluX29wMSA9IE5VTExfVFJFRTsKLSAgdHJlZSBzeW1fbWF4X29wMCA9IE5VTExfVFJF RTsKLSAgdHJlZSBzeW1fbWF4X29wMSA9IE5VTExfVFJFRTsKLSAgYm9vbCBuZWdfbWluX29wMCwg bmVnX21pbl9vcDEsIG5lZ19tYXhfb3AwLCBuZWdfbWF4X29wMTsKLQotICBuZWdfbWluX29wMCA9 IG5lZ19taW5fb3AxID0gbmVnX21heF9vcDAgPSBuZWdfbWF4X29wMSA9IGZhbHNlOwotCi0gIC8q IElmIHdlIGhhdmUgYSBQTFVTIG9yIE1JTlVTIHdpdGggdHdvIFZSX1JBTkdFcywgZWl0aGVyIGNv bnN0YW50IG9yCi0gICAgIHNpbmdsZS1zeW1ib2xpYyByYW5nZXMsIHRyeSB0byBjb21wdXRlIHRo ZSBwcmVjaXNlIHJlc3VsdGluZyByYW5nZSwKLSAgICAgYnV0IG9ubHkgaWYgd2Uga25vdyB0aGF0 IHRoaXMgcmVzdWx0aW5nIHJhbmdlIHdpbGwgYWxzbyBiZSBjb25zdGFudAotICAgICBvciBzaW5n bGUtc3ltYm9saWMuICAqLwotICBpZiAodnIwX2tpbmQgPT0gVlJfUkFOR0UgJiYgdnIxX2tpbmQg PT0gVlJfUkFOR0UKLSAgICAgICYmIChUUkVFX0NPREUgKG1pbl9vcDApID09IElOVEVHRVJfQ1NU Ci0JICB8fCAoc3ltX21pbl9vcDAKLQkgICAgICA9IGdldF9zaW5nbGVfc3ltYm9sIChtaW5fb3Aw LCAmbmVnX21pbl9vcDAsICZtaW5fb3AwKSkpCi0gICAgICAmJiAoVFJFRV9DT0RFIChtaW5fb3Ax KSA9PSBJTlRFR0VSX0NTVAotCSAgfHwgKHN5bV9taW5fb3AxCi0JICAgICAgPSBnZXRfc2luZ2xl X3N5bWJvbCAobWluX29wMSwgJm5lZ19taW5fb3AxLCAmbWluX29wMSkpKQotICAgICAgJiYgKCEo c3ltX21pbl9vcDAgJiYgc3ltX21pbl9vcDEpCi0JICB8fCAoc3ltX21pbl9vcDAgPT0gc3ltX21p bl9vcDEKLQkgICAgICAmJiBuZWdfbWluX29wMCA9PSAobWludXNfcCA/IG5lZ19taW5fb3AxIDog IW5lZ19taW5fb3AxKSkpCi0gICAgICAmJiAoVFJFRV9DT0RFIChtYXhfb3AwKSA9PSBJTlRFR0VS X0NTVAotCSAgfHwgKHN5bV9tYXhfb3AwCi0JICAgICAgPSBnZXRfc2luZ2xlX3N5bWJvbCAobWF4 X29wMCwgJm5lZ19tYXhfb3AwLCAmbWF4X29wMCkpKQotICAgICAgJiYgKFRSRUVfQ09ERSAobWF4 X29wMSkgPT0gSU5URUdFUl9DU1QKLQkgIHx8IChzeW1fbWF4X29wMQotCSAgICAgID0gZ2V0X3Np bmdsZV9zeW1ib2wgKG1heF9vcDEsICZuZWdfbWF4X29wMSwgJm1heF9vcDEpKSkKLSAgICAgICYm ICghKHN5bV9tYXhfb3AwICYmIHN5bV9tYXhfb3AxKQotCSAgfHwgKHN5bV9tYXhfb3AwID09IHN5 bV9tYXhfb3AxCi0JICAgICAgJiYgbmVnX21heF9vcDAgPT0gKG1pbnVzX3AgPyBuZWdfbWF4X29w MSA6ICFuZWdfbWF4X29wMSkpKSkKLSAgICB7Ci0gICAgICB3aWRlX2ludCB3bWluLCB3bWF4Owot ICAgICAgd2k6Om92ZXJmbG93X3R5cGUgbWluX292ZiA9IHdpOjpPVkZfTk9ORTsKLSAgICAgIHdp OjpvdmVyZmxvd190eXBlIG1heF9vdmYgPSB3aTo6T1ZGX05PTkU7Ci0KLSAgICAgIC8qIEJ1aWxk IHRoZSBib3VuZHMuICAqLwotICAgICAgY29tYmluZV9ib3VuZCAoY29kZSwgd21pbiwgbWluX292 ZiwgZXhwcl90eXBlLCBtaW5fb3AwLCBtaW5fb3AxKTsKLSAgICAgIGNvbWJpbmVfYm91bmQgKGNv ZGUsIHdtYXgsIG1heF9vdmYsIGV4cHJfdHlwZSwgbWF4X29wMCwgbWF4X29wMSk7Ci0KLSAgICAg IC8qIElmIHRoZSByZXN1bHRpbmcgcmFuZ2Ugd2lsbCBiZSBzeW1ib2xpYywgd2UgbmVlZCB0byBl bGltaW5hdGUgYW55Ci0JIGV4cGxpY2l0IG9yIGltcGxpY2l0IG92ZXJmbG93IGludHJvZHVjZWQg aW4gdGhlIGFib3ZlIGNvbXB1dGF0aW9uCi0JIGJlY2F1c2UgY29tcGFyZV92YWx1ZXMgY291bGQg bWFrZSBhbiBpbmNvcnJlY3QgdXNlIG9mIGl0LiAgVGhhdCdzCi0JIHdoeSB3ZSByZXF1aXJlIG9u ZSBvZiB0aGUgcmFuZ2VzIHRvIGJlIGEgc2luZ2xldG9uLiAgKi8KLSAgICAgIGlmICgoc3ltX21p bl9vcDAgIT0gc3ltX21pbl9vcDEgfHwgc3ltX21heF9vcDAgIT0gc3ltX21heF9vcDEpCi0JICAm JiAoKGJvb2wpbWluX292ZiB8fCAoYm9vbCltYXhfb3ZmCi0JICAgICAgfHwgKG1pbl9vcDAgIT0g bWF4X29wMCAmJiBtaW5fb3AxICE9IG1heF9vcDEpKSkKLQl7Ci0JICB2ci0+c2V0X3Zhcnlpbmcg KGV4cHJfdHlwZSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBBZGp1c3QgdGhlIHJhbmdl IGZvciBwb3NzaWJsZSBvdmVyZmxvdy4gICovCi0gICAgICBzZXRfdmFsdWVfcmFuZ2Vfd2l0aF9v dmVyZmxvdyAoa2luZCwgbWluLCBtYXgsIGV4cHJfdHlwZSwKLQkJCQkgICAgIHdtaW4sIHdtYXgs IG1pbl9vdmYsIG1heF9vdmYpOwotICAgICAgaWYgKGtpbmQgPT0gVlJfVkFSWUlORykKLQl7Ci0J ICB2ci0+c2V0X3ZhcnlpbmcgKGV4cHJfdHlwZSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAv KiBCdWlsZCB0aGUgc3ltYm9saWMgYm91bmRzIGlmIG5lZWRlZC4gICovCi0gICAgICBhZGp1c3Rf c3ltYm9saWNfYm91bmQgKG1pbiwgY29kZSwgZXhwcl90eXBlLAotCQkJICAgICBzeW1fbWluX29w MCwgc3ltX21pbl9vcDEsCi0JCQkgICAgIG5lZ19taW5fb3AwLCBuZWdfbWluX29wMSk7Ci0gICAg ICBhZGp1c3Rfc3ltYm9saWNfYm91bmQgKG1heCwgY29kZSwgZXhwcl90eXBlLAotCQkJICAgICBz eW1fbWF4X29wMCwgc3ltX21heF9vcDEsCi0JCQkgICAgIG5lZ19tYXhfb3AwLCBuZWdfbWF4X29w MSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRm9yIG90aGVyIGNhc2VzLCBmb3Ig ZXhhbXBsZSBpZiB3ZSBoYXZlIGEgUExVU19FWFBSIHdpdGggdHdvCi0JIFZSX0FOVElfUkFOR0Vz LCBkcm9wIHRvIFZSX1ZBUllJTkcuICBJdCB3b3VsZCB0YWtlIG1vcmUgZWZmb3J0Ci0JIHRvIGNv bXB1dGUgYSBwcmVjaXNlIHJhbmdlIGZvciBzdWNoIGEgY2FzZS4KLQkgPz8/ICBHZW5lcmFsIGV2 ZW4gbWl4ZWQgcmFuZ2Uga2luZCBvcGVyYXRpb25zIGNhbiBiZSBleHByZXNzZWQKLQkgYnkgZm9y IGV4YW1wbGUgdHJhbnNmb3JtaW5nIH5bMywgNV0gKyBbMSwgMl0gdG8gcmFuZ2Utb25seQotCSBv cGVyYXRpb25zIGFuZCBhIHVuaW9uIHByaW1pdGl2ZToKLQkgWy1JTkYsIDJdICsgWzEsIDJdICBV ICBbNSwgK0lORl0gKyBbMSwgMl0KLQkgWy1JTkYrMSwgNF0gICAgIFUgICAgWzYsICtJTkYoT1ZG KV0KLQkgdGhvdWdoIHVzdWFsbHkgdGhlIHVuaW9uIGlzIG5vdCBleGFjdGx5IHJlcHJlc2VudGFi bGUgd2l0aAotCSBhIHNpbmdsZSByYW5nZSBvciBhbnRpLXJhbmdlIGFzIHRoZSBhYm92ZSBpcwot CSBbLUlORisxLCArSU5GKE9WRildIGludGVyc2VjdGVkIHdpdGggfls1LCA1XQotCSBidXQgb25l IGNvdWxkIHVzZSBhIHNjaGVtZSBzaW1pbGFyIHRvIGVxdWl2YWxlbmNlcyBmb3IgdGhpcy4gKi8K LSAgICAgIHZyLT5zZXRfdmFyeWluZyAoZXhwcl90eXBlKTsKLSAgICAgIHJldHVybjsKLSAgICB9 Ci0KLSAgLyogSWYgZWl0aGVyIE1JTiBvciBNQVggb3ZlcmZsb3dlZCwgdGhlbiBzZXQgdGhlIHJl c3VsdGluZyByYW5nZSB0bwotICAgICBWQVJZSU5HLiAgKi8KLSAgaWYgKG1pbiA9PSBOVUxMX1RS RUUKLSAgICAgIHx8IFRSRUVfT1ZFUkZMT1dfUCAobWluKQotICAgICAgfHwgbWF4ID09IE5VTExf VFJFRQotICAgICAgfHwgVFJFRV9PVkVSRkxPV19QIChtYXgpKQotICAgIHsKLSAgICAgIHZyLT5z ZXRfdmFyeWluZyAoZXhwcl90eXBlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW50IGNt cCA9IGNvbXBhcmVfdmFsdWVzIChtaW4sIG1heCk7Ci0gIGlmIChjbXAgPT0gLTIgfHwgY21wID09 IDEpCi0gICAgewotICAgICAgLyogSWYgdGhlIG5ldyByYW5nZSBoYXMgaXRzIGxpbWl0cyBzd2Fw cGVkIGFyb3VuZCAoTUlOID4gTUFYKSwKLQkgdGhlbiB0aGUgb3BlcmF0aW9uIGNhdXNlZCBvbmUg b2YgdGhlbSB0byB3cmFwIGFyb3VuZCwgbWFyawotCSB0aGUgbmV3IHJhbmdlIFZBUllJTkcuICAq LwotICAgICAgdnItPnNldF92YXJ5aW5nIChleHByX3R5cGUpOwotICAgIH0KLSAgZWxzZQotICAg IHZyLT5zZXQgKG1pbiwgbWF4LCBraW5kKTsKLX0KLQogLyogSWYgdGhlIHR5cGVzIHBhc3NlZCBh cmUgc3VwcG9ydGVkLCByZXR1cm4gVFJVRSwgb3RoZXJ3aXNlIHNldCBWUiB0bwogICAgVkFSWUlO RyBhbmQgcmV0dXJuIEZBTFNFLiAgKi8KIApAQCAtMTEzNCw4OSArNjA4LDYgQEAgZGVmaW5lZF9y YW5nZXNfcCAodmFsdWVfcmFuZ2UgKnZyLAogICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZh bHVlX3JhbmdlCi1kcm9wX3VuZGVmaW5lc190b192YXJ5aW5nIChjb25zdCB2YWx1ZV9yYW5nZSAq dnIsIHRyZWUgZXhwcl90eXBlKQotewotICBpZiAodnItPnVuZGVmaW5lZF9wICgpKQotICAgIHJl dHVybiB2YWx1ZV9yYW5nZSAoZXhwcl90eXBlKTsKLSAgZWxzZQotICAgIHJldHVybiAqdnI7Ci19 Ci0KLS8qIElmIGFueSBvcGVyYW5kIGlzIHN5bWJvbGljLCBwZXJmb3JtIGEgYmluYXJ5IG9wZXJh dGlvbiBvbiB0aGVtIGFuZAotICAgcmV0dXJuIFRSVUUsIG90aGVyd2lzZSByZXR1cm4gRkFMU0Uu ICAqLwotCi1zdGF0aWMgYm9vbAotcmFuZ2VfZm9sZF9iaW5hcnlfc3ltYm9saWNzX3AgKHZhbHVl X3JhbmdlICp2ciwKLQkJCSAgICAgICB0cmVlX2NvZGUgY29kZSwKLQkJCSAgICAgICB0cmVlIGV4 cHJfdHlwZSwKLQkJCSAgICAgICBjb25zdCB2YWx1ZV9yYW5nZSAqdnIwXywKLQkJCSAgICAgICBj b25zdCB2YWx1ZV9yYW5nZSAqdnIxXykKLXsKLSAgaWYgKHZyMF8tPnN5bWJvbGljX3AgKCkgfHwg dnIxXy0+c3ltYm9saWNfcCAoKSkKLSAgICB7Ci0gICAgICB2YWx1ZV9yYW5nZSB2cjAgPSBkcm9w X3VuZGVmaW5lc190b192YXJ5aW5nICh2cjBfLCBleHByX3R5cGUpOwotICAgICAgdmFsdWVfcmFu Z2UgdnIxID0gZHJvcF91bmRlZmluZXNfdG9fdmFyeWluZyAodnIxXywgZXhwcl90eXBlKTsKLSAg ICAgIGlmICgoY29kZSA9PSBQTFVTX0VYUFIgfHwgY29kZSA9PSBNSU5VU19FWFBSKSkKLQl7Ci0J ICBleHRyYWN0X3JhbmdlX2Zyb21fcGx1c19taW51c19leHByICh2ciwgY29kZSwgZXhwcl90eXBl LAotCQkJCQkgICAgICAmdnIwLCAmdnIxKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGlm IChQT0lOVEVSX1RZUEVfUCAoZXhwcl90eXBlKSAmJiBjb2RlID09IFBPSU5URVJfUExVU19FWFBS KQotCXsKLQkgIGV4dHJhY3RfcmFuZ2VfZnJvbV9wb2ludGVyX3BsdXNfZXhwciAodnIsIGNvZGUs IGV4cHJfdHlwZSwKLQkJCQkJCSZ2cjAsICZ2cjEpOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAg ICAgcmFuZ2Vfb3BfaGFuZGxlciBvcCAoY29kZSwgZXhwcl90eXBlKTsKLSAgICAgIGlmICghb3Ap Ci0JdnItPnNldF92YXJ5aW5nIChleHByX3R5cGUpOwotICAgICAgdnIwLm5vcm1hbGl6ZV9zeW1i b2xpY3MgKCk7Ci0gICAgICB2cjEubm9ybWFsaXplX3N5bWJvbGljcyAoKTsKLSAgICAgIHJldHVy biBvcC5mb2xkX3JhbmdlICgqdnIsIGV4cHJfdHlwZSwgdnIwLCB2cjEpOwotICAgIH0KLSAgcmV0 dXJuIGZhbHNlOwotfQotCi0vKiBJZiBvcGVyYW5kIGlzIHN5bWJvbGljLCBwZXJmb3JtIGEgdW5h cnkgb3BlcmF0aW9uIG9uIGl0IGFuZCByZXR1cm4KLSAgIFRSVUUsIG90aGVyd2lzZSByZXR1cm4g RkFMU0UuICAqLwotCi1zdGF0aWMgYm9vbAotcmFuZ2VfZm9sZF91bmFyeV9zeW1ib2xpY3NfcCAo dmFsdWVfcmFuZ2UgKnZyLAotCQkJICAgICAgdHJlZV9jb2RlIGNvZGUsCi0JCQkgICAgICB0cmVl IGV4cHJfdHlwZSwKLQkJCSAgICAgIGNvbnN0IHZhbHVlX3JhbmdlICp2cjApCi17Ci0gIGlmICh2 cjAtPnN5bWJvbGljX3AgKCkpCi0gICAgewotICAgICAgaWYgKGNvZGUgPT0gTkVHQVRFX0VYUFIp Ci0JewotCSAgLyogLVggaXMgc2ltcGx5IDAgLSBYLiAgKi8KLQkgIHZhbHVlX3JhbmdlIHplcm87 Ci0JICB6ZXJvLnNldF96ZXJvICh2cjAtPnR5cGUgKCkpOwotCSAgcmFuZ2VfZm9sZF9iaW5hcnlf ZXhwciAodnIsIE1JTlVTX0VYUFIsIGV4cHJfdHlwZSwgJnplcm8sIHZyMCk7Ci0JICByZXR1cm4g dHJ1ZTsKLQl9Ci0gICAgICBpZiAoY29kZSA9PSBCSVRfTk9UX0VYUFIpCi0JewotCSAgLyogflgg aXMgc2ltcGx5IC0xIC0gWC4gICovCi0JICB2YWx1ZV9yYW5nZSBtaW51c29uZTsKLQkgIHRyZWUg dCA9IGJ1aWxkX2ludF9jc3QgKHZyMC0+dHlwZSAoKSwgLTEpOwotCSAgbWludXNvbmUuc2V0ICh0 LCB0KTsKLQkgIHJhbmdlX2ZvbGRfYmluYXJ5X2V4cHIgKHZyLCBNSU5VU19FWFBSLCBleHByX3R5 cGUsICZtaW51c29uZSwgdnIwKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIHJhbmdlX29w X2hhbmRsZXIgb3AgKGNvZGUsIGV4cHJfdHlwZSk7Ci0gICAgICBpZiAoIW9wKQotCXZyLT5zZXRf dmFyeWluZyAoZXhwcl90eXBlKTsKLSAgICAgIHZhbHVlX3JhbmdlIHZyMF9jc3QgKCp2cjApOwot ICAgICAgdnIwX2NzdC5ub3JtYWxpemVfc3ltYm9saWNzICgpOwotICAgICAgcmV0dXJuIG9wLmZv bGRfcmFuZ2UgKCp2ciwgZXhwcl90eXBlLCB2cjBfY3N0LCB2YWx1ZV9yYW5nZSAoZXhwcl90eXBl KSk7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KIC8qIFBlcmZvcm0gYSBiaW5hcnkgb3Bl cmF0aW9uIG9uIGEgcGFpciBvZiByYW5nZXMuICAqLwogCiB2b2lkCkBAIC0xMjM2LDkgKzYyNyw2 IEBAIHJhbmdlX2ZvbGRfYmluYXJ5X2V4cHIgKHZhbHVlX3JhbmdlICp2ciwKICAgICAgIHJldHVy bjsKICAgICB9CiAKLSAgaWYgKHJhbmdlX2ZvbGRfYmluYXJ5X3N5bWJvbGljc19wICh2ciwgY29k ZSwgZXhwcl90eXBlLCB2cjBfLCB2cjFfKSkKLSAgICByZXR1cm47Ci0KICAgdmFsdWVfcmFuZ2Ug dnIwICgqdnIwXyk7CiAgIHZhbHVlX3JhbmdlIHZyMSAoKnZyMV8pOwogICBpZiAodnIwLnVuZGVm aW5lZF9wICgpKQpAQCAtMTI2OSwyNDUgKzY1Nyw0MiBAQCByYW5nZV9mb2xkX3VuYXJ5X2V4cHIg KHZhbHVlX3JhbmdlICp2ciwKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgaWYgKHJhbmdlX2Zv bGRfdW5hcnlfc3ltYm9saWNzX3AgKHZyLCBjb2RlLCBleHByX3R5cGUsIHZyMCkpCi0gICAgcmV0 dXJuOwotCiAgIHZhbHVlX3JhbmdlIHZyMF9jc3QgKCp2cjApOwogICB2cjBfY3N0Lm5vcm1hbGl6 ZV9hZGRyZXNzZXMgKCk7CiAgIGlmICghb3AuZm9sZF9yYW5nZSAoKnZyLCBleHByX3R5cGUsIHZy MF9jc3QsIHZhbHVlX3JhbmdlIChleHByX3R5cGUpKSkKICAgICB2ci0+c2V0X3ZhcnlpbmcgKGV4 cHJfdHlwZSk7CiB9CiAKLS8qIElmIHRoZSByYW5nZSBvZiB2YWx1ZXMgdGFrZW4gYnkgT1AgY2Fu IGJlIGluZmVycmVkIGFmdGVyIFNUTVQgZXhlY3V0ZXMsCi0gICByZXR1cm4gdGhlIGNvbXBhcmlz b24gY29kZSAoQ09NUF9DT0RFX1ApIGFuZCB2YWx1ZSAoVkFMX1ApIHRoYXQKLSAgIGRlc2NyaWJl cyB0aGUgaW5mZXJyZWQgcmFuZ2UuICBSZXR1cm4gdHJ1ZSBpZiBhIHJhbmdlIGNvdWxkIGJlCi0g ICBpbmZlcnJlZC4gICovCi0KLWJvb2wKLWluZmVyX3ZhbHVlX3JhbmdlIChnaW1wbGUgKnN0bXQs IHRyZWUgb3AsIHRyZWVfY29kZSAqY29tcF9jb2RlX3AsIHRyZWUgKnZhbF9wKQotewotICAqdmFs X3AgPSBOVUxMX1RSRUU7Ci0gICpjb21wX2NvZGVfcCA9IEVSUk9SX01BUks7Ci0KLSAgLyogRG8g bm90IGF0dGVtcHQgdG8gaW5mZXIgYW55dGhpbmcgaW4gbmFtZXMgdGhhdCBmbG93IHRocm91Z2gK LSAgICAgYWJub3JtYWwgZWRnZXMuICAqLwotICBpZiAoU1NBX05BTUVfT0NDVVJTX0lOX0FCTk9S TUFMX1BISSAob3ApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiBTVE1UIGlzIHRoZSBs YXN0IHN0YXRlbWVudCBvZiBhIGJhc2ljIGJsb2NrIHdpdGggbm8gbm9ybWFsCi0gICAgIHN1Y2Nl c3NvcnMsIHRoZXJlIGlzIG5vIHBvaW50IGluZmVycmluZyBhbnl0aGluZyBhYm91dCBhbnkgb2Yg aXRzCi0gICAgIG9wZXJhbmRzLiAgV2Ugd291bGQgbm90IGJlIGFibGUgdG8gZmluZCBhIHByb3Bl ciBpbnNlcnRpb24gcG9pbnQKLSAgICAgZm9yIHRoZSBhc3NlcnRpb24sIGFueXdheS4gICovCi0g IGlmIChzdG10X2VuZHNfYmJfcCAoc3RtdCkpCi0gICAgewotICAgICAgZWRnZV9pdGVyYXRvciBl aTsKLSAgICAgIGVkZ2UgZTsKLQotICAgICAgRk9SX0VBQ0hfRURHRSAoZSwgZWksIGdpbXBsZV9i YiAoc3RtdCktPnN1Y2NzKQotCWlmICghKGUtPmZsYWdzICYgKEVER0VfQUJOT1JNQUx8RURHRV9F SCkpKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAg ICB9Ci0KLSAgaWYgKGluZmVyX25vbm51bGxfcmFuZ2UgKHN0bXQsIG9wKSkKLSAgICB7Ci0gICAg ICAqdmFsX3AgPSBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKG9wKSwgMCk7Ci0gICAgICAqY29t cF9jb2RlX3AgPSBORV9FWFBSOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQorLyogSGVscGVy IGZvciBvdmVyZmxvd19jb21wYXJpc29uX3AKIAotICByZXR1cm4gZmFsc2U7Ci19CisgICBPUDAg Q09ERSBPUDEgaXMgYSBjb21wYXJpc29uLiAgRXhhbWluZSB0aGUgY29tcGFyaXNvbiBhbmQgcG90 ZW50aWFsbHkKKyAgIE9QMSdzIGRlZmluaW5nIHN0YXRlbWVudCB0byBzZWUgaWYgaXQgdWx0aW1h dGVseSBoYXMgdGhlIGZvcm0KKyAgIE9QMCBDT0RFIChPUDAgUExVUyBJTlRFR0VSX0NTVCkKIAot LyogRHVtcCBhc3NlcnRfaW5mbyBzdHJ1Y3R1cmUuICAqLworICAgSWYgc28sIHJldHVybiBUUlVF IGluZGljYXRpbmcgdGhpcyBpcyBhbiBvdmVyZmxvdyB0ZXN0IGFuZCBzdG9yZSBpbnRvCisgICAq TkVXX0NTVCBhbiB1cGRhdGVkIGNvbnN0YW50IHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBuYXJyb3dl ZCByYW5nZSB0ZXN0LgogCi12b2lkCi1kdW1wX2Fzc2VydF9pbmZvIChGSUxFICpmaWxlLCBjb25z dCBhc3NlcnRfaW5mbyAmYXNzZXJ0KQotewotICBmcHJpbnRmIChmaWxlLCAiQXNzZXJ0IGZvcjog Iik7Ci0gIHByaW50X2dlbmVyaWNfZXhwciAoZmlsZSwgYXNzZXJ0Lm5hbWUpOwotICBmcHJpbnRm IChmaWxlLCAiXG5cdFBSRURJQ0FURTogZXhwcj1bIik7Ci0gIHByaW50X2dlbmVyaWNfZXhwciAo ZmlsZSwgYXNzZXJ0LmV4cHIpOwotICBmcHJpbnRmIChmaWxlLCAiXSAlcyAiLCBnZXRfdHJlZV9j b2RlX25hbWUgKGFzc2VydC5jb21wX2NvZGUpKTsKLSAgZnByaW50ZiAoZmlsZSwgInZhbD1bIik7 Ci0gIHByaW50X2dlbmVyaWNfZXhwciAoZmlsZSwgYXNzZXJ0LnZhbCk7Ci0gIGZwcmludGYgKGZp bGUsICJdXG5cbiIpOwotfQorICAgUkVWRVJTRUQgaW5kaWNhdGVzIGlmIHRoZSBjb21wYXJpc29u IHdhcyBvcmlnaW5hbGx5OgogCi1ERUJVR19GVU5DVElPTiB2b2lkCi1kZWJ1ZyAoY29uc3QgYXNz ZXJ0X2luZm8gJmFzc2VydCkKLXsKLSAgZHVtcF9hc3NlcnRfaW5mbyAoc3RkZXJyLCBhc3NlcnQp OwotfQorICAgT1AxIENPREUnIE9QMC4KIAotLyogRHVtcCBhIHZlY3RvciBvZiBhc3NlcnRfaW5m bydzLiAgKi8KKyAgIFRoaXMgYWZmZWN0cyBob3cgd2UgYnVpbGQgdGhlIHVwZGF0ZWQgY29uc3Rh bnQuICAqLwogCi12b2lkCi1kdW1wX2Fzc2VydHNfaW5mbyAoRklMRSAqZmlsZSwgY29uc3QgdmVj PGFzc2VydF9pbmZvPiAmYXNzZXJ0cykKK3N0YXRpYyBib29sCitvdmVyZmxvd19jb21wYXJpc29u X3BfMSAoZW51bSB0cmVlX2NvZGUgY29kZSwgdHJlZSBvcDAsIHRyZWUgb3AxLAorCQkJIGJvb2wg Zm9sbG93X2Fzc2VydF9leHBycywgYm9vbCByZXZlcnNlZCwgdHJlZSAqbmV3X2NzdCkKIHsKLSAg Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGFzc2VydHMubGVuZ3RoICgpOyArK2kpCisgIC8qIFNl ZSBpZiB0aGlzIGlzIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gYmV0d2VlbiB0d28gU1NBX05BTUVT IHdpdGgKKyAgICAgdW5zaWduZWQsIG92ZXJmbG93IHdyYXBwaW5nIHZhbHVlcy4gIElmIHNvLCBj aGVjayBpdCBtb3JlIGRlZXBseS4gICovCisgIGlmICgoY29kZSA9PSBMVF9FWFBSIHx8IGNvZGUg PT0gTEVfRVhQUgorICAgICAgIHx8IGNvZGUgPT0gR0VfRVhQUiB8fCBjb2RlID09IEdUX0VYUFIp CisgICAgICAmJiBUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUKKyAgICAgICYmIFRSRUVfQ09E RSAob3AxKSA9PSBTU0FfTkFNRQorICAgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUg KG9wMCkpCisgICAgICAmJiBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKG9wMCkpCisgICAgICAm JiBUWVBFX09WRVJGTE9XX1dSQVBTIChUUkVFX1RZUEUgKG9wMCkpKQogICAgIHsKLSAgICAgIGR1 bXBfYXNzZXJ0X2luZm8gKGZpbGUsIGFzc2VydHNbaV0pOwotICAgICAgZnByaW50ZiAoZmlsZSwg IlxuIik7Ci0gICAgfQotfQotCi1ERUJVR19GVU5DVElPTiB2b2lkCi1kZWJ1ZyAoY29uc3QgdmVj PGFzc2VydF9pbmZvPiAmYXNzZXJ0cykKLXsKLSAgZHVtcF9hc3NlcnRzX2luZm8gKHN0ZGVyciwg YXNzZXJ0cyk7Ci19Ci0KLS8qIFB1c2ggdGhlIGFzc2VydCBpbmZvIGZvciBOQU1FLCBFWFBSLCBD T01QX0NPREUgYW5kIFZBTCB0byBBU1NFUlRTLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9hc3Nl cnRfaW5mbyAodmVjPGFzc2VydF9pbmZvPiAmYXNzZXJ0cywKLQkJIHRyZWUgbmFtZSwgdHJlZSBl eHByLCBlbnVtIHRyZWVfY29kZSBjb21wX2NvZGUsIHRyZWUgdmFsKQotewotICBhc3NlcnRfaW5m byBpbmZvOwotICBpbmZvLmNvbXBfY29kZSA9IGNvbXBfY29kZTsKLSAgaW5mby5uYW1lID0gbmFt ZTsKLSAgaWYgKFRSRUVfT1ZFUkZMT1dfUCAodmFsKSkKLSAgICB2YWwgPSBkcm9wX3RyZWVfb3Zl cmZsb3cgKHZhbCk7Ci0gIGluZm8udmFsID0gdmFsOwotICBpbmZvLmV4cHIgPSBleHByOwotICBh c3NlcnRzLnNhZmVfcHVzaCAoaW5mbyk7Ci0gIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKLSAgICBk dW1wX3ByaW50ZiAoTVNHX05PVEUgfCBNU0dfUFJJT1JJVFlfSU5URVJOQUxTLAotCQkgIkFkZGlu ZyBhc3NlcnQgZm9yICVUIGZyb20gJVQgJXMgJVRcbiIsCi0JCSBuYW1lLCBleHByLCBvcF9zeW1i b2xfY29kZSAoY29tcF9jb2RlKSwgdmFsKTsKLX0KLQotLyogKENPTkRfT1AwIENPTkRfQ09ERSBD T05EX09QMSkgaXMgYSBwcmVkaWNhdGUgd2hpY2ggdXNlcyBOQU1FLgotICAgRXh0cmFjdCBhIHN1 aXRhYmxlIHRlc3QgY29kZSBhbmQgdmFsdWUgYW5kIHN0b3JlIHRoZW0gaW50byAqQ09ERV9QIGFu ZAotICAgKlZBTF9QIHNvIHRoZSBwcmVkaWNhdGUgaXMgbm9ybWFsaXplZCB0byBOQU1FICpDT0RF X1AgKlZBTF9QLgotCi0gICBJZiBubyBleHRyYWN0aW9uIHdhcyBwb3NzaWJsZSwgcmV0dXJuIEZB TFNFLCBvdGhlcndpc2UgcmV0dXJuIFRSVUUuCi0KLSAgIElmIElOVkVSVCBpcyB0cnVlLCB0aGVu IHdlIGludmVydCB0aGUgcmVzdWx0IHN0b3JlZCBpbnRvICpDT0RFX1AuICAqLwotCi1zdGF0aWMg Ym9vbAotZXh0cmFjdF9jb2RlX2FuZF92YWxfZnJvbV9jb25kX3dpdGhfb3BzICh0cmVlIG5hbWUs IGVudW0gdHJlZV9jb2RlIGNvbmRfY29kZSwKLQkJCQkJIHRyZWUgY29uZF9vcDAsIHRyZWUgY29u ZF9vcDEsCi0JCQkJCSBib29sIGludmVydCwgZW51bSB0cmVlX2NvZGUgKmNvZGVfcCwKLQkJCQkJ IHRyZWUgKnZhbF9wKQotewotICBlbnVtIHRyZWVfY29kZSBjb21wX2NvZGU7Ci0gIHRyZWUgdmFs OwotCi0gIC8qIE90aGVyd2lzZSwgd2UgaGF2ZSBhIGNvbXBhcmlzb24gb2YgdGhlIGZvcm0gTkFN RSBDT01QIFZBTAotICAgICBvciBWQUwgQ09NUCBOQU1FLiAgKi8KLSAgaWYgKG5hbWUgPT0gY29u ZF9vcDEpCi0gICAgewotICAgICAgLyogSWYgdGhlIHByZWRpY2F0ZSBpcyBvZiB0aGUgZm9ybSBW QUwgQ09NUCBOQU1FLCBmbGlwCi0JIENPTVAgYXJvdW5kIGJlY2F1c2Ugd2UgbmVlZCB0byByZWdp c3RlciBOQU1FIGFzIHRoZQotCSBmaXJzdCBvcGVyYW5kIGluIHRoZSBwcmVkaWNhdGUuICAqLwot ICAgICAgY29tcF9jb2RlID0gc3dhcF90cmVlX2NvbXBhcmlzb24gKGNvbmRfY29kZSk7Ci0gICAg ICB2YWwgPSBjb25kX29wMDsKLSAgICB9Ci0gIGVsc2UgaWYgKG5hbWUgPT0gY29uZF9vcDApCi0g ICAgewotICAgICAgLyogVGhlIGNvbXBhcmlzb24gaXMgb2YgdGhlIGZvcm0gTkFNRSBDT01QIFZB TCwgc28gdGhlCi0JIGNvbXBhcmlzb24gY29kZSByZW1haW5zIHVuY2hhbmdlZC4gICovCi0gICAg ICBjb21wX2NvZGUgPSBjb25kX2NvZGU7Ci0gICAgICB2YWwgPSBjb25kX29wMTsKLSAgICB9Ci0g IGVsc2UKLSAgICBnY2NfdW5yZWFjaGFibGUgKCk7Ci0KLSAgLyogSW52ZXJ0IHRoZSBjb21wYXJp c29uIGNvZGUgYXMgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGludmVydCkKLSAgICBjb21wX2NvZGUg PSBpbnZlcnRfdHJlZV9jb21wYXJpc29uIChjb21wX2NvZGUsIDApOwotCi0gIC8qIFZSUCBvbmx5 IGhhbmRsZXMgaW50ZWdyYWwgYW5kIHBvaW50ZXIgdHlwZXMuICAqLwotICBpZiAoISBJTlRFR1JB TF9UWVBFX1AgKFRSRUVfVFlQRSAodmFsKSkKLSAgICAgICYmICEgUE9JTlRFUl9UWVBFX1AgKFRS RUVfVFlQRSAodmFsKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERvIG5vdCByZWdpc3Rl ciBhbHdheXMtZmFsc2UgcHJlZGljYXRlcy4KLSAgICAgRklYTUU6ICB0aGlzIHdvcmtzIGFyb3Vu ZCBhIGxpbWl0YXRpb24gaW4gZm9sZCgpIHdoZW4gZGVhbGluZyB3aXRoCi0gICAgIGVudW1lcmF0 aW9ucy4gIEdpdmVuICdlbnVtIHsgTjEsIE4yIH0geDsnLCBmb2xkIHdpbGwgbm90Ci0gICAgIGZv bGQgJ2lmICh4ID4gTjIpJyB0byAnaWYgKDApJy4gICovCi0gIGlmICgoY29tcF9jb2RlID09IEdU X0VYUFIgfHwgY29tcF9jb2RlID09IExUX0VYUFIpCi0gICAgICAmJiBJTlRFR1JBTF9UWVBFX1Ag KFRSRUVfVFlQRSAodmFsKSkpCi0gICAgewotICAgICAgdHJlZSBtaW4gPSBUWVBFX01JTl9WQUxV RSAoVFJFRV9UWVBFICh2YWwpKTsKLSAgICAgIHRyZWUgbWF4ID0gVFlQRV9NQVhfVkFMVUUgKFRS RUVfVFlQRSAodmFsKSk7Ci0KLSAgICAgIGlmIChjb21wX2NvZGUgPT0gR1RfRVhQUgotCSAgJiYg KCFtYXgKLQkgICAgICB8fCBjb21wYXJlX3ZhbHVlcyAodmFsLCBtYXgpID09IDApKQotCXJldHVy biBmYWxzZTsKLQotICAgICAgaWYgKGNvbXBfY29kZSA9PSBMVF9FWFBSCi0JICAmJiAoIW1pbgot CSAgICAgIHx8IGNvbXBhcmVfdmFsdWVzICh2YWwsIG1pbikgPT0gMCkpCi0JcmV0dXJuIGZhbHNl OwotICAgIH0KLSAgKmNvZGVfcCA9IGNvbXBfY29kZTsKLSAgKnZhbF9wID0gdmFsOwotICByZXR1 cm4gdHJ1ZTsKLX0KLQotLyogRmluZCBvdXQgc21hbGxlc3QgUkVTIHdoZXJlIFJFUyA+IFZBTCAm JiAoUkVTICYgTUFTSykgPT0gUkVTLCBpZiBhbnkKLSAgIChvdGhlcndpc2UgcmV0dXJuIFZBTCku ICBWQUwgYW5kIE1BU0sgbXVzdCBiZSB6ZXJvLWV4dGVuZGVkIGZvcgotICAgcHJlY2lzaW9uIFBS RUMuICBJZiBTR05CSVQgaXMgbm9uLXplcm8sIGZpcnN0IHhvciBWQUwgd2l0aCBTR05CSVQKLSAg ICh0byB0cmFuc2Zvcm0gc2lnbmVkIHZhbHVlcyBpbnRvIHVuc2lnbmVkKSBhbmQgYXQgdGhlIGVu ZCB4b3IKLSAgIFNHTkJJVCBiYWNrLiAgKi8KLQotd2lkZV9pbnQKLW1hc2tlZF9pbmNyZW1lbnQg KGNvbnN0IHdpZGVfaW50ICZ2YWxfaW4sIGNvbnN0IHdpZGVfaW50ICZtYXNrLAotCQkgIGNvbnN0 IHdpZGVfaW50ICZzZ25iaXQsIHVuc2lnbmVkIGludCBwcmVjKQotewotICB3aWRlX2ludCBiaXQg PSB3aTo6b25lIChwcmVjKSwgcmVzOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICB3aWRlX2ludCB2 YWwgPSB2YWxfaW4gXiBzZ25iaXQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyssIGJpdCAr PSBiaXQpCi0gICAgewotICAgICAgcmVzID0gbWFzazsKLSAgICAgIGlmICgocmVzICYgYml0KSA9 PSAwKQotCWNvbnRpbnVlOwotICAgICAgcmVzID0gYml0IC0gMTsKLSAgICAgIHJlcyA9IHdpOjpi aXRfYW5kX25vdCAodmFsICsgYml0LCByZXMpOwotICAgICAgcmVzICY9IG1hc2s7Ci0gICAgICBp ZiAod2k6Omd0dV9wIChyZXMsIHZhbCkpCi0JcmV0dXJuIHJlcyBeIHNnbmJpdDsKLSAgICB9Ci0g IHJldHVybiB2YWwgXiBzZ25iaXQ7Ci19Ci0KLS8qIEhlbHBlciBmb3Igb3ZlcmZsb3dfY29tcGFy aXNvbl9wCi0KLSAgIE9QMCBDT0RFIE9QMSBpcyBhIGNvbXBhcmlzb24uICBFeGFtaW5lIHRoZSBj b21wYXJpc29uIGFuZCBwb3RlbnRpYWxseQotICAgT1AxJ3MgZGVmaW5pbmcgc3RhdGVtZW50IHRv IHNlZSBpZiBpdCB1bHRpbWF0ZWx5IGhhcyB0aGUgZm9ybQotICAgT1AwIENPREUgKE9QMCBQTFVT IElOVEVHRVJfQ1NUKQotCi0gICBJZiBzbywgcmV0dXJuIFRSVUUgaW5kaWNhdGluZyB0aGlzIGlz IGFuIG92ZXJmbG93IHRlc3QgYW5kIHN0b3JlIGludG8KLSAgICpORVdfQ1NUIGFuIHVwZGF0ZWQg Y29uc3RhbnQgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIG5hcnJvd2VkIHJhbmdlIHRlc3QuCi0KLSAg IFJFVkVSU0VEIGluZGljYXRlcyBpZiB0aGUgY29tcGFyaXNvbiB3YXMgb3JpZ2luYWxseToKLQot ICAgT1AxIENPREUnIE9QMC4KLQotICAgVGhpcyBhZmZlY3RzIGhvdyB3ZSBidWlsZCB0aGUgdXBk YXRlZCBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sCi1vdmVyZmxvd19jb21wYXJpc29uX3Bf MSAoZW51bSB0cmVlX2NvZGUgY29kZSwgdHJlZSBvcDAsIHRyZWUgb3AxLAotCQkgICAgICAgICBi b29sIGZvbGxvd19hc3NlcnRfZXhwcnMsIGJvb2wgcmV2ZXJzZWQsIHRyZWUgKm5ld19jc3QpCi17 Ci0gIC8qIFNlZSBpZiB0aGlzIGlzIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gYmV0d2VlbiB0d28g U1NBX05BTUVTIHdpdGgKLSAgICAgdW5zaWduZWQsIG92ZXJmbG93IHdyYXBwaW5nIHZhbHVlcy4g IElmIHNvLCBjaGVjayBpdCBtb3JlIGRlZXBseS4gICovCi0gIGlmICgoY29kZSA9PSBMVF9FWFBS IHx8IGNvZGUgPT0gTEVfRVhQUgotICAgICAgIHx8IGNvZGUgPT0gR0VfRVhQUiB8fCBjb2RlID09 IEdUX0VYUFIpCi0gICAgICAmJiBUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUKLSAgICAgICYm IFRSRUVfQ09ERSAob3AxKSA9PSBTU0FfTkFNRQotICAgICAgJiYgSU5URUdSQUxfVFlQRV9QIChU UkVFX1RZUEUgKG9wMCkpCi0gICAgICAmJiBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKG9wMCkp Ci0gICAgICAmJiBUWVBFX09WRVJGTE9XX1dSQVBTIChUUkVFX1RZUEUgKG9wMCkpKQotICAgIHsK LSAgICAgIGdpbXBsZSAqb3AxX2RlZiA9IFNTQV9OQU1FX0RFRl9TVE1UIChvcDEpOworICAgICAg Z2ltcGxlICpvcDFfZGVmID0gU1NBX05BTUVfREVGX1NUTVQgKG9wMSk7CiAKICAgICAgIC8qIElm IHJlcXVlc3RlZCwgZm9sbG93IGFueSBBU1NFUlRfRVhQUnMgYmFja3dhcmRzIGZvciBPUDEuICAq LwogICAgICAgaWYgKGZvbGxvd19hc3NlcnRfZXhwcnMpCkBAIC0xNTg5LDI4NDQgKzc3NCwyMzYg QEAgb3ZlcmZsb3dfY29tcGFyaXNvbl9wICh0cmVlX2NvZGUgY29kZSwgdHJlZSBuYW1lLCB0cmVl IHZhbCwKIAkJCQkgIHVzZV9lcXVpdl9wLCB0cnVlLCBuZXdfY3N0KTsKIH0KIAorLyogSGFuZGxl CisgICBfNCA9IHhfMyAmIDMxOworICAgaWYgKF80ICE9IDApCisgICAgIGdvdG8gPGJiIDY+Owor ICAgZWxzZQorICAgICBnb3RvIDxiYiA3PjsKKyAgIDxiYiA2PjoKKyAgIF9fYnVpbHRpbl91bnJl YWNoYWJsZSAoKTsKKyAgIDxiYiA3PjoKKyAgIHhfNSA9IEFTU0VSVF9FWFBSIDx4XzMsIC4uLj47 CisgICBJZiB4XzMgaGFzIG5vIG90aGVyIGltbWVkaWF0ZSB1c2VzIChjaGVja2VkIGJ5IGNhbGxl ciksCisgICB2YXIgaXMgdGhlIHhfMyB2YXIgZnJvbSBBU1NFUlRfRVhQUiwgd2UgY2FuIGNsZWFy IGxvdyA1IGJpdHMKKyAgIGZyb20gdGhlIG5vbi16ZXJvIGJpdG1hc2suICAqLwogCi0vKiBUcnkg dG8gcmVnaXN0ZXIgYW4gZWRnZSBhc3NlcnRpb24gZm9yIFNTQSBuYW1lIE5BTUUgb24gZWRnZSBF IGZvcgotICAgdGhlIGNvbmRpdGlvbiBDT05EIGNvbnRyaWJ1dGluZyB0byB0aGUgY29uZGl0aW9u YWwganVtcCBwb2ludGVkIHRvIGJ5IEJTSS4KLSAgIEludmVydCB0aGUgY29uZGl0aW9uIENPTkQg aWYgSU5WRVJUIGlzIHRydWUuICAqLwotCi1zdGF0aWMgdm9pZAotcmVnaXN0ZXJfZWRnZV9hc3Nl cnRfZm9yXzIgKHRyZWUgbmFtZSwgZWRnZSBlLAotCQkJICAgIGVudW0gdHJlZV9jb2RlIGNvbmRf Y29kZSwKLQkJCSAgICB0cmVlIGNvbmRfb3AwLCB0cmVlIGNvbmRfb3AxLCBib29sIGludmVydCwK LQkJCSAgICB2ZWM8YXNzZXJ0X2luZm8+ICZhc3NlcnRzKQordm9pZAorbWF5YmVfc2V0X25vbnpl cm9fYml0cyAoZWRnZSBlLCB0cmVlIHZhcikKIHsKLSAgdHJlZSB2YWw7Ci0gIGVudW0gdHJlZV9j b2RlIGNvbXBfY29kZTsKKyAgYmFzaWNfYmxvY2sgY29uZF9iYiA9IGUtPnNyYzsKKyAgZ2ltcGxl ICpzdG10ID0gbGFzdF9zdG10IChjb25kX2JiKTsKKyAgdHJlZSBjc3Q7CiAKLSAgaWYgKCFleHRy YWN0X2NvZGVfYW5kX3ZhbF9mcm9tX2NvbmRfd2l0aF9vcHMgKG5hbWUsIGNvbmRfY29kZSwKLQkJ CQkJCWNvbmRfb3AwLAotCQkJCQkJY29uZF9vcDEsCi0JCQkJCQlpbnZlcnQsICZjb21wX2NvZGUs ICZ2YWwpKQorICBpZiAoc3RtdCA9PSBOVUxMCisgICAgICB8fCBnaW1wbGVfY29kZSAoc3RtdCkg IT0gR0lNUExFX0NPTkQKKyAgICAgIHx8IGdpbXBsZV9jb25kX2NvZGUgKHN0bXQpICE9ICgoZS0+ ZmxhZ3MgJiBFREdFX1RSVUVfVkFMVUUpCisJCQkJICAgICA/IEVRX0VYUFIgOiBORV9FWFBSKQor ICAgICAgfHwgVFJFRV9DT0RFIChnaW1wbGVfY29uZF9saHMgKHN0bXQpKSAhPSBTU0FfTkFNRQor ICAgICAgfHwgIWludGVnZXJfemVyb3AgKGdpbXBsZV9jb25kX3JocyAoc3RtdCkpKQogICAgIHJl dHVybjsKIAotICAvKiBRdWV1ZSB0aGUgYXNzZXJ0LiAgKi8KLSAgdHJlZSB4OwotICBpZiAob3Zl cmZsb3dfY29tcGFyaXNvbl9wIChjb21wX2NvZGUsIG5hbWUsIHZhbCwgZmFsc2UsICZ4KSkKLSAg ICB7Ci0gICAgICBlbnVtIHRyZWVfY29kZSBuZXdfY29kZSA9ICgoY29tcF9jb2RlID09IEdUX0VY UFIgfHwgY29tcF9jb2RlID09IEdFX0VYUFIpCi0JCQkJID8gR1RfRVhQUiA6IExFX0VYUFIpOwot ICAgICAgYWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBuYW1lLCBuYW1lLCBuZXdfY29kZSwgeCk7 Ci0gICAgfQotICBhZGRfYXNzZXJ0X2luZm8gKGFzc2VydHMsIG5hbWUsIG5hbWUsIGNvbXBfY29k ZSwgdmFsKTsKLQotICAvKiBJbiB0aGUgY2FzZSBvZiBOQU1FIDw9IENTVCBhbmQgTkFNRSBiZWlu ZyBkZWZpbmVkIGFzCi0gICAgIE5BTUUgPSAodW5zaWduZWQpIE5BTUUyICsgQ1NUMiB3ZSBjYW4g YXNzZXJ0IE5BTUUyID49IC1DU1QyCi0gICAgIGFuZCBOQU1FMiA8PSBDU1QgLSBDU1QyLiAgV2Ug Y2FuIGRvIHRoZSBzYW1lIGZvciBOQU1FID4gQ1NULgotICAgICBUaGlzIGNhdGNoZXMgcmFuZ2Ug YW5kIGFudGktcmFuZ2UgdGVzdHMuICAqLwotICBpZiAoKGNvbXBfY29kZSA9PSBMRV9FWFBSCi0g ICAgICAgfHwgY29tcF9jb2RlID09IEdUX0VYUFIpCi0gICAgICAmJiBUUkVFX0NPREUgKHZhbCkg PT0gSU5URUdFUl9DU1QKLSAgICAgICYmIFRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAodmFsKSkp CisgIHN0bXQgPSBTU0FfTkFNRV9ERUZfU1RNVCAoZ2ltcGxlX2NvbmRfbGhzIChzdG10KSk7Cisg IGlmICghaXNfZ2ltcGxlX2Fzc2lnbiAoc3RtdCkKKyAgICAgIHx8IGdpbXBsZV9hc3NpZ25fcmhz X2NvZGUgKHN0bXQpICE9IEJJVF9BTkRfRVhQUgorICAgICAgfHwgVFJFRV9DT0RFIChnaW1wbGVf YXNzaWduX3JoczIgKHN0bXQpKSAhPSBJTlRFR0VSX0NTVCkKKyAgICByZXR1cm47CisgIGlmIChn aW1wbGVfYXNzaWduX3JoczEgKHN0bXQpICE9IHZhcikKICAgICB7Ci0gICAgICBnaW1wbGUgKmRl Zl9zdG10ID0gU1NBX05BTUVfREVGX1NUTVQgKG5hbWUpOwotICAgICAgdHJlZSBjc3QyID0gTlVM TF9UUkVFLCBuYW1lMiA9IE5VTExfVFJFRSwgbmFtZTMgPSBOVUxMX1RSRUU7CisgICAgICBnaW1w bGUgKnN0bXQyOwogCi0gICAgICAvKiBFeHRyYWN0IENTVDIgZnJvbSB0aGUgKG9wdGlvbmFsKSBh ZGRpdGlvbi4gICovCi0gICAgICBpZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoZGVmX3N0bXQpCi0JICAm JiBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChkZWZfc3RtdCkgPT0gUExVU19FWFBSKQotCXsKLQkg IG5hbWUyID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0JICBjc3QyID0gZ2ltcGxl X2Fzc2lnbl9yaHMyIChkZWZfc3RtdCk7Ci0JICBpZiAoVFJFRV9DT0RFIChuYW1lMikgPT0gU1NB X05BTUUKLQkgICAgICAmJiBUUkVFX0NPREUgKGNzdDIpID09IElOVEVHRVJfQ1NUKQotCSAgICBk ZWZfc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lMik7Ci0JfQorICAgICAgaWYgKFRSRUVf Q09ERSAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KSkgIT0gU1NBX05BTUUpCisJcmV0dXJuOwor ICAgICAgc3RtdDIgPSBTU0FfTkFNRV9ERUZfU1RNVCAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10 KSk7CisgICAgICBpZiAoIWdpbXBsZV9hc3NpZ25fY2FzdF9wIChzdG10MikKKwkgIHx8IGdpbXBs ZV9hc3NpZ25fcmhzMSAoc3RtdDIpICE9IHZhcgorCSAgfHwgIUNPTlZFUlRfRVhQUl9DT0RFX1Ag KGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQyKSkKKwkgIHx8IChUWVBFX1BSRUNJU0lPTiAo VFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpKSkKKwkJCSAgICAgICE9IFRZUEVf UFJFQ0lTSU9OIChUUkVFX1RZUEUgKHZhcikpKSkKKwlyZXR1cm47CisgICAgfQorICBjc3QgPSBn aW1wbGVfYXNzaWduX3JoczIgKHN0bXQpOworICBzZXRfbm9uemVyb19iaXRzICh2YXIsIHdpOjpi aXRfYW5kX25vdCAoZ2V0X25vbnplcm9fYml0cyAodmFyKSwKKwkJCQkJICB3aTo6dG9fd2lkZSAo Y3N0KSkpOworfQogCi0gICAgICAvKiBFeHRyYWN0IE5BTUUyIGZyb20gdGhlIChvcHRpb25hbCkg c2lnbi1jaGFuZ2luZyBjYXN0LiAgKi8KLSAgICAgIGlmIChnYXNzaWduICphc3MgPSBkeW5fY2Fz dCA8Z2Fzc2lnbiAqPiAoZGVmX3N0bXQpKQotCXsKLQkgIGlmIChDT05WRVJUX0VYUFJfQ09ERV9Q IChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChhc3MpKQotCSAgICAgICYmICEgVFlQRV9VTlNJR05F RCAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX3JoczEgKGFzcykpKQotCSAgICAgICYmIChUWVBF X1BSRUNJU0lPTiAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAoYXNzKSkpCi0JCSAgPT0g VFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChhc3MpKSkpKQot CSAgICBuYW1lMyA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoYXNzKTsKLQl9CisvKiBTZWFyY2hlcyB0 aGUgY2FzZSBsYWJlbCB2ZWN0b3IgVkVDIGZvciB0aGUgaW5kZXggKklEWCBvZiB0aGUgQ0FTRV9M QUJFTAorICAgdGhhdCBpbmNsdWRlcyB0aGUgdmFsdWUgVkFMLiAgVGhlIHNlYXJjaCBpcyByZXN0 cmljdGVkIHRvIHRoZSByYW5nZQorICAgW1NUQVJUX0lEWCwgbiAtIDFdIHdoZXJlIG4gaXMgdGhl IHNpemUgb2YgVkVDLgogCi0gICAgICAvKiBJZiBuYW1lMyBpcyB1c2VkIGxhdGVyLCBjcmVhdGUg YW4gQVNTRVJUX0VYUFIgZm9yIGl0LiAgKi8KLSAgICAgIGlmIChuYW1lMyAhPSBOVUxMX1RSRUUK LSAgICAgIAkgICYmIFRSRUVfQ09ERSAobmFtZTMpID09IFNTQV9OQU1FCi0JICAmJiAoY3N0MiA9 PSBOVUxMX1RSRUUKLQkgICAgICB8fCBUUkVFX0NPREUgKGNzdDIpID09IElOVEVHRVJfQ1NUKQot CSAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG5hbWUzKSkpCi0JewotCSAgdHJlZSB0 bXA7CisgICBJZiB0aGVyZSBpcyBhIENBU0VfTEFCRUwgZm9yIFZBTCwgaXRzIGluZGV4IGlzIHBs YWNlZCBpbiBJRFggYW5kIHRydWUgaXMKKyAgIHJldHVybmVkLgogCi0JICAvKiBCdWlsZCBhbiBl eHByZXNzaW9uIGZvciB0aGUgcmFuZ2UgdGVzdC4gICovCi0JICB0bXAgPSBidWlsZDEgKE5PUF9F WFBSLCBUUkVFX1RZUEUgKG5hbWUpLCBuYW1lMyk7Ci0JICBpZiAoY3N0MiAhPSBOVUxMX1RSRUUp Ci0JICAgIHRtcCA9IGJ1aWxkMiAoUExVU19FWFBSLCBUUkVFX1RZUEUgKG5hbWUpLCB0bXAsIGNz dDIpOwotCSAgYWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBuYW1lMywgdG1wLCBjb21wX2NvZGUs IHZhbCk7Ci0JfQorICAgSWYgdGhlcmUgaXMgbm8gQ0FTRV9MQUJFTCBmb3IgVkFMIGFuZCB0aGVy ZSBpcyBvbmUgdGhhdCBpcyBsYXJnZXIgdGhhbiBWQUwsCisgICBpdCBpcyBwbGFjZWQgaW4gSURY IGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KIAotICAgICAgLyogSWYgbmFtZTIgaXMgdXNlZCBsYXRl ciwgY3JlYXRlIGFuIEFTU0VSVF9FWFBSIGZvciBpdC4gICovCi0gICAgICBpZiAobmFtZTIgIT0g TlVMTF9UUkVFCi0gICAgICAJICAmJiBUUkVFX0NPREUgKG5hbWUyKSA9PSBTU0FfTkFNRQotCSAg JiYgVFJFRV9DT0RFIChjc3QyKSA9PSBJTlRFR0VSX0NTVAotCSAgJiYgSU5URUdSQUxfVFlQRV9Q IChUUkVFX1RZUEUgKG5hbWUyKSkpCi0JewotCSAgdHJlZSB0bXA7Ci0KLQkgIC8qIEJ1aWxkIGFu IGV4cHJlc3Npb24gZm9yIHRoZSByYW5nZSB0ZXN0LiAgKi8KLQkgIHRtcCA9IG5hbWUyOwotCSAg aWYgKFRSRUVfVFlQRSAobmFtZSkgIT0gVFJFRV9UWVBFIChuYW1lMikpCi0JICAgIHRtcCA9IGJ1 aWxkMSAoTk9QX0VYUFIsIFRSRUVfVFlQRSAobmFtZSksIHRtcCk7Ci0JICBpZiAoY3N0MiAhPSBO VUxMX1RSRUUpCi0JICAgIHRtcCA9IGJ1aWxkMiAoUExVU19FWFBSLCBUUkVFX1RZUEUgKG5hbWUp LCB0bXAsIGNzdDIpOwotCSAgYWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBuYW1lMiwgdG1wLCBj b21wX2NvZGUsIHZhbCk7Ci0JfQotICAgIH0KKyAgIElmIFZBTCBpcyBsYXJnZXIgdGhhbiBhbnkg Q0FTRV9MQUJFTCwgbiBpcyBwbGFjZWQgb24gSURYIGFuZCBmYWxzZSBpcworICAgcmV0dXJuZWQu ICovCiAKLSAgLyogSW4gdGhlIGNhc2Ugb2YgcG9zdC1pbi9kZWNyZW1lbnQgdGVzdHMgbGlrZSBp ZiAoaSsrKSAuLi4gYW5kIHVzZXMKLSAgICAgb2YgdGhlIGluL2RlY3JlbWVudGVkIHZhbHVlIG9u IHRoZSBlZGdlIHRoZSBleHRyYSBuYW1lIHdlIHdhbnQgdG8KLSAgICAgYXNzZXJ0IGZvciBpcyBu b3Qgb24gdGhlIGRlZiBjaGFpbiBvZiB0aGUgbmFtZSBjb21wYXJlZC4gIEluc3RlYWQKLSAgICAg aXQgaXMgaW4gdGhlIHNldCBvZiB1c2Ugc3RtdHMuCi0gICAgIFNpbWlsYXIgY2FzZXMgaGFwcGVu IGZvciBjb252ZXJzaW9ucyB0aGF0IHdlcmUgc2ltcGxpZmllZCB0aHJvdWdoCi0gICAgIGZvbGRf e3NpZ25fY2hhbmdlZCx3aWRlbmVkfV9jb21wYXJpc29uLiAgKi8KLSAgaWYgKChjb21wX2NvZGUg PT0gTkVfRVhQUgotICAgICAgIHx8IGNvbXBfY29kZSA9PSBFUV9FWFBSKQotICAgICAgJiYgVFJF RV9DT0RFICh2YWwpID09IElOVEVHRVJfQ1NUKQotICAgIHsKLSAgICAgIGltbV91c2VfaXRlcmF0 b3IgdWk7Ci0gICAgICBnaW1wbGUgKnVzZV9zdG10OwotICAgICAgRk9SX0VBQ0hfSU1NX1VTRV9T VE1UICh1c2Vfc3RtdCwgdWksIG5hbWUpCi0JewotCSAgaWYgKCFpc19naW1wbGVfYXNzaWduICh1 c2Vfc3RtdCkpCi0JICAgIGNvbnRpbnVlOworYm9vbAorZmluZF9jYXNlX2xhYmVsX2luZGV4IChn c3dpdGNoICpzdG10LCBzaXplX3Qgc3RhcnRfaWR4LCB0cmVlIHZhbCwgc2l6ZV90ICppZHgpCit7 CisgIHNpemVfdCBuID0gZ2ltcGxlX3N3aXRjaF9udW1fbGFiZWxzIChzdG10KTsKKyAgc2l6ZV90 IGxvdywgaGlnaDsKIAotCSAgLyogQ3V0IG9mZiB0byB1c2Utc3RtdHMgdGhhdCBhcmUgZG9taW5h dGluZyB0aGUgcHJlZGVjZXNzb3IuICAqLwotCSAgaWYgKCFkb21pbmF0ZWRfYnlfcCAoQ0RJX0RP TUlOQVRPUlMsIGUtPnNyYywgZ2ltcGxlX2JiICh1c2Vfc3RtdCkpKQotCSAgICBjb250aW51ZTsK KyAgLyogRmluZCBjYXNlIGxhYmVsIGZvciBtaW5pbXVtIG9mIHRoZSB2YWx1ZSByYW5nZSBvciB0 aGUgbmV4dCBvbmUuCisgICAgIEF0IGVhY2ggaXRlcmF0aW9uIHdlIGFyZSBzZWFyY2hpbmcgaW4g W2xvdywgaGlnaCAtIDFdLiAqLwogCi0JICB0cmVlIG5hbWUyID0gZ2ltcGxlX2Fzc2lnbl9saHMg KHVzZV9zdG10KTsKLQkgIGlmIChUUkVFX0NPREUgKG5hbWUyKSAhPSBTU0FfTkFNRSkKLQkgICAg Y29udGludWU7CisgIGZvciAobG93ID0gc3RhcnRfaWR4LCBoaWdoID0gbjsgaGlnaCAhPSBsb3c7 ICkKKyAgICB7CisgICAgICB0cmVlIHQ7CisgICAgICBpbnQgY21wOworICAgICAgLyogTm90ZSB0 aGF0IGkgIT0gaGlnaCwgc28gd2UgbmV2ZXIgYXNrIGZvciBuLiAqLworICAgICAgc2l6ZV90IGkg PSAoaGlnaCArIGxvdykgLyAyOworICAgICAgdCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQs IGkpOwogCi0JICBlbnVtIHRyZWVfY29kZSBjb2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAo dXNlX3N0bXQpOwotCSAgdHJlZSBjc3Q7Ci0JICBpZiAoY29kZSA9PSBQTFVTX0VYUFIKLQkgICAg ICB8fCBjb2RlID09IE1JTlVTX0VYUFIpCi0JICAgIHsKLQkgICAgICBjc3QgPSBnaW1wbGVfYXNz aWduX3JoczIgKHVzZV9zdG10KTsKLQkgICAgICBpZiAoVFJFRV9DT0RFIChjc3QpICE9IElOVEVH RVJfQ1NUKQotCQljb250aW51ZTsKLQkgICAgICBjc3QgPSBpbnRfY29uc3RfYmlub3AgKGNvZGUs IHZhbCwgY3N0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoQ09OVkVSVF9FWFBSX0NPREVfUCAoY29k ZSkpCi0JICAgIHsKLQkgICAgICAvKiBGb3IgdHJ1bmNhdGluZyBjb252ZXJzaW9ucyB3ZSBjYW5u b3QgcmVjb3JkCi0JCSBhbiBpbmVxdWFsaXR5LiAgKi8KLQkgICAgICBpZiAoY29tcF9jb2RlID09 IE5FX0VYUFIKLQkJICAmJiAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAobmFtZTIpKQotCQkg ICAgICA8IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKG5hbWUpKSkpCi0JCWNvbnRpbnVlOwot CSAgICAgIGNzdCA9IGZvbGRfY29udmVydCAoVFJFRV9UWVBFIChuYW1lMiksIHZhbCk7Ci0JICAg IH0KLQkgIGVsc2UKLQkgICAgY29udGludWU7CisgICAgICAvKiBDYWNoZSB0aGUgcmVzdWx0IG9m IGNvbXBhcmluZyBDQVNFX0xPVyBhbmQgdmFsLiAgKi8KKyAgICAgIGNtcCA9IHRyZWVfaW50X2Nz dF9jb21wYXJlIChDQVNFX0xPVyAodCksIHZhbCk7CiAKLQkgIGlmIChUUkVFX09WRVJGTE9XX1Ag KGNzdCkpCi0JICAgIGNzdCA9IGRyb3BfdHJlZV9vdmVyZmxvdyAoY3N0KTsKLQkgIGFkZF9hc3Nl cnRfaW5mbyAoYXNzZXJ0cywgbmFtZTIsIG5hbWUyLCBjb21wX2NvZGUsIGNzdCk7Ci0JfQotICAg IH0KLSAKLSAgaWYgKFRSRUVfQ09ERV9DTEFTUyAoY29tcF9jb2RlKSA9PSB0Y2NfY29tcGFyaXNv bgotICAgICAgJiYgVFJFRV9DT0RFICh2YWwpID09IElOVEVHRVJfQ1NUKQotICAgIHsKLSAgICAg IGdpbXBsZSAqZGVmX3N0bXQgPSBTU0FfTkFNRV9ERUZfU1RNVCAobmFtZSk7Ci0gICAgICB0cmVl IG5hbWUyID0gTlVMTF9UUkVFLCBuYW1lc1syXSwgY3N0MiA9IE5VTExfVFJFRTsKLSAgICAgIHRy ZWUgdmFsMiA9IE5VTExfVFJFRTsKLSAgICAgIHVuc2lnbmVkIGludCBwcmVjID0gVFlQRV9QUkVD SVNJT04gKFRSRUVfVFlQRSAodmFsKSk7Ci0gICAgICB3aWRlX2ludCBtYXNrID0gd2k6Onplcm8g KHByZWMpOwotICAgICAgdW5zaWduZWQgaW50IG5wcmVjID0gcHJlYzsKLSAgICAgIGVudW0gdHJl ZV9jb2RlIHJoc19jb2RlID0gRVJST1JfTUFSSzsKLQotICAgICAgaWYgKGlzX2dpbXBsZV9hc3Np Z24gKGRlZl9zdG10KSkKLQlyaHNfY29kZSA9IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRlZl9z dG10KTsKLQotICAgICAgLyogSW4gdGhlIGNhc2Ugb2YgTkFNRSAhPSBDU1QxIHdoZXJlIE5BTUUg PSBBICstIENTVDIgd2UgY2FuCi0gICAgICAgICBhc3NlcnQgdGhhdCBBICE9IENTVDEgLSsgQ1NU Mi4gICovCi0gICAgICBpZiAoKGNvbXBfY29kZSA9PSBFUV9FWFBSIHx8IGNvbXBfY29kZSA9PSBO RV9FWFBSKQotCSAgJiYgKHJoc19jb2RlID09IFBMVVNfRVhQUiB8fCByaHNfY29kZSA9PSBNSU5V U19FWFBSKSkKKyAgICAgIGlmIChjbXAgPT0gMCkKIAl7Ci0JICB0cmVlIG9wMCA9IGdpbXBsZV9h c3NpZ25fcmhzMSAoZGVmX3N0bXQpOwotCSAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczIg KGRlZl9zdG10KTsKLQkgIGlmIChUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUKLQkgICAgICAm JiBUUkVFX0NPREUgKG9wMSkgPT0gSU5URUdFUl9DU1QpCi0JICAgIHsKLQkgICAgICBlbnVtIHRy ZWVfY29kZSByZXZlcnNlX29wID0gKHJoc19jb2RlID09IFBMVVNfRVhQUgotCQkJCQkgICA/IE1J TlVTX0VYUFIgOiBQTFVTX0VYUFIpOwotCSAgICAgIG9wMSA9IGludF9jb25zdF9iaW5vcCAocmV2 ZXJzZV9vcCwgdmFsLCBvcDEpOwotCSAgICAgIGlmIChUUkVFX09WRVJGTE9XIChvcDEpKQotCQlv cDEgPSBkcm9wX3RyZWVfb3ZlcmZsb3cgKG9wMSk7Ci0JICAgICAgYWRkX2Fzc2VydF9pbmZvIChh c3NlcnRzLCBvcDAsIG9wMCwgY29tcF9jb2RlLCBvcDEpOwotCSAgICB9CisJICAvKiBSYW5nZXMg Y2Fubm90IGJlIGVtcHR5LiAqLworCSAgKmlkeCA9IGk7CisJICByZXR1cm4gdHJ1ZTsKIAl9Ci0K LSAgICAgIC8qIEFkZCBhc3NlcnRzIGZvciBOQU1FIGNtcCBDU1QgYW5kIE5BTUUgYmVpbmcgZGVm aW5lZAotCSBhcyBOQU1FID0gKGludCkgTkFNRTIuICAqLwotICAgICAgaWYgKCFUWVBFX1VOU0lH TkVEIChUUkVFX1RZUEUgKHZhbCkpCi0JICAmJiAoY29tcF9jb2RlID09IExFX0VYUFIgfHwgY29t cF9jb2RlID09IExUX0VYUFIKLQkgICAgICB8fCBjb21wX2NvZGUgPT0gR1RfRVhQUiB8fCBjb21w X2NvZGUgPT0gR0VfRVhQUikKLQkgICYmIGdpbXBsZV9hc3NpZ25fY2FzdF9wIChkZWZfc3RtdCkp CisgICAgICBlbHNlIGlmIChjbXAgPiAwKQorCWhpZ2ggPSBpOworICAgICAgZWxzZQogCXsKLQkg IG5hbWUyID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0JICBpZiAoQ09OVkVSVF9F WFBSX0NPREVfUCAocmhzX2NvZGUpCi0JICAgICAgJiYgVFJFRV9DT0RFIChuYW1lMikgPT0gU1NB X05BTUUKLQkgICAgICAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAobmFtZTIpKQotCSAg ICAgICYmIFRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAobmFtZTIpKQotCSAgICAgICYmIHByZWMg PT0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAobmFtZTIpKQotCSAgICAgICYmIChjb21wX2Nv ZGUgPT0gTEVfRVhQUiB8fCBjb21wX2NvZGUgPT0gR1RfRVhQUgotCQkgIHx8ICF0cmVlX2ludF9j c3RfZXF1YWwgKHZhbCwKLQkJCQkJICBUWVBFX01JTl9WQUxVRSAoVFJFRV9UWVBFICh2YWwpKSkp KQorCSAgbG93ID0gaSArIDE7CisJICBpZiAoQ0FTRV9ISUdIICh0KSAhPSBOVUxMCisJICAgICAg JiYgdHJlZV9pbnRfY3N0X2NvbXBhcmUgKENBU0VfSElHSCAodCksIHZhbCkgPj0gMCkKIAkgICAg ewotCSAgICAgIHRyZWUgdG1wLCBjc3Q7Ci0JICAgICAgZW51bSB0cmVlX2NvZGUgbmV3X2NvbXBf Y29kZSA9IGNvbXBfY29kZTsKLQotCSAgICAgIGNzdCA9IGZvbGRfY29udmVydCAoVFJFRV9UWVBF IChuYW1lMiksCi0JCQkJICBUWVBFX01JTl9WQUxVRSAoVFJFRV9UWVBFICh2YWwpKSk7Ci0JICAg ICAgLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHJhbmdlIHRlc3QuICAqLwotCSAgICAg IHRtcCA9IGJ1aWxkMiAoUExVU19FWFBSLCBUUkVFX1RZUEUgKG5hbWUyKSwgbmFtZTIsIGNzdCk7 Ci0JICAgICAgY3N0ID0gZm9sZF9idWlsZDIgKFBMVVNfRVhQUiwgVFJFRV9UWVBFIChuYW1lMiks IGNzdCwKLQkJCQkgZm9sZF9jb252ZXJ0IChUUkVFX1RZUEUgKG5hbWUyKSwgdmFsKSk7Ci0JICAg ICAgaWYgKGNvbXBfY29kZSA9PSBMVF9FWFBSIHx8IGNvbXBfY29kZSA9PSBHRV9FWFBSKQotCQl7 Ci0JCSAgbmV3X2NvbXBfY29kZSA9IGNvbXBfY29kZSA9PSBMVF9FWFBSID8gTEVfRVhQUiA6IEdU X0VYUFI7Ci0JCSAgY3N0ID0gZm9sZF9idWlsZDIgKE1JTlVTX0VYUFIsIFRSRUVfVFlQRSAobmFt ZTIpLCBjc3QsCi0JCQkJICAgICBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKG5hbWUyKSwgMSkp OwotCQl9Ci0JICAgICAgYWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBuYW1lMiwgdG1wLCBuZXdf Y29tcF9jb2RlLCBjc3QpOworCSAgICAgICppZHggPSBpOworCSAgICAgIHJldHVybiB0cnVlOwog CSAgICB9CiAJfQorICAgIH0KIAotICAgICAgLyogQWRkIGFzc2VydHMgZm9yIE5BTUUgY21wIENT VCBhbmQgTkFNRSBiZWluZyBkZWZpbmVkIGFzCi0JIE5BTUUgPSBOQU1FMiA+PiBDU1QyLgorICAq aWR4ID0gaGlnaDsKKyAgcmV0dXJuIGZhbHNlOworfQogCi0JIEV4dHJhY3QgQ1NUMiBmcm9tIHRo ZSByaWdodCBzaGlmdC4gICovCi0gICAgICBpZiAocmhzX2NvZGUgPT0gUlNISUZUX0VYUFIpCi0J ewotCSAgbmFtZTIgPSBnaW1wbGVfYXNzaWduX3JoczEgKGRlZl9zdG10KTsKLQkgIGNzdDIgPSBn aW1wbGVfYXNzaWduX3JoczIgKGRlZl9zdG10KTsKLQkgIGlmIChUUkVFX0NPREUgKG5hbWUyKSA9 PSBTU0FfTkFNRQotCSAgICAgICYmIHRyZWVfZml0c191aHdpX3AgKGNzdDIpCi0JICAgICAgJiYg SU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG5hbWUyKSkKLQkgICAgICAmJiBJTl9SQU5HRSAo dHJlZV90b191aHdpIChjc3QyKSwgMSwgcHJlYyAtIDEpCi0JICAgICAgJiYgdHlwZV9oYXNfbW9k ZV9wcmVjaXNpb25fcCAoVFJFRV9UWVBFICh2YWwpKSkKLQkgICAgewotCSAgICAgIG1hc2sgPSB3 aTo6bWFzayAodHJlZV90b191aHdpIChjc3QyKSwgZmFsc2UsIHByZWMpOwotCSAgICAgIHZhbDIg PSBmb2xkX2JpbmFyeSAoTFNISUZUX0VYUFIsIFRSRUVfVFlQRSAodmFsKSwgdmFsLCBjc3QyKTsK LQkgICAgfQotCX0KLSAgICAgIGlmICh2YWwyICE9IE5VTExfVFJFRQotCSAgJiYgVFJFRV9DT0RF ICh2YWwyKSA9PSBJTlRFR0VSX0NTVAotCSAgJiYgc2ltcGxlX2NzdF9lcXVhbCAoZm9sZF9idWls ZDIgKFJTSElGVF9FWFBSLAotCQkJCQkgICAgVFJFRV9UWVBFICh2YWwpLAotCQkJCQkgICAgdmFs MiwgY3N0MiksIHZhbCkpCi0JewotCSAgZW51bSB0cmVlX2NvZGUgbmV3X2NvbXBfY29kZSA9IGNv bXBfY29kZTsKLQkgIHRyZWUgdG1wLCBuZXdfdmFsOworLyogU2VhcmNoZXMgdGhlIGNhc2UgbGFi ZWwgdmVjdG9yIFZFQyBmb3IgdGhlIHJhbmdlIG9mIENBU0VfTEFCRUxzIHRoYXQgaXMgdXNlZAor ICAgZm9yIHZhbHVlcyBiZXR3ZWVuIE1JTiBhbmQgTUFYLiBUaGUgZmlyc3QgaW5kZXggaXMgcGxh Y2VkIGluIE1JTl9JRFguIFRoZQorICAgbGFzdCBpbmRleCBpcyBwbGFjZWQgaW4gTUFYX0lEWC4g SWYgdGhlIHJhbmdlIG9mIENBU0VfTEFCRUxzIGlzIGVtcHR5CisgICB0aGVuIE1BWF9JRFggPCBN SU5fSURYLgorICAgUmV0dXJucyB0cnVlIGlmIHRoZSBkZWZhdWx0IGxhYmVsIGlzIG5vdCBuZWVk ZWQuICovCiAKLQkgIHRtcCA9IG5hbWUyOwotCSAgaWYgKGNvbXBfY29kZSA9PSBFUV9FWFBSIHx8 IGNvbXBfY29kZSA9PSBORV9FWFBSKQotCSAgICB7Ci0JICAgICAgaWYgKCFUWVBFX1VOU0lHTkVE IChUUkVFX1RZUEUgKHZhbCkpKQotCQl7Ci0JCSAgdHJlZSB0eXBlID0gYnVpbGRfbm9uc3RhbmRh cmRfaW50ZWdlcl90eXBlIChwcmVjLCAxKTsKLQkJICB0bXAgPSBidWlsZDEgKE5PUF9FWFBSLCB0 eXBlLCBuYW1lMik7Ci0JCSAgdmFsMiA9IGZvbGRfY29udmVydCAodHlwZSwgdmFsMik7Ci0JCX0K LQkgICAgICB0bXAgPSBmb2xkX2J1aWxkMiAoTUlOVVNfRVhQUiwgVFJFRV9UWVBFICh0bXApLCB0 bXAsIHZhbDIpOwotCSAgICAgIG5ld192YWwgPSB3aWRlX2ludF90b190cmVlIChUUkVFX1RZUEUg KHRtcCksIG1hc2spOwotCSAgICAgIG5ld19jb21wX2NvZGUgPSBjb21wX2NvZGUgPT0gRVFfRVhQ UiA/IExFX0VYUFIgOiBHVF9FWFBSOwotCSAgICB9Ci0JICBlbHNlIGlmIChjb21wX2NvZGUgPT0g TFRfRVhQUiB8fCBjb21wX2NvZGUgPT0gR0VfRVhQUikKLQkgICAgewotCSAgICAgIHdpZGVfaW50 IG1pbnZhbAotCQk9IHdpOjptaW5fdmFsdWUgKHByZWMsIFRZUEVfU0lHTiAoVFJFRV9UWVBFICh2 YWwpKSk7Ci0JICAgICAgbmV3X3ZhbCA9IHZhbDI7Ci0JICAgICAgaWYgKG1pbnZhbCA9PSB3aTo6 dG9fd2lkZSAobmV3X3ZhbCkpCi0JCW5ld192YWwgPSBOVUxMX1RSRUU7Ci0JICAgIH0KLQkgIGVs c2UKLQkgICAgewotCSAgICAgIHdpZGVfaW50IG1heHZhbAotCQk9IHdpOjptYXhfdmFsdWUgKHBy ZWMsIFRZUEVfU0lHTiAoVFJFRV9UWVBFICh2YWwpKSk7Ci0JICAgICAgbWFzayB8PSB3aTo6dG9f d2lkZSAodmFsMik7Ci0JICAgICAgaWYgKHdpOjplcV9wIChtYXNrLCBtYXh2YWwpKQotCQluZXdf dmFsID0gTlVMTF9UUkVFOwotCSAgICAgIGVsc2UKLQkJbmV3X3ZhbCA9IHdpZGVfaW50X3RvX3Ry ZWUgKFRSRUVfVFlQRSAodmFsMiksIG1hc2spOwotCSAgICB9Citib29sCitmaW5kX2Nhc2VfbGFi ZWxfcmFuZ2UgKGdzd2l0Y2ggKnN0bXQsIHRyZWUgbWluLCB0cmVlIG1heCwgc2l6ZV90ICptaW5f aWR4LAorCQkgICAgICAgc2l6ZV90ICptYXhfaWR4KQoreworICBzaXplX3QgaSwgajsKKyAgYm9v bCBtaW5fdGFrZV9kZWZhdWx0ID0gIWZpbmRfY2FzZV9sYWJlbF9pbmRleCAoc3RtdCwgMSwgbWlu LCAmaSk7CisgIGJvb2wgbWF4X3Rha2VfZGVmYXVsdCA9ICFmaW5kX2Nhc2VfbGFiZWxfaW5kZXgg KHN0bXQsIGksIG1heCwgJmopOwogCi0JICBpZiAobmV3X3ZhbCkKLQkgICAgYWRkX2Fzc2VydF9p bmZvIChhc3NlcnRzLCBuYW1lMiwgdG1wLCBuZXdfY29tcF9jb2RlLCBuZXdfdmFsKTsKLQl9Cisg IGlmIChpID09IGoKKyAgICAgICYmIG1pbl90YWtlX2RlZmF1bHQKKyAgICAgICYmIG1heF90YWtl X2RlZmF1bHQpCisgICAgeworICAgICAgLyogT25seSB0aGUgZGVmYXVsdCBjYXNlIGxhYmVsIHJl YWNoZWQuCisgICAgICAgICBSZXR1cm4gYW4gZW1wdHkgcmFuZ2UuICovCisgICAgICAqbWluX2lk eCA9IDE7CisgICAgICAqbWF4X2lkeCA9IDA7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor ICBlbHNlCisgICAgeworICAgICAgYm9vbCB0YWtlX2RlZmF1bHQgPSBtaW5fdGFrZV9kZWZhdWx0 IHx8IG1heF90YWtlX2RlZmF1bHQ7CisgICAgICB0cmVlIGxvdywgaGlnaDsKKyAgICAgIHNpemVf dCBrOwogCi0gICAgICAvKiBJZiB3ZSBoYXZlIGEgY29udmVyc2lvbiB0aGF0IGRvZXNuJ3QgY2hh bmdlIHRoZSB2YWx1ZSBvZiB0aGUgc291cmNlCi0gICAgICAgICBzaW1wbHkgcmVnaXN0ZXIgdGhl IHNhbWUgYXNzZXJ0IGZvciBpdC4gICovCi0gICAgICBpZiAoQ09OVkVSVF9FWFBSX0NPREVfUCAo cmhzX2NvZGUpKQotCXsKLQkgIHZhbHVlX3JhbmdlIHZyOwotCSAgdHJlZSByaHMxID0gZ2ltcGxl X2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0JICBpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZ UEUgKHJoczEpKQotCSAgICAgICYmIFRSRUVfQ09ERSAocmhzMSkgPT0gU1NBX05BTUUKLQkgICAg ICAvKiBNYWtlIHN1cmUgdGhlIHJlbGF0aW9uIHByZXNlcnZlcyB0aGUgdXBwZXIvbG93ZXIgYm91 bmRhcnkgb2YKLQkgICAgICAgICB0aGUgcmFuZ2UgY29uc2VydmF0aXZlbHkuICAqLwotCSAgICAg ICYmIChjb21wX2NvZGUgPT0gTkVfRVhQUgotCQkgIHx8IGNvbXBfY29kZSA9PSBFUV9FWFBSCi0J CSAgfHwgKFRZUEVfU0lHTiAoVFJFRV9UWVBFIChuYW1lKSkKLQkJICAgICAgPT0gVFlQRV9TSUdO IChUUkVFX1RZUEUgKHJoczEpKSkKLQkJICB8fCAoKGNvbXBfY29kZSA9PSBMRV9FWFBSCi0JCSAg ICAgICB8fCBjb21wX2NvZGUgPT0gTFRfRVhQUikKLQkJICAgICAgJiYgIVRZUEVfVU5TSUdORUQg KFRSRUVfVFlQRSAocmhzMSkpKQotCQkgIHx8ICgoY29tcF9jb2RlID09IEdFX0VYUFIKLQkJICAg ICAgIHx8IGNvbXBfY29kZSA9PSBHVF9FWFBSKQotCQkgICAgICAmJiBUWVBFX1VOU0lHTkVEIChU UkVFX1RZUEUgKHJoczEpKSkpCi0JICAgICAgLyogQW5kIHRoZSBjb252ZXJzaW9uIGRvZXMgbm90 IGFsdGVyIHRoZSB2YWx1ZSB3ZSBjb21wYXJlCi0JICAgICAgICAgYWdhaW5zdCBhbmQgYWxsIHZh bHVlcyBpbiByaHMxIGNhbiBiZSByZXByZXNlbnRlZCBpbgotCQkgdGhlIGNvbnZlcnRlZCB0byB0 eXBlLiAgKi8KLQkgICAgICAmJiBpbnRfZml0c190eXBlX3AgKHZhbCwgVFJFRV9UWVBFIChyaHMx KSkKLQkgICAgICAmJiAoKFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKG5hbWUpKQotCQkgICA+ IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKHJoczEpKSkKLQkJICB8fCAoKGdldF9yYW5nZV9x dWVyeSAoY2Z1biktPnJhbmdlX29mX2V4cHIgKHZyLCByaHMxKQotCQkgICAgICAgJiYgdnIua2lu ZCAoKSA9PSBWUl9SQU5HRSkKLQkJICAgICAgJiYgd2k6OmZpdHNfdG9fdHJlZV9wCi0JCQkgICAo d2lkZXN0X2ludDo6ZnJvbSAodnIubG93ZXJfYm91bmQgKCksCi0JCQkJCSAgICAgIFRZUEVfU0lH TiAoVFJFRV9UWVBFIChyaHMxKSkpLAotCQkJICAgIFRSRUVfVFlQRSAobmFtZSkpCi0JCSAgICAg ICYmIHdpOjpmaXRzX3RvX3RyZWVfcAotCQkJICAgKHdpZGVzdF9pbnQ6OmZyb20gKHZyLnVwcGVy X2JvdW5kICgpLAotCQkJCQkgICAgICBUWVBFX1NJR04gKFRSRUVfVFlQRSAocmhzMSkpKSwKLQkJ CSAgICBUUkVFX1RZUEUgKG5hbWUpKSkpKQotCSAgICBhZGRfYXNzZXJ0X2luZm8gKGFzc2VydHMs IHJoczEsIHJoczEsCi0JCSAJICAgICBjb21wX2NvZGUsIGZvbGRfY29udmVydCAoVFJFRV9UWVBF IChyaHMxKSwgdmFsKSk7Ci0JfQorICAgICAgaWYgKG1heF90YWtlX2RlZmF1bHQpCisJai0tOwog Ci0gICAgICAvKiBBZGQgYXNzZXJ0cyBmb3IgTkFNRSBjbXAgQ1NUIGFuZCBOQU1FIGJlaW5nIGRl ZmluZWQgYXMKLQkgTkFNRSA9IE5BTUUyICYgQ1NUMi4KLQotCSBFeHRyYWN0IENTVDIgZnJvbSB0 aGUgYW5kLgotCi0JIEFsc28gaGFuZGxlCi0JIE5BTUUgPSAodW5zaWduZWQpIE5BTUUyOwotCSBj YXN0cyB3aGVyZSBOQU1FJ3MgdHlwZSBpcyB1bnNpZ25lZCBhbmQgaGFzIHNtYWxsZXIgcHJlY2lz aW9uCi0JIHRoYW4gTkFNRTIncyB0eXBlIGFzIGlmIGl0IHdhcyBOQU1FID0gTkFNRTIgJiBNQVNL LiAgKi8KLSAgICAgIG5hbWVzWzBdID0gTlVMTF9UUkVFOwotICAgICAgbmFtZXNbMV0gPSBOVUxM X1RSRUU7Ci0gICAgICBjc3QyID0gTlVMTF9UUkVFOwotICAgICAgaWYgKHJoc19jb2RlID09IEJJ VF9BTkRfRVhQUgotCSAgfHwgKENPTlZFUlRfRVhQUl9DT0RFX1AgKHJoc19jb2RlKQotCSAgICAg ICYmIElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFICh2YWwpKQotCSAgICAgICYmIFRZUEVfVU5T SUdORUQgKFRSRUVfVFlQRSAodmFsKSkKLQkgICAgICAmJiBUWVBFX1BSRUNJU0lPTiAoVFJFRV9U WVBFIChnaW1wbGVfYXNzaWduX3JoczEgKGRlZl9zdG10KSkpCi0JCSA+IHByZWMpKQorICAgICAg LyogSWYgdGhlIGNhc2UgbGFiZWwgcmFuZ2UgaXMgY29udGludW91cywgd2UgZG8gbm90IG5lZWQK KwkgdGhlIGRlZmF1bHQgY2FzZSBsYWJlbC4gIFZlcmlmeSB0aGF0LiAgKi8KKyAgICAgIGhpZ2gg PSBDQVNFX0xPVyAoZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaSkpOworICAgICAgaWYgKENB U0VfSElHSCAoZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaSkpKQorCWhpZ2ggPSBDQVNFX0hJ R0ggKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGkpKTsKKyAgICAgIGZvciAoayA9IGkgKyAx OyBrIDw9IGo7ICsraykKIAl7Ci0JICBuYW1lMiA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0 bXQpOwotCSAgaWYgKHJoc19jb2RlID09IEJJVF9BTkRfRVhQUikKLQkgICAgY3N0MiA9IGdpbXBs ZV9hc3NpZ25fcmhzMiAoZGVmX3N0bXQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY3N0MiA9 IFRZUEVfTUFYX1ZBTFVFIChUUkVFX1RZUEUgKHZhbCkpOwotCSAgICAgIG5wcmVjID0gVFlQRV9Q UkVDSVNJT04gKFRSRUVfVFlQRSAobmFtZTIpKTsKLQkgICAgfQotCSAgaWYgKFRSRUVfQ09ERSAo bmFtZTIpID09IFNTQV9OQU1FCi0JICAgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUg KG5hbWUyKSkKLQkgICAgICAmJiBUUkVFX0NPREUgKGNzdDIpID09IElOVEVHRVJfQ1NUCi0JICAg ICAgJiYgIWludGVnZXJfemVyb3AgKGNzdDIpCi0JICAgICAgJiYgKG5wcmVjID4gMQotCQkgIHx8 IFRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAodmFsKSkpKQorCSAgbG93ID0gQ0FTRV9MT1cgKGdp bXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGspKTsKKwkgIGlmICghaW50ZWdlcl9vbmVwIChpbnRf Y29uc3RfYmlub3AgKE1JTlVTX0VYUFIsIGxvdywgaGlnaCkpKQogCSAgICB7Ci0JICAgICAgZ2lt cGxlICpkZWZfc3RtdDIgPSBTU0FfTkFNRV9ERUZfU1RNVCAobmFtZTIpOwotCSAgICAgIGlmIChn aW1wbGVfYXNzaWduX2Nhc3RfcCAoZGVmX3N0bXQyKSkKLQkJewotCQkgIG5hbWVzWzFdID0gZ2lt cGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdDIpOwotCQkgIGlmICghQ09OVkVSVF9FWFBSX0NPREVf UCAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoZGVmX3N0bXQyKSkKLQkJICAgICAgfHwgVFJFRV9D T0RFIChuYW1lc1sxXSkgIT0gU1NBX05BTUUKLQkJICAgICAgfHwgIUlOVEVHUkFMX1RZUEVfUCAo VFJFRV9UWVBFIChuYW1lc1sxXSkpCi0JCSAgICAgIHx8IChUWVBFX1BSRUNJU0lPTiAoVFJFRV9U WVBFIChuYW1lMikpCi0JCQkgICE9IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKG5hbWVzWzFd KSkpKQotCQkgICAgbmFtZXNbMV0gPSBOVUxMX1RSRUU7Ci0JCX0KLQkgICAgICBuYW1lc1swXSA9 IG5hbWUyOworCSAgICAgIHRha2VfZGVmYXVsdCA9IHRydWU7CisJICAgICAgYnJlYWs7CiAJICAg IH0KKwkgIGhpZ2ggPSBsb3c7CisJICBpZiAoQ0FTRV9ISUdIIChnaW1wbGVfc3dpdGNoX2xhYmVs IChzdG10LCBrKSkpCisJICAgIGhpZ2ggPSBDQVNFX0hJR0ggKGdpbXBsZV9zd2l0Y2hfbGFiZWwg KHN0bXQsIGspKTsKIAl9Ci0gICAgICBpZiAobmFtZXNbMF0gfHwgbmFtZXNbMV0pCi0JewotCSAg d2lkZV9pbnQgbWludiwgbWF4diwgdmFsdiwgY3N0MnY7Ci0JICB3aWRlX2ludCB0ZW0sIHNnbmJp dDsKLQkgIGJvb2wgdmFsaWRfcCA9IGZhbHNlLCB2YWxuLCBjc3QybjsKLQkgIGVudW0gdHJlZV9j b2RlIGNjb2RlID0gY29tcF9jb2RlOwotCi0JICB2YWx2ID0gd2lkZV9pbnQ6OmZyb20gKHdpOjp0 b193aWRlICh2YWwpLCBucHJlYywgVU5TSUdORUQpOwotCSAgY3N0MnYgPSB3aWRlX2ludDo6ZnJv bSAod2k6OnRvX3dpZGUgKGNzdDIpLCBucHJlYywgVU5TSUdORUQpOwotCSAgdmFsbiA9IHdpOjpu ZWdfcCAodmFsdiwgVFlQRV9TSUdOIChUUkVFX1RZUEUgKHZhbCkpKTsKLQkgIGNzdDJuID0gd2k6 Om5lZ19wIChjc3QydiwgVFlQRV9TSUdOIChUUkVFX1RZUEUgKHZhbCkpKTsKLQkgIC8qIElmIENT VDIgZG9lc24ndCBoYXZlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldCwKLQkgICAgIGJ1dCBWQUwg aXMgbmVnYXRpdmUsIHdlIGhhdmUgY29tcGFyaXNvbiBsaWtlCi0JICAgICBpZiAoKHggJiAweDEy MykgPiAtNCkgKGFsd2F5cyB0cnVlKS4gIEp1c3QgZ2l2ZSB1cC4gICovCi0JICBpZiAoIWNzdDJu ICYmIHZhbG4pCi0JICAgIGNjb2RlID0gRVJST1JfTUFSSzsKLQkgIGlmIChjc3QybikKLQkgICAg c2duYml0ID0gd2k6OnNldF9iaXRfaW5femVybyAobnByZWMgLSAxLCBucHJlYyk7Ci0JICBlbHNl Ci0JICAgIHNnbmJpdCA9IHdpOjp6ZXJvIChucHJlYyk7Ci0JICBtaW52ID0gdmFsdiAmIGNzdDJ2 OwotCSAgc3dpdGNoIChjY29kZSkKLQkgICAgewotCSAgICBjYXNlIEVRX0VYUFI6Ci0JICAgICAg LyogTWluaW11bSB1bnNpZ25lZCB2YWx1ZSBmb3IgZXF1YWxpdHkgaXMgVkFMICYgQ1NUMgotCQkg KHNob3VsZCBiZSBlcXVhbCB0byBWQUwsIG90aGVyd2lzZSB3ZSBwcm9iYWJseSBzaG91bGQKLQkJ IGhhdmUgZm9sZGVkIHRoZSBjb21wYXJpc29uIGludG8gZmFsc2UpIGFuZAotCQkgbWF4aW11bSB1 bnNpZ25lZCB2YWx1ZSBpcyBWQUwgfCB+Q1NUMi4gICovCi0JICAgICAgbWF4diA9IHZhbHYgfCB+ Y3N0MnY7Ci0JICAgICAgdmFsaWRfcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7CiAKLQkgICAgY2Fz ZSBORV9FWFBSOgotCSAgICAgIHRlbSA9IHZhbHYgfCB+Y3N0MnY7Ci0JICAgICAgLyogSWYgVkFM IGlzIDAsIGhhbmRsZSAoWCAmIENTVDIpICE9IDAgYXMgKFggJiBDU1QyKSA+IDBVLiAgKi8KLQkg ICAgICBpZiAodmFsdiA9PSAwKQotCQl7Ci0JCSAgY3N0Mm4gPSBmYWxzZTsKLQkJICBzZ25iaXQg PSB3aTo6emVybyAobnByZWMpOwotCQkgIGdvdG8gZ3RfZXhwcjsKLQkJfQotCSAgICAgIC8qIElm IChWQUwgfCB+Q1NUMikgaXMgYWxsIG9uZXMsIGhhbmRsZSBpdCBhcwotCQkgKFggJiBDU1QyKSA8 IFZBTC4gICovCi0JICAgICAgaWYgKHRlbSA9PSAtMSkKLQkJewotCQkgIGNzdDJuID0gZmFsc2U7 Ci0JCSAgdmFsbiA9IGZhbHNlOwotCQkgIHNnbmJpdCA9IHdpOjp6ZXJvIChucHJlYyk7Ci0JCSAg Z290byBsdF9leHByOwotCQl9Ci0JICAgICAgaWYgKCFjc3QybiAmJiB3aTo6bmVnX3AgKGNzdDJ2 KSkKLQkJc2duYml0ID0gd2k6OnNldF9iaXRfaW5femVybyAobnByZWMgLSAxLCBucHJlYyk7Ci0J ICAgICAgaWYgKHNnbmJpdCAhPSAwKQotCQl7Ci0JCSAgaWYgKHZhbHYgPT0gc2duYml0KQotCQkg ICAgewotCQkgICAgICBjc3QybiA9IHRydWU7Ci0JCSAgICAgIHZhbG4gPSB0cnVlOwotCQkgICAg ICBnb3RvIGd0X2V4cHI7Ci0JCSAgICB9Ci0JCSAgaWYgKHRlbSA9PSB3aTo6bWFzayAobnByZWMg LSAxLCBmYWxzZSwgbnByZWMpKQotCQkgICAgewotCQkgICAgICBjc3QybiA9IHRydWU7Ci0JCSAg ICAgIGdvdG8gbHRfZXhwcjsKLQkJICAgIH0KLQkJICBpZiAoIWNzdDJuKQotCQkgICAgc2duYml0 ID0gd2k6Onplcm8gKG5wcmVjKTsKLQkJfQotCSAgICAgIGJyZWFrOworICAgICAgKm1pbl9pZHgg PSBpOworICAgICAgKm1heF9pZHggPSBqOworICAgICAgcmV0dXJuICF0YWtlX2RlZmF1bHQ7Cisg ICAgfQorfQogCi0JICAgIGNhc2UgR0VfRVhQUjoKLQkgICAgICAvKiBNaW5pbXVtIHVuc2lnbmVk IHZhbHVlIGZvciA+PSBpZiAoVkFMICYgQ1NUMikgPT0gVkFMCi0JCSBpcyBWQUwgYW5kIG1heGlt dW0gdW5zaWduZWQgdmFsdWUgaXMgfjAuICBGb3Igc2lnbmVkCi0JCSBjb21wYXJpc29uLCBpZiBD U1QyIGRvZXNuJ3QgaGF2ZSBtb3N0IHNpZ25pZmljYW50IGJpdAotCQkgc2V0LCBoYW5kbGUgaXQg c2ltaWxhcmx5LiAgSWYgQ1NUMiBoYXMgTVNCIHNldCwKLQkJIHRoZSBtaW5pbXVtIGlzIHRoZSBz YW1lLCBhbmQgbWF4aW11bSBpcyB+MFUvMi4gICovCi0JICAgICAgaWYgKG1pbnYgIT0gdmFsdikK LQkJewotCQkgIC8qIElmIChWQUwgJiBDU1QyKSAhPSBWQUwsIFggJiBDU1QyIGNhbid0IGJlIGVx dWFsIHRvCi0JCSAgICAgVkFMLiAgKi8KLQkJICBtaW52ID0gbWFza2VkX2luY3JlbWVudCAodmFs diwgY3N0MnYsIHNnbmJpdCwgbnByZWMpOwotCQkgIGlmIChtaW52ID09IHZhbHYpCi0JCSAgICBi cmVhazsKLQkJfQotCSAgICAgIG1heHYgPSB3aTo6bWFzayAobnByZWMgLSAoY3N0Mm4gPyAxIDog MCksIGZhbHNlLCBucHJlYyk7Ci0JICAgICAgdmFsaWRfcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7 Ci0KLQkgICAgY2FzZSBHVF9FWFBSOgotCSAgICBndF9leHByOgotCSAgICAgIC8qIEZpbmQgb3V0 IHNtYWxsZXN0IE1JTlYgd2hlcmUgTUlOViA+IFZBTAotCQkgJiYgKE1JTlYgJiBDU1QyKSA9PSBN SU5WLCBpZiBhbnkuICBJZiBWQUwgaXMgc2lnbmVkIGFuZAotCQkgQ1NUMiBoYXMgTVNCIHNldCwg Y29tcHV0ZSBpdCBiaWFzZWQgYnkgMSA8PCAobnByZWMgLSAxKS4gICovCi0JICAgICAgbWludiA9 IG1hc2tlZF9pbmNyZW1lbnQgKHZhbHYsIGNzdDJ2LCBzZ25iaXQsIG5wcmVjKTsKLQkgICAgICBp ZiAobWludiA9PSB2YWx2KQotCQlicmVhazsKLQkgICAgICBtYXh2ID0gd2k6Om1hc2sgKG5wcmVj IC0gKGNzdDJuID8gMSA6IDApLCBmYWxzZSwgbnByZWMpOwotCSAgICAgIHZhbGlkX3AgPSB0cnVl OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTEVfRVhQUjoKLQkgICAgICAvKiBNaW5pbXVt IHVuc2lnbmVkIHZhbHVlIGZvciA8PSBpcyAwIGFuZCBtYXhpbXVtCi0JCSB1bnNpZ25lZCB2YWx1 ZSBpcyBWQUwgfCB+Q1NUMiBpZiAoVkFMICYgQ1NUMikgPT0gVkFMLgotCQkgT3RoZXJ3aXNlLCBm aW5kIHNtYWxsZXN0IFZBTDIgd2hlcmUgVkFMMiA+IFZBTAotCQkgJiYgKFZBTDIgJiBDU1QyKSA9 PSBWQUwyIGFuZCB1c2UgKFZBTDIgLSAxKSB8IH5DU1QyCi0JCSBhcyBtYXhpbXVtLgotCQkgRm9y IHNpZ25lZCBjb21wYXJpc29uLCBpZiBDU1QyIGRvZXNuJ3QgaGF2ZSBtb3N0Ci0JCSBzaWduaWZp Y2FudCBiaXQgc2V0LCBoYW5kbGUgaXQgc2ltaWxhcmx5LiAgSWYgQ1NUMiBoYXMKLQkJIE1TQiBz ZXQsIHRoZSBtYXhpbXVtIGlzIHRoZSBzYW1lIGFuZCBtaW5pbXVtIGlzIElOVF9NSU4uICAqLwot CSAgICAgIGlmIChtaW52ID09IHZhbHYpCi0JCW1heHYgPSB2YWx2OwotCSAgICAgIGVsc2UKLQkJ ewotCQkgIG1heHYgPSBtYXNrZWRfaW5jcmVtZW50ICh2YWx2LCBjc3Qydiwgc2duYml0LCBucHJl Yyk7Ci0JCSAgaWYgKG1heHYgPT0gdmFsdikKLQkJICAgIGJyZWFrOwotCQkgIG1heHYgLT0gMTsK LQkJfQotCSAgICAgIG1heHYgfD0gfmNzdDJ2OwotCSAgICAgIG1pbnYgPSBzZ25iaXQ7Ci0JICAg ICAgdmFsaWRfcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBMVF9FWFBSOgot CSAgICBsdF9leHByOgotCSAgICAgIC8qIE1pbmltdW0gdW5zaWduZWQgdmFsdWUgZm9yIDwgaXMg MCBhbmQgbWF4aW11bQotCQkgdW5zaWduZWQgdmFsdWUgaXMgKFZBTC0xKSB8IH5DU1QyIGlmIChW QUwgJiBDU1QyKSA9PSBWQUwuCi0JCSBPdGhlcndpc2UsIGZpbmQgc21hbGxlc3QgVkFMMiB3aGVy ZSBWQUwyID4gVkFMCi0JCSAmJiAoVkFMMiAmIENTVDIpID09IFZBTDIgYW5kIHVzZSAoVkFMMiAt IDEpIHwgfkNTVDIKLQkJIGFzIG1heGltdW0uCi0JCSBGb3Igc2lnbmVkIGNvbXBhcmlzb24sIGlm IENTVDIgZG9lc24ndCBoYXZlIG1vc3QKLQkJIHNpZ25pZmljYW50IGJpdCBzZXQsIGhhbmRsZSBp dCBzaW1pbGFybHkuICBJZiBDU1QyIGhhcwotCQkgTVNCIHNldCwgdGhlIG1heGltdW0gaXMgdGhl IHNhbWUgYW5kIG1pbmltdW0gaXMgSU5UX01JTi4gICovCi0JICAgICAgaWYgKG1pbnYgPT0gdmFs dikKLQkJewotCQkgIGlmICh2YWx2ID09IHNnbmJpdCkKLQkJICAgIGJyZWFrOwotCQkgIG1heHYg PSB2YWx2OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbWF4diA9IG1hc2tlZF9pbmNyZW1l bnQgKHZhbHYsIGNzdDJ2LCBzZ25iaXQsIG5wcmVjKTsKLQkJICBpZiAobWF4diA9PSB2YWx2KQot CQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgICBtYXh2IC09IDE7Ci0JICAgICAgbWF4diB8PSB+Y3N0 MnY7Ci0JICAgICAgbWludiA9IHNnbmJpdDsKLQkgICAgICB2YWxpZF9wID0gdHJ1ZTsKLQkgICAg ICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAo dmFsaWRfcAotCSAgICAgICYmIChtYXh2IC0gbWludikgIT0gLTEpCi0JICAgIHsKLQkgICAgICB0 cmVlIHRtcCwgbmV3X3ZhbCwgdHlwZTsKLQkgICAgICBpbnQgaTsKLQotCSAgICAgIGZvciAoaSA9 IDA7IGkgPCAyOyBpKyspCi0JCWlmIChuYW1lc1tpXSkKLQkJICB7Ci0JCSAgICB3aWRlX2ludCBt YXh2MiA9IG1heHY7Ci0JCSAgICB0bXAgPSBuYW1lc1tpXTsKLQkJICAgIHR5cGUgPSBUUkVFX1RZ UEUgKG5hbWVzW2ldKTsKLQkJICAgIGlmICghVFlQRV9VTlNJR05FRCAodHlwZSkpCi0JCSAgICAg IHsKLQkJCXR5cGUgPSBidWlsZF9ub25zdGFuZGFyZF9pbnRlZ2VyX3R5cGUgKG5wcmVjLCAxKTsK LQkJCXRtcCA9IGJ1aWxkMSAoTk9QX0VYUFIsIHR5cGUsIG5hbWVzW2ldKTsKLQkJICAgICAgfQot CQkgICAgaWYgKG1pbnYgIT0gMCkKLQkJICAgICAgewotCQkJdG1wID0gYnVpbGQyIChQTFVTX0VY UFIsIHR5cGUsIHRtcCwKLQkJCQkgICAgICB3aWRlX2ludF90b190cmVlICh0eXBlLCAtbWludikp OwotCQkJbWF4djIgPSBtYXh2IC0gbWludjsKLQkJICAgICAgfQotCQkgICAgbmV3X3ZhbCA9IHdp ZGVfaW50X3RvX3RyZWUgKHR5cGUsIG1heHYyKTsKLQkJICAgIGFkZF9hc3NlcnRfaW5mbyAoYXNz ZXJ0cywgbmFtZXNbaV0sIHRtcCwgTEVfRVhQUiwgbmV3X3ZhbCk7Ci0JCSAgfQotCSAgICB9Ci0J fQotICAgIH0KLX0KLQotLyogT1AgaXMgYW4gb3BlcmFuZCBvZiBhIHRydXRoIHZhbHVlIGV4cHJl c3Npb24gd2hpY2ggaXMga25vd24gdG8gaGF2ZQotICAgYSBwYXJ0aWN1bGFyIHZhbHVlLiAgUmVn aXN0ZXIgYW55IGFzc2VydHMgZm9yIE9QIGFuZCBmb3IgYW55Ci0gICBvcGVyYW5kcyBpbiBPUCdz IGRlZmluaW5nIHN0YXRlbWVudC4KLQotICAgSWYgQ09ERSBpcyBFUV9FWFBSLCB0aGVuIHdlIHdh bnQgdG8gcmVnaXN0ZXIgT1AgaXMgemVybyAoZmFsc2UpLAotICAgaWYgQ09ERSBpcyBORV9FWFBS LCB0aGVuIHdlIHdhbnQgdG8gcmVnaXN0ZXIgT1AgaXMgbm9uemVybyAodHJ1ZSkuICAgKi8KLQot c3RhdGljIHZvaWQKLXJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcl8xICh0cmVlIG9wLCBlbnVtIHRy ZWVfY29kZSBjb2RlLAotCQkJICAgIGVkZ2UgZSwgdmVjPGFzc2VydF9pbmZvPiAmYXNzZXJ0cykK LXsKLSAgZ2ltcGxlICpvcF9kZWY7Ci0gIHRyZWUgdmFsOwotICBlbnVtIHRyZWVfY29kZSByaHNf Y29kZTsKLQotICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgU1NBX05BTUVzLiAgKi8KLSAgaWYgKFRS RUVfQ09ERSAob3ApICE9IFNTQV9OQU1FKQotICAgIHJldHVybjsKLQotICAvKiBXZSBrbm93IHRo YXQgT1Agd2lsbCBoYXZlIGEgemVybyBvciBub256ZXJvIHZhbHVlLiAgKi8KLSAgdmFsID0gYnVp bGRfaW50X2NzdCAoVFJFRV9UWVBFIChvcCksIDApOwotICBhZGRfYXNzZXJ0X2luZm8gKGFzc2Vy dHMsIG9wLCBvcCwgY29kZSwgdmFsKTsKLQotICAvKiBOb3cgbG9vayBhdCBob3cgT1AgaXMgc2V0 LiAgSWYgaXQncyBzZXQgZnJvbSBhIGNvbXBhcmlzb24sCi0gICAgIGEgdHJ1dGggb3BlcmF0aW9u IG9yIHNvbWUgYml0IG9wZXJhdGlvbnMsIHRoZW4gd2UgbWF5IGJlIGFibGUKLSAgICAgdG8gcmVn aXN0ZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhbmRzIG9mIHRoYXQgYXNzaWdubWVudC4g ICovCi0gIG9wX2RlZiA9IFNTQV9OQU1FX0RFRl9TVE1UIChvcCk7Ci0gIGlmIChnaW1wbGVfY29k ZSAob3BfZGVmKSAhPSBHSU1QTEVfQVNTSUdOKQotICAgIHJldHVybjsKLQotICByaHNfY29kZSA9 IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKG9wX2RlZik7Ci0KLSAgaWYgKFRSRUVfQ09ERV9DTEFT UyAocmhzX2NvZGUpID09IHRjY19jb21wYXJpc29uKQotICAgIHsKLSAgICAgIGJvb2wgaW52ZXJ0 ID0gKGNvZGUgPT0gRVFfRVhQUiA/IHRydWUgOiBmYWxzZSk7Ci0gICAgICB0cmVlIG9wMCA9IGdp bXBsZV9hc3NpZ25fcmhzMSAob3BfZGVmKTsKLSAgICAgIHRyZWUgb3AxID0gZ2ltcGxlX2Fzc2ln bl9yaHMyIChvcF9kZWYpOwotCi0gICAgICBpZiAoVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1F KQotICAgICAgICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMiAob3AwLCBlLCByaHNfY29kZSwg b3AwLCBvcDEsIGludmVydCwgYXNzZXJ0cyk7Ci0gICAgICBpZiAoVFJFRV9DT0RFIChvcDEpID09 IFNTQV9OQU1FKQotICAgICAgICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMiAob3AxLCBlLCBy aHNfY29kZSwgb3AwLCBvcDEsIGludmVydCwgYXNzZXJ0cyk7Ci0gICAgfQotICBlbHNlIGlmICgo Y29kZSA9PSBORV9FWFBSCi0JICAgICYmIGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKG9wX2RlZikg PT0gQklUX0FORF9FWFBSKQotCSAgIHx8IChjb2RlID09IEVRX0VYUFIKLQkgICAgICAgJiYgZ2lt cGxlX2Fzc2lnbl9yaHNfY29kZSAob3BfZGVmKSA9PSBCSVRfSU9SX0VYUFIpKQotICAgIHsKLSAg ICAgIC8qIFJlY3Vyc2Ugb24gZWFjaCBvcGVyYW5kLiAgKi8KLSAgICAgIHRyZWUgb3AwID0gZ2lt cGxlX2Fzc2lnbl9yaHMxIChvcF9kZWYpOwotICAgICAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWdu X3JoczIgKG9wX2RlZik7Ci0gICAgICBpZiAoVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FCi0J ICAmJiBoYXNfc2luZ2xlX3VzZSAob3AwKSkKLQlyZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMSAo b3AwLCBjb2RlLCBlLCBhc3NlcnRzKTsKLSAgICAgIGlmIChUUkVFX0NPREUgKG9wMSkgPT0gU1NB X05BTUUKLQkgICYmIGhhc19zaW5nbGVfdXNlIChvcDEpKQotCXJlZ2lzdGVyX2VkZ2VfYXNzZXJ0 X2Zvcl8xIChvcDEsIGNvZGUsIGUsIGFzc2VydHMpOwotICAgIH0KLSAgZWxzZSBpZiAoZ2ltcGxl X2Fzc2lnbl9yaHNfY29kZSAob3BfZGVmKSA9PSBCSVRfTk9UX0VYUFIKLQkgICAmJiBUWVBFX1BS RUNJU0lPTiAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAob3BfZGVmKSkpID09IDEpCi0g ICAgewotICAgICAgLyogUmVjdXJzZSwgZmxpcHBpbmcgQ09ERS4gICovCi0gICAgICBjb2RlID0g aW52ZXJ0X3RyZWVfY29tcGFyaXNvbiAoY29kZSwgZmFsc2UpOwotICAgICAgcmVnaXN0ZXJfZWRn ZV9hc3NlcnRfZm9yXzEgKGdpbXBsZV9hc3NpZ25fcmhzMSAob3BfZGVmKSwgY29kZSwgZSwgYXNz ZXJ0cyk7Ci0gICAgfQotICBlbHNlIGlmIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChvcF9kZWYp ID09IFNTQV9OQU1FKQotICAgIHsKLSAgICAgIC8qIFJlY3Vyc2UgdGhyb3VnaCB0aGUgY29weS4g ICovCi0gICAgICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMSAoZ2ltcGxlX2Fzc2lnbl9yaHMx IChvcF9kZWYpLCBjb2RlLCBlLCBhc3NlcnRzKTsKLSAgICB9Ci0gIGVsc2UgaWYgKENPTlZFUlRf RVhQUl9DT0RFX1AgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKG9wX2RlZikpKQotICAgIHsKLSAg ICAgIC8qIFJlY3Vyc2UgdGhyb3VnaCB0aGUgdHlwZSBjb252ZXJzaW9uLCB1bmxlc3MgaXQgaXMg YSBuYXJyb3dpbmcKLQkgY29udmVyc2lvbiBvciBjb252ZXJzaW9uIGZyb20gbm9uLWludGVncmFs IHR5cGUuICAqLwotICAgICAgdHJlZSByaHMgPSBnaW1wbGVfYXNzaWduX3JoczEgKG9wX2RlZik7 Ci0gICAgICBpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKHJocykpCi0JICAmJiAoVFlQ RV9QUkVDSVNJT04gKFRSRUVfVFlQRSAocmhzKSkKLQkgICAgICA8PSBUWVBFX1BSRUNJU0lPTiAo VFJFRV9UWVBFIChvcCkpKSkKLQlyZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMSAocmhzLCBjb2Rl LCBlLCBhc3NlcnRzKTsKLSAgICB9Ci19Ci0KLS8qIENoZWNrIGlmIGNvbXBhcmlzb24KLSAgICAg TkFNRSBDT05EX09QIElOVEVHRVJfQ1NUCi0gICBoYXMgYSBmb3JtIG9mCi0gICAgIChYICYgMTEu Li4xMDAuLjApIENPTkRfT1AgWFguLi5YMDAuLi4wCi0gICBTdWNoIGNvbXBhcmlzb24gY2FuIHlp ZWxkIGFzc2VydGlvbnMgbGlrZQotICAgICBYID49IFhYLi4uWDAwLi4uMAotICAgICBYIDw9IFhY Li4uWDExLi4uMQotICAgaW4gY2FzZSBvZiBDT05EX09QIGJlaW5nIEVRX0VYUFIgb3IKLSAgICAg WCA8IFhYLi4uWDAwLi4uMAotICAgICBYID4gWFguLi5YMTEuLi4xCi0gICBpbiBjYXNlIG9mIE5F X0VYUFIuICAqLwotCi1zdGF0aWMgYm9vbAotaXNfbWFza2VkX3JhbmdlX3Rlc3QgKHRyZWUgbmFt ZSwgdHJlZSB2YWx0LCBlbnVtIHRyZWVfY29kZSBjb25kX2NvZGUsCi0JCSAgICAgIHRyZWUgKm5l d19uYW1lLCB0cmVlICpsb3csIGVudW0gdHJlZV9jb2RlICpsb3dfY29kZSwKLQkJICAgICAgdHJl ZSAqaGlnaCwgZW51bSB0cmVlX2NvZGUgKmhpZ2hfY29kZSkKLXsKLSAgZ2ltcGxlICpkZWZfc3Rt dCA9IFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lKTsKLQotICBpZiAoIWlzX2dpbXBsZV9hc3NpZ24g KGRlZl9zdG10KQotICAgICAgfHwgZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoZGVmX3N0bXQpICE9 IEJJVF9BTkRfRVhQUikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdHJlZSB0ID0gZ2ltcGxlX2Fz c2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0gIHRyZWUgbWFza3QgPSBnaW1wbGVfYXNzaWduX3JoczIg KGRlZl9zdG10KTsKLSAgaWYgKFRSRUVfQ09ERSAodCkgIT0gU1NBX05BTUUgfHwgVFJFRV9DT0RF IChtYXNrdCkgIT0gSU5URUdFUl9DU1QpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHdpOjp0cmVl X3RvX3dpZGVfcmVmIG1hc2sgPSB3aTo6dG9fd2lkZSAobWFza3QpOwotICB3aWRlX2ludCBpbnZf bWFzayA9IH5tYXNrOwotICAvKiBNdXN0IGhhdmUgYmVlbiByZW1vdmVkIGJ5IG5vdyBzbyBkb24n dCBib3RoZXIgb3B0aW1pemluZy4gICovCi0gIGlmIChtYXNrID09IDAgfHwgaW52X21hc2sgPT0g MCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQXNzdW1lIFZBTFQgaXMgSU5URUdFUl9DU1Qu ICAqLwotICB3aTo6dHJlZV90b193aWRlX3JlZiB2YWwgPSB3aTo6dG9fd2lkZSAodmFsdCk7Ci0K LSAgaWYgKChpbnZfbWFzayAmIChpbnZfbWFzayArIDEpKSAhPSAwCi0gICAgICB8fCAodmFsICYg bWFzaykgIT0gdmFsKQotICAgIHJldHVybiBmYWxzZTsKLQotICBib29sIGlzX3JhbmdlID0gY29u ZF9jb2RlID09IEVRX0VYUFI7Ci0KLSAgdHJlZSB0eXBlID0gVFJFRV9UWVBFICh0KTsKLSAgd2lk ZV9pbnQgbWluID0gd2k6Om1pbl92YWx1ZSAodHlwZSksCi0gICAgbWF4ID0gd2k6Om1heF92YWx1 ZSAodHlwZSk7Ci0KLSAgaWYgKGlzX3JhbmdlKQotICAgIHsKLSAgICAgICpsb3dfY29kZSA9IHZh bCA9PSBtaW4gPyBFUlJPUl9NQVJLIDogR0VfRVhQUjsKLSAgICAgICpoaWdoX2NvZGUgPSB2YWwg PT0gbWF4ID8gRVJST1JfTUFSSyA6IExFX0VYUFI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAg ICAgLyogV2UgY2FuIHN0aWxsIGdlbmVyYXRlIGFzc2VydGlvbiBpZiBvbmUgb2YgYWx0ZXJuYXRp dmVzCi0JIGlzIGtub3duIHRvIGFsd2F5cyBiZSBmYWxzZS4gICovCi0gICAgICBpZiAodmFsID09 IG1pbikKLQl7Ci0JICAqbG93X2NvZGUgPSAoZW51bSB0cmVlX2NvZGUpIDA7Ci0JICAqaGlnaF9j b2RlID0gR1RfRVhQUjsKLQl9Ci0gICAgICBlbHNlIGlmICgodmFsIHwgaW52X21hc2spID09IG1h eCkKLQl7Ci0JICAqbG93X2NvZGUgPSBMVF9FWFBSOwotCSAgKmhpZ2hfY29kZSA9IChlbnVtIHRy ZWVfY29kZSkgMDsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAq bmV3X25hbWUgPSB0OwotICAqbG93ID0gd2lkZV9pbnRfdG9fdHJlZSAodHlwZSwgdmFsKTsKLSAg KmhpZ2ggPSB3aWRlX2ludF90b190cmVlICh0eXBlLCB2YWwgfCBpbnZfbWFzayk7Ci0KLSAgcmV0 dXJuIHRydWU7Ci19Ci0KLS8qIFRyeSB0byByZWdpc3RlciBhbiBlZGdlIGFzc2VydGlvbiBmb3Ig U1NBIG5hbWUgTkFNRSBvbiBlZGdlIEUgZm9yCi0gICB0aGUgY29uZGl0aW9uIENPTkQgY29udHJp YnV0aW5nIHRvIHRoZSBjb25kaXRpb25hbCBqdW1wIHBvaW50ZWQgdG8gYnkKLSAgIFNJLiAgKi8K LQotdm9pZAotcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yICh0cmVlIG5hbWUsIGVkZ2UgZSwKLQkJ CSAgZW51bSB0cmVlX2NvZGUgY29uZF9jb2RlLCB0cmVlIGNvbmRfb3AwLAotCQkJICB0cmVlIGNv bmRfb3AxLCB2ZWM8YXNzZXJ0X2luZm8+ICZhc3NlcnRzKQotewotICB0cmVlIHZhbDsKLSAgZW51 bSB0cmVlX2NvZGUgY29tcF9jb2RlOwotICBib29sIGlzX2Vsc2VfZWRnZSA9IChlLT5mbGFncyAm IEVER0VfRkFMU0VfVkFMVUUpICE9IDA7Ci0KLSAgLyogRG8gbm90IGF0dGVtcHQgdG8gaW5mZXIg YW55dGhpbmcgaW4gbmFtZXMgdGhhdCBmbG93IHRocm91Z2gKLSAgICAgYWJub3JtYWwgZWRnZXMu ICAqLwotICBpZiAoU1NBX05BTUVfT0NDVVJTX0lOX0FCTk9STUFMX1BISSAobmFtZSkpCi0gICAg cmV0dXJuOwotCi0gIGlmICghZXh0cmFjdF9jb2RlX2FuZF92YWxfZnJvbV9jb25kX3dpdGhfb3Bz IChuYW1lLCBjb25kX2NvZGUsCi0JCQkJCQljb25kX29wMCwgY29uZF9vcDEsCi0JCQkJCQlpc19l bHNlX2VkZ2UsCi0JCQkJCQkmY29tcF9jb2RlLCAmdmFsKSkKLSAgICByZXR1cm47Ci0KLSAgLyog UmVnaXN0ZXIgQVNTRVJUX0VYUFJzIGZvciBuYW1lLiAgKi8KLSAgcmVnaXN0ZXJfZWRnZV9hc3Nl cnRfZm9yXzIgKG5hbWUsIGUsIGNvbmRfY29kZSwgY29uZF9vcDAsCi0JCQkgICAgICBjb25kX29w MSwgaXNfZWxzZV9lZGdlLCBhc3NlcnRzKTsKLQotCi0gIC8qIElmIENPTkQgaXMgZWZmZWN0aXZl bHkgYW4gZXF1YWxpdHkgdGVzdCBvZiBhbiBTU0FfTkFNRSBhZ2FpbnN0Ci0gICAgIHRoZSB2YWx1 ZSB6ZXJvIG9yIG9uZSwgdGhlbiB3ZSBtYXkgYmUgYWJsZSB0byBhc3NlcnQgdmFsdWVzCi0gICAg IGZvciBTU0FfTkFNRXMgd2hpY2ggZmxvdyBpbnRvIENPTkQuICAqLwotCi0gIC8qIEluIHRoZSBj YXNlIG9mIE5BTUUgPT0gMSBvciBOQU1FICE9IDAsIGZvciBCSVRfQU5EX0VYUFIgZGVmaW5pbmcK LSAgICAgc3RhdGVtZW50IG9mIE5BTUUgd2UgY2FuIGFzc2VydCBib3RoIG9wZXJhbmRzIG9mIHRo ZSBCSVRfQU5EX0VYUFIKLSAgICAgaGF2ZSBub256ZXJvIHZhbHVlLiAgKi8KLSAgaWYgKChjb21w X2NvZGUgPT0gRVFfRVhQUiAmJiBpbnRlZ2VyX29uZXAgKHZhbCkpCi0gICAgICB8fCAoY29tcF9j b2RlID09IE5FX0VYUFIgJiYgaW50ZWdlcl96ZXJvcCAodmFsKSkpCi0gICAgewotICAgICAgZ2lt cGxlICpkZWZfc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lKTsKLQotICAgICAgaWYgKGlz X2dpbXBsZV9hc3NpZ24gKGRlZl9zdG10KQotCSAgJiYgZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAo ZGVmX3N0bXQpID09IEJJVF9BTkRfRVhQUikKLQl7Ci0JICB0cmVlIG9wMCA9IGdpbXBsZV9hc3Np Z25fcmhzMSAoZGVmX3N0bXQpOwotCSAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKGRl Zl9zdG10KTsKLQkgIHJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcl8xIChvcDAsIE5FX0VYUFIsIGUs IGFzc2VydHMpOwotCSAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzEgKG9wMSwgTkVfRVhQUiwg ZSwgYXNzZXJ0cyk7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoZGVmX3N0 bXQpCi0JICAgICAgICYmIChUUkVFX0NPREVfQ0xBU1MgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUg KGRlZl9zdG10KSkKLQkJICAgPT0gdGNjX2NvbXBhcmlzb24pKQotCXJlZ2lzdGVyX2VkZ2VfYXNz ZXJ0X2Zvcl8xIChuYW1lLCBORV9FWFBSLCBlLCBhc3NlcnRzKTsKLSAgICB9Ci0KLSAgLyogSW4g dGhlIGNhc2Ugb2YgTkFNRSA9PSAwIG9yIE5BTUUgIT0gMSwgZm9yIEJJVF9JT1JfRVhQUiBkZWZp bmluZwotICAgICBzdGF0ZW1lbnQgb2YgTkFNRSB3ZSBjYW4gYXNzZXJ0IGJvdGggb3BlcmFuZHMg b2YgdGhlIEJJVF9JT1JfRVhQUgotICAgICBoYXZlIHplcm8gdmFsdWUuICAqLwotICBpZiAoKGNv bXBfY29kZSA9PSBFUV9FWFBSICYmIGludGVnZXJfemVyb3AgKHZhbCkpCi0gICAgICB8fCAoY29t cF9jb2RlID09IE5FX0VYUFIKLQkgICYmIGludGVnZXJfb25lcCAodmFsKQotCSAgJiYgVFlQRV9Q UkVDSVNJT04gKFRSRUVfVFlQRSAobmFtZSkpID09IDEpKQotICAgIHsKLSAgICAgIGdpbXBsZSAq ZGVmX3N0bXQgPSBTU0FfTkFNRV9ERUZfU1RNVCAobmFtZSk7Ci0KLSAgICAgIC8qIEZvciBCSVRf SU9SX0VYUFIgb25seSBpZiBOQU1FID09IDAgYm90aCBvcGVyYW5kcyBoYXZlCi0JIG5lY2Vzc2Fy aWx5IHplcm8gdmFsdWUsIG9yIGlmIHR5cGUtcHJlY2lzaW9uIGlzIG9uZS4gICovCi0gICAgICBp ZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoZGVmX3N0bXQpCi0JICAmJiBnaW1wbGVfYXNzaWduX3Joc19j b2RlIChkZWZfc3RtdCkgPT0gQklUX0lPUl9FWFBSKQotCXsKLQkgIHRyZWUgb3AwID0gZ2ltcGxl X2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0JICB0cmVlIG9wMSA9IGdpbXBsZV9hc3NpZ25fcmhz MiAoZGVmX3N0bXQpOwotCSAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzEgKG9wMCwgRVFfRVhQ UiwgZSwgYXNzZXJ0cyk7Ci0JICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMSAob3AxLCBFUV9F WFBSLCBlLCBhc3NlcnRzKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpc19naW1wbGVfYXNzaWduIChk ZWZfc3RtdCkKLQkgICAgICAgJiYgKFRSRUVfQ09ERV9DTEFTUyAoZ2ltcGxlX2Fzc2lnbl9yaHNf Y29kZSAoZGVmX3N0bXQpKQotCQkgICA9PSB0Y2NfY29tcGFyaXNvbikpCi0JcmVnaXN0ZXJfZWRn ZV9hc3NlcnRfZm9yXzEgKG5hbWUsIEVRX0VYUFIsIGUsIGFzc2VydHMpOwotICAgIH0KLQotICAv KiBTb21ldGltZXMgd2UgY2FuIGluZmVyIHJhbmdlcyBmcm9tIChOQU1FICYgTUFTSykgPT0gVkFM VUUuICAqLwotICBpZiAoKGNvbXBfY29kZSA9PSBFUV9FWFBSIHx8IGNvbXBfY29kZSA9PSBORV9F WFBSKQotICAgICAgJiYgVFJFRV9DT0RFICh2YWwpID09IElOVEVHRVJfQ1NUKQotICAgIHsKLSAg ICAgIGVudW0gdHJlZV9jb2RlIGxvd19jb2RlLCBoaWdoX2NvZGU7Ci0gICAgICB0cmVlIGxvdywg aGlnaDsKLSAgICAgIGlmIChpc19tYXNrZWRfcmFuZ2VfdGVzdCAobmFtZSwgdmFsLCBjb21wX2Nv ZGUsICZuYW1lLCAmbG93LAotCQkJCSZsb3dfY29kZSwgJmhpZ2gsICZoaWdoX2NvZGUpKQotCXsK LQkgIGlmIChsb3dfY29kZSAhPSBFUlJPUl9NQVJLKQotCSAgICByZWdpc3Rlcl9lZGdlX2Fzc2Vy dF9mb3JfMiAobmFtZSwgZSwgbG93X2NvZGUsIG5hbWUsCi0JCQkJCWxvdywgLyppbnZlcnQqL2Zh bHNlLCBhc3NlcnRzKTsKLQkgIGlmIChoaWdoX2NvZGUgIT0gRVJST1JfTUFSSykKLQkgICAgcmVn aXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzIgKG5hbWUsIGUsIGhpZ2hfY29kZSwgbmFtZSwKLQkJCQkJ aGlnaCwgLyppbnZlcnQqL2ZhbHNlLCBhc3NlcnRzKTsKLQl9Ci0gICAgfQotfQotCi0vKiBIYW5k bGUKLSAgIF80ID0geF8zICYgMzE7Ci0gICBpZiAoXzQgIT0gMCkKLSAgICAgZ290byA8YmIgNj47 Ci0gICBlbHNlCi0gICAgIGdvdG8gPGJiIDc+OwotICAgPGJiIDY+OgotICAgX19idWlsdGluX3Vu cmVhY2hhYmxlICgpOwotICAgPGJiIDc+OgotICAgeF81ID0gQVNTRVJUX0VYUFIgPHhfMywgLi4u PjsKLSAgIElmIHhfMyBoYXMgbm8gb3RoZXIgaW1tZWRpYXRlIHVzZXMgKGNoZWNrZWQgYnkgY2Fs bGVyKSwKLSAgIHZhciBpcyB0aGUgeF8zIHZhciBmcm9tIEFTU0VSVF9FWFBSLCB3ZSBjYW4gY2xl YXIgbG93IDUgYml0cwotICAgZnJvbSB0aGUgbm9uLXplcm8gYml0bWFzay4gICovCi0KLXZvaWQK LW1heWJlX3NldF9ub256ZXJvX2JpdHMgKGVkZ2UgZSwgdHJlZSB2YXIpCi17Ci0gIGJhc2ljX2Js b2NrIGNvbmRfYmIgPSBlLT5zcmM7Ci0gIGdpbXBsZSAqc3RtdCA9IGxhc3Rfc3RtdCAoY29uZF9i Yik7Ci0gIHRyZWUgY3N0OwotCi0gIGlmIChzdG10ID09IE5VTEwKLSAgICAgIHx8IGdpbXBsZV9j b2RlIChzdG10KSAhPSBHSU1QTEVfQ09ORAotICAgICAgfHwgZ2ltcGxlX2NvbmRfY29kZSAoc3Rt dCkgIT0gKChlLT5mbGFncyAmIEVER0VfVFJVRV9WQUxVRSkKLQkJCQkgICAgID8gRVFfRVhQUiA6 IE5FX0VYUFIpCi0gICAgICB8fCBUUkVFX0NPREUgKGdpbXBsZV9jb25kX2xocyAoc3RtdCkpICE9 IFNTQV9OQU1FCi0gICAgICB8fCAhaW50ZWdlcl96ZXJvcCAoZ2ltcGxlX2NvbmRfcmhzIChzdG10 KSkpCi0gICAgcmV0dXJuOwotCi0gIHN0bXQgPSBTU0FfTkFNRV9ERUZfU1RNVCAoZ2ltcGxlX2Nv bmRfbGhzIChzdG10KSk7Ci0gIGlmICghaXNfZ2ltcGxlX2Fzc2lnbiAoc3RtdCkKLSAgICAgIHx8 IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpICE9IEJJVF9BTkRfRVhQUgotICAgICAgfHwg VFJFRV9DT0RFIChnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpKSAhPSBJTlRFR0VSX0NTVCkKLSAg ICByZXR1cm47Ci0gIGlmIChnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpICE9IHZhcikKLSAgICB7 Ci0gICAgICBnaW1wbGUgKnN0bXQyOwotCi0gICAgICBpZiAoVFJFRV9DT0RFIChnaW1wbGVfYXNz aWduX3JoczEgKHN0bXQpKSAhPSBTU0FfTkFNRSkKLQlyZXR1cm47Ci0gICAgICBzdG10MiA9IFNT QV9OQU1FX0RFRl9TVE1UIChnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpKTsKLSAgICAgIGlmICgh Z2ltcGxlX2Fzc2lnbl9jYXN0X3AgKHN0bXQyKQotCSAgfHwgZ2ltcGxlX2Fzc2lnbl9yaHMxIChz dG10MikgIT0gdmFyCi0JICB8fCAhQ09OVkVSVF9FWFBSX0NPREVfUCAoZ2ltcGxlX2Fzc2lnbl9y aHNfY29kZSAoc3RtdDIpKQotCSAgfHwgKFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKGdpbXBs ZV9hc3NpZ25fcmhzMSAoc3RtdCkpKQotCQkJICAgICAgIT0gVFlQRV9QUkVDSVNJT04gKFRSRUVf VFlQRSAodmFyKSkpKQotCXJldHVybjsKLSAgICB9Ci0gIGNzdCA9IGdpbXBsZV9hc3NpZ25fcmhz MiAoc3RtdCk7Ci0gIHNldF9ub256ZXJvX2JpdHMgKHZhciwgd2k6OmJpdF9hbmRfbm90IChnZXRf bm9uemVyb19iaXRzICh2YXIpLAotCQkJCQkgIHdpOjp0b193aWRlIChjc3QpKSk7Ci19Ci0KLS8q IFJldHVybiB0cnVlIGlmIFNUTVQgaXMgaW50ZXJlc3RpbmcgZm9yIFZSUC4gICovCi0KLWJvb2wK LXN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCAoZ2ltcGxlICpzdG10KQotewotICBpZiAoZ2ltcGxl X2NvZGUgKHN0bXQpID09IEdJTVBMRV9QSEkpCi0gICAgewotICAgICAgdHJlZSByZXMgPSBnaW1w bGVfcGhpX3Jlc3VsdCAoc3RtdCk7Ci0gICAgICByZXR1cm4gKCF2aXJ0dWFsX29wZXJhbmRfcCAo cmVzKQotCSAgICAgICYmIChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAocmVzKSkKLQkJICB8 fCBQT0lOVEVSX1RZUEVfUCAoVFJFRV9UWVBFIChyZXMpKSkpOwotICAgIH0KLSAgZWxzZSBpZiAo aXNfZ2ltcGxlX2Fzc2lnbiAoc3RtdCkgfHwgaXNfZ2ltcGxlX2NhbGwgKHN0bXQpKQotICAgIHsK LSAgICAgIHRyZWUgbGhzID0gZ2ltcGxlX2dldF9saHMgKHN0bXQpOwotCi0gICAgICAvKiBJbiBn ZW5lcmFsLCBhc3NpZ25tZW50cyB3aXRoIHZpcnR1YWwgb3BlcmFuZHMgYXJlIG5vdCB1c2VmdWwK LQkgZm9yIGRlcml2aW5nIHJhbmdlcywgd2l0aCB0aGUgb2J2aW91cyBleGNlcHRpb24gb2YgY2Fs bHMgdG8KLQkgYnVpbHRpbiBmdW5jdGlvbnMuICAqLwotICAgICAgaWYgKGxocyAmJiBUUkVFX0NP REUgKGxocykgPT0gU1NBX05BTUUKLQkgICYmIChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAo bGhzKSkKLQkgICAgICB8fCBQT0lOVEVSX1RZUEVfUCAoVFJFRV9UWVBFIChsaHMpKSkKLQkgICYm IChpc19naW1wbGVfY2FsbCAoc3RtdCkKLQkgICAgICB8fCAhZ2ltcGxlX3Z1c2UgKHN0bXQpKSkK LQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKGlzX2dpbXBsZV9jYWxsIChzdG10KSAmJiBn aW1wbGVfY2FsbF9pbnRlcm5hbF9wIChzdG10KSkKLQlzd2l0Y2ggKGdpbXBsZV9jYWxsX2ludGVy bmFsX2ZuIChzdG10KSkKLQkgIHsKLQkgIGNhc2UgSUZOX0FERF9PVkVSRkxPVzoKLQkgIGNhc2Ug SUZOX1NVQl9PVkVSRkxPVzoKLQkgIGNhc2UgSUZOX01VTF9PVkVSRkxPVzoKLQkgIGNhc2UgSUZO X0FUT01JQ19DT01QQVJFX0VYQ0hBTkdFOgotCSAgICAvKiBUaGVzZSBpbnRlcm5hbCBjYWxscyBy ZXR1cm4gX0NvbXBsZXggaW50ZWdlciB0eXBlLAotCSAgICAgICBidXQgYXJlIGludGVyZXN0aW5n IHRvIFZSUCBuZXZlcnRoZWxlc3MuICAqLwotCSAgICBpZiAobGhzICYmIFRSRUVfQ09ERSAobGhz KSA9PSBTU0FfTkFNRSkKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgYnJlYWs7Ci0JICBkZWZh dWx0OgotCSAgICBicmVhazsKLQkgIH0KLSAgICB9Ci0gIGVsc2UgaWYgKGdpbXBsZV9jb2RlIChz dG10KSA9PSBHSU1QTEVfQ09ORAotCSAgIHx8IGdpbXBsZV9jb2RlIChzdG10KSA9PSBHSU1QTEVf U1dJVENIKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2Vh cmNoZXMgdGhlIGNhc2UgbGFiZWwgdmVjdG9yIFZFQyBmb3IgdGhlIGluZGV4ICpJRFggb2YgdGhl IENBU0VfTEFCRUwKLSAgIHRoYXQgaW5jbHVkZXMgdGhlIHZhbHVlIFZBTC4gIFRoZSBzZWFyY2gg aXMgcmVzdHJpY3RlZCB0byB0aGUgcmFuZ2UKLSAgIFtTVEFSVF9JRFgsIG4gLSAxXSB3aGVyZSBu IGlzIHRoZSBzaXplIG9mIFZFQy4KLQotICAgSWYgdGhlcmUgaXMgYSBDQVNFX0xBQkVMIGZvciBW QUwsIGl0cyBpbmRleCBpcyBwbGFjZWQgaW4gSURYIGFuZCB0cnVlIGlzCi0gICByZXR1cm5lZC4K LQotICAgSWYgdGhlcmUgaXMgbm8gQ0FTRV9MQUJFTCBmb3IgVkFMIGFuZCB0aGVyZSBpcyBvbmUg dGhhdCBpcyBsYXJnZXIgdGhhbiBWQUwsCi0gICBpdCBpcyBwbGFjZWQgaW4gSURYIGFuZCBmYWxz ZSBpcyByZXR1cm5lZC4KLQotICAgSWYgVkFMIGlzIGxhcmdlciB0aGFuIGFueSBDQVNFX0xBQkVM LCBuIGlzIHBsYWNlZCBvbiBJRFggYW5kIGZhbHNlIGlzCi0gICByZXR1cm5lZC4gKi8KLQotYm9v bAotZmluZF9jYXNlX2xhYmVsX2luZGV4IChnc3dpdGNoICpzdG10LCBzaXplX3Qgc3RhcnRfaWR4 LCB0cmVlIHZhbCwgc2l6ZV90ICppZHgpCi17Ci0gIHNpemVfdCBuID0gZ2ltcGxlX3N3aXRjaF9u dW1fbGFiZWxzIChzdG10KTsKLSAgc2l6ZV90IGxvdywgaGlnaDsKLQotICAvKiBGaW5kIGNhc2Ug bGFiZWwgZm9yIG1pbmltdW0gb2YgdGhlIHZhbHVlIHJhbmdlIG9yIHRoZSBuZXh0IG9uZS4KLSAg ICAgQXQgZWFjaCBpdGVyYXRpb24gd2UgYXJlIHNlYXJjaGluZyBpbiBbbG93LCBoaWdoIC0gMV0u ICovCi0KLSAgZm9yIChsb3cgPSBzdGFydF9pZHgsIGhpZ2ggPSBuOyBoaWdoICE9IGxvdzsgKQot ICAgIHsKLSAgICAgIHRyZWUgdDsKLSAgICAgIGludCBjbXA7Ci0gICAgICAvKiBOb3RlIHRoYXQg aSAhPSBoaWdoLCBzbyB3ZSBuZXZlciBhc2sgZm9yIG4uICovCi0gICAgICBzaXplX3QgaSA9ICho aWdoICsgbG93KSAvIDI7Ci0gICAgICB0ID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaSk7 Ci0KLSAgICAgIC8qIENhY2hlIHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIENBU0VfTE9XIGFuZCB2 YWwuICAqLwotICAgICAgY21wID0gdHJlZV9pbnRfY3N0X2NvbXBhcmUgKENBU0VfTE9XICh0KSwg dmFsKTsKLQotICAgICAgaWYgKGNtcCA9PSAwKQotCXsKLQkgIC8qIFJhbmdlcyBjYW5ub3QgYmUg ZW1wdHkuICovCi0JICAqaWR4ID0gaTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGVsc2Ug aWYgKGNtcCA+IDApCi0gICAgICAgIGhpZ2ggPSBpOwotICAgICAgZWxzZQotCXsKLQkgIGxvdyA9 IGkgKyAxOwotCSAgaWYgKENBU0VfSElHSCAodCkgIT0gTlVMTAotCSAgICAgICYmIHRyZWVfaW50 X2NzdF9jb21wYXJlIChDQVNFX0hJR0ggKHQpLCB2YWwpID49IDApCi0JICAgIHsKLQkgICAgICAq aWR4ID0gaTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotICAgICAgICB9Ci0gICAgfQot Ci0gICppZHggPSBoaWdoOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlYXJjaGVzIHRoZSBj YXNlIGxhYmVsIHZlY3RvciBWRUMgZm9yIHRoZSByYW5nZSBvZiBDQVNFX0xBQkVMcyB0aGF0IGlz IHVzZWQKLSAgIGZvciB2YWx1ZXMgYmV0d2VlbiBNSU4gYW5kIE1BWC4gVGhlIGZpcnN0IGluZGV4 IGlzIHBsYWNlZCBpbiBNSU5fSURYLiBUaGUKLSAgIGxhc3QgaW5kZXggaXMgcGxhY2VkIGluIE1B WF9JRFguIElmIHRoZSByYW5nZSBvZiBDQVNFX0xBQkVMcyBpcyBlbXB0eQotICAgdGhlbiBNQVhf SURYIDwgTUlOX0lEWC4KLSAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVmYXVsdCBsYWJlbCBpcyBu b3QgbmVlZGVkLiAqLwotCi1ib29sCi1maW5kX2Nhc2VfbGFiZWxfcmFuZ2UgKGdzd2l0Y2ggKnN0 bXQsIHRyZWUgbWluLCB0cmVlIG1heCwgc2l6ZV90ICptaW5faWR4LAotCQkgICAgICAgc2l6ZV90 ICptYXhfaWR4KQotewotICBzaXplX3QgaSwgajsKLSAgYm9vbCBtaW5fdGFrZV9kZWZhdWx0ID0g IWZpbmRfY2FzZV9sYWJlbF9pbmRleCAoc3RtdCwgMSwgbWluLCAmaSk7Ci0gIGJvb2wgbWF4X3Rh a2VfZGVmYXVsdCA9ICFmaW5kX2Nhc2VfbGFiZWxfaW5kZXggKHN0bXQsIGksIG1heCwgJmopOwot Ci0gIGlmIChpID09IGoKLSAgICAgICYmIG1pbl90YWtlX2RlZmF1bHQKLSAgICAgICYmIG1heF90 YWtlX2RlZmF1bHQpCi0gICAgewotICAgICAgLyogT25seSB0aGUgZGVmYXVsdCBjYXNlIGxhYmVs IHJlYWNoZWQuCi0gICAgICAgICBSZXR1cm4gYW4gZW1wdHkgcmFuZ2UuICovCi0gICAgICAqbWlu X2lkeCA9IDE7Ci0gICAgICAqbWF4X2lkeCA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAg fQotICBlbHNlCi0gICAgewotICAgICAgYm9vbCB0YWtlX2RlZmF1bHQgPSBtaW5fdGFrZV9kZWZh dWx0IHx8IG1heF90YWtlX2RlZmF1bHQ7Ci0gICAgICB0cmVlIGxvdywgaGlnaDsKLSAgICAgIHNp emVfdCBrOwotCi0gICAgICBpZiAobWF4X3Rha2VfZGVmYXVsdCkKLQlqLS07Ci0KLSAgICAgIC8q IElmIHRoZSBjYXNlIGxhYmVsIHJhbmdlIGlzIGNvbnRpbnVvdXMsIHdlIGRvIG5vdCBuZWVkCi0J IHRoZSBkZWZhdWx0IGNhc2UgbGFiZWwuICBWZXJpZnkgdGhhdC4gICovCi0gICAgICBoaWdoID0g Q0FTRV9MT1cgKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGkpKTsKLSAgICAgIGlmIChDQVNF X0hJR0ggKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGkpKSkKLQloaWdoID0gQ0FTRV9ISUdI IChnaW1wbGVfc3dpdGNoX2xhYmVsIChzdG10LCBpKSk7Ci0gICAgICBmb3IgKGsgPSBpICsgMTsg ayA8PSBqOyArK2spCi0JewotCSAgbG93ID0gQ0FTRV9MT1cgKGdpbXBsZV9zd2l0Y2hfbGFiZWwg KHN0bXQsIGspKTsKLQkgIGlmICghaW50ZWdlcl9vbmVwIChpbnRfY29uc3RfYmlub3AgKE1JTlVT X0VYUFIsIGxvdywgaGlnaCkpKQotCSAgICB7Ci0JICAgICAgdGFrZV9kZWZhdWx0ID0gdHJ1ZTsK LQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaGlnaCA9IGxvdzsKLQkgIGlmIChDQVNFX0hJR0gg KGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGspKSkKLQkgICAgaGlnaCA9IENBU0VfSElHSCAo Z2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaykpOwotCX0KLQotICAgICAgKm1pbl9pZHggPSBp OwotICAgICAgKm1heF9pZHggPSBqOwotICAgICAgcmV0dXJuICF0YWtlX2RlZmF1bHQ7Ci0gICAg fQotfQotCi0vKiBHaXZlbiBhIFNXSVRDSF9TVE1ULCByZXR1cm4gdGhlIGNhc2UgbGFiZWwgdGhh dCBlbmNvbXBhc3NlcyB0aGUKLSAgIGtub3duIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHN3aXRj aCBvcGVyYW5kLiAgUkFOR0VfT0ZfT1AgaXMgYQotICAgcmFuZ2UgZm9yIHRoZSBrbm93biB2YWx1 ZXMgb2YgdGhlIHN3aXRjaCBvcGVyYW5kLiAgKi8KLQotdHJlZQotZmluZF9jYXNlX2xhYmVsX3Jh bmdlIChnc3dpdGNoICpzd2l0Y2hfc3RtdCwgY29uc3QgaXJhbmdlICpyYW5nZV9vZl9vcCkKLXsK LSAgaWYgKHJhbmdlX29mX29wLT51bmRlZmluZWRfcCAoKQotICAgICAgfHwgcmFuZ2Vfb2Zfb3At PnZhcnlpbmdfcCAoKQotICAgICAgfHwgcmFuZ2Vfb2Zfb3AtPnN5bWJvbGljX3AgKCkpCi0gICAg cmV0dXJuIE5VTExfVFJFRTsKLQotICBzaXplX3QgaSwgajsKLSAgdHJlZSBvcCA9IGdpbXBsZV9z d2l0Y2hfaW5kZXggKHN3aXRjaF9zdG10KTsKLSAgdHJlZSB0eXBlID0gVFJFRV9UWVBFIChvcCk7 Ci0gIHRyZWUgdG1pbiA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHJhbmdlX29mX29wLT5sb3dl cl9ib3VuZCAoKSk7Ci0gIHRyZWUgdG1heCA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHJhbmdl X29mX29wLT51cHBlcl9ib3VuZCAoKSk7Ci0gIGZpbmRfY2FzZV9sYWJlbF9yYW5nZSAoc3dpdGNo X3N0bXQsIHRtaW4sIHRtYXgsICZpLCAmaik7Ci0gIGlmIChpID09IGopCi0gICAgewotICAgICAg LyogTG9vayBmb3IgZXhhY3RseSBvbmUgbGFiZWwgdGhhdCBlbmNvbXBhc3NlcyB0aGUgcmFuZ2Ug b2YKLQkgdGhlIG9wZXJhbmQuICAqLwotICAgICAgdHJlZSBsYWJlbCA9IGdpbXBsZV9zd2l0Y2hf bGFiZWwgKHN3aXRjaF9zdG10LCBpKTsKLSAgICAgIHRyZWUgY2FzZV9oaWdoCi0JPSBDQVNFX0hJ R0ggKGxhYmVsKSA/IENBU0VfSElHSCAobGFiZWwpIDogQ0FTRV9MT1cgKGxhYmVsKTsKLSAgICAg IGludF9yYW5nZV9tYXggbGFiZWxfcmFuZ2UgKENBU0VfTE9XIChsYWJlbCksIGNhc2VfaGlnaCk7 Ci0gICAgICBpZiAoIXR5cGVzX2NvbXBhdGlibGVfcCAobGFiZWxfcmFuZ2UudHlwZSAoKSwgcmFu Z2Vfb2Zfb3AtPnR5cGUgKCkpKQotCXJhbmdlX2Nhc3QgKGxhYmVsX3JhbmdlLCByYW5nZV9vZl9v cC0+dHlwZSAoKSk7Ci0gICAgICBsYWJlbF9yYW5nZS5pbnRlcnNlY3QgKCpyYW5nZV9vZl9vcCk7 Ci0gICAgICBpZiAobGFiZWxfcmFuZ2UgPT0gKnJhbmdlX29mX29wKQotCXJldHVybiBsYWJlbDsK LSAgICB9Ci0gIGVsc2UgaWYgKGkgPiBqKQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGFyZSBu byBsYWJlbHMgYXQgYWxsLCB0YWtlIHRoZSBkZWZhdWx0LiAgKi8KLSAgICAgIHJldHVybiBnaW1w bGVfc3dpdGNoX2xhYmVsIChzd2l0Y2hfc3RtdCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewot ICAgICAgLyogT3RoZXJ3aXNlLCB0aGVyZSBhcmUgdmFyaW91cyBsYWJlbHMgdGhhdCBjYW4gZW5j b21wYXNzCi0JIHRoZSByYW5nZSBvZiBvcGVyYW5kLiAgSW4gd2hpY2ggY2FzZSwgc2VlIGlmIHRo ZSByYW5nZSBvZgotCSB0aGUgb3BlcmFuZCBpcyBlbnRpcmVseSAqb3V0c2lkZSogdGhlIGJvdW5k cyBvZiBhbGwgdGhlCi0JIChub24tZGVmYXVsdCkgY2FzZSBsYWJlbHMuICBJZiBzbywgdGFrZSB0 aGUgZGVmYXVsdC4gICovCi0gICAgICB1bnNpZ25lZCBuID0gZ2ltcGxlX3N3aXRjaF9udW1fbGFi ZWxzIChzd2l0Y2hfc3RtdCk7Ci0gICAgICB0cmVlIG1pbl9sYWJlbCA9IGdpbXBsZV9zd2l0Y2hf bGFiZWwgKHN3aXRjaF9zdG10LCAxKTsKLSAgICAgIHRyZWUgbWF4X2xhYmVsID0gZ2ltcGxlX3N3 aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIG4gLSAxKTsKLSAgICAgIHRyZWUgY2FzZV9oaWdoID0g Q0FTRV9ISUdIIChtYXhfbGFiZWwpOwotICAgICAgaWYgKCFjYXNlX2hpZ2gpCi0JY2FzZV9oaWdo ID0gQ0FTRV9MT1cgKG1heF9sYWJlbCk7Ci0gICAgICBpbnRfcmFuZ2VfbWF4IGxhYmVsX3Jhbmdl IChDQVNFX0xPVyAobWluX2xhYmVsKSwgY2FzZV9oaWdoKTsKLSAgICAgIGlmICghdHlwZXNfY29t cGF0aWJsZV9wIChsYWJlbF9yYW5nZS50eXBlICgpLCByYW5nZV9vZl9vcC0+dHlwZSAoKSkpCi0J cmFuZ2VfY2FzdCAobGFiZWxfcmFuZ2UsIHJhbmdlX29mX29wLT50eXBlICgpKTsKLSAgICAgIGxh YmVsX3JhbmdlLmludGVyc2VjdCAoKnJhbmdlX29mX29wKTsKLSAgICAgIGlmIChsYWJlbF9yYW5n ZS51bmRlZmluZWRfcCAoKSkKLQlyZXR1cm4gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0 bXQsIDApOwotICAgIH0KLSAgcmV0dXJuIE5VTExfVFJFRTsKLX0KLQotc3RydWN0IGNhc2VfaW5m bwotewotICB0cmVlIGV4cHI7Ci0gIGJhc2ljX2Jsb2NrIGJiOwotfTsKLQotLyogTG9jYXRpb24g aW5mb3JtYXRpb24gZm9yIEFTU0VSVF9FWFBScy4gIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcwotICAg c3RydWN0dXJlIGRlc2NyaWJlcyBhbiBBU1NFUlRfRVhQUiBmb3IgYW4gU1NBIG5hbWUuICBTaW5j ZSBhIHNpbmdsZQotICAgU1NBIG5hbWUgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NlcnRpb24g YXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVzZQotICAgbG9jYXRpb25zIGFyZSBrZXB0IGluIGEgbGlu a2VkIGxpc3QgYXR0YWNoZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLSAgIFNTQSBuYW1lLiAgKi8K LXN0cnVjdCBhc3NlcnRfbG9jdXMKLXsKLSAgLyogQmFzaWMgYmxvY2sgd2hlcmUgdGhlIGFzc2Vy dGlvbiB3b3VsZCBiZSBpbnNlcnRlZC4gICovCi0gIGJhc2ljX2Jsb2NrIGJiOwotCi0gIC8qIFNv bWUgYXNzZXJ0aW9ucyBuZWVkIHRvIGJlIGluc2VydGVkIG9uIGFuIGVkZ2UgKGUuZy4sIGFzc2Vy dGlvbnMKLSAgICAgZ2VuZXJhdGVkIGJ5IENPTkRfRVhQUnMpLiAgSW4gdGhvc2UgY2FzZXMsIEJC IHdpbGwgYmUgTlVMTC4gICovCi0gIGVkZ2UgZTsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBzdGF0 ZW1lbnQgdGhhdCBnZW5lcmF0ZWQgdGhpcyBhc3NlcnRpb24uICAqLwotICBnaW1wbGVfc3RtdF9p dGVyYXRvciBzaTsKLQotICAvKiBQcmVkaWNhdGUgY29kZSBmb3IgdGhlIEFTU0VSVF9FWFBSLiAg TXVzdCBiZSBDT01QQVJJU09OX0NMQVNTX1AuICAqLwotICBlbnVtIHRyZWVfY29kZSBjb21wX2Nv ZGU7Ci0KLSAgLyogVmFsdWUgYmVpbmcgY29tcGFyZWQgYWdhaW5zdC4gICovCi0gIHRyZWUgdmFs OwotCi0gIC8qIEV4cHJlc3Npb24gdG8gY29tcGFyZS4gICovCi0gIHRyZWUgZXhwcjsKLQotICAv KiBOZXh0IG5vZGUgaW4gdGhlIGxpbmtlZCBsaXN0LiAgKi8KLSAgYXNzZXJ0X2xvY3VzICpuZXh0 OwotfTsKLQotLyogQ2xhc3MgdG8gdHJhdmVyc2UgdGhlIGZsb3dncmFwaCBsb29raW5nIGZvciBj b25kaXRpb25hbCBqdW1wcyB0bwotICAgaW5zZXJ0IEFTU0VSVF9FWFBSIHJhbmdlIGV4cHJlc3Np b25zLiAgVGhlc2UgcmFuZ2UgZXhwcmVzc2lvbnMgYXJlCi0gICBtZWFudCB0byBwcm92aWRlIGlu Zm9ybWF0aW9uIHRvIG9wdGltaXphdGlvbnMgdGhhdCBuZWVkIHRvIHJlYXNvbgotICAgaW4gdGVy bXMgb2YgdmFsdWUgcmFuZ2VzLiAgVGhleSB3aWxsIG5vdCBiZSBleHBhbmRlZCBpbnRvIFJUTC4g ICovCi0KLWNsYXNzIHZycF9hc3NlcnRzCi17Ci1wdWJsaWM6Ci0gIHZycF9hc3NlcnRzIChzdHJ1 Y3QgZnVuY3Rpb24gKmZuKSA6IGZ1biAoZm4pIHsgfQotCi0gIHZvaWQgaW5zZXJ0X3JhbmdlX2Fz c2VydGlvbnMgKCk7Ci0KLSAgLyogQ29udmVydCByYW5nZSBhc3NlcnRpb24gZXhwcmVzc2lvbnMg aW50byB0aGUgaW1wbGllZCBjb3BpZXMgYW5kCi0gICAgIGNvcHkgcHJvcGFnYXRlIGF3YXkgdGhl IGNvcGllcy4gICovCi0gIHZvaWQgcmVtb3ZlX3JhbmdlX2Fzc2VydGlvbnMgKCk7Ci0KLSAgLyog RHVtcCBhbGwgdGhlIHJlZ2lzdGVyZWQgYXNzZXJ0aW9ucyBmb3IgYWxsIHRoZSBuYW1lcyB0byBG SUxFLiAgKi8KLSAgdm9pZCBkdW1wIChGSUxFICopOwotCi0gIC8qIER1bXAgYWxsIHRoZSByZWdp c3RlcmVkIGFzc2VydGlvbnMgZm9yIE5BTUUgdG8gRklMRS4gICovCi0gIHZvaWQgZHVtcCAoRklM RSAqZmlsZSwgdHJlZSBuYW1lKTsKLQotICAvKiBEdW1wIGFsbCB0aGUgcmVnaXN0ZXJlZCBhc3Nl cnRpb25zIGZvciBOQU1FIHRvIHN0ZGVyci4gICovCi0gIHZvaWQgZGVidWcgKHRyZWUgbmFtZSkK LSAgewotICAgIGR1bXAgKHN0ZGVyciwgbmFtZSk7Ci0gIH0KLQotICAvKiBEdW1wIGFsbCB0aGUg cmVnaXN0ZXJlZCBhc3NlcnRpb25zIGZvciBhbGwgdGhlIG5hbWVzIHRvIHN0ZGVyci4gICovCi0g IHZvaWQgZGVidWcgKCkKLSAgewotICAgIGR1bXAgKHN0ZGVycik7Ci0gIH0KLQotcHJpdmF0ZToK LSAgLyogU2V0IG9mIFNTQSBuYW1lcyBmb3VuZCBsaXZlIGR1cmluZyB0aGUgUlBPIHRyYXZlcnNh bCBvZiB0aGUgZnVuY3Rpb24KLSAgICAgZm9yIHN0aWxsIGFjdGl2ZSBiYXNpYy1ibG9ja3MuICAq LwotICBsaXZlX25hbWVzIGxpdmU7Ci0KLSAgLyogRnVuY3Rpb24gdG8gd29yayBvbi4gICovCi0g IHN0cnVjdCBmdW5jdGlvbiAqZnVuOwotCi0gIC8qIElmIGJpdCBJIGlzIHByZXNlbnQsIGl0IG1l YW5zIHRoYXQgU1NBIG5hbWUgTl9pIGhhcyBhIGxpc3Qgb2YKLSAgICAgYXNzZXJ0aW9ucyB0aGF0 IHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUgSUwuICAqLwotICBiaXRtYXAgbmVlZF9hc3NlcnRf Zm9yOwotCi0gIC8qIEFycmF5IG9mIGxvY2F0aW9ucyBsaXN0cyB3aGVyZSB0byBpbnNlcnQgYXNz ZXJ0aW9ucy4gIEFTU0VSVFNfRk9SW0ldCi0gICAgIGhvbGRzIGEgbGlzdCBvZiBBU1NFUlRfTE9D VVNfVCBub2RlcyB0aGF0IGRlc2NyaWJlIHdoZXJlCi0gICAgIEFTU0VSVF9FWFBScyBmb3IgU1NB IG5hbWUgTl9JIHNob3VsZCBiZSBpbnNlcnRlZC4gICovCi0gIGFzc2VydF9sb2N1cyAqKmFzc2Vy dHNfZm9yOwotCi0gIC8qIEZpbmlzaCBmb3VuZCBBU1NFUlRTIGZvciBFIGFuZCByZWdpc3RlciB0 aGVtIGF0IEdTSS4gICovCi0gIHZvaWQgZmluaXNoX3JlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2ZvciAo ZWRnZSBlLCBnaW1wbGVfc3RtdF9pdGVyYXRvciBnc2ksCi0JCQkJCXZlYzxhc3NlcnRfaW5mbz4g JmFzc2VydHMpOwotCi0gIC8qIERldGVybWluZSB3aGV0aGVyIHRoZSBvdXRnb2luZyBlZGdlcyBv ZiBCQiBzaG91bGQgcmVjZWl2ZSBhbgotICAgICBBU1NFUlRfRVhQUiBmb3IgZWFjaCBvZiB0aGUg b3BlcmFuZHMgb2YgQkIncyBMQVNUIHN0YXRlbWVudC4gIFRoZQotICAgICBsYXN0IHN0YXRlbWVu dCBvZiBCQiBtdXN0IGJlIGEgU1dJVENIX0VYUFIuCi0KLSAgICAgSWYgYW55IG9mIHRoZSBzdWIt Z3JhcGhzIHJvb3RlZCBhdCBCQiBoYXZlIGFuIGludGVyZXN0aW5nIHVzZSBvZgotICAgICB0aGUg cHJlZGljYXRlIG9wZXJhbmRzLCBhbiBhc3NlcnQgbG9jYXRpb24gbm9kZSBpcyBhZGRlZCB0byB0 aGUKLSAgICAgbGlzdCBvZiBhc3NlcnRpb25zIGZvciB0aGUgY29ycmVzcG9uZGluZyBvcGVyYW5k cy4gICovCi0gIHZvaWQgZmluZF9zd2l0Y2hfYXNzZXJ0cyAoYmFzaWNfYmxvY2sgYmIsIGdzd2l0 Y2ggKmxhc3QpOwotCi0gIC8qIERvIGFuIFJQTyB3YWxrIG92ZXIgdGhlIGZ1bmN0aW9uIGNvbXB1 dGluZyBTU0EgbmFtZSBsaXZlbmVzcwotICAgICBvbi10aGUtZmx5IGFuZCBkZWNpZGluZyBvbiBh c3NlcnQgZXhwcmVzc2lvbnMgdG8gaW5zZXJ0LiAgKi8KLSAgdm9pZCBmaW5kX2Fzc2VydF9sb2Nh dGlvbnMgKCk7Ci0KLSAgLyogVHJhdmVyc2UgYWxsIHRoZSBzdGF0ZW1lbnRzIGluIGJsb2NrIEJC IGxvb2tpbmcgZm9yIHN0YXRlbWVudHMgdGhhdAotICAgICBtYXkgZ2VuZXJhdGUgdXNlZnVsIGFz c2VydGlvbnMgZm9yIHRoZSBTU0EgbmFtZXMgaW4gdGhlaXIgb3BlcmFuZC4KLSAgICAgU2VlIG1l dGhvZCBpbXBsZW1lbnRhdGlvbiBjb21lbnRhcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAqLwot ICB2b2lkIGZpbmRfYXNzZXJ0X2xvY2F0aW9uc19pbl9iYiAoYmFzaWNfYmxvY2sgYmIpOwotCi0g IC8qIERldGVybWluZSB3aGV0aGVyIHRoZSBvdXRnb2luZyBlZGdlcyBvZiBCQiBzaG91bGQgcmVj ZWl2ZSBhbgotICAgICBBU1NFUlRfRVhQUiBmb3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMgb2YgQkIn cyBMQVNUIHN0YXRlbWVudC4KLSAgICAgVGhlIGxhc3Qgc3RhdGVtZW50IG9mIEJCIG11c3QgYmUg YSBDT05EX0VYUFIuCi0KLSAgICAgSWYgYW55IG9mIHRoZSBzdWItZ3JhcGhzIHJvb3RlZCBhdCBC QiBoYXZlIGFuIGludGVyZXN0aW5nIHVzZSBvZgotICAgICB0aGUgcHJlZGljYXRlIG9wZXJhbmRz LCBhbiBhc3NlcnQgbG9jYXRpb24gbm9kZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgbGlzdCBvZiBh c3NlcnRpb25zIGZvciB0aGUgY29ycmVzcG9uZGluZyBvcGVyYW5kcy4gICovCi0gIHZvaWQgZmlu ZF9jb25kaXRpb25hbF9hc3NlcnRzIChiYXNpY19ibG9jayBiYiwgZ2NvbmQgKmxhc3QpOwotCi0g IC8qIFByb2Nlc3MgYWxsIHRoZSBpbnNlcnRpb25zIHJlZ2lzdGVyZWQgZm9yIGV2ZXJ5IG5hbWUg Tl9pIHJlZ2lzdGVyZWQKLSAgICAgaW4gTkVFRF9BU1NFUlRfRk9SLiAgVGhlIGxpc3Qgb2YgYXNz ZXJ0aW9ucyB0byBiZSBpbnNlcnRlZCBhcmUKLSAgICAgZm91bmQgaW4gQVNTRVJUU19GT1JbaV0u ICAqLwotICB2b2lkIHByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnMgKCk7Ci0KLSAgLyogSWYgTkFN RSBkb2Vzbid0IGhhdmUgYW4gQVNTRVJUX0VYUFIgcmVnaXN0ZXJlZCBmb3IgYXNzZXJ0aW5nCi0g ICAgICdFWFBSIENPTVBfQ09ERSBWQUwnIGF0IGEgbG9jYXRpb24gdGhhdCBkb21pbmF0ZXMgYmxv Y2sgQkIgb3IKLSAgICAgRS0+REVTVCwgdGhlbiByZWdpc3RlciB0aGlzIGxvY2F0aW9uIGFzIGEg cG9zc2libGUgaW5zZXJ0aW9uIHBvaW50Ci0gICAgIGZvciBBU1NFUlRfRVhQUiA8TkFNRSwgRVhQ UiBDT01QX0NPREUgVkFMPi4KLQotICAgICBCQiwgRSBhbmQgU0kgcHJvdmlkZSB0aGUgZXhhY3Qg aW5zZXJ0aW9uIHBvaW50IGZvciB0aGUgbmV3Ci0gICAgIEFTU0VSVF9FWFBSLiAgSWYgQkIgaXMg TlVMTCwgdGhlbiB0aGUgQVNTRVJUX0VYUFIgaXMgdG8gYmUgaW5zZXJ0ZWQKLSAgICAgb24gZWRn ZSBFLiAgT3RoZXJ3aXNlLCBpZiBFIGlzIE5VTEwsIHRoZSBBU1NFUlRfRVhQUiBpcyBpbnNlcnRl ZCBvbgotICAgICBCQi4gIElmIFNJIHBvaW50cyB0byBhIENPTkRfRVhQUiBvciBhIFNXSVRDSF9F WFBSIHN0YXRlbWVudCwgdGhlbiBFCi0gICAgIG11c3Qgbm90IGJlIE5VTEwuICAqLwotICB2b2lk IHJlZ2lzdGVyX25ld19hc3NlcnRfZm9yICh0cmVlIG5hbWUsIHRyZWUgZXhwciwKLQkJCQllbnVt IHRyZWVfY29kZSBjb21wX2NvZGUsCi0JCQkJdHJlZSB2YWwsIGJhc2ljX2Jsb2NrIGJiLAotCQkJ CWVkZ2UgZSwgZ2ltcGxlX3N0bXRfaXRlcmF0b3Igc2kpOwotCi0gIC8qIEdpdmVuIGEgQ09ORF9F WFBSIENPTkQgb2YgdGhlIGZvcm0gJ1YgT1AgVycsIGFuZCBhbiBTU0EgbmFtZSBWLAotICAgICBj cmVhdGUgYSBuZXcgU1NBIG5hbWUgTiBhbmQgcmV0dXJuIHRoZSBhc3NlcnRpb24gYXNzaWdubWVu dAotICAgICAnTiA9IEFTU0VSVF9FWFBSIDxWLCBWIE9QIFc+Jy4gICovCi0gIGdpbXBsZSAqYnVp bGRfYXNzZXJ0X2V4cHJfZm9yICh0cmVlIGNvbmQsIHRyZWUgdik7Ci0KLSAgLyogQ3JlYXRlIGFu IEFTU0VSVF9FWFBSIGZvciBOQU1FIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGxvY2F0aW9uCi0gICAg IGluZGljYXRlZCBieSBMT0MuICBSZXR1cm4gdHJ1ZSBpZiB3ZSBtYWRlIGFueSBlZGdlIGluc2Vy dGlvbnMuICAqLwotICBib29sIHByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnNfZm9yICh0cmVlIG5h bWUsIGFzc2VydF9sb2N1cyAqbG9jKTsKLQotICAvKiBRc29ydCBjYWxsYmFjayBmb3Igc29ydGlu ZyBhc3NlcnQgbG9jYXRpb25zLiAgKi8KLSAgdGVtcGxhdGUgPGJvb2wgc3RhYmxlPiBzdGF0aWMg aW50IGNvbXBhcmVfYXNzZXJ0X2xvYyAoY29uc3Qgdm9pZCAqLAotCQkJCQkJCWNvbnN0IHZvaWQg Kik7Ci0KLSAgLyogUmV0dXJuIGZhbHNlIGlmIEVYUFIgaXMgYSBwcmVkaWNhdGUgZXhwcmVzc2lv biBpbnZvbHZpbmcgZmxvYXRpbmcKLSAgICAgcG9pbnQgdmFsdWVzLiAgKi8KLSAgYm9vbCBmcF9w cmVkaWNhdGUgKGdpbXBsZSAqc3RtdCkKLSAgewotICAgIEdJTVBMRV9DSEVDSyAoc3RtdCwgR0lN UExFX0NPTkQpOwotICAgIHJldHVybiBGTE9BVF9UWVBFX1AgKFRSRUVfVFlQRSAoZ2ltcGxlX2Nv bmRfbGhzIChzdG10KSkpOwotICB9Ci0KLSAgYm9vbCBhbGxfaW1tX3VzZXNfaW5fc3RtdF9vcl9m ZWVkX2NvbmQgKHRyZWUgdmFyLCBnaW1wbGUgKnN0bXQsCi0JCQkJCSAgYmFzaWNfYmxvY2sgY29u ZF9iYik7Ci0KLSAgc3RhdGljIGludCBjb21wYXJlX2Nhc2VfbGFiZWxzIChjb25zdCB2b2lkICos IGNvbnN0IHZvaWQgKik7Ci19OwotCi0vKiBHaXZlbiBhIENPTkRfRVhQUiBDT05EIG9mIHRoZSBm b3JtICdWIE9QIFcnLCBhbmQgYW4gU1NBIG5hbWUgViwKLSAgIGNyZWF0ZSBhIG5ldyBTU0EgbmFt ZSBOIGFuZCByZXR1cm4gdGhlIGFzc2VydGlvbiBhc3NpZ25tZW50Ci0gICAnTiA9IEFTU0VSVF9F WFBSIDxWLCBWIE9QIFc+Jy4gICovCi0KLWdpbXBsZSAqCi12cnBfYXNzZXJ0czo6YnVpbGRfYXNz ZXJ0X2V4cHJfZm9yICh0cmVlIGNvbmQsIHRyZWUgdikKLXsKLSAgdHJlZSBhOwotICBnYXNzaWdu ICphc3NlcnRpb247Ci0KLSAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFICh2KSA9PSBTU0FfTkFNRQot CSAgICAgICYmIENPTVBBUklTT05fQ0xBU1NfUCAoY29uZCkpOwotCi0gIGEgPSBidWlsZDIgKEFT U0VSVF9FWFBSLCBUUkVFX1RZUEUgKHYpLCB2LCBjb25kKTsKLSAgYXNzZXJ0aW9uID0gZ2ltcGxl X2J1aWxkX2Fzc2lnbiAoTlVMTF9UUkVFLCBhKTsKLQotICAvKiBUaGUgbmV3IEFTU0VSVF9FWFBS LCBjcmVhdGVzIGEgbmV3IFNTQSBuYW1lIHRoYXQgcmVwbGFjZXMgdGhlCi0gICAgIG9wZXJhbmQg b2YgdGhlIEFTU0VSVF9FWFBSLiAgQ3JlYXRlIGl0IHNvIHRoZSBuZXcgbmFtZSBhbmQgdGhlIG9s ZCBvbmUKLSAgICAgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlIHJlcGxhY2VtZW50IHRhYmxlIHNvIHRo YXQgd2UgY2FuIGZpeCB0aGUgU1NBIHdlYgotICAgICBhZnRlciBhZGRpbmcgYWxsIHRoZSBBU1NF UlRfRVhQUnMuICAqLwotICB0cmVlIG5ld19kZWYgPSBjcmVhdGVfbmV3X2RlZl9mb3IgKHYsIGFz c2VydGlvbiwgTlVMTCk7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSBwcmVzZXJ2ZSBhYm5vcm1hbG5lc3Mg dGhyb3VnaG91dCBhbiBBU1NFUlRfRVhQUiBjaGFpbgotICAgICBnaXZlbiB3ZSBoYXZlIHRvIGJl IGFibGUgdG8gZnVsbHkgcHJvcGFnYXRlIHRob3NlIG91dCB0byByZS1jcmVhdGUKLSAgICAgdmFs aWQgU1NBIHdoZW4gcmVtb3ZpbmcgdGhlIGFzc2VydHMuICAqLwotICBpZiAoU1NBX05BTUVfT0ND VVJTX0lOX0FCTk9STUFMX1BISSAodikpCi0gICAgU1NBX05BTUVfT0NDVVJTX0lOX0FCTk9STUFM X1BISSAobmV3X2RlZikgPSAxOwotCi0gIHJldHVybiBhc3NlcnRpb247Ci19Ci0KLS8qIER1bXAg YWxsIHRoZSByZWdpc3RlcmVkIGFzc2VydGlvbnMgZm9yIE5BTUUgdG8gRklMRS4gICovCi0KLXZv aWQKLXZycF9hc3NlcnRzOjpkdW1wIChGSUxFICpmaWxlLCB0cmVlIG5hbWUpCi17Ci0gIGFzc2Vy dF9sb2N1cyAqbG9jOwotCi0gIGZwcmludGYgKGZpbGUsICJBc3NlcnRpb25zIHRvIGJlIGluc2Vy dGVkIGZvciAiKTsKLSAgcHJpbnRfZ2VuZXJpY19leHByIChmaWxlLCBuYW1lKTsKLSAgZnByaW50 ZiAoZmlsZSwgIlxuIik7Ci0KLSAgbG9jID0gYXNzZXJ0c19mb3JbU1NBX05BTUVfVkVSU0lPTiAo bmFtZSldOwotICB3aGlsZSAobG9jKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcdCIp OwotICAgICAgcHJpbnRfZ2ltcGxlX3N0bXQgKGZpbGUsIGdzaV9zdG10IChsb2MtPnNpKSwgMCk7 Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiXG5cdEJCICMlZCIsIGxvYy0+YmItPmluZGV4KTsKLSAg ICAgIGlmIChsb2MtPmUpCi0JewotCSAgZnByaW50ZiAoZmlsZSwgIlxuXHRFREdFICVkLT4lZCIs IGxvYy0+ZS0+c3JjLT5pbmRleCwKLQkgICAgICAgICAgIGxvYy0+ZS0+ZGVzdC0+aW5kZXgpOwot CSAgZHVtcF9lZGdlX2luZm8gKGZpbGUsIGxvYy0+ZSwgZHVtcF9mbGFncywgMCk7Ci0JfQotICAg ICAgZnByaW50ZiAoZmlsZSwgIlxuXHRQUkVESUNBVEU6ICIpOwotICAgICAgcHJpbnRfZ2VuZXJp Y19leHByIChmaWxlLCBsb2MtPmV4cHIpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlcyAiLCBn ZXRfdHJlZV9jb2RlX25hbWUgKGxvYy0+Y29tcF9jb2RlKSk7Ci0gICAgICBwcmludF9nZW5lcmlj X2V4cHIgKGZpbGUsIGxvYy0+dmFsKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcblxuIik7Ci0g ICAgICBsb2MgPSBsb2MtPm5leHQ7Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbGUsICJcbiIpOwot fQotCi0vKiBEdW1wIGFsbCB0aGUgcmVnaXN0ZXJlZCBhc3NlcnRpb25zIGZvciBhbGwgdGhlIG5h bWVzIHRvIEZJTEUuICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6ZHVtcCAoRklMRSAqZmlsZSkK LXsKLSAgdW5zaWduZWQgaTsKLSAgYml0bWFwX2l0ZXJhdG9yIGJpOwotCi0gIGZwcmludGYgKGZp bGUsICJcbkFTU0VSVF9FWFBScyB0byBiZSBpbnNlcnRlZFxuXG4iKTsKLSAgRVhFQ1VURV9JRl9T RVRfSU5fQklUTUFQIChuZWVkX2Fzc2VydF9mb3IsIDAsIGksIGJpKQotICAgIGR1bXAgKGZpbGUs IHNzYV9uYW1lIChpKSk7Ci0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotfQotCi0vKiBJZiBOQU1F IGRvZXNuJ3QgaGF2ZSBhbiBBU1NFUlRfRVhQUiByZWdpc3RlcmVkIGZvciBhc3NlcnRpbmcKLSAg ICdFWFBSIENPTVBfQ09ERSBWQUwnIGF0IGEgbG9jYXRpb24gdGhhdCBkb21pbmF0ZXMgYmxvY2sg QkIgb3IKLSAgIEUtPkRFU1QsIHRoZW4gcmVnaXN0ZXIgdGhpcyBsb2NhdGlvbiBhcyBhIHBvc3Np YmxlIGluc2VydGlvbiBwb2ludAotICAgZm9yIEFTU0VSVF9FWFBSIDxOQU1FLCBFWFBSIENPTVBf Q09ERSBWQUw+LgotCi0gICBCQiwgRSBhbmQgU0kgcHJvdmlkZSB0aGUgZXhhY3QgaW5zZXJ0aW9u IHBvaW50IGZvciB0aGUgbmV3Ci0gICBBU1NFUlRfRVhQUi4gIElmIEJCIGlzIE5VTEwsIHRoZW4g dGhlIEFTU0VSVF9FWFBSIGlzIHRvIGJlIGluc2VydGVkCi0gICBvbiBlZGdlIEUuICBPdGhlcndp c2UsIGlmIEUgaXMgTlVMTCwgdGhlIEFTU0VSVF9FWFBSIGlzIGluc2VydGVkIG9uCi0gICBCQi4g IElmIFNJIHBvaW50cyB0byBhIENPTkRfRVhQUiBvciBhIFNXSVRDSF9FWFBSIHN0YXRlbWVudCwg dGhlbiBFCi0gICBtdXN0IG5vdCBiZSBOVUxMLiAgKi8KLQotdm9pZAotdnJwX2Fzc2VydHM6OnJl Z2lzdGVyX25ld19hc3NlcnRfZm9yICh0cmVlIG5hbWUsIHRyZWUgZXhwciwKLQkJCQkgICAgICBl bnVtIHRyZWVfY29kZSBjb21wX2NvZGUsCi0JCQkJICAgICAgdHJlZSB2YWwsCi0JCQkJICAgICAg YmFzaWNfYmxvY2sgYmIsCi0JCQkJICAgICAgZWRnZSBlLAotCQkJCSAgICAgIGdpbXBsZV9zdG10 X2l0ZXJhdG9yIHNpKQotewotICBhc3NlcnRfbG9jdXMgKm4sICpsb2MsICpsYXN0X2xvYzsKLSAg YmFzaWNfYmxvY2sgZGVzdF9iYjsKLQotICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChiYiA9PSBOVUxM IHx8IGUgPT0gTlVMTCk7Ci0KLSAgaWYgKGUgPT0gTlVMTCkKLSAgICBnY2NfY2hlY2tpbmdfYXNz ZXJ0IChnaW1wbGVfY29kZSAoZ3NpX3N0bXQgKHNpKSkgIT0gR0lNUExFX0NPTkQKLQkJCSAmJiBn aW1wbGVfY29kZSAoZ3NpX3N0bXQgKHNpKSkgIT0gR0lNUExFX1NXSVRDSCk7Ci0KLSAgLyogTmV2 ZXIgYnVpbGQgYW4gYXNzZXJ0IGNvbXBhcmluZyBhZ2FpbnN0IGFuIGludGVnZXIgY29uc3RhbnQg d2l0aAotICAgICBUUkVFX09WRVJGTE9XIHNldC4gIFRoaXMgY29uZnVzZXMgb3VyIHVuZGVmaW5l ZCBvdmVyZmxvdyB3YXJuaW5nCi0gICAgIG1hY2hpbmVyeS4gICovCi0gIGlmIChUUkVFX09WRVJG TE9XX1AgKHZhbCkpCi0gICAgdmFsID0gZHJvcF90cmVlX292ZXJmbG93ICh2YWwpOwotCi0gIC8q IFRoZSBuZXcgYXNzZXJ0aW9uIEEgd2lsbCBiZSBpbnNlcnRlZCBhdCBCQiBvciBFLiAgV2UgbmVl ZCB0bwotICAgICBkZXRlcm1pbmUgaWYgdGhlIG5ldyBsb2NhdGlvbiBpcyBkb21pbmF0ZWQgYnkg YSBwcmV2aW91c2x5Ci0gICAgIHJlZ2lzdGVyZWQgbG9jYXRpb24gZm9yIEEuICBJZiB3ZSBhcmUg ZG9pbmcgYW4gZWRnZSBpbnNlcnRpb24sCi0gICAgIGFzc3VtZSB0aGF0IEEgd2lsbCBiZSBpbnNl cnRlZCBhdCBFLT5ERVNULiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90Ci0gICAgIG5lY2Vzc2FyaWx5 IHRydWUuCi0KLSAgICAgSWYgRSBpcyBhIGNyaXRpY2FsIGVkZ2UsIGl0IHdpbGwgYmUgc3BsaXQu ICBCdXQgZXZlbiBpZiBFIGlzCi0gICAgIHNwbGl0LCB0aGUgbmV3IGJsb2NrIHdpbGwgZG9taW5h dGUgdGhlIHNhbWUgc2V0IG9mIGJsb2NrcyB0aGF0Ci0gICAgIEUtPkRFU1QgZG9taW5hdGVzLgot Ci0gICAgIFRoZSByZXZlcnNlLCBob3dldmVyLCBpcyBub3QgdHJ1ZSwgYmxvY2tzIGRvbWluYXRl ZCBieSBFLT5ERVNUCi0gICAgIHdpbGwgbm90IGJlIGRvbWluYXRlZCBieSB0aGUgbmV3IGJsb2Nr IGNyZWF0ZWQgdG8gc3BsaXQgRS4gIFNvLAotICAgICBpZiB0aGUgaW5zZXJ0aW9uIGxvY2F0aW9u IGlzIG9uIGEgY3JpdGljYWwgZWRnZSwgd2Ugd2lsbCBub3QgdXNlCi0gICAgIHRoZSBuZXcgbG9j YXRpb24gdG8gbW92ZSBhbm90aGVyIGFzc2VydGlvbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKLSAg ICAgYXQgYSBibG9jayBkb21pbmF0ZWQgYnkgRS0+REVTVC4gICovCi0gIGRlc3RfYmIgPSAoYmIp ID8gYmIgOiBlLT5kZXN0OwotCi0gIC8qIElmIE5BTUUgYWxyZWFkeSBoYXMgYW4gQVNTRVJUX0VY UFIgcmVnaXN0ZXJlZCBmb3IgQ09NUF9DT0RFIGFuZAotICAgICBWQUwgYXQgYSBibG9jayBkb21p bmF0aW5nIERFU1RfQkIsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBpbnNlcnQgYSBuZXcKLSAgICAg b25lLiAgU2ltaWxhcmx5LCBpZiB0aGUgc2FtZSBhc3NlcnRpb24gYWxyZWFkeSBleGlzdHMgYXQg YSBibG9jawotICAgICBkb21pbmF0ZWQgYnkgREVTVF9CQiBhbmQgdGhlIG5ldyBsb2NhdGlvbiBp cyBub3Qgb24gYSBjcml0aWNhbAotICAgICBlZGdlLCB0aGVuIHVwZGF0ZSB0aGUgZXhpc3Rpbmcg bG9jYXRpb24gZm9yIHRoZSBhc3NlcnRpb24gKGkuZS4sCi0gICAgIG1vdmUgdGhlIGFzc2VydGlv biB1cCBpbiB0aGUgZG9taW5hbmNlIHRyZWUpLgotCi0gICAgIE5vdGUsIHRoaXMgaXMgaW1wbGVt ZW50ZWQgYXMgYSBzaW1wbGUgbGlua2VkIGxpc3QgYmVjYXVzZSB0aGVyZQotICAgICBzaG91bGQg bm90IGJlIG1vcmUgdGhhbiBhIGhhbmRmdWwgb2YgYXNzZXJ0aW9ucyByZWdpc3RlcmVkIHBlcgot ICAgICBuYW1lLiAgSWYgdGhpcyBiZWNvbWVzIGEgcGVyZm9ybWFuY2UgcHJvYmxlbSwgYSB0YWJs ZSBoYXNoZWQgYnkKLSAgICAgQ09NUF9DT0RFIGFuZCBWQUwgY291bGQgYmUgaW1wbGVtZW50ZWQu ICAqLwotICBsb2MgPSBhc3NlcnRzX2ZvcltTU0FfTkFNRV9WRVJTSU9OIChuYW1lKV07Ci0gIGxh c3RfbG9jID0gbG9jOwotICB3aGlsZSAobG9jKQotICAgIHsKLSAgICAgIGlmIChsb2MtPmNvbXBf Y29kZSA9PSBjb21wX2NvZGUKLQkgICYmIChsb2MtPnZhbCA9PSB2YWwKLQkgICAgICB8fCBvcGVy YW5kX2VxdWFsX3AgKGxvYy0+dmFsLCB2YWwsIDApKQotCSAgJiYgKGxvYy0+ZXhwciA9PSBleHBy Ci0JICAgICAgfHwgb3BlcmFuZF9lcXVhbF9wIChsb2MtPmV4cHIsIGV4cHIsIDApKSkKLQl7Ci0J ICAvKiBJZiBFIGlzIG5vdCBhIGNyaXRpY2FsIGVkZ2UgYW5kIERFU1RfQkIKLQkgICAgIGRvbWlu YXRlcyB0aGUgZXhpc3RpbmcgbG9jYXRpb24gZm9yIHRoZSBhc3NlcnRpb24sIG1vdmUKLQkgICAg IHRoZSBhc3NlcnRpb24gdXAgaW4gdGhlIGRvbWluYW5jZSB0cmVlIGJ5IHVwZGF0aW5nIGl0cwot CSAgICAgbG9jYXRpb24gaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKChlID09IE5VTEwgfHwgIUVE R0VfQ1JJVElDQUxfUCAoZSkpCi0JICAgICAgJiYgZG9taW5hdGVkX2J5X3AgKENESV9ET01JTkFU T1JTLCBsb2MtPmJiLCBkZXN0X2JiKSkKLQkgICAgewotCSAgICAgIGxvYy0+YmIgPSBkZXN0X2Ji OwotCSAgICAgIGxvYy0+ZSA9IGU7Ci0JICAgICAgbG9jLT5zaSA9IHNpOwotCSAgICAgIHJldHVy bjsKLQkgICAgfQotCX0KLQotICAgICAgLyogVXBkYXRlIHRoZSBsYXN0IG5vZGUgb2YgdGhlIGxp c3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25lLiAgKi8KLSAgICAgIGxhc3RfbG9jID0gbG9jOwot ICAgICAgbG9jID0gbG9jLT5uZXh0OwotICAgIH0KLQotICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBh biBhc3NlcnRpb24gYWxyZWFkeSByZWdpc3RlcmVkIGZvcgotICAgICBOQU1FIENPTVBfQ09ERSBW QUwsIGFkZCBhIG5ldyBvbmUgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZgotICAgICBhc3NlcnRp b25zIGFzc29jaWF0ZWQgd2l0aCBOQU1FLiAgKi8KLSAgbiA9IFhORVcgKHN0cnVjdCBhc3NlcnRf bG9jdXMpOwotICBuLT5iYiA9IGRlc3RfYmI7Ci0gIG4tPmUgPSBlOwotICBuLT5zaSA9IHNpOwot ICBuLT5jb21wX2NvZGUgPSBjb21wX2NvZGU7Ci0gIG4tPnZhbCA9IHZhbDsKLSAgbi0+ZXhwciA9 IGV4cHI7Ci0gIG4tPm5leHQgPSBOVUxMOwotCi0gIGlmIChsYXN0X2xvYykKLSAgICBsYXN0X2xv Yy0+bmV4dCA9IG47Ci0gIGVsc2UKLSAgICBhc3NlcnRzX2ZvcltTU0FfTkFNRV9WRVJTSU9OIChu YW1lKV0gPSBuOwotCi0gIGJpdG1hcF9zZXRfYml0IChuZWVkX2Fzc2VydF9mb3IsIFNTQV9OQU1F X1ZFUlNJT04gKG5hbWUpKTsKLX0KLQotLyogRmluaXNoIGZvdW5kIEFTU0VSVFMgZm9yIEUgYW5k IHJlZ2lzdGVyIHRoZW0gYXQgR1NJLiAgKi8KLQotdm9pZAotdnJwX2Fzc2VydHM6OmZpbmlzaF9y ZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3IgKGVkZ2UgZSwKLQkJCQkJICAgICAgZ2ltcGxlX3N0bXRf aXRlcmF0b3IgZ3NpLAotCQkJCQkgICAgICB2ZWM8YXNzZXJ0X2luZm8+ICZhc3NlcnRzKQotewot ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXNzZXJ0cy5sZW5ndGggKCk7ICsraSkKLSAgICAv KiBPbmx5IHJlZ2lzdGVyIGFuIEFTU0VSVF9FWFBSIGlmIE5BTUUgd2FzIGZvdW5kIGluIHRoZSBz dWItZ3JhcGgKLSAgICAgICByZWFjaGFibGUgZnJvbSBFLiAgKi8KLSAgICBpZiAobGl2ZS5saXZl X29uX2VkZ2VfcCAoYXNzZXJ0c1tpXS5uYW1lLCBlKSkKLSAgICAgIHJlZ2lzdGVyX25ld19hc3Nl cnRfZm9yIChhc3NlcnRzW2ldLm5hbWUsIGFzc2VydHNbaV0uZXhwciwKLQkJCSAgICAgICBhc3Nl cnRzW2ldLmNvbXBfY29kZSwgYXNzZXJ0c1tpXS52YWwsCi0JCQkgICAgICAgTlVMTCwgZSwgZ3Np KTsKLX0KLQotLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG91dGdvaW5nIGVkZ2VzIG9mIEJCIHNo b3VsZCByZWNlaXZlIGFuCi0gICBBU1NFUlRfRVhQUiBmb3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMg b2YgQkIncyBMQVNUIHN0YXRlbWVudC4KLSAgIFRoZSBsYXN0IHN0YXRlbWVudCBvZiBCQiBtdXN0 IGJlIGEgQ09ORF9FWFBSLgotCi0gICBJZiBhbnkgb2YgdGhlIHN1Yi1ncmFwaHMgcm9vdGVkIGF0 IEJCIGhhdmUgYW4gaW50ZXJlc3RpbmcgdXNlIG9mCi0gICB0aGUgcHJlZGljYXRlIG9wZXJhbmRz LCBhbiBhc3NlcnQgbG9jYXRpb24gbm9kZSBpcyBhZGRlZCB0byB0aGUKLSAgIGxpc3Qgb2YgYXNz ZXJ0aW9ucyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmFuZHMuICAqLwotCi12b2lkCi12cnBf YXNzZXJ0czo6ZmluZF9jb25kaXRpb25hbF9hc3NlcnRzIChiYXNpY19ibG9jayBiYiwgZ2NvbmQg Kmxhc3QpCi17Ci0gIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGJzaTsKLSAgdHJlZSBvcDsKLSAgZWRn ZV9pdGVyYXRvciBlaTsKLSAgZWRnZSBlOwotICBzc2Ffb3BfaXRlciBpdGVyOwotCi0gIGJzaSA9 IGdzaV9mb3Jfc3RtdCAobGFzdCk7Ci0KLSAgLyogTG9vayBmb3IgdXNlcyBvZiB0aGUgb3BlcmFu ZHMgaW4gZWFjaCBvZiB0aGUgc3ViLWdyYXBocwotICAgICByb290ZWQgYXQgQkIuICBXZSBuZWVk IHRvIGNoZWNrIGVhY2ggb2YgdGhlIG91dGdvaW5nIGVkZ2VzCi0gICAgIHNlcGFyYXRlbHksIHNv IHRoYXQgd2Uga25vdyB3aGF0IGtpbmQgb2YgQVNTRVJUX0VYUFIgdG8KLSAgICAgaW5zZXJ0LiAg Ki8KLSAgRk9SX0VBQ0hfRURHRSAoZSwgZWksIGJiLT5zdWNjcykKLSAgICB7Ci0gICAgICBpZiAo ZS0+ZGVzdCA9PSBiYikKLQljb250aW51ZTsKLQotICAgICAgLyogUmVnaXN0ZXIgdGhlIG5lY2Vz c2FyeSBhc3NlcnRpb25zIGZvciBlYWNoIG9wZXJhbmQgaW4gdGhlCi0JIGNvbmRpdGlvbmFsIHBy ZWRpY2F0ZS4gICovCi0gICAgICBhdXRvX3ZlYzxhc3NlcnRfaW5mbywgOD4gYXNzZXJ0czsKLSAg ICAgIEZPUl9FQUNIX1NTQV9UUkVFX09QRVJBTkQgKG9wLCBsYXN0LCBpdGVyLCBTU0FfT1BfVVNF KQotCXJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2ZvciAob3AsIGUsCi0JCQkJICBnaW1wbGVfY29uZF9j b2RlIChsYXN0KSwKLQkJCQkgIGdpbXBsZV9jb25kX2xocyAobGFzdCksCi0JCQkJICBnaW1wbGVf Y29uZF9yaHMgKGxhc3QpLCBhc3NlcnRzKTsKLSAgICAgIGZpbmlzaF9yZWdpc3Rlcl9lZGdlX2Fz c2VydF9mb3IgKGUsIGJzaSwgYXNzZXJ0cyk7Ci0gICAgfQotfQotCi0vKiBDb21wYXJlIHR3byBj YXNlIGxhYmVscyBzb3J0aW5nIGZpcnN0IGJ5IHRoZSBkZXN0aW5hdGlvbiBiYiBpbmRleAotICAg YW5kIHRoZW4gYnkgdGhlIGNhc2UgdmFsdWUuICAqLwotCi1pbnQKLXZycF9hc3NlcnRzOjpjb21w YXJlX2Nhc2VfbGFiZWxzIChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gIGNv bnN0IHN0cnVjdCBjYXNlX2luZm8gKmNpMSA9IChjb25zdCBzdHJ1Y3QgY2FzZV9pbmZvICopIHAx OwotICBjb25zdCBzdHJ1Y3QgY2FzZV9pbmZvICpjaTIgPSAoY29uc3Qgc3RydWN0IGNhc2VfaW5m byAqKSBwMjsKLSAgaW50IGlkeDEgPSBjaTEtPmJiLT5pbmRleDsKLSAgaW50IGlkeDIgPSBjaTIt PmJiLT5pbmRleDsKLQotICBpZiAoaWR4MSA8IGlkeDIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNl IGlmIChpZHgxID09IGlkeDIpCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZSBkZWZhdWx0 IGxhYmVsIGlzIGZpcnN0IGluIGEgZ3JvdXAuICAqLwotICAgICAgaWYgKCFDQVNFX0xPVyAoY2kx LT5leHByKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBlbHNlIGlmICghQ0FTRV9MT1cgKGNpMi0+ZXhw cikpCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHRyZWVfaW50X2NzdF9jb21wYXJl IChDQVNFX0xPVyAoY2kxLT5leHByKSwKLQkJCQkgICAgIENBU0VfTE9XIChjaTItPmV4cHIpKTsK LSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMTsKLX0KLQotLyogRGV0ZXJtaW5lIHdoZXRoZXIg dGhlIG91dGdvaW5nIGVkZ2VzIG9mIEJCIHNob3VsZCByZWNlaXZlIGFuCi0gICBBU1NFUlRfRVhQ UiBmb3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMgb2YgQkIncyBMQVNUIHN0YXRlbWVudC4KLSAgIFRo ZSBsYXN0IHN0YXRlbWVudCBvZiBCQiBtdXN0IGJlIGEgU1dJVENIX0VYUFIuCi0KLSAgIElmIGFu eSBvZiB0aGUgc3ViLWdyYXBocyByb290ZWQgYXQgQkIgaGF2ZSBhbiBpbnRlcmVzdGluZyB1c2Ug b2YKLSAgIHRoZSBwcmVkaWNhdGUgb3BlcmFuZHMsIGFuIGFzc2VydCBsb2NhdGlvbiBub2RlIGlz IGFkZGVkIHRvIHRoZQotICAgbGlzdCBvZiBhc3NlcnRpb25zIGZvciB0aGUgY29ycmVzcG9uZGlu ZyBvcGVyYW5kcy4gICovCi0KLXZvaWQKLXZycF9hc3NlcnRzOjpmaW5kX3N3aXRjaF9hc3NlcnRz IChiYXNpY19ibG9jayBiYiwgZ3N3aXRjaCAqbGFzdCkKLXsKLSAgZ2ltcGxlX3N0bXRfaXRlcmF0 b3IgYnNpOwotICB0cmVlIG9wOwotICBlZGdlIGU7Ci0gIHN0cnVjdCBjYXNlX2luZm8gKmNpOwot ICBzaXplX3QgbiA9IGdpbXBsZV9zd2l0Y2hfbnVtX2xhYmVscyAobGFzdCk7Ci0jaWYgR0NDX1ZF UlNJT04gPj0gNDAwMAotICB1bnNpZ25lZCBpbnQgaWR4OwotI2Vsc2UKLSAgLyogV29yayBhcm91 bmQgR0NDIDMuNCBidWcgKFBSIDM3MDg2KS4gICovCi0gIHZvbGF0aWxlIHVuc2lnbmVkIGludCBp ZHg7Ci0jZW5kaWYKLQotICBic2kgPSBnc2lfZm9yX3N0bXQgKGxhc3QpOwotICBvcCA9IGdpbXBs ZV9zd2l0Y2hfaW5kZXggKGxhc3QpOwotICBpZiAoVFJFRV9DT0RFIChvcCkgIT0gU1NBX05BTUUp Ci0gICAgcmV0dXJuOwotCi0gIC8qIEJ1aWxkIGEgdmVjdG9yIG9mIGNhc2UgbGFiZWxzIHNvcnRl ZCBieSBkZXN0aW5hdGlvbiBsYWJlbC4gICovCi0gIGNpID0gWE5FV1ZFQyAoc3RydWN0IGNhc2Vf aW5mbywgbik7Ci0gIGZvciAoaWR4ID0gMDsgaWR4IDwgbjsgKytpZHgpCi0gICAgewotICAgICAg Y2lbaWR4XS5leHByID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAobGFzdCwgaWR4KTsKLSAgICAgIGNp W2lkeF0uYmIgPSBsYWJlbF90b19ibG9jayAoZnVuLCBDQVNFX0xBQkVMIChjaVtpZHhdLmV4cHIp KTsKLSAgICB9Ci0gIGVkZ2UgZGVmYXVsdF9lZGdlID0gZmluZF9lZGdlIChiYiwgY2lbMF0uYmIp OwotICBxc29ydCAoY2ksIG4sIHNpemVvZiAoc3RydWN0IGNhc2VfaW5mbyksIGNvbXBhcmVfY2Fz ZV9sYWJlbHMpOwotCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgbjsgKytpZHgpCi0gICAgewotICAg ICAgdHJlZSBtaW4sIG1heDsKLSAgICAgIHRyZWUgY2wgPSBjaVtpZHhdLmV4cHI7Ci0gICAgICBi YXNpY19ibG9jayBjYmIgPSBjaVtpZHhdLmJiOwotCi0gICAgICBtaW4gPSBDQVNFX0xPVyAoY2wp OwotICAgICAgbWF4ID0gQ0FTRV9ISUdIIChjbCk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBt dWx0aXBsZSBjYXNlIGxhYmVscyB3aXRoIHRoZSBzYW1lIGRlc3RpbmF0aW9uCi0JIHdlIG5lZWQg dG8gY29tYmluZSB0aGVtIHRvIGEgc2luZ2xlIHZhbHVlIHJhbmdlIGZvciB0aGUgZWRnZS4gICov Ci0gICAgICBpZiAoaWR4ICsgMSA8IG4gJiYgY2JiID09IGNpW2lkeCArIDFdLmJiKQotCXsKLQkg IC8qIFNraXAgbGFiZWxzIHVudGlsIHRoZSBsYXN0IG9mIHRoZSBncm91cC4gICovCi0JICBkbyB7 Ci0JICAgICsraWR4OwotCSAgfSB3aGlsZSAoaWR4IDwgbiAmJiBjYmIgPT0gY2lbaWR4XS5iYik7 Ci0JICAtLWlkeDsKLQotCSAgLyogUGljayB1cCB0aGUgbWF4aW11bSBvZiB0aGUgY2FzZSBsYWJl bCByYW5nZS4gICovCi0JICBpZiAoQ0FTRV9ISUdIIChjaVtpZHhdLmV4cHIpKQotCSAgICBtYXgg PSBDQVNFX0hJR0ggKGNpW2lkeF0uZXhwcik7Ci0JICBlbHNlCi0JICAgIG1heCA9IENBU0VfTE9X IChjaVtpZHhdLmV4cHIpOwotCX0KLQotICAgICAgLyogQ2FuJ3QgZXh0cmFjdCBhIHVzZWZ1bCBh c3NlcnRpb24gb3V0IG9mIGEgcmFuZ2UgdGhhdCBpbmNsdWRlcyB0aGUKLQkgZGVmYXVsdCBsYWJl bC4gICovCi0gICAgICBpZiAobWluID09IE5VTExfVFJFRSkKLQljb250aW51ZTsKLQotICAgICAg LyogRmluZCB0aGUgZWRnZSB0byByZWdpc3RlciB0aGUgYXNzZXJ0IGV4cHIgb24uICAqLwotICAg ICAgZSA9IGZpbmRfZWRnZSAoYmIsIGNiYik7Ci0KLSAgICAgIC8qIFJlZ2lzdGVyIHRoZSBuZWNl c3NhcnkgYXNzZXJ0aW9ucyBmb3IgdGhlIG9wZXJhbmQgaW4gdGhlCi0JIFNXSVRDSF9FWFBSLiAg Ki8KLSAgICAgIGF1dG9fdmVjPGFzc2VydF9pbmZvLCA4PiBhc3NlcnRzOwotICAgICAgcmVnaXN0 ZXJfZWRnZV9hc3NlcnRfZm9yIChvcCwgZSwKLQkJCQltYXggPyBHRV9FWFBSIDogRVFfRVhQUiwK LQkJCQlvcCwgZm9sZF9jb252ZXJ0IChUUkVFX1RZUEUgKG9wKSwgbWluKSwKLQkJCQlhc3NlcnRz KTsKLSAgICAgIGlmIChtYXgpCi0JcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yIChvcCwgZSwgTEVf RVhQUiwgb3AsCi0JCQkJICBmb2xkX2NvbnZlcnQgKFRSRUVfVFlQRSAob3ApLCBtYXgpLAotCQkJ CSAgYXNzZXJ0cyk7Ci0gICAgICBmaW5pc2hfcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yIChlLCBi c2ksIGFzc2VydHMpOwotICAgIH0KLQotICBYREVMRVRFVkVDIChjaSk7Ci0KLSAgaWYgKCFsaXZl LmxpdmVfb25fZWRnZV9wIChvcCwgZGVmYXVsdF9lZGdlKSkKLSAgICByZXR1cm47Ci0KLSAgLyog Tm93IHJlZ2lzdGVyIGFsb25nIHRoZSBkZWZhdWx0IGxhYmVsIGFzc2VydGlvbnMgdGhhdCBjb3Jy ZXNwb25kIHRvIHRoZQotICAgICBhbnRpLXJhbmdlIG9mIGVhY2ggbGFiZWwuICAqLwotICBpbnQg aW5zZXJ0aW9uX2xpbWl0ID0gcGFyYW1fbWF4X3ZycF9zd2l0Y2hfYXNzZXJ0aW9uczsKLSAgaWYg KGluc2VydGlvbl9saW1pdCA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBXZSBjYW4ndCBkbyB0 aGlzIGlmIHRoZSBkZWZhdWx0IGNhc2Ugc2hhcmVzIGEgbGFiZWwgd2l0aCBhbm90aGVyIGNhc2Uu ICAqLwotICB0cmVlIGRlZmF1bHRfY2wgPSBnaW1wbGVfc3dpdGNoX2RlZmF1bHRfbGFiZWwgKGxh c3QpOwotICBmb3IgKGlkeCA9IDE7IGlkeCA8IG47IGlkeCsrKQotICAgIHsKLSAgICAgIHRyZWUg bWluLCBtYXg7Ci0gICAgICB0cmVlIGNsID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAobGFzdCwgaWR4 KTsKLSAgICAgIGlmIChDQVNFX0xBQkVMIChjbCkgPT0gQ0FTRV9MQUJFTCAoZGVmYXVsdF9jbCkp Ci0JY29udGludWU7Ci0KLSAgICAgIG1pbiA9IENBU0VfTE9XIChjbCk7Ci0gICAgICBtYXggPSBD QVNFX0hJR0ggKGNsKTsKLQotICAgICAgLyogQ29tYmluZSBjb250aWd1b3VzIGNhc2UgcmFuZ2Vz IHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGFzc2VydGlvbnMKLQkgdG8gaW5zZXJ0LiAgKi8KLSAg ICAgIGZvciAoaWR4ID0gaWR4ICsgMTsgaWR4IDwgbjsgaWR4KyspCi0JewotCSAgdHJlZSBuZXh0 X21pbiwgbmV4dF9tYXg7Ci0JICB0cmVlIG5leHRfY2wgPSBnaW1wbGVfc3dpdGNoX2xhYmVsIChs YXN0LCBpZHgpOwotCSAgaWYgKENBU0VfTEFCRUwgKG5leHRfY2wpID09IENBU0VfTEFCRUwgKGRl ZmF1bHRfY2wpKQotCSAgICBicmVhazsKLQotCSAgbmV4dF9taW4gPSBDQVNFX0xPVyAobmV4dF9j bCk7Ci0JICBuZXh0X21heCA9IENBU0VfSElHSCAobmV4dF9jbCk7Ci0KLQkgIHdpZGVfaW50IGRp ZmZlcmVuY2UgPSAod2k6OnRvX3dpZGUgKG5leHRfbWluKQotCQkJCSAtIHdpOjp0b193aWRlICht YXggPyBtYXggOiBtaW4pKTsKLQkgIGlmICh3aTo6ZXFfcCAoZGlmZmVyZW5jZSwgMSkpCi0JICAg IG1heCA9IG5leHRfbWF4ID8gbmV4dF9tYXggOiBuZXh0X21pbjsKLQkgIGVsc2UKLQkgICAgYnJl YWs7Ci0JfQotICAgICAgaWR4LS07Ci0KLSAgICAgIGlmIChtYXggPT0gTlVMTF9UUkVFKQotCXsK LQkgIC8qIFJlZ2lzdGVyIHRoZSBhc3NlcnRpb24gT1AgIT0gTUlOLiAgKi8KLQkgIGF1dG9fdmVj PGFzc2VydF9pbmZvLCA4PiBhc3NlcnRzOwotCSAgbWluID0gZm9sZF9jb252ZXJ0IChUUkVFX1RZ UEUgKG9wKSwgbWluKTsKLQkgIHJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2ZvciAob3AsIGRlZmF1bHRf ZWRnZSwgTkVfRVhQUiwgb3AsIG1pbiwKLQkJCQkgICAgYXNzZXJ0cyk7Ci0JICBmaW5pc2hfcmVn aXN0ZXJfZWRnZV9hc3NlcnRfZm9yIChkZWZhdWx0X2VkZ2UsIGJzaSwgYXNzZXJ0cyk7Ci0JfQot ICAgICAgZWxzZQotCXsKLQkgIC8qIFJlZ2lzdGVyIHRoZSBhc3NlcnRpb24gKHVuc2lnbmVkKU9Q IC0gTUlOID4gKE1BWCAtIE1JTiksCi0JICAgICB3aGljaCB3aWxsIGdpdmUgT1AgdGhlIGFudGkt cmFuZ2UgfltNSU4sTUFYXS4gICovCi0JICB0cmVlIHVvcCA9IGZvbGRfY29udmVydCAodW5zaWdu ZWRfdHlwZV9mb3IgKFRSRUVfVFlQRSAob3ApKSwgb3ApOwotCSAgbWluID0gZm9sZF9jb252ZXJ0 IChUUkVFX1RZUEUgKHVvcCksIG1pbik7Ci0JICBtYXggPSBmb2xkX2NvbnZlcnQgKFRSRUVfVFlQ RSAodW9wKSwgbWF4KTsKLQotCSAgdHJlZSBsaHMgPSBmb2xkX2J1aWxkMiAoTUlOVVNfRVhQUiwg VFJFRV9UWVBFICh1b3ApLCB1b3AsIG1pbik7Ci0JICB0cmVlIHJocyA9IGludF9jb25zdF9iaW5v cCAoTUlOVVNfRVhQUiwgbWF4LCBtaW4pOwotCSAgcmVnaXN0ZXJfbmV3X2Fzc2VydF9mb3IgKG9w LCBsaHMsIEdUX0VYUFIsIHJocywKLQkJCQkgICBOVUxMLCBkZWZhdWx0X2VkZ2UsIGJzaSk7Ci0J fQotCi0gICAgICBpZiAoLS1pbnNlcnRpb25fbGltaXQgPT0gMCkKLQlicmVhazsKLSAgICB9Ci19 Ci0KLS8qIFRyYXZlcnNlIGFsbCB0aGUgc3RhdGVtZW50cyBpbiBibG9jayBCQiBsb29raW5nIGZv ciBzdGF0ZW1lbnRzIHRoYXQKLSAgIG1heSBnZW5lcmF0ZSB1c2VmdWwgYXNzZXJ0aW9ucyBmb3Ig dGhlIFNTQSBuYW1lcyBpbiB0aGVpciBvcGVyYW5kLgotICAgSWYgYSBzdGF0ZW1lbnQgcHJvZHVj ZXMgYSB1c2VmdWwgYXNzZXJ0aW9uIEEgZm9yIG5hbWUgTl9pLCB0aGVuIHRoZQotICAgbGlzdCBv ZiBhc3NlcnRpb25zIGFscmVhZHkgZ2VuZXJhdGVkIGZvciBOX2kgaXMgc2Nhbm5lZCB0bwotICAg ZGV0ZXJtaW5lIGlmIEEgaXMgYWN0dWFsbHkgbmVlZGVkLgotCi0gICBJZiBOX2kgYWxyZWFkeSBo YWQgdGhlIGFzc2VydGlvbiBBIGF0IGEgbG9jYXRpb24gZG9taW5hdGluZyB0aGUKLSAgIGN1cnJl bnQgbG9jYXRpb24sIHRoZW4gbm90aGluZyBuZWVkcyB0byBiZSBkb25lLiAgT3RoZXJ3aXNlLCB0 aGUKLSAgIG5ldyBsb2NhdGlvbiBmb3IgQSBpcyByZWNvcmRlZCBpbnN0ZWFkLgotCi0gICAxLSBG b3IgZXZlcnkgc3RhdGVtZW50IFMgaW4gQkIsIGFsbCB0aGUgdmFyaWFibGVzIHVzZWQgYnkgUyBh cmUKLSAgICAgIGFkZGVkIHRvIGJpdG1hcCBGT1VORF9JTl9TVUJHUkFQSC4KLQotICAgMi0gSWYg c3RhdGVtZW50IFMgdXNlcyBhbiBvcGVyYW5kIE4gaW4gYSB3YXkgdGhhdCBleHBvc2VzIGEga25v d24KLSAgICAgIHZhbHVlIHJhbmdlIGZvciBOLCB0aGVuIGlmIE4gd2FzIG5vdCBhbHJlYWR5IGdl bmVyYXRlZCBieSBhbgotICAgICAgQVNTRVJUX0VYUFIsIGNyZWF0ZSBhIG5ldyBhc3NlcnQgbG9j YXRpb24gZm9yIE4uICBGb3IgaW5zdGFuY2UsCi0gICAgICBpZiBOIGlzIGEgcG9pbnRlciBhbmQg dGhlIHN0YXRlbWVudCBkZXJlZmVyZW5jZXMgaXQsIHdlIGNhbgotICAgICAgYXNzdW1lIHRoYXQg TiBpcyBub3QgTlVMTC4KLQotICAgMy0gQ09ORF9FWFBScyBhcmUgYSBzcGVjaWFsIGNhc2Ugb2Yg IzIuICBXZSBjYW4gZGVyaXZlIHJhbmdlCi0gICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwcmVk aWNhdGUgYnV0IG5lZWQgdG8gaW5zZXJ0IGRpZmZlcmVudAotICAgICAgQVNTRVJUX0VYUFJzIGZv ciBlYWNoIG9mIHRoZSBzdWItZ3JhcGhzIHJvb3RlZCBhdCB0aGUKLSAgICAgIGNvbmRpdGlvbmFs IGJsb2NrLiAgSWYgdGhlIGxhc3Qgc3RhdGVtZW50IG9mIEJCIGlzIGEgY29uZGl0aW9uYWwKLSAg ICAgIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gJ1ggb3AgWScsIHRoZW4KLQotICAgICAgYSkgUmVt b3ZlIFggYW5kIFkgZnJvbSB0aGUgc2V0IEZPVU5EX0lOX1NVQkdSQVBILgotCi0gICAgICBiKSBJ ZiB0aGUgY29uZGl0aW9uYWwgaXMgdGhlIG9ubHkgZW50cnkgcG9pbnQgdG8gdGhlIHN1Yi1ncmFw aAotCSBjb3JyZXNwb25kaW5nIHRvIHRoZSBUSEVOX0NMQVVTRSwgcmVjdXJzZSBpbnRvIGl0LiAg T24KLQkgcmV0dXJuLCBpZiBYIGFuZC9vciBZIGFyZSBtYXJrZWQgaW4gRk9VTkRfSU5fU1VCR1JB UEgsIHRoZW4KLQkgYW4gQVNTRVJUX0VYUFIgaXMgYWRkZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5n IHZhcmlhYmxlLgotCi0gICAgICBjKSBSZXBlYXQgc3RlcCAoYikgb24gdGhlIEVMU0VfQ0xBVVNF LgotCi0gICAgICBkKSBNYXJrIFggYW5kIFkgaW4gRk9VTkRfSU5fU1VCR1JBUEguCi0KLSAgICAg IEZvciBpbnN0YW5jZSwKLQotCSAgICBpZiAoYSA9PSA5KQotCSAgICAgIGIgPSBhOwotCSAgICBl bHNlCi0JICAgICAgYiA9IGMgKyAxOwotCi0gICAgICBJbiB0aGlzIGNhc2UsIGFuIGFzc2VydGlv biBvbiB0aGUgVEhFTiBjbGF1c2UgaXMgdXNlZnVsIHRvCi0gICAgICBkZXRlcm1pbmUgdGhhdCAn YScgaXMgYWx3YXlzIDkgb24gdGhhdCBlZGdlLiAgSG93ZXZlciwgYW4gYXNzZXJ0aW9uCi0gICAg ICBvbiB0aGUgRUxTRSBjbGF1c2Ugd291bGQgYmUgdW5uZWNlc3NhcnkuCi0KLSAgIDQtIElmIEJC IGRvZXMgbm90IGVuZCBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24sIHRoZW4gd2UgcmVjdXJz ZQotICAgICAgaW50byBCQidzIGRvbWluYXRvciBjaGlsZHJlbi4KLQotICAgQXQgdGhlIGVuZCBv ZiB0aGUgcmVjdXJzaXZlIHRyYXZlcnNhbCwgZXZlcnkgU1NBIG5hbWUgd2lsbCBoYXZlIGEKLSAg IGxpc3Qgb2YgbG9jYXRpb25zIHdoZXJlIEFTU0VSVF9FWFBScyBzaG91bGQgYmUgYWRkZWQuICBX aGVuIGEgbmV3Ci0gICBsb2NhdGlvbiBmb3IgbmFtZSBOIGlzIGZvdW5kLCBpdCBpcyByZWdpc3Rl cmVkIGJ5IGNhbGxpbmcKLSAgIHJlZ2lzdGVyX25ld19hc3NlcnRfZm9yLiAgVGhhdCBmdW5jdGlv biBrZWVwcyB0cmFjayBvZiBhbGwgdGhlCi0gICByZWdpc3RlcmVkIGFzc2VydGlvbnMgdG8gcHJl dmVudCBhZGRpbmcgdW5uZWNlc3NhcnkgYXNzZXJ0aW9ucy4KLSAgIEZvciBpbnN0YW5jZSwgaWYg YSBwb2ludGVyIFBfNCBpcyBkZXJlZmVyZW5jZWQgbW9yZSB0aGFuIG9uY2UgaW4gYQotICAgZG9t aW5hdG9yIHRyZWUsIG9ubHkgdGhlIGxvY2F0aW9uIGRvbWluYXRpbmcgYWxsIHRoZSBkZXJlZmVy ZW5jZSBvZgotICAgUF80IHdpbGwgcmVjZWl2ZSBhbiBBU1NFUlRfRVhQUi4gICovCi0KLXZvaWQK LXZycF9hc3NlcnRzOjpmaW5kX2Fzc2VydF9sb2NhdGlvbnNfaW5fYmIgKGJhc2ljX2Jsb2NrIGJi KQotewotICBnaW1wbGUgKmxhc3Q7Ci0KLSAgbGFzdCA9IGxhc3Rfc3RtdCAoYmIpOwotCi0gIC8q IElmIEJCJ3MgbGFzdCBzdGF0ZW1lbnQgaXMgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgaW52b2x2 aW5nIGludGVnZXIKLSAgICAgb3BlcmFuZHMsIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGFkZCBB U1NFUlRfRVhQUnMuICAqLwotICBpZiAobGFzdAotICAgICAgJiYgZ2ltcGxlX2NvZGUgKGxhc3Qp ID09IEdJTVBMRV9DT05ECi0gICAgICAmJiAhZnBfcHJlZGljYXRlIChsYXN0KQotICAgICAgJiYg IVpFUk9fU1NBX09QRVJBTkRTIChsYXN0LCBTU0FfT1BfVVNFKSkKLSAgICBmaW5kX2NvbmRpdGlv bmFsX2Fzc2VydHMgKGJiLCBhc19hIDxnY29uZCAqPiAobGFzdCkpOwotCi0gIC8qIElmIEJCJ3Mg bGFzdCBzdGF0ZW1lbnQgaXMgYSBzd2l0Y2ggc3RhdGVtZW50IGludm9sdmluZyBpbnRlZ2VyCi0g ICAgIG9wZXJhbmRzLCBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBhZGQgQVNTRVJUX0VYUFJzLiAg Ki8KLSAgaWYgKGxhc3QKLSAgICAgICYmIGdpbXBsZV9jb2RlIChsYXN0KSA9PSBHSU1QTEVfU1dJ VENICi0gICAgICAmJiAhWkVST19TU0FfT1BFUkFORFMgKGxhc3QsIFNTQV9PUF9VU0UpKQotICAg IGZpbmRfc3dpdGNoX2Fzc2VydHMgKGJiLCBhc19hIDxnc3dpdGNoICo+IChsYXN0KSk7Ci0KLSAg LyogVHJhdmVyc2UgYWxsIHRoZSBzdGF0ZW1lbnRzIGluIEJCIG1hcmtpbmcgdXNlZCBuYW1lcyBh bmQgbG9va2luZwotICAgICBmb3Igc3RhdGVtZW50cyB0aGF0IG1heSBpbmZlciBhc3NlcnRpb25z IGZvciB0aGVpciB1c2VkIG9wZXJhbmRzLiAgKi8KLSAgZm9yIChnaW1wbGVfc3RtdF9pdGVyYXRv ciBzaSA9IGdzaV9sYXN0X2JiIChiYik7ICFnc2lfZW5kX3AgKHNpKTsKLSAgICAgICBnc2lfcHJl diAoJnNpKSkKLSAgICB7Ci0gICAgICBnaW1wbGUgKnN0bXQ7Ci0gICAgICB0cmVlIG9wOwotICAg ICAgc3NhX29wX2l0ZXIgaTsKLQotICAgICAgc3RtdCA9IGdzaV9zdG10IChzaSk7Ci0KLSAgICAg IGlmIChpc19naW1wbGVfZGVidWcgKHN0bXQpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUg aWYgd2UgY2FuIGRlcml2ZSBhbiBhc3NlcnRpb24gZm9yIGFueSBvZiBTVE1UJ3Mgb3BlcmFuZHMu ICAqLwotICAgICAgRk9SX0VBQ0hfU1NBX1RSRUVfT1BFUkFORCAob3AsIHN0bXQsIGksIFNTQV9P UF9VU0UpCi0JewotCSAgdHJlZSB2YWx1ZTsKLQkgIGVudW0gdHJlZV9jb2RlIGNvbXBfY29kZTsK LQotCSAgLyogSWYgb3AgaXMgbm90IGxpdmUgYmV5b25kIHRoaXMgc3RtdCwgZG8gbm90IGJvdGhl ciB0byBpbnNlcnQKLQkgICAgIGFzc2VydHMgZm9yIGl0LiAgKi8KLQkgIGlmICghbGl2ZS5saXZl X29uX2Jsb2NrX3AgKG9wLCBiYikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiBPUCBpcyB1 c2VkIGluIHN1Y2ggYSB3YXkgdGhhdCB3ZSBjYW4gaW5mZXIgYSB2YWx1ZQotCSAgICAgcmFuZ2Ug Zm9yIGl0LCBhbmQgd2UgZG9uJ3QgZmluZCBhIHByZXZpb3VzIGFzc2VydGlvbiBmb3IKLQkgICAg IGl0LCBjcmVhdGUgYSBuZXcgYXNzZXJ0aW9uIGxvY2F0aW9uIG5vZGUgZm9yIE9QLiAgKi8KLQkg IGlmIChpbmZlcl92YWx1ZV9yYW5nZSAoc3RtdCwgb3AsICZjb21wX2NvZGUsICZ2YWx1ZSkpCi0J ICAgIHsKLQkgICAgICAvKiBJZiB3ZSBhcmUgYWJsZSB0byBpbmZlciBhIG5vbnplcm8gdmFsdWUg cmFuZ2UgZm9yIE9QLAotCQkgdGhlbiB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB1c2UtZGVm IGNoYWluIHRvIHNlZSBpZiBPUAotCQkgd2FzIHNldCB2aWEgYSB0eXBlY2FzdC4KLQotCQkgSWYg c28sIHRoZW4gd2UgY2FuIGFsc28gaW5mZXIgYSBub256ZXJvIHZhbHVlIHJhbmdlCi0JCSBmb3Ig dGhlIG9wZXJhbmQgb2YgdGhlIE5PUF9FWFBSLiAgKi8KLQkgICAgICBpZiAoY29tcF9jb2RlID09 IE5FX0VYUFIgJiYgaW50ZWdlcl96ZXJvcCAodmFsdWUpKQotCQl7Ci0JCSAgdHJlZSB0ID0gb3A7 Ci0JCSAgZ2ltcGxlICpkZWZfc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UICh0KTsKLQotCQkgIHdo aWxlIChpc19naW1wbGVfYXNzaWduIChkZWZfc3RtdCkKLQkJCSAmJiBDT05WRVJUX0VYUFJfQ09E RV9QCi0JCQkgICAgIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChkZWZfc3RtdCkpCi0JCQkgJiYg VFJFRV9DT0RFCi0JCQkgICAgIChnaW1wbGVfYXNzaWduX3JoczEgKGRlZl9zdG10KSkgPT0gU1NB X05BTUUKLQkJCSAmJiBQT0lOVEVSX1RZUEVfUAotCQkJICAgICAoVFJFRV9UWVBFIChnaW1wbGVf YXNzaWduX3JoczEgKGRlZl9zdG10KSkpKQotCQkgICAgewotCQkgICAgICB0ID0gZ2ltcGxlX2Fz c2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0JCSAgICAgIGRlZl9zdG10ID0gU1NBX05BTUVfREVGX1NU TVQgKHQpOwotCi0JCSAgICAgIC8qIE5vdGUgd2Ugd2FudCB0byByZWdpc3RlciB0aGUgYXNzZXJ0 IGZvciB0aGUKLQkJCSBvcGVyYW5kIG9mIHRoZSBOT1BfRVhQUiBhZnRlciBTSSwgbm90IGFmdGVy IHRoZQotCQkJIGNvbnZlcnNpb24uICAqLwotCQkgICAgICBpZiAobGl2ZS5saXZlX29uX2Jsb2Nr X3AgKHQsIGJiKSkKLQkJCXJlZ2lzdGVyX25ld19hc3NlcnRfZm9yICh0LCB0LCBjb21wX2NvZGUs IHZhbHVlLAotCQkJCQkJIGJiLCBOVUxMLCBzaSk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHJl Z2lzdGVyX25ld19hc3NlcnRfZm9yIChvcCwgb3AsIGNvbXBfY29kZSwgdmFsdWUsIGJiLCBOVUxM LCBzaSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFVwZGF0ZSBsaXZlLiAgKi8KLSAgICAgIEZP Ul9FQUNIX1NTQV9UUkVFX09QRVJBTkQgKG9wLCBzdG10LCBpLCBTU0FfT1BfVVNFKQotCWxpdmUu c2V0IChvcCwgYmIpOwotICAgICAgRk9SX0VBQ0hfU1NBX1RSRUVfT1BFUkFORCAob3AsIHN0bXQs IGksIFNTQV9PUF9ERUYpCi0JbGl2ZS5jbGVhciAob3AsIGJiKTsKLSAgICB9Ci0KLSAgLyogVHJh dmVyc2UgYWxsIFBISSBub2RlcyBpbiBCQiwgdXBkYXRpbmcgbGl2ZS4gICovCi0gIGZvciAoZ3Bo aV9pdGVyYXRvciBzaSA9IGdzaV9zdGFydF9waGlzIChiYik7ICFnc2lfZW5kX3AgKHNpKTsKLSAg ICAgICBnc2lfbmV4dCAoJnNpKSkKLSAgICB7Ci0gICAgICB1c2Vfb3BlcmFuZF9wIGFyZ19wOwot ICAgICAgc3NhX29wX2l0ZXIgaTsKLSAgICAgIGdwaGkgKnBoaSA9IHNpLnBoaSAoKTsKLSAgICAg IHRyZWUgcmVzID0gZ2ltcGxlX3BoaV9yZXN1bHQgKHBoaSk7Ci0KLSAgICAgIGlmICh2aXJ0dWFs X29wZXJhbmRfcCAocmVzKSkKLQljb250aW51ZTsKLQotICAgICAgRk9SX0VBQ0hfUEhJX0FSRyAo YXJnX3AsIHBoaSwgaSwgU1NBX09QX1VTRSkKLQl7Ci0JICB0cmVlIGFyZyA9IFVTRV9GUk9NX1BU UiAoYXJnX3ApOwotCSAgaWYgKFRSRUVfQ09ERSAoYXJnKSA9PSBTU0FfTkFNRSkKLQkgICAgbGl2 ZS5zZXQgKGFyZywgYmIpOwotCX0KLQotICAgICAgbGl2ZS5jbGVhciAocmVzLCBiYik7Ci0gICAg fQotfQotCi0vKiBEbyBhbiBSUE8gd2FsayBvdmVyIHRoZSBmdW5jdGlvbiBjb21wdXRpbmcgU1NB IG5hbWUgbGl2ZW5lc3MKLSAgIG9uLXRoZS1mbHkgYW5kIGRlY2lkaW5nIG9uIGFzc2VydCBleHBy ZXNzaW9ucyB0byBpbnNlcnQuICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6ZmluZF9hc3NlcnRf bG9jYXRpb25zICh2b2lkKQotewotICBpbnQgKnJwbyA9IFhORVdWRUMgKGludCwgbGFzdF9iYXNp Y19ibG9ja19mb3JfZm4gKGZ1bikpOwotICBpbnQgKmJiX3JwbyA9IFhORVdWRUMgKGludCwgbGFz dF9iYXNpY19ibG9ja19mb3JfZm4gKGZ1bikpOwotICBpbnQgKmxhc3RfcnBvID0gWENORVdWRUMg KGludCwgbGFzdF9iYXNpY19ibG9ja19mb3JfZm4gKGZ1bikpOwotICBpbnQgcnBvX2NudCwgaTsK LQotICBycG9fY250ID0gcHJlX2FuZF9yZXZfcG9zdF9vcmRlcl9jb21wdXRlIChOVUxMLCBycG8s IGZhbHNlKTsKLSAgZm9yIChpID0gMDsgaSA8IHJwb19jbnQ7ICsraSkKLSAgICBiYl9ycG9bcnBv W2ldXSA9IGk7Ci0KLSAgLyogUHJlLXNlZWQgbG9vcCBsYXRjaCBsaXZlbmVzcyBmcm9tIGxvb3Ag aGVhZGVyIFBISSBub2Rlcy4gIER1ZSB0bwotICAgICB0aGUgb3JkZXIgd2UgY29tcHV0ZSBsaXZl bmVzcyBhbmQgaW5zZXJ0IGFzc2VydHMgd2Ugb3RoZXJ3aXNlCi0gICAgIGZhaWwgdG8gaW5zZXJ0 IGFzc2VydHMgaW50byB0aGUgbG9vcCBsYXRjaC4gICovCi0gIGZvciAoYXV0byBsb29wIDogbG9v cHNfbGlzdCAoY2Z1biwgMCkpCi0gICAgewotICAgICAgaSA9IGxvb3AtPmxhdGNoLT5pbmRleDsK LSAgICAgIHVuc2lnbmVkIGludCBqID0gc2luZ2xlX3N1Y2NfZWRnZSAobG9vcC0+bGF0Y2gpLT5k ZXN0X2lkeDsKLSAgICAgIGZvciAoZ3BoaV9pdGVyYXRvciBnc2kgPSBnc2lfc3RhcnRfcGhpcyAo bG9vcC0+aGVhZGVyKTsKLQkgICAhZ3NpX2VuZF9wIChnc2kpOyBnc2lfbmV4dCAoJmdzaSkpCi0J ewotCSAgZ3BoaSAqcGhpID0gZ3NpLnBoaSAoKTsKLQkgIGlmICh2aXJ0dWFsX29wZXJhbmRfcCAo Z2ltcGxlX3BoaV9yZXN1bHQgKHBoaSkpKQotCSAgICBjb250aW51ZTsKLQkgIHRyZWUgYXJnID0g Z2ltcGxlX3BoaV9hcmdfZGVmIChwaGksIGopOwotCSAgaWYgKFRSRUVfQ09ERSAoYXJnKSA9PSBT U0FfTkFNRSkKLQkgICAgbGl2ZS5zZXQgKGFyZywgbG9vcC0+bGF0Y2gpOwotCX0KLSAgICB9Ci0K LSAgZm9yIChpID0gcnBvX2NudCAtIDE7IGkgPj0gMDsgLS1pKQotICAgIHsKLSAgICAgIGJhc2lj X2Jsb2NrIGJiID0gQkFTSUNfQkxPQ0tfRk9SX0ZOIChmdW4sIHJwb1tpXSk7Ci0gICAgICBlZGdl IGU7Ci0gICAgICBlZGdlX2l0ZXJhdG9yIGVpOwotCi0gICAgICAvKiBQcm9jZXNzIEJCIGFuZCB1 cGRhdGUgdGhlIGxpdmUgaW5mb3JtYXRpb24gd2l0aCB1c2VzIGluCi0gICAgICAgICB0aGlzIGJs b2NrLiAgKi8KLSAgICAgIGZpbmRfYXNzZXJ0X2xvY2F0aW9uc19pbl9iYiAoYmIpOwotCi0gICAg ICAvKiBNZXJnZSBsaXZlbmVzcyBpbnRvIHRoZSBwcmVkZWNlc3NvciBibG9ja3MgYW5kIGZyZWUg aXQuICAqLwotICAgICAgaWYgKCFsaXZlLmJsb2NrX2hhc19saXZlX25hbWVzX3AgKGJiKSkKLQl7 Ci0JICBpbnQgcHJlZF9ycG8gPSBpOwotCSAgRk9SX0VBQ0hfRURHRSAoZSwgZWksIGJiLT5wcmVk cykKLQkgICAgewotCSAgICAgIGludCBwcmVkID0gZS0+c3JjLT5pbmRleDsKLQkgICAgICBpZiAo KGUtPmZsYWdzICYgRURHRV9ERlNfQkFDSykgfHwgcHJlZCA9PSBFTlRSWV9CTE9DSykKLQkJY29u dGludWU7Ci0KLQkgICAgICBsaXZlLm1lcmdlIChlLT5zcmMsIGJiKTsKLQotCSAgICAgIGlmIChi Yl9ycG9bcHJlZF0gPCBwcmVkX3JwbykKLQkJcHJlZF9ycG8gPSBiYl9ycG9bcHJlZF07Ci0JICAg IH0KLQotCSAgLyogUmVjb3JkIHRoZSBSUE8gbnVtYmVyIG9mIHRoZSBsYXN0IHZpc2l0ZWQgYmxv Y2sgdGhhdCBuZWVkcwotCSAgICAgbGl2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgYmxvY2suICAq LwotCSAgbGFzdF9ycG9bcnBvW2ldXSA9IHByZWRfcnBvOwotCX0KLSAgICAgIGVsc2UKLQlsaXZl LmNsZWFyX2Jsb2NrIChiYik7Ci0KLSAgICAgIC8qIFdlIGNhbiBmcmVlIGFsbCBzdWNjZXNzb3Jz IGxpdmUgYml0bWFwcyBpZiBhbGwgdGhlaXIKLSAgICAgICAgIHByZWRlY2Vzc29ycyBoYXZlIGJl ZW4gdmlzaXRlZCBhbHJlYWR5LiAgKi8KLSAgICAgIEZPUl9FQUNIX0VER0UgKGUsIGVpLCBiYi0+ c3VjY3MpCi0JaWYgKGxhc3RfcnBvW2UtPmRlc3QtPmluZGV4XSA9PSBpKQotCSAgbGl2ZS5jbGVh cl9ibG9jayAoZS0+ZGVzdCk7Ci0gICAgfQotCi0gIFhERUxFVEVWRUMgKHJwbyk7Ci0gIFhERUxF VEVWRUMgKGJiX3Jwbyk7Ci0gIFhERUxFVEVWRUMgKGxhc3RfcnBvKTsKLX0KLQotLyogQ3JlYXRl IGFuIEFTU0VSVF9FWFBSIGZvciBOQU1FIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGxvY2F0aW9uCi0g ICBpbmRpY2F0ZWQgYnkgTE9DLiAgUmV0dXJuIHRydWUgaWYgd2UgbWFkZSBhbnkgZWRnZSBpbnNl cnRpb25zLiAgKi8KLQotYm9vbAotdnJwX2Fzc2VydHM6OnByb2Nlc3NfYXNzZXJ0X2luc2VydGlv bnNfZm9yICh0cmVlIG5hbWUsIGFzc2VydF9sb2N1cyAqbG9jKQotewotICAvKiBCdWlsZCB0aGUg Y29tcGFyaXNvbiBleHByZXNzaW9uIE5BTUVfaSBDT01QX0NPREUgVkFMLiAgKi8KLSAgZ2ltcGxl ICpzdG10OwotICB0cmVlIGNvbmQ7Ci0gIGdpbXBsZSAqYXNzZXJ0X3N0bXQ7Ci0gIGVkZ2VfaXRl cmF0b3IgZWk7Ci0gIGVkZ2UgZTsKLQotICAvKiBJZiB3ZSBoYXZlIFggPD0+IFggZG8gbm90IGlu c2VydCBhbiBhc3NlcnQgZXhwciBmb3IgdGhhdC4gICovCi0gIGlmIChsb2MtPmV4cHIgPT0gbG9j LT52YWwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbmQgPSBidWlsZDIgKGxvYy0+Y29tcF9j b2RlLCBib29sZWFuX3R5cGVfbm9kZSwgbG9jLT5leHByLCBsb2MtPnZhbCk7Ci0gIGFzc2VydF9z dG10ID0gYnVpbGRfYXNzZXJ0X2V4cHJfZm9yIChjb25kLCBuYW1lKTsKLSAgaWYgKGxvYy0+ZSkK LSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGJlZW4gYXNrZWQgdG8gaW5zZXJ0IHRoZSBhc3NlcnRp b24gb24gYW4gZWRnZS4gIFRoaXMKLQkgaXMgdXNlZCBvbmx5IGJ5IENPTkRfRVhQUiBhbmQgU1dJ VENIX0VYUFIgYXNzZXJ0aW9ucy4gICovCi0gICAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChnaW1w bGVfY29kZSAoZ3NpX3N0bXQgKGxvYy0+c2kpKSA9PSBHSU1QTEVfQ09ORAotCQkJICAgfHwgKGdp bXBsZV9jb2RlIChnc2lfc3RtdCAobG9jLT5zaSkpCi0JCQkgICAgICAgPT0gR0lNUExFX1NXSVRD SCkpOwotCi0gICAgICBnc2lfaW5zZXJ0X29uX2VkZ2UgKGxvYy0+ZSwgYXNzZXJ0X3N0bXQpOwot ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBzdG10IGl0ZXJhdG9yIHBv aW50cyBhdCB0aGUgZW5kIHRoZW4gdGhpcyBpcyBhbiBpbnNlcnRpb24KLSAgICAgYXQgdGhlIGJl Z2lubmluZyBvZiBhIGJsb2NrLiAgKi8KLSAgaWYgKGdzaV9lbmRfcCAobG9jLT5zaSkpCi0gICAg ewotICAgICAgZ2ltcGxlX3N0bXRfaXRlcmF0b3Igc2kgPSBnc2lfYWZ0ZXJfbGFiZWxzIChsb2Mt PmJiKTsKLSAgICAgIGdzaV9pbnNlcnRfYmVmb3JlICgmc2ksIGFzc2VydF9zdG10LCBHU0lfU0FN RV9TVE1UKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLSAgLyogT3RoZXJ3aXNlLCB3 ZSBjYW4gaW5zZXJ0IHJpZ2h0IGFmdGVyIExPQy0+U0kgaWZmIHRoZQotICAgICBzdGF0ZW1lbnQg bXVzdCBub3QgYmUgdGhlIGxhc3Qgc3RhdGVtZW50IGluIHRoZSBibG9jay4gICovCi0gIHN0bXQg PSBnc2lfc3RtdCAobG9jLT5zaSk7Ci0gIGlmICghc3RtdF9lbmRzX2JiX3AgKHN0bXQpKQotICAg IHsKLSAgICAgIGdzaV9pbnNlcnRfYWZ0ZXIgKCZsb2MtPnNpLCBhc3NlcnRfc3RtdCwgR1NJX1NB TUVfU1RNVCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIFNUTVQgbXVz dCBiZSB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4gQkIsIHdlIGNhbiBvbmx5IGluc2VydCBuZXcKLSAg ICAgYXNzZXJ0aW9ucyBvbiB0aGUgbm9uLWFibm9ybWFsIGVkZ2Ugb3V0IG9mIEJCLiAgTm90ZSB0 aGF0IHNpbmNlCi0gICAgIFNUTVQgaXMgbm90IGNvbnRyb2wgZmxvdywgdGhlcmUgbWF5IG9ubHkg YmUgb25lIG5vbi1hYm5vcm1hbC9laCBlZGdlCi0gICAgIG91dCBvZiBCQi4gICovCi0gIEZPUl9F QUNIX0VER0UgKGUsIGVpLCBsb2MtPmJiLT5zdWNjcykKLSAgICBpZiAoIShlLT5mbGFncyAmIChF REdFX0FCTk9STUFMfEVER0VfRUgpKSkKLSAgICAgIHsKLQlnc2lfaW5zZXJ0X29uX2VkZ2UgKGUs IGFzc2VydF9zdG10KTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICBnY2NfdW5yZWFjaGFi bGUgKCk7Ci19Ci0KLS8qIFFzb3J0IGhlbHBlciBmb3Igc29ydGluZyBhc3NlcnQgbG9jYXRpb25z LiAgSWYgc3RhYmxlIGlzIHRydWUsIGRvbid0Ci0gICB1c2UgaXRlcmF0aXZlX2hhc2hfZXhwciBi ZWNhdXNlIGl0IGNhbiBiZSB1bnN0YWJsZSBmb3IgLWZjb21wYXJlLWRlYnVnLAotICAgb24gdGhl IG90aGVyIHNpZGUgc29tZSBwb2ludGVycyBtaWdodCBiZSBOVUxMLiAgKi8KLQotdGVtcGxhdGUg PGJvb2wgc3RhYmxlPgotaW50Ci12cnBfYXNzZXJ0czo6Y29tcGFyZV9hc3NlcnRfbG9jIChjb25z dCB2b2lkICpwYSwgY29uc3Qgdm9pZCAqcGIpCi17Ci0gIGFzc2VydF9sb2N1cyAqIGNvbnN0IGEg PSAqKGFzc2VydF9sb2N1cyAqIGNvbnN0ICopcGE7Ci0gIGFzc2VydF9sb2N1cyAqIGNvbnN0IGIg PSAqKGFzc2VydF9sb2N1cyAqIGNvbnN0ICopcGI7Ci0KLSAgLyogSWYgc3RhYmxlLCBzb21lIGFz c2VydHMgbWlnaHQgYmUgb3B0aW1pemVkIGF3YXkgYWxyZWFkeSwgc29ydAotICAgICB0aGVtIGxh c3QuICAqLwotICBpZiAoc3RhYmxlKQotICAgIHsKLSAgICAgIGlmIChhID09IE5VTEwpCi0JcmV0 dXJuIGIgIT0gTlVMTDsKLSAgICAgIGVsc2UgaWYgKGIgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0g ICAgfQotCi0gIGlmIChhLT5lID09IE5VTEwgJiYgYi0+ZSAhPSBOVUxMKQotICAgIHJldHVybiAx OwotICBlbHNlIGlmIChhLT5lICE9IE5VTEwgJiYgYi0+ZSA9PSBOVUxMKQotICAgIHJldHVybiAt MTsKLQotICAvKiBBZnRlciB0aGUgYWJvdmUgY2hlY2tzLCB3ZSBrbm93IHRoYXQgKGEtPmUgPT0g TlVMTCkgPT0gKGItPmUgPT0gTlVMTCksCi0gICAgIG5vIG5lZWQgdG8gdGVzdCBib3RoIGEtPmUg YW5kIGItPmUuICAqLwotCi0gIC8qIFNvcnQgYWZ0ZXIgZGVzdGluYXRpb24gaW5kZXguICAqLwot ICBpZiAoYS0+ZSA9PSBOVUxMKQotICAgIDsKLSAgZWxzZSBpZiAoYS0+ZS0+ZGVzdC0+aW5kZXgg PiBiLT5lLT5kZXN0LT5pbmRleCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYS0+ZS0+ZGVz dC0+aW5kZXggPCBiLT5lLT5kZXN0LT5pbmRleCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogU29y dCBhZnRlciBjb21wX2NvZGUuICAqLwotICBpZiAoYS0+Y29tcF9jb2RlID4gYi0+Y29tcF9jb2Rl KQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChhLT5jb21wX2NvZGUgPCBiLT5jb21wX2NvZGUp Ci0gICAgcmV0dXJuIC0xOwotCi0gIGhhc2h2YWxfdCBoYSwgaGI7Ci0KLSAgLyogRS5nLiBpZiBh LT52YWwgaXMgQUREUl9FWFBSIG9mIGEgVkFSX0RFQ0wsIGl0ZXJhdGl2ZV9oYXNoX2V4cHIKLSAg ICAgdXNlcyBERUNMX1VJRCBvZiB0aGUgVkFSX0RFQ0wsIHNvIHNvcnRpbmcgbWlnaHQgZGlmZmVy IGJldHdlZW4KLSAgICAgLWcgYW5kIC1nMC4gIFdoZW4gZG9pbmcgdGhlIHJlbW92YWwgb2YgcmVk dW5kYW50IGFzc2VydCBleHBycwotICAgICBhbmQgY29tbW9uaXphdGlvbiB0byBzdWNjZXNzb3Jz LCB0aGlzIGRvZXMgbm90IG1hdHRlciwgYnV0IGZvcgotICAgICB0aGUgZmluYWwgc29ydCBuZWVk cyB0byBiZSBzdGFibGUuICAqLwotICBpZiAoc3RhYmxlKQotICAgIHsKLSAgICAgIGhhID0gMDsK LSAgICAgIGhiID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYSA9IGl0ZXJhdGl2 ZV9oYXNoX2V4cHIgKGEtPmV4cHIsIGl0ZXJhdGl2ZV9oYXNoX2V4cHIgKGEtPnZhbCwgMCkpOwot ICAgICAgaGIgPSBpdGVyYXRpdmVfaGFzaF9leHByIChiLT5leHByLCBpdGVyYXRpdmVfaGFzaF9l eHByIChiLT52YWwsIDApKTsKLSAgICB9Ci0KLSAgLyogQnJlYWsgdGhlIHRpZSB1c2luZyBoYXNo aW5nIGFuZCBzb3VyY2UvYmIgaW5kZXguICAqLwotICBpZiAoaGEgPT0gaGIpCi0gICAgcmV0dXJu IChhLT5lICE9IE5VTEwKLQkgICAgPyBhLT5lLT5zcmMtPmluZGV4IC0gYi0+ZS0+c3JjLT5pbmRl eAotCSAgICA6IGEtPmJiLT5pbmRleCAtIGItPmJiLT5pbmRleCk7Ci0gIHJldHVybiBoYSA+IGhi ID8gMSA6IC0xOwotfQotCi0vKiBQcm9jZXNzIGFsbCB0aGUgaW5zZXJ0aW9ucyByZWdpc3RlcmVk IGZvciBldmVyeSBuYW1lIE5faSByZWdpc3RlcmVkCi0gICBpbiBORUVEX0FTU0VSVF9GT1IuICBU aGUgbGlzdCBvZiBhc3NlcnRpb25zIHRvIGJlIGluc2VydGVkIGFyZQotICAgZm91bmQgaW4gQVNT RVJUU19GT1JbaV0uICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6cHJvY2Vzc19hc3NlcnRfaW5z ZXJ0aW9ucyAoKQotewotICB1bnNpZ25lZCBpOwotICBiaXRtYXBfaXRlcmF0b3IgYmk7Ci0gIGJv b2wgdXBkYXRlX2VkZ2VzX3AgPSBmYWxzZTsKLSAgaW50IG51bV9hc3NlcnRzID0gMDsKLQotICBp ZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotICAgIGR1bXAgKGR1 bXBfZmlsZSk7Ci0KLSAgRVhFQ1VURV9JRl9TRVRfSU5fQklUTUFQIChuZWVkX2Fzc2VydF9mb3Is IDAsIGksIGJpKQotICAgIHsKLSAgICAgIGFzc2VydF9sb2N1cyAqbG9jID0gYXNzZXJ0c19mb3Jb aV07Ci0gICAgICBnY2NfYXNzZXJ0IChsb2MpOwotCi0gICAgICBhdXRvX3ZlYzxhc3NlcnRfbG9j dXMgKiwgMTY+IGFzc2VydHM7Ci0gICAgICBmb3IgKDsgbG9jOyBsb2MgPSBsb2MtPm5leHQpCi0J YXNzZXJ0cy5zYWZlX3B1c2ggKGxvYyk7Ci0gICAgICBhc3NlcnRzLnFzb3J0IChjb21wYXJlX2Fz c2VydF9sb2M8ZmFsc2U+KTsKLQotICAgICAgLyogUHVzaCBkb3duIGNvbW1vbiBhc3NlcnRzIHRv IHN1Y2Nlc3NvcnMgYW5kIHJlbW92ZSByZWR1bmRhbnQgb25lcy4gICovCi0gICAgICB1bnNpZ25l ZCBlY250ID0gMDsKLSAgICAgIGFzc2VydF9sb2N1cyAqY29tbW9uID0gTlVMTDsKLSAgICAgIHVu c2lnbmVkIGNvbW1vbmogPSAwOwotICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGFzc2Vy dHMubGVuZ3RoICgpOyArK2opCi0JewotCSAgbG9jID0gYXNzZXJ0c1tqXTsKLQkgIGlmICghIGxv Yy0+ZSkKLQkgICAgY29tbW9uID0gTlVMTDsKLQkgIGVsc2UgaWYgKCEgY29tbW9uCi0JCSAgIHx8 IGxvYy0+ZS0+ZGVzdCAhPSBjb21tb24tPmUtPmRlc3QKLQkJICAgfHwgbG9jLT5jb21wX2NvZGUg IT0gY29tbW9uLT5jb21wX2NvZGUKLQkJICAgfHwgISBvcGVyYW5kX2VxdWFsX3AgKGxvYy0+dmFs LCBjb21tb24tPnZhbCwgMCkKLQkJICAgfHwgISBvcGVyYW5kX2VxdWFsX3AgKGxvYy0+ZXhwciwg Y29tbW9uLT5leHByLCAwKSkKLQkgICAgewotCSAgICAgIGNvbW1vbmogPSBqOwotCSAgICAgIGNv bW1vbiA9IGxvYzsKLQkgICAgICBlY250ID0gMTsKLQkgICAgfQotCSAgZWxzZSBpZiAobG9jLT5l ID09IGFzc2VydHNbai0xXS0+ZSkKLQkgICAgewotCSAgICAgIC8qIFJlbW92ZSBkdXBsaWNhdGUg YXNzZXJ0cy4gICovCi0JICAgICAgaWYgKGNvbW1vbmogPT0gaiAtIDEpCi0JCXsKLQkJICBjb21t b25qID0gajsKLQkJICBjb21tb24gPSBsb2M7Ci0JCX0KLQkgICAgICBmcmVlIChhc3NlcnRzW2ot MV0pOwotCSAgICAgIGFzc2VydHNbai0xXSA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAg ewotCSAgICAgIGVjbnQrKzsKLQkgICAgICBpZiAoRURHRV9DT1VOVCAoY29tbW9uLT5lLT5kZXN0 LT5wcmVkcykgPT0gZWNudCkKLQkJewotCQkgIC8qIFdlIGhhdmUgdGhlIHNhbWUgYXNzZXJ0aW9u IG9uIGFsbCBpbmNvbWluZyBlZGdlcyBvZiBhIEJCLgotCQkgICAgIEluc2VydCBpdCBhdCB0aGUg YmVnaW5uaW5nIG9mIHRoYXQgYmxvY2suICAqLwotCQkgIGxvYy0+YmIgPSBsb2MtPmUtPmRlc3Q7 Ci0JCSAgbG9jLT5lID0gTlVMTDsKLQkJICBsb2MtPnNpID0gZ3NpX25vbmUgKCk7Ci0JCSAgY29t bW9uID0gTlVMTDsKLQkJICAvKiBDbGVhciBhc3NlcnRzIGNvbW1vbmVkLiAgKi8KLQkJICBmb3Ig KDsgY29tbW9uaiAhPSBqOyArK2NvbW1vbmopCi0JCSAgICBpZiAoYXNzZXJ0c1tjb21tb25qXSkK LQkJICAgICAgewotCQkJZnJlZSAoYXNzZXJ0c1tjb21tb25qXSk7Ci0JCQlhc3NlcnRzW2NvbW1v bmpdID0gTlVMTDsKLQkJICAgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoZSBh c3NlcnRzIHZlY3RvciBzb3J0aW5nIGFib3ZlIG1pZ2h0IGJlIHVuc3RhYmxlIGZvcgotCSAtZmNv bXBhcmUtZGVidWcsIHNvcnQgYWdhaW4gdG8gZW5zdXJlIGEgc3RhYmxlIHNvcnQuICAqLwotICAg ICAgYXNzZXJ0cy5xc29ydCAoY29tcGFyZV9hc3NlcnRfbG9jPHRydWU+KTsKLSAgICAgIGZvciAo dW5zaWduZWQgaiA9IDA7IGogPCBhc3NlcnRzLmxlbmd0aCAoKTsgKytqKQotCXsKLQkgIGxvYyA9 IGFzc2VydHNbal07Ci0JICBpZiAoISBsb2MpCi0JICAgIGJyZWFrOwotCSAgdXBkYXRlX2VkZ2Vz X3AgfD0gcHJvY2Vzc19hc3NlcnRfaW5zZXJ0aW9uc19mb3IgKHNzYV9uYW1lIChpKSwgbG9jKTsK LQkgIG51bV9hc3NlcnRzKys7Ci0JICBmcmVlIChsb2MpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHVw ZGF0ZV9lZGdlc19wKQotICAgIGdzaV9jb21taXRfZWRnZV9pbnNlcnRzICgpOwotCi0gIHN0YXRp c3RpY3NfY291bnRlcl9ldmVudCAoZnVuLCAiTnVtYmVyIG9mIEFTU0VSVF9FWFBSIGV4cHJlc3Np b25zIGluc2VydGVkIiwKLQkJCSAgICBudW1fYXNzZXJ0cyk7Ci19Ci0KLS8qIFRyYXZlcnNlIHRo ZSBmbG93Z3JhcGggbG9va2luZyBmb3IgY29uZGl0aW9uYWwganVtcHMgdG8gaW5zZXJ0IHJhbmdl Ci0gICBleHByZXNzaW9ucy4gIFRoZXNlIHJhbmdlIGV4cHJlc3Npb25zIGFyZSBtZWFudCB0byBw cm92aWRlIGluZm9ybWF0aW9uCi0gICB0byBvcHRpbWl6YXRpb25zIHRoYXQgbmVlZCB0byByZWFz b24gaW4gdGVybXMgb2YgdmFsdWUgcmFuZ2VzLiAgVGhleQotICAgd2lsbCBub3QgYmUgZXhwYW5k ZWQgaW50byBSVEwuICBGb3IgaW5zdGFuY2UsIGdpdmVuOgotCi0gICB4ID0gLi4uCi0gICB5ID0g Li4uCi0gICBpZiAoeCA8IHkpCi0gICAgIHkgPSB4IC0gMjsKLSAgIGVsc2UKLSAgICAgeCA9IHkg KyAzOwotCi0gICB0aGlzIHBhc3Mgd2lsbCB0cmFuc2Zvcm0gdGhlIGNvZGUgaW50bzoKLQotICAg eCA9IC4uLgotICAgeSA9IC4uLgotICAgaWYgKHggPCB5KQotICAgIHsKLSAgICAgIHggPSBBU1NF UlRfRVhQUiA8eCwgeCA8IHk+Ci0gICAgICB5ID0geCAtIDIKLSAgICB9Ci0gICBlbHNlCi0gICAg ewotICAgICAgeSA9IEFTU0VSVF9FWFBSIDx5LCB4ID49IHk+Ci0gICAgICB4ID0geSArIDMKLSAg ICB9Ci0KLSAgIFRoZSBpZGVhIGlzIHRoYXQgb25jZSBjb3B5IGFuZCBjb25zdGFudCBwcm9wYWdh dGlvbiBoYXZlIHJ1biwgb3RoZXIKLSAgIG9wdGltaXphdGlvbnMgd2lsbCBiZSBhYmxlIHRvIGRl dGVybWluZSB3aGF0IHJhbmdlcyBvZiB2YWx1ZXMgY2FuICd4JwotICAgdGFrZSBpbiBkaWZmZXJl bnQgcGF0aHMgb2YgdGhlIGNvZGUsIHNpbXBseSBieSBjaGVja2luZyB0aGUgcmVhY2hpbmcKLSAg IGRlZmluaXRpb24gb2YgJ3gnLiAgKi8KLQotdm9pZAotdnJwX2Fzc2VydHM6Omluc2VydF9yYW5n ZV9hc3NlcnRpb25zICh2b2lkKQotewotICBuZWVkX2Fzc2VydF9mb3IgPSBCSVRNQVBfQUxMT0Mg KE5VTEwpOwotICBhc3NlcnRzX2ZvciA9IFhDTkVXVkVDIChhc3NlcnRfbG9jdXMgKiwgbnVtX3Nz YV9uYW1lcyk7Ci0KLSAgY2FsY3VsYXRlX2RvbWluYW5jZV9pbmZvIChDRElfRE9NSU5BVE9SUyk7 Ci0KLSAgZmluZF9hc3NlcnRfbG9jYXRpb25zICgpOwotICBpZiAoIWJpdG1hcF9lbXB0eV9wIChu ZWVkX2Fzc2VydF9mb3IpKQotICAgIHsKLSAgICAgIHByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnMg KCk7Ci0gICAgICB1cGRhdGVfc3NhIChUT0RPX3VwZGF0ZV9zc2Ffbm9fcGhpKTsKLSAgICB9Ci0K LSAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLSAgICB7Ci0g ICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcblNTQSBmb3JtIGFmdGVyIGluc2VydGluZyBBU1NF UlRfRVhQUnNcbiIpOwotICAgICAgZHVtcF9mdW5jdGlvbl90b19maWxlIChjdXJyZW50X2Z1bmN0 aW9uX2RlY2wsIGR1bXBfZmlsZSwgZHVtcF9mbGFncyk7Ci0gICAgfQotCi0gIGZyZWUgKGFzc2Vy dHNfZm9yKTsKLSAgQklUTUFQX0ZSRUUgKG5lZWRfYXNzZXJ0X2Zvcik7Ci19Ci0KLS8qIFJldHVy biB0cnVlIGlmIGFsbCBpbW0gdXNlcyBvZiBWQVIgYXJlIGVpdGhlciBpbiBTVE1ULCBvcgotICAg ZmVlZCAob3B0aW9uYWxseSB0aHJvdWdoIGEgY2hhaW4gb2Ygc2luZ2xlIGltbSB1c2VzKSBHSU1Q TEVfQ09ORAotICAgaW4gYmFzaWMgYmxvY2sgQ09ORF9CQi4gICovCi0KLWJvb2wKLXZycF9hc3Nl cnRzOjphbGxfaW1tX3VzZXNfaW5fc3RtdF9vcl9mZWVkX2NvbmQgKHRyZWUgdmFyLAotCQkJCQkJ Z2ltcGxlICpzdG10LAotCQkJCQkJYmFzaWNfYmxvY2sgY29uZF9iYikKLXsKLSAgdXNlX29wZXJh bmRfcCB1c2VfcCwgdXNlMl9wOwotICBpbW1fdXNlX2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgRk9SX0VB Q0hfSU1NX1VTRV9GQVNUICh1c2VfcCwgaXRlciwgdmFyKQotICAgIGlmIChVU0VfU1RNVCAodXNl X3ApICE9IHN0bXQpCi0gICAgICB7Ci0JZ2ltcGxlICp1c2Vfc3RtdCA9IFVTRV9TVE1UICh1c2Vf cCksICp1c2Vfc3RtdDI7Ci0JaWYgKGlzX2dpbXBsZV9kZWJ1ZyAodXNlX3N0bXQpKQotCSAgY29u dGludWU7Ci0Jd2hpbGUgKGlzX2dpbXBsZV9hc3NpZ24gKHVzZV9zdG10KQotCSAgICAgICAmJiBU UkVFX0NPREUgKGdpbXBsZV9hc3NpZ25fbGhzICh1c2Vfc3RtdCkpID09IFNTQV9OQU1FCi0JICAg ICAgICYmIHNpbmdsZV9pbW1fdXNlIChnaW1wbGVfYXNzaWduX2xocyAodXNlX3N0bXQpLAotCQkJ CSAgJnVzZTJfcCwgJnVzZV9zdG10MikpCi0JICB1c2Vfc3RtdCA9IHVzZV9zdG10MjsKLQlpZiAo Z2ltcGxlX2NvZGUgKHVzZV9zdG10KSAhPSBHSU1QTEVfQ09ORAotCSAgICB8fCBnaW1wbGVfYmIg KHVzZV9zdG10KSAhPSBjb25kX2JiKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICByZXR1 cm4gdHJ1ZTsKLX0KLQotLyogQ29udmVydCByYW5nZSBhc3NlcnRpb24gZXhwcmVzc2lvbnMgaW50 byB0aGUgaW1wbGllZCBjb3BpZXMgYW5kCi0gICBjb3B5IHByb3BhZ2F0ZSBhd2F5IHRoZSBjb3Bp ZXMuICBEb2luZyB0aGUgdHJpdmlhbCBjb3B5IHByb3BhZ2F0aW9uCi0gICBoZXJlIGF2b2lkcyB0 aGUgbmVlZCB0byBydW4gdGhlIGZ1bGwgY29weSBwcm9wYWdhdGlvbiBwYXNzIGFmdGVyCi0gICBW UlAuCi0KLSAgIEZJWE1FLCB0aGlzIHdpbGwgZXZlbnR1YWxseSBsZWFkIHRvIGNvcHkgcHJvcGFn YXRpb24gcmVtb3ZpbmcgdGhlCi0gICBuYW1lcyB0aGF0IGhhZCB1c2VmdWwgcmFuZ2UgaW5mb3Jt YXRpb24gYXR0YWNoZWQgdG8gdGhlbS4gIEZvcgotICAgaW5zdGFuY2UsIGlmIHdlIGhhZCB0aGUg YXNzZXJ0aW9uIE5faSA9IEFTU0VSVF9FWFBSIDxOX2osIE5faiA+IDM+LAotICAgdGhlbiBOX2kg d2lsbCBoYXZlIHRoZSByYW5nZSBbMywgK0lORl0uCi0KLSAgIEhvd2V2ZXIsIGJ5IGNvbnZlcnRp bmcgdGhlIGFzc2VydGlvbiBpbnRvIHRoZSBpbXBsaWVkIGNvcHkKLSAgIG9wZXJhdGlvbiBOX2kg PSBOX2osIHdlIHdpbGwgdGhlbiBjb3B5LXByb3BhZ2F0ZSBOX2ogaW50byB0aGUgdXNlcwotICAg b2YgTl9pIGFuZCBsb3NlIHRoZSByYW5nZSBpbmZvcm1hdGlvbi4KLQotICAgVGhlIHByb2JsZW0g d2l0aCBrZWVwaW5nIEFTU0VSVF9FWFBScyBhcm91bmQgaXMgdGhhdCBwYXNzZXMgYWZ0ZXIKLSAg IFZSUCBuZWVkIHRvIGhhbmRsZSB0aGVtIGFwcHJvcHJpYXRlbHkuCi0KLSAgIEFub3RoZXIgYXBw cm9hY2ggd291bGQgYmUgdG8gbWFrZSB0aGUgcmFuZ2UgaW5mb3JtYXRpb24gYSBmaXJzdAotICAg Y2xhc3MgcHJvcGVydHkgb2YgdGhlIFNTQV9OQU1FIHNvIHRoYXQgaXQgY2FuIGJlIHF1ZXJpZWQg ZnJvbQotICAgYW55IHBhc3MuICBUaGlzIGlzIG1hZGUgc29tZXdoYXQgbW9yZSBjb21wbGV4IGJ5 IHRoZSBuZWVkIGZvcgotICAgbXVsdGlwbGUgcmFuZ2VzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBv bmUgU1NBX05BTUUuICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6cmVtb3ZlX3JhbmdlX2Fzc2Vy dGlvbnMgKCkKLXsKLSAgYmFzaWNfYmxvY2sgYmI7Ci0gIGdpbXBsZV9zdG10X2l0ZXJhdG9yIHNp OwotICAvKiAxIGlmIGxvb2tpbmcgYXQgQVNTRVJUX0VYUFJzIGltbWVkaWF0ZWx5IGF0IHRoZSBi ZWdpbm5pbmcgb2YKLSAgICAgYSBiYXNpYyBibG9jayBwcmVjZWVkZWQgYnkgR0lNUExFX0NPTkQg YnJhbmNoaW5nIHRvIGl0IGFuZAotICAgICBfX2J1aWx0aW5fdHJhcCwgLTEgaWYgbm90IHlldCBj aGVja2VkLCAwIG90aGVyd2lzZS4gICovCi0gIGludCBpc191bnJlYWNoYWJsZTsKLQotICAvKiBO b3RlIHRoYXQgdGhlIEJTSSBpdGVyYXRvciBidW1wIGhhcHBlbnMgYXQgdGhlIGJvdHRvbSBvZiB0 aGUKLSAgICAgbG9vcCBhbmQgbm8gYnVtcCBpcyBuZWNlc3NhcnkgaWYgd2UncmUgcmVtb3Zpbmcg dGhlIHN0YXRlbWVudAotICAgICByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IEJTSS4gICovCi0g IEZPUl9FQUNIX0JCX0ZOIChiYiwgZnVuKQotICAgIGZvciAoc2kgPSBnc2lfYWZ0ZXJfbGFiZWxz IChiYiksIGlzX3VucmVhY2hhYmxlID0gLTE7ICFnc2lfZW5kX3AgKHNpKTspCi0gICAgICB7Ci0J Z2ltcGxlICpzdG10ID0gZ3NpX3N0bXQgKHNpKTsKLQotCWlmIChpc19naW1wbGVfYXNzaWduIChz dG10KQotCSAgICAmJiBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSA9PSBBU1NFUlRfRVhQ UikKLQkgIHsKLQkgICAgdHJlZSBsaHMgPSBnaW1wbGVfYXNzaWduX2xocyAoc3RtdCk7Ci0JICAg IHRyZWUgcmhzID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKLQkgICAgdHJlZSB2YXI7Ci0K LQkgICAgdmFyID0gQVNTRVJUX0VYUFJfVkFSIChyaHMpOwotCi0JICAgIGlmIChUUkVFX0NPREUg KHZhcikgPT0gU1NBX05BTUUKLQkJJiYgIVBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGxocykp Ci0JCSYmIFNTQV9OQU1FX1JBTkdFX0lORk8gKGxocykpCi0JICAgICAgewotCQlpZiAoaXNfdW5y ZWFjaGFibGUgPT0gLTEpCi0JCSAgewotCQkgICAgaXNfdW5yZWFjaGFibGUgPSAwOwotCQkgICAg aWYgKHNpbmdsZV9wcmVkX3AgKGJiKQotCQkJJiYgYXNzZXJ0X3VucmVhY2hhYmxlX2ZhbGx0aHJ1 X2VkZ2VfcAotCQkJCQkJICAgIChzaW5nbGVfcHJlZF9lZGdlIChiYikpKQotCQkgICAgICBpc191 bnJlYWNoYWJsZSA9IDE7Ci0JCSAgfQotCQkvKiBIYW5kbGUKLQkJICAgaWYgKHhfNyA+PSAxMCAm JiB4XzcgPCAyMCkKLQkJICAgICBfX2J1aWx0aW5fdW5yZWFjaGFibGUgKCk7Ci0JCSAgIHhfOCA9 IEFTU0VSVF9FWFBSIDx4XzcsIC4uLj47Ci0JCSAgIGlmIHRoZSBvbmx5IHVzZXMgb2YgeF83IGFy ZSBpbiB0aGUgQVNTRVJUX0VYUFIgYW5kCi0JCSAgIGluIHRoZSBjb25kaXRpb24uICBJbiB0aGF0 IGNhc2UsIHdlIGNhbiBjb3B5IHRoZQotCQkgICByYW5nZSBpbmZvIGZyb20geF84IGNvbXB1dGVk IGluIHRoaXMgcGFzcyBhbHNvCi0JCSAgIGZvciB4XzcuICAqLwotCQlpZiAoaXNfdW5yZWFjaGFi bGUKLQkJICAgICYmIGFsbF9pbW1fdXNlc19pbl9zdG10X29yX2ZlZWRfY29uZCAodmFyLCBzdG10 LAotCQkJCQkJCSAgc2luZ2xlX3ByZWQgKGJiKSkpCi0JCSAgewotCQkgICAgaWYgKFNTQV9OQU1F X1JBTkdFX0lORk8gKHZhcikpCi0JCSAgICAgIHsKLQkJCS8qID8/IFRoaXMgaXMgYSBtaW5vciB3 YXJ0IGV4cG9zaW5nIHRoZQotCQkJICAgaW50ZXJuYWxzIG9mIFNTQV9OQU1FX1JBTkdFX0lORk8g aW4gb3JkZXIKLQkJCSAgIHRvIG1haW50YWluIGV4aXN0aW5nIGJlaGF2aW9yLiAgVGhpcyBpcwot CQkJICAgYmVjYXVzZSBkdXBsaWNhdGVfc3NhX25hbWVfcmFuZ2VfaW5mbyBiZWxvdwotCQkJICAg bmVlZHMgYSBOVUxMIGRlc3RpbmF0aW9uIHJhbmdlLiAgVGhpcyBpcwotCQkJICAgYWxsIHNsYXRl ZCBmb3IgcmVtb3ZhbC4uLiAgKi8KLQkJCWdnY19mcmVlIChTU0FfTkFNRV9SQU5HRV9JTkZPICh2 YXIpKTsKLQkJCVNTQV9OQU1FX1JBTkdFX0lORk8gKHZhcikgPSBOVUxMOwotCQkgICAgICB9Ci0J CSAgICBkdXBsaWNhdGVfc3NhX25hbWVfcmFuZ2VfaW5mbyAodmFyLCBsaHMpOwotCQkgICAgbWF5 YmVfc2V0X25vbnplcm9fYml0cyAoc2luZ2xlX3ByZWRfZWRnZSAoYmIpLCB2YXIpOwotCQkgIH0K LQkgICAgICB9Ci0KLQkgICAgLyogUHJvcGFnYXRlIHRoZSBSSFMgaW50byBldmVyeSB1c2Ugb2Yg dGhlIExIUy4gIEZvciBTU0EgbmFtZXMKLQkgICAgICAgYWxzbyBwcm9wYWdhdGUgYWJub3JtYWxz IGFzIGl0IG1lcmVseSByZXN0b3JlcyB0aGUgb3JpZ2luYWwKLQkgICAgICAgSUwgaW4gdGhpcyBj YXNlIChhbiByZXBsYWNlX3VzZXNfYnkgd291bGQgYXNzZXJ0KS4gICovCi0JICAgIGlmIChUUkVF X0NPREUgKHZhcikgPT0gU1NBX05BTUUpCi0JICAgICAgewotCQlpbW1fdXNlX2l0ZXJhdG9yIGl0 ZXI7Ci0JCXVzZV9vcGVyYW5kX3AgdXNlX3A7Ci0JCWdpbXBsZSAqdXNlX3N0bXQ7Ci0JCUZPUl9F QUNIX0lNTV9VU0VfU1RNVCAodXNlX3N0bXQsIGl0ZXIsIGxocykKLQkJICBGT1JfRUFDSF9JTU1f VVNFX09OX1NUTVQgKHVzZV9wLCBpdGVyKQotCQkgICAgU0VUX1VTRSAodXNlX3AsIHZhcik7Ci0J ICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgcmVwbGFjZV91c2VzX2J5IChsaHMsIHZhcik7Ci0K LQkgICAgLyogQW5kIGZpbmFsbHksIHJlbW92ZSB0aGUgY29weSwgaXQgaXMgbm90IG5lZWRlZC4g ICovCi0JICAgIGdzaV9yZW1vdmUgKCZzaSwgdHJ1ZSk7Ci0JICAgIHJlbGVhc2VfZGVmcyAoc3Rt dCk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAoIWlzX2dpbXBsZV9kZWJ1ZyAoZ3NpX3N0 bXQgKHNpKSkpCi0JICAgICAgaXNfdW5yZWFjaGFibGUgPSAwOwotCSAgICBnc2lfbmV4dCAoJnNp KTsKLQkgIH0KLSAgICAgIH0KLX0KLQotY2xhc3MgdnJwX3Byb3AgOiBwdWJsaWMgc3NhX3Byb3Bh Z2F0aW9uX2VuZ2luZQotewotcHVibGljOgotICB2cnBfcHJvcCAodnJfdmFsdWVzICp2KQotICAg IDogc3NhX3Byb3BhZ2F0aW9uX2VuZ2luZSAoKSwKLSAgICAgIG1fdnJfdmFsdWVzICh2KSB7IH0K LQotICB2b2lkIGluaXRpYWxpemUgKHN0cnVjdCBmdW5jdGlvbiAqKTsKLSAgdm9pZCBmaW5hbGl6 ZSAoKTsKLQotcHJpdmF0ZToKLSAgZW51bSBzc2FfcHJvcF9yZXN1bHQgdmlzaXRfc3RtdCAoZ2lt cGxlICosIGVkZ2UgKiwgdHJlZSAqKSBmaW5hbCBvdmVycmlkZTsKLSAgZW51bSBzc2FfcHJvcF9y ZXN1bHQgdmlzaXRfcGhpIChncGhpICopIGZpbmFsIG92ZXJyaWRlOwotCi0gIHN0cnVjdCBmdW5j dGlvbiAqZnVuOwotICB2cl92YWx1ZXMgKm1fdnJfdmFsdWVzOwotfTsKLQotLyogSW5pdGlhbGl6 YXRpb24gcmVxdWlyZWQgYnkgc3NhX3Byb3BhZ2F0ZSBlbmdpbmUuICAqLwotCi12b2lkCi12cnBf cHJvcDo6aW5pdGlhbGl6ZSAoc3RydWN0IGZ1bmN0aW9uICpmbikKLXsKLSAgYmFzaWNfYmxvY2sg YmI7Ci0gIGZ1biA9IGZuOwotCi0gIEZPUl9FQUNIX0JCX0ZOIChiYiwgZnVuKQotICAgIHsKLSAg ICAgIGZvciAoZ3BoaV9pdGVyYXRvciBzaSA9IGdzaV9zdGFydF9waGlzIChiYik7ICFnc2lfZW5k X3AgKHNpKTsKLQkgICBnc2lfbmV4dCAoJnNpKSkKLQl7Ci0JICBncGhpICpwaGkgPSBzaS5waGkg KCk7Ci0JICBpZiAoIXN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCAocGhpKSkKLQkgICAgewotCSAg ICAgIHRyZWUgbGhzID0gUEhJX1JFU1VMVCAocGhpKTsKLQkgICAgICBtX3ZyX3ZhbHVlcy0+c2V0 X2RlZl90b192YXJ5aW5nIChsaHMpOwotCSAgICAgIHByb3Bfc2V0X3NpbXVsYXRlX2FnYWluIChw aGksIGZhbHNlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBwcm9wX3NldF9zaW11bGF0ZV9hZ2Fp biAocGhpLCB0cnVlKTsKLQl9Ci0KLSAgICAgIGZvciAoZ2ltcGxlX3N0bXRfaXRlcmF0b3Igc2kg PSBnc2lfc3RhcnRfYmIgKGJiKTsgIWdzaV9lbmRfcCAoc2kpOwotCSAgIGdzaV9uZXh0ICgmc2kp KQotICAgICAgICB7Ci0JICBnaW1wbGUgKnN0bXQgPSBnc2lfc3RtdCAoc2kpOwotCi0gCSAgLyog SWYgdGhlIHN0YXRlbWVudCBpcyBhIGNvbnRyb2wgaW5zbiwgdGhlbiB3ZSBkbyBub3QKLSAJICAg ICB3YW50IHRvIGF2b2lkIHNpbXVsYXRpbmcgdGhlIHN0YXRlbWVudCBvbmNlLiAgRmFpbHVyZQot IAkgICAgIHRvIGRvIHNvIG1lYW5zIHRoYXQgdGhvc2UgZWRnZXMgd2lsbCBuZXZlciBnZXQgYWRk ZWQuICAqLwotCSAgaWYgKHN0bXRfZW5kc19iYl9wIChzdG10KSkKLQkgICAgcHJvcF9zZXRfc2lt dWxhdGVfYWdhaW4gKHN0bXQsIHRydWUpOwotCSAgZWxzZSBpZiAoIXN0bXRfaW50ZXJlc3Rpbmdf Zm9yX3ZycCAoc3RtdCkpCi0JICAgIHsKLQkgICAgICBtX3ZyX3ZhbHVlcy0+c2V0X2RlZnNfdG9f dmFyeWluZyAoc3RtdCk7Ci0JICAgICAgcHJvcF9zZXRfc2ltdWxhdGVfYWdhaW4gKHN0bXQsIGZh bHNlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBwcm9wX3NldF9zaW11bGF0ZV9hZ2FpbiAoc3Rt dCwgdHJ1ZSk7Ci0JfQotICAgIH0KLX0KLQotLyogRXZhbHVhdGUgc3RhdGVtZW50IFNUTVQuICBJ ZiB0aGUgc3RhdGVtZW50IHByb2R1Y2VzIGEgdXNlZnVsIHJhbmdlLAotICAgcmV0dXJuIFNTQV9Q Uk9QX0lOVEVSRVNUSU5HIGFuZCByZWNvcmQgdGhlIFNTQSBuYW1lIHdpdGggdGhlCi0gICBpbnRl cmVzdGluZyByYW5nZSBpbnRvICpPVVRQVVRfUC4KLQotICAgSWYgU1RNVCBpcyBhIGNvbmRpdGlv bmFsIGJyYW5jaCBhbmQgd2UgY2FuIGRldGVybWluZSBpdHMgdHJ1dGgKLSAgIHZhbHVlLCB0aGUg dGFrZW4gZWRnZSBpcyByZWNvcmRlZCBpbiAqVEFLRU5fRURHRV9QLgotCi0gICBJZiBTVE1UIHBy b2R1Y2VzIGEgdmFyeWluZyB2YWx1ZSwgcmV0dXJuIFNTQV9QUk9QX1ZBUllJTkcuICAqLwotCi1l bnVtIHNzYV9wcm9wX3Jlc3VsdAotdnJwX3Byb3A6OnZpc2l0X3N0bXQgKGdpbXBsZSAqc3RtdCwg ZWRnZSAqdGFrZW5fZWRnZV9wLCB0cmVlICpvdXRwdXRfcCkKLXsKLSAgdHJlZSBsaHMgPSBnaW1w bGVfZ2V0X2xocyAoc3RtdCk7Ci0gIHZhbHVlX3JhbmdlX2VxdWl2IHZyOwotICBtX3ZyX3ZhbHVl cy0+ZXh0cmFjdF9yYW5nZV9mcm9tX3N0bXQgKHN0bXQsIHRha2VuX2VkZ2VfcCwgb3V0cHV0X3As ICZ2cik7Ci0KLSAgaWYgKCpvdXRwdXRfcCkKLSAgICB7Ci0gICAgICBpZiAobV92cl92YWx1ZXMt PnVwZGF0ZV92YWx1ZV9yYW5nZSAoKm91dHB1dF9wLCAmdnIpKQotCXsKLQkgIGlmIChkdW1wX2Zp bGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0JICAgIHsKLQkgICAgICBmcHJpbnRm IChkdW1wX2ZpbGUsICJGb3VuZCBuZXcgcmFuZ2UgZm9yICIpOwotCSAgICAgIHByaW50X2dlbmVy aWNfZXhwciAoZHVtcF9maWxlLCAqb3V0cHV0X3ApOwotCSAgICAgIGZwcmludGYgKGR1bXBfZmls ZSwgIjogIik7Ci0JICAgICAgZHVtcF92YWx1ZV9yYW5nZSAoZHVtcF9maWxlLCAmdnIpOwotCSAg ICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuIik7Ci0JICAgIH0KLQotCSAgaWYgKHZyLnZhcnlp bmdfcCAoKSkKLQkgICAgcmV0dXJuIFNTQV9QUk9QX1ZBUllJTkc7Ci0KLQkgIHJldHVybiBTU0Ff UFJPUF9JTlRFUkVTVElORzsKLQl9Ci0gICAgICByZXR1cm4gU1NBX1BST1BfTk9UX0lOVEVSRVNU SU5HOwotICAgIH0KLQotICBpZiAoaXNfZ2ltcGxlX2NhbGwgKHN0bXQpICYmIGdpbXBsZV9jYWxs X2ludGVybmFsX3AgKHN0bXQpKQotICAgIHN3aXRjaCAoZ2ltcGxlX2NhbGxfaW50ZXJuYWxfZm4g KHN0bXQpKQotICAgICAgewotICAgICAgY2FzZSBJRk5fQUREX09WRVJGTE9XOgotICAgICAgY2Fz ZSBJRk5fU1VCX09WRVJGTE9XOgotICAgICAgY2FzZSBJRk5fTVVMX09WRVJGTE9XOgotICAgICAg Y2FzZSBJRk5fQVRPTUlDX0NPTVBBUkVfRVhDSEFOR0U6Ci0JLyogVGhlc2UgaW50ZXJuYWwgY2Fs bHMgcmV0dXJuIF9Db21wbGV4IGludGVnZXIgdHlwZSwKLQkgICB3aGljaCBWUlAgZG9lcyBub3Qg dHJhY2ssIGJ1dCB0aGUgaW1tZWRpYXRlIHVzZXMKLQkgICB0aGVyZW9mIG1pZ2h0IGJlIGludGVy ZXN0aW5nLiAgKi8KLQlpZiAobGhzICYmIFRSRUVfQ09ERSAobGhzKSA9PSBTU0FfTkFNRSkKLQkg IHsKLQkgICAgaW1tX3VzZV9pdGVyYXRvciBpdGVyOwotCSAgICB1c2Vfb3BlcmFuZF9wIHVzZV9w OwotCSAgICBlbnVtIHNzYV9wcm9wX3Jlc3VsdCByZXMgPSBTU0FfUFJPUF9WQVJZSU5HOwotCi0J ICAgIG1fdnJfdmFsdWVzLT5zZXRfZGVmX3RvX3ZhcnlpbmcgKGxocyk7Ci0KLQkgICAgRk9SX0VB Q0hfSU1NX1VTRV9GQVNUICh1c2VfcCwgaXRlciwgbGhzKQotCSAgICAgIHsKLQkJZ2ltcGxlICp1 c2Vfc3RtdCA9IFVTRV9TVE1UICh1c2VfcCk7Ci0JCWlmICghaXNfZ2ltcGxlX2Fzc2lnbiAodXNl X3N0bXQpKQotCQkgIGNvbnRpbnVlOwotCQllbnVtIHRyZWVfY29kZSByaHNfY29kZSA9IGdpbXBs ZV9hc3NpZ25fcmhzX2NvZGUgKHVzZV9zdG10KTsKLQkJaWYgKHJoc19jb2RlICE9IFJFQUxQQVJU X0VYUFIgJiYgcmhzX2NvZGUgIT0gSU1BR1BBUlRfRVhQUikKLQkJICBjb250aW51ZTsKLQkJdHJl ZSByaHMxID0gZ2ltcGxlX2Fzc2lnbl9yaHMxICh1c2Vfc3RtdCk7Ci0JCXRyZWUgdXNlX2xocyA9 IGdpbXBsZV9hc3NpZ25fbGhzICh1c2Vfc3RtdCk7Ci0JCWlmIChUUkVFX0NPREUgKHJoczEpICE9 IHJoc19jb2RlCi0JCSAgICB8fCBUUkVFX09QRVJBTkQgKHJoczEsIDApICE9IGxocwotCQkgICAg fHwgVFJFRV9DT0RFICh1c2VfbGhzKSAhPSBTU0FfTkFNRQotCQkgICAgfHwgIXN0bXRfaW50ZXJl c3RpbmdfZm9yX3ZycCAodXNlX3N0bXQpCi0JCSAgICB8fCAoIUlOVEVHUkFMX1RZUEVfUCAoVFJF RV9UWVBFICh1c2VfbGhzKSkKLQkJCXx8ICFUWVBFX01JTl9WQUxVRSAoVFJFRV9UWVBFICh1c2Vf bGhzKSkKLQkJCXx8ICFUWVBFX01BWF9WQUxVRSAoVFJFRV9UWVBFICh1c2VfbGhzKSkpKQotCQkg IGNvbnRpbnVlOwotCi0JCS8qIElmIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSByYW5n ZSBmb3IgYW55IG9mIHRoZQotCQkgICBSRUFMUEFSVF9FWFBSL0lNQUdQQVJUX0VYUFIgaW1tZWRp YXRlIHVzZXMsIHJldHVybgotCQkgICBTU0FfUFJPUF9JTlRFUkVTVElORy4gIElmIHRoZXJlIGFy ZSBhbnkgUkVBTFBBUlRfRVhQUgotCQkgICBvciBJTUFHUEFSVF9FWFBSIGltbWVkaWF0ZSB1c2Vz LCBidXQgbm9uZSBvZiB0aGVtIGhhdmUKLQkJICAgYSBjaGFuZ2UgaW4gdGhlaXIgdmFsdWUgcmFu Z2VzLCByZXR1cm4KLQkJICAgU1NBX1BST1BfTk9UX0lOVEVSRVNUSU5HLiAgSWYgdGhlcmUgYXJl IG5vCi0JCSAgIHtSRUFMLElNQUd9UEFSVF9FWFBSIHVzZXMgYXQgYWxsLAotCQkgICByZXR1cm4g U1NBX1BST1BfVkFSWUlORy4gICovCi0JCXZhbHVlX3JhbmdlX2VxdWl2IG5ld192cjsKLQkJbV92 cl92YWx1ZXMtPmV4dHJhY3RfcmFuZ2VfYmFzaWMgKCZuZXdfdnIsIHVzZV9zdG10KTsKLQkJY29u c3QgdmFsdWVfcmFuZ2VfZXF1aXYgKm9sZF92cgotCQkgID0gbV92cl92YWx1ZXMtPmdldF92YWx1 ZV9yYW5nZSAodXNlX2xocyk7Ci0JCWlmICghb2xkX3ZyLT5lcXVhbF9wIChuZXdfdnIsIC8qaWdu b3JlX2VxdWl2cz0qL2ZhbHNlKSkKLQkJICByZXMgPSBTU0FfUFJPUF9JTlRFUkVTVElORzsKLQkJ ZWxzZQotCQkgIHJlcyA9IFNTQV9QUk9QX05PVF9JTlRFUkVTVElORzsKLQkJbmV3X3ZyLmVxdWl2 X2NsZWFyICgpOwotCQlpZiAocmVzID09IFNTQV9QUk9QX0lOVEVSRVNUSU5HKQotCQkgIHsKLQkJ ICAgICpvdXRwdXRfcCA9IGxoczsKLQkJICAgIHJldHVybiByZXM7Ci0JCSAgfQotCSAgICAgIH0K LQotCSAgICByZXR1cm4gcmVzOwotCSAgfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlicmVh azsKLSAgICAgIH0KLQotICAvKiBBbGwgb3RoZXIgc3RhdGVtZW50cyBwcm9kdWNlIG5vdGhpbmcg b2YgaW50ZXJlc3QgZm9yIFZSUCwgc28gbWFyawotICAgICB0aGVpciBvdXRwdXRzIHZhcnlpbmcg YW5kIHByZXZlbnQgZnVydGhlciBzaW11bGF0aW9uLiAgKi8KLSAgbV92cl92YWx1ZXMtPnNldF9k ZWZzX3RvX3ZhcnlpbmcgKHN0bXQpOwotCi0gIHJldHVybiAoKnRha2VuX2VkZ2VfcCkgPyBTU0Ff UFJPUF9JTlRFUkVTVElORyA6IFNTQV9QUk9QX1ZBUllJTkc7Ci19Ci0KLS8qIFZpc2l0IGFsbCBh cmd1bWVudHMgZm9yIFBISSBub2RlIFBISSB0aGF0IGZsb3cgdGhyb3VnaCBleGVjdXRhYmxlCi0g ICBlZGdlcy4gIElmIGEgdmFsaWQgdmFsdWUgcmFuZ2UgY2FuIGJlIGRlcml2ZWQgZnJvbSBhbGwg dGhlIGluY29taW5nCi0gICB2YWx1ZSByYW5nZXMsIHNldCBhIG5ldyByYW5nZSBmb3IgdGhlIExI UyBvZiBQSEkuICAqLwotCi1lbnVtIHNzYV9wcm9wX3Jlc3VsdAotdnJwX3Byb3A6OnZpc2l0X3Bo aSAoZ3BoaSAqcGhpKQotewotICB0cmVlIGxocyA9IFBISV9SRVNVTFQgKHBoaSk7Ci0gIHZhbHVl X3JhbmdlX2VxdWl2IHZyX3Jlc3VsdDsKLSAgbV92cl92YWx1ZXMtPmV4dHJhY3RfcmFuZ2VfZnJv bV9waGlfbm9kZSAocGhpLCAmdnJfcmVzdWx0KTsKLSAgaWYgKG1fdnJfdmFsdWVzLT51cGRhdGVf dmFsdWVfcmFuZ2UgKGxocywgJnZyX3Jlc3VsdCkpCi0gICAgewotICAgICAgaWYgKGR1bXBfZmls ZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLQl7Ci0JICBmcHJpbnRmIChkdW1wX2Zp bGUsICJGb3VuZCBuZXcgcmFuZ2UgZm9yICIpOwotCSAgcHJpbnRfZ2VuZXJpY19leHByIChkdW1w X2ZpbGUsIGxocyk7Ci0JICBmcHJpbnRmIChkdW1wX2ZpbGUsICI6ICIpOwotCSAgZHVtcF92YWx1 ZV9yYW5nZSAoZHVtcF9maWxlLCAmdnJfcmVzdWx0KTsKLQkgIGZwcmludGYgKGR1bXBfZmlsZSwg IlxuIik7Ci0JfQotCi0gICAgICBpZiAodnJfcmVzdWx0LnZhcnlpbmdfcCAoKSkKLQlyZXR1cm4g U1NBX1BST1BfVkFSWUlORzsKLQotICAgICAgcmV0dXJuIFNTQV9QUk9QX0lOVEVSRVNUSU5HOwot ICAgIH0KLQotICAvKiBOb3RoaW5nIGNoYW5nZWQsIGRvbid0IGFkZCBvdXRnb2luZyBlZGdlcy4g ICovCi0gIHJldHVybiBTU0FfUFJPUF9OT1RfSU5URVJFU1RJTkc7Ci19Ci0KLS8qIFRyYXZlcnNl IGFsbCB0aGUgYmxvY2tzIGZvbGRpbmcgY29uZGl0aW9uYWxzIHdpdGgga25vd24gcmFuZ2VzLiAg Ki8KLQotdm9pZAotdnJwX3Byb3A6OmZpbmFsaXplICgpCi17Ci0gIHNpemVfdCBpOwotCi0gIC8q IFdlIGhhdmUgY29tcGxldGVkIHByb3BhZ2F0aW5nIHRocm91Z2ggdGhlIGxhdHRpY2UuICAqLwot ICBtX3ZyX3ZhbHVlcy0+c2V0X2xhdHRpY2VfcHJvcGFnYXRpb25fY29tcGxldGUgKCk7Ci0KLSAg aWYgKGR1bXBfZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcblZhbHVl IHJhbmdlcyBhZnRlciBWUlA6XG5cbiIpOwotICAgICAgbV92cl92YWx1ZXMtPmR1bXAgKGR1bXBf ZmlsZSk7Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOwotICAgIH0KLQotICAvKiBT ZXQgdmFsdWUgcmFuZ2UgdG8gbm9uIHBvaW50ZXIgU1NBX05BTUVzLiAgKi8KLSAgZm9yIChpID0g MDsgaSA8IG51bV9zc2FfbmFtZXM7IGkrKykKLSAgICB7Ci0gICAgICB0cmVlIG5hbWUgPSBzc2Ff bmFtZSAoaSk7Ci0gICAgICBpZiAoIW5hbWUpCi0JY29udGludWU7Ci0KLSAgICAgIGNvbnN0IHZh bHVlX3JhbmdlX2VxdWl2ICp2ciA9IG1fdnJfdmFsdWVzLT5nZXRfdmFsdWVfcmFuZ2UgKG5hbWUp OwotICAgICAgaWYgKCFuYW1lIHx8IHZyLT52YXJ5aW5nX3AgKCkgfHwgIXZyLT5jb25zdGFudF9w ICgpKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAo bmFtZSkpCi0JICAmJiByYW5nZV9pbmNsdWRlc196ZXJvX3AgKHZyKSA9PSAwKQotCXNldF9wdHJf bm9ubnVsbCAobmFtZSk7Ci0gICAgICBlbHNlIGlmICghUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQ RSAobmFtZSkpKQotCXNldF9yYW5nZV9pbmZvIChuYW1lLCAqdnIpOwotICAgIH0KLX0KKy8qIEdp dmVuIGEgU1dJVENIX1NUTVQsIHJldHVybiB0aGUgY2FzZSBsYWJlbCB0aGF0IGVuY29tcGFzc2Vz IHRoZQorICAga25vd24gcG9zc2libGUgdmFsdWVzIGZvciB0aGUgc3dpdGNoIG9wZXJhbmQuICBS QU5HRV9PRl9PUCBpcyBhCisgICByYW5nZSBmb3IgdGhlIGtub3duIHZhbHVlcyBvZiB0aGUgc3dp dGNoIG9wZXJhbmQuICAqLwogCi1jbGFzcyB2cnBfZm9sZGVyIDogcHVibGljIHN1YnN0aXR1dGVf YW5kX2ZvbGRfZW5naW5lCit0cmVlCitmaW5kX2Nhc2VfbGFiZWxfcmFuZ2UgKGdzd2l0Y2ggKnN3 aXRjaF9zdG10LCBjb25zdCBpcmFuZ2UgKnJhbmdlX29mX29wKQogewotIHB1YmxpYzoKLSAgdnJw X2ZvbGRlciAodnJfdmFsdWVzICp2KQotICAgIDogc3Vic3RpdHV0ZV9hbmRfZm9sZF9lbmdpbmUg KC8qIEZvbGQgYWxsIHN0bXRzLiAgKi8gdHJ1ZSksCi0gICAgICBtX3ZyX3ZhbHVlcyAodiksIHNp bXBsaWZpZXIgKHYpCi0gICAgeyAgfQotICB2b2lkIHNpbXBsaWZ5X2Nhc3RlZF9jb25kcyAoZnVu Y3Rpb24gKmZ1bik7CisgIGlmIChyYW5nZV9vZl9vcC0+dW5kZWZpbmVkX3AgKCkKKyAgICAgIHx8 IHJhbmdlX29mX29wLT52YXJ5aW5nX3AgKCkpCisgICAgcmV0dXJuIE5VTExfVFJFRTsKIAotcHJp dmF0ZToKLSAgdHJlZSB2YWx1ZV9vZl9leHByICh0cmVlIG5hbWUsIGdpbXBsZSAqc3RtdCkgb3Zl cnJpZGUKKyAgc2l6ZV90IGksIGo7CisgIHRyZWUgb3AgPSBnaW1wbGVfc3dpdGNoX2luZGV4IChz d2l0Y2hfc3RtdCk7CisgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAob3ApOworICB0cmVlIHRtaW4g PSB3aWRlX2ludF90b190cmVlICh0eXBlLCByYW5nZV9vZl9vcC0+bG93ZXJfYm91bmQgKCkpOwor ICB0cmVlIHRtYXggPSB3aWRlX2ludF90b190cmVlICh0eXBlLCByYW5nZV9vZl9vcC0+dXBwZXJf Ym91bmQgKCkpOworICBmaW5kX2Nhc2VfbGFiZWxfcmFuZ2UgKHN3aXRjaF9zdG10LCB0bWluLCB0 bWF4LCAmaSwgJmopOworICBpZiAoaSA9PSBqKQogICAgIHsKLSAgICAgIHJldHVybiBtX3ZyX3Zh bHVlcy0+dmFsdWVfb2ZfZXhwciAobmFtZSwgc3RtdCk7CisgICAgICAvKiBMb29rIGZvciBleGFj dGx5IG9uZSBsYWJlbCB0aGF0IGVuY29tcGFzc2VzIHRoZSByYW5nZSBvZgorCSB0aGUgb3BlcmFu ZC4gICovCisgICAgICB0cmVlIGxhYmVsID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0 bXQsIGkpOworICAgICAgdHJlZSBjYXNlX2hpZ2gKKwk9IENBU0VfSElHSCAobGFiZWwpID8gQ0FT RV9ISUdIIChsYWJlbCkgOiBDQVNFX0xPVyAobGFiZWwpOworICAgICAgaW50X3JhbmdlX21heCBs YWJlbF9yYW5nZSAoQ0FTRV9MT1cgKGxhYmVsKSwgY2FzZV9oaWdoKTsKKyAgICAgIGlmICghdHlw ZXNfY29tcGF0aWJsZV9wIChsYWJlbF9yYW5nZS50eXBlICgpLCByYW5nZV9vZl9vcC0+dHlwZSAo KSkpCisJcmFuZ2VfY2FzdCAobGFiZWxfcmFuZ2UsIHJhbmdlX29mX29wLT50eXBlICgpKTsKKyAg ICAgIGxhYmVsX3JhbmdlLmludGVyc2VjdCAoKnJhbmdlX29mX29wKTsKKyAgICAgIGlmIChsYWJl bF9yYW5nZSA9PSAqcmFuZ2Vfb2Zfb3ApCisJcmV0dXJuIGxhYmVsOwogICAgIH0KLSAgYm9vbCBm b2xkX3N0bXQgKGdpbXBsZV9zdG10X2l0ZXJhdG9yICopIGZpbmFsIG92ZXJyaWRlOwotICBib29s IGZvbGRfcHJlZGljYXRlX2luIChnaW1wbGVfc3RtdF9pdGVyYXRvciAqKTsKLQotICB2cl92YWx1 ZXMgKm1fdnJfdmFsdWVzOwotICBzaW1wbGlmeV91c2luZ19yYW5nZXMgc2ltcGxpZmllcjsKLX07 Ci0KLS8qIElmIHRoZSBzdGF0ZW1lbnQgcG9pbnRlZCBieSBTSSBoYXMgYSBwcmVkaWNhdGUgd2hv c2UgdmFsdWUgY2FuIGJlCi0gICBjb21wdXRlZCB1c2luZyB0aGUgdmFsdWUgcmFuZ2UgaW5mb3Jt YXRpb24gY29tcHV0ZWQgYnkgVlJQLCBjb21wdXRlCi0gICBpdHMgdmFsdWUgYW5kIHJldHVybiB0 cnVlLiAgT3RoZXJ3aXNlLCByZXR1cm4gZmFsc2UuICAqLwotCi1ib29sCi12cnBfZm9sZGVyOjpm b2xkX3ByZWRpY2F0ZV9pbiAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKnNpKQotewotICBib29sIGFz c2lnbm1lbnRfcCA9IGZhbHNlOwotICB0cmVlIHZhbDsKLSAgZ2ltcGxlICpzdG10ID0gZ3NpX3N0 bXQgKCpzaSk7Ci0KLSAgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKHN0bXQpCi0gICAgICAmJiBUUkVF X0NPREVfQ0xBU1MgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpKSA9PSB0Y2NfY29tcGFy aXNvbikKKyAgZWxzZSBpZiAoaSA+IGopCiAgICAgewotICAgICAgYXNzaWdubWVudF9wID0gdHJ1 ZTsKLSAgICAgIHZhbCA9IHNpbXBsaWZpZXIudnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsIChnaW1w bGVfYXNzaWduX3Joc19jb2RlIChzdG10KSwKLQkJCQkJCSBnaW1wbGVfYXNzaWduX3JoczEgKHN0 bXQpLAotCQkJCQkJIGdpbXBsZV9hc3NpZ25fcmhzMiAoc3RtdCksCi0JCQkJCQkgc3RtdCk7Cisg ICAgICAvKiBJZiB0aGVyZSBhcmUgbm8gbGFiZWxzIGF0IGFsbCwgdGFrZSB0aGUgZGVmYXVsdC4g ICovCisgICAgICByZXR1cm4gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIDApOwog ICAgIH0KLSAgZWxzZSBpZiAoZ2NvbmQgKmNvbmRfc3RtdCA9IGR5bl9jYXN0IDxnY29uZCAqPiAo c3RtdCkpCi0gICAgdmFsID0gc2ltcGxpZmllci52cnBfZXZhbHVhdGVfY29uZGl0aW9uYWwgKGdp bXBsZV9jb25kX2NvZGUgKGNvbmRfc3RtdCksCi0JCQkJCSAgICAgICBnaW1wbGVfY29uZF9saHMg KGNvbmRfc3RtdCksCi0JCQkJCSAgICAgICBnaW1wbGVfY29uZF9yaHMgKGNvbmRfc3RtdCksCi0J CQkJCSAgICAgICBzdG10KTsKICAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmFs KQogICAgIHsKLSAgICAgIGlmIChhc3NpZ25tZW50X3ApCi0JdmFsID0gZm9sZF9jb252ZXJ0IChU UkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25fbGhzIChzdG10KSksIHZhbCk7Ci0KLSAgICAgIGlmIChk dW1wX2ZpbGUpCi0JewotCSAgZnByaW50ZiAoZHVtcF9maWxlLCAiRm9sZGluZyBwcmVkaWNhdGUg Iik7Ci0JICBwcmludF9naW1wbGVfZXhwciAoZHVtcF9maWxlLCBzdG10LCAwKTsKLQkgIGZwcmlu dGYgKGR1bXBfZmlsZSwgIiB0byAiKTsKLQkgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxl LCB2YWwpOwotCSAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG4iKTsKLQl9Ci0KLSAgICAgIGlmIChp c19naW1wbGVfYXNzaWduIChzdG10KSkKLQlnaW1wbGVfYXNzaWduX3NldF9yaHNfZnJvbV90cmVl IChzaSwgdmFsKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBnY2NfYXNzZXJ0IChnaW1wbGVfY29kZSAo c3RtdCkgPT0gR0lNUExFX0NPTkQpOwotCSAgZ2NvbmQgKmNvbmRfc3RtdCA9IGFzX2EgPGdjb25k ICo+IChzdG10KTsKLQkgIGlmIChpbnRlZ2VyX3plcm9wICh2YWwpKQotCSAgICBnaW1wbGVfY29u ZF9tYWtlX2ZhbHNlIChjb25kX3N0bXQpOwotCSAgZWxzZSBpZiAoaW50ZWdlcl9vbmVwICh2YWwp KQotCSAgICBnaW1wbGVfY29uZF9tYWtlX3RydWUgKGNvbmRfc3RtdCk7Ci0JICBlbHNlCi0JICAg IGdjY191bnJlYWNoYWJsZSAoKTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOworICAgICAgLyog T3RoZXJ3aXNlLCB0aGVyZSBhcmUgdmFyaW91cyBsYWJlbHMgdGhhdCBjYW4gZW5jb21wYXNzCisJ IHRoZSByYW5nZSBvZiBvcGVyYW5kLiAgSW4gd2hpY2ggY2FzZSwgc2VlIGlmIHRoZSByYW5nZSBv ZgorCSB0aGUgb3BlcmFuZCBpcyBlbnRpcmVseSAqb3V0c2lkZSogdGhlIGJvdW5kcyBvZiBhbGwg dGhlCisJIChub24tZGVmYXVsdCkgY2FzZSBsYWJlbHMuICBJZiBzbywgdGFrZSB0aGUgZGVmYXVs dC4gICovCisgICAgICB1bnNpZ25lZCBuID0gZ2ltcGxlX3N3aXRjaF9udW1fbGFiZWxzIChzd2l0 Y2hfc3RtdCk7CisgICAgICB0cmVlIG1pbl9sYWJlbCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN3 aXRjaF9zdG10LCAxKTsKKyAgICAgIHRyZWUgbWF4X2xhYmVsID0gZ2ltcGxlX3N3aXRjaF9sYWJl bCAoc3dpdGNoX3N0bXQsIG4gLSAxKTsKKyAgICAgIHRyZWUgY2FzZV9oaWdoID0gQ0FTRV9ISUdI IChtYXhfbGFiZWwpOworICAgICAgaWYgKCFjYXNlX2hpZ2gpCisJY2FzZV9oaWdoID0gQ0FTRV9M T1cgKG1heF9sYWJlbCk7CisgICAgICBpbnRfcmFuZ2VfbWF4IGxhYmVsX3JhbmdlIChDQVNFX0xP VyAobWluX2xhYmVsKSwgY2FzZV9oaWdoKTsKKyAgICAgIGlmICghdHlwZXNfY29tcGF0aWJsZV9w IChsYWJlbF9yYW5nZS50eXBlICgpLCByYW5nZV9vZl9vcC0+dHlwZSAoKSkpCisJcmFuZ2VfY2Fz dCAobGFiZWxfcmFuZ2UsIHJhbmdlX29mX29wLT50eXBlICgpKTsKKyAgICAgIGxhYmVsX3Jhbmdl LmludGVyc2VjdCAoKnJhbmdlX29mX29wKTsKKyAgICAgIGlmIChsYWJlbF9yYW5nZS51bmRlZmlu ZWRfcCAoKSkKKwlyZXR1cm4gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIDApOwog ICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENhbGxiYWNrIGZvciBzdWJzdGl0dXRl X2FuZF9mb2xkIGZvbGRpbmcgdGhlIHN0bXQgYXQgKlNJLiAgKi8KLQotYm9vbAotdnJwX2ZvbGRl cjo6Zm9sZF9zdG10IChnaW1wbGVfc3RtdF9pdGVyYXRvciAqc2kpCi17Ci0gIGlmIChmb2xkX3By ZWRpY2F0ZV9pbiAoc2kpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBzaW1wbGlmaWVy LnNpbXBsaWZ5IChzaSk7CisgIHJldHVybiBOVUxMX1RSRUU7CiB9CiAKLS8qIEEgY29tcGFyaXNv biBvZiBhbiBTU0FfTkFNRSBhZ2FpbnN0IGEgY29uc3RhbnQgd2hlcmUgdGhlIFNTQV9OQU1FCi0g ICB3YXMgc2V0IGJ5IGEgdHlwZSBjb252ZXJzaW9uIGNhbiBvZnRlbiBiZSByZXdyaXR0ZW4gdG8g dXNlIHRoZSBSSFMKLSAgIG9mIHRoZSB0eXBlIGNvbnZlcnNpb24uICBEbyB0aGlzIG9wdGltaXph dGlvbiBmb3IgYWxsIGNvbmRpdGlvbmFscwotICAgaW4gRlVOLiAgKi8KLQotdm9pZAotdnJwX2Zv bGRlcjo6c2ltcGxpZnlfY2FzdGVkX2NvbmRzIChmdW5jdGlvbiAqZnVuKQorc3RydWN0IGNhc2Vf aW5mbwogeworICB0cmVlIGV4cHI7CiAgIGJhc2ljX2Jsb2NrIGJiOwotICBGT1JfRUFDSF9CQl9G TiAoYmIsIGZ1bikKLSAgICB7Ci0gICAgICBnaW1wbGUgKmxhc3QgPSBsYXN0X3N0bXQgKGJiKTsK LSAgICAgIGlmIChsYXN0ICYmIGdpbXBsZV9jb2RlIChsYXN0KSA9PSBHSU1QTEVfQ09ORCkKLQl7 Ci0JICBpZiAoc2ltcGxpZmllci5zaW1wbGlmeV9jYXN0ZWRfY29uZCAoYXNfYSA8Z2NvbmQgKj4g KGxhc3QpKSkKLQkgICAgewotCSAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBU REZfREVUQUlMUykpCi0JCXsKLQkJICBmcHJpbnRmIChkdW1wX2ZpbGUsICJGb2xkZWQgaW50bzog Iik7Ci0JCSAgcHJpbnRfZ2ltcGxlX3N0bXQgKGR1bXBfZmlsZSwgbGFzdCwgMCwgVERGX1NMSU0p OwotCQkgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuIik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9 Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQgdG8gVlJQIChWYWx1ZSBSYW5nZSBQcm9wYWdhdGlv bikuICBUaGlzIHBhc3MgaXMKLSAgIGxvb3NlbHkgYmFzZWQgb24gSi4gUi4gQy4gUGF0dGVyc29u LCBgYEFjY3VyYXRlIFN0YXRpYyBCcmFuY2gKLSAgIFByZWRpY3Rpb24gYnkgVmFsdWUgUmFuZ2Ug UHJvcGFnYXRpb24sJycgaW4gU0lHUExBTiBDb25mZXJlbmNlIG9uCi0gICBQcm9ncmFtbWluZyBM YW5ndWFnZSBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uLCBwcC4gNjctNzgsIDE5OTUuCi0gICBB bHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vY2l0ZXNlZXIuaXN0LnBzdS5lZHUvcGF0dGVyc29uOTVh Y2N1cmF0ZS5odG1sCi0KLSAgIFRoaXMgaXMgZXNzZW50aWFsbHkgYW4gU1NBLUNDUCBwYXNzIG1v ZGlmaWVkIHRvIGRlYWwgd2l0aCByYW5nZXMKLSAgIGluc3RlYWQgb2YgY29uc3RhbnRzLgotCi0g ICBXaGlsZSBwcm9wYWdhdGluZyByYW5nZXMsIHdlIG1heSBmaW5kIHRoYXQgdHdvIG9yIG1vcmUg U1NBIG5hbWUKLSAgIGhhdmUgZXF1aXZhbGVudCwgdGhvdWdoIGRpc3RpbmN0IHJhbmdlcy4gIEZv ciBpbnN0YW5jZSwKLQotICAgICAxCXhfOSA9IHBfMy0+YTsKLSAgICAgMglwXzQgPSBBU1NFUlRf RVhQUiA8cF8zLCBwXzMgIT0gMD4KLSAgICAgMwlpZiAocF80ID09IHFfMikKLSAgICAgNAkgIHBf NSA9IEFTU0VSVF9FWFBSIDxwXzQsIHBfNCA9PSBxXzI+OwotICAgICA1CWVuZGlmCi0gICAgIDYJ aWYgKHFfMikKLQotICAgSW4gdGhlIGNvZGUgYWJvdmUsIHBvaW50ZXIgcF81IGhhcyByYW5nZSBb cV8yLCBxXzJdLCBidXQgZnJvbSB0aGUKLSAgIGNvZGUgd2UgY2FuIGFsc28gZGV0ZXJtaW5lIHRo YXQgcF81IGNhbm5vdCBiZSBOVUxMIGFuZCwgaWYgcV8yIGhhZAotICAgYSBub24tdmFyeWluZyBy YW5nZSwgcF81J3MgcmFuZ2Ugc2hvdWxkIGFsc28gYmUgY29tcGF0aWJsZSB3aXRoIGl0LgotCi0g ICBUaGVzZSBlcXVpdmFsZW5jZXMgYXJlIGNyZWF0ZWQgYnkgdHdvIGV4cHJlc3Npb25zOiBBU1NF UlRfRVhQUiBhbmQKLSAgIGNvcHkgb3BlcmF0aW9ucy4gIFNpbmNlIHBfNSBpcyBhbiBhc3NlcnRp b24gb24gcF80LCBhbmQgcF80IHdhcyB0aGUKLSAgIHJlc3VsdCBvZiBhbm90aGVyIGFzc2VydGlv biwgdGhlbiB3ZSBjYW4gdXNlIHRoZSBmYWN0IHRoYXQgcF81IGFuZAotICAgcF80IGFyZSBlcXVp dmFsZW50IHdoZW4gZXZhbHVhdGluZyBwXzUncyByYW5nZS4KLQotICAgVG9nZXRoZXIgd2l0aCB2 YWx1ZSByYW5nZXMsIHdlIGFsc28gcHJvcGFnYXRlIHRoZXNlIGVxdWl2YWxlbmNlcwotICAgYmV0 d2VlbiBuYW1lcyBzbyB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBpbmZvcm1hdGlvbiBm cm9tCi0gICBtdWx0aXBsZSByYW5nZXMgd2hlbiBkb2luZyBmaW5hbCByZXBsYWNlbWVudC4gIE5v dGUgdGhhdCB0aGlzCi0gICBlcXVpdmFsZW5jeSByZWxhdGlvbiBpcyB0cmFuc2l0aXZlIGJ1dCBu b3Qgc3ltbWV0cmljLgotCi0gICBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgcF81IGlzIGVxdWl2YWxl bnQgdG8gcF80LCBxXzIgYW5kIHBfMywgYnV0IHdlCi0gICBjYW5ub3QgYXNzZXJ0IHRoYXQgcV8y IGlzIGVxdWl2YWxlbnQgdG8gcF81IGJlY2F1c2UgcV8yIG1heSBiZSB1c2VkCi0gICBpbiBjb250 ZXh0cyB3aGVyZSB0aGF0IGFzc2VydGlvbiBkb2VzIG5vdCBob2xkIChlLmcuLCBpbiBsaW5lIDYp LgotCi0gICBUT0RPLCB0aGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBwYXNzIGFuZCBQ YXR0ZXJzb24ncyBpcyB0aGF0Ci0gICB3ZSBkbyBub3QgcHJvcGFnYXRlIGVkZ2UgcHJvYmFiaWxp dGllcy4gIFdlIG9ubHkgY29tcHV0ZSB3aGV0aGVyCi0gICBlZGdlcyBjYW4gYmUgdGFrZW4gb3Ig bm90LiAgVGhhdCBpcywgaW5zdGVhZCBvZiBoYXZpbmcgYSBzcGVjdHJ1bQotICAgb2YganVtcCBw cm9iYWJpbGl0aWVzIGJldHdlZW4gMCBhbmQgMSwgd2Ugb25seSBkZWFsIHdpdGggMCwgMSBhbmQK LSAgIERPTidUIEtOT1cuICBJbiB0aGUgZnV0dXJlLCBpdCBtYXkgYmUgd29ydGh3aGlsZSB0byBw cm9wYWdhdGUKLSAgIHByb2JhYmlsaXRpZXMgdG8gYWlkIGJyYW5jaCBwcmVkaWN0aW9uLiAgKi8K LQotc3RhdGljIHVuc2lnbmVkIGludAotZXhlY3V0ZV92cnAgKHN0cnVjdCBmdW5jdGlvbiAqZnVu LCBib29sIHdhcm5fYXJyYXlfYm91bmRzX3ApCi17Ci0gIGxvb3Bfb3B0aW1pemVyX2luaXQgKExP T1BTX05PUk1BTCB8IExPT1BTX0hBVkVfUkVDT1JERURfRVhJVFMpOwotICByZXdyaXRlX2ludG9f bG9vcF9jbG9zZWRfc3NhIChOVUxMLCBUT0RPX3VwZGF0ZV9zc2EpOwotICBzY2V2X2luaXRpYWxp emUgKCk7Ci0KLSAgLyogPz8/ICBUaGlzIGVuZHMgdXAgdXNpbmcgc3RhbGUgRURHRV9ERlNfQkFD SyBmb3IgbGl2ZW5lc3MgY29tcHV0YXRpb24uCi0gICAgIEluc2VydGluZyBhc3NlcnRpb25zIG1h eSBzcGxpdCBlZGdlcyB3aGljaCB3aWxsIGludmFsaWRhdGUKLSAgICAgRURHRV9ERlNfQkFDSy4g ICovCi0gIHZycF9hc3NlcnRzIGFzc2VydF9lbmdpbmUgKGZ1bik7Ci0gIGFzc2VydF9lbmdpbmUu aW5zZXJ0X3JhbmdlX2Fzc2VydGlvbnMgKCk7Ci0KLSAgLyogRm9yIHZpc2l0aW5nIFBISSBub2Rl cyB3ZSBuZWVkIEVER0VfREZTX0JBQ0sgY29tcHV0ZWQuICAqLwotICBtYXJrX2Rmc19iYWNrX2Vk Z2VzICgpOwotCi0gIHZyX3ZhbHVlcyB2cnBfdnJfdmFsdWVzOwotCi0gIGNsYXNzIHZycF9wcm9w IHZycF9wcm9wICgmdnJwX3ZyX3ZhbHVlcyk7Ci0gIHZycF9wcm9wLmluaXRpYWxpemUgKGZ1bik7 Ci0gIHZycF9wcm9wLnNzYV9wcm9wYWdhdGUgKCk7Ci0KLSAgLyogSW5zdGFudGlhdGUgdGhlIGZv bGRlciBoZXJlLCBzbyB0aGF0IGVkZ2UgY2xlYW51cHMgaGFwcGVuIGF0IHRoZQotICAgICBlbmQg b2YgdGhpcyBmdW5jdGlvbi4gICovCi0gIHZycF9mb2xkZXIgZm9sZGVyICgmdnJwX3ZyX3ZhbHVl cyk7Ci0gIHZycF9wcm9wLmZpbmFsaXplICgpOwotCi0gIC8qIElmIHdlJ3JlIGNoZWNraW5nIGFy cmF5IHJlZnMsIHdlIHdhbnQgdG8gbWVyZ2UgaW5mb3JtYXRpb24gb24KLSAgICAgdGhlIGV4ZWN1 dGFiaWxpdHkgb2YgZWFjaCBlZGdlIGJldHdlZW4gdnJwX2ZvbGRlciBhbmQgdGhlCi0gICAgIGNo ZWNrX2FycmF5X2JvdW5kc19kb21fd2Fsa2VyOiBlYWNoIGNhbiBjbGVhciB0aGUKLSAgICAgRURH RV9FWEVDVVRBQkxFIGZsYWcgb24gZWRnZXMsIGluIGRpZmZlcmVudCB3YXlzLgotCi0gICAgIEhl bmNlLCBpZiB3ZSdyZSBnb2luZyB0byBjYWxsIGNoZWNrX2FsbF9hcnJheV9yZWZzLCBzZXQKLSAg ICAgdGhlIGZsYWcgb24gZXZlcnkgZWRnZSBub3csIHJhdGhlciB0aGFuIGluCi0gICAgIGNoZWNr X2FycmF5X2JvdW5kc19kb21fd2Fsa2VyJ3MgY3RvcjsgdnJwX2ZvbGRlciBtYXkgY2xlYXIKLSAg ICAgaXQgZnJvbSBzb21lIGVkZ2VzLiAgKi8KLSAgaWYgKHdhcm5fYXJyYXlfYm91bmRzICYmIHdh cm5fYXJyYXlfYm91bmRzX3ApCi0gICAgc2V0X2FsbF9lZGdlc19hc19leGVjdXRhYmxlIChmdW4p OwotCi0gIGZvbGRlci5zdWJzdGl0dXRlX2FuZF9mb2xkICgpOwotCi0gIGlmICh3YXJuX2FycmF5 X2JvdW5kcyAmJiB3YXJuX2FycmF5X2JvdW5kc19wKQotICAgIHsKLSAgICAgIGFycmF5X2JvdW5k c19jaGVja2VyIGFycmF5X2NoZWNrZXIgKGZ1biwgJnZycF92cl92YWx1ZXMpOwotICAgICAgYXJy YXlfY2hlY2tlci5jaGVjayAoKTsKLSAgICB9Ci0KLSAgZm9sZGVyLnNpbXBsaWZ5X2Nhc3RlZF9j b25kcyAoZnVuKTsKLQotICBmcmVlX251bWJlcnNfb2ZfaXRlcmF0aW9uc19lc3RpbWF0ZXMgKGZ1 bik7Ci0KLSAgYXNzZXJ0X2VuZ2luZS5yZW1vdmVfcmFuZ2VfYXNzZXJ0aW9ucyAoKTsKLQotICBz Y2V2X2ZpbmFsaXplICgpOwotICBsb29wX29wdGltaXplcl9maW5hbGl6ZSAoKTsKLSAgcmV0dXJu IDA7Ci19Cit9OwogCiAvLyBUaGlzIGlzIGEgcmFuZ2VyIGJhc2VkIGZvbGRlciB3aGljaCBjb250 aW51ZXMgdG8gdXNlIHRoZSBkb21pbmF0b3IKIC8vIHdhbGsgdG8gYWNjZXNzIHRoZSBzdWJzdGl0 dXRlIGFuZCBmb2xkIG1hY2hpbmVyeS4gIFJhbmdlcyBhcmUgY2FsY3VsYXRlZApAQCAtNDYyMSwx MCArMTE5OCw3IEBAIHB1YmxpYzoKICAgICAgIGlmIChteV9wYXNzID09IDApCiAJcmV0dXJuIGV4 ZWN1dGVfcmFuZ2VyX3ZycCAoZnVuLCAvKndhcm5fYXJyYXlfYm91bmRzX3A9Ki9mYWxzZSwgZmFs c2UpOwogCi0gICAgICBpZiAoKG15X3Bhc3MgPT0gMSAmJiBwYXJhbV92cnAxX21vZGUgPT0gVlJQ X01PREVfUkFOR0VSKQotCSAgfHwgKG15X3Bhc3MgPT0gMiAmJiBwYXJhbV92cnAyX21vZGUgPT0g VlJQX01PREVfUkFOR0VSKSkKLQlyZXR1cm4gZXhlY3V0ZV9yYW5nZXJfdnJwIChmdW4sIHdhcm5f YXJyYXlfYm91bmRzX3AsIG15X3Bhc3MgPT0gMik7Ci0gICAgICByZXR1cm4gZXhlY3V0ZV92cnAg KGZ1biwgd2Fybl9hcnJheV9ib3VuZHNfcCk7CisgICAgICByZXR1cm4gZXhlY3V0ZV9yYW5nZXJf dnJwIChmdW4sIHdhcm5fYXJyYXlfYm91bmRzX3AsIG15X3Bhc3MgPT0gMik7CiAgICAgfQogCiAg cHJpdmF0ZToKZGlmZiAtLWdpdCBhL2djYy90cmVlLXZycC5oIGIvZ2NjL3RyZWUtdnJwLmgKaW5k ZXggYjg2NDRlOWQwYTcuLjA3NjMwYjViMWNhIDEwMDY0NAotLS0gYS9nY2MvdHJlZS12cnAuaAor KysgYi9nY2MvdHJlZS12cnAuaApAQCAtMjIsMjYgKzIyLDYgQEAgYWxvbmcgd2l0aCBHQ0M7IHNl ZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKIAogI2luY2x1ZGUgInZhbHVlLXJhbmdl LmgiCiAKLXN0cnVjdCBhc3NlcnRfaW5mbwotewotICAvKiBQcmVkaWNhdGUgY29kZSBmb3IgdGhl IEFTU0VSVF9FWFBSLiAgTXVzdCBiZSBDT01QQVJJU09OX0NMQVNTX1AuICAqLwotICBlbnVtIHRy ZWVfY29kZSBjb21wX2NvZGU7Ci0KLSAgLyogTmFtZSB0byByZWdpc3RlciB0aGUgYXNzZXJ0IGZv ci4gICovCi0gIHRyZWUgbmFtZTsKLQotICAvKiBWYWx1ZSBiZWluZyBjb21wYXJlZCBhZ2FpbnN0 LiAgKi8KLSAgdHJlZSB2YWw7Ci0KLSAgLyogRXhwcmVzc2lvbiB0byBjb21wYXJlLiAgKi8KLSAg dHJlZSBleHByOwotfTsKLQotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yICh0 cmVlLCBlZGdlLCBlbnVtIHRyZWVfY29kZSwKLQkJCQkgICAgICB0cmVlLCB0cmVlLCB2ZWM8YXNz ZXJ0X2luZm8+ICYpOwotZXh0ZXJuIGJvb2wgc3RtdF9pbnRlcmVzdGluZ19mb3JfdnJwIChnaW1w bGUgKik7Ci1leHRlcm4gYm9vbCBpbmZlcl92YWx1ZV9yYW5nZSAoZ2ltcGxlICosIHRyZWUsIHRy ZWVfY29kZSAqLCB0cmVlICopOwotCiBleHRlcm4gYm9vbCByYW5nZV9pbnRfY3N0X3AgKGNvbnN0 IHZhbHVlX3JhbmdlICopOwogCiBleHRlcm4gaW50IGNvbXBhcmVfdmFsdWVzICh0cmVlLCB0cmVl KTsKQEAgLTYwLDExICs0MCw2IEBAIGV4dGVybiBib29sIGZpbmRfY2FzZV9sYWJlbF9yYW5nZSAo Z3N3aXRjaCAqLCB0cmVlLCB0cmVlLCBzaXplX3QgKiwgc2l6ZV90ICopOwogZXh0ZXJuIHRyZWUg ZmluZF9jYXNlX2xhYmVsX3JhbmdlIChnc3dpdGNoICosIGNvbnN0IGlyYW5nZSAqdnIpOwogZXh0 ZXJuIGJvb2wgZmluZF9jYXNlX2xhYmVsX2luZGV4IChnc3dpdGNoICosIHNpemVfdCwgdHJlZSwg c2l6ZV90ICopOwogZXh0ZXJuIGJvb2wgb3ZlcmZsb3dfY29tcGFyaXNvbl9wICh0cmVlX2NvZGUs IHRyZWUsIHRyZWUsIGJvb2wsIHRyZWUgKik7Ci1leHRlcm4gdHJlZSBnZXRfc2luZ2xlX3N5bWJv bCAodHJlZSwgYm9vbCAqLCB0cmVlICopOwogZXh0ZXJuIHZvaWQgbWF5YmVfc2V0X25vbnplcm9f Yml0cyAoZWRnZSwgdHJlZSk7Ci1leHRlcm4gd2lkZV9pbnQgbWFza2VkX2luY3JlbWVudCAoY29u c3Qgd2lkZV9pbnQgJnZhbF9pbiwgY29uc3Qgd2lkZV9pbnQgJm1hc2ssCi0JCQkJICBjb25zdCB3 aWRlX2ludCAmc2duYml0LCB1bnNpZ25lZCBpbnQgcHJlYyk7CiAKLWV4dGVybiB1bnNpZ25lZCBp bnQgZXhlY3V0ZV9yYW5nZXJfdnJwIChzdHJ1Y3QgZnVuY3Rpb24gKmZ1biwKLQkJCQkJYm9vbCB3 YXJuX2FycmF5X2JvdW5kc19wID0gZmFsc2UpOwogI2VuZGlmIC8qIEdDQ19UUkVFX1ZSUF9IICov CmRpZmYgLS1naXQgYS9nY2MvdmFsdWUtcmFuZ2UuY2MgYi9nY2MvdmFsdWUtcmFuZ2UuY2MKaW5k ZXggMzRmYWM2MzZjYWQuLjNiZTAyMTgzOThiIDEwMDY0NAotLS0gYS9nY2MvdmFsdWUtcmFuZ2Uu Y2MKKysrIGIvZ2NjL3ZhbHVlLXJhbmdlLmNjCkBAIC0xMTk3LDEyICsxMTk3LDYgQEAgd2lkZV9p bnQKIGlyYW5nZTo6bGVnYWN5X2xvd2VyX2JvdW5kICh1bnNpZ25lZCBwYWlyKSBjb25zdAogewog ICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChsZWdhY3lfbW9kZV9wICgpKTsKLSAgaWYgKHN5bWJvbGlj X3AgKCkpCi0gICAgewotICAgICAgdmFsdWVfcmFuZ2UgbnVtZXJpY19yYW5nZSAoKnRoaXMpOwot ICAgICAgbnVtZXJpY19yYW5nZS5ub3JtYWxpemVfc3ltYm9saWNzICgpOwotICAgICAgcmV0dXJu IG51bWVyaWNfcmFuZ2UubGVnYWN5X2xvd2VyX2JvdW5kIChwYWlyKTsKLSAgICB9CiAgIGdjY19j aGVja2luZ19hc3NlcnQgKG1fbnVtX3JhbmdlcyA+IDApOwogICBnY2NfY2hlY2tpbmdfYXNzZXJ0 IChwYWlyICsgMSA8PSBudW1fcGFpcnMgKCkpOwogICBpZiAobV9raW5kID09IFZSX0FOVElfUkFO R0UpCkBAIC0xMjI0LDEyICsxMjE4LDYgQEAgd2lkZV9pbnQKIGlyYW5nZTo6bGVnYWN5X3VwcGVy X2JvdW5kICh1bnNpZ25lZCBwYWlyKSBjb25zdAogewogICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChs ZWdhY3lfbW9kZV9wICgpKTsKLSAgaWYgKHN5bWJvbGljX3AgKCkpCi0gICAgewotICAgICAgdmFs dWVfcmFuZ2UgbnVtZXJpY19yYW5nZSAoKnRoaXMpOwotICAgICAgbnVtZXJpY19yYW5nZS5ub3Jt YWxpemVfc3ltYm9saWNzICgpOwotICAgICAgcmV0dXJuIG51bWVyaWNfcmFuZ2UubGVnYWN5X3Vw cGVyX2JvdW5kIChwYWlyKTsKLSAgICB9CiAgIGdjY19jaGVja2luZ19hc3NlcnQgKG1fbnVtX3Jh bmdlcyA+IDApOwogICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChwYWlyICsgMSA8PSBudW1fcGFpcnMg KCkpOwogICBpZiAobV9raW5kID09IFZSX0FOVElfUkFOR0UpCkBAIC0xMjk3LDE2ICsxMjg1LDYg QEAgaXJhbmdlOjpvcGVyYXRvcj09IChjb25zdCBpcmFuZ2UgJm90aGVyKSBjb25zdAogICByZXR1 cm4gZ2V0X25vbnplcm9fYml0cyAoKSA9PSBvdGhlci5nZXRfbm9uemVyb19iaXRzICgpOwogfQog Ci0vKiBSZXR1cm4gVFJVRSBpZiB0aGlzIGlzIGEgc3ltYm9saWMgcmFuZ2UuICAqLwotCi1ib29s Ci1pcmFuZ2U6OnN5bWJvbGljX3AgKCkgY29uc3QKLXsKLSAgcmV0dXJuIChtX251bV9yYW5nZXMg PiAwCi0JICAmJiAoIWlzX2dpbXBsZV9taW5faW52YXJpYW50IChtaW4gKCkpCi0JICAgICAgfHwg IWlzX2dpbXBsZV9taW5faW52YXJpYW50IChtYXggKCkpKSk7Ci19Ci0KIC8qIFJldHVybiBUUlVF IGlmIHRoaXMgaXMgYSBjb25zdGFudCByYW5nZS4gICovCiAKIGJvb2wKQEAgLTE0MjYsMTIgKzE0 MDQsNiBAQCBpcmFuZ2U6OmNvbnRhaW5zX3AgKHRyZWUgY3N0KSBjb25zdAogICBpZiAobGVnYWN5 X21vZGVfcCAoKSkKICAgICB7CiAgICAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChUUkVFX0NPREUg KGNzdCkgPT0gSU5URUdFUl9DU1QpOwotICAgICAgaWYgKHN5bWJvbGljX3AgKCkpCi0JewotCSAg dmFsdWVfcmFuZ2UgbnVtZXJpY19yYW5nZSAoKnRoaXMpOwotCSAgbnVtZXJpY19yYW5nZS5ub3Jt YWxpemVfc3ltYm9saWNzICgpOwotCSAgcmV0dXJuIG51bWVyaWNfcmFuZ2UuY29udGFpbnNfcCAo Y3N0KTsKLQl9CiAgICAgICByZXR1cm4gdmFsdWVfaW5zaWRlX3JhbmdlIChjc3QpID09IDE7CiAg ICAgfQogCmRpZmYgLS1naXQgYS9nY2MvdmFsdWUtcmFuZ2UuaCBiL2djYy92YWx1ZS1yYW5nZS5o CmluZGV4IGM4NzczNGRkOGNkLi4wZTM5NTE4OTcwOCAxMDA2NDQKLS0tIGEvZ2NjL3ZhbHVlLXJh bmdlLmgKKysrIGIvZ2NjL3ZhbHVlLXJhbmdlLmgKQEAgLTE2Myw3ICsxNjMsNiBAQCBwdWJsaWM6 CiAgIC8vIERlcHJlY2F0ZWQgbGVnYWN5IHB1YmxpYyBtZXRob2RzLgogICB0cmVlIG1pbiAoKSBj b25zdDsJCQkJLy8gREVQUkVDQVRFRAogICB0cmVlIG1heCAoKSBjb25zdDsJCQkJLy8gREVQUkVD QVRFRAotICBib29sIHN5bWJvbGljX3AgKCkgY29uc3Q7CQkJLy8gREVQUkVDQVRFRAogICBib29s IGNvbnN0YW50X3AgKCkgY29uc3Q7CQkJLy8gREVQUkVDQVRFRAogICB2b2lkIG5vcm1hbGl6ZV9z eW1ib2xpY3MgKCk7CQkJLy8gREVQUkVDQVRFRAogICB2b2lkIG5vcm1hbGl6ZV9hZGRyZXNzZXMg KCk7CQkJLy8gREVQUkVDQVRFRApkaWZmIC0tZ2l0IGEvZ2NjL3ZyLXZhbHVlcy5jYyBiL2djYy92 ci12YWx1ZXMuY2MKaW5kZXggNzFmZWQxZTZhN2UuLmExMDNjMDhiYTM1IDEwMDY0NAotLS0gYS9n Y2MvdnItdmFsdWVzLmNjCisrKyBiL2djYy92ci12YWx1ZXMuY2MKQEAgLTUyLDQxNSArNTIsNiBA QCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2lu Y2x1ZGUgInJhbmdlLW9wLmgiCiAjaW5jbHVkZSAiZ2ltcGxlLXJhbmdlLmgiCiAKLS8qIFNldCB2 YWx1ZSByYW5nZSBWUiB0byBhIG5vbi1uZWdhdGl2ZSByYW5nZSBvZiB0eXBlIFRZUEUuICAqLwot Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXNldF92YWx1ZV9yYW5nZV90b19ub25uZWdhdGl2ZSAodmFs dWVfcmFuZ2VfZXF1aXYgKnZyLCB0cmVlIHR5cGUpCi17Ci0gIHRyZWUgemVybyA9IGJ1aWxkX2lu dF9jc3QgKHR5cGUsIDApOwotICB2ci0+dXBkYXRlICh6ZXJvLCB2cnBfdmFsX21heCAodHlwZSkp OwotfQotCi0vKiBTZXQgdmFsdWUgcmFuZ2UgVlIgdG8gYSByYW5nZSBvZiBhIHRydXRodmFsdWUg b2YgdHlwZSBUWVBFLiAgKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi1zZXRfdmFsdWVfcmFuZ2Vf dG9fdHJ1dGh2YWx1ZSAodmFsdWVfcmFuZ2VfZXF1aXYgKnZyLCB0cmVlIHR5cGUpCi17Ci0gIGlm IChUWVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gMSkKLSAgICB2ci0+c2V0X3ZhcnlpbmcgKHR5cGUp OwotICBlbHNlCi0gICAgdnItPnVwZGF0ZSAoYnVpbGRfaW50X2NzdCAodHlwZSwgMCksIGJ1aWxk X2ludF9jc3QgKHR5cGUsIDEpKTsKLX0KLQotLyogUmV0dXJuIHRoZSBsYXR0aWNlIGVudHJ5IGZv ciBWQVIgb3IgTlVMTCBpZiBpdCBkb2Vzbid0IGV4aXN0IG9yIGNhbm5vdAotICAgYmUgaW5pdGlh bGl6ZWQuICAqLwotCi12YWx1ZV9yYW5nZV9lcXVpdiAqCi12cl92YWx1ZXM6OmdldF9sYXR0aWNl X2VudHJ5IChjb25zdF90cmVlIHZhcikKLXsKLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyOwotICB0 cmVlIHN5bTsKLSAgdW5zaWduZWQgdmVyID0gU1NBX05BTUVfVkVSU0lPTiAodmFyKTsKLQotICAv KiBJZiB3ZSBxdWVyeSB0aGUgZW50cnkgZm9yIGEgbmV3IFNTQSBuYW1lIGF2b2lkIHJlYWxsb2Nh dGluZyB0aGUgbGF0dGljZQotICAgICBzaW5jZSB3ZSBzaG91bGQgZ2V0IGhlcmUgYXQgbW9zdCBm cm9tIHRoZSBzdWJzdGl0dXRlLWFuZC1mb2xkIHN0YWdlIHdoaWNoCi0gICAgIHdpbGwgbmV2ZXIg dHJ5IHRvIGNoYW5nZSB2YWx1ZXMuICAqLwotICBpZiAodmVyID49IG51bV92cl92YWx1ZXMpCi0g ICAgcmV0dXJuIE5VTEw7Ci0KLSAgdnIgPSB2cl92YWx1ZVt2ZXJdOwotICBpZiAodnIpCi0gICAg cmV0dXJuIHZyOwotCi0gIC8qIENyZWF0ZSBhIGRlZmF1bHQgdmFsdWUgcmFuZ2UuICAqLwotICB2 ciA9IGFsbG9jYXRlX3ZhbHVlX3JhbmdlX2VxdWl2ICgpOwotICB2cl92YWx1ZVt2ZXJdID0gdnI7 Ci0KLSAgLyogQWZ0ZXIgcHJvcGFnYXRpb24gZmluaXNoZWQgcmV0dXJuIHZhcnlpbmcuICAqLwot ICBpZiAodmFsdWVzX3Byb3BhZ2F0ZWQpCi0gICAgewotICAgICAgdnItPnNldF92YXJ5aW5nIChU UkVFX1RZUEUgKHZhcikpOwotICAgICAgcmV0dXJuIHZyOwotICAgIH0KLQotICB2ci0+c2V0X3Vu ZGVmaW5lZCAoKTsKLQotICAvKiBJZiBWQVIgaXMgYSBkZWZhdWx0IGRlZmluaXRpb24gb2YgYSBw YXJhbWV0ZXIsIHRoZSB2YXJpYWJsZSBjYW4KLSAgICAgdGFrZSBhbnkgdmFsdWUgaW4gVkFSJ3Mg dHlwZS4gICovCi0gIGlmIChTU0FfTkFNRV9JU19ERUZBVUxUX0RFRiAodmFyKSkKLSAgICB7Ci0g ICAgICBzeW0gPSBTU0FfTkFNRV9WQVIgKHZhcik7Ci0gICAgICBpZiAoVFJFRV9DT0RFIChzeW0p ID09IFBBUk1fREVDTCkKLQl7Ci0JICAvKiBUcnkgdG8gdXNlIHRoZSAibm9ubnVsbCIgYXR0cmli dXRlIHRvIGNyZWF0ZSB+WzAsIDBdCi0JICAgICBhbnRpLXJhbmdlcyBmb3IgcG9pbnRlcnMuICBO b3RlIHRoYXQgdGhpcyBpcyBvbmx5IHZhbGlkIHdpdGgKLQkgICAgIGRlZmF1bHQgZGVmaW5pdGlv bnMgb2YgUEFSTV9ERUNMcy4gICovCi0JICBpZiAoUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAo c3ltKSkKLQkgICAgICAmJiAobm9ubnVsbF9hcmdfcCAoc3ltKQotCQkgIHx8IChnZXRfZ2xvYmFs X3JhbmdlX3F1ZXJ5ICgpLT5yYW5nZV9vZl9leHByICgqdnIsCi0JCQkJCQljb25zdF9jYXN0IDx0 cmVlPiAodmFyKSkKLQkJICAgICAgJiYgdnItPm5vbnplcm9fcCAoKSkpKQotCSAgICB7Ci0JICAg ICAgdnItPnNldF9ub256ZXJvIChUUkVFX1RZUEUgKHN5bSkpOwotCSAgICAgIHZyLT5lcXVpdl9j bGVhciAoKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUg KHN5bSkpKQotCSAgICB7Ci0JICAgICAgZ2V0X2dsb2JhbF9yYW5nZV9xdWVyeSAoKS0+cmFuZ2Vf b2ZfZXhwciAoKnZyLCBjb25zdF9jYXN0IDx0cmVlPiAodmFyKSk7Ci0JICAgICAgaWYgKHZyLT51 bmRlZmluZWRfcCAoKSkKLQkJdnItPnNldF92YXJ5aW5nIChUUkVFX1RZUEUgKHN5bSkpOwotCSAg ICB9Ci0JICBlbHNlCi0JICAgIHZyLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChzeW0pKTsKLQl9 Ci0gICAgICBlbHNlIGlmIChUUkVFX0NPREUgKHN5bSkgPT0gUkVTVUxUX0RFQ0wKLQkgICAgICAg JiYgREVDTF9CWV9SRUZFUkVOQ0UgKHN5bSkpCi0JewotCSAgdnItPnNldF9ub256ZXJvIChUUkVF X1RZUEUgKHN5bSkpOwotCSAgdnItPmVxdWl2X2NsZWFyICgpOwotCX0KLSAgICB9Ci0KLSAgcmV0 dXJuIHZyOwotfQotCi0vKiBSZXR1cm4gdmFsdWUgcmFuZ2UgaW5mb3JtYXRpb24gZm9yIFZBUi4K LQotICAgSWYgd2UgaGF2ZSBubyB2YWx1ZXMgcmFuZ2VzIHJlY29yZGVkIChpZSwgVlJQIGlzIG5v dCBydW5uaW5nKSwgdGhlbgotICAgcmV0dXJuIE5VTEwuICBPdGhlcndpc2UgY3JlYXRlIGFuIGVt cHR5IHJhbmdlIGlmIG5vbmUgZXhpc3RlZCBmb3IgVkFSLiAgKi8KLQotY29uc3QgdmFsdWVfcmFu Z2VfZXF1aXYgKgotdnJfdmFsdWVzOjpnZXRfdmFsdWVfcmFuZ2UgKGNvbnN0X3RyZWUgdmFyLAot CQkJICAgIGdpbXBsZSAqc3RtdCBBVFRSSUJVVEVfVU5VU0VEKQotewotICAvKiBJZiB3ZSBoYXZl IG5vIHJlY29yZGVkIHJhbmdlcywgdGhlbiByZXR1cm4gTlVMTC4gICovCi0gIGlmICghdnJfdmFs dWUpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyID0gZ2V0X2xh dHRpY2VfZW50cnkgKHZhcik7Ci0KLSAgLyogUmVhbGxvY2F0ZSB0aGUgbGF0dGljZSBpZiBuZWVk ZWQuICAqLwotICBpZiAoIXZyKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBvbGRfc3ogPSBu dW1fdnJfdmFsdWVzOwotICAgICAgbnVtX3ZyX3ZhbHVlcyA9IG51bV9zc2FfbmFtZXMgKyBudW1f c3NhX25hbWVzIC8gMTA7Ci0gICAgICB2cl92YWx1ZSA9IFhSRVNJWkVWRUMgKHZhbHVlX3Jhbmdl X2VxdWl2ICosIHZyX3ZhbHVlLCBudW1fdnJfdmFsdWVzKTsKLSAgICAgIGZvciAoIDsgb2xkX3N6 IDwgbnVtX3ZyX3ZhbHVlczsgb2xkX3N6KyspCi0gICAgICAgIHZyX3ZhbHVlIFtvbGRfc3pdID0g TlVMTDsKLQotICAgICAgLyogTm93IHRoYXQgdGhlIGxhdHRpY2UgaGFzIGJlZW4gcmVzaXplZCwg d2Ugc2hvdWxkIG5ldmVyIGZhaWwuICAqLwotICAgICAgdnIgPSBnZXRfbGF0dGljZV9lbnRyeSAo dmFyKTsKLSAgICAgIGdjY19hc3NlcnQgKHZyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHZyOwotfQot Ci1ib29sCi12cl92YWx1ZXM6OnJhbmdlX29mX2V4cHIgKHZyYW5nZSAmciwgdHJlZSBleHByLCBn aW1wbGUgKnN0bXQpCi17Ci0gIGlmICghZ2ltcGxlX3JhbmdlX3NzYV9wIChleHByKSkKLSAgICBy ZXR1cm4gZ2V0X3RyZWVfcmFuZ2UgKHIsIGV4cHIsIHN0bXQpOwotCi0gIGlmIChjb25zdCB2YWx1 ZV9yYW5nZSAqdnIgPSBnZXRfdmFsdWVfcmFuZ2UgKGV4cHIsIHN0bXQpKQotICAgIHsKLSAgICAg IGlmICghdnItPnN1cHBvcnRzX3R5cGVfcCAoVFJFRV9UWVBFIChleHByKSkpCi0JewotCSAgLy8g dnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Jhc2ljKCkgdXNlIG9mIHJhbmdlcidzCi0JICAvLyBm b2xkX3JhbmdlKCkgY2FuIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB3ZSBhcmUgYXNrZWQKLQkg IC8vIGZvciB0aGUgcmFuZ2Ugb2YgYW4gdW5zdXBwb3J0ZWQgbGVnYWN5IHR5cGUuICBTaW5jZQot CSAgLy8gZ2V0X3ZhbHVlX3JhbmdlKCkgYWJvdmUgd2lsbCByZXR1cm4gdmFyeWluZyBvciB1bmRl ZmluZWQKLQkgIC8vIGZvciBzdWNoIHR5cGVzLCBhdm9pZCBjb3B5aW5nIGluY29tcGF0aWJsZSBy YW5nZSB0eXBlcy4KLQkgIGlmICh2ci0+dW5kZWZpbmVkX3AgKCkpCi0JICAgIHIuc2V0X3VuZGVm aW5lZCAoKTsKLQkgIGVsc2UKLQkgICAgci5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChleHByKSk7 Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBpZiAodnItPnVuZGVmaW5lZF9wICgpIHx8IHZy LT5jb25zdGFudF9wICgpKQotCXIgPSAqdnI7Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWVfcmFu Z2UgdG1wID0gKnZyOwotCSAgdG1wLm5vcm1hbGl6ZV9zeW1ib2xpY3MgKCk7Ci0JICByID0gdG1w OwotCX0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi10 cmVlCi12cl92YWx1ZXM6OnZhbHVlX29mX2V4cHIgKHRyZWUgb3AsIGdpbXBsZSAqKQotewotICBy ZXR1cm4gb3Bfd2l0aF9jb25zdGFudF9zaW5nbGV0b25fdmFsdWVfcmFuZ2UgKG9wKTsKLX0KLQot dHJlZQotdnJfdmFsdWVzOjp2YWx1ZV9vbl9lZGdlIChlZGdlLCB0cmVlIG9wKQotewotICByZXR1 cm4gb3Bfd2l0aF9jb25zdGFudF9zaW5nbGV0b25fdmFsdWVfcmFuZ2UgKG9wKTsKLX0KLQotdHJl ZQotdnJfdmFsdWVzOjp2YWx1ZV9vZl9zdG10IChnaW1wbGUgKnN0bXQsIHRyZWUgb3ApCi17Ci0g IGlmICghb3ApCi0gICAgb3AgPSBnaW1wbGVfZ2V0X2xocyAoc3RtdCk7Ci0KLSAgZ2NjX2NoZWNr aW5nX2Fzc2VydCAoIW9wfHwgb3AgPT0gZ2ltcGxlX2dldF9saHMgKHN0bXQpKTsKLQotICBpZiAo b3ApCi0gICAgcmV0dXJuIG9wX3dpdGhfY29uc3RhbnRfc2luZ2xldG9uX3ZhbHVlX3JhbmdlIChv cCk7Ci0gIHJldHVybiBOVUxMX1RSRUU7Ci19Ci0KLS8qIFNldCB0aGUgbGF0dGljZSBlbnRyeSBm b3IgREVGIHRvIFZBUllJTkcuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OnNldF9kZWZfdG9fdmFy eWluZyAoY29uc3RfdHJlZSBkZWYpCi17Ci0gIHZhbHVlX3JhbmdlX2VxdWl2ICp2ciA9IGdldF9s YXR0aWNlX2VudHJ5IChkZWYpOwotICBpZiAodnIpCi0gICAgdnItPnNldF92YXJ5aW5nIChUUkVF X1RZUEUgKGRlZikpOwotfQotCi0vKiBTZXQgdmFsdWUtcmFuZ2VzIG9mIGFsbCBTU0EgbmFtZXMg ZGVmaW5lZCBieSBTVE1UIHRvIHZhcnlpbmcuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OnNldF9k ZWZzX3RvX3ZhcnlpbmcgKGdpbXBsZSAqc3RtdCkKLXsKLSAgc3NhX29wX2l0ZXIgaTsKLSAgdHJl ZSBkZWY7Ci0gIEZPUl9FQUNIX1NTQV9UUkVFX09QRVJBTkQgKGRlZiwgc3RtdCwgaSwgU1NBX09Q X0RFRikKLSAgICBzZXRfZGVmX3RvX3ZhcnlpbmcgKGRlZik7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUg dmFsdWUgcmFuZ2UgYW5kIGVxdWl2YWxlbmNlIHNldCBmb3IgdmFyaWFibGUgVkFSIHRvCi0gICBO RVdfVlIuICBSZXR1cm4gdHJ1ZSBpZiBORVdfVlIgaXMgZGlmZmVyZW50IGZyb20gVkFSJ3MgcHJl dmlvdXMKLSAgIHZhbHVlLgotCi0gICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBO RVdfVlIgaXMgYSB0ZW1wb3JhcnkgdmFsdWUgcmFuZ2UKLSAgIG9iamVjdCBjcmVhdGVkIGZvciB0 aGUgc29sZSBwdXJwb3NlIG9mIHVwZGF0aW5nIFZBUidzIHJhbmdlLiAgVGhlCi0gICBzdG9yYWdl IHVzZWQgYnkgdGhlIGVxdWl2YWxlbmNlIHNldCBmcm9tIE5FV19WUiB3aWxsIGJlIGZyZWVkIGJ5 Ci0gICB0aGlzIGZ1bmN0aW9uLiAgRG8gbm90IGNhbGwgdXBkYXRlX3ZhbHVlX3JhbmdlIHdoZW4g TkVXX1ZSCi0gICBpcyB0aGUgcmFuZ2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIFNT QSBuYW1lLiAgKi8KLQotYm9vbAotdnJfdmFsdWVzOjp1cGRhdGVfdmFsdWVfcmFuZ2UgKGNvbnN0 X3RyZWUgdmFyLCB2YWx1ZV9yYW5nZV9lcXVpdiAqbmV3X3ZyKQotewotICB2YWx1ZV9yYW5nZV9l cXVpdiAqb2xkX3ZyOwotICBib29sIGlzX25ldzsKLQotICAvKiBJZiB0aGVyZSBpcyBhIHZhbHVl LXJhbmdlIG9uIHRoZSBTU0EgbmFtZSBmcm9tIGVhcmxpZXIgYW5hbHlzaXMKLSAgICAgZmFjdG9y IHRoYXQgaW4uICAqLwotICBpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKHZhcikpKQot ICAgIHsKLSAgICAgIHZhbHVlX3JhbmdlX2VxdWl2IG5yOwotICAgICAgZ2V0X2dsb2JhbF9yYW5n ZV9xdWVyeSAoKS0+cmFuZ2Vfb2ZfZXhwciAobnIsIGNvbnN0X2Nhc3QgPHRyZWU+ICh2YXIpKTsK LSAgICAgIGlmICghbnIudW5kZWZpbmVkX3AgKCkpCi0JbmV3X3ZyLT5sZWdhY3lfdmVyYm9zZV9p bnRlcnNlY3QgKCZucik7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgdmFsdWUgcmFuZ2UsIGlm IG5lY2Vzc2FyeS4gIElmIHdlIGNhbm5vdCBhbGxvY2F0ZSBhIGxhdHRpY2UKLSAgICAgZW50cnkg Zm9yIFZBUiBrZWVwIGl0IGF0IFZBUllJTkcuICBUaGlzIGhhcHBlbnMgd2hlbiBET00gZmVlZHMg dXMgc3RtdHMKLSAgICAgd2l0aCBTU0EgbmFtZXMgYWxsb2NhdGVkIGFmdGVyIHNldHRpbmcgdXAg dGhlIGxhdHRpY2UuICAqLwotICBvbGRfdnIgPSBnZXRfbGF0dGljZV9lbnRyeSAodmFyKTsKLSAg aWYgKCFvbGRfdnIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpc19uZXcgPSAhb2xkX3ZyLT5lcXVh bF9wICgqbmV3X3ZyLCAvKmlnbm9yZV9lcXVpdnM9Ki9mYWxzZSk7Ci0KLSAgaWYgKGlzX25ldykK LSAgICB7Ci0gICAgICAvKiBEbyBub3QgYWxsb3cgdHJhbnNpdGlvbnMgdXAgdGhlIGxhdHRpY2Uu ICBUaGUgZm9sbG93aW5nCi0JIGlzIHNsaWdodGx5IG1vcmUgYXdrd2FyZCB0aGFuIGp1c3QgbmV3 X3ZyLT50eXBlIDwgb2xkX3ZyLT50eXBlCi0JIGJlY2F1c2UgVlJfUkFOR0UgYW5kIFZSX0FOVElf UkFOR0UgbmVlZCB0byBiZSBjb25zaWRlcmVkCi0JIHRoZSBzYW1lLiAgV2UgbWF5IG5vdCBoYXZl IGlzX25ldyB3aGVuIHRyYW5zaXRpb25pbmcgdG8KLQkgVU5ERUZJTkVELiAgSWYgb2xkX3ZyLT50 eXBlIGlzIFZBUllJTkcsIHdlIHNob3VsZG4ndCBiZQotCSBjYWxsZWQsIGlmIHdlIGFyZSBhbnl3 YXksIGtlZXAgaXQgVkFSWUlORy4gICovCi0gICAgICBpZiAob2xkX3ZyLT52YXJ5aW5nX3AgKCkp Ci0JewotCSAgbmV3X3ZyLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFICh2YXIpKTsKLQkgIGlzX25l dyA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKG5ld192ci0+dW5kZWZpbmVkX3AgKCkpCi0J ewotCSAgb2xkX3ZyLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFICh2YXIpKTsKLQkgIG5ld192ci0+ c2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAodmFyKSk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAg ICBlbHNlCi0Jb2xkX3ZyLT5zZXQgKG5ld192ci0+bWluICgpLCBuZXdfdnItPm1heCAoKSwgbmV3 X3ZyLT5lcXVpdiAoKSwKLQkJICAgICBuZXdfdnItPmtpbmQgKCkpOwotICAgIH0KLQotICBuZXdf dnItPmVxdWl2X2NsZWFyICgpOwotCi0gIHJldHVybiBpc19uZXc7Ci19Ci0KLS8qIFJldHVybiB0 cnVlIGlmIHZhbHVlIHJhbmdlIFZSIGludm9sdmVzIGV4YWN0bHkgb25lIHN5bWJvbCBTWU0uICAq LwotCi1zdGF0aWMgYm9vbAotc3ltYm9saWNfcmFuZ2VfYmFzZWRfb25fcCAodmFsdWVfcmFuZ2Ug KnZyLCBjb25zdF90cmVlIHN5bSkKLXsKLSAgYm9vbCBuZWcsIG1pbl9oYXNfc3ltYm9sLCBtYXhf aGFzX3N5bWJvbDsKLSAgdHJlZSBpbnY7Ci0KLSAgaWYgKGlzX2dpbXBsZV9taW5faW52YXJpYW50 ICh2ci0+bWluICgpKSkKLSAgICBtaW5faGFzX3N5bWJvbCA9IGZhbHNlOwotICBlbHNlIGlmIChn ZXRfc2luZ2xlX3N5bWJvbCAodnItPm1pbiAoKSwgJm5lZywgJmludikgPT0gc3ltKQotICAgIG1p bl9oYXNfc3ltYm9sID0gdHJ1ZTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAo aXNfZ2ltcGxlX21pbl9pbnZhcmlhbnQgKHZyLT5tYXggKCkpKQotICAgIG1heF9oYXNfc3ltYm9s ID0gZmFsc2U7Ci0gIGVsc2UgaWYgKGdldF9zaW5nbGVfc3ltYm9sICh2ci0+bWF4ICgpLCAmbmVn LCAmaW52KSA9PSBzeW0pCi0gICAgbWF4X2hhc19zeW1ib2wgPSB0cnVlOwotICBlbHNlCi0gICAg cmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiAobWluX2hhc19zeW1ib2wgfHwgbWF4X2hhc19zeW1i b2wpOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IG9mIGFzc2lnbm1lbnQgU1RN VCBpcyBrbm93IHRvIGJlIG5vbi16ZXJvLiAgKi8KLQotc3RhdGljIGJvb2wKLWdpbXBsZV9hc3Np Z25fbm9uemVyb19wIChnaW1wbGUgKnN0bXQpCi17Ci0gIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBn aW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KTsKLSAgYm9vbCBzdHJpY3Rfb3ZlcmZsb3dfcDsK LSAgdHJlZSB0eXBlID0gVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAoc3RtdCkpOwotICBz d2l0Y2ggKGdldF9naW1wbGVfcmhzX2NsYXNzIChjb2RlKSkKLSAgICB7Ci0gICAgY2FzZSBHSU1Q TEVfVU5BUllfUkhTOgotICAgICAgcmV0dXJuIHRyZWVfdW5hcnlfbm9uemVyb193YXJudl9wIChn aW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSwKLQkJCQkJIHR5cGUsCi0JCQkJCSBnaW1wbGVf YXNzaWduX3JoczEgKHN0bXQpLAotCQkJCQkgJnN0cmljdF9vdmVyZmxvd19wKTsKLSAgICBjYXNl IEdJTVBMRV9CSU5BUllfUkhTOgotICAgICAgcmV0dXJuIHRyZWVfYmluYXJ5X25vbnplcm9fd2Fy bnZfcCAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCksCi0JCQkJCSAgdHlwZSwKLQkJCQkJ ICBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpLAotCQkJCQkgIGdpbXBsZV9hc3NpZ25fcmhzMiAo c3RtdCksCi0JCQkJCSAgJnN0cmljdF9vdmVyZmxvd19wKTsKLSAgICBjYXNlIEdJTVBMRV9URVJO QVJZX1JIUzoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIEdJTVBMRV9TSU5HTEVfUkhT OgotICAgICAgcmV0dXJuIHRyZWVfc2luZ2xlX25vbnplcm9fd2FybnZfcCAoZ2ltcGxlX2Fzc2ln bl9yaHMxIChzdG10KSwKLQkJCQkJICAmc3RyaWN0X292ZXJmbG93X3ApOwotICAgIGNhc2UgR0lN UExFX0lOVkFMSURfUkhTOgotICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwotICAgIGRlZmF1bHQ6 Ci0gICAgICBnY2NfdW5yZWFjaGFibGUgKCk7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdHJ1ZSBp ZiBTVE1UIGlzIGtub3duIHRvIGNvbXB1dGUgYSBub24temVybyB2YWx1ZS4gICovCi0KLXN0YXRp YyBib29sCi1naW1wbGVfc3RtdF9ub256ZXJvX3AgKGdpbXBsZSAqc3RtdCkKLXsKLSAgc3dpdGNo IChnaW1wbGVfY29kZSAoc3RtdCkpCi0gICAgewotICAgIGNhc2UgR0lNUExFX0FTU0lHTjoKLSAg ICAgIHJldHVybiBnaW1wbGVfYXNzaWduX25vbnplcm9fcCAoc3RtdCk7Ci0gICAgY2FzZSBHSU1Q TEVfQ0FMTDoKLSAgICAgIHsKLSAgICAgICAgZ2NhbGwgKmNhbGxfc3RtdCA9IGFzX2E8Z2NhbGwg Kj4gKHN0bXQpOwotCXJldHVybiAoZ2ltcGxlX2NhbGxfbm9ubnVsbF9yZXN1bHRfcCAoY2FsbF9z dG10KQotCQl8fCBnaW1wbGVfY2FsbF9ub25udWxsX2FyZyAoY2FsbF9zdG10KSk7Ci0gICAgICB9 Ci0gICAgZGVmYXVsdDoKLSAgICAgIGdjY191bnJlYWNoYWJsZSAoKTsKLSAgICB9Ci19Ci0vKiBM aWtlIHRyZWVfZXhwcl9ub256ZXJvX3AsIGJ1dCB0aGlzIGZ1bmN0aW9uIHVzZXMgdmFsdWUgcmFu Z2VzCi0gICBvYnRhaW5lZCBzbyBmYXIuICAqLwotCi1ib29sCi12cl92YWx1ZXM6OnZycF9zdG10 X2NvbXB1dGVzX25vbnplcm8gKGdpbXBsZSAqc3RtdCkKLXsKLSAgaWYgKGdpbXBsZV9zdG10X25v bnplcm9fcCAoc3RtdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbiBl eHByZXNzaW9uIG9mIHRoZSBmb3JtICZYLT5hLCB0aGVuIHRoZSBleHByZXNzaW9uCi0gICAgIGlz IG5vbm51bGwgaWYgWCBpcyBub25udWxsLiAgKi8KLSAgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKHN0 bXQpCi0gICAgICAmJiBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSA9PSBBRERSX0VYUFIp Ci0gICAgewotICAgICAgdHJlZSBleHByID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKLSAg ICAgIHBvbHlfaW50NjQgYml0c2l6ZSwgYml0cG9zOwotICAgICAgdHJlZSBvZmZzZXQ7Ci0gICAg ICBtYWNoaW5lX21vZGUgbW9kZTsKLSAgICAgIGludCB1bnNpZ25lZHAsIHJldmVyc2VwLCB2b2xh dGlsZXA7Ci0gICAgICB0cmVlIGJhc2UgPSBnZXRfaW5uZXJfcmVmZXJlbmNlIChUUkVFX09QRVJB TkQgKGV4cHIsIDApLCAmYml0c2l6ZSwKLQkJCQkgICAgICAgJmJpdHBvcywgJm9mZnNldCwgJm1v ZGUsICZ1bnNpZ25lZHAsCi0JCQkJICAgICAgICZyZXZlcnNlcCwgJnZvbGF0aWxlcCk7Ci0KLSAg ICAgIGlmIChiYXNlICE9IE5VTExfVFJFRQotCSAgJiYgVFJFRV9DT0RFIChiYXNlKSA9PSBNRU1f UkVGCi0JICAmJiBUUkVFX0NPREUgKFRSRUVfT1BFUkFORCAoYmFzZSwgMCkpID09IFNTQV9OQU1F KQotCXsKLQkgIHBvbHlfb2Zmc2V0X2ludCBvZmYgPSAwOwotCSAgYm9vbCBvZmZfY3N0ID0gZmFs c2U7Ci0JICBpZiAob2Zmc2V0ID09IE5VTExfVFJFRSB8fCBUUkVFX0NPREUgKG9mZnNldCkgPT0g SU5URUdFUl9DU1QpCi0JICAgIHsKLQkgICAgICBvZmYgPSBtZW1fcmVmX29mZnNldCAoYmFzZSk7 Ci0JICAgICAgaWYgKG9mZnNldCkKLQkJb2ZmICs9IHBvbHlfb2Zmc2V0X2ludDo6ZnJvbSAod2k6 OnRvX3BvbHlfd2lkZSAob2Zmc2V0KSwKLQkJCQkJICAgICAgU0lHTkVEKTsKLQkgICAgICBvZmYg PDw9IExPRzJfQklUU19QRVJfVU5JVDsKLQkgICAgICBvZmYgKz0gYml0cG9zOwotCSAgICAgIG9m Zl9jc3QgPSB0cnVlOwotCSAgICB9Ci0JICAvKiBJZiAmWC0+YSBpcyBlcXVhbCB0byBYIGFuZCBY IGlzIH5bMCwgMF0sIHRoZSByZXN1bHQgaXMgdG9vLgotCSAgICAgRm9yIC1mZGVsZXRlLW51bGwt cG9pbnRlci1jaGVja3MgLWZuby13cmFwdi1wb2ludGVyIHdlIGRvbid0Ci0JICAgICBhbGxvdyBn b2luZyBmcm9tIG5vbi1OVUxMIHBvaW50ZXIgdG8gTlVMTC4gICovCi0JICBpZiAoKG9mZl9jc3Qg JiYga25vd25fZXEgKG9mZiwgMCkpCi0JICAgICAgfHwgKGZsYWdfZGVsZXRlX251bGxfcG9pbnRl cl9jaGVja3MKLQkJICAmJiAhVFlQRV9PVkVSRkxPV19XUkFQUyAoVFJFRV9UWVBFIChleHByKSkp KQotCSAgICB7Ci0JICAgICAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyCi0JCT0gZ2V0X3Zh bHVlX3JhbmdlIChUUkVFX09QRVJBTkQgKGJhc2UsIDApLCBzdG10KTsKLQkgICAgICBpZiAoIXJh bmdlX2luY2x1ZGVzX3plcm9fcCAodnIpKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCSAgLyog SWYgTUVNX1JFRiBoYXMgYSAicG9zaXRpdmUiIG9mZnNldCwgY29uc2lkZXIgaXQgbm9uLU5VTEwK LQkgICAgIGFsd2F5cywgZm9yIC1mZGVsZXRlLW51bGwtcG9pbnRlci1jaGVja3MgYWxzbyAibmVn YXRpdmUiCi0JICAgICBvbmVzLiAgUHVudCBmb3IgdW5rbm93biBvZmZzZXRzIChlLmcuIHZhcmlh YmxlIG9uZXMpLiAgKi8KLQkgIGlmICghVFlQRV9PVkVSRkxPV19XUkFQUyAoVFJFRV9UWVBFIChl eHByKSkKLQkgICAgICAmJiBvZmZfY3N0Ci0JICAgICAgJiYga25vd25fbmUgKG9mZiwgMCkKLQkg ICAgICAmJiAoZmxhZ19kZWxldGVfbnVsbF9wb2ludGVyX2NoZWNrcyB8fCBrbm93bl9ndCAob2Zm LCAwKSkpCi0JICAgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwot fQotCiAvKiBSZXR1cm5zIHRydWUgaWYgRVhQUiBpcyBhIHZhbGlkIHZhbHVlIChhcyBleHBlY3Rl ZCBieSBjb21wYXJlX3ZhbHVlcykgLS0KICAgIGEgZ2ltcGxlIGludmFyaWFudCwgb3IgU1NBX05B TUUgKy0gQ1NULiAgKi8KIApAQCAtNDc4LDI1ICs2OSw2IEBAIHZhbGlkX3ZhbHVlX3AgKHRyZWUg ZXhwcikKICAgcmV0dXJuIGlzX2dpbXBsZV9taW5faW52YXJpYW50IChleHByKTsKIH0KIAotLyog SWYgT1AgaGFzIGEgdmFsdWUgcmFuZ2Ugd2l0aCBhIHNpbmdsZSBjb25zdGFudCB2YWx1ZSByZXR1 cm4gdGhhdCwKLSAgIG90aGVyd2lzZSByZXR1cm4gTlVMTF9UUkVFLiAgVGhpcyByZXR1cm5zIE9Q IGl0c2VsZiBpZiBPUCBpcyBhCi0gICBjb25zdGFudC4gICovCi0KLXRyZWUKLXZyX3ZhbHVlczo6 b3Bfd2l0aF9jb25zdGFudF9zaW5nbGV0b25fdmFsdWVfcmFuZ2UgKHRyZWUgb3ApCi17Ci0gIGlm IChpc19naW1wbGVfbWluX2ludmFyaWFudCAob3ApKQotICAgIHJldHVybiBvcDsKLQotICBpZiAo VFJFRV9DT0RFIChvcCkgIT0gU1NBX05BTUUpCi0gICAgcmV0dXJuIE5VTExfVFJFRTsKLQotICB0 cmVlIHQ7Ci0gIGlmIChnZXRfdmFsdWVfcmFuZ2UgKG9wKS0+c2luZ2xldG9uX3AgKCZ0KSkKLSAg ICByZXR1cm4gdDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KIC8qIFJldHVybiB0cnVlIGlmIG9wIGlz IGluIGEgYm9vbGVhbiBbMCwgMV0gdmFsdWUtcmFuZ2UuICAqLwogCiBib29sCkBAIC01MTksNTQ5 ICs5MSw2IEBAIHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6b3Bfd2l0aF9ib29sZWFuX3ZhbHVlX3Jh bmdlX3AgKHRyZWUgb3AsIGdpbXBsZSAqcykKIAkJCSAgICAgYnVpbGRfb25lX2NzdCAoVFJFRV9U WVBFIChvcCkpKTsKIH0KIAotLyogRXh0cmFjdCB2YWx1ZSByYW5nZSBpbmZvcm1hdGlvbiBmb3Ig VkFSIHdoZW4gKE9QIENPTkRfQ09ERSBMSU1JVCkgaXMKLSAgIHRydWUgYW5kIHN0b3JlIGl0IGlu ICpWUl9QLiAgKi8KLQotdm9pZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zvcl92YXJfZnJv bV9jb21wYXJpc29uX2V4cHIgKHRyZWUgdmFyLAotCQkJCQkJICAgICAgIGVudW0gdHJlZV9jb2Rl IGNvbmRfY29kZSwKLQkJCQkJCSAgICAgICB0cmVlIG9wLCB0cmVlIGxpbWl0LAotCQkJCQkJICAg ICAgIHZhbHVlX3JhbmdlX2VxdWl2ICp2cl9wKQotewotICB0cmVlICBtaW4sIG1heCwgdHlwZTsK LSAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKmxpbWl0X3ZyOwotICB0eXBlID0gVFJFRV9UWVBF ICh2YXIpOwotCi0gIC8qIEZvciBwb2ludGVyIGFyaXRobWV0aWMsIHdlIG9ubHkga2VlcCB0cmFj ayBvZiBwb2ludGVyIGVxdWFsaXR5Ci0gICAgIGFuZCBpbmVxdWFsaXR5LiAgSWYgd2UgYXJyaXZl IGhlcmUgd2l0aCB1bmZvbGRlZCBjb25kaXRpb25zIGxpa2UKLSAgICAgXzEgPiBfMSBkbyBub3Qg ZGVyaXZlIGFueXRoaW5nLiAgKi8KLSAgaWYgKChQT0lOVEVSX1RZUEVfUCAodHlwZSkgJiYgY29u ZF9jb2RlICE9IE5FX0VYUFIgJiYgY29uZF9jb2RlICE9IEVRX0VYUFIpCi0gICAgICB8fCBsaW1p dCA9PSB2YXIpCi0gICAgewotICAgICAgdnJfcC0+c2V0X3ZhcnlpbmcgKHR5cGUpOwotICAgICAg cmV0dXJuOwotICAgIH0KLQotICAvKiBJZiBMSU1JVCBpcyBhbm90aGVyIFNTQSBuYW1lIGFuZCBM SU1JVCBoYXMgYSByYW5nZSBvZiBpdHMgb3duLAotICAgICB0cnkgdG8gdXNlIExJTUlUJ3MgcmFu Z2UgdG8gYXZvaWQgY3JlYXRpbmcgc3ltYm9saWMgcmFuZ2VzCi0gICAgIHVubmVjZXNzYXJpbHku ICovCi0gIGxpbWl0X3ZyID0gKFRSRUVfQ09ERSAobGltaXQpID09IFNTQV9OQU1FKSA/IGdldF92 YWx1ZV9yYW5nZSAobGltaXQpIDogTlVMTDsKLQotICAvKiBMSU1JVCdzIHJhbmdlIGlzIG9ubHkg aW50ZXJlc3RpbmcgaWYgaXQgaGFzIGFueSB1c2VmdWwgaW5mb3JtYXRpb24uICAqLwotICBpZiAo ISBsaW1pdF92cgotICAgICAgfHwgbGltaXRfdnItPnVuZGVmaW5lZF9wICgpCi0gICAgICB8fCBs aW1pdF92ci0+dmFyeWluZ19wICgpCi0gICAgICB8fCAobGltaXRfdnItPnN5bWJvbGljX3AgKCkK LQkgICYmICEgKGxpbWl0X3ZyLT5raW5kICgpID09IFZSX1JBTkdFCi0JCSYmIChsaW1pdF92ci0+ bWluICgpID09IGxpbWl0X3ZyLT5tYXggKCkKLQkJICAgIHx8IG9wZXJhbmRfZXF1YWxfcCAobGlt aXRfdnItPm1pbiAoKSwKLQkJCQkJbGltaXRfdnItPm1heCAoKSwgMCkpKSkpCi0gICAgbGltaXRf dnIgPSBOVUxMOwotCi0gIC8qIEluaXRpYWxseSwgdGhlIG5ldyByYW5nZSBoYXMgdGhlIHNhbWUg c2V0IG9mIGVxdWl2YWxlbmNlcyBvZgotICAgICBWQVIncyByYW5nZS4gIFRoaXMgd2lsbCBiZSBy ZXZpc2VkIGJlZm9yZSByZXR1cm5pbmcgdGhlIGZpbmFsCi0gICAgIHZhbHVlLiAgU2luY2UgYXNz ZXJ0aW9ucyBtYXkgYmUgY2hhaW5lZCB2aWEgbXV0dWFsbHkgZXhjbHVzaXZlCi0gICAgIHByZWRp Y2F0ZXMsIHdlIHdpbGwgbmVlZCB0byB0cmltIHRoZSBzZXQgb2YgZXF1aXZhbGVuY2VzIGJlZm9y ZQotICAgICB3ZSBhcmUgZG9uZS4gICovCi0gIGdjY19hc3NlcnQgKHZyX3AtPmVxdWl2ICgpID09 IE5VTEwpOwotICB2cl9wLT5lcXVpdl9hZGQgKHZhciwgZ2V0X3ZhbHVlX3JhbmdlICh2YXIpLCAm dnJwX2VxdWl2X29ic3RhY2spOwotCi0gIC8qIEV4dHJhY3QgYSBuZXcgcmFuZ2UgYmFzZWQgb24g dGhlIGFzc2VydGVkIGNvbXBhcmlzb24gZm9yIFZBUiBhbmQKLSAgICAgTElNSVQncyB2YWx1ZSBy YW5nZS4gIE5vdGljZSB0aGF0IGlmIExJTUlUIGhhcyBhbiBhbnRpLXJhbmdlLCB3ZQotICAgICB3 aWxsIG9ubHkgdXNlIGl0IGZvciBlcXVhbGl0eSBjb21wYXJpc29ucyAoRVFfRVhQUikuICBGb3Ig YW55Ci0gICAgIG90aGVyIGtpbmQgb2YgYXNzZXJ0aW9uLCB3ZSBjYW5ub3QgZGVyaXZlIGEgcmFu Z2UgZnJvbSBMSU1JVCdzCi0gICAgIGFudGktcmFuZ2UgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXNj cmliZSB0aGUgbmV3IHJhbmdlLiAgRm9yCi0gICAgIGluc3RhbmNlLCBBU1NFUlRfRVhQUiA8eF8y LCB4XzIgPD0gYl80Pi4gIElmIGJfNCBpcyB+WzIsIDEwXSwKLSAgICAgdGhlbiBiXzQgdGFrZXMg b24gdGhlIHJhbmdlcyBbLUlORiwgMV0gYW5kIFsxMSwgK0lORl0uICBUaGVyZSBpcwotICAgICBu byBzaW5nbGUgcmFuZ2UgZm9yIHhfMiB0aGF0IGNvdWxkIGRlc2NyaWJlIExFX0VYUFIsIHNvIHdl IG1pZ2h0Ci0gICAgIGFzIHdlbGwgYnVpbGQgdGhlIHJhbmdlIFtiXzQsICtJTkZdIGZvciBpdC4K LSAgICAgT25lIHNwZWNpYWwgY2FzZSB3ZSBoYW5kbGUgaXMgZXh0cmFjdGluZyBhIHJhbmdlIGZy b20gYQotICAgICByYW5nZSB0ZXN0IGVuY29kZWQgYXMgKHVuc2lnbmVkKXZhciArIENTVCA8PSBs aW1pdC4gICovCi0gIGlmIChUUkVFX0NPREUgKG9wKSA9PSBOT1BfRVhQUgotICAgICAgfHwgVFJF RV9DT0RFIChvcCkgPT0gUExVU19FWFBSKQotICAgIHsKLSAgICAgIGlmIChUUkVFX0NPREUgKG9w KSA9PSBQTFVTX0VYUFIpCi0gICAgICAgIHsKLQkgIG1pbiA9IGZvbGRfYnVpbGQxIChORUdBVEVf RVhQUiwgVFJFRV9UWVBFIChUUkVFX09QRVJBTkQgKG9wLCAxKSksCi0JCQkgICAgIFRSRUVfT1BF UkFORCAob3AsIDEpKTsKLSAgICAgICAgICBtYXggPSBpbnRfY29uc3RfYmlub3AgKFBMVVNfRVhQ UiwgbGltaXQsIG1pbik7Ci0JICBvcCA9IFRSRUVfT1BFUkFORCAob3AsIDApOwotCX0KLSAgICAg IGVsc2UKLQl7Ci0JICBtaW4gPSBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKHZhciksIDApOwot CSAgbWF4ID0gbGltaXQ7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdG8gbm90IHNldCBUUkVF X09WRVJGTE9XIG9uIHRoZSBmaW5hbCB0eXBlCi0JIGNvbnZlcnNpb24uICBXZSBhcmUgd2lsbGlu Z2x5IGludGVycHJldGluZyBsYXJnZSBwb3NpdGl2ZQotCSB1bnNpZ25lZCB2YWx1ZXMgYXMgbmVn YXRpdmUgc2lnbmVkIHZhbHVlcyBoZXJlLiAgKi8KLSAgICAgIG1pbiA9IGZvcmNlX2ZpdF90eXBl IChUUkVFX1RZUEUgKHZhciksIHdpOjp0b193aWRlc3QgKG1pbiksIDAsIGZhbHNlKTsKLSAgICAg IG1heCA9IGZvcmNlX2ZpdF90eXBlIChUUkVFX1RZUEUgKHZhciksIHdpOjp0b193aWRlc3QgKG1h eCksIDAsIGZhbHNlKTsKLQotICAgICAgLyogV2UgY2FuIHRyYW5zZm9ybSBhIG1heCwgbWluIHJh bmdlIHRvIGFuIGFudGktcmFuZ2Ugb3IKLSAgICAgICAgIHZpY2UtdmVyc2EuICBVc2Ugc2V0X2Fu ZF9jYW5vbmljYWxpemUgd2hpY2ggZG9lcyB0aGlzIGZvcgotICAgICAgICAgdXMuICAqLwotICAg ICAgaWYgKGNvbmRfY29kZSA9PSBMRV9FWFBSKQotCXZyX3AtPnNldCAobWluLCBtYXgsIHZyX3At PmVxdWl2ICgpKTsKLSAgICAgIGVsc2UgaWYgKGNvbmRfY29kZSA9PSBHVF9FWFBSKQotCXZyX3At PnNldCAobWluLCBtYXgsIHZyX3AtPmVxdWl2ICgpLCBWUl9BTlRJX1JBTkdFKTsKLSAgICAgIGVs c2UKLQlnY2NfdW5yZWFjaGFibGUgKCk7Ci0gICAgfQotICBlbHNlIGlmIChjb25kX2NvZGUgPT0g RVFfRVhQUikKLSAgICB7Ci0gICAgICBlbnVtIHZhbHVlX3JhbmdlX2tpbmQgcmFuZ2Vfa2luZDsK LQotICAgICAgaWYgKGxpbWl0X3ZyKQotCXsKLQkgIHJhbmdlX2tpbmQgPSBsaW1pdF92ci0+a2lu ZCAoKTsKLQkgIG1pbiA9IGxpbWl0X3ZyLT5taW4gKCk7Ci0JICBtYXggPSBsaW1pdF92ci0+bWF4 ICgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByYW5nZV9raW5kID0gVlJfUkFOR0U7Ci0JICBt aW4gPSBsaW1pdDsKLQkgIG1heCA9IGxpbWl0OwotCX0KLQotICAgICAgdnJfcC0+dXBkYXRlICht aW4sIG1heCwgcmFuZ2Vfa2luZCk7Ci0KLSAgICAgIC8qIFdoZW4gYXNzZXJ0aW5nIHRoZSBlcXVh bGl0eSBWQVIgPT0gTElNSVQgYW5kIExJTUlUIGlzIGFub3RoZXIKLQkgU1NBIG5hbWUsIHRoZSBu ZXcgcmFuZ2Ugd2lsbCBhbHNvIGluaGVyaXQgdGhlIGVxdWl2YWxlbmNlIHNldAotCSBmcm9tIExJ TUlULiAgKi8KLSAgICAgIGlmIChUUkVFX0NPREUgKGxpbWl0KSA9PSBTU0FfTkFNRSkKLQl2cl9w LT5lcXVpdl9hZGQgKGxpbWl0LCBnZXRfdmFsdWVfcmFuZ2UgKGxpbWl0KSwgJnZycF9lcXVpdl9v YnN0YWNrKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGNvbmRfY29kZSA9PSBORV9FWFBSKQotICAgIHsK LSAgICAgIC8qIEFzIGRlc2NyaWJlZCBhYm92ZSwgd2hlbiBMSU1JVCdzIHJhbmdlIGlzIGFuIGFu dGktcmFuZ2UgYW5kCi0JIHRoaXMgYXNzZXJ0aW9uIGlzIGFuIGluZXF1YWxpdHkgKE5FX0VYUFIp LCB0aGVuIHdlIGNhbm5vdAotCSBkZXJpdmUgYW55dGhpbmcgZnJvbSB0aGUgYW50aS1yYW5nZS4g IEZvciBpbnN0YW5jZSwgaWYKLQkgTElNSVQncyByYW5nZSB3YXMgflswLCAwXSwgdGhlIGFzc2Vy dGlvbiAnVkFSICE9IExJTUlUJyBkb2VzCi0JIG5vdCBpbXBseSB0aGF0IFZBUidzIHJhbmdlIGlz IFswLCAwXS4gIFNvLCBpbiB0aGUgY2FzZSBvZgotCSBhbnRpLXJhbmdlcywgd2UganVzdCBhc3Nl cnQgdGhlIGluZXF1YWxpdHkgdXNpbmcgTElNSVQgYW5kCi0JIG5vdCBpdHMgYW50aS1yYW5nZS4K LQotCSBJZiBMSU1JVF9WUiBpcyBhIHJhbmdlLCB3ZSBjYW4gb25seSB1c2UgaXQgdG8gYnVpbGQg YSBuZXcKLQkgYW50aS1yYW5nZSBpZiBMSU1JVF9WUiBpcyBhIHNpbmdsZS12YWx1ZWQgcmFuZ2Uu ICBGb3IKLQkgaW5zdGFuY2UsIGlmIExJTUlUX1ZSIGlzIFswLCAxXSwgdGhlIHByZWRpY2F0ZQot CSBWQVIgIT0gWzAsIDFdIGRvZXMgbm90IG1lYW4gdGhhdCBWQVIncyByYW5nZSBpcyB+WzAsIDFd LgotCSBSYXRoZXIsIGl0IG1lYW5zIHRoYXQgZm9yIHZhbHVlIDAgVkFSIHNob3VsZCBiZSB+WzAs IDBdCi0JIGFuZCBmb3IgdmFsdWUgMSwgVkFSIHNob3VsZCBiZSB+WzEsIDFdLiAgV2UgY2Fubm90 Ci0JIHJlcHJlc2VudCB0aGVzZSByYW5nZXMuCi0KLQkgVGhlIG9ubHkgc2l0dWF0aW9uIGluIHdo aWNoIHdlIGNhbiBidWlsZCBhIHZhbGlkCi0JIGFudGktcmFuZ2UgaXMgd2hlbiBMSU1JVF9WUiBp cyBhIHNpbmdsZS12YWx1ZWQgcmFuZ2UKLQkgKGkuZS4sIExJTUlUX1ZSLT5NSU4gPT0gTElNSVRf VlItPk1BWCkuICBJbiB0aGF0IGNhc2UsCi0JIGJ1aWxkIHRoZSBhbnRpLXJhbmdlIH5bTElNSVRf VlItPk1JTiwgTElNSVRfVlItPk1BWF0uICAqLwotICAgICAgaWYgKGxpbWl0X3ZyCi0JICAmJiBs aW1pdF92ci0+a2luZCAoKSA9PSBWUl9SQU5HRQotCSAgJiYgY29tcGFyZV92YWx1ZXMgKGxpbWl0 X3ZyLT5taW4gKCksIGxpbWl0X3ZyLT5tYXggKCkpID09IDApCi0JewotCSAgbWluID0gbGltaXRf dnItPm1pbiAoKTsKLQkgIG1heCA9IGxpbWl0X3ZyLT5tYXggKCk7Ci0JfQotICAgICAgZWxzZQot CXsKLQkgIC8qIEluIGFueSBvdGhlciBjYXNlLCB3ZSBjYW5ub3QgdXNlIExJTUlUJ3MgcmFuZ2Ug dG8gYnVpbGQgYQotCSAgICAgdmFsaWQgYW50aS1yYW5nZS4gICovCi0JICBtaW4gPSBtYXggPSBs aW1pdDsKLQl9Ci0KLSAgICAgIC8qIElmIE1JTiBhbmQgTUFYIGNvdmVyIHRoZSB3aG9sZSByYW5n ZSBmb3IgdGhlaXIgdHlwZSwgdGhlbgotCSBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgTElNSVQuICAq LwotICAgICAgaWYgKElOVEVHUkFMX1RZUEVfUCAodHlwZSkKLQkgICYmIHZycF92YWxfaXNfbWlu IChtaW4pCi0JICAmJiB2cnBfdmFsX2lzX21heCAobWF4KSkKLQltaW4gPSBtYXggPSBsaW1pdDsK LQotICAgICAgdnJfcC0+c2V0IChtaW4sIG1heCwgdnJfcC0+ZXF1aXYgKCksIFZSX0FOVElfUkFO R0UpOwotICAgIH0KLSAgZWxzZSBpZiAoY29uZF9jb2RlID09IExFX0VYUFIgfHwgY29uZF9jb2Rl ID09IExUX0VYUFIpCi0gICAgewotICAgICAgbWluID0gVFlQRV9NSU5fVkFMVUUgKHR5cGUpOwot Ci0gICAgICBpZiAobGltaXRfdnIgPT0gTlVMTCB8fCBsaW1pdF92ci0+a2luZCAoKSA9PSBWUl9B TlRJX1JBTkdFKQotCW1heCA9IGxpbWl0OwotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIExJTUlU X1ZSIGlzIG9mIHRoZSBmb3JtIFtOMSwgTjJdLCB3ZSBuZWVkIHRvIGJ1aWxkIHRoZQotCSAgICAg cmFuZ2UgW01JTiwgTjJdIGZvciBMRV9FWFBSIGFuZCBbTUlOLCBOMiAtIDFdIGZvcgotCSAgICAg TFRfRVhQUi4gICovCi0JICBtYXggPSBsaW1pdF92ci0+bWF4ICgpOwotCX0KLQotICAgICAgLyog SWYgdGhlIG1heGltdW0gdmFsdWUgZm9yY2VzIHVzIHRvIGJlIG91dCBvZiBib3VuZHMsIHNpbXBs eSBwdW50LgotCSBJdCB3b3VsZCBiZSBwb2ludGxlc3MgdG8gdHJ5IGFuZCBkbyBhbnl0aGluZyBt b3JlIHNpbmNlIHRoaXMKLQkgYWxsIHNob3VsZCBiZSBvcHRpbWl6ZWQgYXdheSBhYm92ZSB1cy4g ICovCi0gICAgICBpZiAoY29uZF9jb2RlID09IExUX0VYUFIKLQkgICYmIGNvbXBhcmVfdmFsdWVz IChtYXgsIG1pbikgPT0gMCkKLQl2cl9wLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChtaW4pKTsK LSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGb3IgTFRfRVhQUiwgd2UgY3JlYXRlIHRoZSByYW5nZSBb TUlOLCBNQVggLSAxXS4gICovCi0JICBpZiAoY29uZF9jb2RlID09IExUX0VYUFIpCi0JICAgIHsK LQkgICAgICBpZiAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAobWF4KSkgPT0gMQotCQkgICYm ICFUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKG1heCkpKQotCQltYXggPSBmb2xkX2J1aWxkMiAo UExVU19FWFBSLCBUUkVFX1RZUEUgKG1heCksIG1heCwKLQkJCQkgICBidWlsZF9pbnRfY3N0IChU UkVFX1RZUEUgKG1heCksIC0xKSk7Ci0JICAgICAgZWxzZQotCQltYXggPSBmb2xkX2J1aWxkMiAo TUlOVVNfRVhQUiwgVFJFRV9UWVBFIChtYXgpLCBtYXgsCi0JCQkJICAgYnVpbGRfaW50X2NzdCAo VFJFRV9UWVBFIChtYXgpLCAxKSk7Ci0JICAgICAgLyogU2lnbmFsIHRvIGNvbXBhcmVfdmFsdWVz X3dhcm52IHRoaXMgZXhwciBkb2Vzbid0IG92ZXJmbG93LiAgKi8KLQkgICAgICBpZiAoRVhQUl9Q IChtYXgpKQotCQlzdXBwcmVzc193YXJuaW5nIChtYXgsIE9QVF9Xb3ZlcmZsb3cpOwotCSAgICB9 Ci0KLQkgIHZyX3AtPnVwZGF0ZSAobWluLCBtYXgpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGNv bmRfY29kZSA9PSBHRV9FWFBSIHx8IGNvbmRfY29kZSA9PSBHVF9FWFBSKQotICAgIHsKLSAgICAg IG1heCA9IFRZUEVfTUFYX1ZBTFVFICh0eXBlKTsKLQotICAgICAgaWYgKGxpbWl0X3ZyID09IE5V TEwgfHwgbGltaXRfdnItPmtpbmQgKCkgPT0gVlJfQU5USV9SQU5HRSkKLQltaW4gPSBsaW1pdDsK LSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiBMSU1JVF9WUiBpcyBvZiB0aGUgZm9ybSBbTjEsIE4y XSwgd2UgbmVlZCB0byBidWlsZCB0aGUKLQkgICAgIHJhbmdlIFtOMSwgTUFYXSBmb3IgR0VfRVhQ UiBhbmQgW04xICsgMSwgTUFYXSBmb3IKLQkgICAgIEdUX0VYUFIuICAqLwotCSAgbWluID0gbGlt aXRfdnItPm1pbiAoKTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBtaW5pbXVtIHZhbHVlIGZvcmNl cyB1cyB0byBiZSBvdXQgb2YgYm91bmRzLCBzaW1wbHkgcHVudC4KLQkgSXQgd291bGQgYmUgcG9p bnRsZXNzIHRvIHRyeSBhbmQgZG8gYW55dGhpbmcgbW9yZSBzaW5jZSB0aGlzCi0JIGFsbCBzaG91 bGQgYmUgb3B0aW1pemVkIGF3YXkgYWJvdmUgdXMuICAqLwotICAgICAgaWYgKGNvbmRfY29kZSA9 PSBHVF9FWFBSCi0JICAmJiBjb21wYXJlX3ZhbHVlcyAobWluLCBtYXgpID09IDApCi0JdnJfcC0+ c2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAobWluKSk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogRm9y IEdUX0VYUFIsIHdlIGNyZWF0ZSB0aGUgcmFuZ2UgW01JTiArIDEsIE1BWF0uICAqLwotCSAgaWYg KGNvbmRfY29kZSA9PSBHVF9FWFBSKQotCSAgICB7Ci0JICAgICAgaWYgKFRZUEVfUFJFQ0lTSU9O IChUUkVFX1RZUEUgKG1pbikpID09IDEKLQkJICAmJiAhVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBF IChtaW4pKSkKLQkJbWluID0gZm9sZF9idWlsZDIgKE1JTlVTX0VYUFIsIFRSRUVfVFlQRSAobWlu KSwgbWluLAotCQkJCSAgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAobWluKSwgLTEpKTsKLQkg ICAgICBlbHNlCi0JCW1pbiA9IGZvbGRfYnVpbGQyIChQTFVTX0VYUFIsIFRSRUVfVFlQRSAobWlu KSwgbWluLAotCQkJCSAgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAobWluKSwgMSkpOwotCSAg ICAgIC8qIFNpZ25hbCB0byBjb21wYXJlX3ZhbHVlc193YXJudiB0aGlzIGV4cHIgZG9lc24ndCBv dmVyZmxvdy4gICovCi0JICAgICAgaWYgKEVYUFJfUCAobWluKSkKLQkJc3VwcHJlc3Nfd2Fybmlu ZyAobWluLCBPUFRfV292ZXJmbG93KTsKLQkgICAgfQotCi0JICB2cl9wLT51cGRhdGUgKG1pbiwg bWF4KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgZ2NjX3VucmVhY2hhYmxlICgpOwotCi0gIC8q IEZpbmFsbHkgaW50ZXJzZWN0IHRoZSBuZXcgcmFuZ2Ugd2l0aCB3aGF0IHdlIGFscmVhZHkga25v dyBhYm91dCB2YXIuICAqLwotICB2cl9wLT5sZWdhY3lfdmVyYm9zZV9pbnRlcnNlY3QgKGdldF92 YWx1ZV9yYW5nZSAodmFyKSk7Ci19Ci0KLS8qIEV4dHJhY3QgdmFsdWUgcmFuZ2UgaW5mb3JtYXRp b24gZnJvbSBhbiBBU1NFUlRfRVhQUiBFWFBSIGFuZCBzdG9yZQotICAgaXQgaW4gKlZSX1AuICAq LwotCi12b2lkCi12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9hc3NlcnQgKHZhbHVlX3Jh bmdlX2VxdWl2ICp2cl9wLCB0cmVlIGV4cHIpCi17Ci0gIHRyZWUgdmFyID0gQVNTRVJUX0VYUFJf VkFSIChleHByKTsKLSAgdHJlZSBjb25kID0gQVNTRVJUX0VYUFJfQ09ORCAoZXhwcik7Ci0gIHRy ZWUgbGltaXQsIG9wOwotICBlbnVtIHRyZWVfY29kZSBjb25kX2NvZGU7Ci0gIGdjY19hc3NlcnQg KENPTVBBUklTT05fQ0xBU1NfUCAoY29uZCkpOwotCi0gIC8qIEZpbmQgVkFSIGluIHRoZSBBU1NF UlRfRVhQUiBjb25kaXRpb25hbC4gICovCi0gIGlmICh2YXIgPT0gVFJFRV9PUEVSQU5EIChjb25k LCAwKQotICAgICAgfHwgVFJFRV9DT0RFIChUUkVFX09QRVJBTkQgKGNvbmQsIDApKSA9PSBQTFVT X0VYUFIKLSAgICAgIHx8IFRSRUVfQ09ERSAoVFJFRV9PUEVSQU5EIChjb25kLCAwKSkgPT0gTk9Q X0VYUFIpCi0gICAgewotICAgICAgLyogSWYgdGhlIHByZWRpY2F0ZSBpcyBvZiB0aGUgZm9ybSBW QVIgQ09NUCBMSU1JVCwgdGhlbiB3ZSBqdXN0Ci0JIHRha2UgTElNSVQgZnJvbSB0aGUgUkhTIGFu ZCB1c2UgdGhlIHNhbWUgY29tcGFyaXNvbiBjb2RlLiAgKi8KLSAgICAgIGNvbmRfY29kZSA9IFRS RUVfQ09ERSAoY29uZCk7Ci0gICAgICBsaW1pdCA9IFRSRUVfT1BFUkFORCAoY29uZCwgMSk7Ci0g ICAgICBvcCA9IFRSRUVfT1BFUkFORCAoY29uZCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewot ICAgICAgLyogSWYgdGhlIHByZWRpY2F0ZSBpcyBvZiB0aGUgZm9ybSBMSU1JVCBDT01QIFZBUiwg dGhlbiB3ZSBuZWVkCi0JIHRvIGZsaXAgYXJvdW5kIHRoZSBjb21wYXJpc29uIGNvZGUgdG8gY3Jl YXRlIHRoZSBwcm9wZXIgcmFuZ2UKLQkgZm9yIFZBUi4gICovCi0gICAgICBjb25kX2NvZGUgPSBz d2FwX3RyZWVfY29tcGFyaXNvbiAoVFJFRV9DT0RFIChjb25kKSk7Ci0gICAgICBsaW1pdCA9IFRS RUVfT1BFUkFORCAoY29uZCwgMCk7Ci0gICAgICBvcCA9IFRSRUVfT1BFUkFORCAoY29uZCwgMSk7 Ci0gICAgfQotICBleHRyYWN0X3JhbmdlX2Zvcl92YXJfZnJvbV9jb21wYXJpc29uX2V4cHIgKHZh ciwgY29uZF9jb2RlLCBvcCwKLQkJCQkJICAgICAgbGltaXQsIHZyX3ApOwotfQotCi0vKiBFeHRy YWN0IHJhbmdlIGluZm9ybWF0aW9uIGZyb20gU1NBIG5hbWUgVkFSIGFuZCBzdG9yZSBpdCBpbiBW Ui4gIElmCi0gICBWQVIgaGFzIGFuIGludGVyZXN0aW5nIHJhbmdlLCB1c2UgaXQuICBPdGhlcndp c2UsIGNyZWF0ZSB0aGUKLSAgIHJhbmdlIFtWQVIsIFZBUl0gYW5kIHJldHVybiBpdC4gIFRoaXMg aXMgdXNlZnVsIGluIHNpdHVhdGlvbnMgd2hlcmUKLSAgIHdlIG1heSBoYXZlIGNvbmRpdGlvbmFs cyB0ZXN0aW5nIHZhbHVlcyBvZiBWQVJZSU5HIG5hbWVzLiAgRm9yCi0gICBpbnN0YW5jZSwKLQot ICAgCXhfMyA9IHlfNTsKLQlpZiAoeF8zID4geV81KQotCSAgLi4uCi0KLSAgICBFdmVuIGlmIHlf NSBpcyBkZWVtZWQgVkFSWUlORywgd2UgY2FuIGRldGVybWluZSB0aGF0IHhfMyA+IHlfNSBpcwot ICAgIGFsd2F5cyBmYWxzZS4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9m cm9tX3NzYV9uYW1lICh2YWx1ZV9yYW5nZV9lcXVpdiAqdnIsIHRyZWUgdmFyKQotewotICBjb25z dCB2YWx1ZV9yYW5nZV9lcXVpdiAqdmFyX3ZyID0gZ2V0X3ZhbHVlX3JhbmdlICh2YXIpOwotCi0g IGlmICghdmFyX3ZyLT52YXJ5aW5nX3AgKCkpCi0gICAgdnItPmRlZXBfY29weSAodmFyX3ZyKTsK LSAgZWxzZQotICAgIHZyLT5zZXQgKHZhcik7Ci0KLSAgaWYgKCF2ci0+dW5kZWZpbmVkX3AgKCkp Ci0gICAgdnItPmVxdWl2X2FkZCAodmFyLCBnZXRfdmFsdWVfcmFuZ2UgKHZhciksICZ2cnBfZXF1 aXZfb2JzdGFjayk7Ci19Ci0KLS8qIEV4dHJhY3QgcmFuZ2UgaW5mb3JtYXRpb24gZnJvbSBhIGJp bmFyeSBleHByZXNzaW9uIE9QMCBDT0RFIE9QMSBiYXNlZCBvbgotICAgdGhlIHJhbmdlcyBvZiBl YWNoIG9mIGl0cyBvcGVyYW5kcyB3aXRoIHJlc3VsdGluZyB0eXBlIEVYUFJfVFlQRS4KLSAgIFRo ZSByZXN1bHRpbmcgcmFuZ2UgaXMgc3RvcmVkIGluICpWUi4gICovCi0KLXZvaWQKLXZyX3ZhbHVl czo6ZXh0cmFjdF9yYW5nZV9mcm9tX2JpbmFyeV9leHByICh2YWx1ZV9yYW5nZV9lcXVpdiAqdnIs Ci0JCQkJCSAgIGVudW0gdHJlZV9jb2RlIGNvZGUsCi0JCQkJCSAgIHRyZWUgZXhwcl90eXBlLCB0 cmVlIG9wMCwgdHJlZSBvcDEpCi17Ci0gIC8qIEdldCB2YWx1ZSByYW5nZXMgZm9yIGVhY2ggb3Bl cmFuZC4gIEZvciBjb25zdGFudCBvcGVyYW5kcywgY3JlYXRlCi0gICAgIGEgbmV3IHZhbHVlIHJh bmdlIHdpdGggdGhlIG9wZXJhbmQgdG8gc2ltcGxpZnkgcHJvY2Vzc2luZy4gICovCi0gIHZhbHVl X3JhbmdlIHZyMCwgdnIxOwotICBpZiAoVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FKQotICAg IHZyMCA9ICooZ2V0X3ZhbHVlX3JhbmdlIChvcDApKTsKLSAgZWxzZSBpZiAoaXNfZ2ltcGxlX21p bl9pbnZhcmlhbnQgKG9wMCkpCi0gICAgdnIwLnNldCAob3AwLCBvcDApOwotICBlbHNlCi0gICAg dnIwLnNldF92YXJ5aW5nIChUUkVFX1RZUEUgKG9wMCkpOwotCi0gIGlmIChUUkVFX0NPREUgKG9w MSkgPT0gU1NBX05BTUUpCi0gICAgdnIxID0gKihnZXRfdmFsdWVfcmFuZ2UgKG9wMSkpOwotICBl bHNlIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAob3AxKSkKLSAgICB2cjEuc2V0IChvcDEs IG9wMSk7Ci0gIGVsc2UKLSAgICB2cjEuc2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAob3AxKSk7Ci0K LSAgLyogSWYgb25lIGFyZ3VtZW50IGlzIHZhcnlpbmcsIHdlIGNhbiBzb21ldGltZXMgc3RpbGwg ZGVkdWNlIGEKLSAgICAgcmFuZ2UgZm9yIHRoZSBvdXRwdXQ6IGFueSArIFszLCArSU5GXSBpcyBp biBbTUlOKzMsICtJTkZdLiAgKi8KLSAgaWYgKElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChv cDApKQotICAgICAgJiYgVFlQRV9PVkVSRkxPV19VTkRFRklORUQgKFRSRUVfVFlQRSAob3AwKSkp Ci0gICAgewotICAgICAgaWYgKHZyMC52YXJ5aW5nX3AgKCkgJiYgIXZyMS52YXJ5aW5nX3AgKCkp Ci0JdnIwID0gdmFsdWVfcmFuZ2UgKHZycF92YWxfbWluIChleHByX3R5cGUpLCB2cnBfdmFsX21h eCAoZXhwcl90eXBlKSk7Ci0gICAgICBlbHNlIGlmICh2cjEudmFyeWluZ19wICgpICYmICF2cjAu dmFyeWluZ19wICgpKQotCXZyMSA9IHZhbHVlX3JhbmdlICh2cnBfdmFsX21pbiAoZXhwcl90eXBl KSwgdnJwX3ZhbF9tYXggKGV4cHJfdHlwZSkpOwotICAgIH0KLQotICByYW5nZV9mb2xkX2JpbmFy eV9leHByICh2ciwgY29kZSwgZXhwcl90eXBlLCAmdnIwLCAmdnIxKTsKLQotICAvKiBTZXQgdmFs dWVfcmFuZ2UgZm9yIG4gaW4gZm9sbG93aW5nIHNlcXVlbmNlOgotICAgICBkZWYgPSBfX2J1aWx0 aW5fbWVtY2hyIChhcmcsIDAsIHN6KQotICAgICBuID0gZGVmIC0gYXJnCi0gICAgIEhlcmUgdGhl IHJhbmdlIGZvciBuIGNhbiBiZSBzZXQgdG8gWzAsIFBUUkRJRkZfTUFYIC0gMV0uICovCi0KLSAg aWYgKHZyLT52YXJ5aW5nX3AgKCkKLSAgICAgICYmIGNvZGUgPT0gUE9JTlRFUl9ESUZGX0VYUFIK LSAgICAgICYmIFRSRUVfQ09ERSAob3AwKSA9PSBTU0FfTkFNRQotICAgICAgJiYgVFJFRV9DT0RF IChvcDEpID09IFNTQV9OQU1FKQotICAgIHsKLSAgICAgIHRyZWUgb3AwX3B0eXBlID0gVFJFRV9U WVBFIChUUkVFX1RZUEUgKG9wMCkpOwotICAgICAgdHJlZSBvcDFfcHR5cGUgPSBUUkVFX1RZUEUg KFRSRUVfVFlQRSAob3AxKSk7Ci0gICAgICBnY2FsbCAqY2FsbF9zdG10ID0gTlVMTDsKLQotICAg ICAgaWYgKFRZUEVfTU9ERSAob3AwX3B0eXBlKSA9PSBUWVBFX01PREUgKGNoYXJfdHlwZV9ub2Rl KQotCSAgJiYgVFlQRV9QUkVDSVNJT04gKG9wMF9wdHlwZSkgPT0gVFlQRV9QUkVDSVNJT04gKGNo YXJfdHlwZV9ub2RlKQotCSAgJiYgVFlQRV9NT0RFIChvcDFfcHR5cGUpID09IFRZUEVfTU9ERSAo Y2hhcl90eXBlX25vZGUpCi0JICAmJiBUWVBFX1BSRUNJU0lPTiAob3AxX3B0eXBlKSA9PSBUWVBF X1BSRUNJU0lPTiAoY2hhcl90eXBlX25vZGUpCi0JICAmJiAoY2FsbF9zdG10ID0gZHluX2Nhc3Q8 Z2NhbGwgKj4oU1NBX05BTUVfREVGX1NUTVQgKG9wMCkpKQotCSAgJiYgZ2ltcGxlX2NhbGxfYnVp bHRpbl9wIChjYWxsX3N0bXQsIEJVSUxUX0lOX01FTUNIUikKLQkgICYmIG9wZXJhbmRfZXF1YWxf cCAob3AwLCBnaW1wbGVfY2FsbF9saHMgKGNhbGxfc3RtdCksIDApCi0JICAmJiBvcGVyYW5kX2Vx dWFsX3AgKG9wMSwgZ2ltcGxlX2NhbGxfYXJnIChjYWxsX3N0bXQsIDApLCAwKQotCSAgJiYgaW50 ZWdlcl96ZXJvcCAoZ2ltcGxlX2NhbGxfYXJnIChjYWxsX3N0bXQsIDEpKSkKLQkgICAgewotCSAg ICAgIHRyZWUgbWF4ID0gdnJwX3ZhbF9tYXggKHB0cmRpZmZfdHlwZV9ub2RlKTsKLQkgICAgICB3 aWRlX2ludCB3bWF4ID0gd2k6OnRvX3dpZGUgKG1heCwgVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQ RSAobWF4KSkpOwotCSAgICAgIHRyZWUgcmFuZ2VfbWluID0gYnVpbGRfemVyb19jc3QgKGV4cHJf dHlwZSk7Ci0JICAgICAgdHJlZSByYW5nZV9tYXggPSB3aWRlX2ludF90b190cmVlIChleHByX3R5 cGUsIHdtYXggLSAxKTsKLQkgICAgICB2ci0+c2V0IChyYW5nZV9taW4sIHJhbmdlX21heCwgTlVM TCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0gICAgIH0KLQotICAvKiBUcnkgaGFyZGVyIGZv ciBQTFVTIGFuZCBNSU5VUyBpZiB0aGUgcmFuZ2Ugb2Ygb25lIG9wZXJhbmQgaXMgc3ltYm9saWMK LSAgICAgYW5kIGJhc2VkIG9uIHRoZSBvdGhlciBvcGVyYW5kLCBmb3IgZXhhbXBsZSBpZiBpdCB3 YXMgZGVkdWNlZCBmcm9tIGEKLSAgICAgc3ltYm9saWMgY29tcGFyaXNvbi4gIFdoZW4gYSBib3Vu ZCBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGZpcnN0IG9wZXJhbmQKLSAgICAgaXMgaW52YXJpYW50LCB3 ZSBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgYm91bmQgb2YgdGhlIG5ldyByYW5nZSB0byBJTkYKLSAg ICAgaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJzaW5nIG9uIHRoZSByYW5nZSBvZiB0aGUgc2Vjb25k IG9wZXJhbmQuICAqLwotICBpZiAodnItPnZhcnlpbmdfcCAoKQotICAgICAgJiYgKGNvZGUgPT0g UExVU19FWFBSIHx8IGNvZGUgPT0gTUlOVVNfRVhQUikKLSAgICAgICYmIFRSRUVfQ09ERSAob3Ax KSA9PSBTU0FfTkFNRQotICAgICAgJiYgdnIwLmtpbmQgKCkgPT0gVlJfUkFOR0UKLSAgICAgICYm IHN5bWJvbGljX3JhbmdlX2Jhc2VkX29uX3AgKCZ2cjAsIG9wMSkpCi0gICAgewotICAgICAgY29u c3QgYm9vbCBtaW51c19wID0gKGNvZGUgPT0gTUlOVVNfRVhQUik7Ci0gICAgICB2YWx1ZV9yYW5n ZSBuX3ZyMTsKLQotICAgICAgLyogVHJ5IHdpdGggVlIwIGFuZCBbLUlORiwgT1AxXS4gICovCi0g ICAgICBpZiAoaXNfZ2ltcGxlX21pbl9pbnZhcmlhbnQgKG1pbnVzX3AgPyB2cjAubWF4ICgpIDog dnIwLm1pbiAoKSkpCi0Jbl92cjEuc2V0ICh2cnBfdmFsX21pbiAoZXhwcl90eXBlKSwgb3AxKTsK LQotICAgICAgLyogVHJ5IHdpdGggVlIwIGFuZCBbT1AxLCArSU5GXS4gICovCi0gICAgICBlbHNl IGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAobWludXNfcCA/IHZyMC5taW4gKCkgOiB2cjAu bWF4ICgpKSkKLQluX3ZyMS5zZXQgKG9wMSwgdnJwX3ZhbF9tYXggKGV4cHJfdHlwZSkpOwotCi0g ICAgICAvKiBUcnkgd2l0aCBWUjAgYW5kIFtPUDEsIE9QMV0uICAqLwotICAgICAgZWxzZQotCW5f dnIxLnNldCAob3AxLCBvcDEpOwotCi0gICAgICByYW5nZV9mb2xkX2JpbmFyeV9leHByICh2ciwg Y29kZSwgZXhwcl90eXBlLCAmdnIwLCAmbl92cjEpOwotICAgIH0KLQotICBpZiAodnItPnZhcnlp bmdfcCAoKQotICAgICAgJiYgKGNvZGUgPT0gUExVU19FWFBSIHx8IGNvZGUgPT0gTUlOVVNfRVhQ UikKLSAgICAgICYmIFRSRUVfQ09ERSAob3AwKSA9PSBTU0FfTkFNRQotICAgICAgJiYgdnIxLmtp bmQgKCkgPT0gVlJfUkFOR0UKLSAgICAgICYmIHN5bWJvbGljX3JhbmdlX2Jhc2VkX29uX3AgKCZ2 cjEsIG9wMCkpCi0gICAgewotICAgICAgY29uc3QgYm9vbCBtaW51c19wID0gKGNvZGUgPT0gTUlO VVNfRVhQUik7Ci0gICAgICB2YWx1ZV9yYW5nZSBuX3ZyMDsKLQotICAgICAgLyogVHJ5IHdpdGgg Wy1JTkYsIE9QMF0gYW5kIFZSMS4gICovCi0gICAgICBpZiAoaXNfZ2ltcGxlX21pbl9pbnZhcmlh bnQgKG1pbnVzX3AgPyB2cjEubWF4ICgpIDogdnIxLm1pbiAoKSkpCi0Jbl92cjAuc2V0ICh2cnBf dmFsX21pbiAoZXhwcl90eXBlKSwgb3AwKTsKLQotICAgICAgLyogVHJ5IHdpdGggW09QMCwgK0lO Rl0gYW5kIFZSMS4gICovCi0gICAgICBlbHNlIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAo bWludXNfcCA/IHZyMS5taW4gKCk6IHZyMS5tYXggKCkpKQotCW5fdnIwLnNldCAob3AwLCB2cnBf dmFsX21heCAoZXhwcl90eXBlKSk7Ci0KLSAgICAgIC8qIFRyeSB3aXRoIFtPUDAsIE9QMF0gYW5k IFZSMS4gICovCi0gICAgICBlbHNlCi0Jbl92cjAuc2V0IChvcDAsIG9wMCk7Ci0KLSAgICAgIHJh bmdlX2ZvbGRfYmluYXJ5X2V4cHIgKHZyLCBjb2RlLCBleHByX3R5cGUsICZuX3ZyMCwgJnZyMSk7 Ci0gICAgfQotCi0gIC8qIElmIHdlIGRpZG4ndCBkZXJpdmUgYSByYW5nZSBmb3IgTUlOVVNfRVhQ UiwgYW5kCi0gICAgIG9wMSdzIHJhbmdlIGlzIH5bb3AwLG9wMF0gb3IgdmljZS12ZXJzYSwgdGhl biB3ZQotICAgICBjYW4gZGVyaXZlIGEgbm9uLW51bGwgcmFuZ2UuICBUaGlzIGhhcHBlbnMgb2Z0 ZW4gZm9yCi0gICAgIHBvaW50ZXIgc3VidHJhY3Rpb24uICAqLwotICBpZiAodnItPnZhcnlpbmdf cCAoKQotICAgICAgJiYgKGNvZGUgPT0gTUlOVVNfRVhQUiB8fCBjb2RlID09IFBPSU5URVJfRElG Rl9FWFBSKQotICAgICAgJiYgVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FCi0gICAgICAmJiAo KHZyMC5raW5kICgpID09IFZSX0FOVElfUkFOR0UKLQkgICAmJiB2cjAubWluICgpID09IG9wMQot CSAgICYmIHZyMC5taW4gKCkgPT0gdnIwLm1heCAoKSkKLQkgIHx8ICh2cjEua2luZCAoKSA9PSBW Ul9BTlRJX1JBTkdFCi0JICAgICAgJiYgdnIxLm1pbiAoKSA9PSBvcDAKLQkgICAgICAmJiB2cjEu bWluICgpID09IHZyMS5tYXggKCkpKSkKLSAgICB7Ci0gICAgICB2ci0+c2V0X25vbnplcm8gKGV4 cHJfdHlwZSk7Ci0gICAgICB2ci0+ZXF1aXZfY2xlYXIgKCk7Ci0gICAgfQotfQotCi0vKiBFeHRy YWN0IHJhbmdlIGluZm9ybWF0aW9uIGZyb20gYSB1bmFyeSBleHByZXNzaW9uIENPREUgT1AwIGJh c2VkIG9uCi0gICB0aGUgcmFuZ2Ugb2YgaXRzIG9wZXJhbmQgd2l0aCByZXN1bHRpbmcgdHlwZSBU WVBFLgotICAgVGhlIHJlc3VsdGluZyByYW5nZSBpcyBzdG9yZWQgaW4gKlZSLiAgKi8KLQotdm9p ZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fdW5hcnlfZXhwciAodmFsdWVfcmFuZ2Vf ZXF1aXYgKnZyLAotCQkJCQkgIGVudW0gdHJlZV9jb2RlIGNvZGUsCi0JCQkJCSAgdHJlZSB0eXBl LCB0cmVlIG9wMCkKLXsKLSAgdmFsdWVfcmFuZ2UgdnIwOwotCi0gIC8qIEdldCB2YWx1ZSByYW5n ZXMgZm9yIHRoZSBvcGVyYW5kLiAgRm9yIGNvbnN0YW50IG9wZXJhbmRzLCBjcmVhdGUKLSAgICAg YSBuZXcgdmFsdWUgcmFuZ2Ugd2l0aCB0aGUgb3BlcmFuZCB0byBzaW1wbGlmeSBwcm9jZXNzaW5n LiAgKi8KLSAgaWYgKFRSRUVfQ09ERSAob3AwKSA9PSBTU0FfTkFNRSkKLSAgICB2cjAgPSAqKGdl dF92YWx1ZV9yYW5nZSAob3AwKSk7Ci0gIGVsc2UgaWYgKGlzX2dpbXBsZV9taW5faW52YXJpYW50 IChvcDApKQotICAgIHZyMC5zZXQgKG9wMCwgb3AwKTsKLSAgZWxzZQotICAgIHZyMC5zZXRfdmFy eWluZyAodHlwZSk7Ci0KLSAgcmFuZ2VfZm9sZF91bmFyeV9leHByICh2ciwgY29kZSwgdHlwZSwg JnZyMCwgVFJFRV9UWVBFIChvcDApKTsKLX0KLQotCi0vKiBFeHRyYWN0IHJhbmdlIGluZm9ybWF0 aW9uIGZyb20gYSBjb25kaXRpb25hbCBleHByZXNzaW9uIFNUTVQgYmFzZWQgb24KLSAgIHRoZSBy YW5nZXMgb2YgZWFjaCBvZiBpdHMgb3BlcmFuZHMgYW5kIHRoZSBleHByZXNzaW9uIGNvZGUuICAq LwotCi12b2lkCi12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9jb25kX2V4cHIgKHZhbHVl X3JhbmdlX2VxdWl2ICp2ciwgZ2Fzc2lnbiAqc3RtdCkKLXsKLSAgLyogR2V0IHZhbHVlIHJhbmdl cyBmb3IgZWFjaCBvcGVyYW5kLiAgRm9yIGNvbnN0YW50IG9wZXJhbmRzLCBjcmVhdGUKLSAgICAg YSBuZXcgdmFsdWUgcmFuZ2Ugd2l0aCB0aGUgb3BlcmFuZCB0byBzaW1wbGlmeSBwcm9jZXNzaW5n LiAgKi8KLSAgdHJlZSBvcDAgPSBnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpOwotICB2YWx1ZV9y YW5nZV9lcXVpdiB0ZW0wOwotICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIwID0gJnRlbTA7 Ci0gIGlmIChUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUpCi0gICAgdnIwID0gZ2V0X3ZhbHVl X3JhbmdlIChvcDApOwotICBlbHNlIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAob3AwKSkK LSAgICB0ZW0wLnNldCAob3AwKTsKLSAgZWxzZQotICAgIHRlbTAuc2V0X3ZhcnlpbmcgKFRSRUVf VFlQRSAob3AwKSk7Ci0KLSAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczMgKHN0bXQpOwot ICB2YWx1ZV9yYW5nZV9lcXVpdiB0ZW0xOwotICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIx ID0gJnRlbTE7Ci0gIGlmIChUUkVFX0NPREUgKG9wMSkgPT0gU1NBX05BTUUpCi0gICAgdnIxID0g Z2V0X3ZhbHVlX3JhbmdlIChvcDEpOwotICBlbHNlIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFu dCAob3AxKSkKLSAgICB0ZW0xLnNldCAob3AxKTsKLSAgZWxzZQotICAgIHRlbTEuc2V0X3Zhcnlp bmcgKFRSRUVfVFlQRSAob3AxKSk7Ci0KLSAgLyogVGhlIHJlc3VsdGluZyB2YWx1ZSByYW5nZSBp cyB0aGUgdW5pb24gb2YgdGhlIG9wZXJhbmQgcmFuZ2VzICovCi0gIHZyLT5kZWVwX2NvcHkgKHZy MCk7Ci0gIHZyLT5sZWdhY3lfdmVyYm9zZV91bmlvbl8gKHZyMSk7Ci19Ci0KLQotLyogRXh0cmFj dCByYW5nZSBpbmZvcm1hdGlvbiBmcm9tIGEgY29tcGFyaXNvbiBleHByZXNzaW9uIEVYUFIgYmFz ZWQKLSAgIG9uIHRoZSByYW5nZSBvZiBpdHMgb3BlcmFuZCBhbmQgdGhlIGV4cHJlc3Npb24gY29k ZS4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9mcm9tX2NvbXBhcmlzb24g KHZhbHVlX3JhbmdlX2VxdWl2ICp2ciwKLQkJCQkJICBnaW1wbGUgKnN0bXQpCi17Ci0gIGVudW0g dHJlZV9jb2RlIGNvZGUgPSBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KTsKLSAgdHJlZSB0 eXBlID0gVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAoc3RtdCkpOwotICB0cmVlIG9wMCA9 IGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCk7Ci0gIHRyZWUgb3AxID0gZ2ltcGxlX2Fzc2lnbl9y aHMyIChzdG10KTsKLSAgYm9vbCBzb3A7Ci0gIHRyZWUgdmFsCi0gICAgPSBzaW1wbGlmaWVyLnZy cF9ldmFsdWF0ZV9jb25kaXRpb25hbF93YXJudl93aXRoX29wcyAoc3RtdCwgY29kZSwgb3AwLCBv cDEsCi0JCQkJCQkJICBmYWxzZSwgJnNvcCwgTlVMTCk7Ci0gIGlmICh2YWwpCi0gICAgewotICAg ICAgLyogU2luY2UgdGhpcyBleHByZXNzaW9uIHdhcyBmb3VuZCBvbiB0aGUgUkhTIG9mIGFuIGFz c2lnbm1lbnQsCi0JIGl0cyB0eXBlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBfQm9vbC4gIENvbnZl cnQgVkFMIHRvIEVYUFIncwotCSB0eXBlLiAgKi8KLSAgICAgIHZhbCA9IGZvbGRfY29udmVydCAo dHlwZSwgdmFsKTsKLSAgICAgIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAodmFsKSkKLQl2 ci0+c2V0ICh2YWwpOwotICAgICAgZWxzZQotCXZyLT51cGRhdGUgKHZhbCwgdmFsKTsKLSAgICB9 Ci0gIGVsc2UKLSAgICAvKiBUaGUgcmVzdWx0IG9mIGEgY29tcGFyaXNvbiBpcyBhbHdheXMgdHJ1 ZSBvciBmYWxzZS4gICovCi0gICAgc2V0X3ZhbHVlX3JhbmdlX3RvX3RydXRodmFsdWUgKHZyLCB0 eXBlKTsKLX0KLQogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBzaW1wbGlmeV9pbnRlcm5hbF9jYWxs X3VzaW5nX3JhbmdlcyBhbmQKICAgIGV4dHJhY3RfcmFuZ2VfYmFzaWMuICBSZXR1cm4gdHJ1ZSBp ZiBPUDAgU1VCQ09ERSBPUDEgZm9yCiAgICBTVUJDT0RFIHtQTFVTLE1JTlVTLE1VTFR9X0VYUFIg aXMga25vd24gdG8gbmV2ZXIgb3ZlcmZsb3cgb3IKQEAgLTExNTAsMjQ3ICsxNzksMjUgQEAgY2hl Y2tfZm9yX2JpbmFyeV9vcF9vdmVyZmxvdyAocmFuZ2VfcXVlcnkgKnF1ZXJ5LAogCSAgICB7CiAJ ICAgICAgd21pbiA9IHd0OwogCSAgICAgIHdtYXggPSB3dDsKLQkgICAgfQotCSAgZWxzZQotCSAg ICB7Ci0JICAgICAgd21pbiA9IHdpOjpzbWluICh3bWluLCB3dCk7Ci0JICAgICAgd21heCA9IHdp OjpzbWF4ICh3bWF4LCB3dCk7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBUaGUgcmVzdWx0IG9mIG9w MCBDT0RFIG9wMSBpcyBrbm93biB0byBiZSBpbiByYW5nZQotCSBbd21pbiwgd21heF0uICAqLwot ICAgICAgd2lkZXN0X2ludCB3dG1pbiA9IHdpOjp0b193aWRlc3QgKHZycF92YWxfbWluICh0eXBl KSk7Ci0gICAgICB3aWRlc3RfaW50IHd0bWF4ID0gd2k6OnRvX3dpZGVzdCAodnJwX3ZhbF9tYXgg KHR5cGUpKTsKLSAgICAgIC8qIElmIGFsbCB2YWx1ZXMgaW4gW3dtaW4sIHdtYXhdIGFyZSBzbWFs bGVyIHRoYW4KLQkgW3d0bWluLCB3dG1heF0gb3IgYWxsIGFyZSBsYXJnZXIgdGhhbiBbd3RtaW4s IHd0bWF4XSwKLQkgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9uIHdpbGwgYWx3YXlzIG92ZXJmbG93 LiAgKi8KLSAgICAgIGlmICh3bWF4IDwgd3RtaW4gfHwgd21pbiA+IHd0bWF4KQotCXJldHVybiB0 cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8q IERlcml2ZSBhIHJhbmdlIGZyb20gYSBidWlsdGluLiAgU2V0IHJhbmdlIGluIFZSIGFuZCByZXR1 cm4gVFJVRSBpZgotICAgc3VjY2Vzc2Z1bC4gICovCi0KLWJvb2wKLXZyX3ZhbHVlczo6ZXh0cmFj dF9yYW5nZV9mcm9tX3Vic2FuX2J1aWx0aW4gKHZhbHVlX3JhbmdlX2VxdWl2ICp2ciwgZ2ltcGxl ICpzdG10KQotewotICBnY2NfYXNzZXJ0IChpc19naW1wbGVfY2FsbCAoc3RtdCkpOwotICBlbnVt IHRyZWVfY29kZSBzdWJjb2RlID0gRVJST1JfTUFSSzsKLSAgY29tYmluZWRfZm4gY2ZuID0gZ2lt cGxlX2NhbGxfY29tYmluZWRfZm4gKHN0bXQpOwotICBzY2FsYXJfaW50X21vZGUgbW9kZTsKLQot ICBzd2l0Y2ggKGNmbikKLSAgICB7Ci0gICAgY2FzZSBDRk5fVUJTQU5fQ0hFQ0tfQUREOgotICAg ICAgc3ViY29kZSA9IFBMVVNfRVhQUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0ZOX1VCU0FO X0NIRUNLX1NVQjoKLSAgICAgIHN1YmNvZGUgPSBNSU5VU19FWFBSOwotICAgICAgYnJlYWs7Ci0g ICAgY2FzZSBDRk5fVUJTQU5fQ0hFQ0tfTVVMOgotICAgICAgc3ViY29kZSA9IE1VTFRfRVhQUjsK LSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGlmIChz dWJjb2RlICE9IEVSUk9SX01BUkspCi0gICAgewotICAgICAgYm9vbCBzYXZlZF9mbGFnX3dyYXB2 ID0gZmxhZ193cmFwdjsKLSAgICAgIC8qIFByZXRlbmQgdGhlIGFyaXRobWV0aWNzIGlzIHdyYXBw aW5nLiAgSWYgdGhlcmUgaXMKLQkgYW55IG92ZXJmbG93LCB3ZSdsbCBjb21wbGFpbiwgYnV0IHdp bGwgYWN0dWFsbHkgZG8KLQkgd3JhcHBpbmcgb3BlcmF0aW9uLiAgKi8KLSAgICAgIGZsYWdfd3Jh cHYgPSAxOwotICAgICAgZXh0cmFjdF9yYW5nZV9mcm9tX2JpbmFyeV9leHByICh2ciwgc3ViY29k ZSwKLQkJCQkgICAgICBUUkVFX1RZUEUgKGdpbXBsZV9jYWxsX2FyZyAoc3RtdCwgMCkpLAotCQkJ CSAgICAgIGdpbXBsZV9jYWxsX2FyZyAoc3RtdCwgMCksCi0JCQkJICAgICAgZ2ltcGxlX2NhbGxf YXJnIChzdG10LCAxKSk7Ci0gICAgICBmbGFnX3dyYXB2ID0gc2F2ZWRfZmxhZ193cmFwdjsKLQot ICAgICAgLyogSWYgZm9yIGJvdGggYXJndW1lbnRzIHZycF92YWx1ZWl6ZSByZXR1cm5lZCBub24t TlVMTCwKLQkgdGhpcyBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgZm9sZGVkIGFuZCBpZiBub3Qs IGl0Ci0JIHdhc24ndCBmb2xkZWQgYmVjYXVzZSBvZiBvdmVyZmxvdy4gIEF2b2lkIHJlbW92aW5n IHRoZQotCSBVQlNBTl9DSEVDS18qIGNhbGxzIGluIHRoYXQgY2FzZS4gICovCi0gICAgICBpZiAo dnItPmtpbmQgKCkgPT0gVlJfUkFOR0UKLQkgICYmICh2ci0+bWluICgpID09IHZyLT5tYXggKCkK LQkgICAgICB8fCBvcGVyYW5kX2VxdWFsX3AgKHZyLT5taW4gKCksIHZyLT5tYXggKCksIDApKSkK LQl2ci0+c2V0X3ZhcnlpbmcgKHZyLT50eXBlICgpKTsKLQotICAgICAgcmV0dXJuICF2ci0+dmFy eWluZ19wICgpOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUcnkgdG8gZGVyaXZl IGEgbm9ubmVnYXRpdmUgb3Igbm9uemVybyByYW5nZSBvdXQgb2YgU1RNVCByZWx5aW5nCi0gICBw cmltYXJpbHkgb24gZ2VuZXJpYyByb3V0aW5lcyBpbiBmb2xkIGluIGNvbmp1bmN0aW9uIHdpdGgg cmFuZ2UgZGF0YS4KLSAgIFN0b3JlIHRoZSByZXN1bHQgaW4gKlZSICovCi0KLXZvaWQKLXZyX3Zh bHVlczo6ZXh0cmFjdF9yYW5nZV9iYXNpYyAodmFsdWVfcmFuZ2VfZXF1aXYgKnZyLCBnaW1wbGUg KnN0bXQpCi17Ci0gIGJvb2wgc29wOwotCi0gIGlmIChpc19naW1wbGVfY2FsbCAoc3RtdCkpCi0g ICAgewotICAgICAgY29tYmluZWRfZm4gY2ZuID0gZ2ltcGxlX2NhbGxfY29tYmluZWRfZm4gKHN0 bXQpOwotICAgICAgc3dpdGNoIChjZm4pCi0JewotCWNhc2UgQ0ZOX1VCU0FOX0NIRUNLX0FERDoK LQljYXNlIENGTl9VQlNBTl9DSEVDS19TVUI6Ci0JY2FzZSBDRk5fVUJTQU5fQ0hFQ0tfTVVMOgot CSAgaWYgKGV4dHJhY3RfcmFuZ2VfZnJvbV91YnNhbl9idWlsdGluICh2ciwgc3RtdCkpCi0JICAg IHJldHVybjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAoZm9sZF9yYW5nZSAoKnZyLCBz dG10LCB0aGlzKSkKLQkgICAgewotCSAgICAgIC8qIFRoZSBvcmlnaW5hbCBjb2RlIG51a2VkIGVx dWl2YWxlbmNlcyBldmVyeSB0aW1lIGEKLQkJIHJhbmdlIHdhcyBmb3VuZCwgc28gZG8gdGhlIHNh bWUgaGVyZS4gICovCi0JICAgICAgdnItPmVxdWl2X2NsZWFyICgpOwotCSAgICAgIHJldHVybjsK LQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgLyogSGFuZGxlIGV4dHJhY3Rpb24gb2Yg dGhlIHR3byByZXN1bHRzIChyZXN1bHQgb2YgYXJpdGhtZXRpY3MgYW5kCi0gICAgIGEgZmxhZyB3 aGV0aGVyIGFyaXRobWV0aWNzIG92ZXJmbG93ZWQpIGZyb20ge0FERCxTVUIsTVVMfV9PVkVSRkxP VwotICAgICBpbnRlcm5hbCBmdW5jdGlvbi4gIFNpbWlsYXJseSBmcm9tIEFUT01JQ19DT01QQVJF X0VYQ0hBTkdFLiAgKi8KLSAgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKHN0bXQpCi0gICAgICAmJiAo Z2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCkgPT0gUkVBTFBBUlRfRVhQUgotCSAgfHwgZ2lt cGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCkgPT0gSU1BR1BBUlRfRVhQUikKLSAgICAgICYmIElO VEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAoc3RtdCkpKSkKLSAg ICB7Ci0gICAgICBlbnVtIHRyZWVfY29kZSBjb2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAo c3RtdCk7Ci0gICAgICB0cmVlIG9wID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKLSAgICAg IHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAoZ2ltcGxlX2Fzc2lnbl9saHMgKHN0bXQpKTsKLSAgICAg IGlmIChUUkVFX0NPREUgKG9wKSA9PSBjb2RlICYmIFRSRUVfQ09ERSAoVFJFRV9PUEVSQU5EIChv cCwgMCkpID09IFNTQV9OQU1FKQotCXsKLQkgIGdpbXBsZSAqZyA9IFNTQV9OQU1FX0RFRl9TVE1U IChUUkVFX09QRVJBTkQgKG9wLCAwKSk7Ci0JICBpZiAoaXNfZ2ltcGxlX2NhbGwgKGcpICYmIGdp bXBsZV9jYWxsX2ludGVybmFsX3AgKGcpKQorCSAgICB9CisJICBlbHNlCiAJICAgIHsKLQkgICAg ICBlbnVtIHRyZWVfY29kZSBzdWJjb2RlID0gRVJST1JfTUFSSzsKLQkgICAgICBzd2l0Y2ggKGdp bXBsZV9jYWxsX2ludGVybmFsX2ZuIChnKSkKLQkJewotCQljYXNlIElGTl9BRERfT1ZFUkZMT1c6 Ci0JCSAgc3ViY29kZSA9IFBMVVNfRVhQUjsKLQkJICBicmVhazsKLQkJY2FzZSBJRk5fU1VCX09W RVJGTE9XOgotCQkgIHN1YmNvZGUgPSBNSU5VU19FWFBSOwotCQkgIGJyZWFrOwotCQljYXNlIElG Tl9NVUxfT1ZFUkZMT1c6Ci0JCSAgc3ViY29kZSA9IE1VTFRfRVhQUjsKLQkJICBicmVhazsKLQkJ Y2FzZSBJRk5fQVRPTUlDX0NPTVBBUkVfRVhDSEFOR0U6Ci0JCSAgaWYgKGNvZGUgPT0gSU1BR1BB UlRfRVhQUikKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyB0aGUgYm9vbGVhbiByZXR1cm4g dmFsdWUgd2hldGhlciBjb21wYXJlIGFuZAotCQkJIGV4Y2hhbmdlIGNoYW5nZWQgYW55dGhpbmcg b3Igbm90LiAgKi8KLQkJICAgICAgdnItPnNldCAoYnVpbGRfaW50X2NzdCAodHlwZSwgMCksCi0J CQkgICAgICAgYnVpbGRfaW50X2NzdCAodHlwZSwgMSksIE5VTEwpOwotCQkgICAgICByZXR1cm47 Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAg ICBpZiAoc3ViY29kZSAhPSBFUlJPUl9NQVJLKQotCQl7Ci0JCSAgdHJlZSBvcDAgPSBnaW1wbGVf Y2FsbF9hcmcgKGcsIDApOwotCQkgIHRyZWUgb3AxID0gZ2ltcGxlX2NhbGxfYXJnIChnLCAxKTsK LQkJICBpZiAoY29kZSA9PSBJTUFHUEFSVF9FWFBSKQotCQkgICAgewotCQkgICAgICBib29sIG92 ZiA9IGZhbHNlOwotCQkgICAgICBpZiAoY2hlY2tfZm9yX2JpbmFyeV9vcF9vdmVyZmxvdyAodGhp cywgc3ViY29kZSwgdHlwZSwKLQkJCQkJCQlvcDAsIG9wMSwgJm92ZikpCi0JCQl2ci0+c2V0IChi dWlsZF9pbnRfY3N0ICh0eXBlLCBvdmYpKTsKLQkJICAgICAgZWxzZSBpZiAoVFlQRV9QUkVDSVNJ T04gKHR5cGUpID09IDEKLQkJCSAgICAgICAmJiAhVFlQRV9VTlNJR05FRCAodHlwZSkpCi0JCQl2 ci0+c2V0X3ZhcnlpbmcgKHR5cGUpOwotCQkgICAgICBlbHNlCi0JCQl2ci0+c2V0IChidWlsZF9p bnRfY3N0ICh0eXBlLCAwKSwKLQkJCQkgYnVpbGRfaW50X2NzdCAodHlwZSwgMSksIE5VTEwpOwot CQkgICAgfQotCQkgIGVsc2UgaWYgKHR5cGVzX2NvbXBhdGlibGVfcCAodHlwZSwgVFJFRV9UWVBF IChvcDApKQotCQkJICAgJiYgdHlwZXNfY29tcGF0aWJsZV9wICh0eXBlLCBUUkVFX1RZUEUgKG9w MSkpKQotCQkgICAgewotCQkgICAgICBib29sIHNhdmVkX2ZsYWdfd3JhcHYgPSBmbGFnX3dyYXB2 OwotCQkgICAgICAvKiBQcmV0ZW5kIHRoZSBhcml0aG1ldGljcyBpcyB3cmFwcGluZy4gIElmIHRo ZXJlIGlzCi0JCQkgYW55IG92ZXJmbG93LCBJTUFHUEFSVF9FWFBSIHdpbGwgYmUgc2V0LiAgKi8K LQkJICAgICAgZmxhZ193cmFwdiA9IDE7Ci0JCSAgICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV9iaW5h cnlfZXhwciAodnIsIHN1YmNvZGUsIHR5cGUsCi0JCQkJCQkgICAgICBvcDAsIG9wMSk7Ci0JCSAg ICAgIGZsYWdfd3JhcHYgPSBzYXZlZF9mbGFnX3dyYXB2OwotCQkgICAgfQotCQkgIGVsc2UKLQkJ ICAgIHsKLQkJICAgICAgdmFsdWVfcmFuZ2VfZXF1aXYgdnIwLCB2cjE7Ci0JCSAgICAgIGJvb2wg c2F2ZWRfZmxhZ193cmFwdiA9IGZsYWdfd3JhcHY7Ci0JCSAgICAgIC8qIFByZXRlbmQgdGhlIGFy aXRobWV0aWNzIGlzIHdyYXBwaW5nLiAgSWYgdGhlcmUgaXMKLQkJCSBhbnkgb3ZlcmZsb3csIElN QUdQQVJUX0VYUFIgd2lsbCBiZSBzZXQuICAqLwotCQkgICAgICBmbGFnX3dyYXB2ID0gMTsKLQkJ ICAgICAgZXh0cmFjdF9yYW5nZV9mcm9tX3VuYXJ5X2V4cHIgKCZ2cjAsIE5PUF9FWFBSLAotCQkJ CQkJICAgICB0eXBlLCBvcDApOwotCQkgICAgICBleHRyYWN0X3JhbmdlX2Zyb21fdW5hcnlfZXhw ciAoJnZyMSwgTk9QX0VYUFIsCi0JCQkJCQkgICAgIHR5cGUsIG9wMSk7Ci0JCSAgICAgIHJhbmdl X2ZvbGRfYmluYXJ5X2V4cHIgKHZyLCBzdWJjb2RlLCB0eXBlLCAmdnIwLCAmdnIxKTsKLQkJICAg ICAgZmxhZ193cmFwdiA9IHNhdmVkX2ZsYWdfd3JhcHY7Ci0JCSAgICB9Ci0JCSAgcmV0dXJuOwot CQl9CisJICAgICAgd21pbiA9IHdpOjpzbWluICh3bWluLCB3dCk7CisJICAgICAgd21heCA9IHdp OjpzbWF4ICh3bWF4LCB3dCk7CiAJICAgIH0KIAl9CisgICAgICAvKiBUaGUgcmVzdWx0IG9mIG9w MCBDT0RFIG9wMSBpcyBrbm93biB0byBiZSBpbiByYW5nZQorCSBbd21pbiwgd21heF0uICAqLwor ICAgICAgd2lkZXN0X2ludCB3dG1pbiA9IHdpOjp0b193aWRlc3QgKHZycF92YWxfbWluICh0eXBl KSk7CisgICAgICB3aWRlc3RfaW50IHd0bWF4ID0gd2k6OnRvX3dpZGVzdCAodnJwX3ZhbF9tYXgg KHR5cGUpKTsKKyAgICAgIC8qIElmIGFsbCB2YWx1ZXMgaW4gW3dtaW4sIHdtYXhdIGFyZSBzbWFs bGVyIHRoYW4KKwkgW3d0bWluLCB3dG1heF0gb3IgYWxsIGFyZSBsYXJnZXIgdGhhbiBbd3RtaW4s IHd0bWF4XSwKKwkgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9uIHdpbGwgYWx3YXlzIG92ZXJmbG93 LiAgKi8KKyAgICAgIGlmICh3bWF4IDwgd3RtaW4gfHwgd21pbiA+IHd0bWF4KQorCXJldHVybiB0 cnVlOworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgLyogTm9uZSBvZiB0aGUgYmVsb3cg c2hvdWxkIG5lZWQgYSAndHlwZScsIGJ1dCB3ZSBhcmUgb25seSBjYWxsZWQKLSAgICAgZm9yIGFz c2lnbm1lbnRzIGFuZCBjYWxscyB3aXRoIGEgTEhTLiAgKi8KLSAgdHJlZSB0eXBlID0gVFJFRV9U WVBFIChnaW1wbGVfZ2V0X2xocyAoc3RtdCkpOwotICBpZiAoSU5URUdSQUxfVFlQRV9QICh0eXBl KQotICAgICAgJiYgZ2ltcGxlX3N0bXRfbm9ubmVnYXRpdmVfd2FybnZfcCAoc3RtdCwgJnNvcCkp Ci0gICAgc2V0X3ZhbHVlX3JhbmdlX3RvX25vbm5lZ2F0aXZlICh2ciwgdHlwZSk7Ci0gIGVsc2Ug aWYgKHZycF9zdG10X2NvbXB1dGVzX25vbnplcm8gKHN0bXQpKQotICAgIHsKLSAgICAgIHZyLT5z ZXRfbm9uemVybyAodHlwZSk7Ci0gICAgICB2ci0+ZXF1aXZfY2xlYXIgKCk7Ci0gICAgfQotICBl bHNlCi0gICAgdnItPnNldF92YXJ5aW5nICh0eXBlKTsKLX0KLQotCi0vKiBUcnkgdG8gY29tcHV0 ZSBhIHVzZWZ1bCByYW5nZSBvdXQgb2YgYXNzaWdubWVudCBTVE1UIGFuZCBzdG9yZSBpdAotICAg aW4gKlZSLiAgKi8KLQotdm9pZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fYXNzaWdu bWVudCAodmFsdWVfcmFuZ2VfZXF1aXYgKnZyLCBnYXNzaWduICpzdG10KQotewotICBlbnVtIHRy ZWVfY29kZSBjb2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCk7Ci0KLSAgaWYgKGNv ZGUgPT0gQVNTRVJUX0VYUFIpCi0gICAgZXh0cmFjdF9yYW5nZV9mcm9tX2Fzc2VydCAodnIsIGdp bXBsZV9hc3NpZ25fcmhzMSAoc3RtdCkpOwotICBlbHNlIGlmIChjb2RlID09IFNTQV9OQU1FKQot ICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV9zc2FfbmFtZSAodnIsIGdpbXBsZV9hc3NpZ25fcmhzMSAo c3RtdCkpOwotICBlbHNlIGlmIChUUkVFX0NPREVfQ0xBU1MgKGNvZGUpID09IHRjY19iaW5hcnkp Ci0gICAgZXh0cmFjdF9yYW5nZV9mcm9tX2JpbmFyeV9leHByICh2ciwgZ2ltcGxlX2Fzc2lnbl9y aHNfY29kZSAoc3RtdCksCi0JCQkJICAgIFRSRUVfVFlQRSAoZ2ltcGxlX2Fzc2lnbl9saHMgKHN0 bXQpKSwKLQkJCQkgICAgZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KSwKLQkJCQkgICAgZ2ltcGxl X2Fzc2lnbl9yaHMyIChzdG10KSk7Ci0gIGVsc2UgaWYgKFRSRUVfQ09ERV9DTEFTUyAoY29kZSkg PT0gdGNjX3VuYXJ5KQotICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV91bmFyeV9leHByICh2ciwgZ2lt cGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCksCi0JCQkJICAgVFJFRV9UWVBFIChnaW1wbGVfYXNz aWduX2xocyAoc3RtdCkpLAotCQkJCSAgIGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCkpOwotICBl bHNlIGlmIChjb2RlID09IENPTkRfRVhQUikKLSAgICBleHRyYWN0X3JhbmdlX2Zyb21fY29uZF9l eHByICh2ciwgc3RtdCk7Ci0gIGVsc2UgaWYgKFRSRUVfQ09ERV9DTEFTUyAoY29kZSkgPT0gdGNj X2NvbXBhcmlzb24pCi0gICAgZXh0cmFjdF9yYW5nZV9mcm9tX2NvbXBhcmlzb24gKHZyLCBzdG10 KTsKLSAgZWxzZSBpZiAoZ2V0X2dpbXBsZV9yaHNfY2xhc3MgKGNvZGUpID09IEdJTVBMRV9TSU5H TEVfUkhTCi0JICAgJiYgaXNfZ2ltcGxlX21pbl9pbnZhcmlhbnQgKGdpbXBsZV9hc3NpZ25fcmhz MSAoc3RtdCkpKQotICAgIHZyLT5zZXQgKGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCkpOwotICBl bHNlCi0gICAgdnItPnNldF92YXJ5aW5nIChUUkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25fbGhzIChz dG10KSkpOwotCi0gIGlmICh2ci0+dmFyeWluZ19wICgpKQotICAgIGV4dHJhY3RfcmFuZ2VfYmFz aWMgKHZyLCBzdG10KTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIC8qIEdpdmVuIHR3byBudW1lcmlj IHZhbHVlIHJhbmdlcyBWUjAsIFZSMSBhbmQgYSBjb21wYXJpc29uIGNvZGUgQ09NUDoKQEAgLTE4 MDgsMjAyICs2MTUsNiBAQCBib3VuZHNfb2ZfdmFyX2luX2xvb3AgKHRyZWUgKm1pbiwgdHJlZSAq bWF4LCByYW5nZV9xdWVyeSAqcXVlcnksCiAgIHJldHVybiB0cnVlOwogfQogCi0vKiBHaXZlbiBh IHJhbmdlIFZSLCBhIExPT1AgYW5kIGEgdmFyaWFibGUgVkFSLCBkZXRlcm1pbmUgd2hldGhlciBp dAotICAgd291bGQgYmUgcHJvZml0YWJsZSB0byBhZGp1c3QgVlIgdXNpbmcgc2NhbGFyIGV2b2x1 dGlvbiBpbmZvcm1hdGlvbgotICAgZm9yIFZBUi4gIElmIHNvLCB1cGRhdGUgVlIgd2l0aCB0aGUg bmV3IGxpbWl0cy4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6YWRqdXN0X3JhbmdlX3dpdGhfc2Nl diAodmFsdWVfcmFuZ2VfZXF1aXYgKnZyLCBjbGFzcyBsb29wICpsb29wLAotCQkJCSAgIGdpbXBs ZSAqc3RtdCwgdHJlZSB2YXIpCi17Ci0gIHRyZWUgbWluLCBtYXg7Ci0gIGlmIChib3VuZHNfb2Zf dmFyX2luX2xvb3AgKCZtaW4sICZtYXgsIHRoaXMsIGxvb3AsIHN0bXQsIHZhcikpCi0gICAgewot ICAgICAgaWYgKHZyLT51bmRlZmluZWRfcCAoKSB8fCB2ci0+dmFyeWluZ19wICgpKQotCXsKLQkg IC8qIEZvciBWQVJZSU5HIG9yIFVOREVGSU5FRCByYW5nZXMsIGp1c3QgYWJvdXQgYW55dGhpbmcg d2UgZ2V0Ci0JICAgICBmcm9tIHNjYWxhciBldm9sdXRpb25zIHNob3VsZCBiZSBiZXR0ZXIuICAq LwotCSAgdnItPnVwZGF0ZSAobWluLCBtYXgpOwotCX0KLSAgICAgIGVsc2UgaWYgKHZyLT5raW5k ICgpID09IFZSX1JBTkdFKQotCXsKLQkgIC8qIFN0YXJ0IHdpdGggdGhlIGlucHV0IHJhbmdlLi4u ICovCi0JICB0cmVlIHZybWluID0gdnItPm1pbiAoKTsKLQkgIHRyZWUgdnJtYXggPSB2ci0+bWF4 ICgpOwotCi0JICAvKiAuLi5hbmQgbmFycm93IGl0IGRvd24gd2l0aCB3aGF0IHdlIGdvdCBmcm9t IFNDRVYuICAqLwotCSAgaWYgKGNvbXBhcmVfdmFsdWVzIChtaW4sIHZybWluKSA9PSAxKQotCSAg ICB2cm1pbiA9IG1pbjsKLQkgIGlmIChjb21wYXJlX3ZhbHVlcyAobWF4LCB2cm1heCkgPT0gLTEp Ci0JICAgIHZybWF4ID0gbWF4OwotCi0JICB2ci0+dXBkYXRlICh2cm1pbiwgdnJtYXgpOwotCX0K LSAgICAgIGVsc2UgaWYgKHZyLT5raW5kICgpID09IFZSX0FOVElfUkFOR0UpCi0JewotCSAgLyog Pz8gQXMgYW4gZW5oYW5jZW1lbnQsIGlmIFZSLCBNSU4sIGFuZCBNQVggYXJlIGNvbnN0YW50cywg b25lCi0JICAgICBjb3VsZCBqdXN0IGludGVyc2VjdCBWUiB3aXRoIGEgcmFuZ2Ugb2YgW01JTixN QVhdLiAgKi8KLQl9Ci0gICAgfQotfQotCi0vKiBEdW1wIHZhbHVlIHJhbmdlcyBvZiBhbGwgU1NB X05BTUVzIHRvIEZJTEUuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OmR1bXAgKEZJTEUgKmZpbGUp Ci17Ci0gIHNpemVfdCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fdnJfdmFsdWVzOyBpKysp Ci0gICAgewotICAgICAgaWYgKHZyX3ZhbHVlW2ldICYmIHNzYV9uYW1lIChpKSkKLQl7Ci0JICBw cmludF9nZW5lcmljX2V4cHIgKGZpbGUsIHNzYV9uYW1lIChpKSk7Ci0JICBmcHJpbnRmIChmaWxl LCAiOiAiKTsKLQkgIGR1bXBfdmFsdWVfcmFuZ2UgKGZpbGUsIHZyX3ZhbHVlW2ldKTsKLQkgIGZw cmludGYgKGZpbGUsICJcbiIpOwotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7 Ci19Ci0KLS8qIEluaXRpYWxpemUgVlJQIGxhdHRpY2UuICAqLwotCi12cl92YWx1ZXM6OnZyX3Zh bHVlcyAoKSA6IHNpbXBsaWZpZXIgKHRoaXMpCi17Ci0gIHZhbHVlc19wcm9wYWdhdGVkID0gZmFs c2U7Ci0gIG51bV92cl92YWx1ZXMgPSBudW1fc3NhX25hbWVzICogMjsKLSAgdnJfdmFsdWUgPSBY Q05FV1ZFQyAodmFsdWVfcmFuZ2VfZXF1aXYgKiwgbnVtX3ZyX3ZhbHVlcyk7Ci0gIHZyX3BoaV9l ZGdlX2NvdW50cyA9IFhDTkVXVkVDIChpbnQsIG51bV9zc2FfbmFtZXMpOwotICBiaXRtYXBfb2Jz dGFja19pbml0aWFsaXplICgmdnJwX2VxdWl2X29ic3RhY2spOwotfQotCi0vKiBGcmVlIFZSUCBs YXR0aWNlLiAgKi8KLQotdnJfdmFsdWVzOjp+dnJfdmFsdWVzICgpCi17Ci0gIC8qIEZyZWUgYWxs b2NhdGVkIG1lbW9yeS4gICovCi0gIGZyZWUgKHZyX3ZhbHVlKTsKLSAgZnJlZSAodnJfcGhpX2Vk Z2VfY291bnRzKTsKLSAgYml0bWFwX29ic3RhY2tfcmVsZWFzZSAoJnZycF9lcXVpdl9vYnN0YWNr KTsKLQotICAvKiBTbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuIFZSUCBkYXRhIGJl aW5nIGF2YWlsYWJsZQotICAgICBhbmQgbm90IGF2YWlsYWJsZS4gICovCi0gIHZyX3ZhbHVlID0g TlVMTDsKLSAgdnJfcGhpX2VkZ2VfY291bnRzID0gTlVMTDsKLX0KLQotCi0vKiBBIGhhY2suICAq Lwotc3RhdGljIGNsYXNzIHZyX3ZhbHVlcyAqeF92cl92YWx1ZXM7Ci0KLS8qIFJldHVybiB0aGUg c2luZ2xldG9uIHZhbHVlLXJhbmdlIGZvciBOQU1FIG9yIE5BTUUuICAqLwotCi1zdGF0aWMgaW5s aW5lIHRyZWUKLXZycF92YWx1ZWl6ZSAodHJlZSBuYW1lKQotewotICBpZiAoVFJFRV9DT0RFIChu YW1lKSA9PSBTU0FfTkFNRSkKLSAgICB7Ci0gICAgICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAq dnIgPSB4X3ZyX3ZhbHVlcy0+Z2V0X3ZhbHVlX3JhbmdlIChuYW1lKTsKLSAgICAgIGlmICh2ci0+ a2luZCAoKSA9PSBWUl9SQU5HRQotCSAgJiYgKFRSRUVfQ09ERSAodnItPm1pbiAoKSkgPT0gU1NB X05BTUUKLQkgICAgICB8fCBpc19naW1wbGVfbWluX2ludmFyaWFudCAodnItPm1pbiAoKSkpCi0J ICAmJiB2cnBfb3BlcmFuZF9lcXVhbF9wICh2ci0+bWluICgpLCB2ci0+bWF4ICgpKSkKLQlyZXR1 cm4gdnItPm1pbiAoKTsKLSAgICB9Ci0gIHJldHVybiBuYW1lOwotfQotCi0vKiBSZXR1cm4gdGhl IHNpbmdsZXRvbiB2YWx1ZS1yYW5nZSBmb3IgTkFNRSBpZiB0aGF0IGlzIGEgY29uc3RhbnQKLSAg IGJ1dCBzaWduYWwgdG8gbm90IGZvbGxvdyBTU0EgZWRnZXMuICAqLwotCi1zdGF0aWMgaW5saW5l IHRyZWUKLXZycF92YWx1ZWl6ZV8xICh0cmVlIG5hbWUpCi17Ci0gIGlmIChUUkVFX0NPREUgKG5h bWUpID09IFNTQV9OQU1FKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBkZWZpbml0aW9uIG1heSBi ZSBzaW11bGF0ZWQgYWdhaW4gd2UgY2Fubm90IGZvbGxvdwotICAgICAgICAgdGhpcyBTU0EgZWRn ZSBhcyB0aGUgU1NBIHByb3BhZ2F0b3IgZG9lcyBub3QgbmVjZXNzYXJpbHkKLQkgcmUtdmlzaXQg dGhlIHVzZS4gICovCi0gICAgICBnaW1wbGUgKmRlZl9zdG10ID0gU1NBX05BTUVfREVGX1NUTVQg KG5hbWUpOwotICAgICAgaWYgKCFnaW1wbGVfbm9wX3AgKGRlZl9zdG10KQotCSAgJiYgcHJvcF9z aW11bGF0ZV9hZ2Fpbl9wIChkZWZfc3RtdCkpCi0JcmV0dXJuIE5VTExfVFJFRTsKLSAgICAgIGNv bnN0IHZhbHVlX3JhbmdlX2VxdWl2ICp2ciA9IHhfdnJfdmFsdWVzLT5nZXRfdmFsdWVfcmFuZ2Ug KG5hbWUpOwotICAgICAgdHJlZSBzaW5nbGV0b247Ci0gICAgICBpZiAodnItPnNpbmdsZXRvbl9w ICgmc2luZ2xldG9uKSkKLQlyZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLSAgcmV0dXJuIG5hbWU7 Ci19Ci0KLS8qIEdpdmVuIFNUTVQsIGFuIGFzc2lnbm1lbnQgb3IgY2FsbCwgcmV0dXJuIGl0cyBM SFMgaWYgdGhlIHR5cGUKLSAgIG9mIHRoZSBMSFMgaXMgc3VpdGFibGUgZm9yIFZSUCBhbmFseXNp cywgZWxzZSByZXR1cm4gTlVMTF9UUkVFLiAgKi8KLQotdHJlZQotZ2V0X291dHB1dF9mb3JfdnJw IChnaW1wbGUgKnN0bXQpCi17Ci0gIGlmICghaXNfZ2ltcGxlX2Fzc2lnbiAoc3RtdCkgJiYgIWlz X2dpbXBsZV9jYWxsIChzdG10KSkKLSAgICByZXR1cm4gTlVMTF9UUkVFOwotCi0gIC8qIFdlIG9u bHkga2VlcCB0cmFjayBvZiByYW5nZXMgaW4gaW50ZWdyYWwgYW5kIHBvaW50ZXIgdHlwZXMuICAq LwotICB0cmVlIGxocyA9IGdpbXBsZV9nZXRfbGhzIChzdG10KTsKLSAgaWYgKFRSRUVfQ09ERSAo bGhzKSA9PSBTU0FfTkFNRQotICAgICAgJiYgKChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAo bGhzKSkKLQkgICAvKiBJdCBpcyB2YWxpZCB0byBoYXZlIE5VTEwgTUlOL01BWCB2YWx1ZXMgb24g YSB0eXBlLiAgU2VlCi0JICAgICAgYnVpbGRfcmFuZ2VfdHlwZS4gICovCi0JICAgJiYgVFlQRV9N SU5fVkFMVUUgKFRSRUVfVFlQRSAobGhzKSkKLQkgICAmJiBUWVBFX01BWF9WQUxVRSAoVFJFRV9U WVBFIChsaHMpKSkKLQkgIHx8IFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGxocykpKSkKLSAg ICByZXR1cm4gbGhzOwotCi0gIHJldHVybiBOVUxMX1RSRUU7Ci19Ci0KLS8qIFZpc2l0IGFzc2ln bm1lbnQgU1RNVC4gIElmIGl0IHByb2R1Y2VzIGFuIGludGVyZXN0aW5nIHJhbmdlLCByZWNvcmQK LSAgIHRoZSByYW5nZSBpbiBWUiBhbmQgc2V0IExIUyB0byBPVVRQVVRfUC4gICovCi0KLXZvaWQK LXZyX3ZhbHVlczo6dnJwX3Zpc2l0X2Fzc2lnbm1lbnRfb3JfY2FsbCAoZ2ltcGxlICpzdG10LCB0 cmVlICpvdXRwdXRfcCwKLQkJCQkJIHZhbHVlX3JhbmdlX2VxdWl2ICp2cikKLXsKLSAgdHJlZSBs aHMgPSBnZXRfb3V0cHV0X2Zvcl92cnAgKHN0bXQpOwotICAqb3V0cHV0X3AgPSBsaHM7Ci0KLSAg LyogV2Ugb25seSBrZWVwIHRyYWNrIG9mIHJhbmdlcyBpbiBpbnRlZ3JhbCBhbmQgcG9pbnRlciB0 eXBlcy4gICovCi0gIGlmIChsaHMpCi0gICAgewotICAgICAgZW51bSBnaW1wbGVfY29kZSBjb2Rl ID0gZ2ltcGxlX2NvZGUgKHN0bXQpOwotCi0gICAgICAvKiBUcnkgZm9sZGluZyB0aGUgc3RhdGVt ZW50IHRvIGEgY29uc3RhbnQgZmlyc3QuICAqLwotICAgICAgeF92cl92YWx1ZXMgPSB0aGlzOwot ICAgICAgdHJlZSB0ZW0gPSBnaW1wbGVfZm9sZF9zdG10X3RvX2NvbnN0YW50XzEgKHN0bXQsIHZy cF92YWx1ZWl6ZSwKLQkJCQkJCSB2cnBfdmFsdWVpemVfMSk7Ci0gICAgICB4X3ZyX3ZhbHVlcyA9 IE5VTEw7Ci0gICAgICBpZiAodGVtKQotCXsKLQkgIGlmIChUUkVFX0NPREUgKHRlbSkgPT0gU1NB X05BTUUKLQkgICAgICAmJiAoU1NBX05BTUVfSVNfREVGQVVMVF9ERUYgKHRlbSkKLQkJICB8fCAh IHByb3Bfc2ltdWxhdGVfYWdhaW5fcCAoU1NBX05BTUVfREVGX1NUTVQgKHRlbSkpKSkKLQkgICAg ewotCSAgICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV9zc2FfbmFtZSAodnIsIHRlbSk7Ci0JICAgICAg cmV0dXJuOwotCSAgICB9Ci0JICBlbHNlIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAodGVt KSkKLQkgICAgewotCSAgICAgIHZyLT5zZXQgKHRlbSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9 Ci0JfQotICAgICAgLyogVGhlbiBkaXNwYXRjaCB0byB2YWx1ZS1yYW5nZSBleHRyYWN0aW5nIGZ1 bmN0aW9ucy4gICovCi0gICAgICBpZiAoY29kZSA9PSBHSU1QTEVfQ0FMTCkKLQlleHRyYWN0X3Jh bmdlX2Jhc2ljICh2ciwgc3RtdCk7Ci0gICAgICBlbHNlCi0JZXh0cmFjdF9yYW5nZV9mcm9tX2Fz c2lnbm1lbnQgKHZyLCBhc19hIDxnYXNzaWduICo+IChzdG10KSk7Ci0gICAgfQotfQotCiAvKiBI ZWxwZXIgdGhhdCBnZXRzIHRoZSB2YWx1ZSByYW5nZSBvZiB0aGUgU1NBX05BTUUgd2l0aCB2ZXJz aW9uIEkKICAgIG9yIGEgc3ltYm9saWMgcmFuZ2UgY29udGFpbmluZyB0aGUgU1NBX05BTUUgb25s eSBpZiB0aGUgdmFsdWUgcmFuZ2UKICAgIGlzIHZhcnlpbmcgb3IgdW5kZWZpbmVkLiAgVXNlcyBU RU0gYXMgc3RvcmFnZSBmb3IgdGhlIGFsdGVybmF0ZSByYW5nZS4gICovCkBAIC0yMzUyLDEwMCAr OTYzLDYgQEAgc2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjp2cnBfZXZhbHVhdGVfY29uZGl0aW9uYWxf d2FybnZfd2l0aF9vcHMKICAgcmV0dXJuIE5VTExfVFJFRTsKIH0KIAotLyogR2l2ZW4gKENPREUg T1AwIE9QMSkgd2l0aGluIFNUTVQsIHRyeSB0byBzaW1wbGlmeSBpdCBiYXNlZCBvbiB2YWx1ZSBy YW5nZQotICAgaW5mb3JtYXRpb24uICBSZXR1cm4gTlVMTCBpZiB0aGUgY29uZGl0aW9uYWwgY2Fu bm90IGJlIGV2YWx1YXRlZC4KLSAgIFRoZSByYW5nZXMgb2YgYWxsIHRoZSBuYW1lcyBlcXVpdmFs ZW50IHdpdGggdGhlIG9wZXJhbmRzIGluIENPTkQKLSAgIHdpbGwgYmUgdXNlZCB3aGVuIHRyeWlu ZyB0byBjb21wdXRlIHRoZSB2YWx1ZS4gIElmIHRoZSByZXN1bHQgaXMKLSAgIGJhc2VkIG9uIHVu ZGVmaW5lZCBzaWduZWQgb3ZlcmZsb3csIGlzc3VlIGEgd2FybmluZyBpZgotICAgYXBwcm9wcmlh dGUuICAqLwotCi10cmVlCi1zaW1wbGlmeV91c2luZ19yYW5nZXM6OnZycF9ldmFsdWF0ZV9jb25k aXRpb25hbCAodHJlZV9jb2RlIGNvZGUsIHRyZWUgb3AwLAotCQkJCQkJIHRyZWUgb3AxLCBnaW1w bGUgKnN0bXQpCi17Ci0gIGJvb2wgc29wOwotICB0cmVlIHJldDsKLSAgYm9vbCBvbmx5X3Jhbmdl czsKLQotICAvKiBTb21lIHBhc3NlcyBhbmQgZm9sZGluZ3MgbGVhayBjb25zdGFudHMgd2l0aCBv dmVyZmxvdyBmbGFnIHNldAotICAgICBpbnRvIHRoZSBJTC4gIEF2b2lkIGRvaW5nIHdyb25nIHRo aW5ncyB3aXRoIHRoZXNlIGFuZCBiYWlsIG91dC4gICovCi0gIGlmICgoVFJFRV9DT0RFIChvcDAp ID09IElOVEVHRVJfQ1NUCi0gICAgICAgJiYgVFJFRV9PVkVSRkxPVyAob3AwKSkKLSAgICAgIHx8 IChUUkVFX0NPREUgKG9wMSkgPT0gSU5URUdFUl9DU1QKLQkgICYmIFRSRUVfT1ZFUkZMT1cgKG9w MSkpKQotICAgIHJldHVybiBOVUxMX1RSRUU7Ci0KLSAgc29wID0gZmFsc2U7Ci0gIHJldCA9IHZy cF9ldmFsdWF0ZV9jb25kaXRpb25hbF93YXJudl93aXRoX29wcyAoc3RtdCwgY29kZSwgb3AwLCBv cDEsIHRydWUsCi0JCQkJCQkgJnNvcCwgJm9ubHlfcmFuZ2VzKTsKLQotICBpZiAocmV0ICYmIHNv cCkKLSAgICB7Ci0gICAgICBlbnVtIHdhcm5fc3RyaWN0X292ZXJmbG93X2NvZGUgd2M7Ci0gICAg ICBjb25zdCBjaGFyKiB3YXJubXNnOwotCi0gICAgICBpZiAoaXNfZ2ltcGxlX21pbl9pbnZhcmlh bnQgKHJldCkpCi0JewotCSAgd2MgPSBXQVJOX1NUUklDVF9PVkVSRkxPV19DT05ESVRJT05BTDsK LQkgIHdhcm5tc2cgPSBHXygiYXNzdW1pbmcgc2lnbmVkIG92ZXJmbG93IGRvZXMgbm90IG9jY3Vy IHdoZW4gIgotCQkgICAgICAgInNpbXBsaWZ5aW5nIGNvbmRpdGlvbmFsIHRvIGNvbnN0YW50Iik7 Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHdjID0gV0FSTl9TVFJJQ1RfT1ZFUkZMT1dfQ09NUEFS SVNPTjsKLQkgIHdhcm5tc2cgPSBHXygiYXNzdW1pbmcgc2lnbmVkIG92ZXJmbG93IGRvZXMgbm90 IG9jY3VyIHdoZW4gIgotCQkgICAgICAgInNpbXBsaWZ5aW5nIGNvbmRpdGlvbmFsIik7Ci0JfQot Ci0gICAgICBpZiAoaXNzdWVfc3RyaWN0X292ZXJmbG93X3dhcm5pbmcgKHdjKSkKLQl7Ci0JICBs b2NhdGlvbl90IGxvY2F0aW9uOwotCi0JICBpZiAoIWdpbXBsZV9oYXNfbG9jYXRpb24gKHN0bXQp KQotCSAgICBsb2NhdGlvbiA9IGlucHV0X2xvY2F0aW9uOwotCSAgZWxzZQotCSAgICBsb2NhdGlv biA9IGdpbXBsZV9sb2NhdGlvbiAoc3RtdCk7Ci0JICB3YXJuaW5nX2F0IChsb2NhdGlvbiwgT1BU X1dzdHJpY3Rfb3ZlcmZsb3csICIlcyIsIHdhcm5tc2cpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHdh cm5fdHlwZV9saW1pdHMKLSAgICAgICYmIHJldCAmJiBvbmx5X3JhbmdlcwotICAgICAgJiYgVFJF RV9DT0RFX0NMQVNTIChjb2RlKSA9PSB0Y2NfY29tcGFyaXNvbgotICAgICAgJiYgVFJFRV9DT0RF IChvcDApID09IFNTQV9OQU1FKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBjb21wYXJpc29uIGlz IGJlaW5nIGZvbGRlZCBhbmQgdGhlIG9wZXJhbmQgb24gdGhlIExIUwotCSBpcyBiZWluZyBjb21w YXJlZCBhZ2FpbnN0IGEgY29uc3RhbnQgdmFsdWUgdGhhdCBpcyBvdXRzaWRlIG9mCi0JIHRoZSBu YXR1cmFsIHJhbmdlIG9mIE9QMCdzIHR5cGUsIHRoZW4gdGhlIHByZWRpY2F0ZSB3aWxsCi0JIGFs d2F5cyBmb2xkIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIE9QMC4gIElmIC1XdHlwZS1saW1p dHMKLQkgd2FzIHNwZWNpZmllZCwgZW1pdCBhIHdhcm5pbmcuICAqLwotICAgICAgdHJlZSB0eXBl ID0gVFJFRV9UWVBFIChvcDApOwotICAgICAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyMCA9 IHF1ZXJ5LT5nZXRfdmFsdWVfcmFuZ2UgKG9wMCwgc3RtdCk7Ci0KLSAgICAgIGlmICh2cjAtPnZh cnlpbmdfcCAoKQotCSAgJiYgSU5URUdSQUxfVFlQRV9QICh0eXBlKQotCSAgJiYgaXNfZ2ltcGxl X21pbl9pbnZhcmlhbnQgKG9wMSkpCi0JewotCSAgbG9jYXRpb25fdCBsb2NhdGlvbjsKLQotCSAg aWYgKCFnaW1wbGVfaGFzX2xvY2F0aW9uIChzdG10KSkKLQkgICAgbG9jYXRpb24gPSBpbnB1dF9s b2NhdGlvbjsKLQkgIGVsc2UKLQkgICAgbG9jYXRpb24gPSBnaW1wbGVfbG9jYXRpb24gKHN0bXQp OwotCi0JICB3YXJuaW5nX2F0IChsb2NhdGlvbiwgT1BUX1d0eXBlX2xpbWl0cywKLQkJICAgICAg aW50ZWdlcl96ZXJvcCAocmV0KQotCQkgICAgICA/IEdfKCJjb21wYXJpc29uIGFsd2F5cyBmYWxz ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVlIHRvIGxpbWl0ZWQgcmFuZ2Ugb2Yg ZGF0YSB0eXBlIikKLQkJICAgICAgOiBHXygiY29tcGFyaXNvbiBhbHdheXMgdHJ1ZSAiCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAiZHVlIHRvIGxpbWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBl IikpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotCiAvKiBWaXNpdCBjb25kaXRp b25hbCBzdGF0ZW1lbnQgU1RNVC4gIElmIHdlIGNhbiBkZXRlcm1pbmUgd2hpY2ggZWRnZQogICAg d2lsbCBiZSB0YWtlbiBvdXQgb2YgU1RNVCdzIGJhc2ljIGJsb2NrLCByZWNvcmQgaXQgaW4KICAg ICpUQUtFTl9FREdFX1AuICBPdGhlcndpc2UsIHNldCAqVEFLRU5fRURHRV9QIHRvIE5VTEwuICAq LwpAQCAtMjYxOSwzMzYgKzExMzYsNiBAQCBmaW5kX2Nhc2VfbGFiZWxfcmFuZ2VzIChnc3dpdGNo ICpzdG10LCBjb25zdCB2YWx1ZV9yYW5nZSAqdnIsCiAgIHJldHVybiBmYWxzZTsKIH0KIAotLyog VmlzaXQgc3dpdGNoIHN0YXRlbWVudCBTVE1ULiAgSWYgd2UgY2FuIGRldGVybWluZSB3aGljaCBl ZGdlCi0gICB3aWxsIGJlIHRha2VuIG91dCBvZiBTVE1UJ3MgYmFzaWMgYmxvY2ssIHJlY29yZCBp dCBpbgotICAgKlRBS0VOX0VER0VfUC4gIE90aGVyd2lzZSwgKlRBS0VOX0VER0VfUCBzZXQgdG8g TlVMTC4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6dnJwX3Zpc2l0X3N3aXRjaF9zdG10IChnc3dp dGNoICpzdG10LCBlZGdlICp0YWtlbl9lZGdlX3ApCi17Ci0gIHRyZWUgb3AsIHZhbDsKLSAgY29u c3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyOwotICBzaXplX3QgaSA9IDAsIGogPSAwLCBrLCBsOwot ICBib29sIHRha2VfZGVmYXVsdDsKLQotICAqdGFrZW5fZWRnZV9wID0gTlVMTDsKLSAgb3AgPSBn aW1wbGVfc3dpdGNoX2luZGV4IChzdG10KTsKLSAgaWYgKFRSRUVfQ09ERSAob3ApICE9IFNTQV9O QU1FKQotICAgIHJldHVybjsKLQotICB2ciA9IGdldF92YWx1ZV9yYW5nZSAob3ApOwotICBpZiAo ZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotICAgIHsKLSAgICAgIGZw cmludGYgKGR1bXBfZmlsZSwgIlxuVmlzaXRpbmcgc3dpdGNoIGV4cHJlc3Npb24gd2l0aCBvcGVy YW5kICIpOwotICAgICAgcHJpbnRfZ2VuZXJpY19leHByIChkdW1wX2ZpbGUsIG9wKTsKLSAgICAg IGZwcmludGYgKGR1bXBfZmlsZSwgIiB3aXRoIGtub3duIHJhbmdlICIpOwotICAgICAgZHVtcF92 YWx1ZV9yYW5nZSAoZHVtcF9maWxlLCB2cik7Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJc biIpOwotICAgIH0KLQotICBpZiAodnItPnVuZGVmaW5lZF9wICgpCi0gICAgICB8fCB2ci0+dmFy eWluZ19wICgpCi0gICAgICB8fCB2ci0+c3ltYm9saWNfcCAoKSkKLSAgICByZXR1cm47Ci0KLSAg LyogRmluZCB0aGUgc2luZ2xlIGVkZ2UgdGhhdCBpcyB0YWtlbiBmcm9tIHRoZSBzd2l0Y2ggZXhw cmVzc2lvbi4gICovCi0gIHRha2VfZGVmYXVsdCA9ICFmaW5kX2Nhc2VfbGFiZWxfcmFuZ2VzIChz dG10LCB2ciwgJmksICZqLCAmaywgJmwpOwotCi0gIC8qIENoZWNrIGlmIHRoZSByYW5nZSBzcGFu cyBubyBDQVNFX0xBQkVMLiBJZiBzbywgd2Ugb25seSByZWFjaCB0aGUgZGVmYXVsdAotICAgICBs YWJlbCAqLwotICBpZiAoaiA8IGkpCi0gICAgewotICAgICAgZ2NjX2Fzc2VydCAodGFrZV9kZWZh dWx0KTsKLSAgICAgIHZhbCA9IGdpbXBsZV9zd2l0Y2hfZGVmYXVsdF9sYWJlbCAoc3RtdCk7Ci0g ICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQ2hlY2sgaWYgbGFiZWxzIHdpdGggaW5kZXgg aSB0byBqIGFuZCBtYXliZSB0aGUgZGVmYXVsdCBsYWJlbAotCSBhcmUgYWxsIHJlYWNoaW5nIHRo ZSBzYW1lIGxhYmVsLiAgKi8KLQotICAgICAgdmFsID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3Rt dCwgaSk7Ci0gICAgICBpZiAodGFrZV9kZWZhdWx0Ci0JICAmJiBDQVNFX0xBQkVMIChnaW1wbGVf c3dpdGNoX2RlZmF1bHRfbGFiZWwgKHN0bXQpKQotCSAgIT0gQ0FTRV9MQUJFTCAodmFsKSkKLQl7 Ci0JICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotCSAgICBm cHJpbnRmIChkdW1wX2ZpbGUsICIgIG5vdCBhIHNpbmdsZSBkZXN0aW5hdGlvbiBmb3IgdGhpcyAi Ci0JCSAgICAgInJhbmdlXG4iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBmb3IgKCsraTsgaSA8 PSBqOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoQ0FTRV9MQUJFTCAoZ2ltcGxlX3N3 aXRjaF9sYWJlbCAoc3RtdCwgaSkpICE9IENBU0VfTEFCRUwgKHZhbCkpCi0JICAgIHsKLQkgICAg ICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotCQlmcHJpbnRm IChkdW1wX2ZpbGUsICIgIG5vdCBhIHNpbmdsZSBkZXN0aW5hdGlvbiBmb3IgdGhpcyAiCi0JCQkg InJhbmdlXG4iKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLSAgICAgICAgfQotICAgICAgZm9y ICg7IGsgPD0gbDsgKytrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKENBU0VfTEFCRUwgKGdp bXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGspKSAhPSBDQVNFX0xBQkVMICh2YWwpKQotCSAgICB7 Ci0JICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLQkJ ZnByaW50ZiAoZHVtcF9maWxlLCAiICBub3QgYSBzaW5nbGUgZGVzdGluYXRpb24gZm9yIHRoaXMg IgotCQkJICJyYW5nZVxuIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0gICAgICAgIH0KLSAg ICB9Ci0KLSAgKnRha2VuX2VkZ2VfcCA9IGZpbmRfZWRnZSAoZ2ltcGxlX2JiIChzdG10KSwKLQkJ CSAgICAgbGFiZWxfdG9fYmxvY2sgKGNmdW4sIENBU0VfTEFCRUwgKHZhbCkpKTsKLQotICBpZiAo ZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotICAgIHsKLSAgICAgIGZw cmludGYgKGR1bXBfZmlsZSwgIiAgd2lsbCB0YWtlIGVkZ2UgdG8gIik7Ci0gICAgICBwcmludF9n ZW5lcmljX3N0bXQgKGR1bXBfZmlsZSwgQ0FTRV9MQUJFTCAodmFsKSk7Ci0gICAgfQotfQotCi0K LS8qIEV2YWx1YXRlIHN0YXRlbWVudCBTVE1ULiAgSWYgdGhlIHN0YXRlbWVudCBwcm9kdWNlcyBh IHVzZWZ1bCByYW5nZSwKLSAgIHNldCBWUiBhbmQgY29yZXBzcG9uZGluZyBPVVRQVVRfUC4KLQot ICAgSWYgU1RNVCBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCBhbmQgd2UgY2FuIGRldGVybWluZSBp dHMgdHJ1dGgKLSAgIHZhbHVlLCB0aGUgdGFrZW4gZWRnZSBpcyByZWNvcmRlZCBpbiAqVEFLRU5f RURHRV9QLiAgKi8KLQotdm9pZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fc3RtdCAo Z2ltcGxlICpzdG10LCBlZGdlICp0YWtlbl9lZGdlX3AsCi0JCQkJICAgIHRyZWUgKm91dHB1dF9w LCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIpCi17Ci0KLSAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9m bGFncyAmIFRERl9ERVRBSUxTKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJc bmV4dHJhY3RfcmFuZ2VfZnJvbV9zdG10IHZpc2l0aW5nOlxuIik7Ci0gICAgICBwcmludF9naW1w bGVfc3RtdCAoZHVtcF9maWxlLCBzdG10LCAwLCBkdW1wX2ZsYWdzKTsKLSAgICB9Ci0KLSAgaWYg KCFzdG10X2ludGVyZXN0aW5nX2Zvcl92cnAgKHN0bXQpKQotICAgIGdjY19hc3NlcnQgKHN0bXRf ZW5kc19iYl9wIChzdG10KSk7Ci0gIGVsc2UgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKHN0bXQpIHx8 IGlzX2dpbXBsZV9jYWxsIChzdG10KSkKLSAgICB2cnBfdmlzaXRfYXNzaWdubWVudF9vcl9jYWxs IChzdG10LCBvdXRwdXRfcCwgdnIpOwotICBlbHNlIGlmIChnaW1wbGVfY29kZSAoc3RtdCkgPT0g R0lNUExFX0NPTkQpCi0gICAgc2ltcGxpZmllci52cnBfdmlzaXRfY29uZF9zdG10IChhc19hIDxn Y29uZCAqPiAoc3RtdCksIHRha2VuX2VkZ2VfcCk7Ci0gIGVsc2UgaWYgKGdpbXBsZV9jb2RlIChz dG10KSA9PSBHSU1QTEVfU1dJVENIKQotICAgIHZycF92aXNpdF9zd2l0Y2hfc3RtdCAoYXNfYSA8 Z3N3aXRjaCAqPiAoc3RtdCksIHRha2VuX2VkZ2VfcCk7Ci19Ci0KLS8qIFZpc2l0IGFsbCBhcmd1 bWVudHMgZm9yIFBISSBub2RlIFBISSB0aGF0IGZsb3cgdGhyb3VnaCBleGVjdXRhYmxlCi0gICBl ZGdlcy4gIElmIGEgdmFsaWQgdmFsdWUgcmFuZ2UgY2FuIGJlIGRlcml2ZWQgZnJvbSBhbGwgdGhl IGluY29taW5nCi0gICB2YWx1ZSByYW5nZXMsIHNldCBhIG5ldyByYW5nZSBpbiBWUl9SRVNVTFQu ICAqLwotCi12b2lkCi12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9waGlfbm9kZSAoZ3Bo aSAqcGhpLAotCQkJCQl2YWx1ZV9yYW5nZV9lcXVpdiAqdnJfcmVzdWx0KQotewotICB0cmVlIGxo cyA9IFBISV9SRVNVTFQgKHBoaSk7Ci0gIGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICpsaHNfdnIg PSBnZXRfdmFsdWVfcmFuZ2UgKGxocyk7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBpbnQgb2xk X2VkZ2VzOwotICBjbGFzcyBsb29wICpsOwotCi0gIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxh Z3MgJiBUREZfREVUQUlMUykpCi0gICAgewotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG5W aXNpdGluZyBQSEkgbm9kZTogIik7Ci0gICAgICBwcmludF9naW1wbGVfc3RtdCAoZHVtcF9maWxl LCBwaGksIDAsIGR1bXBfZmxhZ3MpOwotICAgIH0KLQotICBib29sIG1heV9zaW11bGF0ZV9iYWNr ZWRnZV9hZ2FpbiA9IGZhbHNlOwotICBpbnQgZWRnZXMgPSAwOwotICBmb3IgKHNpemVfdCBpID0g MDsgaSA8IGdpbXBsZV9waGlfbnVtX2FyZ3MgKHBoaSk7IGkrKykKLSAgICB7Ci0gICAgICBlZGdl IGUgPSBnaW1wbGVfcGhpX2FyZ19lZGdlIChwaGksIGkpOwotCi0gICAgICBpZiAoZHVtcF9maWxl ICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotCXsKLQkgIGZwcmludGYgKGR1bXBfZmls ZSwKLQkgICAgICAiICAgIEFyZ3VtZW50ICMlZCAoJWQgLT4gJWQgJXNleGVjdXRhYmxlKVxuIiwK LQkgICAgICAoaW50KSBpLCBlLT5zcmMtPmluZGV4LCBlLT5kZXN0LT5pbmRleCwKLQkgICAgICAo ZS0+ZmxhZ3MgJiBFREdFX0VYRUNVVEFCTEUpID8gIiIgOiAibm90ICIpOwotCX0KLQotICAgICAg aWYgKGUtPmZsYWdzICYgRURHRV9FWEVDVVRBQkxFKQotCXsKLQkgIHZhbHVlX3JhbmdlX2VxdWl2 IHZyX2FyZ190ZW07Ci0JICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnJfYXJnID0gJnZyX2Fy Z190ZW07Ci0KLQkgICsrZWRnZXM7Ci0KLQkgIHRyZWUgYXJnID0gUEhJX0FSR19ERUYgKHBoaSwg aSk7Ci0JICBpZiAoVFJFRV9DT0RFIChhcmcpID09IFNTQV9OQU1FKQotCSAgICB7Ci0JICAgICAg LyogU2VlIGlmIHdlIGFyZSBldmVudHVhbGx5IGdvaW5nIHRvIGNoYW5nZSBvbmUgb2YgdGhlIGFy Z3MuICAqLwotCSAgICAgIGdpbXBsZSAqZGVmX3N0bXQgPSBTU0FfTkFNRV9ERUZfU1RNVCAoYXJn KTsKLQkgICAgICBpZiAoISBnaW1wbGVfbm9wX3AgKGRlZl9zdG10KQotCQkgICYmIHByb3Bfc2lt dWxhdGVfYWdhaW5fcCAoZGVmX3N0bXQpCi0JCSAgJiYgZS0+ZmxhZ3MgJiBFREdFX0RGU19CQUNL KQotCQltYXlfc2ltdWxhdGVfYmFja2VkZ2VfYWdhaW4gPSB0cnVlOwotCi0JICAgICAgY29uc3Qg dmFsdWVfcmFuZ2VfZXF1aXYgKnZyX2FyZ18gPSBnZXRfdmFsdWVfcmFuZ2UgKGFyZyk7Ci0JICAg ICAgLyogRG8gbm90IGFsbG93IGVxdWl2YWxlbmNlcyBvciBzeW1ib2xpYyByYW5nZXMgdG8gbGVh ayBpbiBmcm9tCi0JCSBiYWNrZWRnZXMuICBUaGF0IGNyZWF0ZXMgaW52YWxpZCBlcXVpdmFsZW5j aWVzLgotCQkgU2VlIFBSNTM0NjUgYW5kIFBSNTQ3NjcuICAqLwotCSAgICAgIGlmIChlLT5mbGFn cyAmIEVER0VfREZTX0JBQ0spCi0JCXsKLQkJICBpZiAoIXZyX2FyZ18tPnZhcnlpbmdfcCAoKSAm JiAhdnJfYXJnXy0+dW5kZWZpbmVkX3AgKCkpCi0JCSAgICB7Ci0JCSAgICAgIHZyX2FyZ190ZW0u c2V0ICh2cl9hcmdfLT5taW4gKCksIHZyX2FyZ18tPm1heCAoKSwgTlVMTCwKLQkJCQkgICAgICB2 cl9hcmdfLT5raW5kICgpKTsKLQkJICAgICAgaWYgKHZyX2FyZ190ZW0uc3ltYm9saWNfcCAoKSkK LQkJCXZyX2FyZ190ZW0uc2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAoYXJnKSk7Ci0JCSAgICB9Ci0J CSAgZWxzZQotCQkgICAgdnJfYXJnID0gdnJfYXJnXzsKLQkJfQotCSAgICAgIC8qIElmIHRoZSBu b24tYmFja2VkZ2UgYXJndW1lbnRzIHJhbmdlIGlzIFZSX1ZBUllJTkcgdGhlbgotCQkgd2UgY2Fu IHN0aWxsIHRyeSByZWNvcmRpbmcgYSBzaW1wbGUgZXF1aXZhbGVuY2UuICAqLwotCSAgICAgIGVs c2UgaWYgKHZyX2FyZ18tPnZhcnlpbmdfcCAoKSkKLQkJdnJfYXJnX3RlbS5zZXQgKGFyZyk7Ci0J ICAgICAgZWxzZQotCQl2cl9hcmcgPSB2cl9hcmdfOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsK LQkgICAgICBpZiAoVFJFRV9PVkVSRkxPV19QIChhcmcpKQotCQlhcmcgPSBkcm9wX3RyZWVfb3Zl cmZsb3cgKGFyZyk7Ci0KLQkgICAgICB2cl9hcmdfdGVtLnNldCAoYXJnKTsKLQkgICAgfQotCi0J ICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotCSAgICB7Ci0J ICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiXHQiKTsKLQkgICAgICBwcmludF9nZW5lcmljX2V4 cHIgKGR1bXBfZmlsZSwgYXJnLCBkdW1wX2ZsYWdzKTsKLQkgICAgICBmcHJpbnRmIChkdW1wX2Zp bGUsICI6ICIpOwotCSAgICAgIGR1bXBfdmFsdWVfcmFuZ2UgKGR1bXBfZmlsZSwgdnJfYXJnKTsK LQkgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOwotCSAgICB9Ci0KLQkgIGlmIChmaXJz dCkKLQkgICAgdnJfcmVzdWx0LT5kZWVwX2NvcHkgKHZyX2FyZyk7Ci0JICBlbHNlCi0JICAgIHZy X3Jlc3VsdC0+bGVnYWN5X3ZlcmJvc2VfdW5pb25fICh2cl9hcmcpOwotCSAgZmlyc3QgPSBmYWxz ZTsKLQotCSAgaWYgKHZyX3Jlc3VsdC0+dmFyeWluZ19wICgpKQotCSAgICBicmVhazsKLQl9Ci0g ICAgfQotCi0gIGlmICh2cl9yZXN1bHQtPnZhcnlpbmdfcCAoKSkKLSAgICBnb3RvIHZhcnlpbmc7 Ci0gIGVsc2UgaWYgKHZyX3Jlc3VsdC0+dW5kZWZpbmVkX3AgKCkpCi0gICAgZ290byB1cGRhdGVf cmFuZ2U7Ci0KLSAgb2xkX2VkZ2VzID0gdnJfcGhpX2VkZ2VfY291bnRzW1NTQV9OQU1FX1ZFUlNJ T04gKGxocyldOwotICB2cl9waGlfZWRnZV9jb3VudHNbU1NBX05BTUVfVkVSU0lPTiAobGhzKV0g PSBlZGdlczsKLQotICAvKiBUbyBwcmV2ZW50IGluZmluaXRlIGl0ZXJhdGlvbnMgaW4gdGhlIGFs Z29yaXRobSwgZGVyaXZlIHJhbmdlcwotICAgICB3aGVuIHRoZSBuZXcgdmFsdWUgaXMgc2xpZ2h0 bHkgYmlnZ2VyIG9yIHNtYWxsZXIgdGhhbiB0aGUKLSAgICAgcHJldmlvdXMgb25lLiAgV2UgZG9u J3QgZG8gdGhpcyBpZiB3ZSBoYXZlIHNlZW4gYSBuZXcgZXhlY3V0YWJsZQotICAgICBlZGdlOyB0 aGlzIGhlbHBzIHVzIGF2b2lkIGFuIGluZmluaXR5IGZvciBjb25kaXRpb25hbHMKLSAgICAgd2hp Y2ggYXJlIG5vdCBpbiBhIGxvb3AuICBJZiB0aGUgb2xkIHZhbHVlLXJhbmdlIHdhcyBWUl9VTkRF RklORUQKLSAgICAgdXNlIHRoZSB1cGRhdGVkIHJhbmdlIGFuZCBpdGVyYXRlIG9uZSBtb3JlIHRp bWUuICBJZiB3ZSB3aWxsIG5vdAotICAgICBzaW11bGF0ZSB0aGlzIFBISSBhZ2FpbiB2aWEgdGhl IGJhY2tlZGdlIGFsbG93IHVzIHRvIGl0ZXJhdGUuICAqLwotICBpZiAoZWRnZXMgPiAwCi0gICAg ICAmJiBnaW1wbGVfcGhpX251bV9hcmdzIChwaGkpID4gMQotICAgICAgJiYgZWRnZXMgPT0gb2xk X2VkZ2VzCi0gICAgICAmJiAhbGhzX3ZyLT51bmRlZmluZWRfcCAoKQotICAgICAgJiYgbWF5X3Np bXVsYXRlX2JhY2tlZGdlX2FnYWluKQotICAgIHsKLSAgICAgIC8qIENvbXBhcmUgb2xkIGFuZCBu ZXcgcmFuZ2VzLCBmYWxsIGJhY2sgdG8gdmFyeWluZyBpZiB0aGUKLSAgICAgICAgIHZhbHVlcyBh cmUgbm90IGNvbXBhcmFibGUuICAqLwotICAgICAgaW50IGNtcF9taW4gPSBjb21wYXJlX3ZhbHVl cyAobGhzX3ZyLT5taW4gKCksIHZyX3Jlc3VsdC0+bWluICgpKTsKLSAgICAgIGlmIChjbXBfbWlu ID09IC0yKQotCWdvdG8gdmFyeWluZzsKLSAgICAgIGludCBjbXBfbWF4ID0gY29tcGFyZV92YWx1 ZXMgKGxoc192ci0+bWF4ICgpLCB2cl9yZXN1bHQtPm1heCAoKSk7Ci0gICAgICBpZiAoY21wX21h eCA9PSAtMikKLQlnb3RvIHZhcnlpbmc7Ci0KLSAgICAgIC8qIEZvciBub24gVlJfUkFOR0Ugb3Ig Zm9yIHBvaW50ZXJzIGZhbGwgYmFjayB0byB2YXJ5aW5nIGlmCi0JIHRoZSByYW5nZSBjaGFuZ2Vk LiAgKi8KLSAgICAgIGlmICgobGhzX3ZyLT5raW5kICgpICE9IFZSX1JBTkdFIHx8IHZyX3Jlc3Vs dC0+a2luZCAoKSAhPSBWUl9SQU5HRQotCSAgIHx8IFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUg KGxocykpKQotCSAgJiYgKGNtcF9taW4gIT0gMCB8fCBjbXBfbWF4ICE9IDApKQotCWdvdG8gdmFy eWluZzsKLQotICAgICAgLyogSWYgdGhlIG5ldyBtaW5pbXVtIGlzIGxhcmdlciB0aGFuIHRoZSBw cmV2aW91cyBvbmUKLQkgcmV0YWluIHRoZSBvbGQgdmFsdWUuICBJZiB0aGUgbmV3IG1pbmltdW0g dmFsdWUgaXMgc21hbGxlcgotCSB0aGFuIHRoZSBwcmV2aW91cyBvbmUgYW5kIG5vdCAtSU5GIGdv IGFsbCB0aGUgd2F5IHRvIC1JTkYgKyAxLgotCSBJbiB0aGUgZmlyc3QgY2FzZSwgdG8gYXZvaWQg aW5maW5pdGUgYm91bmNpbmcgYmV0d2VlbiBkaWZmZXJlbnQKLQkgbWluaW11bXMsIGFuZCBpbiB0 aGUgb3RoZXIgY2FzZSB0byBhdm9pZCBpdGVyYXRpbmcgbWlsbGlvbnMgb2YKLQkgdGltZXMgdG8g cmVhY2ggLUlORi4gIEdvaW5nIHRvIC1JTkYgKyAxIGFsc28gbGV0cyB0aGUgZm9sbG93aW5nCi0J IGl0ZXJhdGlvbiBjb21wdXRlIHdoZXRoZXIgdGhlcmUgd2lsbCBiZSBhbnkgb3ZlcmZsb3csIGF0 IHRoZQotCSBleHBlbnNlIG9mIG9uZSBhZGRpdGlvbmFsIGl0ZXJhdGlvbi4gICovCi0gICAgICB0 cmVlIG5ld19taW4gPSB2cl9yZXN1bHQtPm1pbiAoKTsKLSAgICAgIHRyZWUgbmV3X21heCA9IHZy X3Jlc3VsdC0+bWF4ICgpOwotICAgICAgaWYgKGNtcF9taW4gPCAwKQotCW5ld19taW4gPSBsaHNf dnItPm1pbiAoKTsKLSAgICAgIGVsc2UgaWYgKGNtcF9taW4gPiAwCi0JICAgICAgICYmIChUUkVF X0NPREUgKHZyX3Jlc3VsdC0+bWluICgpKSAhPSBJTlRFR0VSX0NTVAotCQkgICB8fCB0cmVlX2lu dF9jc3RfbHQgKHZycF92YWxfbWluICh2cl9yZXN1bHQtPnR5cGUgKCkpLAotCQkJCSAgICAgICB2 cl9yZXN1bHQtPm1pbiAoKSkpKQotCW5ld19taW4gPSBpbnRfY29uc3RfYmlub3AgKFBMVVNfRVhQ UiwKLQkJCQkgICB2cnBfdmFsX21pbiAodnJfcmVzdWx0LT50eXBlICgpKSwKLQkJCQkgICBidWls ZF9pbnRfY3N0ICh2cl9yZXN1bHQtPnR5cGUgKCksIDEpKTsKLQotICAgICAgLyogU2ltaWxhcmx5 IGZvciB0aGUgbWF4aW11bSB2YWx1ZS4gICovCi0gICAgICBpZiAoY21wX21heCA+IDApCi0JbmV3 X21heCA9IGxoc192ci0+bWF4ICgpOwotICAgICAgZWxzZSBpZiAoY21wX21heCA8IDAKLQkgICAg ICAgJiYgKFRSRUVfQ09ERSAodnJfcmVzdWx0LT5tYXggKCkpICE9IElOVEVHRVJfQ1NUCi0JCSAg IHx8IHRyZWVfaW50X2NzdF9sdCAodnJfcmVzdWx0LT5tYXggKCksCi0JCQkJICAgICAgIHZycF92 YWxfbWF4ICh2cl9yZXN1bHQtPnR5cGUgKCkpKSkpCi0JbmV3X21heCA9IGludF9jb25zdF9iaW5v cCAoTUlOVVNfRVhQUiwKLQkJCQkgICB2cnBfdmFsX21heCAodnJfcmVzdWx0LT50eXBlICgpKSwK LQkJCQkgICBidWlsZF9pbnRfY3N0ICh2cl9yZXN1bHQtPnR5cGUgKCksIDEpKTsKLQotICAgICAg dnJfcmVzdWx0LT51cGRhdGUgKG5ld19taW4sIG5ld19tYXgsIHZyX3Jlc3VsdC0+a2luZCAoKSk7 Ci0KLSAgICAgIC8qIElmIHdlIGRyb3BwZWQgZWl0aGVyIGJvdW5kIHRvICstSU5GIHRoZW4gaWYg dGhpcyBpcyBhIGxvb3AKLQkgUEhJIG5vZGUgU0NFViBtYXkga25vd24gbW9yZSBhYm91dCBpdHMg dmFsdWUtcmFuZ2UuICAqLwotICAgICAgaWYgKGNtcF9taW4gPiAwIHx8IGNtcF9taW4gPCAwCi0J ICAgfHwgY21wX21heCA8IDAgfHwgY21wX21heCA+IDApCi0JZ290byBzY2V2X2NoZWNrOwotCi0g ICAgICBnb3RvIGluZmluaXRlX2NoZWNrOwotICAgIH0KLQotICBnb3RvIHVwZGF0ZV9yYW5nZTsK LQotdmFyeWluZzoKLSAgdnJfcmVzdWx0LT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChsaHMpKTsK LQotc2Nldl9jaGVjazoKLSAgLyogSWYgdGhpcyBpcyBhIGxvb3AgUEhJIG5vZGUgU0NFViBtYXkg a25vd24gbW9yZSBhYm91dCBpdHMgdmFsdWUtcmFuZ2UuCi0gICAgIHNjZXZfY2hlY2sgY2FuIGJl IHJlYWNoZWQgZnJvbSB0d28gcGF0aHMsIG9uZSBpcyBhIGZhbGwgdGhyb3VnaCBmcm9tIGFib3Zl Ci0gICAgICJ2YXJ5aW5nIiBsYWJlbCwgdGhlIG90aGVyIGlzIGRpcmVjdCBnb3RvIGZyb20gY29k ZSBibG9jayB3aGljaCB0cmllcyB0bwotICAgICBhdm9pZCBpbmZpbml0ZSBzaW11bGF0aW9uLiAg Ki8KLSAgaWYgKHNjZXZfaW5pdGlhbGl6ZWRfcCAoKQotICAgICAgJiYgKGwgPSBsb29wX2NvbnRh aW5pbmdfc3RtdCAocGhpKSkKLSAgICAgICYmIGwtPmhlYWRlciA9PSBnaW1wbGVfYmIgKHBoaSkp Ci0gICAgYWRqdXN0X3JhbmdlX3dpdGhfc2NldiAodnJfcmVzdWx0LCBsLCBwaGksIGxocyk7Ci0K LWluZmluaXRlX2NoZWNrOgotICAvKiBJZiB3ZSB3aWxsIGVuZCB1cCB3aXRoIGEgKC1JTkYsICtJ TkYpIHJhbmdlLCBzZXQgaXQgdG8KLSAgICAgVkFSWUlORy4gIFNhbWUgaWYgdGhlIHByZXZpb3Vz IG1heCB2YWx1ZSB3YXMgaW52YWxpZCBmb3IKLSAgICAgdGhlIHR5cGUgYW5kIHdlIGVuZCB1cCB3 aXRoIHZyX3Jlc3VsdC5taW4gPiB2cl9yZXN1bHQubWF4LiAgKi8KLSAgaWYgKCghdnJfcmVzdWx0 LT52YXJ5aW5nX3AgKCkgJiYgIXZyX3Jlc3VsdC0+dW5kZWZpbmVkX3AgKCkpCi0gICAgICAmJiAh KCh2cnBfdmFsX2lzX21heCAodnJfcmVzdWx0LT5tYXggKCkpICYmIHZycF92YWxfaXNfbWluICh2 cl9yZXN1bHQtPm1pbiAoKSkpCi0JICAgfHwgY29tcGFyZV92YWx1ZXMgKHZyX3Jlc3VsdC0+bWlu ICgpLCB2cl9yZXN1bHQtPm1heCAoKSkgPiAwKSkKLSAgICA7Ci0gIGVsc2UKLSAgICB2cl9yZXN1 bHQtPnNldF92YXJ5aW5nIChUUkVFX1RZUEUgKGxocykpOwotCi0gIC8qIElmIHRoZSBuZXcgcmFu Z2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHByZXZpb3VzIHZhbHVlLCBrZWVwCi0gICAgIGl0ZXJh dGluZy4gICovCi11cGRhdGVfcmFuZ2U6Ci0gIHJldHVybjsKLX0KLQogLyogU2ltcGxpZnkgYm9v bGVhbiBvcGVyYXRpb25zIGlmIHRoZSBzb3VyY2UgaXMga25vd24KICAgIHRvIGJlIGFscmVhZHkg YSBib29sZWFuLiAgKi8KIGJvb2wKQEAgLTM1NTcsOCArMTc0NCw3IEBAIHNpbXBsaWZ5X3VzaW5n X3Jhbmdlczo6Zm9sZF9jb25kIChnY29uZCAqY29uZCkKICAgICAgIHJldHVybiB0cnVlOwogICAg IH0KIAotICAvKiA/PyB2cnBfZm9sZGVyOjpmb2xkX3ByZWRpY2F0ZV9pbigpIGlzIGEgc3VwZXJz ZXQgb2YgdGhpcy4gIEF0Ci0gICAgIHNvbWUgcG9pbnQgd2Ugc2hvdWxkIG1lcmdlIGFsbCB2YXJp YW50cyBvZiB0aGlzIGNvZGUuICAqLworICAvLyBGSVhNRTogQXVkaXQgdGhlIGNvZGUgYmVsb3cg YW5kIG1ha2Ugc3VyZSBpdCBuZXZlciBmaW5kcyBhbnl0aGluZy4KICAgZWRnZSB0YWtlbl9lZGdl OwogICB2cnBfdmlzaXRfY29uZF9zdG10IChjb25kLCAmdGFrZW5fZWRnZSk7CiAKQEAgLTM3NTks OSArMTk0NSw3IEBAIHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6c2ltcGxpZnlfc3dpdGNoX3VzaW5n X3JhbmdlcyAoZ3N3aXRjaCAqc3RtdCkKICAgICAgIHZyID0gcXVlcnktPmdldF92YWx1ZV9yYW5n ZSAob3AsIHN0bXQpOwogCiAgICAgICAvKiBXZSBjYW4gb25seSBoYW5kbGUgaW50ZWdlciByYW5n ZXMuICAqLwotICAgICAgaWYgKHZyLT52YXJ5aW5nX3AgKCkKLQkgIHx8IHZyLT51bmRlZmluZWRf cCAoKQotCSAgfHwgdnItPnN5bWJvbGljX3AgKCkpCisgICAgICBpZiAodnItPnZhcnlpbmdfcCAo KSB8fCB2ci0+dW5kZWZpbmVkX3AgKCkpCiAJcmV0dXJuIGZhbHNlOwogCiAgICAgICAvKiBGaW5k IGNhc2UgbGFiZWwgZm9yIG1pbi9tYXggb2YgdGhlIHZhbHVlIHJhbmdlLiAgKi8KQEAgLTQ0Mjgs MjQgKzI2MTIsMyBAQCBzaW1wbGlmeV91c2luZ19yYW5nZXM6OnNpbXBsaWZ5IChnaW1wbGVfc3Rt dF9pdGVyYXRvciAqZ3NpKQogCiAgIHJldHVybiBmYWxzZTsKIH0KLQotLyogU2V0IHRoZSBsYXR0 aWNlIGVudHJ5IGZvciBWQVIgdG8gVlIuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OnNldF92cl92 YWx1ZSAodHJlZSB2YXIsIHZhbHVlX3JhbmdlX2VxdWl2ICp2cikKLXsKLSAgaWYgKFNTQV9OQU1F X1ZFUlNJT04gKHZhcikgPj0gbnVtX3ZyX3ZhbHVlcykKLSAgICByZXR1cm47Ci0gIHZyX3ZhbHVl W1NTQV9OQU1FX1ZFUlNJT04gKHZhcildID0gdnI7Ci19Ci0KLS8qIFN3YXAgdGhlIGxhdHRpY2Ug ZW50cnkgZm9yIFZBUiB3aXRoIFZSIGFuZCByZXR1cm4gdGhlIG9sZCBlbnRyeS4gICovCi0KLXZh bHVlX3JhbmdlX2VxdWl2ICoKLXZyX3ZhbHVlczo6c3dhcF92cl92YWx1ZSAodHJlZSB2YXIsIHZh bHVlX3JhbmdlX2VxdWl2ICp2cikKLXsKLSAgaWYgKFNTQV9OQU1FX1ZFUlNJT04gKHZhcikgPj0g bnVtX3ZyX3ZhbHVlcykKLSAgICByZXR1cm4gTlVMTDsKLSAgc3RkOjpzd2FwICh2cl92YWx1ZVtT U0FfTkFNRV9WRVJTSU9OICh2YXIpXSwgdnIpOwotICByZXR1cm4gdnI7Ci19CmRpZmYgLS1naXQg YS9nY2MvdnItdmFsdWVzLmggYi9nY2MvdnItdmFsdWVzLmgKaW5kZXggOGM4ZjAzMTcxNDcuLjhl ZThjYzEyZjhiIDEwMDY0NAotLS0gYS9nY2MvdnItdmFsdWVzLmgKKysrIGIvZ2NjL3ZyLXZhbHVl cy5oCkBAIC0zMywyMSArMzMsMTQgQEAgcHVibGljOgogICBzaW1wbGlmeV91c2luZ19yYW5nZXMg KHJhbmdlX3F1ZXJ5ICpxdWVyeSA9IE5VTEwsCiAJCQkgaW50IG5vdF9leGVjdXRhYmxlX2ZsYWcg PSAwKTsKICAgfnNpbXBsaWZ5X3VzaW5nX3JhbmdlcyAoKTsKLSAgdm9pZCBzZXRfcmFuZ2VfcXVl cnkgKGNsYXNzIHJhbmdlX3F1ZXJ5ICpxLCBpbnQgbm90X2V4ZWN1dGFibGVfZmxhZyA9IDApCi0g ICAgICB7IHF1ZXJ5ID0gcTsgbV9ub3RfZXhlY3V0YWJsZV9mbGFnID0gbm90X2V4ZWN1dGFibGVf ZmxhZzsgfQotCiAgIGJvb2wgc2ltcGxpZnkgKGdpbXBsZV9zdG10X2l0ZXJhdG9yICopOwotCi0g IC8vID8/IFRoZXNlIHNob3VsZCBiZSBjbGVhbmVkLCBtZXJnZWQsIGFuZCBtYWRlIHByaXZhdGUu Ci0gIHRyZWUgdnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsICh0cmVlX2NvZGUsIHRyZWUsIHRyZWUs IGdpbXBsZSAqKTsKLSAgdm9pZCB2cnBfdmlzaXRfY29uZF9zdG10IChnY29uZCAqLCBlZGdlICop OwogICBib29sIGZvbGRfY29uZCAoZ2NvbmQgKik7Citwcml2YXRlOgorICB2b2lkIHZycF92aXNp dF9jb25kX3N0bXQgKGdjb25kICosIGVkZ2UgKik7CiAgIHRyZWUgdnJwX2V2YWx1YXRlX2NvbmRp dGlvbmFsX3dhcm52X3dpdGhfb3BzIChnaW1wbGUgKnN0bXQsIGVudW0gdHJlZV9jb2RlLAogCQkJ CQkJdHJlZSwgdHJlZSwgYm9vbCwKIAkJCQkJCWJvb2wgKiwgYm9vbCAqKTsKICAgYm9vbCBzaW1w bGlmeV9jYXN0ZWRfY29uZCAoZ2NvbmQgKik7Ci0KLXByaXZhdGU6CiAgIGJvb2wgc2ltcGxpZnlf dHJ1dGhfb3BzX3VzaW5nX3JhbmdlcyAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKiwgZ2ltcGxlICop OwogICBib29sIHNpbXBsaWZ5X2Rpdl9vcl9tb2RfdXNpbmdfcmFuZ2VzIChnaW1wbGVfc3RtdF9p dGVyYXRvciAqLCBnaW1wbGUgKik7CiAgIGJvb2wgc2ltcGxpZnlfYWJzX3VzaW5nX3JhbmdlcyAo Z2ltcGxlX3N0bXRfaXRlcmF0b3IgKiwgZ2ltcGxlICopOwpAQCAtODksOTUgKzgyLDYgQEAgcHJp dmF0ZToKICAgdmVjPGVkZ2U+IG1fZmxhZ19zZXRfZWRnZXM7ICAvLyBMaXN0IG9mIGVkZ2VzIHdp dGggZmxhZyB0byBiZSBjbGVhcmVkLgogfTsKIAotLyogVGhlIFZSX1ZBTFVFUyBjbGFzcyBob2xk cyB0aGUgY3VycmVudCB2aWV3IG9mIHJhbmdlIGluZm9ybWF0aW9uCi0gICBmb3IgYWxsIHRoZSBT U0FfTkFNRXMgaW4gdGhlIElMLgotCi0gICBJdCBjYW4gYmUgdXNlZCB0byBob2xkIGNvbnRleHQg c2Vuc2l0aXZlIHJhbmdlIGluZm9ybWF0aW9uIGR1cmluZwotICAgYSBkb21pbmF0b3Igd2FsayBv ciBpdCBtYXkgYmUgdXNlZCB0byBob2xkIHJhbmdlIGluZm9ybWF0aW9uIGluIHRoZQotICAgc3Rh bmRhcmQgVlJQIHBhc3MgYXMgcmFuZ2VzIGFyZSBwcm9wYWdhdGVkIHRocm91Z2ggdGhlIGxhdHRp Y2UgdG8gYQotICAgc3RlYWR5IHN0YXRlLgotCi0gICBUaGlzIGluZm9ybWF0aW9uIGlzIGluZGVw ZW5kZW50IG9mIHRoZSByYW5nZSBpbmZvcm1hdGlvbiB0aGF0IGdldHMKLSAgIGF0dGFjaGVkIHRv IFNTQV9OQU1Fcy4gIEEgcGFzcyBzdWNoIGFzIFZSUCBtYXkgY2hvb3NlIHRvIHRyYW5zZmVyCi0g ICB0aGUgZ2xvYmFsIGluZm9ybWF0aW9uIGl0IHByb2R1Y2VzIGludG8gZ2xvYmFsIHJhbmdlIGlu Zm9ybWF0aW9uIHRoYXQKLSAgIGdldHMgYXR0YWNoZWQgdG8gYW4gU1NBX05BTUUuICBJdCdzIHVu Y2xlYXIgaG93IHVzZWZ1bCB0aGF0IGdsb2JhbAotICAgaW5mb3JtYXRpb24gd2lsbCBiZSBpbiBh IHdvcmxkIHdoZXJlIHdlIGNhbiBjb21wdXRlIGNvbnRleHQgc2Vuc2l0aXZlCi0gICByYW5nZSBp bmZvcm1hdGlvbiBmYXN0IG9yIHBlcmZvcm0gb24tZGVtYW5kIHF1ZXJpZXMuICAqLwotY2xhc3Mg dnJfdmFsdWVzIDogcHVibGljIHJhbmdlX3F1ZXJ5Ci17Ci0gcHVibGljOgotICB2cl92YWx1ZXMg KHZvaWQpOwotICB+dnJfdmFsdWVzICh2b2lkKTsKLQotICB2aXJ0dWFsIGJvb2wgcmFuZ2Vfb2Zf ZXhwciAodnJhbmdlICZyLCB0cmVlIGV4cHIsIGdpbXBsZSAqc3RtdCkgb3ZlcnJpZGU7Ci0gIHZp cnR1YWwgdHJlZSB2YWx1ZV9vZl9leHByICh0cmVlLCBnaW1wbGUgKiA9IE5VTEwpIG92ZXJyaWRl OwotICB2aXJ0dWFsIHRyZWUgdmFsdWVfb25fZWRnZSAoZWRnZSwgdHJlZSkgb3ZlcnJpZGU7Ci0g IHZpcnR1YWwgdHJlZSB2YWx1ZV9vZl9zdG10IChnaW1wbGUgKiwgdHJlZSA9IE5VTExfVFJFRSkg b3ZlcnJpZGU7Ci0gIHZpcnR1YWwgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKmdldF92YWx1ZV9y YW5nZSAoY29uc3RfdHJlZSwKLQkJCQkJCSAgICBnaW1wbGUgKiA9IE5VTEwpIG92ZXJyaWRlOwot ICB2b2lkIHNldF92cl92YWx1ZSAodHJlZSwgdmFsdWVfcmFuZ2VfZXF1aXYgKik7Ci0gIHZhbHVl X3JhbmdlX2VxdWl2ICpzd2FwX3ZyX3ZhbHVlICh0cmVlLCB2YWx1ZV9yYW5nZV9lcXVpdiAqKTsK LQotICB2b2lkIHNldF9kZWZfdG9fdmFyeWluZyAoY29uc3RfdHJlZSk7Ci0gIHZvaWQgc2V0X2Rl ZnNfdG9fdmFyeWluZyAoZ2ltcGxlICopOwotICBib29sIHVwZGF0ZV92YWx1ZV9yYW5nZSAoY29u c3RfdHJlZSwgdmFsdWVfcmFuZ2VfZXF1aXYgKik7Ci0gIHRyZWUgb3Bfd2l0aF9jb25zdGFudF9z aW5nbGV0b25fdmFsdWVfcmFuZ2UgKHRyZWUpOwotICB2b2lkIGFkanVzdF9yYW5nZV93aXRoX3Nj ZXYgKHZhbHVlX3JhbmdlX2VxdWl2ICosIGNsYXNzIGxvb3AgKiwKLQkJCSAgICAgICBnaW1wbGUg KiwgdHJlZSk7Ci0gIHZpcnR1YWwgdm9pZCBkdW1wIChGSUxFICopIG92ZXJyaWRlOwotCi0gIHZv aWQgZXh0cmFjdF9yYW5nZV9mb3JfdmFyX2Zyb21fY29tcGFyaXNvbl9leHByICh0cmVlLCBlbnVt IHRyZWVfY29kZSwKLQkJCQkJCSAgIHRyZWUsIHRyZWUsCi0JCQkJCQkgICB2YWx1ZV9yYW5nZV9l cXVpdiAqKTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fcGhpX25vZGUgKGdwaGkgKiwgdmFs dWVfcmFuZ2VfZXF1aXYgKik7Ci0gIHZvaWQgZXh0cmFjdF9yYW5nZV9iYXNpYyAodmFsdWVfcmFu Z2VfZXF1aXYgKiwgZ2ltcGxlICopOwotICB2b2lkIGV4dHJhY3RfcmFuZ2VfZnJvbV9zdG10IChn aW1wbGUgKiwgZWRnZSAqLCB0cmVlICosIHZhbHVlX3JhbmdlX2VxdWl2ICopOwotCi0gIC8qIElu ZGljYXRlIHRoYXQgcHJvcGFnYXRpb24gdGhyb3VnaCB0aGUgbGF0dGljZSBpcyBjb21wbGV0ZS4g ICovCi0gIHZvaWQgc2V0X2xhdHRpY2VfcHJvcGFnYXRpb25fY29tcGxldGUgKHZvaWQpIHsgdmFs dWVzX3Byb3BhZ2F0ZWQgPSB0cnVlOyB9Ci0KLSAgLyogQWxsb2NhdGUgYSBuZXcgdmFsdWVfcmFu Z2Ugb2JqZWN0LiAgKi8KLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKmFsbG9jYXRlX3ZhbHVlX3Jhbmdl X2VxdWl2ICh2b2lkKQotICAgIHsgcmV0dXJuIHJhbmdlX3F1ZXJ5OjphbGxvY2F0ZV92YWx1ZV9y YW5nZV9lcXVpdiAoKTsgfQotICB2b2lkIGZyZWVfdmFsdWVfcmFuZ2UgKHZhbHVlX3JhbmdlX2Vx dWl2ICp2cikKLSAgICB7IGZyZWVfdmFsdWVfcmFuZ2VfZXF1aXYgKHZyKTsgfQotCi0gcHJpdmF0 ZToKLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKmdldF9sYXR0aWNlX2VudHJ5IChjb25zdF90cmVlKTsK LSAgYm9vbCB2cnBfc3RtdF9jb21wdXRlc19ub256ZXJvIChnaW1wbGUgKik7Ci0gIHZvaWQgZXh0 cmFjdF9yYW5nZV9mcm9tX2Fzc2lnbm1lbnQgKHZhbHVlX3JhbmdlX2VxdWl2ICosIGdhc3NpZ24g Kik7Ci0gIHZvaWQgZXh0cmFjdF9yYW5nZV9mcm9tX2Fzc2VydCAodmFsdWVfcmFuZ2VfZXF1aXYg KiwgdHJlZSk7Ci0gIHZvaWQgZXh0cmFjdF9yYW5nZV9mcm9tX3NzYV9uYW1lICh2YWx1ZV9yYW5n ZV9lcXVpdiAqLCB0cmVlKTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fYmluYXJ5X2V4cHIg KHZhbHVlX3JhbmdlX2VxdWl2ICosIGVudW0gdHJlZV9jb2RlLAotCQkJCSAgICAgICB0cmVlLCB0 cmVlLCB0cmVlKTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fdW5hcnlfZXhwciAodmFsdWVf cmFuZ2VfZXF1aXYgKiwgZW51bSB0cmVlX2NvZGUsCi0JCQkJICAgICAgdHJlZSwgdHJlZSk7Ci0g IHZvaWQgZXh0cmFjdF9yYW5nZV9mcm9tX2NvbmRfZXhwciAodmFsdWVfcmFuZ2VfZXF1aXYgKiwg Z2Fzc2lnbiAqKTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fY29tcGFyaXNvbiAodmFsdWVf cmFuZ2VfZXF1aXYgKiwgZ2ltcGxlICopOwotICB2b2lkIHZycF92aXNpdF9hc3NpZ25tZW50X29y X2NhbGwgKGdpbXBsZSosIHRyZWUgKiwgdmFsdWVfcmFuZ2VfZXF1aXYgKik7Ci0gIHZvaWQgdnJw X3Zpc2l0X3N3aXRjaF9zdG10IChnc3dpdGNoICosIGVkZ2UgKik7Ci0gIGJvb2wgZXh0cmFjdF9y YW5nZV9mcm9tX3Vic2FuX2J1aWx0aW4gKHZhbHVlX3JhbmdlX2VxdWl2ICosIGdpbXBsZSAqKTsK LQotICAvKiBUaGlzIHByb2JhYmx5IGJlbG9uZ3MgaW4gdGhlIGxhdHRpY2UgcmF0aGVyIHRoYW4g aW4gaGVyZS4gICovCi0gIGJvb2wgdmFsdWVzX3Byb3BhZ2F0ZWQ7Ci0KLSAgLyogQWxsb2NhdGlv bnMgZm9yIGVxdWl2YWxlbmNlcyBhbGwgY29tZSBmcm9tIHRoaXMgb2JzdGFjay4gICovCi0gIGJp dG1hcF9vYnN0YWNrIHZycF9lcXVpdl9vYnN0YWNrOwotCi0gIC8qIFZhbHVlIHJhbmdlIGFycmF5 LiAgQWZ0ZXIgcHJvcGFnYXRpb24sIFZSX1ZBTFVFW0ldIGhvbGRzIHRoZSByYW5nZQotICAgICBv ZiB2YWx1ZXMgdGhhdCBTU0EgbmFtZSBOX0kgbWF5IHRha2UuICAqLwotICB1bnNpZ25lZCBpbnQg bnVtX3ZyX3ZhbHVlczsKLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKip2cl92YWx1ZTsKLQotICAvKiBG b3IgYSBQSEkgbm9kZSB3aGljaCBzZXRzIFNTQSBuYW1lIE5fSSwgVlJfQ09VTlRTW0ldIGhvbGRz IHRoZQotICAgICBudW1iZXIgb2YgZXhlY3V0YWJsZSBlZGdlcyB3ZSBzYXcgdGhlIGxhc3QgdGlt ZSB3ZSB2aXNpdGVkIHRoZQotICAgICBub2RlLiAgKi8KLSAgaW50ICp2cl9waGlfZWRnZV9jb3Vu dHM7Ci0gIHNpbXBsaWZ5X3VzaW5nX3JhbmdlcyBzaW1wbGlmaWVyOwotfTsKLQotZXh0ZXJuIHRy ZWUgZ2V0X291dHB1dF9mb3JfdnJwIChnaW1wbGUgKik7Ci0KIGV4dGVybiBib29sIHJhbmdlX2Zp dHNfdHlwZV9wIChjb25zdCB2YWx1ZV9yYW5nZSAqdnIsCiAJCQkgICAgICAgdW5zaWduZWQgZGVz dF9wcmVjaXNpb24sIHNpZ25vcCBkZXN0X3Nnbik7CiBleHRlcm4gYm9vbCBib3VuZHNfb2ZfdmFy X2luX2xvb3AgKHRyZWUgKm1pbiwgdHJlZSAqbWF4LCByYW5nZV9xdWVyeSAqLAotLSAKMi4zOC4x Cgo= --000000000000bcec5405edfda4aa--