From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 8A5DB40068 for ; Sun, 19 Dec 2021 05:47:50 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 19BDF68AEEC; Sun, 19 Dec 2021 07:47:48 +0200 (EET) Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 446FB68AB82 for ; Sun, 19 Dec 2021 07:47:41 +0200 (EET) Received: by mail-pj1-f48.google.com with SMTP id k6-20020a17090a7f0600b001ad9d73b20bso6840539pjl.3 for ; Sat, 18 Dec 2021 21:47:41 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=WEz8UnFPV/CWNrkyXyLydfgjO7Pw3U5x1muet7JRLGg=; b=Ezi0ALlljTipVgRbRHH2NHx174+2Vdbd4eO3K0BvgWs/6HrbpYpKx7wGWiDwrcH+sT 35Z/YwJx9PQD1znxONgzwETVqgs52Mk0TbmexBTZDpLyA2+Z/MM03V5YE3vvF5OgBNtd LCvOURpAPoqUVaBPA87Z39qzD1avHQ03AmJVXf5vqWKO/5EGwTziocV6IMGj3zYWSvCG KHIBgf414vzgIKCevllJ+5FqnlA5I2a1kluWRXPWuB5OHLreYnVGEq630DolouWaWdJa Km2GokPnTc6ZvXoRRGmFBgPTAMggvAC8qydaWRMxpnuUhaVUWd1fwJa5VpnTY+ys6q3n 1f4w== X-Gm-Message-State: AOAM533wOmyw2W2rjMUVm/lC32+5DPgAdvlEBExMlVQc1j2SigS759Um wnpdoOH49EDcO+QiNpOiEXRwiWadgq8= X-Google-Smtp-Source: ABdhPJxVdB2KdgKboZTwKv+L4CX4dGhsIk+K+UMIDnLzR2ckiwFhKm7z7BhAEPvvse8F9wmHw8dbdw== X-Received: by 2002:a17:902:e78c:b0:148:af37:3d65 with SMTP id cp12-20020a170902e78c00b00148af373d65mr10830202plb.148.1639892858498; Sat, 18 Dec 2021 21:47:38 -0800 (PST) Received: from localhost (76-14-89-2.sf-cable.astound.net. [76.14.89.2]) by smtp.gmail.com with ESMTPSA id nn5sm16900853pjb.11.2021.12.18.21.47.36 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Sat, 18 Dec 2021 21:47:37 -0800 (PST) Received: by localhost (sSMTP sendmail emulation); Sat, 18 Dec 2021 21:47:31 -0800 From: pal@sandflow.com To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Dec 2021 21:47:29 -0800 Message-Id: <20211219054730.23330-1-pal@sandflow.com> X-Mailer: git-send-email 2.34.1.windows.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v12 1/2] avformat/imf: Demuxer X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Pierre-Anthony Lemieux Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: RnJvbTogUGllcnJlLUFudGhvbnkgTGVtaWV1eCA8cGFsQHBhbGVtaWV1eC5jb20+CgpTaWduZWQt b2ZmLWJ5OiBQaWVycmUtQW50aG9ueSBMZW1pZXV4IDxwYWxAcGFsZW1pZXV4LmNvbT4KLS0tCgpO b3RlczoKICAgIFRoZSBJTUYgZGVtdXhlciBhY2NlcHRzIGFzIGlucHV0IGFuIElNRiBDUEwuIFRo ZSBhc3NldHMgcmVmZXJlbmNlZCBieSB0aGUgQ1BMIGNhbiBiZQogICAgY29udGFpbmVkIGluIG11 bHRpcGxlIGRlbGl2ZXJpZXMsIGVhY2ggZGVmaW5lZCBieSBhbiBBU1NFVE1BUCBmaWxlOgogICAg CiAgICBmZm1wZWcgLWFzc2V0bWFwcyA8cGF0aCBvZiBBU1NFVE1BUDE+LDxwYXRoIG9mIEFTU0VU TUFQPiwuLi4gLWkgPHBhdGggb2YgQ1BMPgogICAgCiAgICBJZiAtYXNzZXRtYXBzIGlzIG5vdCBz cGVjaWZpZWQsIEZGTVBFRyBsb29rcyBmb3IgYSBmaWxlIGNhbGxlZCBBU1NFVE1BUC54bWwgaW4g dGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBDUEwuCiAgICAKICAgIEVYQU1QTEU6CiAgICAgICAg ZmZtcGVnIC1pIGh0dHA6Ly9mZm1wZWctaW1mLXNhbXBsZXMtcHVibGljLnMzLXdlYnNpdGUtdXMt d2VzdC0xLmFtYXpvbmF3cy5jb20vY291bnRkb3duL0NQTF9mNTA5NWNhYS1mMjA0LTRlMWMtOGE4 NC03YWY0OGM3YWUxNmIueG1sIG91dC5tcDQKICAgIAogICAgVGhlIEludGVyb3BlcmFibGUgTWFz dGVyIEZvcm1hdCAoSU1GKSBpcyBhIGZpbGUtYmFzZWQgbWVkaWEgZm9ybWF0IGZvciB0aGUKICAg IGRlbGl2ZXJ5IGFuZCBzdG9yYWdlIG9mIHByb2Zlc3Npb25hbCBhdWRpby12aXN1YWwgbWFzdGVy cy4KICAgIEFuIElNRiBDb21wb3NpdGlvbiBjb25zaXN0cyBvZiBhbiBYTUwgcGxheWxpc3QgKHRo ZSBDb21wb3NpdGlvbiBQbGF5bGlzdCkKICAgIGFuZCBhIGNvbGxlY3Rpb24gb2YgTVhGIGZpbGVz ICh0aGUgVHJhY2sgRmlsZXMpLiBUaGUgQ29tcG9zaXRpb24gUGxheWxpc3QgKENQTCkKICAgIGFz c2VtYmxlcyB0aGUgVHJhY2sgRmlsZXMgb250byBhIHRpbWVsaW5lLCB3aGljaCBjb25zaXN0cyBv ZiBtdWx0aXBsZSB0cmFja3MuCiAgICBUaGUgbG9jYXRpb24gb2YgdGhlIFRyYWNrIEZpbGVzIHJl ZmVyZW5jZWQgYnkgdGhlIENvbXBvc2l0aW9uIFBsYXlsaXN0IGlzIHN0b3JlZAogICAgaW4gb25l IG9yIG1vcmUgWE1MIGRvY3VtZW50cyBjYWxsZWQgQXNzZXQgTWFwcy4gTW9yZSBkZXRhaWxzIGF0 IGh0dHBzOi8vd3d3LmltZnVnLmNvbS9leHBsYWluZXIuCiAgICBUaGUgSU1GIHN0YW5kYXJkIHdh cyBmaXJzdCBpbnRyb2R1Y2VkIGluIDIwMTMgYW5kIGlzIG1hbmFnZWQgYnkgdGhlIFNNUFRFLgog ICAgCiAgICBDSEFOR0UgTk9URVM6CiAgICAKICAgIC0gcmVmYWN0b3Igc2F2ZV9hdmlvX29wdGlv bnMoKQogICAgLSBjaGFuZ2UgYXZfcmVhbGxvYygpIHRvIGF2X3JlYWxsb2NfYXJyYXkoKSB0byBw cmV2ZW50IHNpemUgb3ZlcmZsb3dzCiAgICAtIHVzZSBhdl9vcHRfc2V0KC4uLmZvcm1hdF93aGl0 ZWxpc3QuLi4pIHRvIGZvcmNlIE1YRiB0cmFjayBmaWxlcwogICAgLSBhZGQgc3VwcG9ydCBmb3Ig aW9fb3BlbjIoKQogICAgLSBtaXNjIGNvZGUgcGF0aCBpbXByb3ZlbWVudHMKCiBNQUlOVEFJTkVS UyAgICAgICAgICAgICAgfCAgIDEgKwogY29uZmlndXJlICAgICAgICAgICAgICAgIHwgICAzICst CiBkb2MvZGVtdXhlcnMudGV4aSAgICAgICAgfCAgIDYgKwogbGliYXZmb3JtYXQvTWFrZWZpbGUg ICAgIHwgICAxICsKIGxpYmF2Zm9ybWF0L2FsbGZvcm1hdHMuYyB8ICAgMSArCiBsaWJhdmZvcm1h dC9pbWYuaCAgICAgICAgfCAyMDcgKysrKysrKysrCiBsaWJhdmZvcm1hdC9pbWZfY3BsLmMgICAg fCA4MDAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGxpYmF2Zm9ybWF0L2lt ZmRlYy5jICAgICB8IDg5MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysK IDggZmlsZXMgY2hhbmdlZCwgMTkwOSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVh dGUgbW9kZSAxMDA2NDQgbGliYXZmb3JtYXQvaW1mLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWJh dmZvcm1hdC9pbWZfY3BsLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWJhdmZvcm1hdC9pbWZkZWMu YwoKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggZGNhYzQ2MDAz ZS4uN2E2OTcyZmUxYSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMK QEAgLTQzMyw2ICs0MzMsNyBAQCBNdXhlcnMvRGVtdXhlcnM6CiAgIGlkcm9xZGVjLmMgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTWlrZSBNZWxhbnNvbgogICBpZmYuYyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIEphaWtyaXNobmFuIE1lbm9uCiAgIGltZzIqLmMgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgorICBpbWYqLmMgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmMtQW50b2luZSBBcm5hdWQsIFBpZXJyZS1BbnRo b255IExlbWlldXgsIFZhbGVudGluIE5vw6tsCiAgIGlwbW92aWUuYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgTWlrZSBNZWxhbnNvbgogICBpcmNhbSogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFBhdWwgQiBNYWhvbAogICBpc3MuYyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFN0ZWZhbiBHZWhyZXIKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQpp bmRleCBkOGIwN2M4ZTAwLi5mNGNiYThlN2Y3IDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIv Y29uZmlndXJlCkBAIC0yOTgsNyArMjk4LDcgQEAgRXh0ZXJuYWwgbGlicmFyeSBzdXBwb3J0Ogog ICAtLWVuYWJsZS1saWJ4dmlkICAgICAgICAgZW5hYmxlIFh2aWQgZW5jb2RpbmcgdmlhIHh2aWRj b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlIE1QRUctNC9YdmlkIGVuY29k ZXIgZXhpc3RzIFtub10KICAgLS1lbmFibGUtbGlieG1sMiAgICAgICAgIGVuYWJsZSBYTUwgcGFy c2luZyB1c2luZyB0aGUgQyBsaWJyYXJ5IGxpYnhtbDIsIG5lZWRlZAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgZm9yIGRhc2ggZGVtdXhpbmcgc3VwcG9ydCBbbm9dCisgICAgICAgICAgICAg ICAgICAgICAgICAgICBmb3IgZGFzaCBhbmQgaW1mIGRlbXV4aW5nIHN1cHBvcnQgW25vXQogICAt LWVuYWJsZS1saWJ6aW1nICAgICAgICAgZW5hYmxlIHoubGliLCBuZWVkZWQgZm9yIHpzY2FsZSBm aWx0ZXIgW25vXQogICAtLWVuYWJsZS1saWJ6bXEgICAgICAgICAgZW5hYmxlIG1lc3NhZ2UgcGFz c2luZyB2aWEgbGliem1xIFtub10KICAgLS1lbmFibGUtbGlienZiaSAgICAgICAgIGVuYWJsZSB0 ZWxldGV4dCBzdXBwb3J0IHZpYSBsaWJ6dmJpIFtub10KQEAgLTM0MTIsNiArMzQxMiw3IEBAIGhs c19tdXhlcl9zZWxlY3Q9Im1wZWd0c19tdXhlciIKIGhsc19tdXhlcl9zdWdnZXN0PSJnY3J5cHQg b3BlbnNzbCIKIGltYWdlMl9hbGlhc19waXhfZGVtdXhlcl9zZWxlY3Q9ImltYWdlMl9kZW11eGVy IgogaW1hZ2UyX2JyZW5kZXJfcGl4X2RlbXV4ZXJfc2VsZWN0PSJpbWFnZTJfZGVtdXhlciIKK2lt Zl9kZW11eGVyX2RlcHM9ImxpYnhtbDIiCiBpcG9kX211eGVyX3NlbGVjdD0ibW92X211eGVyIgog aXNtdl9tdXhlcl9zZWxlY3Q9Im1vdl9tdXhlciIKIGl2Zl9tdXhlcl9zZWxlY3Q9ImF2MV9tZXRh ZGF0YV9ic2YgdnA5X3N1cGVyZnJhbWVfYnNmIgpkaWZmIC0tZ2l0IGEvZG9jL2RlbXV4ZXJzLnRl eGkgYi9kb2MvZGVtdXhlcnMudGV4aQppbmRleCBjYWI4YTcwNzJjLi42NTU3MDRkMmM0IDEwMDY0 NAotLS0gYS9kb2MvZGVtdXhlcnMudGV4aQorKysgYi9kb2MvZGVtdXhlcnMudGV4aQpAQCAtMjY3 LDYgKzI2NywxMiBAQCB3aGljaCBzdHJlYW1zIHRvIGFjdHVhbGx5IHJlY2VpdmUuCiBFYWNoIHN0 cmVhbSBtaXJyb3JzIHRoZSBAY29kZXtpZH0gYW5kIEBjb2Rle2JhbmR3aWR0aH0gcHJvcGVydGll cyBmcm9tIHRoZQogQGNvZGV7PFJlcHJlc2VudGF0aW9uPn0gYXMgbWV0YWRhdGEga2V5cyBuYW1l ZCAiaWQiIGFuZCAidmFyaWFudF9iaXRyYXRlIiByZXNwZWN0aXZlbHkuCiAKK0BzZWN0aW9uIGlt ZgorCitJbnRlcm9wZXJhYmxlIE1hc3RlciBGb3JtYXQgZGVtdXhlci4KKworVGhpcyBkZW11eGVy IHByZXNlbnRzIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zIGZvdW5kIGluIGFuIElNRiBDb21wb3Np dGlvbi4KKwogQHNlY3Rpb24gZmx2LCBsaXZlX2Zsdiwga3V4CiAKIEFkb2JlIEZsYXNoIFZpZGVv IEZvcm1hdCBkZW11eGVyLgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvTWFrZWZpbGUgYi9saWJh dmZvcm1hdC9NYWtlZmlsZQppbmRleCAyYjVjYWY5ZDMzLi43ZjA1OGYzZWEwIDEwMDY0NAotLS0g YS9saWJhdmZvcm1hdC9NYWtlZmlsZQorKysgYi9saWJhdmZvcm1hdC9NYWtlZmlsZQpAQCAtMjg1 LDYgKzI4NSw3IEBAIE9CSlMtJChDT05GSUdfSU1BR0VfV0VCUF9QSVBFX0RFTVVYRVIpICAgICs9 IGltZzJkZWMubyBpbWcyLm8KIE9CSlMtJChDT05GSUdfSU1BR0VfWEJNX1BJUEVfREVNVVhFUikg ICAgICs9IGltZzJkZWMubyBpbWcyLm8KIE9CSlMtJChDT05GSUdfSU1BR0VfWFBNX1BJUEVfREVN VVhFUikgICAgICs9IGltZzJkZWMubyBpbWcyLm8KIE9CSlMtJChDT05GSUdfSU1BR0VfWFdEX1BJ UEVfREVNVVhFUikgICAgICs9IGltZzJkZWMubyBpbWcyLm8KK09CSlMtJChDT05GSUdfSU1GX0RF TVVYRVIpICAgICAgICAgICAgICAgKz0gaW1mZGVjLm8gaW1mX2NwbC5vCiBPQkpTLSQoQ09ORklH X0lOR0VOSUVOVF9ERU1VWEVSKSAgICAgICAgICs9IGluZ2VuaWVudGRlYy5vIHJhd2RlYy5vCiBP QkpTLSQoQ09ORklHX0lQTU9WSUVfREVNVVhFUikgICAgICAgICAgICs9IGlwbW92aWUubwogT0JK Uy0kKENPTkZJR19JUFVfREVNVVhFUikgICAgICAgICAgICAgICArPSBpcHVkZWMubyByYXdkZWMu bwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYWxsZm9ybWF0cy5jIGIvbGliYXZmb3JtYXQvYWxs Zm9ybWF0cy5jCmluZGV4IDEwNTRhYzk2NjcuLmY2ODA2MTZjZGQgMTAwNjQ0Ci0tLSBhL2xpYmF2 Zm9ybWF0L2FsbGZvcm1hdHMuYworKysgYi9saWJhdmZvcm1hdC9hbGxmb3JtYXRzLmMKQEAgLTIx Miw2ICsyMTIsNyBAQCBleHRlcm4gY29uc3QgQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2UycGlwZV9k ZW11eGVyOwogZXh0ZXJuIGNvbnN0IEFWT3V0cHV0Rm9ybWF0IGZmX2ltYWdlMnBpcGVfbXV4ZXI7 CiBleHRlcm4gY29uc3QgQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2UyX2FsaWFzX3BpeF9kZW11eGVy OwogZXh0ZXJuIGNvbnN0IEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlMl9icmVuZGVyX3BpeF9kZW11 eGVyOworZXh0ZXJuIGNvbnN0IEFWSW5wdXRGb3JtYXQgIGZmX2ltZl9kZW11eGVyOwogZXh0ZXJu IGNvbnN0IEFWSW5wdXRGb3JtYXQgIGZmX2luZ2VuaWVudF9kZW11eGVyOwogZXh0ZXJuIGNvbnN0 IEFWSW5wdXRGb3JtYXQgIGZmX2lwbW92aWVfZGVtdXhlcjsKIGV4dGVybiBjb25zdCBBVk91dHB1 dEZvcm1hdCBmZl9pcG9kX211eGVyOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaW1mLmggYi9s aWJhdmZvcm1hdC9pbWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi42 MmM0NDY4Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvaW1mLmgKQEAgLTAsMCAr MSwyMDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZt cGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor ICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy YWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRv IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl ZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAq CisgKiBDb3B5cmlnaHQgKGMpIFNhbmRmbG93IENvbnN1bHRpbmcgTExDCisgKgorICogUmVkaXN0 cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s bG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBz b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwor ICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92 ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgIGFuZC9vciBv dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U UklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhP TERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwg REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisg KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP RklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNU IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW RU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov CisKKy8qKgorICogUHVibGljIGhlYWRlciBmaWxlIGZvciB0aGUgcHJvY2Vzc2luZyBvZiBJbnRl cm9wZXJhYmxlIE1hc3RlciBGb3JtYXQgKElNRikKKyAqIHBhY2thZ2VzLgorICoKKyAqIEBhdXRo b3IgUGllcnJlLUFudGhvbnkgTGVtaWV1eAorICogQGF1dGhvciBWYWxlbnRpbiBOb2VsCisgKiBA ZmlsZQorICogQGluZ3JvdXAgbGF2dV9pbWYKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0lNRl9I CisjZGVmaW5lIEFWRk9STUFUX0lNRl9ICisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1 ZGUgImxpYmF2Zm9ybWF0L2F2aW8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmF0aW9uYWwuaCIK KyNpbmNsdWRlIDxsaWJ4bWwvdHJlZS5oPgorCisjZGVmaW5lIEZGX0lNRl9VVUlEX0ZPUk1BVCAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVybjp1dWlkOiUwMmhoeCUwMmhoeCUw MmhoeCUwMmhoeC0lMDJoaHglMDJoaHgtIiBcCisgICAgIiUwMmhoeCUwMmhoeC0lMDJoaHglMDJo aHgtJTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4IgorCisvKioKKyAqIFVVSUQg YXMgZGVmaW5lZCBpbiBJRVRGIFJGQyA0MjIKKyAqLwordHlwZWRlZiB1aW50OF90IEZGSU1GVVVJ RFsxNl07CisKKy8qKgorICogSU1GIENvbXBvc2l0aW9uIFBsYXlsaXN0IEJhc2UgUmVzb3VyY2UK KyAqLwordHlwZWRlZiBzdHJ1Y3QgRkZJTUZCYXNlUmVzb3VyY2UgeworICAgIEFWUmF0aW9uYWwg ZWRpdF9yYXRlOyAgLyoqPCBCYXNlUmVzb3VyY2VUeXBlL0VkaXRSYXRlICovCisgICAgdWludDMy X3QgZW50cnlfcG9pbnQ7ICAvKio8IEJhc2VSZXNvdXJjZVR5cGUvRW50cnlQb2ludCAqLworICAg IHVpbnQzMl90IGR1cmF0aW9uOyAgICAgLyoqPCBCYXNlUmVzb3VyY2VUeXBlL0R1cmF0aW9uICov CisgICAgdWludDMyX3QgcmVwZWF0X2NvdW50OyAvKio8IEJhc2VSZXNvdXJjZVR5cGUvUmVwZWF0 Q291bnQgKi8KK30gRkZJTUZCYXNlUmVzb3VyY2U7CisKKy8qKgorICogSU1GIENvbXBvc2l0aW9u IFBsYXlsaXN0IFRyYWNrIEZpbGUgUmVzb3VyY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgRkZJTUZU cmFja0ZpbGVSZXNvdXJjZSB7CisgICAgRkZJTUZCYXNlUmVzb3VyY2UgYmFzZTsKKyAgICBGRklN RlVVSUQgdHJhY2tfZmlsZV91dWlkOyAvKio8IFRyYWNrRmlsZVJlc291cmNlVHlwZS9UcmFja0Zp bGVJZCAqLworfSBGRklNRlRyYWNrRmlsZVJlc291cmNlOworCisvKioKKyAqIElNRiBNYXJrZXIK KyAqLwordHlwZWRlZiBzdHJ1Y3QgRkZJTUZNYXJrZXIgeworICAgIHhtbENoYXIgKmxhYmVsX3V0 Zjg7IC8qKjwgTWFya2VyL0xhYmVsICovCisgICAgeG1sQ2hhciAqc2NvcGVfdXRmODsgLyoqPCBN YXJrZXIvTGFiZWwvXEBzY29wZSAqLworICAgIHVpbnQzMl90IG9mZnNldDsgICAgIC8qKjwgTWFy a2VyL09mZnNldCAqLworfSBGRklNRk1hcmtlcjsKKworLyoqCisgKiBJTUYgQ29tcG9zaXRpb24g UGxheWxpc3QgTWFya2VyIFJlc291cmNlCisgKi8KK3R5cGVkZWYgc3RydWN0IEZGSU1GTWFya2Vy UmVzb3VyY2UgeworICAgIEZGSU1GQmFzZVJlc291cmNlIGJhc2U7CisgICAgdWludDMyX3QgbWFy a2VyX2NvdW50OyAvKio8IE51bWJlciBvZiBNYXJrZXIgZWxlbWVudHMgKi8KKyAgICBGRklNRk1h cmtlciAqbWFya2VyczsgIC8qKjwgTWFya2VyIGVsZW1lbnRzICovCit9IEZGSU1GTWFya2VyUmVz b3VyY2U7CisKKy8qKgorICogSU1GIENvbXBvc2l0aW9uIFBsYXlsaXN0IFZpcnR1YWwgVHJhY2sK KyAqLwordHlwZWRlZiBzdHJ1Y3QgRkZJTUZCYXNlVmlydHVhbFRyYWNrIHsKKyAgICBGRklNRlVV SUQgaWRfdXVpZDsgLyoqPCBUcmFja0lkIGFzc29jaWF0ZWQgd2l0aCB0aGUgVmlydHVhbCBUcmFj ayAqLworfSBGRklNRkJhc2VWaXJ0dWFsVHJhY2s7CisKKy8qKgorICogSU1GIENvbXBvc2l0aW9u IFBsYXlsaXN0IFZpcnR1YWwgVHJhY2sgdGhhdCBjb25zaXN0cyBvZiBUcmFjayBGaWxlIFJlc291 cmNlcworICovCit0eXBlZGVmIHN0cnVjdCBGRklNRlRyYWNrRmlsZVZpcnR1YWxUcmFjayB7Cisg ICAgRkZJTUZCYXNlVmlydHVhbFRyYWNrIGJhc2U7CisgICAgdWludDMyX3QgcmVzb3VyY2VfY291 bnQ7ICAgICAgICAgICAvKio8IE51bWJlciBvZiBSZXNvdXJjZSBlbGVtZW50cyBwcmVzZW50IGlu IHRoZSBWaXJ0dWFsIFRyYWNrICovCisgICAgRkZJTUZUcmFja0ZpbGVSZXNvdXJjZSAqcmVzb3Vy Y2VzOyAvKio8IFJlc291cmNlIGVsZW1lbnRzIG9mIHRoZSBWaXJ0dWFsIFRyYWNrICovCisgICAg dW5zaWduZWQgaW50IHJlc291cmNlc19hbGxvY19zejsgICAvKio8IFNpemUgb2YgdGhlIHJlc291 cmNlcyBidWZmZXIgKi8KK30gRkZJTUZUcmFja0ZpbGVWaXJ0dWFsVHJhY2s7CisKKy8qKgorICog SU1GIENvbXBvc2l0aW9uIFBsYXlsaXN0IFZpcnR1YWwgVHJhY2sgdGhhdCBjb25zaXN0cyBvZiBN YXJrZXIgUmVzb3VyY2VzCisgKi8KK3R5cGVkZWYgc3RydWN0IEZGSU1GTWFya2VyVmlydHVhbFRy YWNrIHsKKyAgICBGRklNRkJhc2VWaXJ0dWFsVHJhY2sgYmFzZTsKKyAgICB1aW50MzJfdCByZXNv dXJjZV9jb3VudDsgICAgICAgIC8qKjwgTnVtYmVyIG9mIFJlc291cmNlIGVsZW1lbnRzIHByZXNl bnQgaW4gdGhlIFZpcnR1YWwgVHJhY2sgKi8KKyAgICBGRklNRk1hcmtlclJlc291cmNlICpyZXNv dXJjZXM7IC8qKjwgUmVzb3VyY2UgZWxlbWVudHMgb2YgdGhlIFZpcnR1YWwgVHJhY2sgKi8KK30g RkZJTUZNYXJrZXJWaXJ0dWFsVHJhY2s7CisKKy8qKgorICogSU1GIENvbXBvc2l0aW9uIFBsYXls aXN0CisgKi8KK3R5cGVkZWYgc3RydWN0IEZGSU1GQ1BMIHsKKyAgICBGRklNRlVVSUQgaWRfdXVp ZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb21wb3NpdGlvblBsYXlsaXN0 L0lkIGVsZW1lbnQgKi8KKyAgICB4bWxDaGFyICpjb250ZW50X3RpdGxlX3V0Zjg7ICAgICAgICAg ICAgICAgICAgICAgLyoqPCBDb21wb3NpdGlvblBsYXlsaXN0L0NvbnRlbnRUaXRsZSBlbGVtZW50 ICovCisgICAgQVZSYXRpb25hbCBlZGl0X3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAg IC8qKjwgQ29tcG9zaXRpb25QbGF5bGlzdC9FZGl0UmF0ZSBlbGVtZW50ICovCisgICAgRkZJTUZN YXJrZXJWaXJ0dWFsVHJhY2sgKm1haW5fbWFya2Vyc190cmFjazsgICAgIC8qKjwgTWFpbiBNYXJr ZXIgVmlydHVhbCBUcmFjayAqLworICAgIEZGSU1GVHJhY2tGaWxlVmlydHVhbFRyYWNrICptYWlu X2ltYWdlXzJkX3RyYWNrOyAvKio8IE1haW4gSW1hZ2UgVmlydHVhbCBUcmFjayAqLworICAgIHVp bnQzMl90IG1haW5fYXVkaW9fdHJhY2tfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJl ciBvZiBNYWluIEF1ZGlvIFZpcnR1YWwgVHJhY2tzICovCisgICAgRkZJTUZUcmFja0ZpbGVWaXJ0 dWFsVHJhY2sgKm1haW5fYXVkaW9fdHJhY2tzOyAgIC8qKjwgTWFpbiBBdWRpbyBWaXJ0dWFsIFRy YWNrcyAqLworfSBGRklNRkNQTDsKKworLyoqCisgKiBQYXJzZSBhbiBJTUYgQ29tcG9zaXRpb25Q bGF5bGlzdCBlbGVtZW50IGludG8gdGhlIEZGSU1GQ1BMIGRhdGEgc3RydWN0dXJlLgorICogQHBh cmFtW2luXSBkb2MgQW4gWE1MIGRvY3VtZW50IGZyb20gd2hpY2ggdGhlIENQTCBpcyByZWFkLgor ICogQHBhcmFtW291dF0gY3BsIFBvaW50ZXIgdG8gYSBtZW1vcnkgYXJlYSAoYWxsb2NhdGVkIGJ5 IHRoZSBjbGllbnQpLCB3aGVyZSB0aGUKKyAqICBmdW5jdGlvbiB3cml0ZXMgYSBwb2ludGVyIHRv IHRoZSBuZXdseSBjb25zdHJ1Y3RlZCBGRklNRkNQTCBzdHJ1Y3R1cmUgKG9yCisgKiAgTlVMTCBp ZiB0aGUgQ1BMIGNvdWxkIG5vdCBiZSBwYXJzZWQpLiBUaGUgY2xpZW50IGlzIHJlc3BvbnNpYmxl IGZvciBmcmVlaW5nCisgKiAgdGhlIEZGSU1GQ1BMIHN0cnVjdHVyZSB1c2luZyBmZl9pbWZfY3Bs X2ZyZWUoKS4KKyAqIEByZXR1cm4gQSBub24temVybyB2YWx1ZSBpbiBjYXNlIG9mIGFuIGVycm9y LgorICovCitpbnQgZmZfaW1mX3BhcnNlX2NwbF9mcm9tX3htbF9kb20oeG1sRG9jUHRyIGRvYywg RkZJTUZDUEwgKipjcGwpOworCisvKioKKyAqIFBhcnNlIGFuIElNRiBDb21wb3NpdGlvbiBQbGF5 bGlzdCBkb2N1bWVudCBpbnRvIHRoZSBGRklNRkNQTCBkYXRhIHN0cnVjdHVyZS4KKyAqIEBwYXJh bVtpbl0gaW4gVGhlIGNvbnRleHQgZnJvbSB3aGljaCB0aGUgQ1BMIGlzIHJlYWQuCisgKiBAcGFy YW1bb3V0XSBjcGwgUG9pbnRlciB0byBhIG1lbW9yeSBhcmVhIChhbGxvY2F0ZWQgYnkgdGhlIGNs aWVudCksIHdoZXJlIHRoZQorICogZnVuY3Rpb24gd3JpdGVzIGEgcG9pbnRlciB0byB0aGUgbmV3 bHkgY29uc3RydWN0ZWQgRkZJTUZDUEwgc3RydWN0dXJlIChvcgorICogTlVMTCBpZiB0aGUgQ1BM IGNvdWxkIG5vdCBiZSBwYXJzZWQpLiBUaGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBmcmVl aW5nCisgKiB0aGUgRkZJTUZDUEwgc3RydWN0dXJlIHVzaW5nIGZmX2ltZl9jcGxfZnJlZSgpLgor ICogQHJldHVybiBBIG5vbi16ZXJvIHZhbHVlIGluIGNhc2Ugb2YgYW4gZXJyb3IuCisgKi8KK2lu dCBmZl9pbWZfcGFyc2VfY3BsKEFWSU9Db250ZXh0ICppbiwgRkZJTUZDUEwgKipjcGwpOworCisv KioKKyAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYW4gRkZJTUZDUEwgZGF0YSBzdHJ1Y3R1 cmUuCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgbmV3bHkgY29uc3RydWN0ZWQgRkZJTUZD UEwgc3RydWN0dXJlIChvciBOVUxMIGlmIHRoZQorICogc3RydWN0dXJlIGNvdWxkIG5vdCBiZSBj b25zdHJ1Y3RlZCkuIFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcKKyAqIHRo ZSBGRklNRkNQTCBzdHJ1Y3R1cmUgdXNpbmcgZmZfaW1mX2NwbF9mcmVlKCkuCisgKi8KK0ZGSU1G Q1BMICpmZl9pbWZfY3BsX2FsbG9jKHZvaWQpOworCisvKioKKyAqIERlbGV0ZXMgYW4gRkZJTUZD UEwgZGF0YSBzdHJ1Y3R1cmUgcHJldmlvdXNseSBpbnN0YW50aWF0ZWQgd2l0aCBmZl9pbWZfY3Bs X2FsbG9jKCkuCisgKiBAcGFyYW1baW5dIGNwbCBUaGUgRkZJTUZDUEwgc3RydWN0dXJlIHRvIGRl bGV0ZS4KKyAqLwordm9pZCBmZl9pbWZfY3BsX2ZyZWUoRkZJTUZDUEwgKmNwbCk7CisKKy8qKgor ICogUmVhZHMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgZnJvbSBhbiBYTUwgZWxlbWVudAor ICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDwgMCBBVkVSUk9SIGNvZGUgb24gZXJyb3IuCisgKi8K K2ludCBmZl9pbWZfeG1sX3JlYWRfdWludDMyKHhtbE5vZGVQdHIgZWxlbWVudCwgdWludDMyX3Qg Km51bWJlcik7CisKKy8qKgorICogUmVhZHMgYW4gQVZSYXRpb25hbCBmcm9tIGFuIFhNTCBlbGVt ZW50CisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPCAwIEFWRVJST1IgY29kZSBvbiBlcnJvci4K KyAqLworaW50IGZmX2ltZl94bWxfcmVhZF9yYXRpb25hbCh4bWxOb2RlUHRyIGVsZW1lbnQsIEFW UmF0aW9uYWwgKnJhdGlvbmFsKTsKKworLyoqCisgKiBSZWFkcyBhIFVVSUQgZnJvbSBhbiBYTUwg ZWxlbWVudAorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDwgMCBBVkVSUk9SIGNvZGUgb24gZXJy b3IuCisgKi8KK2ludCBmZl9pbWZfeG1sX3JlYWRfdXVpZCh4bWxOb2RlUHRyIGVsZW1lbnQsIHVp bnQ4X3QgdXVpZFsxNl0pOworCisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGVsZW1l bnQgd2l0aCB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUKKyAqIEByZXR1cm4gQSBwb2ludGVyIHRv IHRoZSBjaGlsZCBlbGVtZW50LCBvciBOVUxMIGlmIG5vIHN1Y2ggY2hpbGQgZWxlbWVudCBleGlz dHMuCisgKi8KK3htbE5vZGVQdHIgZmZfaW1mX3htbF9nZXRfY2hpbGRfZWxlbWVudF9ieV9uYW1l KHhtbE5vZGVQdHIgcGFyZW50LCBjb25zdCBjaGFyICpuYW1lX3V0ZjgpOworCisjZW5kaWYKZGlm ZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ltZl9jcGwuYyBiL2xpYmF2Zm9ybWF0L2ltZl9jcGwuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi45YmExOWU3ZDdmCi0tLSAvZGV2 L251bGwKKysrIGIvbGliYXZmb3JtYXQvaW1mX2NwbC5jCkBAIC0wLDAgKzEsODAwIEBACisvKgor ICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog dmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog TGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0 d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v ciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKgorICogQ29weXJpZ2h0 IChjKSBTYW5kZmxvdyBDb25zdWx0aW5nIExMQworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1 c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp b25zIGFyZSBtZXQ6CisgKgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgbGlzdCBvZiBj b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0 aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5v dGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz Y2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJ UyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElT Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJ QlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg T0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKioKKyAqIElt cGxlbWVudHMgSU1QIENQTCBwcm9jZXNzaW5nCisgKgorICogQGF1dGhvciBQaWVycmUtQW50aG9u eSBMZW1pZXV4CisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2dV9pbWYKKyAqLworCisjaW5jbHVk ZSAiaW1mLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvbXhmLmgiCisjaW5jbHVkZSAibGliYXZ1 dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgorI2luY2x1ZGUgPGxp YnhtbC9wYXJzZXIuaD4KKworeG1sTm9kZVB0ciBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50 X2J5X25hbWUoeG1sTm9kZVB0ciBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWVfdXRmOCkKK3sKKyAg ICB4bWxOb2RlUHRyIGN1cl9lbGVtZW50OworCisgICAgY3VyX2VsZW1lbnQgPSB4bWxGaXJzdEVs ZW1lbnRDaGlsZChwYXJlbnQpOworICAgIHdoaWxlIChjdXJfZWxlbWVudCkgeworICAgICAgICBp ZiAoeG1sU3RyY21wKGN1cl9lbGVtZW50LT5uYW1lLCBuYW1lX3V0ZjgpID09IDApCisgICAgICAg ICAgICByZXR1cm4gY3VyX2VsZW1lbnQ7CisgICAgICAgIGN1cl9lbGVtZW50ID0geG1sTmV4dEVs ZW1lbnRTaWJsaW5nKGN1cl9lbGVtZW50KTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisK K2ludCBmZl9pbWZfeG1sX3JlYWRfdXVpZCh4bWxOb2RlUHRyIGVsZW1lbnQsIHVpbnQ4X3QgdXVp ZFsxNl0pCit7CisgICAgeG1sQ2hhciAqZWxlbWVudF90ZXh0ID0gTlVMTDsKKyAgICBpbnQgc2Nh bmZfcmV0OworICAgIGludCByZXQgPSAwOworCisgICAgZWxlbWVudF90ZXh0ID0geG1sTm9kZUxp c3RHZXRTdHJpbmcoZWxlbWVudC0+ZG9jLCBlbGVtZW50LT54bWxDaGlsZHJlbk5vZGUsIDEpOwor ICAgIHNjYW5mX3JldCA9IHNzY2FuZihlbGVtZW50X3RleHQsCisgICAgICAgIEZGX0lNRl9VVUlE X0ZPUk1BVCwKKyAgICAgICAgJnV1aWRbMF0sCisgICAgICAgICZ1dWlkWzFdLAorICAgICAgICAm dXVpZFsyXSwKKyAgICAgICAgJnV1aWRbM10sCisgICAgICAgICZ1dWlkWzRdLAorICAgICAgICAm dXVpZFs1XSwKKyAgICAgICAgJnV1aWRbNl0sCisgICAgICAgICZ1dWlkWzddLAorICAgICAgICAm dXVpZFs4XSwKKyAgICAgICAgJnV1aWRbOV0sCisgICAgICAgICZ1dWlkWzEwXSwKKyAgICAgICAg JnV1aWRbMTFdLAorICAgICAgICAmdXVpZFsxMl0sCisgICAgICAgICZ1dWlkWzEzXSwKKyAgICAg ICAgJnV1aWRbMTRdLAorICAgICAgICAmdXVpZFsxNV0pOworICAgIGlmIChzY2FuZl9yZXQgIT0g MTYpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgVVVJRFxu Iik7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHhtbEZy ZWUoZWxlbWVudF90ZXh0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9pbWZfeG1s X3JlYWRfcmF0aW9uYWwoeG1sTm9kZVB0ciBlbGVtZW50LCBBVlJhdGlvbmFsICpyYXRpb25hbCkK K3sKKyAgICB4bWxDaGFyICplbGVtZW50X3RleHQgPSBOVUxMOworICAgIGludCByZXQgPSAwOwor CisgICAgZWxlbWVudF90ZXh0ID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZWxlbWVudC0+ZG9jLCBl bGVtZW50LT54bWxDaGlsZHJlbk5vZGUsIDEpOworICAgIGlmIChzc2NhbmYoZWxlbWVudF90ZXh0 LCAiJWkgJWkiLCAmcmF0aW9uYWwtPm51bSwgJnJhdGlvbmFsLT5kZW4pICE9IDIpIHsKKyAgICAg ICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcmF0aW9uYWwgbnVtYmVyXG4i KTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgeG1sRnJl ZShlbGVtZW50X3RleHQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX2ltZl94bWxf cmVhZF91aW50MzIoeG1sTm9kZVB0ciBlbGVtZW50LCB1aW50MzJfdCAqbnVtYmVyKQoreworICAg IHhtbENoYXIgKmVsZW1lbnRfdGV4dCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBl bGVtZW50X3RleHQgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhlbGVtZW50LT5kb2MsIGVsZW1lbnQt PnhtbENoaWxkcmVuTm9kZSwgMSk7CisgICAgaWYgKHNzY2FuZihlbGVtZW50X3RleHQsICIlIiBQ Ukl1MzIsIG51bWJlcikgIT0gMSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9S LCAiSW52YWxpZCB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciIpOworICAgICAgICByZXQgPSBBVkVS Uk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICB4bWxGcmVlKGVsZW1lbnRfdGV4dCk7CisKKyAg ICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbWZfYmFzZV92aXJ0dWFsX3RyYWNrX2lu aXQoRkZJTUZCYXNlVmlydHVhbFRyYWNrICp0cmFjaykKK3sKKyAgICBtZW1zZXQodHJhY2stPmlk X3V1aWQsIDAsIHNpemVvZih0cmFjay0+aWRfdXVpZCkpOworfQorCitzdGF0aWMgdm9pZCBpbWZf bWFya2VyX3ZpcnR1YWxfdHJhY2tfaW5pdChGRklNRk1hcmtlclZpcnR1YWxUcmFjayAqdHJhY2sp Cit7CisgICAgaW1mX2Jhc2VfdmlydHVhbF90cmFja19pbml0KChGRklNRkJhc2VWaXJ0dWFsVHJh Y2sgKil0cmFjayk7CisgICAgdHJhY2stPnJlc291cmNlX2NvdW50ID0gMDsKKyAgICB0cmFjay0+ cmVzb3VyY2VzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaW1mX3RyYWNrZmlsZV92aXJ0dWFs X3RyYWNrX2luaXQoRkZJTUZUcmFja0ZpbGVWaXJ0dWFsVHJhY2sgKnRyYWNrKQoreworICAgIGlt Zl9iYXNlX3ZpcnR1YWxfdHJhY2tfaW5pdCgoRkZJTUZCYXNlVmlydHVhbFRyYWNrICopdHJhY2sp OworICAgIHRyYWNrLT5yZXNvdXJjZV9jb3VudCA9IDA7CisgICAgdHJhY2stPnJlc291cmNlc19h bGxvY19zeiA9IDA7CisgICAgdHJhY2stPnJlc291cmNlcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2 b2lkIGltZl9iYXNlX3Jlc291cmNlX2luaXQoRkZJTUZCYXNlUmVzb3VyY2UgKnJzcmMpCit7Cisg ICAgcnNyYy0+ZHVyYXRpb24gPSAwOworICAgIHJzcmMtPmVkaXRfcmF0ZSA9IGF2X21ha2VfcSgw LCAxKTsKKyAgICByc3JjLT5lbnRyeV9wb2ludCA9IDA7CisgICAgcnNyYy0+cmVwZWF0X2NvdW50 ID0gMTsKK30KKworc3RhdGljIHZvaWQgaW1mX21hcmtlcl9yZXNvdXJjZV9pbml0KEZGSU1GTWFy a2VyUmVzb3VyY2UgKnJzcmMpCit7CisgICAgaW1mX2Jhc2VfcmVzb3VyY2VfaW5pdCgoRkZJTUZC YXNlUmVzb3VyY2UgKilyc3JjKTsKKyAgICByc3JjLT5tYXJrZXJfY291bnQgPSAwOworICAgIHJz cmMtPm1hcmtlcnMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpbWZfbWFya2VyX2luaXQoRkZJ TUZNYXJrZXIgKm1hcmtlcikKK3sKKyAgICBtYXJrZXItPmxhYmVsX3V0ZjggPSBOVUxMOworICAg IG1hcmtlci0+b2Zmc2V0ID0gMDsKKyAgICBtYXJrZXItPnNjb3BlX3V0ZjggPSBOVUxMOworfQor CitzdGF0aWMgdm9pZCBpbWZfdHJhY2tmaWxlX3Jlc291cmNlX2luaXQoRkZJTUZUcmFja0ZpbGVS ZXNvdXJjZSAqcnNyYykKK3sKKyAgICBpbWZfYmFzZV9yZXNvdXJjZV9pbml0KChGRklNRkJhc2VS ZXNvdXJjZSAqKXJzcmMpOworICAgIG1lbXNldChyc3JjLT50cmFja19maWxlX3V1aWQsIDAsIHNp emVvZihyc3JjLT50cmFja19maWxlX3V1aWQpKTsKK30KKworc3RhdGljIGludCBmaWxsX2NvbnRl bnRfdGl0bGUoeG1sTm9kZVB0ciBjcGxfZWxlbWVudCwgRkZJTUZDUEwgKmNwbCkKK3sKKyAgICB4 bWxOb2RlUHRyIGVsZW1lbnQgPSBOVUxMOworCisgICAgaWYgKCEoZWxlbWVudCA9IGZmX2ltZl94 bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZShjcGxfZWxlbWVudCwgIkNvbnRlbnRUaXRsZSIp KSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ29udGVudFRpdGxlIGVs ZW1lbnQgbm90IGZvdW5kIGluIHRoZSBJTUYgQ1BMXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJS T1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGNwbC0+Y29udGVudF90aXRsZV91dGY4ID0geG1s Tm9kZUxpc3RHZXRTdHJpbmcoY3BsX2VsZW1lbnQtPmRvYywKKyAgICAgICAgZWxlbWVudC0+eG1s Q2hpbGRyZW5Ob2RlLAorICAgICAgICAxKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMg aW50IGZpbGxfZWRpdF9yYXRlKHhtbE5vZGVQdHIgY3BsX2VsZW1lbnQsIEZGSU1GQ1BMICpjcGwp Cit7CisgICAgeG1sTm9kZVB0ciBlbGVtZW50ID0gTlVMTDsKKworICAgIGlmICghKGVsZW1lbnQg PSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUoY3BsX2VsZW1lbnQsICJFZGl0 UmF0ZSIpKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRWRpdFJhdGUg ZWxlbWVudCBub3QgZm91bmQgaW4gdGhlIElNRiBDUExcbiIpOworICAgICAgICByZXR1cm4gQVZF UlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfaW1mX3htbF9yZWFkX3Jh dGlvbmFsKGVsZW1lbnQsICZjcGwtPmVkaXRfcmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZmlsbF9p ZCh4bWxOb2RlUHRyIGNwbF9lbGVtZW50LCBGRklNRkNQTCAqY3BsKQoreworICAgIHhtbE5vZGVQ dHIgZWxlbWVudCA9IE5VTEw7CisKKyAgICBpZiAoIShlbGVtZW50ID0gZmZfaW1mX3htbF9nZXRf Y2hpbGRfZWxlbWVudF9ieV9uYW1lKGNwbF9lbGVtZW50LCAiSWQiKSkpIHsKKyAgICAgICAgYXZf bG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIklkIGVsZW1lbnQgbm90IGZvdW5kIGluIHRoZSBJTUYg Q1BMXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisg ICAgcmV0dXJuIGZmX2ltZl94bWxfcmVhZF91dWlkKGVsZW1lbnQsIGNwbC0+aWRfdXVpZCk7Cit9 CisKK3N0YXRpYyBpbnQgZmlsbF9tYXJrZXIoeG1sTm9kZVB0ciBtYXJrZXJfZWxlbSwgRkZJTUZN YXJrZXIgKm1hcmtlcikKK3sKKyAgICB4bWxOb2RlUHRyIGVsZW1lbnQgPSBOVUxMOworICAgIGlu dCByZXQgPSAwOworCisgICAgLyogcmVhZCBPZmZzZXQgKi8KKyAgICBpZiAoIShlbGVtZW50ID0g ZmZfaW1mX3htbF9nZXRfY2hpbGRfZWxlbWVudF9ieV9uYW1lKG1hcmtlcl9lbGVtLCAiT2Zmc2V0 IikpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJPZmZzZXQgZWxlbWVu dCBub3QgZm91bmQgaW4gYSBNYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZB TElEREFUQTsKKyAgICB9CisgICAgaWYgKChyZXQgPSBmZl9pbWZfeG1sX3JlYWRfdWludDMyKGVs ZW1lbnQsICZtYXJrZXItPm9mZnNldCkpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyog cmVhZCBMYWJlbCBhbmQgU2NvcGUgKi8KKyAgICBpZiAoIShlbGVtZW50ID0gZmZfaW1mX3htbF9n ZXRfY2hpbGRfZWxlbWVudF9ieV9uYW1lKG1hcmtlcl9lbGVtLCAiTGFiZWwiKSkpIHsKKyAgICAg ICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkxhYmVsIGVsZW1lbnQgbm90IGZvdW5kIGlu IGEgTWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAg fQorICAgIGlmICghKG1hcmtlci0+bGFiZWxfdXRmOCA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGVs ZW1lbnQtPmRvYywgZWxlbWVudC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSkpIHsKKyAgICAgICAgYXZf bG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVtcHR5IExhYmVsIGVsZW1lbnQgZm91bmQgaW4gYSBN YXJrZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9Cisg ICAgaWYgKCEobWFya2VyLT5zY29wZV91dGY4ID0geG1sR2V0Tm9Oc1Byb3AoZWxlbWVudCwgInNj b3BlIikpKSB7CisgICAgICAgIG1hcmtlci0+c2NvcGVfdXRmOCA9IHhtbENoYXJTdHJkdXAoImh0 dHA6Ly93d3cuc21wdGUtcmEub3JnL3NjaGVtYXMvMjA2Ny0zLzIwMTMjc3RhbmRhcmQtbWFya2Vy cyIpOworICAgICAgICBpZiAoIW1hcmtlci0+c2NvcGVfdXRmOCkgeworICAgICAgICAgICAgeG1s RnJlZShtYXJrZXItPmxhYmVsX3V0ZjgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5P TUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBp bnQgZmlsbF9iYXNlX3Jlc291cmNlKHhtbE5vZGVQdHIgcmVzb3VyY2VfZWxlbSwgRkZJTUZCYXNl UmVzb3VyY2UgKnJlc291cmNlLCBGRklNRkNQTCAqY3BsKQoreworICAgIHhtbE5vZGVQdHIgZWxl bWVudCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICAvKiByZWFkIEVkaXRSYXRlICov CisgICAgaWYgKCEoZWxlbWVudCA9IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFt ZShyZXNvdXJjZV9lbGVtLCAiRWRpdFJhdGUiKSkpIHsKKyAgICAgICAgcmVzb3VyY2UtPmVkaXRf cmF0ZSA9IGNwbC0+ZWRpdF9yYXRlOworICAgIH0gZWxzZSBpZiAocmV0ID0gZmZfaW1mX3htbF9y ZWFkX3JhdGlvbmFsKGVsZW1lbnQsICZyZXNvdXJjZS0+ZWRpdF9yYXRlKSkgeworICAgICAgICBh dl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBFZGl0UmF0ZSBlbGVtZW50IGZvdW5k IGluIGEgUmVzb3VyY2VcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8q IHJlYWQgRW50cnlQb2ludCAqLworICAgIGlmIChlbGVtZW50ID0gZmZfaW1mX3htbF9nZXRfY2hp bGRfZWxlbWVudF9ieV9uYW1lKHJlc291cmNlX2VsZW0sICJFbnRyeVBvaW50IikpIHsKKyAgICAg ICAgaWYgKHJldCA9IGZmX2ltZl94bWxfcmVhZF91aW50MzIoZWxlbWVudCwgJnJlc291cmNlLT5l bnRyeV9wb2ludCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJ bnZhbGlkIEVudHJ5UG9pbnQgZWxlbWVudCBmb3VuZCBpbiBhIFJlc291cmNlXG4iKTsKKyAgICAg ICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXNv dXJjZS0+ZW50cnlfcG9pbnQgPSAwOworICAgIH0KKworICAgIC8qIHJlYWQgSW50cmluc2ljRHVy YXRpb24gKi8KKyAgICBpZiAoIShlbGVtZW50ID0gZmZfaW1mX3htbF9nZXRfY2hpbGRfZWxlbWVu dF9ieV9uYW1lKHJlc291cmNlX2VsZW0sICJJbnRyaW5zaWNEdXJhdGlvbiIpKSkgeworICAgICAg ICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW50cmluc2ljRHVyYXRpb24gZWxlbWVudCBt aXNzaW5nIGZyb20gUmVzb3VyY2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElE REFUQTsKKyAgICB9CisgICAgaWYgKHJldCA9IGZmX2ltZl94bWxfcmVhZF91aW50MzIoZWxlbWVu dCwgJnJlc291cmNlLT5kdXJhdGlvbikpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19F UlJPUiwgIkludmFsaWQgSW50cmluc2ljRHVyYXRpb24gZWxlbWVudCBmb3VuZCBpbiBhIFJlc291 cmNlXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmVzb3VyY2UtPmR1cmF0 aW9uIC09IHJlc291cmNlLT5lbnRyeV9wb2ludDsKKworICAgIC8qIHJlYWQgU291cmNlRHVyYXRp b24gKi8KKyAgICBpZiAoZWxlbWVudCA9IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlf bmFtZShyZXNvdXJjZV9lbGVtLCAiU291cmNlRHVyYXRpb24iKSkKKyAgICAgICAgaWYgKHJldCA9 IGZmX2ltZl94bWxfcmVhZF91aW50MzIoZWxlbWVudCwgJnJlc291cmNlLT5kdXJhdGlvbikpIHsK KyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJTb3VyY2VEdXJhdGlvbiBl bGVtZW50IG1pc3NpbmcgZnJvbSBSZXNvdXJjZVxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0 OworICAgICAgICB9CisKKyAgICAvKiByZWFkIFJlcGVhdENvdW50ICovCisgICAgaWYgKGVsZW1l bnQgPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUocmVzb3VyY2VfZWxlbSwg IlJlcGVhdENvdW50IikpCisgICAgICAgIHJldCA9IGZmX2ltZl94bWxfcmVhZF91aW50MzIoZWxl bWVudCwgJnJlc291cmNlLT5yZXBlYXRfY291bnQpOworCisgICAgcmV0dXJuIHJldDsKK30KKwor c3RhdGljIGludCBmaWxsX3RyYWNrZmlsZV9yZXNvdXJjZSh4bWxOb2RlUHRyIHRmX3Jlc291cmNl X2VsZW0sCisgICAgRkZJTUZUcmFja0ZpbGVSZXNvdXJjZSAqdGZfcmVzb3VyY2UsCisgICAgRkZJ TUZDUEwgKmNwbCkKK3sKKyAgICB4bWxOb2RlUHRyIGVsZW1lbnQgPSBOVUxMOworICAgIGludCBy ZXQgPSAwOworCisgICAgaWYgKHJldCA9IGZpbGxfYmFzZV9yZXNvdXJjZSh0Zl9yZXNvdXJjZV9l bGVtLCAoRkZJTUZCYXNlUmVzb3VyY2UgKil0Zl9yZXNvdXJjZSwgY3BsKSkKKyAgICAgICAgcmV0 dXJuIHJldDsKKworICAgIC8qIHJlYWQgVHJhY2tGaWxlSWQgKi8KKyAgICBpZiAoZWxlbWVudCA9 IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZSh0Zl9yZXNvdXJjZV9lbGVtLCAi VHJhY2tGaWxlSWQiKSkgeworICAgICAgICBpZiAocmV0ID0gZmZfaW1mX3htbF9yZWFkX3V1aWQo ZWxlbWVudCwgdGZfcmVzb3VyY2UtPnRyYWNrX2ZpbGVfdXVpZCkpIHsKKyAgICAgICAgICAgIGF2 X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFRyYWNrRmlsZUlkIGVsZW1lbnQgZm91 bmQgaW4gUmVzb3VyY2VcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQor ICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJUcmFja0Zp bGVJZCBlbGVtZW50IG1pc3NpbmcgZnJvbSBSZXNvdXJjZVxuIik7CisgICAgICAgIHJldHVybiBB VkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRp YyBpbnQgZmlsbF9tYXJrZXJfcmVzb3VyY2UoeG1sTm9kZVB0ciBtYXJrZXJfcmVzb3VyY2VfZWxl bSwKKyAgICBGRklNRk1hcmtlclJlc291cmNlICptYXJrZXJfcmVzb3VyY2UsCisgICAgRkZJTUZD UEwgKmNwbCkKK3sKKyAgICB4bWxOb2RlUHRyIGVsZW1lbnQgPSBOVUxMOworICAgIGludCByZXQg PSAwOworCisgICAgaWYgKHJldCA9IGZpbGxfYmFzZV9yZXNvdXJjZShtYXJrZXJfcmVzb3VyY2Vf ZWxlbSwgKEZGSU1GQmFzZVJlc291cmNlICopbWFya2VyX3Jlc291cmNlLCBjcGwpKQorICAgICAg ICByZXR1cm4gcmV0OworCisgICAgLyogcmVhZCBtYXJrZXJzICovCisgICAgZWxlbWVudCA9IHht bEZpcnN0RWxlbWVudENoaWxkKG1hcmtlcl9yZXNvdXJjZV9lbGVtKTsKKyAgICB3aGlsZSAoZWxl bWVudCkgeworICAgICAgICBpZiAoeG1sU3RyY21wKGVsZW1lbnQtPm5hbWUsICJNYXJrZXIiKSA9 PSAwKSB7CisgICAgICAgICAgICB2b2lkICp0bXA7CisKKyAgICAgICAgICAgIGlmIChtYXJrZXJf cmVzb3VyY2UtPm1hcmtlcl9jb3VudCA9PSBVSU5UMzJfTUFYKQorICAgICAgICAgICAgICAgIHJl dHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB0bXAgPSBhdl9yZWFsbG9jX2FycmF5 KG1hcmtlcl9yZXNvdXJjZS0+bWFya2VycywKKyAgICAgICAgICAgICAgICBtYXJrZXJfcmVzb3Vy Y2UtPm1hcmtlcl9jb3VudCArIDEsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZGSU1GTWFya2Vy KSk7CisgICAgICAgICAgICBpZiAoIXRtcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJP UihFTk9NRU0pOworICAgICAgICAgICAgbWFya2VyX3Jlc291cmNlLT5tYXJrZXJzID0gdG1wOwor ICAgICAgICAgICAgaW1mX21hcmtlcl9pbml0KCZtYXJrZXJfcmVzb3VyY2UtPm1hcmtlcnNbbWFy a2VyX3Jlc291cmNlLT5tYXJrZXJfY291bnRdKTsKKyAgICAgICAgICAgIHJldCA9IGZpbGxfbWFy a2VyKGVsZW1lbnQsCisgICAgICAgICAgICAgICAgJm1hcmtlcl9yZXNvdXJjZS0+bWFya2Vyc1tt YXJrZXJfcmVzb3VyY2UtPm1hcmtlcl9jb3VudF0pOworICAgICAgICAgICAgbWFya2VyX3Jlc291 cmNlLT5tYXJrZXJfY291bnQrKzsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAg ICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBlbGVtZW50ID0geG1sTmV4dEVsZW1l bnRTaWJsaW5nKGVsZW1lbnQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRp YyBpbnQgcHVzaF9tYXJrZXJfc2VxdWVuY2UoeG1sTm9kZVB0ciBtYXJrZXJfc2VxdWVuY2VfZWxl bSwgRkZJTUZDUEwgKmNwbCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1aW50OF90IHV1aWRb MTZdOworICAgIHhtbE5vZGVQdHIgcmVzb3VyY2VfbGlzdF9lbGVtID0gTlVMTDsKKyAgICB4bWxO b2RlUHRyIHJlc291cmNlX2VsZW0gPSBOVUxMOworICAgIHhtbE5vZGVQdHIgdHJhY2tfaWRfZWxl bSA9IE5VTEw7CisgICAgdW5zaWduZWQgbG9uZyByZXNvdXJjZV9lbGVtX2NvdW50OworICAgIHZv aWQgKnRtcDsKKworICAgIC8qIHJlYWQgVHJhY2tJRCBlbGVtZW50ICovCisgICAgaWYgKCEodHJh Y2tfaWRfZWxlbSA9IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZShtYXJrZXJf c2VxdWVuY2VfZWxlbSwgIlRyYWNrSWQiKSkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xP R19FUlJPUiwgIlRyYWNrSWQgZWxlbWVudCBtaXNzaW5nIGZyb20gU2VxdWVuY2VcbiIpOworICAg ICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHJldCA9IGZm X2ltZl94bWxfcmVhZF91dWlkKHRyYWNrX2lkX2VsZW0sIHV1aWQpKSB7CisgICAgICAgIGF2X2xv ZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFRyYWNrSWQgZWxlbWVudCBmb3VuZCBpbiBT ZXF1ZW5jZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0K KyAgICBhdl9sb2coTlVMTCwKKyAgICAgICAgQVZfTE9HX0RFQlVHLAorICAgICAgICAiUHJvY2Vz c2luZyBJTUYgQ1BMIE1hcmtlciBTZXF1ZW5jZSBmb3IgVmlydHVhbCBUcmFjayAiIEZGX0lNRl9V VUlEX0ZPUk1BVCAiXG4iLAorICAgICAgICBVSURfQVJHKHV1aWQpKTsKKworICAgIC8qIGNyZWF0 ZSBtYWluIG1hcmtlciB2aXJ0dWFsIHRyYWNrIGlmIGl0IGRvZXMgbm90IGV4aXN0ICovCisgICAg aWYgKCFjcGwtPm1haW5fbWFya2Vyc190cmFjaykgeworICAgICAgICBjcGwtPm1haW5fbWFya2Vy c190cmFjayA9IGF2X21hbGxvYyhzaXplb2YoRkZJTUZNYXJrZXJWaXJ0dWFsVHJhY2spKTsKKyAg ICAgICAgaWYgKCFjcGwtPm1haW5fbWFya2Vyc190cmFjaykKKyAgICAgICAgICAgIHJldHVybiBB VkVSUk9SKEVOT01FTSk7CisgICAgICAgIGltZl9tYXJrZXJfdmlydHVhbF90cmFja19pbml0KGNw bC0+bWFpbl9tYXJrZXJzX3RyYWNrKTsKKyAgICAgICAgbWVtY3B5KGNwbC0+bWFpbl9tYXJrZXJz X3RyYWNrLT5iYXNlLmlkX3V1aWQsIHV1aWQsIHNpemVvZih1dWlkKSk7CisgICAgfSBlbHNlIGlm IChtZW1jbXAoY3BsLT5tYWluX21hcmtlcnNfdHJhY2stPmJhc2UuaWRfdXVpZCwgdXVpZCwgc2l6 ZW9mKHV1aWQpKSAhPSAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJN dWx0aXBsZSBtYXJrZXIgdmlydHVhbCB0cmFja3Mgd2VyZSBmb3VuZFxuIik7CisgICAgICAgIHJl dHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIC8qIHByb2Nlc3MgcmVzb3Vy Y2VzICovCisgICAgcmVzb3VyY2VfbGlzdF9lbGVtID0gZmZfaW1mX3htbF9nZXRfY2hpbGRfZWxl bWVudF9ieV9uYW1lKG1hcmtlcl9zZXF1ZW5jZV9lbGVtLCAiUmVzb3VyY2VMaXN0Iik7CisgICAg aWYgKCFyZXNvdXJjZV9saXN0X2VsZW0pCisgICAgICAgIHJldHVybiAwOworICAgIHJlc291cmNl X2VsZW1fY291bnQgPSB4bWxDaGlsZEVsZW1lbnRDb3VudChyZXNvdXJjZV9saXN0X2VsZW0pOwor ICAgIGlmIChyZXNvdXJjZV9lbGVtX2NvdW50ID4gVUlOVDMyX01BWAorICAgICAgICB8fCBjcGwt Pm1haW5fbWFya2Vyc190cmFjay0+cmVzb3VyY2VfY291bnQgPiBVSU5UMzJfTUFYIC0gcmVzb3Vy Y2VfZWxlbV9jb3VudCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB0bXAg PSBhdl9yZWFsbG9jX2FycmF5KGNwbC0+bWFpbl9tYXJrZXJzX3RyYWNrLT5yZXNvdXJjZXMsCisg ICAgICAgIGNwbC0+bWFpbl9tYXJrZXJzX3RyYWNrLT5yZXNvdXJjZV9jb3VudCArIHJlc291cmNl X2VsZW1fY291bnQsCisgICAgICAgIHNpemVvZihGRklNRk1hcmtlclJlc291cmNlKSk7CisgICAg aWYgKCF0bXApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBh bGxvY2F0ZSBNYXJrZXIgUmVzb3VyY2VzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5P TUVNKTsKKyAgICB9CisgICAgY3BsLT5tYWluX21hcmtlcnNfdHJhY2stPnJlc291cmNlcyA9IHRt cDsKKworICAgIHJlc291cmNlX2VsZW0gPSB4bWxGaXJzdEVsZW1lbnRDaGlsZChyZXNvdXJjZV9s aXN0X2VsZW0pOworICAgIHdoaWxlIChyZXNvdXJjZV9lbGVtKSB7CisgICAgICAgIGltZl9tYXJr ZXJfcmVzb3VyY2VfaW5pdCgKKyAgICAgICAgICAgICZjcGwtPm1haW5fbWFya2Vyc190cmFjay0+ cmVzb3VyY2VzW2NwbC0+bWFpbl9tYXJrZXJzX3RyYWNrLT5yZXNvdXJjZV9jb3VudF0pOworICAg ICAgICByZXQgPSBmaWxsX21hcmtlcl9yZXNvdXJjZShyZXNvdXJjZV9lbGVtLAorICAgICAgICAg ICAgJmNwbC0+bWFpbl9tYXJrZXJzX3RyYWNrLT5yZXNvdXJjZXNbY3BsLT5tYWluX21hcmtlcnNf dHJhY2stPnJlc291cmNlX2NvdW50XSwKKyAgICAgICAgICAgIGNwbCk7CisgICAgICAgIGNwbC0+ bWFpbl9tYXJrZXJzX3RyYWNrLT5yZXNvdXJjZV9jb3VudCsrOworICAgICAgICBpZiAocmV0KQor ICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmVzb3VyY2VfZWxlbSA9IHhtbE5leHRF bGVtZW50U2libGluZyhyZXNvdXJjZV9lbGVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0Owor fQorCitzdGF0aWMgaW50IGhhc19zdGVyZW9fcmVzb3VyY2VzKHhtbE5vZGVQdHIgZWxlbWVudCkK K3sKKyAgICBpZiAoeG1sU3RyY21wKGVsZW1lbnQtPm5hbWUsICJMZWZ0IikgPT0gMCB8fCB4bWxT dHJjbXAoZWxlbWVudC0+bmFtZSwgIlJpZ2h0IikgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7Cisg ICAgZWxlbWVudCA9IHhtbEZpcnN0RWxlbWVudENoaWxkKGVsZW1lbnQpOworICAgIHdoaWxlIChl bGVtZW50KSB7CisgICAgICAgIGlmIChoYXNfc3RlcmVvX3Jlc291cmNlcyhlbGVtZW50KSkKKyAg ICAgICAgICAgIHJldHVybiAxOworICAgICAgICBlbGVtZW50ID0geG1sTmV4dEVsZW1lbnRTaWJs aW5nKGVsZW1lbnQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXNo X21haW5fYXVkaW9fc2VxdWVuY2UoeG1sTm9kZVB0ciBhdWRpb19zZXF1ZW5jZV9lbGVtLCBGRklN RkNQTCAqY3BsKQoreworICAgIGludCByZXQgPSAwOworICAgIHVpbnQ4X3QgdXVpZFsxNl07Cisg ICAgeG1sTm9kZVB0ciByZXNvdXJjZV9saXN0X2VsZW0gPSBOVUxMOworICAgIHhtbE5vZGVQdHIg cmVzb3VyY2VfZWxlbSA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciB0cmFja19pZF9lbGVtID0gTlVM TDsKKyAgICB1bnNpZ25lZCBsb25nIHJlc291cmNlX2VsZW1fY291bnQ7CisgICAgRkZJTUZUcmFj a0ZpbGVWaXJ0dWFsVHJhY2sgKnZ0ID0gTlVMTDsKKyAgICB2b2lkICp0bXA7CisKKyAgICAvKiBy ZWFkIFRyYWNrSUQgZWxlbWVudCAqLworICAgIGlmICghKHRyYWNrX2lkX2VsZW0gPSBmZl9pbWZf eG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUoYXVkaW9fc2VxdWVuY2VfZWxlbSwgIlRyYWNr SWQiKSkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlRyYWNrSWQgZWxl bWVudCBtaXNzaW5nIGZyb20gYXVkaW8gc2VxdWVuY2VcbiIpOworICAgICAgICByZXR1cm4gQVZF UlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKHJldCA9IGZmX2ltZl94bWxfcmVhZF91 dWlkKHRyYWNrX2lkX2VsZW0sIHV1aWQpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0df RVJST1IsICJJbnZhbGlkIFRyYWNrSWQgZWxlbWVudCBmb3VuZCBpbiBhdWRpbyBzZXF1ZW5jZVxu Iik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF2X2xvZyhOVUxMLAorICAgICAg ICBBVl9MT0dfREVCVUcsCisgICAgICAgICJQcm9jZXNzaW5nIElNRiBDUEwgQXVkaW8gU2VxdWVu Y2UgZm9yIFZpcnR1YWwgVHJhY2sgIiBGRl9JTUZfVVVJRF9GT1JNQVQgIlxuIiwKKyAgICAgICAg VUlEX0FSRyh1dWlkKSk7CisKKyAgICAvKiBnZXQgdGhlIG1haW4gYXVkaW8gdmlydHVhbCB0cmFj ayBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZXF1ZW5jZSAqLworICAgIGZvciAodWludDMyX3QgaSA9 IDA7IGkgPCBjcGwtPm1haW5fYXVkaW9fdHJhY2tfY291bnQ7IGkrKykKKyAgICAgICAgaWYgKG1l bWNtcChjcGwtPm1haW5fYXVkaW9fdHJhY2tzW2ldLmJhc2UuaWRfdXVpZCwgdXVpZCwgc2l6ZW9m KHV1aWQpKSA9PSAwKSB7CisgICAgICAgICAgICB2dCA9ICZjcGwtPm1haW5fYXVkaW9fdHJhY2tz W2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIC8qIGNyZWF0ZSBhIG1h aW4gYXVkaW8gdmlydHVhbCB0cmFjayBpZiBub25lIGV4aXN0cyBmb3IgdGhlIHNlcXVlbmNlICov CisgICAgaWYgKCF2dCkgeworICAgICAgICBpZiAoY3BsLT5tYWluX2F1ZGlvX3RyYWNrX2NvdW50 ID09IFVJTlQzMl9NQVgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAg ICAgICB0bXAgPSBhdl9yZWFsbG9jX2FycmF5KGNwbC0+bWFpbl9hdWRpb190cmFja3MsCisgICAg ICAgICAgICBjcGwtPm1haW5fYXVkaW9fdHJhY2tfY291bnQgKyAxLAorICAgICAgICAgICAgc2l6 ZW9mKEZGSU1GVHJhY2tGaWxlVmlydHVhbFRyYWNrKSk7CisgICAgICAgIGlmICghdG1wKQorICAg ICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgY3BsLT5tYWluX2F1ZGlv X3RyYWNrcyA9IHRtcDsKKyAgICAgICAgdnQgPSAmY3BsLT5tYWluX2F1ZGlvX3RyYWNrc1tjcGwt Pm1haW5fYXVkaW9fdHJhY2tfY291bnRdOworICAgICAgICBpbWZfdHJhY2tmaWxlX3ZpcnR1YWxf dHJhY2tfaW5pdCh2dCk7CisgICAgICAgIGNwbC0+bWFpbl9hdWRpb190cmFja19jb3VudCsrOwor ICAgICAgICBtZW1jcHkodnQtPmJhc2UuaWRfdXVpZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKTsKKyAg ICB9CisKKyAgICAvKiBwcm9jZXNzIHJlc291cmNlcyAqLworICAgIHJlc291cmNlX2xpc3RfZWxl bSA9IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZShhdWRpb19zZXF1ZW5jZV9l bGVtLCAiUmVzb3VyY2VMaXN0Iik7CisgICAgaWYgKCFyZXNvdXJjZV9saXN0X2VsZW0pCisgICAg ICAgIHJldHVybiAwOworICAgIHJlc291cmNlX2VsZW1fY291bnQgPSB4bWxDaGlsZEVsZW1lbnRD b3VudChyZXNvdXJjZV9saXN0X2VsZW0pOworICAgIGlmIChyZXNvdXJjZV9lbGVtX2NvdW50ID4g VUlOVDMyX01BWAorICAgICAgICB8fCB2dC0+cmVzb3VyY2VfY291bnQgPiBVSU5UMzJfTUFYIC0g cmVzb3VyY2VfZWxlbV9jb3VudCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAg ICB0bXAgPSBhdl9mYXN0X3JlYWxsb2ModnQtPnJlc291cmNlcywKKyAgICAgICAgJnZ0LT5yZXNv dXJjZXNfYWxsb2Nfc3osCisgICAgICAgICh2dC0+cmVzb3VyY2VfY291bnQgKyByZXNvdXJjZV9l bGVtX2NvdW50KSAqIHNpemVvZihGRklNRlRyYWNrRmlsZVJlc291cmNlKSk7CisgICAgaWYgKCF0 bXApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0 ZSBNYWluIEF1ZGlvIFJlc291cmNlc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01F TSk7CisgICAgfQorICAgIHZ0LT5yZXNvdXJjZXMgPSB0bXA7CisKKyAgICByZXNvdXJjZV9lbGVt ID0geG1sRmlyc3RFbGVtZW50Q2hpbGQocmVzb3VyY2VfbGlzdF9lbGVtKTsKKyAgICB3aGlsZSAo cmVzb3VyY2VfZWxlbSkgeworICAgICAgICBpbWZfdHJhY2tmaWxlX3Jlc291cmNlX2luaXQoJnZ0 LT5yZXNvdXJjZXNbdnQtPnJlc291cmNlX2NvdW50XSk7CisgICAgICAgIHJldCA9IGZpbGxfdHJh Y2tmaWxlX3Jlc291cmNlKHJlc291cmNlX2VsZW0sCisgICAgICAgICAgICAmdnQtPnJlc291cmNl c1t2dC0+cmVzb3VyY2VfY291bnRdLAorICAgICAgICAgICAgY3BsKTsKKyAgICAgICAgdnQtPnJl c291cmNlX2NvdW50Kys7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhO VUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFJlc291cmNlXG4iKTsKKyAgICAgICAgICAgIGNv bnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJlc291cmNlX2VsZW0gPSB4bWxOZXh0RWxlbWVu dFNpYmxpbmcocmVzb3VyY2VfZWxlbSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwor c3RhdGljIGludCBwdXNoX21haW5faW1hZ2VfMmRfc2VxdWVuY2UoeG1sTm9kZVB0ciBpbWFnZV9z ZXF1ZW5jZV9lbGVtLCBGRklNRkNQTCAqY3BsKQoreworICAgIGludCByZXQgPSAwOworICAgIHVp bnQ4X3QgdXVpZFsxNl07CisgICAgeG1sTm9kZVB0ciByZXNvdXJjZV9saXN0X2VsZW0gPSBOVUxM OworICAgIHhtbE5vZGVQdHIgcmVzb3VyY2VfZWxlbSA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciB0 cmFja19pZF9lbGVtID0gTlVMTDsKKyAgICB2b2lkICp0bXA7CisgICAgdW5zaWduZWQgbG9uZyBy ZXNvdXJjZV9lbGVtX2NvdW50OworCisgICAgLyogc2tpcCBzdGVyZW9zY29waWMgcmVzb3VyY2Vz ICovCisgICAgaWYgKGhhc19zdGVyZW9fcmVzb3VyY2VzKGltYWdlX3NlcXVlbmNlX2VsZW0pKSB7 CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJTdGVyZW9zY29waWMgM0QgaW1h Z2UgdmlydHVhbCB0cmFja3Mgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVS Uk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvKiByZWFkIFRyYWNrSWQgZWxlbWVudCov CisgICAgaWYgKCEodHJhY2tfaWRfZWxlbSA9IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRf YnlfbmFtZShpbWFnZV9zZXF1ZW5jZV9lbGVtLCAiVHJhY2tJZCIpKSkgeworICAgICAgICBhdl9s b2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVHJhY2tJZCBlbGVtZW50IG1pc3NpbmcgZnJvbSBhdWRp byBzZXF1ZW5jZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAg IH0KKyAgICBpZiAocmV0ID0gZmZfaW1mX3htbF9yZWFkX3V1aWQodHJhY2tfaWRfZWxlbSwgdXVp ZCkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgVHJhY2tJ ZCBlbGVtZW50IGZvdW5kIGluIGF1ZGlvIHNlcXVlbmNlXG4iKTsKKyAgICAgICAgcmV0dXJuIHJl dDsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgbWFpbiBpbWFnZSB2aXJ0dWFsIHRyYWNrIGlmIG9u ZSBkb2VzIG5vdCBleGlzdCAqLworICAgIGlmICghY3BsLT5tYWluX2ltYWdlXzJkX3RyYWNrKSB7 CisgICAgICAgIGNwbC0+bWFpbl9pbWFnZV8yZF90cmFjayA9IGF2X21hbGxvYyhzaXplb2YoRkZJ TUZUcmFja0ZpbGVWaXJ0dWFsVHJhY2spKTsKKyAgICAgICAgaWYgKCFjcGwtPm1haW5faW1hZ2Vf MmRfdHJhY2spCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBp bWZfdHJhY2tmaWxlX3ZpcnR1YWxfdHJhY2tfaW5pdChjcGwtPm1haW5faW1hZ2VfMmRfdHJhY2sp OworICAgICAgICBtZW1jcHkoY3BsLT5tYWluX2ltYWdlXzJkX3RyYWNrLT5iYXNlLmlkX3V1aWQs IHV1aWQsIHNpemVvZih1dWlkKSk7CisgICAgfSBlbHNlIGlmIChtZW1jbXAoY3BsLT5tYWluX2lt YWdlXzJkX3RyYWNrLT5iYXNlLmlkX3V1aWQsIHV1aWQsIHNpemVvZih1dWlkKSkgIT0gMCkgewor ICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTXVsdGlwbGUgTWFpbkltYWdlIHZp cnR1YWwgdHJhY2tzIGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERB VEE7CisgICAgfQorICAgIGF2X2xvZyhOVUxMLAorICAgICAgICBBVl9MT0dfREVCVUcsCisgICAg ICAgICJQcm9jZXNzaW5nIElNRiBDUEwgTWFpbiBJbWFnZSBTZXF1ZW5jZSBmb3IgVmlydHVhbCBU cmFjayAiIEZGX0lNRl9VVUlEX0ZPUk1BVCAiXG4iLAorICAgICAgICBVSURfQVJHKHV1aWQpKTsK KworICAgIC8qIHByb2Nlc3MgcmVzb3VyY2VzICovCisgICAgcmVzb3VyY2VfbGlzdF9lbGVtID0g ZmZfaW1mX3htbF9nZXRfY2hpbGRfZWxlbWVudF9ieV9uYW1lKGltYWdlX3NlcXVlbmNlX2VsZW0s ICJSZXNvdXJjZUxpc3QiKTsKKyAgICBpZiAoIXJlc291cmNlX2xpc3RfZWxlbSkKKyAgICAgICAg cmV0dXJuIDA7CisgICAgcmVzb3VyY2VfZWxlbV9jb3VudCA9IHhtbENoaWxkRWxlbWVudENvdW50 KHJlc291cmNlX2xpc3RfZWxlbSk7CisgICAgaWYgKHJlc291cmNlX2VsZW1fY291bnQgPiBVSU5U MzJfTUFYCisgICAgICAgIHx8IGNwbC0+bWFpbl9pbWFnZV8yZF90cmFjay0+cmVzb3VyY2VfY291 bnQgPiBVSU5UMzJfTUFYIC0gcmVzb3VyY2VfZWxlbV9jb3VudAorICAgICAgICB8fCAoY3BsLT5t YWluX2ltYWdlXzJkX3RyYWNrLT5yZXNvdXJjZV9jb3VudCArIHJlc291cmNlX2VsZW1fY291bnQp ID4gSU5UX01BWCAvIHNpemVvZihGRklNRlRyYWNrRmlsZVJlc291cmNlKSkKKyAgICAgICAgcmV0 dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB0bXAgPSBhdl9mYXN0X3JlYWxsb2MoY3BsLT5tYWlu X2ltYWdlXzJkX3RyYWNrLT5yZXNvdXJjZXMsCisgICAgICAgICZjcGwtPm1haW5faW1hZ2VfMmRf dHJhY2stPnJlc291cmNlc19hbGxvY19zeiwKKyAgICAgICAgKGNwbC0+bWFpbl9pbWFnZV8yZF90 cmFjay0+cmVzb3VyY2VfY291bnQgKyByZXNvdXJjZV9lbGVtX2NvdW50KSAqIHNpemVvZihGRklN RlRyYWNrRmlsZVJlc291cmNlKSk7CisgICAgaWYgKCF0bXApIHsKKyAgICAgICAgYXZfbG9nKE5V TEwsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBNYWluIEltYWdlIFJlc291cmNlc1xu Iik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGNwbC0+bWFp bl9pbWFnZV8yZF90cmFjay0+cmVzb3VyY2VzID0gdG1wOworCisgICAgcmVzb3VyY2VfZWxlbSA9 IHhtbEZpcnN0RWxlbWVudENoaWxkKHJlc291cmNlX2xpc3RfZWxlbSk7CisgICAgd2hpbGUgKHJl c291cmNlX2VsZW0pIHsKKyAgICAgICAgaW1mX3RyYWNrZmlsZV9yZXNvdXJjZV9pbml0KAorICAg ICAgICAgICAgJmNwbC0+bWFpbl9pbWFnZV8yZF90cmFjay0+cmVzb3VyY2VzW2NwbC0+bWFpbl9p bWFnZV8yZF90cmFjay0+cmVzb3VyY2VfY291bnRdKTsKKyAgICAgICAgcmV0ID0gZmlsbF90cmFj a2ZpbGVfcmVzb3VyY2UocmVzb3VyY2VfZWxlbSwKKyAgICAgICAgICAgICZjcGwtPm1haW5faW1h Z2VfMmRfdHJhY2stPnJlc291cmNlc1tjcGwtPm1haW5faW1hZ2VfMmRfdHJhY2stPnJlc291cmNl X2NvdW50XSwKKyAgICAgICAgICAgIGNwbCk7CisgICAgICAgIGNwbC0+bWFpbl9pbWFnZV8yZF90 cmFjay0+cmVzb3VyY2VfY291bnQrKzsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAg YXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgUmVzb3VyY2VcbiIpOworICAgICAg ICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VfZWxlbSA9IHhtbE5l eHRFbGVtZW50U2libGluZyhyZXNvdXJjZV9lbGVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsK K30KKworc3RhdGljIGludCBmaWxsX3ZpcnR1YWxfdHJhY2tzKHhtbE5vZGVQdHIgY3BsX2VsZW1l bnQsIEZGSU1GQ1BMICpjcGwpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgeG1sTm9kZVB0ciBz ZWdtZW50X2xpc3RfZWxlbSA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciBzZWdtZW50X2VsZW0gPSBO VUxMOworICAgIHhtbE5vZGVQdHIgc2VxdWVuY2VfbGlzdF9lbGVtID0gTlVMTDsKKyAgICB4bWxO b2RlUHRyIHNlcXVlbmNlX2VsZW0gPSBOVUxMOworCisgICAgaWYgKCEoc2VnbWVudF9saXN0X2Vs ZW0gPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUoY3BsX2VsZW1lbnQsICJT ZWdtZW50TGlzdCIpKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiU2Vn bWVudExpc3QgZWxlbWVudCBtaXNzaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5W QUxJRERBVEE7CisgICAgfQorCisgICAgLyogcHJvY2VzcyBzZXF1ZW5jZXMgKi8KKyAgICBzZWdt ZW50X2VsZW0gPSB4bWxGaXJzdEVsZW1lbnRDaGlsZChzZWdtZW50X2xpc3RfZWxlbSk7CisgICAg d2hpbGUgKHNlZ21lbnRfZWxlbSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVH LCAiUHJvY2Vzc2luZyBJTUYgQ1BMIFNlZ21lbnRcbiIpOworICAgICAgICBzZXF1ZW5jZV9saXN0 X2VsZW0gPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUoc2VnbWVudF9lbGVt LCAiU2VxdWVuY2VMaXN0Iik7CisgICAgICAgIGlmICghc2VnbWVudF9saXN0X2VsZW0pCisgICAg ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgc2VxdWVuY2VfZWxlbSA9IHhtbEZpcnN0RWxlbWVu dENoaWxkKHNlcXVlbmNlX2xpc3RfZWxlbSk7CisgICAgICAgIHdoaWxlIChzZXF1ZW5jZV9lbGVt KSB7CisgICAgICAgICAgICBpZiAoeG1sU3RyY21wKHNlcXVlbmNlX2VsZW0tPm5hbWUsICJNYXJr ZXJTZXF1ZW5jZSIpID09IDApCisgICAgICAgICAgICAgICAgcmV0ID0gcHVzaF9tYXJrZXJfc2Vx dWVuY2Uoc2VxdWVuY2VfZWxlbSwgY3BsKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHhtbFN0cmNt cChzZXF1ZW5jZV9lbGVtLT5uYW1lLCAiTWFpbkltYWdlU2VxdWVuY2UiKSA9PSAwKQorICAgICAg ICAgICAgICAgIHJldCA9IHB1c2hfbWFpbl9pbWFnZV8yZF9zZXF1ZW5jZShzZXF1ZW5jZV9lbGVt LCBjcGwpOworICAgICAgICAgICAgZWxzZSBpZiAoeG1sU3RyY21wKHNlcXVlbmNlX2VsZW0tPm5h bWUsICJNYWluQXVkaW9TZXF1ZW5jZSIpID09IDApCisgICAgICAgICAgICAgICAgcmV0ID0gcHVz aF9tYWluX2F1ZGlvX3NlcXVlbmNlKHNlcXVlbmNlX2VsZW0sIGNwbCk7CisgICAgICAgICAgICBl bHNlCisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsCisgICAgICAgICAgICAgICAgICAgIEFW X0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAiVGhlIGZvbGxvd2luZyBTZXF1ZW5jZSBp cyBub3Qgc3VwcG9ydGVkIGFuZCBpcyBpZ25vcmVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAg ICAgc2VxdWVuY2VfZWxlbS0+bmFtZSk7CisgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1Io RU5PTUVNKSkKKyAgICAgICAgICAgICAgICAvKiBhYm9ydCBwYXJzaW5nIG9ubHkgaWYgbWVtb3J5 IGVycm9yIG9jY3VycmVkICovCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAg ICAgIHNlcXVlbmNlX2VsZW0gPSB4bWxOZXh0RWxlbWVudFNpYmxpbmcoc2VxdWVuY2VfZWxlbSk7 CisgICAgICAgIH0KKyAgICAgICAgc2VnbWVudF9lbGVtID0geG1sTmV4dEVsZW1lbnRTaWJsaW5n KHNlZ21lbnRfZWxlbSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX2lt Zl9wYXJzZV9jcGxfZnJvbV94bWxfZG9tKHhtbERvY1B0ciBkb2MsIEZGSU1GQ1BMICoqY3BsKQor eworICAgIGludCByZXQgPSAwOworICAgIHhtbE5vZGVQdHIgY3BsX2VsZW1lbnQgPSBOVUxMOwor CisgICAgKmNwbCA9IGZmX2ltZl9jcGxfYWxsb2MoKTsKKyAgICBpZiAoISpjcGwpIHsKKyAgICAg ICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQor ICAgIGNwbF9lbGVtZW50ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICBpZiAoeG1s U3RyY21wKGNwbF9lbGVtZW50LT5uYW1lLCAiQ29tcG9zaXRpb25QbGF5bGlzdCIpKSB7CisgICAg ICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBD UEwgaXMgbm90IENvbXBvc2l0aW9uUGxheWxpc3RcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9S X0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGlmIChyZXQg PSBmaWxsX2NvbnRlbnRfdGl0bGUoY3BsX2VsZW1lbnQsICpjcGwpKQorICAgICAgICBnb3RvIGNs ZWFudXA7CisgICAgaWYgKHJldCA9IGZpbGxfaWQoY3BsX2VsZW1lbnQsICpjcGwpKQorICAgICAg ICBnb3RvIGNsZWFudXA7CisgICAgaWYgKHJldCA9IGZpbGxfZWRpdF9yYXRlKGNwbF9lbGVtZW50 LCAqY3BsKSkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGlmIChyZXQgPSBmaWxsX3ZpcnR1 YWxfdHJhY2tzKGNwbF9lbGVtZW50LCAqY3BsKSkKKyAgICAgICAgZ290byBjbGVhbnVwOworCitj bGVhbnVwOgorICAgIGlmICgqY3BsICYmIHJldCkgeworICAgICAgICBmZl9pbWZfY3BsX2ZyZWUo KmNwbCk7CisgICAgICAgICpjcGwgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQor CitzdGF0aWMgdm9pZCBpbWZfbWFya2VyX2ZyZWUoRkZJTUZNYXJrZXIgKm1hcmtlcikKK3sKKyAg ICBpZiAoIW1hcmtlcikKKyAgICAgICAgcmV0dXJuOworICAgIHhtbEZyZWUobWFya2VyLT5sYWJl bF91dGY4KTsKKyAgICB4bWxGcmVlKG1hcmtlci0+c2NvcGVfdXRmOCk7Cit9CisKK3N0YXRpYyB2 b2lkIGltZl9tYXJrZXJfcmVzb3VyY2VfZnJlZShGRklNRk1hcmtlclJlc291cmNlICpyc3JjKQor eworICAgIGlmICghcnNyYykKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAodWludDMyX3QgaSA9 IDA7IGkgPCByc3JjLT5tYXJrZXJfY291bnQ7IGkrKykKKyAgICAgICAgaW1mX21hcmtlcl9mcmVl KCZyc3JjLT5tYXJrZXJzW2ldKTsKKyAgICBhdl9mcmVlcCgmcnNyYy0+bWFya2Vycyk7Cit9CisK K3N0YXRpYyB2b2lkIGltZl9tYXJrZXJfdmlydHVhbF90cmFja19mcmVlKEZGSU1GTWFya2VyVmly dHVhbFRyYWNrICp2dCkKK3sKKyAgICBpZiAoIXZ0KQorICAgICAgICByZXR1cm47CisgICAgZm9y ICh1aW50MzJfdCBpID0gMDsgaSA8IHZ0LT5yZXNvdXJjZV9jb3VudDsgaSsrKQorICAgICAgICBp bWZfbWFya2VyX3Jlc291cmNlX2ZyZWUoJnZ0LT5yZXNvdXJjZXNbaV0pOworICAgIGF2X2ZyZWVw KCZ2dC0+cmVzb3VyY2VzKTsKK30KKworc3RhdGljIHZvaWQgaW1mX3RyYWNrZmlsZV92aXJ0dWFs X3RyYWNrX2ZyZWUoRkZJTUZUcmFja0ZpbGVWaXJ0dWFsVHJhY2sgKnZ0KQoreworICAgIGlmICgh dnQpCisgICAgICAgIHJldHVybjsKKyAgICBhdl9mcmVlcCgmdnQtPnJlc291cmNlcyk7Cit9CisK K3N0YXRpYyB2b2lkIGltZl9jcGxfaW5pdChGRklNRkNQTCAqY3BsKQoreworICAgIG1lbXNldChj cGwtPmlkX3V1aWQsIDAsIHNpemVvZihjcGwtPmlkX3V1aWQpKTsKKyAgICBjcGwtPmNvbnRlbnRf dGl0bGVfdXRmOCA9IE5VTEw7CisgICAgY3BsLT5lZGl0X3JhdGUgPSBhdl9tYWtlX3EoMCwgMSk7 CisgICAgY3BsLT5tYWluX21hcmtlcnNfdHJhY2sgPSBOVUxMOworICAgIGNwbC0+bWFpbl9pbWFn ZV8yZF90cmFjayA9IE5VTEw7CisgICAgY3BsLT5tYWluX2F1ZGlvX3RyYWNrX2NvdW50ID0gMDsK KyAgICBjcGwtPm1haW5fYXVkaW9fdHJhY2tzID0gTlVMTDsKK30KKworRkZJTUZDUEwgKmZmX2lt Zl9jcGxfYWxsb2Modm9pZCkKK3sKKyAgICBGRklNRkNQTCAqY3BsOworCisgICAgY3BsID0gYXZf bWFsbG9jKHNpemVvZihGRklNRkNQTCkpOworICAgIGlmICghY3BsKQorICAgICAgICByZXR1cm4g TlVMTDsKKyAgICBpbWZfY3BsX2luaXQoY3BsKTsKKyAgICByZXR1cm4gY3BsOworfQorCit2b2lk IGZmX2ltZl9jcGxfZnJlZShGRklNRkNQTCAqY3BsKQoreworICAgIGlmICghY3BsKQorICAgICAg ICByZXR1cm47CisgICAgeG1sRnJlZShjcGwtPmNvbnRlbnRfdGl0bGVfdXRmOCk7CisgICAgaW1m X21hcmtlcl92aXJ0dWFsX3RyYWNrX2ZyZWUoY3BsLT5tYWluX21hcmtlcnNfdHJhY2spOworICAg IGlmIChjcGwtPm1haW5fbWFya2Vyc190cmFjaykKKyAgICAgICAgYXZfZnJlZXAoJmNwbC0+bWFp bl9tYXJrZXJzX3RyYWNrKTsKKyAgICBpbWZfdHJhY2tmaWxlX3ZpcnR1YWxfdHJhY2tfZnJlZShj cGwtPm1haW5faW1hZ2VfMmRfdHJhY2spOworICAgIGlmIChjcGwtPm1haW5faW1hZ2VfMmRfdHJh Y2spCisgICAgICAgIGF2X2ZyZWVwKCZjcGwtPm1haW5faW1hZ2VfMmRfdHJhY2spOworICAgIGZv ciAodWludDMyX3QgaSA9IDA7IGkgPCBjcGwtPm1haW5fYXVkaW9fdHJhY2tfY291bnQ7IGkrKykK KyAgICAgICAgaW1mX3RyYWNrZmlsZV92aXJ0dWFsX3RyYWNrX2ZyZWUoJmNwbC0+bWFpbl9hdWRp b190cmFja3NbaV0pOworICAgIGlmIChjcGwtPm1haW5fYXVkaW9fdHJhY2tzKQorICAgICAgICBh dl9mcmVlcCgmY3BsLT5tYWluX2F1ZGlvX3RyYWNrcyk7CisgICAgYXZfZnJlZXAoJmNwbCk7Cit9 CisKK2ludCBmZl9pbWZfcGFyc2VfY3BsKEFWSU9Db250ZXh0ICppbiwgRkZJTUZDUEwgKipjcGwp Cit7CisgICAgQVZCUHJpbnQgYnVmOworICAgIHhtbERvYyAqZG9jID0gTlVMTDsKKyAgICBpbnQg cmV0ID0gMDsKKyAgICBpbnQ2NF90IGZpbGVzaXplID0gMDsKKworICAgIGZpbGVzaXplID0gYXZp b19zaXplKGluKTsKKyAgICBmaWxlc2l6ZSA9IGZpbGVzaXplID4gMCA/IGZpbGVzaXplIDogODE5 MjsKKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCBmaWxlc2l6ZSArIDEsIEFWX0JQUklOVF9TSVpF X1VOTElNSVRFRCk7CisgICAgcmV0ID0gYXZpb19yZWFkX3RvX2JwcmludChpbiwgJmJ1ZiwgVUlO VF9NQVggLSAxKTsKKyAgICBpZiAocmV0IDwgMCB8fCAhYXZpb19mZW9mKGluKSB8fCBidWYubGVu ID09IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCByZWFk IElNRiBDUExcbiIpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIHJldCA9 IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBM SUJYTUxfVEVTVF9WRVJTSU9OCisgICAgICAgIGZpbGVzaXplID0gYnVmLmxlbjsKKyAgICAgICAg ZG9jID0geG1sUmVhZE1lbW9yeShidWYuc3RyLCBmaWxlc2l6ZSwgTlVMTCwgTlVMTCwgMCk7Cisg ICAgICAgIGlmICghZG9jKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwKKyAgICAgICAgICAg ICAgICBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgIlhNTCBwYXJzaW5nIGZhaWxlZCB3 aGVuIHJlYWRpbmcgdGhlIElNRiBDUExcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9J TlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID0gZmZfaW1mX3BhcnNlX2Nw bF9mcm9tX3htbF9kb20oZG9jLCBjcGwpKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZf TE9HX0VSUk9SLCAiQ2Fubm90IHBhcnNlIElNRiBDUExcbiIpOworICAgICAgICB9IGVsc2Ugewor ICAgICAgICAgICAgYXZfbG9nKE5VTEwsCisgICAgICAgICAgICAgICAgQVZfTE9HX0lORk8sCisg ICAgICAgICAgICAgICAgIklNRiBDUEwgQ29udGVudFRpdGxlOiAlc1xuIiwKKyAgICAgICAgICAg ICAgICAoKmNwbCktPmNvbnRlbnRfdGl0bGVfdXRmOCk7CisgICAgICAgICAgICBhdl9sb2coTlVM TCwKKyAgICAgICAgICAgICAgICBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAiSU1GIENQ TCBJZDogIiBGRl9JTUZfVVVJRF9GT1JNQVQgIlxuIiwKKyAgICAgICAgICAgICAgICBVSURfQVJH KCgqY3BsKS0+aWRfdXVpZCkpOworICAgICAgICB9CisgICAgICAgIHhtbEZyZWVEb2MoZG9jKTsK KyAgICB9CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworCisgICAgcmV0dXJu IHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ltZmRlYy5jIGIvbGliYXZmb3JtYXQv aW1mZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uYzc0NWI4YmQ5 YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2ltZmRlYy5jCkBAIC0wLDAgKzEsODkx IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExl c3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91 IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1 YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUg RnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG aWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKgorICog Q29weXJpZ2h0IChjKSBTYW5kZmxvdyBDb25zdWx0aW5nIExMQworICoKKyAqIFJlZGlzdHJpYnV0 aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu ZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAg bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJl ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w eXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIg bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU T1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisg KiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIg T1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7 IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG IEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisv KioKKyAqIERlbXV4ZXMgYW4gSU1GIENvbXBvc2l0aW9uCisgKgorICogUmVmZXJlbmNlcworICog T1YgMjA2Ny0wOjIwMTggLSBTTVBURSBPdmVydmlldyBEb2N1bWVudCAtIEludGVyb3BlcmFibGUg TWFzdGVyIEZvcm1hdAorICogU1QgMjA2Ny0yOjIwMjAgLSBTTVBURSBTdGFuZGFyZCAtIEludGVy b3BlcmFibGUgTWFzdGVyIEZvcm1hdCDigJQgQ29yZSBDb25zdHJhaW50cworICogU1QgMjA2Ny0z OjIwMjAgLSBTTVBURSBTdGFuZGFyZCAtIEludGVyb3BlcmFibGUgTWFzdGVyIEZvcm1hdCDigJQg Q29tcG9zaXRpb24gUGxheWxpc3QKKyAqIFNUIDIwNjctNToyMDIwIC0gU01QVEUgU3RhbmRhcmQg LSBJbnRlcm9wZXJhYmxlIE1hc3RlciBGb3JtYXQg4oCUIEVzc2VuY2UgQ29tcG9uZW50CisgKiBT VCAyMDY3LTIwOjIwMTYgLSBTTVBURSBTdGFuZGFyZCAtIEludGVyb3BlcmFibGUgTWFzdGVyIEZv cm1hdCDigJQgQXBwbGljYXRpb24gIzIKKyAqIFNUIDIwNjctMjE6MjAyMCAtIFNNUFRFIFN0YW5k YXJkIC0gSW50ZXJvcGVyYWJsZSBNYXN0ZXIgRm9ybWF0IOKAlCBBcHBsaWNhdGlvbiAjMiBFeHRl bmRlZAorICogU1QgMjA2Ny0xMDI6MjAxNyAtIFNNUFRFIFN0YW5kYXJkIC0gSW50ZXJvcGVyYWJs ZSBNYXN0ZXIgRm9ybWF0IOKAlCBDb21tb24gSW1hZ2UgUGl4ZWwgQ29sb3IgU2NoZW1lcworICog U1QgNDI5LTk6MjAwNyAtIFNNUFRFIFN0YW5kYXJkIC0gRC1DaW5lbWEgUGFja2FnaW5nIOKAlCBB c3NldCBNYXBwaW5nIGFuZCBGaWxlIFNlZ21lbnRhdGlvbgorICoKKyAqIEBhdXRob3IgTWFyYy1B bnRvaW5lIEFybmF1ZAorICogQGF1dGhvciBWYWxlbnRpbiBOb2VsCisgKiBAYXV0aG9yIE5pY2hv bGFzIFZhbmRlcnp3ZXQKKyAqIEBmaWxlCisgKiBAaW5ncm91cCBsYXZ1X2ltZgorICovCisKKyNp bmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW1mLmgiCisjaW5jbHVkZSAiaW50 ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJh dnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgIm14 Zi5oIgorI2luY2x1ZGUgInVybC5oIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8 bGlieG1sL3BhcnNlci5oPgorCisjZGVmaW5lIE1BWF9CUFJJTlRfUkVBRF9TSVpFIChVSU5UX01B WCAtIDEpCisjZGVmaW5lIERFRkFVTFRfQVNTRVRNQVBfU0laRSA4ICogMTAyNAorI2RlZmluZSBB VlJBVElPTkFMX0ZPUk1BVCAiJWQvJWQiCisjZGVmaW5lIEFWUkFUSU9OQUxfQVJHKHJhdGlvbmFs KSByYXRpb25hbC5udW0sIHJhdGlvbmFsLmRlbgorCisvKioKKyAqIElNRiBBc3NldCBsb2NhdG9y CisgKi8KK3R5cGVkZWYgc3RydWN0IElNRkFzc2V0TG9jYXRvciB7CisgICAgRkZJTUZVVUlEIHV1 aWQ7CisgICAgY2hhciAqYWJzb2x1dGVfdXJpOworfSBJTUZBc3NldExvY2F0b3I7CisKKy8qKgor ICogSU1GIEFzc2V0IGxvY2F0b3IgbWFwCisgKiBSZXN1bHRzIGZyb20gdGhlIHBhcnNpbmcgb2Yg b25lIG9yIG1vcmUgQVNTRVRNQVAgWE1MIGZpbGVzCisgKi8KK3R5cGVkZWYgc3RydWN0IElNRkFz c2V0TG9jYXRvck1hcCB7CisgICAgdWludDMyX3QgYXNzZXRfY291bnQ7CisgICAgSU1GQXNzZXRM b2NhdG9yICphc3NldHM7Cit9IElNRkFzc2V0TG9jYXRvck1hcDsKKwordHlwZWRlZiBzdHJ1Y3Qg SU1GVmlydHVhbFRyYWNrUmVzb3VyY2VQbGF5YmFja0N0eCB7CisgICAgSU1GQXNzZXRMb2NhdG9y ICpsb2NhdG9yOworICAgIEZGSU1GVHJhY2tGaWxlUmVzb3VyY2UgKnJlc291cmNlOworICAgIEFW Rm9ybWF0Q29udGV4dCAqY3R4OworfSBJTUZWaXJ0dWFsVHJhY2tSZXNvdXJjZVBsYXliYWNrQ3R4 OworCit0eXBlZGVmIHN0cnVjdCBJTUZWaXJ0dWFsVHJhY2tQbGF5YmFja0N0eCB7CisgICAgLy8g VHJhY2sgaW5kZXggaW4gcGxheWxpc3QKKyAgICBpbnQzMl90IGluZGV4OworICAgIC8vIFRpbWUg Y291bnRlcnMKKyAgICBBVlJhdGlvbmFsIGN1cnJlbnRfdGltZXN0YW1wOworICAgIEFWUmF0aW9u YWwgZHVyYXRpb247CisgICAgLy8gUmVzb3VyY2VzCisgICAgdWludDMyX3QgcmVzb3VyY2VfY291 bnQ7CisgICAgdW5zaWduZWQgaW50IHJlc291cmNlc19hbGxvY19zejsKKyAgICBJTUZWaXJ0dWFs VHJhY2tSZXNvdXJjZVBsYXliYWNrQ3R4ICpyZXNvdXJjZXM7CisgICAgLy8gRGVjb2RpbmcgY3Vy c29ycworICAgIHVpbnQzMl90IGN1cnJlbnRfcmVzb3VyY2VfaW5kZXg7CisgICAgaW50NjRfdCBs YXN0X3B0czsKK30gSU1GVmlydHVhbFRyYWNrUGxheWJhY2tDdHg7CisKK3R5cGVkZWYgc3RydWN0 IElNRkNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGNvbnN0IGNoYXIg KmJhc2VfdXJsOworICAgIGNoYXIgKmFzc2V0X21hcF9wYXRoczsKKyAgICBBVklPSW50ZXJydXB0 Q0IgKmludGVycnVwdF9jYWxsYmFjazsKKyAgICBBVkRpY3Rpb25hcnkgKmF2aW9fb3B0czsKKyAg ICBGRklNRkNQTCAqY3BsOworICAgIElNRkFzc2V0TG9jYXRvck1hcCBhc3NldF9sb2NhdG9yX21h cDsKKyAgICB1aW50MzJfdCB0cmFja19jb3VudDsKKyAgICBJTUZWaXJ0dWFsVHJhY2tQbGF5YmFj a0N0eCAqKnRyYWNrczsKK30gSU1GQ29udGV4dDsKKworc3RhdGljIGludCBpbWZfdXJpX2lzX3Vy bChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgcmV0dXJuIHN0cnN0cihzdHJpbmcsICI6Ly8i KSAhPSBOVUxMOworfQorCitzdGF0aWMgaW50IGltZl91cmlfaXNfdW5peF9hYnNfcGF0aChjb25z dCBjaGFyICpzdHJpbmcpCit7CisgICAgcmV0dXJuIHN0cmluZ1swXSA9PSAnLyc7Cit9CisKK3N0 YXRpYyBpbnQgaW1mX3VyaV9pc19kb3NfYWJzX3BhdGgoY29uc3QgY2hhciAqc3RyaW5nKQorewor ICAgIC8qIEFic29sdXRlIHBhdGggY2FzZTogYEM6XHBhdGhcdG9cc29td2hlcmVgICovCisgICAg aWYgKHN0cmluZ1sxXSA9PSAnOicgJiYgc3RyaW5nWzJdID09ICdcXCcpCisgICAgICAgIHJldHVy biAxOworCisgICAgLyogQWJzb2x1dGUgcGF0aCBjYXNlOiBgQzovcGF0aC90by9zb213aGVyZWAg Ki8KKyAgICBpZiAoc3RyaW5nWzFdID09ICc6JyAmJiBzdHJpbmdbMl0gPT0gJy8nKQorICAgICAg ICByZXR1cm4gMTsKKworICAgIC8qIE5ldHdvcmsgcGF0aCBjYXNlOiBgXFxwYXRoXHRvXHNvbXdo ZXJlYCAqLworICAgIGlmIChzdHJpbmdbMF0gPT0gJ1xcJyAmJiBzdHJpbmdbMV0gPT0gJ1xcJykK KyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBQYXJzZSBh IEFTU0VUTUFQIFhNTCBmaWxlIHRvIGV4dHJhY3QgdGhlIFVVSUQtVVJJIG1hcHBpbmcgb2YgYXNz ZXRzLgorICogQHBhcmFtIHMgdGhlIGN1cnJlbnQgZm9ybWF0IGNvbnRleHQsIGlmIGFueSAoY2Fu IGJlIE5VTEwpLgorICogQHBhcmFtIGRvYyB0aGUgWE1MIGRvY3VtZW50IHRvIGJlIHBhcnNlZC4K KyAqIEBwYXJhbSBhc3NldF9tYXAgcG9pbnRlciBvbiB0aGUgSU1GQXNzZXRMb2NhdG9yTWFwIHRv IGZpbGwuCisgKiBAcGFyYW0gYmFzZV91cmwgdGhlIHVybCBvZiB0aGUgYXNzZXQgbWFwIFhNTCBm aWxlLCBpZiBhbnkgKGNhbiBiZSBOVUxMKS4KKyAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBp biBjYXNlIG9mIGVycm9yLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBwYXJzZV9pbWZf YXNzZXRfbWFwX2Zyb21feG1sX2RvbShBVkZvcm1hdENvbnRleHQgKnMsCisgICAgeG1sRG9jUHRy IGRvYywKKyAgICBJTUZBc3NldExvY2F0b3JNYXAgKmFzc2V0X21hcCwKKyAgICBjb25zdCBjaGFy ICpiYXNlX3VybCkKK3sKKyAgICB4bWxOb2RlUHRyIGFzc2V0X21hcF9lbGVtZW50ID0gTlVMTDsK KyAgICB4bWxOb2RlUHRyIG5vZGUgPSBOVUxMOworICAgIHhtbE5vZGVQdHIgYXNzZXRfZWxlbWVu dCA9IE5VTEw7CisgICAgdW5zaWduZWQgbG9uZyBlbGVtX2NvdW50OworICAgIGNoYXIgKnVyaTsK KyAgICBpbnQgcmV0ID0gMDsKKyAgICBJTUZBc3NldExvY2F0b3IgKmFzc2V0ID0gTlVMTDsKKyAg ICB2b2lkICp0bXA7CisKKyAgICBhc3NldF9tYXBfZWxlbWVudCA9IHhtbERvY0dldFJvb3RFbGVt ZW50KGRvYyk7CisKKyAgICBpZiAoIWFzc2V0X21hcF9lbGVtZW50KSB7CisgICAgICAgIGF2X2xv ZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcGFyc2UgYXNzZXQgbWFwIFhNTCAtIG1pc3Np bmcgcm9vdCBub2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cisg ICAgfQorCisgICAgaWYgKGFzc2V0X21hcF9lbGVtZW50LT50eXBlICE9IFhNTF9FTEVNRU5UX05P REUgfHwgYXZfc3RyY2FzZWNtcChhc3NldF9tYXBfZWxlbWVudC0+bmFtZSwgIkFzc2V0TWFwIikp IHsKKyAgICAgICAgYXZfbG9nKHMsCisgICAgICAgICAgICBBVl9MT0dfRVJST1IsCisgICAgICAg ICAgICAiVW5hYmxlIHRvIHBhcnNlIGFzc2V0IG1hcCBYTUwgLSB3cm9uZyByb290IG5vZGUgbmFt ZVslc10gdHlwZVslZF1cbiIsCisgICAgICAgICAgICBhc3NldF9tYXBfZWxlbWVudC0+bmFtZSwK KyAgICAgICAgICAgIChpbnQpYXNzZXRfbWFwX2VsZW1lbnQtPnR5cGUpOworICAgICAgICByZXR1 cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBwYXJzZSBhc3NldCBsb2Nh dG9ycyAqLworICAgIGlmICghKG5vZGUgPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5 X25hbWUoYXNzZXRfbWFwX2VsZW1lbnQsICJBc3NldExpc3QiKSkpIHsKKyAgICAgICAgYXZfbG9n KHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSBhc3NldCBtYXAgWE1MIC0gbWlzc2lu ZyBBc3NldExpc3Qgbm9kZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRB OworICAgIH0KKyAgICBlbGVtX2NvdW50ID0geG1sQ2hpbGRFbGVtZW50Q291bnQobm9kZSk7Cisg ICAgaWYgKGVsZW1fY291bnQgPiBVSU5UMzJfTUFYCisgICAgICAgIHx8IGFzc2V0X21hcC0+YXNz ZXRfY291bnQgPiBVSU5UMzJfTUFYIC0gZWxlbV9jb3VudCkKKyAgICAgICAgcmV0dXJuIEFWRVJS T1IoRU5PTUVNKTsKKyAgICB0bXAgPSBhdl9yZWFsbG9jX2FycmF5KGFzc2V0X21hcC0+YXNzZXRz LAorICAgICAgICBlbGVtX2NvdW50ICsgYXNzZXRfbWFwLT5hc3NldF9jb3VudCwKKyAgICAgICAg c2l6ZW9mKElNRkFzc2V0TG9jYXRvcikpOworICAgIGlmICghdG1wKSB7CisgICAgICAgIGF2X2xv ZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgSU1GIGFzc2V0IGxvY2F0b3Jz XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXNzZXRf bWFwLT5hc3NldHMgPSB0bXA7CisKKyAgICBhc3NldF9lbGVtZW50ID0geG1sRmlyc3RFbGVtZW50 Q2hpbGQobm9kZSk7CisgICAgd2hpbGUgKGFzc2V0X2VsZW1lbnQpIHsKKyAgICAgICAgaWYgKGF2 X3N0cmNhc2VjbXAoYXNzZXRfZWxlbWVudC0+bmFtZSwgIkFzc2V0IikgIT0gMCkKKyAgICAgICAg ICAgIGNvbnRpbnVlOworCisgICAgICAgIGFzc2V0ID0gJihhc3NldF9tYXAtPmFzc2V0c1thc3Nl dF9tYXAtPmFzc2V0X2NvdW50XSk7CisKKyAgICAgICAgaWYgKGZmX2ltZl94bWxfcmVhZF91dWlk KGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZShhc3NldF9lbGVtZW50LCAiSWQi KSwgYXNzZXQtPnV1aWQpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAi Q291bGQgbm90IHBhcnNlIFVVSUQgZnJvbSBhc3NldCBpbiBhc3NldCBtYXAuXG4iKTsKKyAgICAg ICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAg YXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkZvdW5kIGFzc2V0IGlkOiAiIEZGX0lNRl9VVUlEX0ZP Uk1BVCAiXG4iLCBVSURfQVJHKGFzc2V0LT51dWlkKSk7CisKKyAgICAgICAgaWYgKCEobm9kZSA9 IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZShhc3NldF9lbGVtZW50LCAiQ2h1 bmtMaXN0IikpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxl IHRvIHBhcnNlIGFzc2V0IG1hcCBYTUwgLSBtaXNzaW5nIENodW5rTGlzdCBub2RlXG4iKTsKKyAg ICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAg ICAgaWYgKCEobm9kZSA9IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZShub2Rl LCAiQ2h1bmsiKSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFi bGUgdG8gcGFyc2UgYXNzZXQgbWFwIFhNTCAtIG1pc3NpbmcgQ2h1bmsgbm9kZVxuIik7CisgICAg ICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAg IHVyaSA9IHhtbE5vZGVHZXRDb250ZW50KGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlf bmFtZShub2RlLCAiUGF0aCIpKTsKKyAgICAgICAgaWYgKCFpbWZfdXJpX2lzX3VybCh1cmkpICYm ICFpbWZfdXJpX2lzX3VuaXhfYWJzX3BhdGgodXJpKSAmJiAhaW1mX3VyaV9pc19kb3NfYWJzX3Bh dGgodXJpKSkKKyAgICAgICAgICAgIGFzc2V0LT5hYnNvbHV0ZV91cmkgPSBhdl9hcHBlbmRfcGF0 aF9jb21wb25lbnQoYmFzZV91cmwsIHVyaSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFz c2V0LT5hYnNvbHV0ZV91cmkgPSBhdl9zdHJkdXAodXJpKTsKKyAgICAgICAgeG1sRnJlZSh1cmkp OworICAgICAgICBpZiAoIWFzc2V0LT5hYnNvbHV0ZV91cmkpIHsKKyAgICAgICAgICAgIHJldHVy biBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2cocywgQVZfTE9H X0RFQlVHLCAiRm91bmQgYXNzZXQgYWJzb2x1dGUgVVJJOiAlc1xuIiwgYXNzZXQtPmFic29sdXRl X3VyaSk7CisKKyAgICAgICAgYXNzZXRfbWFwLT5hc3NldF9jb3VudCsrOworICAgICAgICBhc3Nl dF9lbGVtZW50ID0geG1sTmV4dEVsZW1lbnRTaWJsaW5nKGFzc2V0X2VsZW1lbnQpOworICAgIH0K KworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYW4gSU1GQXNzZXRM b2NhdG9yTWFwIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgaW1mX2Fzc2V0X2xvY2F0b3Jf bWFwX2luaXQoSU1GQXNzZXRMb2NhdG9yTWFwICphc3NldF9tYXApCit7CisgICAgYXNzZXRfbWFw LT5hc3NldHMgPSBOVUxMOworICAgIGFzc2V0X21hcC0+YXNzZXRfY291bnQgPSAwOworfQorCisv KioKKyAqIEZyZWUgYSBJTUZBc3NldExvY2F0b3JNYXAgcG9pbnRlci4KKyAqLworc3RhdGljIHZv aWQgaW1mX2Fzc2V0X2xvY2F0b3JfbWFwX2RlaW5pdChJTUZBc3NldExvY2F0b3JNYXAgKmFzc2V0 X21hcCkKK3sKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXNzZXRfbWFwLT5hc3NldF9j b3VudDsgKytpKQorICAgICAgICBhdl9mcmVlcCgmYXNzZXRfbWFwLT5hc3NldHNbaV0uYWJzb2x1 dGVfdXJpKTsKKyAgICBhdl9mcmVlcCgmYXNzZXRfbWFwLT5hc3NldHMpOworfQorCitzdGF0aWMg aW50IHBhcnNlX2Fzc2V0bWFwKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqdXJsKQor eworICAgIElNRkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKmlu ID0gTlVMTDsKKyAgICBzdHJ1Y3QgQVZCUHJpbnQgYnVmOworICAgIEFWRGljdGlvbmFyeSAqb3B0 cyA9IE5VTEw7CisgICAgeG1sRG9jICpkb2MgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKmJhc2Vf dXJsOworICAgIGNoYXIgKnRtcF9zdHIgPSBOVUxMOworICAgIGludCByZXQ7CisgICAgaW50NjRf dCBmaWxlc2l6ZTsKKworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJBc3NldCBNYXAgVVJM OiAlc1xuIiwgdXJsKTsKKworICAgIGF2X2RpY3RfY29weSgmb3B0cywgYy0+YXZpb19vcHRzLCAw KTsKKyAgICByZXQgPSBzLT5pb19vcGVuKHMsICZpbiwgdXJsLCBBVklPX0ZMQUdfUkVBRCwgJm9w dHMpOworICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAg IHJldHVybiByZXQ7CisKKyAgICBmaWxlc2l6ZSA9IGF2aW9fc2l6ZShpbik7CisgICAgZmlsZXNp emUgPSBmaWxlc2l6ZSA+IDAgPyBmaWxlc2l6ZSA6IERFRkFVTFRfQVNTRVRNQVBfU0laRTsKKwor ICAgIGF2X2JwcmludF9pbml0KCZidWYsIGZpbGVzaXplICsgMSwgQVZfQlBSSU5UX1NJWkVfVU5M SU1JVEVEKTsKKworICAgIHJldCA9IGF2aW9fcmVhZF90b19icHJpbnQoaW4sICZidWYsIE1BWF9C UFJJTlRfUkVBRF9TSVpFKTsKKyAgICBpZiAocmV0IDwgMCB8fCAhYXZpb19mZW9mKGluKSB8fCBi dWYubGVuID09IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0 byByZWFkIHRvIGFzc2V0IG1hcCAnJXMnXG4iLCB1cmwpOworICAgICAgICBpZiAocmV0ID09IDAp CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGNs ZWFuX3VwOworICAgIH0KKworICAgIExJQlhNTF9URVNUX1ZFUlNJT04KKworICAgIHRtcF9zdHIg PSBhdl9zdHJkdXAodXJsKTsKKyAgICBpZiAoIXRtcF9zdHIpIHsKKyAgICAgICAgcmV0ID0gQVZF UlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGNsZWFuX3VwOworICAgIH0KKyAgICBiYXNlX3Vy bCA9IGF2X2Rpcm5hbWUodG1wX3N0cik7CisKKyAgICBmaWxlc2l6ZSA9IGJ1Zi5sZW47CisgICAg ZG9jID0geG1sUmVhZE1lbW9yeShidWYuc3RyLCBmaWxlc2l6ZSwgdXJsLCBOVUxMLCAwKTsKKwor ICAgIHJldCA9IHBhcnNlX2ltZl9hc3NldF9tYXBfZnJvbV94bWxfZG9tKHMsIGRvYywgJmMtPmFz c2V0X2xvY2F0b3JfbWFwLCBiYXNlX3VybCk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIGF2X2xv ZyhzLAorICAgICAgICAgICAgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgIkZvdW5kICVkIGFz c2V0cyBmcm9tICVzXG4iLAorICAgICAgICAgICAgYy0+YXNzZXRfbG9jYXRvcl9tYXAuYXNzZXRf Y291bnQsCisgICAgICAgICAgICB1cmwpOworCisgICAgeG1sRnJlZURvYyhkb2MpOworCitjbGVh bl91cDoKKyAgICBpZiAodG1wX3N0cikKKyAgICAgICAgYXZfZnJlZXAoJnRtcF9zdHIpOworICAg IGZmX2Zvcm1hdF9pb19jbG9zZShzLCAmaW4pOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVm LCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgSU1GQXNzZXRMb2NhdG9yICpm aW5kX2Fzc2V0X21hcF9sb2NhdG9yKElNRkFzc2V0TG9jYXRvck1hcCAqYXNzZXRfbWFwLCBGRklN RlVVSUQgdXVpZCkKK3sKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXNzZXRfbWFwLT5h c3NldF9jb3VudDsgKytpKQorICAgICAgICBpZiAobWVtY21wKGFzc2V0X21hcC0+YXNzZXRzW2ld LnV1aWQsIHV1aWQsIDE2KSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICYoYXNzZXRfbWFwLT5h c3NldHNbaV0pOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG9wZW5fdHJhY2tf cmVzb3VyY2VfY29udGV4dChBVkZvcm1hdENvbnRleHQgKnMsCisgICAgSU1GVmlydHVhbFRyYWNr UmVzb3VyY2VQbGF5YmFja0N0eCAqdHJhY2tfcmVzb3VyY2UpCit7CisgICAgSU1GQ29udGV4dCAq YyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQ2NF90IGVudHJ5X3Bv aW50OworICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CisKKyAgICBpZiAodHJhY2tfcmVz b3VyY2UtPmN0eCkgeworICAgICAgICBhdl9sb2cocywKKyAgICAgICAgICAgIEFWX0xPR19ERUJV RywKKyAgICAgICAgICAgICJJbnB1dCBjb250ZXh0IGFscmVhZHkgb3BlbmVkIGZvciAlcy5cbiIs CisgICAgICAgICAgICB0cmFja19yZXNvdXJjZS0+bG9jYXRvci0+YWJzb2x1dGVfdXJpKTsKKyAg ICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdHJhY2tfcmVzb3VyY2UtPmN0eCA9IGF2Zm9y bWF0X2FsbG9jX2NvbnRleHQoKTsKKyAgICBpZiAoIXRyYWNrX3Jlc291cmNlLT5jdHgpCisgICAg ICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB0cmFja19yZXNvdXJjZS0+Y3R4LT5p b19vcGVuID0gcy0+aW9fb3BlbjsKKyAgICB0cmFja19yZXNvdXJjZS0+Y3R4LT5pb19jbG9zZSA9 IHMtPmlvX2Nsb3NlOworICAgIHRyYWNrX3Jlc291cmNlLT5jdHgtPmlvX2Nsb3NlMiA9IHMtPmlv X2Nsb3NlMjsKKyAgICB0cmFja19yZXNvdXJjZS0+Y3R4LT5mbGFncyB8PSBzLT5mbGFncyAmIH5B VkZNVF9GTEFHX0NVU1RPTV9JTzsKKworICAgIGlmICgocmV0ID0gZmZfY29weV93aGl0ZWJsYWNr bGlzdHModHJhY2tfcmVzb3VyY2UtPmN0eCwgcykpIDwgMCkKKyAgICAgICAgZ290byBjbGVhbnVw OworCisgICAgaWYgKHJldCA9IGF2X29wdF9zZXQodHJhY2tfcmVzb3VyY2UtPmN0eCwgImZvcm1h dF93aGl0ZWxpc3QiLCAibXhmIiwgMCkpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIGlm ICgocmV0ID0gYXZfZGljdF9jb3B5KCZvcHRzLCBjLT5hdmlvX29wdHMsIDApKSA8IDApCisgICAg ICAgIGdvdG8gY2xlYW51cDsKKworICAgIHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJnRyYWNr X3Jlc291cmNlLT5jdHgsCisgICAgICAgIHRyYWNrX3Jlc291cmNlLT5sb2NhdG9yLT5hYnNvbHV0 ZV91cmksCisgICAgICAgIE5VTEwsCisgICAgICAgICZvcHRzKTsKKyAgICBpZiAocmV0IDwgMCkg eworICAgICAgICBhdl9sb2cocywKKyAgICAgICAgICAgIEFWX0xPR19FUlJPUiwKKyAgICAgICAg ICAgICJDb3VsZCBub3Qgb3BlbiAlcyBpbnB1dCBjb250ZXh0OiAlc1xuIiwKKyAgICAgICAgICAg IHRyYWNrX3Jlc291cmNlLT5sb2NhdG9yLT5hYnNvbHV0ZV91cmksCisgICAgICAgICAgICBhdl9l cnIyc3RyKHJldCkpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGF2X2RpY3Rf ZnJlZSgmb3B0cyk7CisKKyAgICAvKiBDb21wYXJlIHRoZSBzb3VyY2UgdGltZWJhc2UgdG8gdGhl IHJlc291cmNlIGVkaXQgcmF0ZSwgY29uc2lkZXJpbmcgdGhlIGZpcnN0IHN0cmVhbSBvZiB0aGUg c291cmNlIGZpbGUgKi8KKyAgICBpZiAoYXZfY21wX3EodHJhY2tfcmVzb3VyY2UtPmN0eC0+c3Ry ZWFtc1swXS0+dGltZV9iYXNlLCBhdl9pbnZfcSh0cmFja19yZXNvdXJjZS0+cmVzb3VyY2UtPmJh c2UuZWRpdF9yYXRlKSkpCisgICAgICAgIGF2X2xvZyhzLAorICAgICAgICAgICAgQVZfTE9HX1dB Uk5JTkcsCisgICAgICAgICAgICAiSW5jb2hlcmVudCBzb3VyY2Ugc3RyZWFtIHRpbWViYXNlICVk LyVkIHJlZ2FyZGluZyByZXNvdXJjZSBlZGl0IHJhdGU6ICVkLyVkIiwKKyAgICAgICAgICAgIHRy YWNrX3Jlc291cmNlLT5jdHgtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZS5udW0sCisgICAgICAgICAg ICB0cmFja19yZXNvdXJjZS0+Y3R4LT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UuZGVuLAorICAgICAg ICAgICAgdHJhY2tfcmVzb3VyY2UtPnJlc291cmNlLT5iYXNlLmVkaXRfcmF0ZS5kZW4sCisgICAg ICAgICAgICB0cmFja19yZXNvdXJjZS0+cmVzb3VyY2UtPmJhc2UuZWRpdF9yYXRlLm51bSk7CisK KyAgICBlbnRyeV9wb2ludCA9IChpbnQ2NF90KXRyYWNrX3Jlc291cmNlLT5yZXNvdXJjZS0+YmFz ZS5lbnRyeV9wb2ludAorICAgICAgICAqIHRyYWNrX3Jlc291cmNlLT5yZXNvdXJjZS0+YmFzZS5l ZGl0X3JhdGUuZGVuCisgICAgICAgICogQVZfVElNRV9CQVNFCisgICAgICAgIC8gdHJhY2tfcmVz b3VyY2UtPnJlc291cmNlLT5iYXNlLmVkaXRfcmF0ZS5udW07CisKKyAgICBpZiAoZW50cnlfcG9p bnQpIHsKKyAgICAgICAgYXZfbG9nKHMsCisgICAgICAgICAgICBBVl9MT0dfREVCVUcsCisgICAg ICAgICAgICAiU2VlayBhdCByZXNvdXJjZSAlcyBlbnRyeSBwb2ludDogJSIgUFJJdTMyICJcbiIs CisgICAgICAgICAgICB0cmFja19yZXNvdXJjZS0+bG9jYXRvci0+YWJzb2x1dGVfdXJpLAorICAg ICAgICAgICAgdHJhY2tfcmVzb3VyY2UtPnJlc291cmNlLT5iYXNlLmVudHJ5X3BvaW50KTsKKyAg ICAgICAgcmV0ID0gYXZmb3JtYXRfc2Vla19maWxlKHRyYWNrX3Jlc291cmNlLT5jdHgsIC0xLCBl bnRyeV9wb2ludCwgZW50cnlfcG9pbnQsIGVudHJ5X3BvaW50LCAwKTsKKyAgICAgICAgaWYgKHJl dCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLAorICAgICAgICAgICAgICAgIEFWX0xPR19F UlJPUiwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNlZWsgYXQgJSIgUFJJZDY0ICJvbiAl czogJXNcbiIsCisgICAgICAgICAgICAgICAgZW50cnlfcG9pbnQsCisgICAgICAgICAgICAgICAg dHJhY2tfcmVzb3VyY2UtPmxvY2F0b3ItPmFic29sdXRlX3VyaSwKKyAgICAgICAgICAgICAgICBh dl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJnRyYWNr X3Jlc291cmNlLT5jdHgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAg IH0KKworICAgIHJldHVybiAwOworCitjbGVhbnVwOgorICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7 CisgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHRyYWNrX3Jlc291cmNlLT5jdHgpOworICAgIHRy YWNrX3Jlc291cmNlLT5jdHggPSBOVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBp bnQgb3Blbl90cmFja19maWxlX3Jlc291cmNlKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICBGRklN RlRyYWNrRmlsZVJlc291cmNlICp0cmFja19maWxlX3Jlc291cmNlLAorICAgIElNRlZpcnR1YWxU cmFja1BsYXliYWNrQ3R4ICp0cmFjaykKK3sKKyAgICBJTUZDb250ZXh0ICpjID0gcy0+cHJpdl9k YXRhOworICAgIElNRkFzc2V0TG9jYXRvciAqYXNzZXRfbG9jYXRvcjsKKyAgICB2b2lkICp0bXA7 CisgICAgaW50IHJldDsKKworICAgIGFzc2V0X2xvY2F0b3IgPSBmaW5kX2Fzc2V0X21hcF9sb2Nh dG9yKCZjLT5hc3NldF9sb2NhdG9yX21hcCwgdHJhY2tfZmlsZV9yZXNvdXJjZS0+dHJhY2tfZmls ZV91dWlkKTsKKyAgICBpZiAoIWFzc2V0X2xvY2F0b3IpIHsKKyAgICAgICAgYXZfbG9nKHMsCisg ICAgICAgICAgICBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgYXNz ZXQgbG9jYXRvciBmb3IgVVVJRDogIiBGRl9JTUZfVVVJRF9GT1JNQVQgIlxuIiwKKyAgICAgICAg ICAgIFVJRF9BUkcodHJhY2tfZmlsZV9yZXNvdXJjZS0+dHJhY2tfZmlsZV91dWlkKSk7CisgICAg ICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2X2xvZyhzLAor ICAgICAgICBBVl9MT0dfREVCVUcsCisgICAgICAgICJGb3VuZCBsb2NhdG9yIGZvciAiIEZGX0lN Rl9VVUlEX0ZPUk1BVCAiOiAlc1xuIiwKKyAgICAgICAgVUlEX0FSRyhhc3NldF9sb2NhdG9yLT51 dWlkKSwKKyAgICAgICAgYXNzZXRfbG9jYXRvci0+YWJzb2x1dGVfdXJpKTsKKworICAgIGlmICh0 cmFjay0+cmVzb3VyY2VfY291bnQgPiBVSU5UMzJfTUFYIC0gdHJhY2tfZmlsZV9yZXNvdXJjZS0+ YmFzZS5yZXBlYXRfY291bnQKKyAgICAgICAgfHwgKHRyYWNrLT5yZXNvdXJjZV9jb3VudCArIHRy YWNrX2ZpbGVfcmVzb3VyY2UtPmJhc2UucmVwZWF0X2NvdW50KQorICAgICAgICAgICAgPiBJTlRf TUFYIC8gc2l6ZW9mKElNRlZpcnR1YWxUcmFja1Jlc291cmNlUGxheWJhY2tDdHgpKQorICAgICAg ICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHRtcCA9IGF2X2Zhc3RfcmVhbGxvYyh0cmFj ay0+cmVzb3VyY2VzLAorICAgICAgICAmdHJhY2stPnJlc291cmNlc19hbGxvY19zeiwKKyAgICAg ICAgKHRyYWNrLT5yZXNvdXJjZV9jb3VudCArIHRyYWNrX2ZpbGVfcmVzb3VyY2UtPmJhc2UucmVw ZWF0X2NvdW50KQorICAgICAgICAgICAgKiBzaXplb2YoSU1GVmlydHVhbFRyYWNrUmVzb3VyY2VQ bGF5YmFja0N0eCkpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9N RU0pOworICAgIHRyYWNrLT5yZXNvdXJjZXMgPSB0bXA7CisKKyAgICBmb3IgKHVpbnQzMl90IGkg PSAwOyBpIDwgdHJhY2tfZmlsZV9yZXNvdXJjZS0+YmFzZS5yZXBlYXRfY291bnQ7ICsraSkgewor ICAgICAgICBJTUZWaXJ0dWFsVHJhY2tSZXNvdXJjZVBsYXliYWNrQ3R4IHZ0X2N0eDsKKworICAg ICAgICB2dF9jdHgubG9jYXRvciA9IGFzc2V0X2xvY2F0b3I7CisgICAgICAgIHZ0X2N0eC5yZXNv dXJjZSA9IHRyYWNrX2ZpbGVfcmVzb3VyY2U7CisgICAgICAgIHZ0X2N0eC5jdHggPSBOVUxMOwor ICAgICAgICBpZiAoKHJldCA9IG9wZW5fdHJhY2tfcmVzb3VyY2VfY29udGV4dChzLCAmdnRfY3R4 KSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHRyYWNrLT5yZXNvdXJj ZXNbdHJhY2stPnJlc291cmNlX2NvdW50KytdID0gdnRfY3R4OworICAgICAgICB0cmFjay0+ZHVy YXRpb24gPSBhdl9hZGRfcSh0cmFjay0+ZHVyYXRpb24sCisgICAgICAgICAgICBhdl9tYWtlX3Eo KGludCl0cmFja19maWxlX3Jlc291cmNlLT5iYXNlLmR1cmF0aW9uICogdHJhY2tfZmlsZV9yZXNv dXJjZS0+YmFzZS5lZGl0X3JhdGUuZGVuLAorICAgICAgICAgICAgICAgIHRyYWNrX2ZpbGVfcmVz b3VyY2UtPmJhc2UuZWRpdF9yYXRlLm51bSkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQor CitzdGF0aWMgdm9pZCBpbWZfdmlydHVhbF90cmFja19wbGF5YmFja19jb250ZXh0X2RlaW5pdChJ TUZWaXJ0dWFsVHJhY2tQbGF5YmFja0N0eCAqdHJhY2spCit7CisgICAgZm9yICh1aW50MzJfdCBp ID0gMDsgaSA8IHRyYWNrLT5yZXNvdXJjZV9jb3VudDsgKytpKQorICAgICAgICBhdmZvcm1hdF9j bG9zZV9pbnB1dCgmdHJhY2stPnJlc291cmNlc1tpXS5jdHgpOworCisgICAgYXZfZnJlZXAoJnRy YWNrLT5yZXNvdXJjZXMpOworfQorCitzdGF0aWMgaW50IG9wZW5fdmlydHVhbF90cmFjayhBVkZv cm1hdENvbnRleHQgKnMsCisgICAgRkZJTUZUcmFja0ZpbGVWaXJ0dWFsVHJhY2sgKnZpcnR1YWxf dHJhY2ssCisgICAgaW50MzJfdCB0cmFja19pbmRleCkKK3sKKyAgICBJTUZDb250ZXh0ICpjID0g cy0+cHJpdl9kYXRhOworICAgIElNRlZpcnR1YWxUcmFja1BsYXliYWNrQ3R4ICp0cmFjayA9IE5V TEw7CisgICAgdm9pZCAqdG1wOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKCEodHJhY2sg PSBhdl9tYWxsb2N6KHNpemVvZihJTUZWaXJ0dWFsVHJhY2tQbGF5YmFja0N0eCkpKSkKKyAgICAg ICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB0cmFjay0+aW5kZXggPSB0cmFja19pbmRl eDsKKyAgICB0cmFjay0+ZHVyYXRpb24gPSBhdl9tYWtlX3EoMCwgMSk7CisKKyAgICBmb3IgKHVp bnQzMl90IGkgPSAwOyBpIDwgdmlydHVhbF90cmFjay0+cmVzb3VyY2VfY291bnQ7IGkrKykgewor ICAgICAgICBhdl9sb2cocywKKyAgICAgICAgICAgIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAg ICJPcGVuIHN0cmVhbSBmcm9tIGZpbGUgIiBGRl9JTUZfVVVJRF9GT1JNQVQgIiwgc3RyZWFtICVk XG4iLAorICAgICAgICAgICAgVUlEX0FSRyh2aXJ0dWFsX3RyYWNrLT5yZXNvdXJjZXNbaV0udHJh Y2tfZmlsZV91dWlkKSwKKyAgICAgICAgICAgIGkpOworICAgICAgICBpZiAoKHJldCA9IG9wZW5f dHJhY2tfZmlsZV9yZXNvdXJjZShzLCAmdmlydHVhbF90cmFjay0+cmVzb3VyY2VzW2ldLCB0cmFj aykpICE9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLAorICAgICAgICAgICAgICAgIEFWX0xP R19FUlJPUiwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IG9wZW4gaW1hZ2UgdHJhY2sgcmVz b3VyY2UgIiBGRl9JTUZfVVVJRF9GT1JNQVQgIlxuIiwKKyAgICAgICAgICAgICAgICBVSURfQVJH KHZpcnR1YWxfdHJhY2stPnJlc291cmNlc1tpXS50cmFja19maWxlX3V1aWQpKTsKKyAgICAgICAg ICAgIGdvdG8gY2xlYW5fdXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0cmFjay0+Y3VycmVu dF90aW1lc3RhbXAgPSBhdl9tYWtlX3EoMCwgdHJhY2stPmR1cmF0aW9uLmRlbik7CisKKyAgICBp ZiAoYy0+dHJhY2tfY291bnQgPT0gVUlOVDMyX01BWCkgeworICAgICAgICByZXQgPSBBVkVSUk9S KEVOT01FTSk7CisgICAgICAgIGdvdG8gY2xlYW5fdXA7CisgICAgfQorICAgIHRtcCA9IGF2X3Jl YWxsb2NfYXJyYXkoYy0+dHJhY2tzLCBjLT50cmFja19jb3VudCArIDEsIHNpemVvZihJTUZWaXJ0 dWFsVHJhY2tQbGF5YmFja0N0eCAqKSk7CisgICAgaWYgKCF0bXApIHsKKyAgICAgICAgcmV0ID0g QVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGNsZWFuX3VwOworICAgIH0KKyAgICBjLT50 cmFja3MgPSB0bXA7CisgICAgYy0+dHJhY2tzW2MtPnRyYWNrX2NvdW50KytdID0gdHJhY2s7CisK KyAgICByZXR1cm4gMDsKKworY2xlYW5fdXA6CisgICAgaW1mX3ZpcnR1YWxfdHJhY2tfcGxheWJh Y2tfY29udGV4dF9kZWluaXQodHJhY2spOworICAgIGF2X2ZyZWUodHJhY2spOworICAgIHJldHVy biByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvbnRleHRfc3RyZWFtc19mcm9tX3RyYWNrcyhB VkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSU1GQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsK KyAgICBpbnQgcmV0ID0gMDsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjLT50cmFj a19jb3VudDsgKytpKSB7CisgICAgICAgIEFWU3RyZWFtICphc3NldF9zdHJlYW07CisgICAgICAg IEFWU3RyZWFtICpmaXJzdF9yZXNvdXJjZV9zdHJlYW07CisKKyAgICAgICAgLyogT3BlbiB0aGUg Zmlyc3QgcmVzb3VyY2Ugb2YgdGhlIHRyYWNrIHRvIGdldCBzdHJlYW0gaW5mb3JtYXRpb24gKi8K KyAgICAgICAgZmlyc3RfcmVzb3VyY2Vfc3RyZWFtID0gYy0+dHJhY2tzW2ldLT5yZXNvdXJjZXNb MF0uY3R4LT5zdHJlYW1zWzBdOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiT3Bl biB0aGUgZmlyc3QgcmVzb3VyY2Ugb2YgdHJhY2sgJWRcbiIsIGMtPnRyYWNrc1tpXS0+aW5kZXgp OworCisgICAgICAgIC8qIENvcHkgc3RyZWFtIGluZm9ybWF0aW9uICovCisgICAgICAgIGFzc2V0 X3N0cmVhbSA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgICAgIGlmICghYXNz ZXRfc3RyZWFtKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAg ICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBzdHJlYW1cbiIp OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXRfc3RyZWFtLT5p ZCA9IGk7CisgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KGFzc2V0X3N0cmVh bS0+Y29kZWNwYXIsIGZpcnN0X3Jlc291cmNlX3N0cmVhbS0+Y29kZWNwYXIpOworICAgICAgICBp ZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxk IG5vdCBjb3B5IHN0cmVhbSBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7 CisgICAgICAgIH0KKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3NldF9zdHJlYW0sCisg ICAgICAgICAgICBmaXJzdF9yZXNvdXJjZV9zdHJlYW0tPnB0c193cmFwX2JpdHMsCisgICAgICAg ICAgICBmaXJzdF9yZXNvdXJjZV9zdHJlYW0tPnRpbWVfYmFzZS5udW0sCisgICAgICAgICAgICBm aXJzdF9yZXNvdXJjZV9zdHJlYW0tPnRpbWVfYmFzZS5kZW4pOworICAgICAgICBhc3NldF9zdHJl YW0tPmR1cmF0aW9uID0gKGludDY0X3QpYXZfcTJkKGF2X211bF9xKGMtPnRyYWNrc1tpXS0+ZHVy YXRpb24sCisgICAgICAgICAgICBhdl9pbnZfcShhc3NldF9zdHJlYW0tPnRpbWVfYmFzZSkpKTsK KyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcGVuX2NwbF90cmFja3Mo QVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIElNRkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7 CisgICAgaW50MzJfdCB0cmFja19pbmRleCA9IDA7CisgICAgaW50IHJldDsKKworICAgIGlmIChj LT5jcGwtPm1haW5faW1hZ2VfMmRfdHJhY2spCisgICAgICAgIGlmICgocmV0ID0gb3Blbl92aXJ0 dWFsX3RyYWNrKHMsIGMtPmNwbC0+bWFpbl9pbWFnZV8yZF90cmFjaywgdHJhY2tfaW5kZXgrKykp ICE9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLAorICAgICAgICAgICAgICAgIEFWX0xPR19F UlJPUiwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IG9wZW4gaW1hZ2UgdHJhY2sgIiBGRl9J TUZfVVVJRF9GT1JNQVQgIlxuIiwKKyAgICAgICAgICAgICAgICBVSURfQVJHKGMtPmNwbC0+bWFp bl9pbWFnZV8yZF90cmFjay0+YmFzZS5pZF91dWlkKSk7CisgICAgICAgICAgICByZXR1cm4gcmV0 OworICAgICAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYy0+Y3BsLT5tYWlu X2F1ZGlvX3RyYWNrX2NvdW50OyArK2kpCisgICAgICAgIGlmICgocmV0ID0gb3Blbl92aXJ0dWFs X3RyYWNrKHMsICZjLT5jcGwtPm1haW5fYXVkaW9fdHJhY2tzW2ldLCB0cmFja19pbmRleCsrKSkg IT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsCisgICAgICAgICAgICAgICAgQVZfTE9HX0VS Uk9SLAorICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgb3BlbiBhdWRpbyB0cmFjayAiIEZGX0lN Rl9VVUlEX0ZPUk1BVCAiXG4iLAorICAgICAgICAgICAgICAgIFVJRF9BUkcoYy0+Y3BsLT5tYWlu X2F1ZGlvX3RyYWNrc1tpXS5iYXNlLmlkX3V1aWQpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7 CisgICAgICAgIH0KKworICAgIHJldHVybiBzZXRfY29udGV4dF9zdHJlYW1zX2Zyb21fdHJhY2tz KHMpOworfQorCitzdGF0aWMgaW50IGltZl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMp Cit7CisgICAgSU1GQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBjaGFyICphc3NldF9t YXBfcGF0aDsKKyAgICBjaGFyICp0bXBfc3RyOworICAgIGludCByZXQgPSAwOworCisgICAgYy0+ aW50ZXJydXB0X2NhbGxiYWNrID0gJnMtPmludGVycnVwdF9jYWxsYmFjazsKKyAgICB0bXBfc3Ry ID0gYXZfc3RyZHVwKHMtPnVybCk7CisgICAgaWYgKCF0bXBfc3RyKQorICAgICAgICByZXR1cm4g QVZFUlJPUihFTk9NRU0pOworCisgICAgYy0+YmFzZV91cmwgPSBhdl9kaXJuYW1lKHRtcF9zdHIp OworICAgIGlmICgocmV0ID0gZmZpb19jb3B5X3VybF9vcHRpb25zKHMtPnBiLCAmYy0+YXZpb19v cHRzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZfbG9nKHMsIEFWX0xPR19E RUJVRywgInN0YXJ0IHBhcnNpbmcgSU1GIENQTDogJXNcbiIsIHMtPnVybCk7CisKKyAgICBpZiAo KHJldCA9IGZmX2ltZl9wYXJzZV9jcGwocy0+cGIsICZjLT5jcGwpKSA8IDApCisgICAgICAgIHJl dHVybiByZXQ7CisKKyAgICBhdl9sb2cocywKKyAgICAgICAgQVZfTE9HX0RFQlVHLAorICAgICAg ICAicGFyc2VkIElNRiBDUEw6ICIgRkZfSU1GX1VVSURfRk9STUFUICJcbiIsCisgICAgICAgIFVJ RF9BUkcoYy0+Y3BsLT5pZF91dWlkKSk7CisKKyAgICBpZiAoIWMtPmFzc2V0X21hcF9wYXRocykg eworICAgICAgICBjLT5hc3NldF9tYXBfcGF0aHMgPSBhdl9hcHBlbmRfcGF0aF9jb21wb25lbnQo Yy0+YmFzZV91cmwsICJBU1NFVE1BUC54bWwiKTsKKyAgICAgICAgaWYgKCFjLT5hc3NldF9tYXBf cGF0aHMpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAg IHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywg Ik5vIGFzc2V0IG1hcHMgcHJvdmlkZWQsIHVzaW5nIHRoZSBkZWZhdWx0IEFTU0VUTUFQLnhtbFxu Iik7CisgICAgfQorCisgICAgLyogUGFyc2UgZWFjaCBhc3NldCBtYXAgWE1MIGZpbGUgKi8KKyAg ICBpbWZfYXNzZXRfbG9jYXRvcl9tYXBfaW5pdCgmYy0+YXNzZXRfbG9jYXRvcl9tYXApOworICAg IGFzc2V0X21hcF9wYXRoID0gYXZfc3RydG9rKGMtPmFzc2V0X21hcF9wYXRocywgIiwiLCAmdG1w X3N0cik7CisgICAgd2hpbGUgKGFzc2V0X21hcF9wYXRoICE9IE5VTEwpIHsKKyAgICAgICAgYXZf bG9nKHMsIEFWX0xPR19ERUJVRywgInN0YXJ0IHBhcnNpbmcgSU1GIEFzc2V0IE1hcDogJXNcbiIs IGFzc2V0X21hcF9wYXRoKTsKKworICAgICAgICBpZiAocmV0ID0gcGFyc2VfYXNzZXRtYXAocywg YXNzZXRfbWFwX3BhdGgpKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBhc3Nl dF9tYXBfcGF0aCA9IGF2X3N0cnRvayhOVUxMLCAiLCIsICZ0bXBfc3RyKTsKKyAgICB9CisKKyAg ICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAicGFyc2VkIElNRiBBc3NldCBNYXBzXG4iKTsKKwor ICAgIGlmIChyZXQgPSBvcGVuX2NwbF90cmFja3MocykpCisgICAgICAgIHJldHVybiByZXQ7CisK KyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAicGFyc2VkIElNRiBwYWNrYWdlXG4iKTsKKwor ICAgIHJldHVybiAwOworfQorCitzdGF0aWMgSU1GVmlydHVhbFRyYWNrUGxheWJhY2tDdHggKmdl dF9uZXh0X3RyYWNrX3dpdGhfbWluaW11bV90aW1lc3RhbXAoQVZGb3JtYXRDb250ZXh0ICpzKQor eworICAgIElNRkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgSU1GVmlydHVhbFRyYWNr UGxheWJhY2tDdHggKnRyYWNrOworCisgICAgQVZSYXRpb25hbCBtaW5pbXVtX3RpbWVzdGFtcCA9 IGF2X21ha2VfcShJTlQzMl9NQVgsIDEpOworICAgIGZvciAodWludDMyX3QgaSA9IGMtPnRyYWNr X2NvdW50OyBpID4gMDsgaS0tKSB7CisgICAgICAgIGF2X2xvZygKKyAgICAgICAgICAgIHMsCisg ICAgICAgICAgICBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAiQ29tcGFyZSB0cmFjayAlZCB0 aW1lc3RhbXAgIiBBVlJBVElPTkFMX0ZPUk1BVAorICAgICAgICAgICAgIiB0byBtaW5pbXVtICIg QVZSQVRJT05BTF9GT1JNQVQKKyAgICAgICAgICAgICIgKG92ZXIgZHVyYXRpb246ICIgQVZSQVRJ T05BTF9GT1JNQVQKKyAgICAgICAgICAgICIpXG4iLAorICAgICAgICAgICAgaSwKKyAgICAgICAg ICAgIEFWUkFUSU9OQUxfQVJHKGMtPnRyYWNrc1tpIC0gMV0tPmN1cnJlbnRfdGltZXN0YW1wKSwK KyAgICAgICAgICAgIEFWUkFUSU9OQUxfQVJHKG1pbmltdW1fdGltZXN0YW1wKSwKKyAgICAgICAg ICAgIEFWUkFUSU9OQUxfQVJHKGMtPnRyYWNrc1tpIC0gMV0tPmR1cmF0aW9uKSk7CisKKyAgICAg ICAgaWYgKGF2X2NtcF9xKGMtPnRyYWNrc1tpIC0gMV0tPmN1cnJlbnRfdGltZXN0YW1wLCBtaW5p bXVtX3RpbWVzdGFtcCkgPD0gMCkgeworICAgICAgICAgICAgdHJhY2sgPSBjLT50cmFja3NbaSAt IDFdOworICAgICAgICAgICAgbWluaW11bV90aW1lc3RhbXAgPSB0cmFjay0+Y3VycmVudF90aW1l c3RhbXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9sb2cocywKKyAgICAgICAgQVZfTE9H X0RFQlVHLAorICAgICAgICAiRm91bmQgbmV4dCB0cmFjayB0byByZWFkOiAlZCAodGltZXN0YW1w OiAlbGYgLyAlbGYpXG4iLAorICAgICAgICB0cmFjay0+aW5kZXgsCisgICAgICAgIGF2X3EyZCh0 cmFjay0+Y3VycmVudF90aW1lc3RhbXApLAorICAgICAgICBhdl9xMmQobWluaW11bV90aW1lc3Rh bXApKTsKKyAgICByZXR1cm4gdHJhY2s7Cit9CisKK3N0YXRpYyBJTUZWaXJ0dWFsVHJhY2tSZXNv dXJjZVBsYXliYWNrQ3R4ICpnZXRfcmVzb3VyY2VfY29udGV4dF9mb3JfdGltZXN0YW1wKEFWRm9y bWF0Q29udGV4dCAqcywKKyAgICBJTUZWaXJ0dWFsVHJhY2tQbGF5YmFja0N0eCAqdHJhY2spCit7 CisgICAgQVZSYXRpb25hbCBlZGl0X3VuaXRfZHVyYXRpb24gPSBhdl9pbnZfcSh0cmFjay0+cmVz b3VyY2VzWzBdLnJlc291cmNlLT5iYXNlLmVkaXRfcmF0ZSk7CisgICAgQVZSYXRpb25hbCBjdW11 bGF0ZWRfZHVyYXRpb24gPSBhdl9tYWtlX3EoMCwgZWRpdF91bml0X2R1cmF0aW9uLmRlbik7CisK KyAgICBhdl9sb2cocywKKyAgICAgICAgQVZfTE9HX0RFQlVHLAorICAgICAgICAiTG9va2luZyBm b3IgdHJhY2sgJWQgcmVzb3VyY2UgZm9yIHRpbWVzdGFtcCA9ICVsZiAvICVsZlxuIiwKKyAgICAg ICAgdHJhY2stPmluZGV4LAorICAgICAgICBhdl9xMmQodHJhY2stPmN1cnJlbnRfdGltZXN0YW1w KSwKKyAgICAgICAgYXZfcTJkKHRyYWNrLT5kdXJhdGlvbikpOworICAgIGZvciAodWludDMyX3Qg aSA9IDA7IGkgPCB0cmFjay0+cmVzb3VyY2VfY291bnQ7ICsraSkgeworICAgICAgICBjdW11bGF0 ZWRfZHVyYXRpb24gPSBhdl9hZGRfcShjdW11bGF0ZWRfZHVyYXRpb24sCisgICAgICAgICAgICBh dl9tYWtlX3EoKGludCl0cmFjay0+cmVzb3VyY2VzW2ldLnJlc291cmNlLT5iYXNlLmR1cmF0aW9u ICogZWRpdF91bml0X2R1cmF0aW9uLm51bSwKKyAgICAgICAgICAgICAgICBlZGl0X3VuaXRfZHVy YXRpb24uZGVuKSk7CisKKyAgICAgICAgaWYgKGF2X2NtcF9xKGF2X2FkZF9xKHRyYWNrLT5jdXJy ZW50X3RpbWVzdGFtcCwgZWRpdF91bml0X2R1cmF0aW9uKSwgY3VtdWxhdGVkX2R1cmF0aW9uKSA8 PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywKKyAgICAgICAgICAgICAgICBBVl9MT0dfREVC VUcsCisgICAgICAgICAgICAgICAgIkZvdW5kIHJlc291cmNlICVkIGluIHRyYWNrICVkIHRvIHJl YWQgZm9yIHRpbWVzdGFtcCAlbGYgIgorICAgICAgICAgICAgICAgICIob24gY3VtdWxhdGVkPSVs Zik6IGVudHJ5PSUiIFBSSXUzMgorICAgICAgICAgICAgICAgICIsIGR1cmF0aW9uPSUiIFBSSXUz MgorICAgICAgICAgICAgICAgICIsIGVkaXRyYXRlPSIgQVZSQVRJT05BTF9GT1JNQVQKKyAgICAg ICAgICAgICAgICAiIHwgZWRpdF91bml0X2R1cmF0aW9uPSVsZlxuIiwKKyAgICAgICAgICAgICAg ICBpLAorICAgICAgICAgICAgICAgIHRyYWNrLT5pbmRleCwKKyAgICAgICAgICAgICAgICBhdl9x MmQodHJhY2stPmN1cnJlbnRfdGltZXN0YW1wKSwKKyAgICAgICAgICAgICAgICBhdl9xMmQoY3Vt dWxhdGVkX2R1cmF0aW9uKSwKKyAgICAgICAgICAgICAgICB0cmFjay0+cmVzb3VyY2VzW2ldLnJl c291cmNlLT5iYXNlLmVudHJ5X3BvaW50LAorICAgICAgICAgICAgICAgIHRyYWNrLT5yZXNvdXJj ZXNbaV0ucmVzb3VyY2UtPmJhc2UuZHVyYXRpb24sCisgICAgICAgICAgICAgICAgQVZSQVRJT05B TF9BUkcodHJhY2stPnJlc291cmNlc1tpXS5yZXNvdXJjZS0+YmFzZS5lZGl0X3JhdGUpLAorICAg ICAgICAgICAgICAgIGF2X3EyZChlZGl0X3VuaXRfZHVyYXRpb24pKTsKKworICAgICAgICAgICAg aWYgKHRyYWNrLT5jdXJyZW50X3Jlc291cmNlX2luZGV4ICE9IGkpIHsKKyAgICAgICAgICAgICAg ICBhdl9sb2cocywKKyAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0RFQlVHLAorICAgICAgICAg ICAgICAgICAgICAiU3dpdGNoIHJlc291cmNlIG9uIHRyYWNrICVkOiByZS1vcGVuIGNvbnRleHRc biIsCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pbmRleCk7CisgICAgICAgICAgICAgICAg aWYgKG9wZW5fdHJhY2tfcmVzb3VyY2VfY29udGV4dChzLCAmKHRyYWNrLT5yZXNvdXJjZXNbaV0p KSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAg ICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmKHRyYWNrLT5yZXNvdXJjZXNbdHJhY2stPmN1cnJlbnRf cmVzb3VyY2VfaW5kZXhdLmN0eCkpOworICAgICAgICAgICAgICAgIHRyYWNrLT5jdXJyZW50X3Jl c291cmNlX2luZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAmKHRy YWNrLT5yZXNvdXJjZXNbdHJhY2stPmN1cnJlbnRfcmVzb3VyY2VfaW5kZXhdKTsKKyAgICAgICAg fQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBpbWZfcmVhZF9wYWNr ZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIElNRkNvbnRleHQg KmMgPSBzLT5wcml2X2RhdGE7CisgICAgSU1GVmlydHVhbFRyYWNrUmVzb3VyY2VQbGF5YmFja0N0 eCAqcmVzb3VyY2VfdG9fcmVhZCA9IE5VTEw7CisgICAgQVZSYXRpb25hbCBlZGl0X3VuaXRfZHVy YXRpb247CisgICAgaW50IHJldCA9IDA7CisgICAgSU1GVmlydHVhbFRyYWNrUGxheWJhY2tDdHgg KnRyYWNrOworICAgIEZGU3RyZWFtICp0cmFja19zdHJlYW07CisKKyAgICB0cmFjayA9IGdldF9u ZXh0X3RyYWNrX3dpdGhfbWluaW11bV90aW1lc3RhbXAocyk7CisKKyAgICBpZiAoYXZfY21wX3Eo dHJhY2stPmN1cnJlbnRfdGltZXN0YW1wLCB0cmFjay0+ZHVyYXRpb24pID09IDApCisgICAgICAg IHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHJlc291cmNlX3RvX3JlYWQgPSBnZXRfcmVzb3Vy Y2VfY29udGV4dF9mb3JfdGltZXN0YW1wKHMsIHRyYWNrKTsKKworICAgIGlmICghcmVzb3VyY2Vf dG9fcmVhZCkgeworICAgICAgICBlZGl0X3VuaXRfZHVyYXRpb24gPSBhdl9pbnZfcSh0cmFjay0+ cmVzb3VyY2VzW3RyYWNrLT5jdXJyZW50X3Jlc291cmNlX2luZGV4XS5yZXNvdXJjZS0+YmFzZS5l ZGl0X3JhdGUpOworICAgICAgICBpZiAoYXZfY21wX3EoYXZfYWRkX3EodHJhY2stPmN1cnJlbnRf dGltZXN0YW1wLCBlZGl0X3VuaXRfZHVyYXRpb24pLAorICAgICAgICAgICAgICAgIHRyYWNrLT5k dXJhdGlvbikKKyAgICAgICAgICAgID4gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VP RjsKKworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGZpbmQgSU1G IHRyYWNrIHJlc291cmNlIHRvIHJlYWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9TVFJF QU1fTk9UX0ZPVU5EOworICAgIH0KKworICAgIHdoaWxlICghZmZfY2hlY2tfaW50ZXJydXB0KGMt PmludGVycnVwdF9jYWxsYmFjaykgJiYgIXJldCkgeworICAgICAgICByZXQgPSBhdl9yZWFkX2Zy YW1lKHJlc291cmNlX3RvX3JlYWQtPmN0eCwgcGt0KTsKKyAgICAgICAgYXZfbG9nKHMsCisgICAg ICAgICAgICBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAiR290IHBhY2tldDogcHRzPSUiIFBS SWQ2NAorICAgICAgICAgICAgIiwgZHRzPSUiIFBSSWQ2NAorICAgICAgICAgICAgIiwgZHVyYXRp b249JSIgUFJJZDY0CisgICAgICAgICAgICAiLCBzdHJlYW1faW5kZXg9JWQsIHBvcz0lIiBQUklk NjQKKyAgICAgICAgICAgICJcbiIsCisgICAgICAgICAgICBwa3QtPnB0cywKKyAgICAgICAgICAg IHBrdC0+ZHRzLAorICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiwKKyAgICAgICAgICAgIHBrdC0+ c3RyZWFtX2luZGV4LAorICAgICAgICAgICAgcGt0LT5wb3MpOworICAgICAgICB0cmFja19zdHJl YW0gPSBmZnN0cmVhbShzLT5zdHJlYW1zW3RyYWNrLT5pbmRleF0pOworICAgICAgICBpZiAocmV0 ID49IDApIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBwYWNrZXQgaW5mbyBmcm9tIHRyYWNrICov CisgICAgICAgICAgICBpZiAocGt0LT5kdHMgPCB0cmFja19zdHJlYW0tPmN1cl9kdHMgJiYgdHJh Y2stPmxhc3RfcHRzID4gMCkKKyAgICAgICAgICAgICAgICBwa3QtPmR0cyA9IHRyYWNrX3N0cmVh bS0+Y3VyX2R0czsKKworICAgICAgICAgICAgcGt0LT5wdHMgPSB0cmFjay0+bGFzdF9wdHM7Cisg ICAgICAgICAgICBwa3QtPmR0cyA9IHBrdC0+ZHRzCisgICAgICAgICAgICAgICAgLSAoaW50NjRf dCl0cmFjay0+cmVzb3VyY2VzW3RyYWNrLT5jdXJyZW50X3Jlc291cmNlX2luZGV4XS5yZXNvdXJj ZS0+YmFzZS5lbnRyeV9wb2ludDsKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gdHJh Y2stPmluZGV4OworCisgICAgICAgICAgICAvKiBVcGRhdGUgdHJhY2sgY3Vyc29ycyAqLworICAg ICAgICAgICAgdHJhY2stPmN1cnJlbnRfdGltZXN0YW1wID0gYXZfYWRkX3EodHJhY2stPmN1cnJl bnRfdGltZXN0YW1wLAorICAgICAgICAgICAgICAgIGF2X21ha2VfcSgoaW50KXBrdC0+ZHVyYXRp b24gKiByZXNvdXJjZV90b19yZWFkLT5jdHgtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZS5udW0sCisg ICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3RvX3JlYWQtPmN0eC0+c3RyZWFtc1swXS0+dGlt ZV9iYXNlLmRlbikpOworICAgICAgICAgICAgdHJhY2stPmxhc3RfcHRzICs9IHBrdC0+ZHVyYXRp b247CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBB VkVSUk9SX0VPRikgeworICAgICAgICAgICAgYXZfbG9nKHMsCisgICAgICAgICAgICAgICAgQVZf TE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IHBhY2tldCBmcm9tIHRy YWNrICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFjay0+aW5kZXgsCisgICAgICAgICAg ICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAg IH0KKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Cit9CisKK3N0YXRpYyBpbnQgaW1m X2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBJTUZDb250ZXh0ICpjID0gcy0+cHJp dl9kYXRhOworCisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkNsb3NlIElNRiBwYWNrYWdl XG4iKTsKKyAgICBhdl9kaWN0X2ZyZWUoJmMtPmF2aW9fb3B0cyk7CisgICAgYXZfZnJlZXAoJmMt PmJhc2VfdXJsKTsKKyAgICBpbWZfYXNzZXRfbG9jYXRvcl9tYXBfZGVpbml0KCZjLT5hc3NldF9s b2NhdG9yX21hcCk7CisgICAgZmZfaW1mX2NwbF9mcmVlKGMtPmNwbCk7CisKKyAgICBmb3IgKHVp bnQzMl90IGkgPSAwOyBpIDwgYy0+dHJhY2tfY291bnQ7ICsraSkgeworICAgICAgICBpbWZfdmly dHVhbF90cmFja19wbGF5YmFja19jb250ZXh0X2RlaW5pdChjLT50cmFja3NbaV0pOworICAgICAg ICBhdl9mcmVlcCgmYy0+dHJhY2tzW2ldKTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmYy0+dHJh Y2tzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGltZl9wcm9iZShjb25zdCBB VlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoIXN0cnN0cihwLT5idWYsICI8Q29tcG9zaXRpb25Q bGF5bGlzdCIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNoZWNrIGZvciBhIENvbnRl bnRUaXRsZSBlbGVtZW50IHdpdGhvdXQgaW5jbHVkaW5nIENvbnRlbnRUaXRsZVRleHQsCisgICAg ICogd2hpY2ggaXMgdXNlZCBieSB0aGUgRC1DaW5lbWEgQ1BMLgorICAgICAqLworICAgIGlmICgh c3Ryc3RyKHAtPmJ1ZiwgIkNvbnRlbnRUaXRsZT4iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg ICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBp bWZfb3B0aW9uc1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgID0gImFzc2V0bWFw cyIsCisgICAgICAgIC5oZWxwICAgICAgICA9ICJDb21tYS1zZXBhcmF0ZWQgcGF0aHMgdG8gQVNT RVRNQVAgZmlsZXMuIgorICAgICAgICAgICAgICAgICAgICAgICAiSWYgbm90IHNwZWNpZmllZCwg dGhlIGBBU1NFVE1BUC54bWxgIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBDUEwg aXMgdXNlZC4iLAorICAgICAgICAub2Zmc2V0ICAgICAgPSBvZmZzZXRvZihJTUZDb250ZXh0LCBh c3NldF9tYXBfcGF0aHMpLAorICAgICAgICAudHlwZSAgICAgICAgPSBBVl9PUFRfVFlQRV9TVFJJ TkcsCisgICAgICAgIC5kZWZhdWx0X3ZhbCA9IHsuc3RyID0gTlVMTH0sCisgICAgICAgIC5mbGFn cyAgICAgICA9IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLAorICAgIH0sCisgICAge05VTEx9 LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaW1mX2NsYXNzID0geworICAgIC5jbGFzc19u YW1lID0gImltZiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAg ICAub3B0aW9uICAgICA9IGltZl9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElM X1ZFUlNJT05fSU5ULAorfTsKKworY29uc3QgQVZJbnB1dEZvcm1hdCBmZl9pbWZfZGVtdXhlciA9 IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaW1mIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBO VUxMX0lGX0NPTkZJR19TTUFMTCgiSU1GIChJbnRlcm9wZXJhYmxlIE1hc3RlciBGb3JtYXQpIiks CisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRk1UX0lOSVRfQ0xFQU5VUCwKKyAgICAucHJpdl9j bGFzcyAgICAgPSAmaW1mX2NsYXNzLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihJTUZD b250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBpbWZfcHJvYmUsCisgICAgLnJlYWRfaGVh ZGVyICAgID0gaW1mX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGltZl9yZWFk X3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBpbWZfY2xvc2UsCit9OwotLSAKMi4xNy4x CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpmZm1wZWct ZGV2ZWwgbWFpbGluZyBsaXN0CmZmbXBlZy1kZXZlbEBmZm1wZWcub3JnCmh0dHBzOi8vZmZtcGVn Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ZmbXBlZy1kZXZlbAoKVG8gdW5zdWJzY3JpYmUsIHZpc2l0 IGxpbmsgYWJvdmUsIG9yIGVtYWlsCmZmbXBlZy1kZXZlbC1yZXF1ZXN0QGZmbXBlZy5vcmcgd2l0 aCBzdWJqZWN0ICJ1bnN1YnNjcmliZSIuCg==