Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nAhS6-0002VI-CD for pgsql-hackers@arkaria.postgresql.org; Fri, 21 Jan 2022 00:06:51 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nAhS5-0003oI-6j for pgsql-hackers@arkaria.postgresql.org; Fri, 21 Jan 2022 00:06:49 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nAhS4-0003o7-D9 for pgsql-hackers@lists.postgresql.org; Fri, 21 Jan 2022 00:06:48 +0000 Received: from mail-ed1-x532.google.com ([2a00:1450:4864:20::532]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1nAhRy-0004xw-JX for pgsql-hackers@lists.postgresql.org; Fri, 21 Jan 2022 00:06:48 +0000 Received: by mail-ed1-x532.google.com with SMTP id l5so18608391edv.3 for ; Thu, 20 Jan 2022 16:06:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=message-id:date:mime-version:user-agent:subject:content-language:to :cc:references:from:in-reply-to; bh=GeRGMyd6//nYpWSp/2pLH8CuKtC2f+8ocBqGWTc8jNA=; b=i7A7SyLaL4ReiE75TEx0eGjMSZdtg2OYDpEsbJuwndO2Ug391xkl5l8867BfzKCUlR 1v+RgaxQ2X0nKRWdaQhKmtNjhInJEvVry1g0M1A7ChphWdtY+owbDkoxURY8pEn9xkPc JzUEMsUviZlBGZBnU+pc0So/xMqDoapNZoHiDoFaFaiORniIlSCpQUiV0zpjtf3NlHWi 2AtXs/c2NTt7OYKJnfi4dy78NCy0SRQJ6w0HLZQ9s6IhxHlsRsVDMnAsyLmsUgOhjFce /kZ33pelGtFrsVhwzvEU5DTCjo87zMVs/wESzsZGexrqqMezkLokv/uJ8VuqVYQQsiBd w2kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to; bh=GeRGMyd6//nYpWSp/2pLH8CuKtC2f+8ocBqGWTc8jNA=; b=5xozKZ5rGLbvfX9PLWFsmiA9H5C2wyAXygRXkO5c00Sc0/+btqhCp0K+JJZFCLhEzo SL3Q/BJbzJW3u2URR3C8+rbCpMLXTFXY9D6LuQY97G+1VCkd1jsD07jNMA1PdVO0dKOm lerfCy5Dw0ORlh8sth/i69hEHLJAW1ZS68kBj9UQBje8dAiufMLMtGaTrBUQajkvNb2T YpDfC4lZKvHVy51kwePhgn6/ZCbccq8q0/nO1A6e5oismbHBjWEvgW4KRxp6LpAaUdrm J5m65mEQfP41zk8d5dmMByaThjP1B1LqfC92CVRbxxmBE2ZzC43Me3R5qcN0+hHPaasV r4UA== X-Gm-Message-State: AOAM532982tx3CwriN6ATIIRSoN04+9y0F5DMdW+IlZdOrixo9zG8/Qn /65U9M2fdbyjyozkKsKt5lcvxFG4rTvrnrIR+1Q8lAmFvoobP3yLxhv2cCZxz4+JWc7hxFQZJoS KKY1KviBFmvk7rnYxObmdtGbFSgnQ8uYJb0j9VYv8K2A1hc/ePugOkGEgsTSEkqVkcsaeUXamQ9 b4ErmCrrIL3nh9EFCEpyXDNCAX8lNw6qbhrGuyu6aqTKY2sv+GrIfh/TDB7aG8 X-Google-Smtp-Source: ABdhPJzhtWAyjEiaWWuEF1JlcIh/cReetKPngYExpMI47aNt9qemeoKE9PVJm6nAb7Q2XEwSA4WMBw== X-Received: by 2002:a17:906:99c3:: with SMTP id s3mr454537ejn.16.1642723600648; Thu, 20 Jan 2022 16:06:40 -0800 (PST) Received: from [10.137.0.19] (ip-86-49-251-241.net.upcbroadband.cz. [86.49.251.241]) by smtp.gmail.com with ESMTPSA id a27sm1910980edj.17.2022.01.20.16.06.39 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 20 Jan 2022 16:06:40 -0800 (PST) Content-Type: multipart/mixed; boundary="------------8BpghH4vn1jTlYfa0DsWLSI6" Message-ID: <280088a0-e364-a528-bcca-cc487bef2f84@enterprisedb.com> Date: Fri, 21 Jan 2022 01:06:37 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 Subject: Re: PoC: using sampling to estimate joins / complex conditions Content-Language: en-US To: Andres Freund Cc: PostgreSQL Hackers References: <580ba824-7630-e6e8-f80f-725dfa587da5@enterprisedb.com> <20220104235812.xphxnk3uxpmauan6@alap3.anarazel.de> From: Tomas Vondra In-Reply-To: <20220104235812.xphxnk3uxpmauan6@alap3.anarazel.de> X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------8BpghH4vn1jTlYfa0DsWLSI6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 1/5/22 00:58, Andres Freund wrote: > Hi, > > On 2021-06-27 19:55:24 +0200, Tomas Vondra wrote: >> estimating joins is one of the significant gaps related to extended >> statistics, and I've been regularly asked about what we might do about >> that. This is an early experimental patch that I think might help us >> with improving this, possible even in PG15. > > The tests in this patch fail: > https://cirrus-ci.com/task/5304621299138560 > https://api.cirrus-ci.com/v1/artifact/task/5304621299138560/regress_diffs/src/test/regress/regression.diffs > > Looks like the regression test output hasn't been updated? > Yeah, I haven't updated some of the test output because some of those changes are a bit wrong (and I think that's fine for a PoC patch). I should have mentioned that in the message, though. Sorry about that. There are three types of failures: 1) Changes to deparsed statistics definition in \d command: - "public.ctlt_all_a_b_stat" ON a, b FROM ctlt_all + "public.ctlt_all_a_b_stat" (ndistinct, dependencies, mcv) ON a, b FROM ctlt_all This happens because there's a new kind "sample" but it's not set by default if creating new statistics, and the deparsing logic decides it means it has to list the kinds explicitly. I've fixed this in the attached patch, but it was mostly harmless and I'm not sure this is how sample should behave. 2) Three GUC parameters allowing to enable/disable sampling for different parts of a query (scan, join, correlated join sampling). I still consider those GUCs temporary, for experiments, but I've added them to the expected output. 3) Changes in estimates for OR conditions - a couple estimates get less accurate, because OR clauses are handled as a single clause the first time we pass them to statext_clauselist_selectivity(). So we combine the results incorrectly. OR clauses may need some changes, because it's causing issues in other patches too (e.g. in the "Var op Var" one). I haven't done anything about (3) yet - it's a valid issue and needs to be fixed (either by changing how we handle OR clauses, or maybe handling samples and MCVs at the same time). Or maybe some other way. In any case, there is more important stuff that needs fixing first. The main issue is planning overhead - for the example in the first message, with a simple query joining two tables, you'll see this: Planning Time: 603.442 ms Execution Time: 1071.735 ms There's a couple reasons why it takes this long: 1) We sample the same relation repeatedly - once as a "scan" and then while estimating joins. And for this query we do that in three different contexts: - set_joinrel_size_estimates - populate_joinrel_with_paths (twice) I guess we'll get different number of samples for different queries, but it'll get worse for queries joining more tables etc. It seems fairly simple to cache the samples - for example in StatisticExtInfo (or maybe somewhere else, to keep just one sample per relation, not per RTE). Unfortunately, I'm not sure this works for "independent" samples, not for correlated ones (which are just FK lookups for another sample, so that depends on what's the other sample). Which is a bummer, because correlated samples are the more expensive ones :-( 2) The correlated samples are currently built using a query, executed through SPI in a loop. So given a "driving" sample of 30k rows, we do 30k lookups - that'll take time, even if we do that just once and cache the results. I'm sure there there's room for some improvement, though - for example we don't need to fetch all columns included in the statistics object, but just stuff referenced by the clauses we're estimating. That could improve chance of using IOS etc. I wonder if there's a more efficient way to do this, in a batched manner or something ... But even then it'll still be quite expensive. The only other alternative I can think of is collecting samples during ANALYZE, and storing them somewhere. That'll be difficult for correlated samples, particularly for transitive cases (in snowflake schema). But I believe it's doable (at least for cases covered by FK constraints). But I'm not sure where/how to store the samples. An obvious option would be to serialize them into pg_statistic_ext_data, and I'll try doing that (it's a bit like a huge MCV without any cutoff). But maybe there's a better way that would not require constant serialization/deserialization of many tuples. Any ideas about these options? regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------8BpghH4vn1jTlYfa0DsWLSI6 Content-Type: text/x-patch; charset=UTF-8; name="0001-PoC-Cardinality-estimation-using-runtime-sampling-20220120.patch" Content-Disposition: attachment; filename*0="0001-PoC-Cardinality-estimation-using-runtime-sampling-20220"; filename*1="120.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3N0YXRzY21kcy5jIGIvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvc3RhdHNjbWRzLmMKaW5kZXggZjc0MTliOGY1NjIuLmIyNWVkYmZh NmU1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9zdGF0c2NtZHMuYworKysg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9zdGF0c2NtZHMuYwpAQCAtODMsMTMgKzgzLDE0IEBA IENyZWF0ZVN0YXRpc3RpY3MoQ3JlYXRlU3RhdHNTdG10ICpzdG10KQogCU9pZAkJCXJlbGlk OwogCU9iamVjdEFkZHJlc3MgcGFyZW50b2JqZWN0LAogCQkJCW15c2VsZjsKLQlEYXR1bQkJ dHlwZXNbNF07CQkvKiBvbmUgZm9yIGVhY2ggcG9zc2libGUgdHlwZSBvZiBzdGF0aXN0aWMg Ki8KKwlEYXR1bQkJdHlwZXNbNV07CQkvKiBvbmUgZm9yIGVhY2ggcG9zc2libGUgdHlwZSBv ZiBzdGF0aXN0aWMgKi8KIAlpbnQJCQludHlwZXM7CiAJQXJyYXlUeXBlICAqc3R4a2luZDsK IAlib29sCQlidWlsZF9uZGlzdGluY3Q7CiAJYm9vbAkJYnVpbGRfZGVwZW5kZW5jaWVzOwog CWJvb2wJCWJ1aWxkX21jdjsKIAlib29sCQlidWlsZF9leHByZXNzaW9uczsKKwlib29sCQli dWlsZF9zYW1wbGU7CS8qIFhYWCBtaXNsZWFkaW5nLCB3ZSBkb24ndCBidWlsZCBzYW1wbGVz ICovCiAJYm9vbAkJcmVxdWVzdGVkX3R5cGUgPSBmYWxzZTsKIAlpbnQJCQlpOwogCUxpc3RD ZWxsICAgKmNlbGw7CkBAIC0zNDUsNiArMzQ2LDcgQEAgQ3JlYXRlU3RhdGlzdGljcyhDcmVh dGVTdGF0c1N0bXQgKnN0bXQpCiAJYnVpbGRfbmRpc3RpbmN0ID0gZmFsc2U7CiAJYnVpbGRf ZGVwZW5kZW5jaWVzID0gZmFsc2U7CiAJYnVpbGRfbWN2ID0gZmFsc2U7CisJYnVpbGRfc2Ft cGxlID0gZmFsc2U7CiAJZm9yZWFjaChjZWxsLCBzdG10LT5zdGF0X3R5cGVzKQogCXsKIAkJ Y2hhcgkgICAqdHlwZSA9IHN0clZhbChsZmlyc3QoY2VsbCkpOwpAQCAtMzY0LDYgKzM2Niwx MSBAQCBDcmVhdGVTdGF0aXN0aWNzKENyZWF0ZVN0YXRzU3RtdCAqc3RtdCkKIAkJCWJ1aWxk X21jdiA9IHRydWU7CiAJCQlyZXF1ZXN0ZWRfdHlwZSA9IHRydWU7CiAJCX0KKwkJZWxzZSBp ZiAoc3RyY21wKHR5cGUsICJzYW1wbGUiKSA9PSAwKQorCQl7CisJCQlidWlsZF9zYW1wbGUg PSB0cnVlOworCQkJcmVxdWVzdGVkX3R5cGUgPSB0cnVlOworCQl9CiAJCWVsc2UKIAkJCWVy ZXBvcnQoRVJST1IsCiAJCQkJCShlcnJjb2RlKEVSUkNPREVfU1lOVEFYX0VSUk9SKSwKQEAg LTM3NCw2ICszODEsMTEgQEAgQ3JlYXRlU3RhdGlzdGljcyhDcmVhdGVTdGF0c1N0bXQgKnN0 bXQpCiAJLyoKIAkgKiBJZiBubyBzdGF0aXN0aWMgdHlwZSB3YXMgc3BlY2lmaWVkLCBidWls ZCB0aGVtIGFsbCAoYnV0IG9ubHkgd2hlbiB0aGUKIAkgKiBzdGF0aXN0aWNzIGlzIGRlZmlu ZWQgb24gbW9yZSB0aGFuIG9uZSBjb2x1bW4vZXhwcmVzc2lvbikuCisJICoKKwkgKiBYWFgg V2Uga2VlcCBzYW1wbGluZyBkaXNhYmxlZCBieSBkZWZhdWx0LCBvdGhlcndpc2UgYnVpbGRp bmcgdGhlIHJlc3QKKwkgKiBvZiBzdGF0aXN0aWNzIGtpbmRzIHdvdWxkIGJlIHNvbWV3aGF0 IHBvaW50bGVzcyAodGhlIHNhbXBsZSBpcyBhcHBsaWVkCisJICogZmlyc3QpLiBCdXQgbWF5 YmUgd2Ugc2hvdWxkIGVuYWJsZSB0aGlzIGp1c3QgbGlrZSB0aGUgb3RoZXIga2luZHMgYW5k CisJICogdGhlbiB1c2UgR1VDcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGlzIGF0IHJ1bnRp bWUuCiAJICovCiAJaWYgKCghcmVxdWVzdGVkX3R5cGUpICYmIChudW1jb2xzID49IDIpKQog CXsKQEAgLTQ2NSw2ICs0NzcsOCBAQCBDcmVhdGVTdGF0aXN0aWNzKENyZWF0ZVN0YXRzU3Rt dCAqc3RtdCkKIAkJdHlwZXNbbnR5cGVzKytdID0gQ2hhckdldERhdHVtKFNUQVRTX0VYVF9N Q1YpOwogCWlmIChidWlsZF9leHByZXNzaW9ucykKIAkJdHlwZXNbbnR5cGVzKytdID0gQ2hh ckdldERhdHVtKFNUQVRTX0VYVF9FWFBSRVNTSU9OUyk7CisJaWYgKGJ1aWxkX3NhbXBsZSkK KwkJdHlwZXNbbnR5cGVzKytdID0gQ2hhckdldERhdHVtKFNUQVRTX0VYVF9TQU1QTEUpOwog CUFzc2VydChudHlwZXMgPiAwICYmIG50eXBlcyA8PSBsZW5ndGhvZih0eXBlcykpOwogCXN0 eGtpbmQgPSBjb25zdHJ1Y3RfYXJyYXkodHlwZXMsIG50eXBlcywgQ0hBUk9JRCwgMSwgdHJ1 ZSwgVFlQQUxJR05fQ0hBUik7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXpl ci9wYXRoL2NsYXVzZXNlbC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY2xhdXNl c2VsLmMKaW5kZXggMDZmODM2MzA4ZDAuLjI5MDU3MmZkODEzIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jbGF1c2VzZWwuYworKysgYi9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGF0aC9jbGF1c2VzZWwuYwpAQCAtMTM0LDEwICsxMzQsMTkgQEAgY2xhdXNl bGlzdF9zZWxlY3Rpdml0eV9leHQoUGxhbm5lckluZm8gKnJvb3QsCiAJICogSWYgdGhlcmUn cyBleGFjdGx5IG9uZSBjbGF1c2UsIGp1c3QgZ28gZGlyZWN0bHkgdG8KIAkgKiBjbGF1c2Vf c2VsZWN0aXZpdHlfZXh0KCkuIE5vbmUgb2Ygd2hhdCB3ZSBtaWdodCBkbyBiZWxvdyBpcyBy ZWxldmFudC4KIAkgKi8KKworCS8qCisJICogWFhYIEZvciBqb2lucyB3ZSBtYXkgaGF2ZSBh IHNpbmdsZSBqb2luIGNsYXVzZSwgYnV0IGFkZGl0aW9uYWwgY2xhdXNlcworCSAqIG9uIHRo ZSBqb2luZWQgcmVsYXRpb25zLCBzbyB3ZSBjYW4gc3RpbGwgY29uc2lkZXIgdXNpbmcgZXh0 ZW5kZWQgc3RhdHMKKwkgKiB0byBjYWxjdWxhdGUgY29uZGl0aW9uYWwgcHJvYmFiaWxpdHku CisJICoKKwkgKiBYWFggTWF5YmUgdGhpcyBzaG91bGQgc2ltcGx5IGFkZCAoIXVzZV9leHRl bmRlZF9zdGF0cykgY29uZGl0aW9uPworCSAqCiAJaWYgKGxpc3RfbGVuZ3RoKGNsYXVzZXMp ID09IDEpCiAJCXJldHVybiBjbGF1c2Vfc2VsZWN0aXZpdHlfZXh0KHJvb3QsIChOb2RlICop IGxpbml0aWFsKGNsYXVzZXMpLAogCQkJCQkJCQkJICB2YXJSZWxpZCwgam9pbnR5cGUsIHNq aW5mbywKIAkJCQkJCQkJCSAgdXNlX2V4dGVuZGVkX3N0YXRzKTsKKwkqLwogCiAJLyoKIAkg KiBEZXRlcm1pbmUgaWYgdGhlc2UgY2xhdXNlcyByZWZlcmVuY2UgYSBzaW5nbGUgcmVsYXRp b24uICBJZiBzbywgYW5kIGlmCkBAIC0xNTcsNiArMTY2LDI0IEBAIGNsYXVzZWxpc3Rfc2Vs ZWN0aXZpdHlfZXh0KFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJCQkmZXN0aW1hdGVk Y2xhdXNlcywgZmFsc2UpOwogCX0KIAorCS8qCisJICogVHJ5IGFwcGx5aW5nIGV4dGVuZGVk IHN0YXRpc3RpY3MgdG8gam9pbnMuIFRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGRvIHRvCisJ ICogZGV0ZWN0IHdoZW4gdGhpcyBpcyB3b3J0aCBpdCwgYnV0IHdlIGNhbiBjaGVjayB0aGF0 IHRoZXJlIGFyZSBhdCBsZWFzdAorCSAqIHNvbWUgam9pbiBjbGF1c2VzLCBhbmQgdGhhdCBh dCBsZWFzdCBzb21lIG9mIHRoZSByZWxzIGhhdmUgZXh0ZW5kZWQgc3RhdHMuCisJICoKKwkg KiBYWFggSXNuJ3QgdGhpcyBtdXR1YWx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBwcmVjZWRpbmcg YmxvY2sgY2FsY3VsYXRpbmcKKwkgKiBlc3RpbWF0ZXMgZm9yIGEgc2luZ2xlIHJlbGF0aW9u PyBQcm9iYWJseSB5ZXMsIGJlY2F1c2UgdGhhdCBibG9jayBkZWFscworCSAqIGp1c3Qgbm9u LWpvaW4gY2xhdXNlcywgd2hpbGUgaGVyZSB3ZSBsb29rIGF0IGpvaW5zLgorCSAqLworCWlm ICh1c2VfZXh0ZW5kZWRfc3RhdHMgJiYKKwkJc3RhdGV4dF90cnlfam9pbl9lc3RpbWF0ZXMo cm9vdCwgY2xhdXNlcywgdmFyUmVsaWQsIGpvaW50eXBlLCBzamluZm8sCisJCQkJCQkgCQkg ICBlc3RpbWF0ZWRjbGF1c2VzKSkKKwl7CisJCXMxICo9IHN0YXRleHRfY2xhdXNlbGlzdF9q b2luX3NlbGVjdGl2aXR5KHJvb3QsIGNsYXVzZXMsIHZhclJlbGlkLAorCQkJCQkJCQkJCQkJ ICBqb2ludHlwZSwgc2ppbmZvLAorCQkJCQkJCQkJCQkJICAmZXN0aW1hdGVkY2xhdXNlcyk7 CisJfQorCiAJLyoKIAkgKiBBcHBseSBub3JtYWwgc2VsZWN0aXZpdHkgZXN0aW1hdGVzIGZv ciByZW1haW5pbmcgY2xhdXNlcy4gV2UnbGwgYmUKIAkgKiBjYXJlZnVsIHRvIHNraXAgYW55 IGNsYXVzZXMgd2hpY2ggd2VyZSBhbHJlYWR5IGVzdGltYXRlZCBhYm92ZS4KZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BsYW5jYXQuYyBiL3NyYy9iYWNrZW5k L29wdGltaXplci91dGlsL3BsYW5jYXQuYwppbmRleCBhNTAwMmFkODk1NS4uZDkzNzQ1MWIy ZjAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BsYW5jYXQuYwor KysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wbGFuY2F0LmMKQEAgLTE0NTIsNiAr MTQ1MiwyMCBAQCBnZXRfcmVsYXRpb25fc3RhdGlzdGljcyhSZWxPcHRJbmZvICpyZWwsIFJl bGF0aW9uIHJlbGF0aW9uKQogCiAJCWdldF9yZWxhdGlvbl9zdGF0aXN0aWNzX3dvcmtlcigm c3RhaW5mb3MsIHJlbCwgc3RhdE9pZCwgZmFsc2UsIGtleXMsIGV4cHJzKTsKIAorCQkvKiBz YW1wbGVzIGFyZSBidWlsdCBhdCBydW50aW1lLCBzbyBvbmx5IGNoZWNrIGlmIGl0J3MgZW5h YmxlZCAqLworCQlpZiAoc3RhdGV4dF9pc19raW5kX2VuYWJsZWQoaHR1cCwgU1RBVFNfRVhU X1NBTVBMRSkpCisJCXsKKwkJCVN0YXRpc3RpY0V4dEluZm8gKmluZm8gPSBtYWtlTm9kZShT dGF0aXN0aWNFeHRJbmZvKTsKKworCQkJaW5mby0+c3RhdE9pZCA9IHN0YXRPaWQ7CisJCQlp bmZvLT5yZWwgPSByZWw7CisJCQlpbmZvLT5raW5kID0gU1RBVFNfRVhUX1NBTVBMRTsKKwkJ CWluZm8tPmtleXMgPSBibXNfY29weShrZXlzKTsKKwkJCWluZm8tPmV4cHJzID0gZXhwcnM7 CisKKwkJCXN0YWluZm9zID0gbGFwcGVuZChzdGFpbmZvcywgaW5mbyk7CisJCX0KKwogCQlS ZWxlYXNlU3lzQ2FjaGUoaHR1cCk7CiAJCWJtc19mcmVlKGtleXMpOwogCX0KZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV91dGlsY21kLmMgYi9zcmMvYmFja2VuZC9w YXJzZXIvcGFyc2VfdXRpbGNtZC5jCmluZGV4IDBlZWEyMTRkZDg5Li4xYTE4MTRmMTk3MiAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX3V0aWxjbWQuYworKysgYi9z cmMvYmFja2VuZC9wYXJzZXIvcGFyc2VfdXRpbGNtZC5jCkBAIC0xOTA5LDYgKzE5MDksOCBA QCBnZW5lcmF0ZUNsb25lZEV4dFN0YXRzU3RtdChSYW5nZVZhciAqaGVhcFJlbCwgT2lkIGhl YXBSZWxpZCwKIAkJCXN0YXRfdHlwZXMgPSBsYXBwZW5kKHN0YXRfdHlwZXMsIG1ha2VTdHJp bmcoImRlcGVuZGVuY2llcyIpKTsKIAkJZWxzZSBpZiAoZW5hYmxlZFtpXSA9PSBTVEFUU19F WFRfTUNWKQogCQkJc3RhdF90eXBlcyA9IGxhcHBlbmQoc3RhdF90eXBlcywgbWFrZVN0cmlu ZygibWN2IikpOworCQllbHNlIGlmIChlbmFibGVkW2ldID09IFNUQVRTX0VYVF9TQU1QTEUp CisJCQlzdGF0X3R5cGVzID0gbGFwcGVuZChzdGF0X3R5cGVzLCBtYWtlU3RyaW5nKCJzYW1w bGUiKSk7CiAJCWVsc2UgaWYgKGVuYWJsZWRbaV0gPT0gU1RBVFNfRVhUX0VYUFJFU1NJT05T KQogCQkJLyogZXhwcmVzc2lvbiBzdGF0cyBhcmUgbm90IGV4cG9zZWQgdG8gdXNlcnMgKi8K IAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9leHRl bmRlZF9zdGF0cy5jIGIvc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0cy5j CmluZGV4IDg3ZmU4MmVkMTE0Li40MzQ0OGIwYzM4YSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0cy5jCisrKyBiL3NyYy9iYWNrZW5kL3N0YXRp c3RpY3MvZXh0ZW5kZWRfc3RhdHMuYwpAQCAtMTksMjEgKzE5LDI3IEBACiAjaW5jbHVkZSAi YWNjZXNzL2RldG9hc3QuaCIKICNpbmNsdWRlICJhY2Nlc3MvZ2VuYW0uaCIKICNpbmNsdWRl ICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCisjaW5jbHVkZSAiYWNjZXNzL3JlbGF0aW9uLmgi CiAjaW5jbHVkZSAiYWNjZXNzL3RhYmxlLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9pbmRleGlu Zy5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfY29sbGF0aW9uLmgiCisjaW5jbHVkZSAiY2F0 YWxvZy9wZ19jb25zdHJhaW50LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19zdGF0aXN0aWNf ZXh0LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19zdGF0aXN0aWNfZXh0X2RhdGEuaCIKICNp bmNsdWRlICJleGVjdXRvci9leGVjdXRvci5oIgorI2luY2x1ZGUgImV4ZWN1dG9yL3NwaS5o IgogI2luY2x1ZGUgImNvbW1hbmRzL2RlZnJlbS5oIgogI2luY2x1ZGUgImNvbW1hbmRzL3By b2dyZXNzLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAibm9kZXMvbm9k ZUZ1bmNzLmgiCisjaW5jbHVkZSAibm9kZXMvcGF0aG5vZGVzLmgiCiAjaW5jbHVkZSAib3B0 aW1pemVyL2NsYXVzZXMuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvb3B0aW1pemVyLmgiCisj aW5jbHVkZSAib3B0aW1pemVyL3BhdGhub2RlLmgiCiAjaW5jbHVkZSAicGFyc2VyL3BhcnNl dHJlZS5oIgogI2luY2x1ZGUgInBnc3RhdC5oIgogI2luY2x1ZGUgInBvc3RtYXN0ZXIvYXV0 b3ZhY3V1bS5oIgorI2luY2x1ZGUgInJld3JpdGUvcmV3cml0ZU1hbmlwLmgiCiAjaW5jbHVk ZSAic3RhdGlzdGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0 YXRpc3RpY3Mvc3RhdGlzdGljcy5oIgogI2luY2x1ZGUgInV0aWxzL2FjbC5oIgpAQCAtNDUs NiArNTEsNyBAQAogI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgogI2luY2x1ZGUgInV0 aWxzL21lbXV0aWxzLmgiCiAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCisjaW5jbHVkZSAidXRp bHMvcnVsZXV0aWxzLmgiCiAjaW5jbHVkZSAidXRpbHMvc2VsZnVuY3MuaCIKICNpbmNsdWRl ICJ1dGlscy9zeXNjYWNoZS5oIgogI2luY2x1ZGUgInV0aWxzL3R5cGNhY2hlLmgiCkBAIC0x MDMsNiArMTEwLDYxIEBAIHN0YXRpYyBTdGF0c0J1aWxkRGF0YSAqbWFrZV9idWlsZF9kYXRh KFJlbGF0aW9uIG9uZXJlbCwgU3RhdEV4dEVudHJ5ICpzdGF0LAogCQkJCQkJCQkJICAgaW50 IG51bXJvd3MsIEhlYXBUdXBsZSAqcm93cywKIAkJCQkJCQkJCSAgIFZhY0F0dHJTdGF0cyAq KnN0YXRzLCBpbnQgc3RhdHRhcmdldCk7CiAKKy8qCisgKiBSdW50aW1lIHNhbXBsZXMgdXNl ZCB0byBlc3RpbWF0ZSBzY2FucyBhbmQgam9pbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IFNh bXBsZQoreworCWludAkJCW5yb3dzOworCWludAkJCW1heHJvd3M7CisKKwlCaXRtYXBzZXQg ICphdHRudW1zOworCUxpc3QJICAgKmV4cHJzOworCisJLyoKKwkgKiBXZSBkb24ndCBrZWVw IHRoZSBvcmlnaW5hbCBoZWFwIHR1cGxlcywgd2UgZXh0cmFjdCBhbmQga2VlcCBqdXN0IHRo ZQorCSAqIGludGVyZXN0aW5nIGF0dGlidXRlcyB0byBzYXZlIHNwYWNlIChob3BlZnVsbHkp LgorCSAqCisJICogWFhYIFdlIG1pZ2h0IGRlZHVwbGljYXRlIHRoZSB2YWx1ZXMsIHdoaWNo IHdvdWxkIHNhdmUgYSBsb3Qgb2YgbWVtb3J5CisJICogZm9yIGRhdGEgd2l0aCBhIGxvdCBv ZiByZXBldGl0aW9ucy4gV2hpY2ggaXMgcXVpdGUgY29tbW9uLgorCSAqLworCURhdHVtCSAg ICp2YWx1ZXM7CisJYm9vbAkgICAqaXNudWxsOworfSBTYW1wbGU7CisKK3N0YXRpYyBTYW1w bGUgKnN0YXRleHRfY29sbGVjdF9zYW1wbGUoUGxhbm5lckluZm8gKnJvb3QsCisJCQkJCQkJ CQkgIFN0YXRpc3RpY0V4dEluZm8gKnN0YXQpOworCitzdGF0aWMgU2FtcGxlICpzdGF0ZXh0 X2NvbGxlY3RfY29ycmVsYXRlZF9zYW1wbGUoUGxhbm5lckluZm8gKnJvb3QsCisJCQkJCQkJ CQkJCQkgU3RhdGlzdGljRXh0SW5mbyAqc3RhdCwKKwkJCQkJCQkJCQkJCSBTdGF0aXN0aWNF eHRJbmZvICpzdGF0MiwKKwkJCQkJCQkJCQkJCSBTYW1wbGUgKnNhbXBsZSwKKwkJCQkJCQkJ CQkJCSBMaXN0ICpjbGF1c2VzKTsKKworc3RhdGljIFNlbGVjdGl2aXR5IHNhbXBsZV9jbGF1 c2VsaXN0X3NlbGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290LAorCQkJCQkJCQkJCQkJIFN0 YXRpc3RpY0V4dEluZm8gKnN0YXQsIFNhbXBsZSAqc2FtcGxlLAorCQkJCQkJCQkJCQkJIExp c3QgKmNsYXVzZXMsIGludCB2YXJSZWxpZCwKKwkJCQkJCQkJCQkJCSBKb2luVHlwZSBqb2lu dHlwZSwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8sCisJCQkJCQkJCQkJCQkgUmVsT3B0SW5m byAqcmVsLCBib29sIGlzX29yKTsKKworc3RhdGljIGJvb2wgc3RhdF9jb3ZlcnNfZXhwcmVz c2lvbnMoU3RhdGlzdGljRXh0SW5mbyAqc3RhdCwgTGlzdCAqZXhwcnMsCisJCQkJCQkJCQlC aXRtYXBzZXQgKipleHByX2lkeHMpOworCitzdGF0aWMgTGlzdCAqc3RhdGV4dF9zYW1wbGVf Z2V0X2NvbmRpdGlvbnMoUGxhbm5lckluZm8gKnJvb3QsCisJCQkJCQkJCQkJICAgUmVsT3B0 SW5mbyAqcmVsLAorCQkJCQkJCQkJCSAgIFN0YXRpc3RpY0V4dEluZm8gKmluZm8pOworCitz dGF0aWMgYm9vbCAqc3RhdGV4dF9zYW1wbGVfZXZhbF9jb25kaXRpb25zKFBsYW5uZXJJbmZv ICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkJCQkJCVN0YXRpc3RpY0V4dEluZm8g KnN0YXQsIFNhbXBsZSAqc2FtcGxlLAorCQkJCQkJCQkJCQlTZWxlY3Rpdml0eSAqc2VsKTsK KworLyogdmFyaW91cyAobW9zdGx5IGRldmVsb3Blci1vcmllbnRlZCkgR1VDcyAqLworYm9v bCBlbmFibGVfc2FtcGxlX2VzdGltYXRlc19zY2FuID0gdHJ1ZTsKK2Jvb2wgZW5hYmxlX3Nh bXBsZV9lc3RpbWF0ZXNfam9pbiA9IHRydWU7Citib29sIGVuYWJsZV9zYW1wbGVfam9pbl9j b3JyZWxhdGUgPSB0cnVlOworCisvKiAxJSBtaWdodCBiZSBhIGJpdCB0b28gbXVjaCwgcGVy aGFwcyB3ZSBzaG91bGQgY2FwIGl0IHRvIHN0YXRpc3RpY3MgdGFyZ2V0PyAqLworZG91Ymxl IGVzdGltYXRlX3NhbXBsZV9yYXRlID0gMC4wMTsKIAogLyoKICAqIENvbXB1dGUgcmVxdWVz dGVkIGV4dGVuZGVkIHN0YXRzLCB1c2luZyB0aGUgcm93cyBzYW1wbGVkIGZvciB0aGUgcGxh aW4KQEAgLTQxOCw2ICs0ODAsNDYgQEAgc3RhdGV4dF9pc19raW5kX2J1aWx0KEhlYXBUdXBs ZSBodHVwLCBjaGFyIHR5cGUpCiAJcmV0dXJuICFoZWFwX2F0dGlzbnVsbChodHVwLCBhdHRu dW0sIE5VTEwpOwogfQogCisvKgorICogc3RhdGV4dF9pc19raW5kX2VuYWJsZWQKKyAqCQlJ cyB0aGlzIHN0YXQga2luZCBlbmFibGVkIGluIHRoZSBnaXZlbiBwZ19zdGF0aXN0aWNfZXh0 IHR1cGxlPworICovCitib29sCitzdGF0ZXh0X2lzX2tpbmRfZW5hYmxlZChIZWFwVHVwbGUg aHR1cCwgY2hhciB0eXBlKQoreworCWludAkJCWk7CisJQXJyYXlUeXBlICAqYXJyOworCWNo YXIJICAgKmVuYWJsZWQ7CisKKwlEYXR1bQkJZGF0dW07CisJYm9vbAkJaXNudWxsOworCisJ LyogZGVjb2RlIHRoZSBzdHhraW5kIGNoYXIgYXJyYXkgaW50byBhIGxpc3Qgb2YgY2hhcnMg Ki8KKwlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihTVEFURVhUT0lELCBodHVwLAorCQkJCQkJ CUFudW1fcGdfc3RhdGlzdGljX2V4dF9zdHhraW5kLCAmaXNudWxsKTsKKwlBc3NlcnQoIWlz bnVsbCk7CisJYXJyID0gRGF0dW1HZXRBcnJheVR5cGVQKGRhdHVtKTsKKwlpZiAoQVJSX05E SU0oYXJyKSAhPSAxIHx8CisJCUFSUl9IQVNOVUxMKGFycikgfHwKKwkJQVJSX0VMRU1UWVBF KGFycikgIT0gQ0hBUk9JRCkKKwkJZWxvZyhFUlJPUiwgInN0eGtpbmQgaXMgbm90IGEgMS1E IGNoYXIgYXJyYXkiKTsKKwllbmFibGVkID0gKGNoYXIgKikgQVJSX0RBVEFfUFRSKGFycik7 CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSX0RJTVMoYXJyKVswXTsgaSsrKQorCXsKKwkJQXNz ZXJ0KChlbmFibGVkW2ldID09IFNUQVRTX0VYVF9ORElTVElOQ1QpIHx8CisJCQkgICAoZW5h YmxlZFtpXSA9PSBTVEFUU19FWFRfREVQRU5ERU5DSUVTKSB8fAorCQkJICAgKGVuYWJsZWRb aV0gPT0gU1RBVFNfRVhUX01DVikgfHwKKwkJCSAgIChlbmFibGVkW2ldID09IFNUQVRTX0VY VF9FWFBSRVNTSU9OUykgfHwKKwkJCSAgIChlbmFibGVkW2ldID09IFNUQVRTX0VYVF9TQU1Q TEUpKTsKKworCQlpZiAoZW5hYmxlZFtpXSA9PSB0eXBlKQorCQkJcmV0dXJuIHRydWU7CisJ fQorCisJcmV0dXJuIGZhbHNlOworfQorCiAvKgogICogUmV0dXJuIGEgbGlzdCAob2YgU3Rh dEV4dEVudHJ5KSBvZiBzdGF0aXN0aWNzIG9iamVjdHMgZm9yIHRoZSBnaXZlbiByZWxhdGlv bi4KICAqLwpAQCAtNDc5LDcgKzU4MSw4IEBAIGZldGNoX3N0YXRlbnRyaWVzX2Zvcl9yZWxh dGlvbihSZWxhdGlvbiBwZ19zdGF0ZXh0LCBPaWQgcmVsaWQpCiAJCQlBc3NlcnQoKGVuYWJs ZWRbaV0gPT0gU1RBVFNfRVhUX05ESVNUSU5DVCkgfHwKIAkJCQkgICAoZW5hYmxlZFtpXSA9 PSBTVEFUU19FWFRfREVQRU5ERU5DSUVTKSB8fAogCQkJCSAgIChlbmFibGVkW2ldID09IFNU QVRTX0VYVF9NQ1YpIHx8Ci0JCQkJICAgKGVuYWJsZWRbaV0gPT0gU1RBVFNfRVhUX0VYUFJF U1NJT05TKSk7CisJCQkJICAgKGVuYWJsZWRbaV0gPT0gU1RBVFNfRVhUX0VYUFJFU1NJT05T KSB8fAorCQkJCSAgIChlbmFibGVkW2ldID09IFNUQVRTX0VYVF9TQU1QTEUpKTsKIAkJCWVu dHJ5LT50eXBlcyA9IGxhcHBlbmRfaW50KGVudHJ5LT50eXBlcywgKGludCkgZW5hYmxlZFtp XSk7CiAJCX0KIApAQCAtMTE1NSw2ICsxMjU4LDEwMyBAQCBoYXNfc3RhdHNfb2Zfa2luZChM aXN0ICpzdGF0cywgY2hhciByZXF1aXJlZGtpbmQpCiAJcmV0dXJuIGZhbHNlOwogfQogCisv KgorICogZmluZF9tYXRjaGluZ19zYW1wbGUKKyAqCQlTZWFyY2ggZm9yIGEgc2FtcGxlIHN0 YXRpc3RpY3MgY292ZXJpbmcgYWxsIHRoZSBhdHRyaWJ1dGVzLgorICoKKyAqIEJvdGggYXR0 bnVtcyBhbmQgZXhwcmVzc2lvbnMgaW4gdGhlIGpvaW4gY2xhdXNlIGFyZSByZXF1aXJlZCB0 byBiZSBjb3ZlcmVkCisgKiBieSB0aGUgc3RhdGlzdGljcy4gQWRkaXRpb25hbCByZXN0cmlj dGlvbnMgb24gYmFzZSByZWxhdGlvbnMgYXJlIGNvbnNpZGVyZWQKKyAqIGFzIGV4dHJhIGNv bmRpdGlvbnMgLSBidXQgdGhvc2UgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBjb3ZlcmVkLCB3 ZSBvbmx5IHVzZQorICogdGhlbSB0byBwaWNrICJiZXR0ZXIiIHNhbXBsZS4KKyAqCisgKiBT byBmb3IgZXhhbXBsZSB3aXRoIGEgcXVlcnkKKyAqCisgKiB0MSBKT0lOIHQyIE9OICh0MS5h ID0gdDIuYSBBTkQgdDEuYiA9IHQyLmIpIEFORCB0MS5jID0gMTAgQU5EIHQyLmQgPCAxMDAK KyAqCisgKiBhbnkgc3RhdGlzdGljcyAob24gZWl0aGVyIHNpZGUgb2YgdGhlIGpvaW4pIGNv dmVyaW5nIChhLGIpIHdpbGwgYmUgZWxpZ2libGUsCisgKiBidXQgdGhvc2UgY292ZXJpbmcg dGhlIGNvbHVtbnMgaW4gV0hFUkUgY2xhdXNlcyB3aWxsIGJlIHNlZW4gYXMgYmV0dGVyLgor ICoKKyAqIFhYWCBUaGUgcmVxdWlyZW1lbnQgdGhhdCBhbGwgdGhlIGF0dHJpYnV0ZXMgbmVl ZCB0byBiZSBjb3ZlcmVkIG1pZ2h0IGJlCisgKiB0b28gc3Ryb25nLiBNYXliZSB3ZSBjb3Vs ZCByZWxheCBpdCBhIGJpdCwgYW5kIHNlYXJjaCBmb3Igc3RhdHMgKG9uIGJvdGgKKyAqIHNp ZGVzIG9mIHRoZSBqb2luKSB3aXRoIHRoZSBsYXJnZXN0IG92ZXJsYXAuIEJ1dCB3ZSBkb24n dCByZWFsbHkgZXhwZWN0CisgKiBtYW55IGNhbmRpZGF0ZSBzYW1wbGVzLCBzbyB0aGlzIHNp bXBsZSBhcHByb2FjaCBzZWVtcyBzdWZmaWNpZW50IGZvciBub3cuCisgKi8KK1N0YXRpc3Rp Y0V4dEluZm8gKgorZmluZF9tYXRjaGluZ19zYW1wbGUoUGxhbm5lckluZm8gKnJvb3QsIFJl bE9wdEluZm8gKnJlbCwKKwkJCQkJIEJpdG1hcHNldCAqYXR0bnVtcywgTGlzdCAqZXhwcnMp Cit7CisJTGlzdENlbGwgICAqbDsKKwlTdGF0aXN0aWNFeHRJbmZvICpzYW1wbGUgPSBOVUxM OworCUxpc3QgKnN0YXRzID0gcmVsLT5zdGF0bGlzdDsKKworCWZvcmVhY2gobCwgc3RhdHMp CisJeworCQlTdGF0aXN0aWNFeHRJbmZvICpzdGF0ID0gKFN0YXRpc3RpY0V4dEluZm8gKikg bGZpcnN0KGwpOworCQlMaXN0ICpjb25kaXRpb25zMSA9IE5JTCwKKwkJCSAqY29uZGl0aW9u czIgPSBOSUw7CisKKwkJLyogV2Ugb25seSBjYXJlIGFib3V0IHNhbXBsZXMgc3RhdGlzdGlj cyBoZXJlLiAqLworCQlpZiAoc3RhdC0+a2luZCAhPSBTVEFUU19FWFRfU0FNUExFKQorCQkJ Y29udGludWU7CisKKwkJLyoKKwkJICogSWdub3JlIHN0YXRzIG5vdCBjb3ZlcmluZyBhbGwg dGhlIGF0dHJpYnV0ZXMvZXhwcmVzc2lvbnMuCisJCSAqCisJCSAqIFhYWCBNYXliZSB3ZSBz aG91bGRuJ3QgYmUgc28gc3RyaWN0IGFuZCBjb25zaWRlciBvbmx5IHBhcnRpYWwKKwkJICog bWF0Y2hlcyBmb3Igam9pbiBjbGF1c2VzIHRvbz8KKwkJICovCisJCWlmICghYm1zX2lzX3N1 YnNldChhdHRudW1zLCBzdGF0LT5rZXlzKSB8fAorCQkJIXN0YXRfY292ZXJzX2V4cHJlc3Np b25zKHN0YXQsIGV4cHJzLCBOVUxMKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElmIHRoZXJl J3Mgbm8gbWF0Y2hpbmcgc2FtcGxlIHlldCwga2VlcCBpdC4gKi8KKwkJaWYgKCFzYW1wbGUp CisJCXsKKwkJCXNhbXBsZSA9IHN0YXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJ CSAqIE9LLCB3ZSBoYXZlIHR3byBjYW5kaWRhdGUgc3RhdGlzdGljcyBhbmQgd2UgbmVlZCB0 byBwaWNrLiBXZSdsbAorCQkgKiB1c2UgdHdvIHNpbXBsZSBoZXVyaXN0aWNzOiBXZSBwcmVm ZXIgc21hbGxlciBzdGF0aXN0aWNzIChmZXdlcgorCQkgKiBjb2x1bW5zKSwgb24gdGhlIGFz c3VtcHRpb24gdGhhdCBhIHNtYWxsZXIgc3RhdGlzdGljcyBwcm9iYWJseQorCQkgKiByZXBy ZXNlbnRzIGEgbGFyZ2VyIGZyYWN0aW9uIG9mIHRoZSBkYXRhIChmZXdlciBjb21iaW5hdGlv bnMKKwkJICogd2l0aCBoaWdoZXIgY291bnRzKS4gQnV0IHdlIGFsc28gbGlrZSBpZiB0aGUg c3RhdGlzdGljcyBjb3ZlcnMKKwkJICogc29tZSBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgYXQg dGhlIGJhc2VyZWwgbGV2ZWwsIGJlY2F1c2UgdGhpcworCQkgKiBtYXkgYWZmZWN0IHRoZSBk YXRhIGRpc3RyaWJpdGlvbi4gT2YgY291cnNlLCB0aG9zZSB0d28gbWV0cmljcworCQkgKiBh cmUgY29udHJhZGljdG9yeSAtIHNtYWxsZXIgc3RhdHMgYXJlIGxlc3MgbGlrZWx5IHRvIGNv dmVyIGFzCisJCSAqIG1hbnkgY29uZGl0aW9ucyBhcyBhIGxhcmdlciBvbmUuCisJCSAqCisJ CSAqIFhYWCBGb3Igbm93IHdlIHNpbXBseSBwcmVmZXIgc21hbGxlciBzdGF0aXN0aWNzLCBi dXQgbWF5YmUgaXQKKwkJICogc2hvdWxkIGJlIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorCQkg Ki8KKwkJaWYgKGJtc19udW1fbWVtYmVycyhzYW1wbGUtPmtleXMpICsgbGlzdF9sZW5ndGgo c2FtcGxlLT5leHBycykgPgorCQkJYm1zX251bV9tZW1iZXJzKHN0YXQtPmtleXMpICsgbGlz dF9sZW5ndGgoc3RhdC0+ZXhwcnMpKQorCQl7CisJCQlzYW1wbGUgPSBzdGF0OworCQkJY29u dGludWU7CisJCX0KKworCQkvKgorCQkgKiBOb3cgaW5zcGVjdCB0aGUgYmFzZSByZXN0cmlj dGluZm8gY29uZGl0aW9ucyB0b28uIFdlIG5lZWQgdG8gYmUKKwkJICogbW9yZSBjYXJlZnVs IGJlY2F1c2Ugd2UgZGlkbid0IGNoZWNrIHdoaWNoIG9mIHRob3NlIGNsYXVzZXMgYXJlCisJ CSAqIGNvbXBhdGlibGUsIHNvIHdlIG5lZWQgdG8gcnVuIHN0YXRleHRfaXNfY29tcGF0aWJs ZV9jbGF1c2UuCisJCSAqCisJCSAqIFhYWCBUaGlzIHNob3VsZCBiZSBtb3ZlZCBiZWZvcmUg dGhlIHByZXZpb3VzIGNoZWNrLCBwcm9iYWJseS4gVGhpcworCQkgKiB3YXkgYSAic21hbGxl ciIgc3RhdGlzdGljcyB3aWxsIGJlIHByZWZlcnJlZCwgbm8gbWF0dGVyIGlmIHRoYXQKKwkJ ICogbWVhbnMgc29tZSBjb25kaXRpb25zIHdpbGwgYmUgdW51c2FibGUuCisJCSAqLworCQlj b25kaXRpb25zMSA9IHN0YXRleHRfc2FtcGxlX2dldF9jb25kaXRpb25zKHJvb3QsIHJlbCwg c3RhdCk7CisJCWNvbmRpdGlvbnMyID0gc3RhdGV4dF9zYW1wbGVfZ2V0X2NvbmRpdGlvbnMo cm9vdCwgcmVsLCBzYW1wbGUpOworCisJCS8qIGlmIHRoZSBuZXcgc3RhdGlzdGljcyBjb3Zl cnMgbW9yZSBjb25kaXRpb25zLCB1c2UgaXQgKi8KKwkJaWYgKGxpc3RfbGVuZ3RoKGNvbmRp dGlvbnMyKSA+IGxpc3RfbGVuZ3RoKGNvbmRpdGlvbnMxKSkKKwkJCXNhbXBsZSA9IHN0YXQ7 CisJfQorCisJcmV0dXJuIHNhbXBsZTsKK30KKwogLyoKICAqIHN0YXRfZmluZF9leHByZXNz aW9uCiAgKgkJU2VhcmNoIGZvciBhbiBleHByZXNzaW9uIGluIHN0YXRpc3RpY3Mgb2JqZWN0 J3MgbGlzdCBvZiBleHByZXNzaW9ucy4KQEAgLTE2NTAsNiArMTg1MCwyMTYgQEAgc3RhdGV4 dF9pc19jb21wYXRpYmxlX2NsYXVzZShQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAqY2xhdXNl LCBJbmRleCByZWxpZCwKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorLyoKKyAqIHN0YXRleHRfc2Ft cGxlX2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHkKKyAqCQlFc3RpbWF0ZSBjbGF1c2VzIHVzaW5n IHRoZSBiZXN0IG11bHRpLWNvbHVtbiBzdGF0aXN0aWNzIHNhbXBsZS4KKyAqCisgKiBBcHBs aWVzIGF2YWlsYWJsZSBleHRlbmRlZCAobXVsdGktY29sdW1uKSBzdGF0aXN0aWNzIG9uIGEg dGFibGUuIFRoZXJlIG1heQorICogYmUgbXVsdGlwbGUgYXBwbGljYWJsZSBzdGF0aXN0aWNz ICh3aXRoIHJlc3BlY3QgdG8gdGhlIGNsYXVzZXMpLCBpbiB3aGljaAorICogY2FzZSB3ZSB1 c2UgZ3JlZWR5IGFwcHJvYWNoLiBJbiBlYWNoIHJvdW5kIHdlIHNlbGVjdCB0aGUgYmVzdCBz dGF0aXN0aWMgb24KKyAqIGEgdGFibGUgKG1lYXN1cmVkIGJ5IHRoZSBudW1iZXIgb2YgYXR0 cmlidXRlcyBleHRyYWN0ZWQgZnJvbSB0aGUgY2xhdXNlcworICogYW5kIGNvdmVyZWQgYnkg aXQpLCBhbmQgY29tcHV0ZSB0aGUgc2VsZWN0aXZpdHkgZm9yIHRoZSBzdXBwbGllZCBjbGF1 c2VzLgorICogV2UgcmVwZWF0IHRoaXMgcHJvY2VzcyB3aXRoIHRoZSByZW1haW5pbmcgY2xh dXNlcyAoaWYgYW55KSwgdW50aWwgbm9uZSBvZgorICogdGhlIGF2YWlsYWJsZSBzdGF0aXN0 aWNzIGNhbiBiZSB1c2VkLgorICoKKyAqIFRoaXMgaXMgc2ltaWxhciB0byBzdGF0ZXh0X21j dl9jbGF1c2VsaXN0X3NlbGVjdGl2aXR5LCBidXQgaXQgb25seSBjb25zaWRlcnMKKyAqIHN0 YXRpc3RpY3Mgd2l0aCBydW4tdGltZSBzYW1wbGVzLCBub3QgTUNWIGxpc3RzLiBXZSB0cnkg dG8gYXBwbHkgaXQgYmVmb3JlCisgKiBNQ1YgbGlzdHMsIGFuZCB0aGUgcmVtYWluaW5nIGNs YXVzZXMgYXJlIGVzdGltYXRlZCBieSBNQ1ZzLgorICoKKyAqICdlc3RpbWF0ZWRjbGF1c2Vz JyBpcyBhbiBpbnB1dC9vdXRwdXQgcGFyYW1ldGVyLiAgV2Ugc2V0IGJpdHMgZm9yIHRoZQor ICogMC1iYXNlZCAnY2xhdXNlcycgaW5kZXhlcyB3ZSBlc3RpbWF0ZSBmb3IgYW5kIGFsc28g c2tpcCBjbGF1c2UgaXRlbXMgdGhhdAorICogYWxyZWFkeSBoYXZlIGEgYml0IHNldC4KKyAq CisgKiBYWFggSW4gcHJpbmNpcGxlLCBzYW1wbGVzIG1pZ2h0IGNvdmVyIG11Y2ggd2lkZXIg cmFuZ2Ugb2YgY2xhdXNlcyAtIGFsbW9zdAorICogYW55IGNvbmRpdGlvbiBjYW4gYmUgZXZh bHVhdGVkIG9uIHRoZSBzYW1wbGUgKGFzIGxvbmcgYXMgYWxsIHRoZSBpbnB1dCB2YXJzCisg KiBhcmUgaW4gdGhlIHNhbXBsZSksIGFuZCB0aGVuIHdlIGNhbiB1c2UgdGhhdC4gRm9yIHRo ZSBNQ1YgdGhpcyB3b3VsZCBub3QKKyAqIHdvcmsgd2VsbCBhcyB0aGUgZnVuY3Rpb24gbWln aHQgbW92ZSB2YWx1ZXMgZnJvbSB0aGUgbm9uLU1DViBwYXJ0IHRvIHRoZQorICogTUNWLCBi dXQgdGhhdCdzIGltcG9zc2libGUgdG8gY2FsY3VsYXRlLiAgQnV0IGZvciBub3cgd2UgaWdu b3JlIHRoaXMgYW5kCisgKiBqdXN0IHVzZSBzdGF0ZXh0X2lzX2NvbXBhdGlibGVfY2xhdXNl LCB3ZSBjYW4gcmVsYXggdGhpcyBsYXRlci4KKyAqLworc3RhdGljIFNlbGVjdGl2aXR5Citz dGF0ZXh0X3NhbXBsZV9jbGF1c2VsaXN0X3NlbGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290 LCBMaXN0ICpjbGF1c2VzLCBpbnQgdmFyUmVsaWQsCisJCQkJCQkJCQkgIEpvaW5UeXBlIGpv aW50eXBlLCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbywKKwkJCQkJCQkJCSAgUmVsT3B0SW5m byAqcmVsLCBCaXRtYXBzZXQgKiplc3RpbWF0ZWRjbGF1c2VzLAorCQkJCQkJCQkJICBib29s IGlzX29yKQoreworCUxpc3RDZWxsICAgKmw7CisJQml0bWFwc2V0ICoqbGlzdF9hdHRudW1z OwkvKiBhdHRudW1zIGV4dHJhY3RlZCBmcm9tIHRoZSBjbGF1c2UgKi8KKwlMaXN0CSAgKips aXN0X2V4cHJzOwkJLyogZXhwcmVzc2lvbnMgbWF0Y2hlZCB0byBhbnkgc3RhdGlzdGljICov CisJaW50CQkJbGlzdGlkeDsKKwlTZWxlY3Rpdml0eSBzZWwgPSAoaXNfb3IpID8gMC4wIDog MS4wOworCVNhbXBsZQkgICAqc2FtcGxlOworCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHBsYW5u ZXJfcnRfZmV0Y2gocmVsLT5yZWxpZCwgcm9vdCk7CisKKwkvKiBjaGVjayBpZiB0aGVyZSdz IGFueSBzdGF0cyB0aGF0IG1pZ2h0IGJlIHVzZWZ1bCBmb3IgdXMuICovCisJaWYgKCFoYXNf c3RhdHNfb2Zfa2luZChyZWwtPnN0YXRsaXN0LCBTVEFUU19FWFRfU0FNUExFKSB8fAorCQkh ZW5hYmxlX3NhbXBsZV9lc3RpbWF0ZXNfc2NhbikKKwkJcmV0dXJuIHNlbDsKKworCWxpc3Rf YXR0bnVtcyA9IChCaXRtYXBzZXQgKiopIHBhbGxvYyhzaXplb2YoQml0bWFwc2V0ICopICoK KwkJCQkJCQkJCQkgbGlzdF9sZW5ndGgoY2xhdXNlcykpOworCisJLyogZXhwcmVzc2lvbnMg ZXh0cmFjdGVkIGZyb20gY29tcGxleCBleHByZXNzaW9ucyAqLworCWxpc3RfZXhwcnMgPSAo TGlzdCAqKikgcGFsbG9jKHNpemVvZihOb2RlICopICogbGlzdF9sZW5ndGgoY2xhdXNlcykp OworCisJLyoKKwkgKiBQcmUtcHJvY2VzcyB0aGUgY2xhdXNlcyBsaXN0IHRvIGV4dHJhY3Qg dGhlIGF0dG51bXMgYW5kIGV4cHJlc3Npb25zCisJICogc2VlbiBpbiBlYWNoIGl0ZW0uICBX ZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUgYW55IGNsYXVzZXMgd2hpY2gKKwkg KiB3aWxsIGJlIHVzZWZ1bCBmb3Igc2VsZWN0aXZpdHkgZXN0aW1hdGlvbnMgd2l0aCBleHRl bmRlZCBzdGF0cy4gIEFsb25nCisJICogdGhlIHdheSB3ZSdsbCByZWNvcmQgYWxsIG9mIHRo ZSBhdHRudW1zIGFuZCBleHByZXNzaW9ucyBmb3IgZWFjaCBjbGF1c2UKKwkgKiBpbiBsaXN0 cyB3aGljaCB3ZSdsbCByZWZlcmVuY2UgbGF0ZXIgc28gd2UgZG9uJ3QgbmVlZCB0byByZXBl YXQgdGhlCisJICogc2FtZSB3b3JrIGFnYWluLgorCSAqCisJICogV2UgYWxzbyBza2lwIGNs YXVzZXMgdGhhdCB3ZSBhbHJlYWR5IGVzdGltYXRlZCB1c2luZyBkaWZmZXJlbnQgdHlwZXMg b2YKKwkgKiBzdGF0aXN0aWNzICh3ZSB0cmVhdCB0aGVtIGFzIGluY29tcGF0aWJsZSkuCisJ ICovCisJbGlzdGlkeCA9IDA7CisJZm9yZWFjaChsLCBjbGF1c2VzKQorCXsKKwkJTm9kZQkg ICAqY2xhdXNlID0gKE5vZGUgKikgbGZpcnN0KGwpOworCQlCaXRtYXBzZXQgICphdHRudW1z ID0gTlVMTDsKKwkJTGlzdAkgICAqZXhwcnMgPSBOSUw7CisKKwkJaWYgKCFibXNfaXNfbWVt YmVyKGxpc3RpZHgsICplc3RpbWF0ZWRjbGF1c2VzKSAmJgorCQkJc3RhdGV4dF9pc19jb21w YXRpYmxlX2NsYXVzZShyb290LCBjbGF1c2UsIHJlbC0+cmVsaWQsICZhdHRudW1zLCAmZXhw cnMpKQorCQl7CisJCQlsaXN0X2F0dG51bXNbbGlzdGlkeF0gPSBhdHRudW1zOworCQkJbGlz dF9leHByc1tsaXN0aWR4XSA9IGV4cHJzOworCQl9CisJCWVsc2UKKwkJeworCQkJbGlzdF9h dHRudW1zW2xpc3RpZHhdID0gTlVMTDsKKwkJCWxpc3RfZXhwcnNbbGlzdGlkeF0gPSBOSUw7 CisJCX0KKworCQlsaXN0aWR4Kys7CisJfQorCisJLyogYXBwbHkgYXMgbWFueSBleHRlbmRl ZCBzdGF0aXN0aWNzIGFzIHBvc3NpYmxlICovCisJd2hpbGUgKHRydWUpCisJeworCQlTdGF0 aXN0aWNFeHRJbmZvICpzdGF0OworCQlMaXN0CSAgICpzdGF0X2NsYXVzZXM7CisJCUJpdG1h cHNldCAgKnNpbXBsZV9jbGF1c2VzOworCisJCS8qIGZpbmQgdGhlIGJlc3Qgc3VpdGVkIHN0 YXRpc3RpY3Mgb2JqZWN0IGZvciB0aGVzZSBhdHRudW1zICovCisJCXN0YXQgPSBjaG9vc2Vf YmVzdF9zdGF0aXN0aWNzKHJlbC0+c3RhdGxpc3QsIFNUQVRTX0VYVF9TQU1QTEUsCisJCQkJ CQkJCQkgIHJ0ZS0+aW5oLCBsaXN0X2F0dG51bXMsIGxpc3RfZXhwcnMsCisJCQkJCQkJCQkg IGxpc3RfbGVuZ3RoKGNsYXVzZXMpKTsKKworCQkvKgorCQkgKiBpZiBubyAoYWRkaXRpb25h bCkgbWF0Y2hpbmcgc3RhdHMgY291bGQgYmUgZm91bmQgdGhlbiB3ZSd2ZSBub3RoaW5nCisJ CSAqIHRvIGRvCisJCSAqLworCQlpZiAoIXN0YXQpCisJCQlicmVhazsKKworCQkvKgorCQkg KiBYWFggc2hvdWxkIGJlIGRvbmUgbGF0ZXIsIGFmdGVyIGRldGVybWluaW5nIHdoaWNoIGF0 dG51bXMgYW5kIGV4cHJzCisJCSAqIG5lZWQgdG8gYmUgc2FtcGxlZC4KKwkJICovCisJCXNh bXBsZSA9IHN0YXRleHRfY29sbGVjdF9zYW1wbGUocm9vdCwgc3RhdCk7CisKKwkJLyogRW5z dXJlIGNob29zZV9iZXN0X3N0YXRpc3RpY3MgcHJvZHVjZWQgYW4gZXhwZWN0ZWQgc3RhdHMg dHlwZS4gKi8KKwkJQXNzZXJ0KHN0YXQtPmtpbmQgPT0gU1RBVFNfRVhUX1NBTVBMRSk7CisK KwkJLyogbm93IGZpbHRlciB0aGUgY2xhdXNlcyB0byBiZSBlc3RpbWF0ZWQgdXNpbmcgdGhl IHNlbGVjdGVkIHN0YXQgKi8KKwkJc3RhdF9jbGF1c2VzID0gTklMOworCisJCS8qIHJlY29y ZCB3aGljaCBjbGF1c2VzIGFyZSBzaW1wbGUgKHNpbmdsZSBjb2x1bW4gb3IgZXhwcmVzc2lv bikgKi8KKwkJc2ltcGxlX2NsYXVzZXMgPSBOVUxMOworCisJCWxpc3RpZHggPSAtMTsKKwkJ Zm9yZWFjaChsLCBjbGF1c2VzKQorCQl7CisJCQkvKiBJbmNyZW1lbnQgdGhlIGluZGV4IGJl Zm9yZSB3ZSBkZWNpZGUgaWYgdG8gc2tpcCB0aGUgY2xhdXNlLiAqLworCQkJbGlzdGlkeCsr OworCisJCQkvKgorCQkJICogSWdub3JlIGNsYXVzZXMgZnJvbSB3aGljaCB3ZSBkaWQgbm90 IGV4dHJhY3QgYW55IGF0dG51bXMgb3IKKwkJCSAqIGV4cHJlc3Npb25zICh0aGlzIG5lZWRz IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB3aGF0IHdlIGRvIGluCisJCQkgKiBjaG9vc2VfYmVz dF9zdGF0aXN0aWNzKS4KKwkJCSAqCisJCQkgKiBUaGlzIGFsc28gZWxpbWluYXRlcyBhbHJl YWR5IGVzdGltYXRlZCBjbGF1c2VzIC0gYm90aCB0aG9zZQorCQkJICogZXN0aW1hdGVkIGJl Zm9yZSBhbmQgZHVyaW5nIGFwcGx5aW5nIGV4dGVuZGVkIHN0YXRpc3RpY3MuCisJCQkgKgor CQkJICogWFhYIFRoaXMgY2hlY2sgaXMgbmVlZGVkIGJlY2F1c2UgYm90aCBibXNfaXNfc3Vi c2V0IGFuZAorCQkJICogc3RhdF9jb3ZlcnNfZXhwcmVzc2lvbnMgcmV0dXJuIHRydWUgZm9y IGVtcHR5IGF0dG51bXMgYW5kCisJCQkgKiBleHByZXNzaW9ucy4KKwkJCSAqLworCQkJaWYg KCFsaXN0X2F0dG51bXNbbGlzdGlkeF0gJiYgIWxpc3RfZXhwcnNbbGlzdGlkeF0pCisJCQkJ Y29udGludWU7CisKKwkJCS8qCisJCQkgKiBUaGUgY2xhdXNlIHdhcyBub3QgZXN0aW1hdGVk IHlldCwgYW5kIHdlJ3ZlIGV4dHJhY3RlZCBlaXRoZXIKKwkJCSAqIGF0dG51bXMgb2YgZXhw cmVzc2lvbnMgZnJvbSBpdC4gSWdub3JlIGl0IGlmIGl0J3Mgbm90IGZ1bGx5CisJCQkgKiBj b3ZlcmVkIGJ5IHRoZSBjaG9zZW4gc3RhdGlzdGljcy4KKwkJCSAqCisJCQkgKiBXZSBuZWVk IHRvIGNoZWNrIGJvdGggYXR0cmlidXRlcyBhbmQgZXhwcmVzc2lvbnMsIGFuZCByZWplY3Qg aWYKKwkJCSAqIGVpdGhlciBpcyBub3QgY292ZXJlZC4KKwkJCSAqLworCQkJaWYgKCFibXNf aXNfc3Vic2V0KGxpc3RfYXR0bnVtc1tsaXN0aWR4XSwgc3RhdC0+a2V5cykgfHwKKwkJCQkh c3RhdF9jb3ZlcnNfZXhwcmVzc2lvbnMoc3RhdCwgbGlzdF9leHByc1tsaXN0aWR4XSwgTlVM TCkpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBOb3cgd2Uga25vdyB0aGUgY2xh dXNlIGlzIGNvbXBhdGlibGUgKHdlIGhhdmUgZWl0aGVyIGF0dG51bXMgb3IKKwkJCSAqIGV4 cHJlc3Npb25zIGV4dHJhY3RlZCBmcm9tIGl0KSwgYW5kIHdhcyBub3QgZXN0aW1hdGVkIHll dC4KKwkJCSAqLworCisJCQkvKiByZWNvcmQgc2ltcGxlIGNsYXVzZXMgKHNpbmdsZSBjb2x1 bW4gb3IgZXhwcmVzc2lvbikgKi8KKwkJCWlmICgobGlzdF9hdHRudW1zW2xpc3RpZHhdID09 IE5VTEwgJiYKKwkJCQkgbGlzdF9sZW5ndGgobGlzdF9leHByc1tsaXN0aWR4XSkgPT0gMSkg fHwKKwkJCQkobGlzdF9leHByc1tsaXN0aWR4XSA9PSBOSUwgJiYKKwkJCQkgYm1zX21lbWJl cnNoaXAobGlzdF9hdHRudW1zW2xpc3RpZHhdKSA9PSBCTVNfU0lOR0xFVE9OKSkKKwkJCQlz aW1wbGVfY2xhdXNlcyA9IGJtc19hZGRfbWVtYmVyKHNpbXBsZV9jbGF1c2VzLAorCQkJCQkJ CQkJCQkJbGlzdF9sZW5ndGgoc3RhdF9jbGF1c2VzKSk7CisKKwkJCS8qIGFkZCBjbGF1c2Ug dG8gbGlzdCBhbmQgbWFyayBpdCBhcyBlc3RpbWF0ZWQgKi8KKwkJCXN0YXRfY2xhdXNlcyA9 IGxhcHBlbmQoc3RhdF9jbGF1c2VzLCAoTm9kZSAqKSBsZmlyc3QobCkpOworCQkJKmVzdGlt YXRlZGNsYXVzZXMgPSBibXNfYWRkX21lbWJlcigqZXN0aW1hdGVkY2xhdXNlcywgbGlzdGlk eCk7CisKKwkJCS8qCisJCQkgKiBSZXNldCB0aGUgcG9pbnRlcnMsIHNvIHRoYXQgY2hvb3Nl X2Jlc3Rfc3RhdGlzdGljcyBrbm93cyB0aGlzCisJCQkgKiBjbGF1c2Ugd2FzIGVzdGltYXRl ZCBhbmQgZG9lcyBub3QgY29uc2lkZXIgaXQgYWdhaW4uCisJCQkgKi8KKwkJCWJtc19mcmVl KGxpc3RfYXR0bnVtc1tsaXN0aWR4XSk7CisJCQlsaXN0X2F0dG51bXNbbGlzdGlkeF0gPSBO VUxMOworCisJCQlsaXN0X2ZyZWUobGlzdF9leHByc1tsaXN0aWR4XSk7CisJCQlsaXN0X2V4 cHJzW2xpc3RpZHhdID0gTlVMTDsKKwkJfQorCisJCWlmIChpc19vcikKKwkJeworCQkJU2Vs ZWN0aXZpdHkJc3RhdF9zZWw7CisKKwkJCXN0YXRfc2VsID0gc2FtcGxlX2NsYXVzZWxpc3Rf c2VsZWN0aXZpdHkocm9vdCwgc3RhdCwgc2FtcGxlLCBzdGF0X2NsYXVzZXMsCisJCQkJCQkJ CQkJCQkJIHZhclJlbGlkLCBqb2ludHlwZSwgc2ppbmZvLAorCQkJCQkJCQkJCQkJCSByZWws IHRydWUpOworCisJCQkvKgorCQkJICogRmFjdG9yIHRoZSByZXN1bHQgZm9yIHRoaXMgc3Rh dGlzdGljcyBvYmplY3QgaW50byB0aGUgb3ZlcmFsbAorCQkJICogcmVzdWx0LiAgV2UgdHJl YXQgdGhlIHJlc3VsdHMgZnJvbSBlYWNoIHNlcGFyYXRlIHN0YXRpc3RpY3MKKwkJCSAqIG9i amVjdCBhcyBpbmRlcGVuZGVudCBvZiBvbmUgYW5vdGhlci4KKwkJCSAqLworCQkJc2VsID0g c2VsICsgc3RhdF9zZWwgLSBzZWwgKiBzdGF0X3NlbDsKKwkJfQorCQllbHNlCQkJCQkvKiBJ bXBsaWNpdGx5LUFORGVkIGxpc3Qgb2YgY2xhdXNlcyAqLworCQl7CisJCQkvKgorCQkJICog TXVsdGktY29sdW1uIGVzdGltYXRlIHVzaW5nIHRoZSBzYW1wbGUuIEp1c3QgZmFjdG8gaXQg cmlnaHQKKwkJCSAqIGludG8gdGhlIHJlc3VsdC4KKwkJCSAqLworCQkJc2VsICo9IHNhbXBs ZV9jbGF1c2VsaXN0X3NlbGVjdGl2aXR5KHJvb3QsIHN0YXQsIHNhbXBsZSwgc3RhdF9jbGF1 c2VzLAorCQkJCQkJCQkJCQkJIHZhclJlbGlkLCBqb2ludHlwZSwgc2ppbmZvLAorCQkJCQkJ CQkJCQkJIHJlbCwgZmFsc2UpOworCQl9CisJfQorCisJcmV0dXJuIHNlbDsKK30KKwogLyoK ICAqIHN0YXRleHRfbWN2X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHkKICAqCQlFc3RpbWF0ZSBj bGF1c2VzIHVzaW5nIHRoZSBiZXN0IG11bHRpLWNvbHVtbiBzdGF0aXN0aWNzLgpAQCAtMTk3 OSwxNyArMjM4OSwzMCBAQCBzdGF0ZXh0X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHkoUGxhbm5l ckluZm8gKnJvb3QsIExpc3QgKmNsYXVzZXMsIGludCB2YXJSZWxpZCwKIAkJCQkJCQkgICBi b29sIGlzX29yKQogewogCVNlbGVjdGl2aXR5IHNlbDsKKwlTZWxlY3Rpdml0eSBzZWwyOwog Ci0JLyogRmlyc3QsIHRyeSBlc3RpbWF0aW5nIGNsYXVzZXMgdXNpbmcgYSBtdWx0aXZhcmlh dGUgTUNWIGxpc3QuICovCi0Jc2VsID0gc3RhdGV4dF9tY3ZfY2xhdXNlbGlzdF9zZWxlY3Rp dml0eShyb290LCBjbGF1c2VzLCB2YXJSZWxpZCwgam9pbnR5cGUsCisJLyogRmlyc3QsIHRy eSBlc3RpbWF0aW5nIGNsYXVzZXMgdXNpbmcgYSBtdWx0aXZhcmlhdGUgc2FtcGxlLiAqLwor CXNlbCA9IHN0YXRleHRfc2FtcGxlX2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHkocm9vdCwgY2xh dXNlcywgdmFyUmVsaWQsIGpvaW50eXBlLAorCQkJCQkJCQkJCQkJc2ppbmZvLCByZWwsIGVz dGltYXRlZGNsYXVzZXMsIGlzX29yKTsKKworCS8qIFRoZW4gdHJ5IGVzdGltYXRpbmcgdGhl IHJlbWFpbmluZyBjbGF1c2VzIHVzaW5nIGEgbXVsdGl2YXJpYXRlIE1DViBsaXN0LiAqLwor CXNlbDIgPSBzdGF0ZXh0X21jdl9jbGF1c2VsaXN0X3NlbGVjdGl2aXR5KHJvb3QsIGNsYXVz ZXMsIHZhclJlbGlkLCBqb2ludHlwZSwKIAkJCQkJCQkJCQkJIHNqaW5mbywgcmVsLCBlc3Rp bWF0ZWRjbGF1c2VzLCBpc19vcik7CiAKIAkvKgogCSAqIEZ1bmN0aW9uYWwgZGVwZW5kZW5j aWVzIG9ubHkgd29yayBmb3IgY2xhdXNlcyBjb25uZWN0ZWQgYnkgQU5ELCBzbyBmb3IKIAkg KiBPUiBjbGF1c2VzIHdlJ3JlIGRvbmUuCisJICoKKwkgKiBJZiBpdCdzIE9SLCBjb21iaW5l IHRoZW0gdXNpbmcgdGhlIHVzdWFsIChzMSArIHMyIC0gczEgKiBzMikuCiAJICovCiAJaWYg KGlzX29yKQotCQlyZXR1cm4gc2VsOworCQlyZXR1cm4gKHNlbCArIHNlbDIgLSBzZWwgKiBz ZWwyKTsKKworCS8qCisJICogT3RoZXJ3aXNlIGNvbnRpbnVlIHdpdGggZnVuY3Rpb25hbCBk ZXBlbmRlbmNpZXMsIGJ1dCBmaXJzdCBjb21iaW5lIHRoZSByZXN1bHRzCisJICogdXNpbmcg dGhlIHVzdWFsIHByb2R1Y3QgZm9ybXVsYSAoYXNzdW1pbmcgaW5kZXBlbmRlbmNlKS4KKwkg Ki8KKwlzZWwgKj0gc2VsMjsKIAogCS8qCiAJICogVGhlbiwgYXBwbHkgZnVuY3Rpb25hbCBk ZXBlbmRlbmNpZXMgb24gdGhlIHJlbWFpbmluZyBjbGF1c2VzIGJ5IGNhbGxpbmcKQEAgLTI2 MTEsMyArMzAzNCwxODIxIEBAIG1ha2VfYnVpbGRfZGF0YShSZWxhdGlvbiByZWwsIFN0YXRF eHRFbnRyeSAqc3RhdCwgaW50IG51bXJvd3MsIEhlYXBUdXBsZSAqcm93cywKIAogCXJldHVy biByZXN1bHQ7CiB9CisKKy8qCisgKiBzYW1wbGVfYWxsb2MKKyAqCQlhbGxvY2F0ZSBhIHNh bXBsZSB3aXRoIHNwYWNlIGZvciBtYXhyb3dzICh3ZSdsbCByZXNpemUgaWYgbmVlZGVkKQor ICovCitzdGF0aWMgU2FtcGxlICoKK3NhbXBsZV9hbGxvYyhCaXRtYXBzZXQgKmF0dHJzLCBM aXN0ICpleHBycywgaW50IG1heHJvd3MpCit7CisJU2FtcGxlICpzYW1wbGU7CisJaW50CQlu YXR0cmlidXRlcyA9IGJtc19udW1fbWVtYmVycyhhdHRycykgKyBsaXN0X2xlbmd0aChleHBy cyk7CisKKwkvKiBiYXNpYyBzdHJ1Y3QgKi8KKwlzYW1wbGUgPSBwYWxsb2MwKHNpemVvZihT YW1wbGUpKTsKKworCS8qIFhYWCBzaG91bGQgd2UgY29weSB0aGlzPyAqLworCXNhbXBsZS0+ YXR0bnVtcyA9IGF0dHJzOworCXNhbXBsZS0+ZXhwcnMgPSBleHByczsKKwlzYW1wbGUtPm1h eHJvd3MgPSBtYXhyb3dzOworCisJc2FtcGxlLT52YWx1ZXMgPSBwYWxsb2Moc2l6ZW9mKERh dHVtKSAqIG5hdHRyaWJ1dGVzICogbWF4cm93cyk7CisJc2FtcGxlLT5pc251bGwgPSBwYWxs b2Moc2l6ZW9mKGJvb2wpICogbmF0dHJpYnV0ZXMgKiBtYXhyb3dzKTsKKworCXJldHVybiBz YW1wbGU7Cit9CisKKy8qCisgKiBzYW1wbGVfZnJlZQorICoJCWZyZWUgdGhlIHJvdyBzYW1w bGUKKyAqLworc3RhdGljIHZvaWQKK3NhbXBsZV9mcmVlKFNhbXBsZSAqc2FtcGxlKQorewor CS8qIFhYWCBtYXliZSBmcmVlIHRoZSBhdHRudW1zIC8gZXhwcnMgKi8KKwlwZnJlZShzYW1w bGUtPnZhbHVlcyk7CisJcGZyZWUoc2FtcGxlLT5pc251bGwpOworCXBmcmVlKHNhbXBsZSk7 Cit9CisKKy8qCisgKiBzYW1wbGVfYWRkX3R1cGxlCisgKgkJYWRkIHR1cGxlIHRvIHRoZSBy YW5kb20gc2FtcGxlLCByZXNpemUgaWYgbmVlZGVkCisgKgorICogV2UgZXh0cmFjdCB0aGUg YXR0bnVtcyBmcm9tIHRoZSBoZWFwIHR1cGxlcywgYW5kIGtlZXAgc2ltcGxlIGFycmF5IG9m IERhdHVtCisgKiB2YWx1ZXMgYW5kIGJvb2wgaXNudWxsIGZsYWdzLgorICovCitzdGF0aWMg dm9pZAorc2FtcGxlX2FkZF90dXBsZShTYW1wbGUgKnNhbXBsZSwgVHVwbGVEZXNjIHRkZXNj LCBIZWFwVHVwbGUgaHR1cCkKK3sKKwlpbnQJYXR0bm87CisJaW50CW5hdHRycyA9IGJtc19u dW1fbWVtYmVycyhzYW1wbGUtPmF0dG51bXMpICsgbGlzdF9sZW5ndGgoc2FtcGxlLT5leHBy cyk7CisKKwlpbnQJaWR4ID0gc2FtcGxlLT5ucm93cyAqIG5hdHRyczsKKworCWlmIChzYW1w bGUtPm1heHJvd3MgPT0gc2FtcGxlLT5ucm93cykKKwl7CisJCXNhbXBsZS0+bWF4cm93cyAq PSAyOworCQlzYW1wbGUtPnZhbHVlcyA9IHJlcGFsbG9jKHNhbXBsZS0+dmFsdWVzLCBzYW1w bGUtPm1heHJvd3MgKiBuYXR0cnMgKiBzaXplb2YoRGF0dW0pKTsKKwkJc2FtcGxlLT5pc251 bGwgPSByZXBhbGxvYyhzYW1wbGUtPmlzbnVsbCwgc2FtcGxlLT5tYXhyb3dzICogbmF0dHJz ICogc2l6ZW9mKGJvb2wpKTsKKwl9CisKKwlmb3IgKGF0dG5vID0gMTsgYXR0bm8gPD0gbmF0 dHJzOyBhdHRubysrKQorCXsKKwkJaWYgKCFodHVwKQorCQl7CisJCQkvKiBpZiBubyB0dXBs ZSwgdHJlYXQgaXQgYXMgYWxsIE5VTEwgdmFsdWVzICh3b24ndCBtYXRjaCBhbnkgY29uZGl0 aW9ucykgKi8KKwkJCXNhbXBsZS0+dmFsdWVzW2lkeF0gPSAoRGF0dW0pIDA7CisJCQlzYW1w bGUtPmlzbnVsbFtpZHhdID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCQlzYW1wbGUtPnZhbHVl c1tpZHhdID0gaGVhcF9nZXRhdHRyKGh0dXAsIGF0dG5vLCB0ZGVzYywKKwkJCQkJCQkJCQkJ ICAgJnNhbXBsZS0+aXNudWxsW2lkeF0pOworCQlpZHgrKzsKKwl9CisKKwlzYW1wbGUtPm5y b3dzKys7Cit9CisKKy8qCisgKiBzYW1wbGVfY2FsY3VsYXRlX3NpemUKKyAqCQljYWxjdWxh dGUgdGhlIHNhbXBsaW5nIHJhdGUgZm9yIHRhYmxlc2FtcGxlCisgKgorICogV2UgbG9vayBh dCBzdGF0aXN0aWNzIHRhcmdldCBmb3IgdGhlIHN0YXRpc3RpY3Mgb2JqZWN0LCBvciB0aGUg ZGVmYXVsdCBvbmUgaWYKKyAqIG5vdCBzZXQsIGFuZCB3ZSB1c2UgdGhhdCBhcyBhIGZyYWN0 aW9uIGZvciB0YWJsZXNhbXBsZS4gV2UgYWxzbyBjb21iaW5lIHRoYXQKKyAqIHdpdGggZXN0 aW1hdGVfc2FtcGxlX3JhdGUgR1VDLgorICoKKyAqIFhYWCBNYXliZSB3ZSBzaG91bGQgbG9v ayBhdCBwZXItYXR0cmlidXRlIHRhcmdldHMgdG9vLgorICovCitzdGF0aWMgZG91YmxlCitz YW1wbGVfY2FsY3VsYXRlX3NpemUoU3RhdGlzdGljRXh0SW5mbyAqc3RhdCwgZG91YmxlIG50 dXBsZXMsIGRvdWJsZSAqbnJvd3MpCit7CisJaW50CQkJc3RhdHRhcmdldDsKKwlIZWFwVHVw bGUJaHR1cDsKKwlEYXR1bQkJZGF0dW07CisJYm9vbAkJaXNudWxsOworCWRvdWJsZQkJc2Ft cGxlX3JhdGU7CisKKwkvKiBkZXRlcm1pbmUgc3RhdHRhcmdldCwgaWYgYW55ICovCisJaHR1 cCA9IFNlYXJjaFN5c0NhY2hlMShTVEFURVhUT0lELCBPYmplY3RJZEdldERhdHVtKHN0YXQt PnN0YXRPaWQpKTsKKwlpZiAoIUhlYXBUdXBsZUlzVmFsaWQoaHR1cCkpCisJCWVsb2coRVJS T1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBzdGF0aXN0aWNzIG9iamVjdCAldSIsIHN0 YXQtPnN0YXRPaWQpOworCisJLyogRGV0ZXJtaW5lIHdoaWNoIHN0YXRpc3RpY3MgdHlwZXMg ZXhpc3QgKi8KKwlkYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihTVEFURVhUT0lELCBodHVwLAor CQkJCQkJCUFudW1fcGdfc3RhdGlzdGljX2V4dF9zdHhzdGF0dGFyZ2V0LCAmaXNudWxsKTsK KworCUFzc2VydCghaXNudWxsKTsKKworCXN0YXR0YXJnZXQgPSBEYXR1bUdldEludDMyKGRh dHVtKTsKKwlpZiAoc3RhdHRhcmdldCA9PSAtMSkKKwkJc3RhdHRhcmdldCA9IGRlZmF1bHRf c3RhdGlzdGljc190YXJnZXQ7CisKKwlSZWxlYXNlU3lzQ2FjaGUoaHR1cCk7CisKKwkqbnJv d3MgPSBNaW4oMzAwLjAgKiBzdGF0dGFyZ2V0LCBudHVwbGVzKTsKKworCS8qIHVzZSB0aGUg R1VDIG9mIHN0YXR0YXJnZXQsIHdoYXRldmVyIGdpdmVzIGhpZ2hlciBzYW1wbGUgcmF0ZSAq LworCXNhbXBsZV9yYXRlID0gTWF4KGVzdGltYXRlX3NhbXBsZV9yYXRlLCAqbnJvd3MgLyBu dHVwbGVzKTsKKworCSpucm93cyA9IG50dXBsZXMgKiBzYW1wbGVfcmF0ZTsKKworCXJldHVy biBzYW1wbGVfcmF0ZTsKK30KKworLyoKKyAqIHN0YXRleHRfY29sbGVjdF9zYW1wbGUKKyAq CQlidWlsZCBhIHJhbmRvbSBzYW1wbGUgZm9yIHRoZSByZWxhdGlvbgorICoKKyAqIFhYWCBX ZSBzYW1wbGUgYWxsIGF0dHJpYnV0ZXMgYW5kIGV4cHJlc2lvbnMgdGhlIHN0YXRpc3RpY3Mg aXMgZGVmaW5lZCBvbiwgYnV0CisgKiB3ZSBzaG91bGQgc2FtcGxlIG9ubHkgd2hhdCdzIHJl ZmVyZW5jZWQgaW4gdGhlIHF1ZXJ5IChib3RoIGFzIGEgam9pbiBjbGF1c2UKKyAqIGFuZCBi YXNlIHJlc3RyaWN0aW9ucykuCisgKgorICogWFhYIFRoaXMgdXNlcyB0aGUgcmVndWxhciBU QUJMRVNBTVBMRSB0aHJvdWdoIFNQSSwgYXMgdGhhdCdzIHRoZSBzaW1wbGVzdCB3YXkuCisg KiBHb29kIGVub3VnaCBmb3IgUG9DLCBidXQgbWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkg dG8gZG8gdGhpcy4KKyAqLworc3RhdGljIFNhbXBsZSAqCitzdGF0ZXh0X2NvbGxlY3Rfc2Ft cGxlKFBsYW5uZXJJbmZvICpyb290LCBTdGF0aXN0aWNFeHRJbmZvICpzdGF0KQoreworCWlu dAkJcmV0OworCWludAkJaSwgazsKKwl1aW50NjQJcHJvYzsKKwlTdHJpbmdJbmZvRGF0YSBz dHI7CisJYm9vbAlmaXJzdDsKKwlSYW5nZVRibEVudHJ5ICpydGUgPSBwbGFubmVyX3J0X2Zl dGNoKHN0YXQtPnJlbC0+cmVsaWQsIHJvb3QpOworCU9pZAkJcmVsaWQgPSBydGUtPnJlbGlk OworCUxpc3RDZWxsICpsYzsKKwlib29sCXJlc2V0OworCisJZG91YmxlCXNhbXBsZV9yb3dz OworCWRvdWJsZQlzYW1wbGVfcmF0ZSA9IHNhbXBsZV9jYWxjdWxhdGVfc2l6ZShzdGF0LCBz dGF0LT5yZWwtPnR1cGxlcywKKwkJCQkJCQkJCQkJCSZzYW1wbGVfcm93cyk7CisKKwlTYW1w bGUgKnNhbXBsZSA9IHNhbXBsZV9hbGxvYyhzdGF0LT5rZXlzLCBzdGF0LT5leHBycywgc2Ft cGxlX3Jvd3MpOworCisJU1BJVHVwbGVUYWJsZSAgKnNwaV90dXB0YWJsZTsKKwlUdXBsZURl c2MJCXNwaV90dXBkZXNjOworCisJTGlzdAkgICAqY29udGV4dDsKKwlpbml0U3RyaW5nSW5m bygmc3RyKTsKKworCS8qIGludGVybmFsIGVycm9yICovCisJaWYgKChyZXQgPSBTUElfY29u bmVjdCgpKSA8IDApCisJCWVsb2coRVJST1IsICJzdGF0ZXh0X2NvbGxlY3Rfc2FtcGxlOiBT UElfY29ubmVjdCByZXR1cm5lZCAlZCIsIHJldCk7CisKKwlhcHBlbmRTdHJpbmdJbmZvU3Ry aW5nKCZzdHIsICJTRUxFQ1QgIik7CisKKwlmaXJzdCA9IHRydWU7CisJayA9IC0xOworCisJ d2hpbGUgKChrID0gYm1zX25leHRfbWVtYmVyKHN0YXQtPmtleXMsIGspKSA+PSAwKQorCXsK KwkJQXR0ck51bWJlciBhdHRudW0gPSBrOworCisJCWlmICghZmlyc3QpCisJCQlhcHBlbmRT dHJpbmdJbmZvKCZzdHIsICIsICIpOworCisJCWFwcGVuZFN0cmluZ0luZm8oJnN0ciwgIiVz IiwgZ2V0X2F0dG5hbWUocmVsaWQsIGF0dG51bSwgZmFsc2UpKTsKKworCQlmaXJzdCA9IGZh bHNlOworCX0KKworCWNvbnRleHQgPSBkZXBhcnNlX2NvbnRleHRfZm9yKGdldF9yZWxfbmFt ZShyZWxpZCksIHJlbGlkKTsKKworCWZvcmVhY2gobGMsIHN0YXQtPmV4cHJzKQorCXsKKwkJ Tm9kZSAgICpleHByID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKKwkJY2hhciAgICpleHByX3N0 cjsKKworCQkvKiB0d2VhayB0aGUgdmFybm8gKi8KKwkJaWYgKHN0YXQtPnJlbC0+cmVsaWQg IT0gMSkKKwkJeworCQkJZXhwciA9IGNvcHlPYmplY3QoZXhwcik7CisJCQlDaGFuZ2VWYXJO b2RlcyhleHByLCBzdGF0LT5yZWwtPnJlbGlkLCAxLCAwKTsKKwkJfQorCisJCWV4cHJfc3Ry ID0gZGVwYXJzZV9leHByZXNzaW9uKGV4cHIsIGNvbnRleHQsIGZhbHNlLCBmYWxzZSk7CisK KwkJaWYgKCFmaXJzdCkKKwkJCWFwcGVuZFN0cmluZ0luZm8oJnN0ciwgIiwgIik7CisKKwkJ YXBwZW5kU3RyaW5nSW5mbygmc3RyLCAiJXMiLCBleHByX3N0cik7CisKKwkJZmlyc3QgPSBm YWxzZTsKKwl9CisKKwkvKgorCSAqIFhYWCBNYXliZSBmb3Igam9pbnMgdGhpcyBjb3VsZCBh bHNvIGluY2x1ZGUgdGhlIGFkZGl0aW9uYWwgbm9uLWpvaW4KKwkgKiBjb25kaXRpb25zLCBk ZXJpdmVkIGZyb20gdGhlIGJhc2VyZXN0cmljdGluZm9zLiBUaGF0IHdvdWxkIG1ha2UgdGhl CisJICogc2FtcGxlIHNtYWxsZXIsIGFuZCB3ZSB3b3VsZCBub3QgbmVlZCB0byBib3RoZXIg d2l0aCBldmFsdWF0aW5nIHRoZQorCSAqIGNvbmRpdGlvbnMgbGF0ZXIuIEJvdGggd291bGQg bWFrZSBpdCBtb3JlIGVmZmljaWVudC4gSXQgbWF5IG1ha2UgdGhlCisJICogc2FtcGxlIGxl c3MgdXNlZnVsIGZvciBvdGhlciBxdWVyaWVzIChub3QgYW4gaXNzdWUgZm9yIHNhbXBsZXMg YnVpbHQKKwkgKiBhdCBydW4tdGltZSBmb3IgZWFjaCBxdWVyeSwgYnV0IGlmIHJldGFpbmVk IGl0J2QgYmUgYSBwcm9ibGVtKS4KKwkgKi8KKwlhcHBlbmRTdHJpbmdJbmZvKCZzdHIsICIg RlJPTSAlcy4lcyBUQUJMRVNBTVBMRSBCRVJOT1VMTEkgKCVmKSIsCisJCQkJCSBxdW90ZV9p ZGVudGlmaWVyKGdldF9uYW1lc3BhY2VfbmFtZShnZXRfcmVsX25hbWVzcGFjZShyZWxpZCkp KSwKKwkJCQkJIHF1b3RlX2lkZW50aWZpZXIoZ2V0X3JlbF9uYW1lKHJlbGlkKSksIDEwMCAq IHNhbXBsZV9yYXRlKTsKKworCS8qCisJICogZGlzYWJsZSBzYW1wbGluZyBmb3IgdGhpcyBz YW1wbGluZyBxdWVyeQorCSAqCisJICogVGhlIHF1ZXJ5IGlzIHNpbXBsZSBlbm91Z2ggYW5k IHNob3VsZCBhbHdheXMgdXNlIHRoZSB1bmlxdWUgaW5kZXgsIHNvCisJICogdGhlcmUncyB2 ZXJ5IGxpdHRsZSByaXNrIG9mIHBvb3IgcXVlcnkgcGxhbnMuIE1vcmVvdmVyLCB0aGVyZSBt aWdodCBiZQorCSAqIGEgcmlzayBvZiBpbmZpbml0ZSBjeWNsZXMgKGhhdmluZyB0byBzYW1w bGUgd2hlbiBjb2xsZWN0aW5nIGEgc2FtcGxlKS4KKwkgKi8KKwlyZXNldCA9IGVuYWJsZV9z YW1wbGVfZXN0aW1hdGVzX3NjYW47CisJZW5hYmxlX3NhbXBsZV9lc3RpbWF0ZXNfc2NhbiA9 IGZhbHNlOworCisJcmV0ID0gU1BJX2V4ZWN1dGUoc3RyLmRhdGEsIHRydWUsIDApOworCXBy b2MgPSBTUElfcHJvY2Vzc2VkOworCisJLyogSWYgbm8gcXVhbGlmeWluZyB0dXBsZXMsIGZh bGwgb3V0IGVhcmx5ICovCisJaWYgKHJldCAhPSBTUElfT0tfU0VMRUNUIHx8IHByb2MgPT0g MCkKKwl7CisJCVNQSV9maW5pc2goKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3BpX3R1 cHRhYmxlID0gU1BJX3R1cHRhYmxlOworCXNwaV90dXBkZXNjID0gc3BpX3R1cHRhYmxlLT50 dXBkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHByb2M7IGkrKykKKwkJc2FtcGxlX2FkZF90 dXBsZShzYW1wbGUsIHNwaV90dXBkZXNjLCBzcGlfdHVwdGFibGUtPnZhbHNbaV0pOworCisJ ZWxvZyhXQVJOSU5HLCAic3RhdGV4dF9jb2xsZWN0X3NhbXBsZTogc2FtcGxlZCAlbGQgcm93 cyIsIHByb2MpOworCisJU1BJX2ZpbmlzaCgpOworCisJZW5hYmxlX3NhbXBsZV9lc3RpbWF0 ZXNfc2NhbiA9IHJlc2V0OworCisJcmV0dXJuIHNhbXBsZTsKK30KKworLyoKKyAqIHN0YXRl eHRfY29sbGVjdF9jb3JyZWxhdGVkX3NhbXBsZQorICoJCWJ1aWxkIGEgY29ycmVsYXRlZCBy YW5kb20gc2FtcGxlIGZvciB0aGUgcmVsYXRpb24KKyAqCisgKiBHaXZlbiBhbiBleGlzdGlu ZyBzYW1wbGUgb24gQSwgZmluZCBtYXRjaGluZyByb3dzIGluIHJlbGF0aW9uIEIuIFRoaXMg cmVxdWlyZXMKKyAqIGEgcHJpbWFyeSBrZXkgb24gQiwgYnV0IGNvdWxkIGJlIHJlbGF4ZWQg dG8gYSB1bmlxdWUgaW5kZXggb3IgZXZlbiBhbnkgaW5kZXguCisgKiBXaXRoIG5vbi11bmlx dWUgaW5kZXhlcyB3ZSBtYXkgbmVlZCB0byBzYW1wbGUgdGhlIHJvd3Mgc29tZWhvdy4KKyAq CisgKiBUaGlzIHdvcmtzIGJlc3QgZm9yIGNhc2VzIHdpdGggc3Rhci9zbm93Zmxha2Ugc2No ZW1hLiBJdCdzIGluc3BpcmVkIGJ5IHBhcGVycworICoKKyAqIENhcmRpbmFsaXR5IEVzdGlt YXRpb24gRG9uZSBSaWdodDogSW5kZXgtQmFzZWQgSm9pbiBTYW1wbGluZyAtIFZpa3RvciBM ZWlzIGFuZAorICogICBCLiBSYWRrZSBhbmQgQW5kcmV5IEd1YmljaGV2IGFuZCBBLiBLZW1w ZXIgYW5kIFRob21hcyBOZXVtYW5uLCBDSURSIDIwMTcKKyAqCisgKiBDUzI6IEEgTmV3IERh dGFiYXNlIFN5bm9wc2lzIGZvciBRdWVyeSBFc3RpbWF0aW9uIC0gRmVuZyBZdSwgU291dGhl cm4gSWxsaW5vaXMKKyAqICAgVW5pdmVyc2l0eTsgV2VuLUNoaSBIb3UsIFNvdXRoZXJuIEls bGlub2lzIFVuaXZlcnNpdHk7IENoZW5nICAgIEx1bywgQ29wcGluCisgKiAgIFN0YXRlIFVu aXZlcnNpdHk7IER1bnJlbiBDaGUsIFNvdXRoZXJuIElsbGlub2lzIFVuaXZlcnNpdHk7IE1l bmd4aWEgWmh1LAorICogICBTb3V0aGVybiBJbGxpbm9pcyBVbml2ZXJzaXR5CisgKgorICog WFhYIFRoZSBvcHRpbWl6ZXIgYWxyZWFkeSB1c2VzIHRoZSBmb3JlaWduIGtleSBpbmZvIHRv IGltcHJvdmUgZXN0aW1hdGVzLCBidXQKKyAqIHRoYXQgZG9lcyBub3QgY29uc2lkZXIgY3Jv c3MtdGFibGUgY29ycmVsYXRpb25zIG9yIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBvbgorICog dGhlIHRhYmxlcy4gU28gdGhpcyBzaG91bGQgcHJvYmFibHkgdGFrZSBwcmVjZWRlbmNlLCBi ZWZvcmUgY29uc2lkZXJpbmcgdGhlCisgKiBmb3JlaWduIGtleXMuCisgKi8KK3N0YXRpYyBT YW1wbGUgKgorc3RhdGV4dF9jb2xsZWN0X2NvcnJlbGF0ZWRfc2FtcGxlKFBsYW5uZXJJbmZv ICpyb290LCBTdGF0aXN0aWNFeHRJbmZvICpzdGF0LAorCQkJCQkJCQkgIFN0YXRpc3RpY0V4 dEluZm8gKnN0YXQyLCBTYW1wbGUgKnNhbXBsZTIsIExpc3QgKmNsYXVzZXMpCit7CisJaW50 CQlyZXQ7CisJaW50CQlpLCBrOworCXVpbnQ2NAlwcm9jOworCVN0cmluZ0luZm9EYXRhIHN0 cjsKKwlib29sCWZpcnN0OworCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHBsYW5uZXJfcnRfZmV0 Y2goc3RhdC0+cmVsLT5yZWxpZCwgcm9vdCk7CisJT2lkCQlyZWxpZCA9IHJ0ZS0+cmVsaWQ7 CisJTGlzdENlbGwgKmxjOworCisJLyoKKwkgKiBVc2UgdGhlIHNhbWUgbnVtYmVyIG9mIHJv d3MgYXMgdGhlIHNvdXJjZSBzYW1wbGUgKHdlJ2xsIGxvb2t1cCBieQorCSAqIHByaW1hcnkg a2V5KS4KKwkgKi8KKwlTYW1wbGUgKnNhbXBsZSA9IHNhbXBsZV9hbGxvYyhzdGF0LT5rZXlz LCBzdGF0LT5leHBycywgc2FtcGxlMi0+bnJvd3MpOworCisJU1BJUGxhblB0cgkJcHBsYW47 CisJU1BJVHVwbGVUYWJsZSAgKnNwaV90dXB0YWJsZTsKKwlUdXBsZURlc2MJCXNwaV90dXBk ZXNjOworCisJTGlzdAkgICAqY29udGV4dDsKKworCWluaXRTdHJpbmdJbmZvKCZzdHIpOwor CisJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmc3RyLCAiU0VMRUNUICIpOworCisJZmlyc3Qg PSB0cnVlOworCWsgPSAtMTsKKworCXdoaWxlICgoayA9IGJtc19uZXh0X21lbWJlcihzdGF0 LT5rZXlzLCBrKSkgPj0gMCkKKwl7CisJCUF0dHJOdW1iZXIgYXR0bnVtID0gazsKKworCQlp ZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mbygmc3RyLCAiLCAiKTsKKworCQlhcHBl bmRTdHJpbmdJbmZvKCZzdHIsICIlcyIsIGdldF9hdHRuYW1lKHJlbGlkLCBhdHRudW0sIGZh bHNlKSk7CisKKwkJZmlyc3QgPSBmYWxzZTsKKwl9CisKKwljb250ZXh0ID0gZGVwYXJzZV9j b250ZXh0X2ZvcihnZXRfcmVsX25hbWUocmVsaWQpLCByZWxpZCk7CisKKwlmb3JlYWNoKGxj LCBzdGF0LT5leHBycykKKwl7CisJCU5vZGUgICAqZXhwciA9IChOb2RlICopIGxmaXJzdChs Yyk7CisJCWNoYXIgICAqZXhwcl9zdHI7CisKKwkJLyogdHdlYWsgdGhlIHZhcm5vICovCisJ CWlmIChzdGF0LT5yZWwtPnJlbGlkICE9IDEpCisJCXsKKwkJCWV4cHIgPSBjb3B5T2JqZWN0 KGV4cHIpOworCQkJQ2hhbmdlVmFyTm9kZXMoZXhwciwgc3RhdC0+cmVsLT5yZWxpZCwgMSwg MCk7CisJCX0KKworCQlleHByX3N0ciA9IGRlcGFyc2VfZXhwcmVzc2lvbihleHByLCBjb250 ZXh0LCBmYWxzZSwgZmFsc2UpOworCisJCWlmICghZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJ bmZvKCZzdHIsICIsICIpOworCisJCWFwcGVuZFN0cmluZ0luZm8oJnN0ciwgIiVzIiwgZXhw cl9zdHIpOworCisJCWZpcnN0ID0gZmFsc2U7CisJfQorCisJYXBwZW5kU3RyaW5nSW5mbygm c3RyLCAiIEZST00gJXMuJXMiLAorCQkJCQkgcXVvdGVfaWRlbnRpZmllcihnZXRfbmFtZXNw YWNlX25hbWUoZ2V0X3JlbF9uYW1lc3BhY2UocmVsaWQpKSksCisJCQkJCSBxdW90ZV9pZGVu dGlmaWVyKGdldF9yZWxfbmFtZShyZWxpZCkpKTsKKworCS8qCisJICogRXh0cmFjdCBpbmZv cm1hdGlvbiBmcm9tIHRoZSBqb2luIGNvbmRpdGlvbnMgLSB3aGljaCBhdHRyaWJ1dGVzIHRv IGFkZCB0bworCSAqIHRoZSBTUUwgcXVlcnksIHdoaWNoIHZhbHVlcyB0byB1c2UgZnJvbSB0 aGUgZXhpc3Rpbmcgc2FtcGxlLCBldGMuCisJKi8KKwl7CisJCUxpc3RDZWxsICpsYzsKKwkJ aW50IGo7CisKKwkJaW50CQkJaWR4ID0gMDsKKwkJaW50CQkJbmF0dHMgPSBsaXN0X2xlbmd0 aChjbGF1c2VzKTsKKwkJQXR0ck51bWJlciAqYXR0bnVtczEgPSAoQXR0ck51bWJlciAqKSBw YWxsb2Moc2l6ZW9mKEF0dHJOdW1iZXIpICogbmF0dHMpOworCQlBdHRyTnVtYmVyICphdHRu dW1zMiA9IChBdHRyTnVtYmVyICopIHBhbGxvYyhzaXplb2YoQXR0ck51bWJlcikgKiBuYXR0 cyk7CisJCU9pZAkJICAgKmF0dHR5cGVzID0gKE9pZCAqKSBwYWxsb2Moc2l6ZW9mKE9pZCkg KiBuYXR0cyk7CisJCWludAkJICAgKmF0dG1hcCA9IChpbnQgKikgcGFsbG9jKHNpemVvZihp bnQpICogbmF0dHMpOworCQlib29sCQlyZXNldDsKKworCQlEYXR1bSAgKnZhbHVlcyA9IHBh bGxvYyhzaXplb2YoRGF0dW0pICogbmF0dHMpOworCQljaGFyICAgKm51bGxzID0gcGFsbG9j KHNpemVvZihjaGFyKSAqIG5hdHRzKTsKKworCQkvKiBleHBlY3RzIHRyaXZpYWwgKi8KKwkJ Zm9yZWFjaCAobGMsIGNsYXVzZXMpCisJCXsKKwkJCU5vZGUgKmNsYXVzZSA9IChOb2RlICop IGxmaXJzdChsYyk7CisJCQlCaXRtYXBzZXQgKmF0dG51bXMgPSBOVUxMOworCisJCQlwdWxs X3ZhcmF0dG5vcyhjbGF1c2UsIHN0YXQtPnJlbC0+cmVsaWQsICZhdHRudW1zKTsKKworCQkJ YXR0bnVtczFbaWR4XSA9IGJtc19zaW5nbGV0b25fbWVtYmVyKGF0dG51bXMpICsgRmlyc3RM b3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcjsKKworCQkJYm1zX2ZyZWUoYXR0bnVtcyk7 CisJCQlhdHRudW1zID0gTlVMTDsKKworCQkJcHVsbF92YXJhdHRub3MoY2xhdXNlLCBzdGF0 Mi0+cmVsLT5yZWxpZCwgJmF0dG51bXMpOworCisJCQlhdHRudW1zMltpZHhdID0gYm1zX3Np bmdsZXRvbl9tZW1iZXIoYXR0bnVtcykgKyBGaXJzdExvd0ludmFsaWRIZWFwQXR0cmlidXRl TnVtYmVyOworCisJCQlibXNfZnJlZShhdHRudW1zKTsKKwkJCWF0dG51bXMgPSBOVUxMOwor CisJCQlhdHR0eXBlc1tpZHhdID0gZ2V0X2F0dHR5cGUocmVsaWQsIGF0dG51bXMxW2lkeF0p OworCisJCQkvKiB3aGljaCBpbmRleCBpbiB0aGUgb3RoZXIgc2FtcGxlICovCisJCQlhdHRt YXBbaWR4XSA9IGJtc19tZW1iZXJfaW5kZXgoc3RhdDItPmtleXMsIGF0dG51bXMyW2lkeF0p OworCisJCQlpZHgrKzsKKwkJfQorCisJCUFzc2VydChpZHggPT0gbmF0dHMpOworCisJCWFw cGVuZFN0cmluZ0luZm9TdHJpbmcoJnN0ciwgIiBXSEVSRSAiKTsKKworCQlmb3IgKGkgPSAw OyBpIDwgbmF0dHM7IGkrKykKKwkJeworCQkJaWYgKGkgPiAwKQorCQkJCWFwcGVuZFN0cmlu Z0luZm9TdHJpbmcoJnN0ciwgIiBBTkQgIik7CisKKwkJCWFwcGVuZFN0cmluZ0luZm8oJnN0 ciwgIiAlcyA9ICQlZCAiLCBnZXRfYXR0bmFtZShyZWxpZCwgYXR0bnVtczFbaV0sIGZhbHNl KSwgKGkrMSkpOworCQl9CisKKwkJLyoKKwkJICogWFhYIE1heWJlIGZvciBqb2lucyB0aGlz IGNvdWxkIGFsc28gaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBub24tam9pbgorCQkgKiBjb25k aXRpb25zLCBkZXJpdmVkIGZyb20gdGhlIGJhc2VyZXN0cmljdGluZm9zLiBUaGF0IHdvdWxk IG1ha2UgdGhlCisJCSAqIHNhbXBsZSBzbWFsbGVyLCBhbmQgd2Ugd291bGQgbm90IG5lZWQg dG8gYm90aGVyIHdpdGggZXZhbHVhdGluZyB0aGUKKwkJICogY29uZGl0aW9ucyBsYXRlci4g Qm90aCB3b3VsZCBtYWtlIGl0IG1vcmUgZWZmaWNpZW50LiBJdCBtYXkgbWFrZSB0aGUKKwkJ ICogc2FtcGxlIGxlc3MgdXNlZnVsIGZvciBvdGhlciBxdWVyaWVzIChub3QgYW4gaXNzdWUg Zm9yIHNhbXBsZXMgYnVpbHQKKwkJICogYXQgcnVuLXRpbWUgZm9yIGVhY2ggcXVlcnksIGJ1 dCBpZiByZXRhaW5lZCBpdCdkIGJlIGEgcHJvYmxlbSkuCisJCSAqLworCisJCWVsb2coV0FS TklORywgIlNRTDogJXMiLCBzdHIuZGF0YSk7CisKKwkJLyogaW50ZXJuYWwgZXJyb3IgKi8K KwkJaWYgKChyZXQgPSBTUElfY29ubmVjdCgpKSA8IDApCisJCQllbG9nKEVSUk9SLCAic3Rh dGV4dF9jb2xsZWN0X3NhbXBsZTogU1BJX2Nvbm5lY3QgcmV0dXJuZWQgJWQiLCByZXQpOwor CisJCS8qCisJCSAqIGRpc2FibGUgc2FtcGxpbmcgZm9yIHRoaXMgc2FtcGxpbmcgcXVlcnkK KwkJICoKKwkJICogVGhlIHF1ZXJ5IGlzIHNpbXBsZSBlbm91Z2ggYW5kIHNob3VsZCBhbHdh eXMgdXNlIHRoZSB1bmlxdWUgaW5kZXgsIHNvCisJCSAqIHRoZXJlJ3MgdmVyeSBsaXR0bGUg cmlzayBvZiBwb29yIHF1ZXJ5IHBsYW5zLiBNb3Jlb3ZlciwgdGhlcmUgbWlnaHQgYmUKKwkJ ICogYSByaXNrIG9mIGluZmluaXRlIGN5Y2xlcyAoaGF2aW5nIHRvIHNhbXBsZSB3aGVuIGNv bGxlY3RpbmcgYSBzYW1wbGUpLgorCQkgKi8KKwkJcmVzZXQgPSBlbmFibGVfc2FtcGxlX2Vz dGltYXRlc19zY2FuOworCQllbmFibGVfc2FtcGxlX2VzdGltYXRlc19zY2FuID0gZmFsc2U7 CisKKwkJLyogcHJlcGFyZSB0aGUgbG9va3VwIHN0YXRlbWVudCAqLworCQlwcGxhbiA9IFNQ SV9wcmVwYXJlKHN0ci5kYXRhLCBuYXR0cywgYXR0dHlwZXMpOworCisJCS8qCisJCSAqIExv b2t1cCB0aGUgdmFsdWVzIGZvciBhbGwgcm93cyBpbiB0aGUgZXhpc3Rpbmcgc2FtcGxlLgor CQkgKgorCQkgKiBYWFggV2UgbWlnaHQgc29ydCB0ZSBzYW1wbGUyIHNvIHRoYXQgaXQncyBl YXN5IHRvIGlkZW50aWZ5IHZhbHVlcworCQkgKiB0aGF0IGFyZSBlcXVhbCwgYW5kIHNraXAg dGhlIGluZGV4IGxvb2t1cCBpbiB0aGF0IGNhc2UuCisJCSAqLworCQlmb3IgKGogPSAwOyBq IDwgc2FtcGxlMi0+bnJvd3M7IGorKykKKwkJeworCQkJaW50CXJldDsKKwkJCWludAluYXR0 czIgPSBibXNfbnVtX21lbWJlcnMoc3RhdDItPmtleXMpICsgbGlzdF9sZW5ndGgoc3RhdDIt PmV4cHJzKTsKKworCQkJLyogYnVpbGQgcGFyYW1ldGVycyBmb3IgdGhlIHByZXBhcmVkIHN0 YXRlbWVudCAqLworCQkJZm9yIChpID0gMDsgaSA8IG5hdHRzOyBpKyspCisJCQl7CisJCQkJ aW50CWlkeCA9IGogKiBuYXR0czIgKyBhdHRtYXBbaV07CisKKwkJCQl2YWx1ZXNbaV0gPSBz YW1wbGUyLT52YWx1ZXNbaWR4XTsKKworCQkJCWlmIChzYW1wbGUyLT5pc251bGxbaWR4XSkK KwkJCQkJbnVsbHNbaV0gPSAnbic7CisJCQkJZWxzZQorCQkJCQludWxsc1tpXSA9ICcgJzsK KwkJCX0KKworCQkJLyogcnVuIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgKi8KKwkJCXJldCA9 IFNQSV9leGVjcChwcGxhbiwgdmFsdWVzLCBudWxscywgbmF0dHMpOworCQkJcHJvYyA9IFNQ SV9wcm9jZXNzZWQ7CisKKwkJCS8qIHJlc3VsdHMgb2YgdGhlIGxvb2t1cCAqLworCQkJc3Bp X3R1cHRhYmxlID0gU1BJX3R1cHRhYmxlOworCQkJc3BpX3R1cGRlc2MgPSBzcGlfdHVwdGFi bGUtPnR1cGRlc2M7CisKKwkJCS8qCisJCQkgKiBXZSBjb3VsZCByZWxheCB0aGlzIHRvIHdv cmsgd2l0aCBhbnkgaW5kZXhlcywgaW4gd2hpY2ggY2FzZSB0aGlzCisJCQkgKiB3aWxsIGZh aWwgKGFuZCB3ZSdsbCBuZWVkIHRvIHNhbXBsZSB0aGUgcmV0dXJuZWQgcm93cyBzb21laG93 KS4KKwkJCSAqLworCQkJQXNzZXJ0KHByb2MgPD0gMSk7CisKKwkJCS8qIElmIG5vIHF1YWxp ZnlpbmcgdHVwbGVzLCBhZGQgImVtcHR5IiB0dXBsZSAqLworCQkJaWYgKHJldCAhPSBTUElf T0tfU0VMRUNUIHx8IHByb2MgPT0gMCkKKwkJCQlzYW1wbGVfYWRkX3R1cGxlKHNhbXBsZSwg c3BpX3R1cGRlc2MsIE5VTEwpOworCQkJZWxzZQorCQkJCXNhbXBsZV9hZGRfdHVwbGUoc2Ft cGxlLCBzcGlfdHVwZGVzYywgc3BpX3R1cHRhYmxlLT52YWxzWzBdKTsKKworCQkJU1BJX2Zy ZWV0dXB0YWJsZShzcGlfdHVwdGFibGUpOworCQl9CisKKwkJLyogcmVzdG9yZSB0aGUgdmFs dWUgKi8KKwkJZW5hYmxlX3NhbXBsZV9lc3RpbWF0ZXNfc2NhbiA9IHJlc2V0OworCX0KKwor CVNQSV9maW5pc2goKTsKKworCVNQSV9mcmVlcGxhbihwcGxhbik7CisKKwllbG9nKFdBUk5J TkcsICJzdGF0ZXh0X2NvbGxlY3RfY29ycmVsYXRlZF9zYW1wbGU6IHNhbXBsZWQgJWQgcm93 cyIsIHNhbXBsZS0+bnJvd3MpOworCisJcmV0dXJuIHNhbXBsZTsKK30KKworLyoKKyAqIG1h dGNoIHRoZSBhdHRyaWJ1dGUvZXhwcmVzc2lvbiB0byBhIGRpbWVuc2lvbiBvZiB0aGUgc3Rh dGlzdGljCisgKgorICogTWF0Y2ggdGhlIGF0dHJpYnV0ZS9leHByZXNzaW9uIHRvIHN0YXRp c3RpY3MgZGltZW5zaW9uLiBPcHRpb25hbGx5CisgKiBkZXRlcm1pbmUgdGhlIGNvbGxhdGlv bi4KKyAqLworc3RhdGljIGludAorc2FtcGxlX21hdGNoX2V4cHJlc3Npb24oTm9kZSAqZXhw ciwgQml0bWFwc2V0ICprZXlzLCBMaXN0ICpleHBycywgT2lkICpjb2xsaWQpCit7CisJaW50 CQkJaWR4ID0gLTE7CisKKwlpZiAoSXNBKGV4cHIsIFZhcikpCisJeworCQkvKiBzaW1wbGUg VmFyLCBzbyBqdXN0IGxvb2t1cCB1c2luZyB2YXJhdHRubyAqLworCQlWYXIJCSAgICp2YXIg PSAoVmFyICopIGV4cHI7CisKKwkJaWYgKGNvbGxpZCkKKwkJCSpjb2xsaWQgPSB2YXItPnZh cmNvbGxpZDsKKworCQlpZHggPSBibXNfbWVtYmVyX2luZGV4KGtleXMsIHZhci0+dmFyYXR0 bm8pOworCisJCS8qIG1ha2Ugc3VyZSB0aGUgaW5kZXggaXMgdmFsaWQgKi8KKwkJQXNzZXJ0 KChpZHggPj0gMCkgJiYgKGlkeCA8PSBibXNfbnVtX21lbWJlcnMoa2V5cykpKTsKKwl9CisJ ZWxzZQorCXsKKwkJTGlzdENlbGwgICAqbGM7CisKKwkJLyogZXhwcmVzc2lvbnMgYXJlIHN0 b3JlZCBhZnRlciB0aGUgc2ltcGxlIGNvbHVtbnMgKi8KKwkJaWR4ID0gYm1zX251bV9tZW1i ZXJzKGtleXMpOworCisJCWlmIChjb2xsaWQpCisJCQkqY29sbGlkID0gZXhwckNvbGxhdGlv bihleHByKTsKKworCQkvKiBleHByZXNzaW9uIC0gbG9va3VwIGluIHN0YXRzIGV4cHJlc3Np b25zICovCisJCWZvcmVhY2gobGMsIGV4cHJzKQorCQl7CisJCQlOb2RlCSAgICpzdGF0X2V4 cHIgPSAoTm9kZSAqKSBsZmlyc3QobGMpOworCisJCQlpZiAoZXF1YWwoZXhwciwgc3RhdF9l eHByKSkKKwkJCQlicmVhazsKKworCQkJaWR4Kys7CisJCX0KKworCQkvKiBtYWtlIHN1cmUg dGhlIGluZGV4IGlzIHZhbGlkICovCisJCUFzc2VydCgoaWR4ID49IGJtc19udW1fbWVtYmVy cyhrZXlzKSkgJiYKKwkJCSAgIChpZHggPD0gYm1zX251bV9tZW1iZXJzKGtleXMpICsgbGlz dF9sZW5ndGgoZXhwcnMpKSk7CisJfQorCisJQXNzZXJ0KChpZHggPj0gMCkgJiYgKGlkeCA8 IGJtc19udW1fbWVtYmVycyhrZXlzKSArIGxpc3RfbGVuZ3RoKGV4cHJzKSkpOworCisJcmV0 dXJuIGlkeDsKK30KKworI2RlZmluZSBSRVNVTFRfTUVSR0UodmFsdWUsIGlzX29yLCBtYXRj aCkgXAorCSgoaXNfb3IpID8gKCh2YWx1ZSkgfHwgKG1hdGNoKSkgOiAoKHZhbHVlKSAmJiAo bWF0Y2gpKSkKKworI2RlZmluZSBSRVNVTFRfSVNfRklOQUwodmFsdWUsIGlzX29yKQkoKGlz X29yKSA/ICh2YWx1ZSkgOiAoISh2YWx1ZSkpKQorCitzdGF0aWMgYm9vbCAqCitzYW1wbGVf Z2V0X21hdGNoX2JpdG1hcChQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqY2xhdXNlcywKKwkJ CQkJCUJpdG1hcHNldCAqa2V5cywgTGlzdCAqZXhwcnMsCisJCQkJCQlTYW1wbGUgKnNhbXBs ZSwgYm9vbCBpc19vcikKK3sKKwlMaXN0Q2VsbCAqbDsKKwlib29sICAgKm1hdGNoZXMgPSBw YWxsb2Moc2FtcGxlLT5ucm93cyAqIHNpemVvZihib29sKSk7CisJaW50CQluYXR0cnMgPSBi bXNfbnVtX21lbWJlcnMoa2V5cykgKyBsaXN0X2xlbmd0aChleHBycyk7CisKKwltZW1zZXQo bWF0Y2hlcywgKGlzX29yKSA/IGZhbHNlIDogdHJ1ZSwKKwkJICAgc2l6ZW9mKGJvb2wpICog c2FtcGxlLT5ucm93cyk7CisKKwkvKgorCSAqIExvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBj bGF1c2VzLCBhbmQgZm9yIGVhY2ggb2YgdGhlbSBldmFsdWF0ZSBhbGwKKwkgKiB0aGUgc2Ft cGxlZCByb3dzIG5vdCB5ZXQgZWxpbWluYXRlZCBieSB0aGUgcHJlY2VkaW5nIGNsYXVzZXMu CisJICovCisJZm9yZWFjaChsLCBjbGF1c2VzKQorCXsKKwkJTm9kZQkgICAqY2xhdXNlID0g KE5vZGUgKikgbGZpcnN0KGwpOworCisJCS8qIGlmIGl0J3MgYSBSZXN0cmljdEluZm8sIHRo ZW4gZXh0cmFjdCB0aGUgY2xhdXNlICovCisJCWlmIChJc0EoY2xhdXNlLCBSZXN0cmljdElu Zm8pKQorCQkJY2xhdXNlID0gKE5vZGUgKikgKChSZXN0cmljdEluZm8gKikgY2xhdXNlKS0+ Y2xhdXNlOworCisJCS8qCisJCSAqIEhhbmRsZSB0aGUgdmFyaW91cyB0eXBlcyBvZiBjbGF1 c2VzIC0gT3BDbGF1c2UsIE51bGxUZXN0IGFuZAorCQkgKiBBTkQvT1IvTk9UCisJCSAqLwor CQlpZiAoaXNfb3BjbGF1c2UoY2xhdXNlKSkKKwkJeworCQkJT3BFeHByCSAgICpleHByID0g KE9wRXhwciAqKSBjbGF1c2U7CisJCQlGbWdySW5mbwlvcHByb2M7CisKKwkJCS8qIHZhbGlk IG9ubHkgYWZ0ZXIgZXhhbWluZV9vcGNsYXVzZV9hcmdzIHJldHVybnMgdHJ1ZSAqLworCQkJ Tm9kZQkgICAqY2xhdXNlX2V4cHI7CisJCQlDb25zdAkgICAqY3N0OworCQkJYm9vbAkJZXhw cm9ubGVmdDsKKwkJCWludAkJCWlkeDsKKwkJCU9pZAkJCWNvbGxpZDsKKwkJCWludAkJCWk7 CisKKwkJCWZtZ3JfaW5mbyhnZXRfb3Bjb2RlKGV4cHItPm9wbm8pLCAmb3Bwcm9jKTsKKwor CQkJLyogZXh0cmFjdCB0aGUgdmFyL2V4cHIgYW5kIGNvbnN0IGZyb20gdGhlIGV4cHJlc3Np b24gKi8KKwkJCWlmICghZXhhbWluZV9vcGNsYXVzZV9hcmdzKGV4cHItPmFyZ3MsICZjbGF1 c2VfZXhwciwgJmNzdCwgJmV4cHJvbmxlZnQpKQorCQkJCWVsb2coRVJST1IsICJpbmNvbXBh dGlibGUgY2xhdXNlIik7CisKKwkJCS8qIG1hdGNoIHRoZSBhdHRyaWJ1dGUvZXhwcmVzc2lv biB0byBhIGRpbWVuc2lvbiBvZiB0aGUgc3RhdGlzdGljICovCisJCQlpZHggPSBzYW1wbGVf bWF0Y2hfZXhwcmVzc2lvbihjbGF1c2VfZXhwciwga2V5cywgZXhwcnMsICZjb2xsaWQpOwor CisJCQlBc3NlcnQoKGlkeCA+PSAwKSAmJiAoaWR4IDwgYm1zX251bV9tZW1iZXJzKGtleXMp ICsgbGlzdF9sZW5ndGgoZXhwcnMpKSk7CisKKwkJCS8qCisJCQkgKiBXYWxrIHRocm91Z2gg dGhlIHNhbXBsZWQgcm93cyBhbmQgZXZhbHVhdGUgdGhlIGN1cnJlbnQgY2xhdXNlLiBXZQor CQkJICogY2FuIHNraXAgaXRlbXMgdGhhdCB3ZXJlIGFscmVhZHkgcnVsZWQgb3V0LCBhbmQg dGVybWluYXRlIGlmCisJCQkgKiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIE1DViBpdGVtcyB0 aGF0IG1pZ2h0IHBvc3NpYmx5IG1hdGNoLgorCQkJICovCisJCQlmb3IgKGkgPSAwOyBpIDwg c2FtcGxlLT5ucm93czsgaSsrKQorCQkJeworCQkJCWJvb2wJCW1hdGNoID0gdHJ1ZTsKKwkJ CQlEYXR1bQkgICAqdmFsdWVzID0gJnNhbXBsZS0+dmFsdWVzW2kgKiBuYXR0cnNdOworCQkJ CWJvb2wJICAgKmlzbnVsbCA9ICZzYW1wbGUtPmlzbnVsbFtpICogbmF0dHJzXTsKKworCQkJ CUFzc2VydChpZHggPj0gMCk7CisKKwkJCQkvKgorCQkJCSAqIFdoZW4gdGhlIHNhbXBsZWQg cm93IG9yIHRoZSBDb25zdCB2YWx1ZSBpcyBOVUxMIHdlIGNhbiB0cmVhdAorCQkJCSAqIHRo aXMgYXMgYSBtaXNtYXRjaC4gV2UgbXVzdCBub3QgY2FsbCB0aGUgb3BlcmF0b3IgYmVjYXVz ZQorCQkJCSAqIG9mIHN0cmljdG5lc3MuCisJCQkJICovCisJCQkJaWYgKGlzbnVsbFtpZHhd IHx8IGNzdC0+Y29uc3Rpc251bGwpCisJCQkJeworCQkJCQltYXRjaGVzW2ldID0gUkVTVUxU X01FUkdFKG1hdGNoZXNbaV0sIGlzX29yLCBmYWxzZSk7CisJCQkJCWNvbnRpbnVlOworCQkJ CX0KKworCQkJCS8qCisJCQkJICogU2tpcCBzYW1wbGVkIHJvd3MgdGhhdCBjYW4ndCBjaGFu Z2UgcmVzdWx0IGluIHRoZSBiaXRtYXAuIE9uY2UKKwkJCQkgKiB0aGUgdmFsdWUgZ2V0cyBm YWxzZSBmb3IgQU5ELWxpc3RzLCBvciB0cnVlIGZvciBPUi1saXN0cywgd2UKKwkJCQkgKiBk b24ndCBuZWVkIHRvIGxvb2sgYXQgbW9yZSBjbGF1c2VzLgorCQkJCSAqLworCQkJCWlmIChS RVNVTFRfSVNfRklOQUwobWF0Y2hlc1tpXSwgaXNfb3IpKQorCQkJCQljb250aW51ZTsKKwor CQkJCS8qCisJCQkJICogRmlyc3QgY2hlY2sgd2hldGhlciB0aGUgY29uc3RhbnQgaXMgYmVs b3cgdGhlIGxvd2VyCisJCQkJICogYm91bmRhcnkgKGluIHRoYXQgY2FzZSB3ZSBjYW4gc2tp cCB0aGUgYnVja2V0LCBiZWNhdXNlCisJCQkJICogdGhlcmUncyBubyBvdmVybGFwKS4KKwkJ CQkgKgorCQkJCSAqIFdlIGRvbid0IHN0b3JlIGNvbGxhdGlvbnMgdXNlZCB0byBidWlsZCB0 aGUgc3RhdGlzdGljcywgYnV0CisJCQkJICogd2UgY2FuIHVzZSB0aGUgY29sbGF0aW9uIGZv ciB0aGUgYXR0cmlidXRlIGl0c2VsZiwgYXMKKwkJCQkgKiBzdG9yZWQgaW4gdmFyY29sbGlk LiBXZSBkbyByZXNldCB0aGUgc3RhdGlzdGljcyBhZnRlciBhCisJCQkJICogdHlwZSBjaGFu Z2UgKGluY2x1ZGluZyBjb2xsYXRpb24gY2hhbmdlKSwgc28gdGhpcyBpcyBPSy4KKwkJCQkg KiBGb3IgZXhwcmVzc2lvbnMsIHdlIHVzZSB0aGUgY29sbGF0aW9uIGV4dHJhY3RlZCBmcm9t IHRoZQorCQkJCSAqIGV4cHJlc3Npb24gaXRzZWxmLgorCQkJCSAqLworCQkJCWlmIChleHBy b25sZWZ0KQorCQkJCQltYXRjaCA9IERhdHVtR2V0Qm9vbChGdW5jdGlvbkNhbGwyQ29sbCgm b3Bwcm9jLAorCQkJCQkJCQkJCQkJCQkgICBjb2xsaWQsCisJCQkJCQkJCQkJCQkJCSAgIHZh bHVlc1tpZHhdLAorCQkJCQkJCQkJCQkJCQkgICBjc3QtPmNvbnN0dmFsdWUpKTsKKwkJCQll bHNlCisJCQkJCW1hdGNoID0gRGF0dW1HZXRCb29sKEZ1bmN0aW9uQ2FsbDJDb2xsKCZvcHBy b2MsCisJCQkJCQkJCQkJCQkJCSAgIGNvbGxpZCwKKwkJCQkJCQkJCQkJCQkJICAgY3N0LT5j b25zdHZhbHVlLAorCQkJCQkJCQkJCQkJCQkgICB2YWx1ZXNbaWR4XSkpOworCisJCQkJLyog dXBkYXRlIHRoZSBtYXRjaCBiaXRtYXAgd2l0aCB0aGUgcmVzdWx0ICovCisJCQkJbWF0Y2hl c1tpXSA9IFJFU1VMVF9NRVJHRShtYXRjaGVzW2ldLCBpc19vciwgbWF0Y2gpOworCQkJfQor CQl9CisJCWVsc2UgaWYgKElzQShjbGF1c2UsIFNjYWxhckFycmF5T3BFeHByKSkKKwkJewor CQkJU2NhbGFyQXJyYXlPcEV4cHIgKmV4cHIgPSAoU2NhbGFyQXJyYXlPcEV4cHIgKikgY2xh dXNlOworCQkJRm1nckluZm8Jb3Bwcm9jOworCisJCQkvKiB2YWxpZCBvbmx5IGFmdGVyIGV4 YW1pbmVfb3BjbGF1c2VfYXJncyByZXR1cm5zIHRydWUgKi8KKwkJCU5vZGUJICAgKmNsYXVz ZV9leHByOworCQkJQ29uc3QJICAgKmNzdDsKKwkJCWJvb2wJCWV4cHJvbmxlZnQ7CisJCQlP aWQJCQljb2xsaWQ7CisJCQlpbnQJCQlpZHgsCisJCQkJCQlpOworCisJCQkvKiBhcnJheSBl dmFsdWF0aW9uICovCisJCQlBcnJheVR5cGUgICphcnJheXZhbDsKKwkJCWludDE2CQllbG1s ZW47CisJCQlib29sCQllbG1ieXZhbDsKKwkJCWNoYXIJCWVsbWFsaWduOworCQkJaW50CQkJ bnVtX2VsZW1zOworCQkJRGF0dW0JICAgKmVsZW1fdmFsdWVzOworCQkJYm9vbAkgICAqZWxl bV9udWxsczsKKworCQkJZm1ncl9pbmZvKGdldF9vcGNvZGUoZXhwci0+b3BubyksICZvcHBy b2MpOworCisJCQkvKiBleHRyYWN0IHRoZSB2YXIvZXhwciBhbmQgY29uc3QgZnJvbSB0aGUg ZXhwcmVzc2lvbiAqLworCQkJaWYgKCFleGFtaW5lX29wY2xhdXNlX2FyZ3MoZXhwci0+YXJn cywgJmNsYXVzZV9leHByLCAmY3N0LCAmZXhwcm9ubGVmdCkpCisJCQkJZWxvZyhFUlJPUiwg ImluY29tcGF0aWJsZSBjbGF1c2UiKTsKKworCQkJLyogU2NhbGFyQXJyYXlPcEV4cHIgaGFz IHRoZSBWYXIgYWx3YXlzIG9uIHRoZSBsZWZ0ICovCisJCQlBc3NlcnQoZXhwcm9ubGVmdCk7 CisKKwkJCS8qIFhYWCB3aGF0IGlmIChjc3QtPmNvbnN0aXNudWxsID09IE5VTEwpPyAqLwor CQkJaWYgKCFjc3QtPmNvbnN0aXNudWxsKQorCQkJeworCQkJCWFycmF5dmFsID0gRGF0dW1H ZXRBcnJheVR5cGVQKGNzdC0+Y29uc3R2YWx1ZSk7CisJCQkJZ2V0X3R5cGxlbmJ5dmFsYWxp Z24oQVJSX0VMRU1UWVBFKGFycmF5dmFsKSwKKwkJCQkJCQkJCSAmZWxtbGVuLCAmZWxtYnl2 YWwsICZlbG1hbGlnbik7CisJCQkJZGVjb25zdHJ1Y3RfYXJyYXkoYXJyYXl2YWwsCisJCQkJ CQkJCSAgQVJSX0VMRU1UWVBFKGFycmF5dmFsKSwKKwkJCQkJCQkJICBlbG1sZW4sIGVsbWJ5 dmFsLCBlbG1hbGlnbiwKKwkJCQkJCQkJICAmZWxlbV92YWx1ZXMsICZlbGVtX251bGxzLCAm bnVtX2VsZW1zKTsKKwkJCX0KKworCQkJLyogbWF0Y2ggdGhlIGF0dHJpYnV0ZS9leHByZXNz aW9uIHRvIGEgZGltZW5zaW9uIG9mIHRoZSBzdGF0aXN0aWMgKi8KKwkJCWlkeCA9IHNhbXBs ZV9tYXRjaF9leHByZXNzaW9uKGNsYXVzZV9leHByLCBrZXlzLCBleHBycywgJmNvbGxpZCk7 CisKKwkJCS8qCisJCQkgKiBXYWxrIHRocm91Z2ggdGhlIHNhbXBsZSBhbmQgZXZhbHVhdGUg dGhlIGN1cnJlbnQgY2xhdXNlLiBXZQorCQkJICogY2FuIHNraXAgaXRlbXMgdGhhdCB3ZXJl IGFscmVhZHkgcnVsZWQgb3V0LCBhbmQgdGVybWluYXRlIGlmCisJCQkgKiB0aGVyZSBhcmUg bm8gcmVtYWluaW5nIE1DViBpdGVtcyB0aGF0IG1pZ2h0IHBvc3NpYmx5IG1hdGNoLgorCQkJ ICovCisJCQlmb3IgKGkgPSAwOyBpIDwgc2FtcGxlLT5ucm93czsgaSsrKQorCQkJeworCQkJ CWludAkJCWo7CisJCQkJYm9vbAkJbWF0Y2ggPSAoZXhwci0+dXNlT3IgPyBmYWxzZSA6IHRy dWUpOworCQkJCURhdHVtCSAgICp2YWx1ZXMgPSAmc2FtcGxlLT52YWx1ZXNbaSAqIG5hdHRy c107CisJCQkJYm9vbAkgICAqaXNudWxsID0gJnNhbXBsZS0+aXNudWxsW2kgKiBuYXR0cnNd OworCisJCQkJLyoKKwkJCQkgKiBXaGVuIHRoZSBNQ1YgaXRlbSBvciB0aGUgQ29uc3QgdmFs dWUgaXMgTlVMTCB3ZSBjYW4gdHJlYXQKKwkJCQkgKiB0aGlzIGFzIGEgbWlzbWF0Y2guIFdl IG11c3Qgbm90IGNhbGwgdGhlIG9wZXJhdG9yIGJlY2F1c2UKKwkJCQkgKiBvZiBzdHJpY3Ru ZXNzLgorCQkJCSAqLworCQkJCWlmIChpc251bGxbaWR4XSB8fCBjc3QtPmNvbnN0aXNudWxs KQorCQkJCXsKKwkJCQkJbWF0Y2hlc1tpXSA9IFJFU1VMVF9NRVJHRShtYXRjaGVzW2ldLCBp c19vciwgZmFsc2UpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAq IFNraXAgTUNWIGl0ZW1zIHRoYXQgY2FuJ3QgY2hhbmdlIHJlc3VsdCBpbiB0aGUgYml0bWFw LiBPbmNlCisJCQkJICogdGhlIHZhbHVlIGdldHMgZmFsc2UgZm9yIEFORC1saXN0cywgb3Ig dHJ1ZSBmb3IgT1ItbGlzdHMsCisJCQkJICogd2UgZG9uJ3QgbmVlZCB0byBsb29rIGF0IG1v cmUgY2xhdXNlcy4KKwkJCQkgKi8KKwkJCQlpZiAoUkVTVUxUX0lTX0ZJTkFMKG1hdGNoZXNb aV0sIGlzX29yKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgbnVt X2VsZW1zOyBqKyspCisJCQkJeworCQkJCQlEYXR1bQkJZWxlbV92YWx1ZSA9IGVsZW1fdmFs dWVzW2pdOworCQkJCQlib29sCQllbGVtX2lzbnVsbCA9IGVsZW1fbnVsbHNbal07CisJCQkJ CWJvb2wJCWVsZW1fbWF0Y2g7CisKKwkJCQkJLyogTlVMTCB2YWx1ZXMgYWx3YXlzIGV2YWx1 YXRlIGFzIG5vdCBtYXRjaGluZy4gKi8KKwkJCQkJaWYgKGVsZW1faXNudWxsKQorCQkJCQl7 CisJCQkJCQltYXRjaCA9IFJFU1VMVF9NRVJHRShtYXRjaCwgZXhwci0+dXNlT3IsIGZhbHNl KTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogU3RvcCBl dmFsdWF0aW5nIHRoZSBhcnJheSBlbGVtZW50cyBvbmNlIHdlIHJlYWNoIGEKKwkJCQkJICog bWF0Y2hpbmcgdmFsdWUgdGhhdCBjYW4ndCBjaGFuZ2UgLSBBTEwoKSBpcyB0aGUgc2FtZSBh cworCQkJCQkgKiBBTkQtbGlzdCwgQU5ZKCkgaXMgdGhlIHNhbWUgYXMgT1ItbGlzdC4KKwkJ CQkJICovCisJCQkJCWlmIChSRVNVTFRfSVNfRklOQUwobWF0Y2gsIGV4cHItPnVzZU9yKSkK KwkJCQkJCWJyZWFrOworCisJCQkJCWVsZW1fbWF0Y2ggPSBEYXR1bUdldEJvb2woRnVuY3Rp b25DYWxsMkNvbGwoJm9wcHJvYywKKwkJCQkJCQkJCQkJCQkJCQljb2xsaWQsCisJCQkJCQkJ CQkJCQkJCQkJdmFsdWVzW2lkeF0sCisJCQkJCQkJCQkJCQkJCQkJZWxlbV92YWx1ZSkpOwor CisJCQkJCW1hdGNoID0gUkVTVUxUX01FUkdFKG1hdGNoLCBleHByLT51c2VPciwgZWxlbV9t YXRjaCk7CisJCQkJfQorCisJCQkJLyogdXBkYXRlIHRoZSBtYXRjaCBiaXRtYXAgd2l0aCB0 aGUgcmVzdWx0ICovCisJCQkJbWF0Y2hlc1tpXSA9IFJFU1VMVF9NRVJHRShtYXRjaGVzW2ld LCBpc19vciwgbWF0Y2gpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKElzQShjbGF1c2UsIE51 bGxUZXN0KSkKKwkJeworCQkJaW50CQkJaTsKKwkJCU51bGxUZXN0ICAgKmV4cHIgPSAoTnVs bFRlc3QgKikgY2xhdXNlOworCQkJTm9kZQkgICAqY2xhdXNlX2V4cHIgPSAoTm9kZSAqKSAo ZXhwci0+YXJnKTsKKworCQkJLyogbWF0Y2ggdGhlIGF0dHJpYnV0ZS9leHByZXNzaW9uIHRv IGEgZGltZW5zaW9uIG9mIHRoZSBzdGF0aXN0aWMgKi8KKwkJCWludAkJCWlkeCA9IHNhbXBs ZV9tYXRjaF9leHByZXNzaW9uKGNsYXVzZV9leHByLCBrZXlzLCBleHBycywgTlVMTCk7CisK KwkJCS8qCisJCQkgKiBXYWxrIHRocm91Z2ggdGhlIHNhbXBsZSBhbmQgZXZhbHVhdGUgdGhl IGN1cnJlbnQgY2xhdXNlLiBXZQorCQkJICogY2FuIHNraXAgaXRlbXMgdGhhdCB3ZXJlIGFs cmVhZHkgcnVsZWQgb3V0LCBhbmQgdGVybWluYXRlIGlmCisJCQkgKiB0aGVyZSBhcmUgbm8g cmVtYWluaW5nIE1DViBpdGVtcyB0aGF0IG1pZ2h0IHBvc3NpYmx5IG1hdGNoLgorCQkJICov CisJCQlmb3IgKGkgPSAwOyBpIDwgc2FtcGxlLT5ucm93czsgaSsrKQorCQkJeworCQkJCWJv b2wJbWF0Y2ggPSBmYWxzZTsJLyogYXNzdW1lIG1pc21hdGNoICovCisJCQkJYm9vbCAgICpp c251bGwgPSAmc2FtcGxlLT5pc251bGxbaSAqIG5hdHRyc107CisKKworCQkJCS8qIGlmIHRo ZSBjbGF1c2UgbWlzbWF0Y2hlcyB0aGUgTUNWIGl0ZW0sIHVwZGF0ZSB0aGUgYml0bWFwICov CisJCQkJc3dpdGNoIChleHByLT5udWxsdGVzdHR5cGUpCisJCQkJeworCQkJCQljYXNlIElT X05VTEw6CisJCQkJCQltYXRjaCA9IChpc251bGxbaWR4XSkgPyB0cnVlIDogbWF0Y2g7CisJ CQkJCQlicmVhazsKKworCQkJCQljYXNlIElTX05PVF9OVUxMOgorCQkJCQkJbWF0Y2ggPSAo IWlzbnVsbFtpZHhdKSA/IHRydWUgOiBtYXRjaDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwor CQkJCS8qIG5vdywgdXBkYXRlIHRoZSBtYXRjaCBiaXRtYXAsIGRlcGVuZGluZyBvbiBPUi9B TkQgdHlwZSAqLworCQkJCW1hdGNoZXNbaV0gPSBSRVNVTFRfTUVSR0UobWF0Y2hlc1tpXSwg aXNfb3IsIG1hdGNoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChpc19vcmNsYXVzZShjbGF1 c2UpIHx8IGlzX2FuZGNsYXVzZShjbGF1c2UpKQorCQl7CisJCQkvKiBBTkQvT1IgY2xhdXNl LCB3aXRoIGFsbCBzdWJjbGF1c2VzIGJlaW5nIGNvbXBhdGlibGUgKi8KKworCQkJaW50CQkJ aTsKKwkJCUJvb2xFeHByICAgKmJvb2xfY2xhdXNlID0gKChCb29sRXhwciAqKSBjbGF1c2Up OworCQkJTGlzdAkgICAqYm9vbF9jbGF1c2VzID0gYm9vbF9jbGF1c2UtPmFyZ3M7CisKKwkJ CS8qIG1hdGNoL21pc21hdGNoIGJpdG1hcCBmb3IgZWFjaCBNQ1YgaXRlbSAqLworCQkJYm9v bAkgICAqYm9vbF9tYXRjaGVzID0gTlVMTDsKKworCQkJQXNzZXJ0KGJvb2xfY2xhdXNlcyAh PSBOSUwpOworCQkJQXNzZXJ0KGxpc3RfbGVuZ3RoKGJvb2xfY2xhdXNlcykgPj0gMik7CisK KwkJCS8qIGJ1aWxkIHRoZSBtYXRjaCBiaXRtYXAgZm9yIHRoZSBPUi1jbGF1c2VzICovCisJ CQlib29sX21hdGNoZXMgPSBzYW1wbGVfZ2V0X21hdGNoX2JpdG1hcChyb290LCBib29sX2Ns YXVzZXMsIGtleXMsIGV4cHJzLAorCQkJCQkJCQkJCQkJICAgc2FtcGxlLCBpc19vcmNsYXVz ZShjbGF1c2UpKTsKKworCQkJLyoKKwkJCSAqIE1lcmdlIHRoZSBiaXRtYXAgcHJvZHVjZWQg YnkgbWN2X2dldF9tYXRjaF9iaXRtYXAgaW50byB0aGUKKwkJCSAqIGN1cnJlbnQgb25lLiBX ZSBuZWVkIHRvIGNvbnNpZGVyIGlmIHdlJ3JlIGV2YWx1YXRpbmcgQU5EIG9yIE9SCisJCQkg KiBjb25kaXRpb24gd2hlbiBtZXJnaW5nIHRoZSByZXN1bHRzLgorCQkJICovCisJCQlmb3Ig KGkgPSAwOyBpIDwgc2FtcGxlLT5ucm93czsgaSsrKQorCQkJCW1hdGNoZXNbaV0gPSBSRVNV TFRfTUVSR0UobWF0Y2hlc1tpXSwgaXNfb3IsIGJvb2xfbWF0Y2hlc1tpXSk7CisKKwkJCXBm cmVlKGJvb2xfbWF0Y2hlcyk7CisJCX0KKwkJZWxzZSBpZiAoaXNfbm90Y2xhdXNlKGNsYXVz ZSkpCisJCXsKKwkJCS8qIE5PVCBjbGF1c2UsIHdpdGggYWxsIHN1YmNsYXVzZXMgY29tcGF0 aWJsZSAqLworCisJCQlpbnQJCQlpOworCQkJQm9vbEV4cHIgICAqbm90X2NsYXVzZSA9ICgo Qm9vbEV4cHIgKikgY2xhdXNlKTsKKwkJCUxpc3QJICAgKm5vdF9hcmdzID0gbm90X2NsYXVz ZS0+YXJnczsKKworCQkJLyogbWF0Y2gvbWlzbWF0Y2ggYml0bWFwIGZvciBlYWNoIE1DViBp dGVtICovCisJCQlib29sCSAgICpub3RfbWF0Y2hlcyA9IE5VTEw7CisKKwkJCUFzc2VydChu b3RfYXJncyAhPSBOSUwpOworCQkJQXNzZXJ0KGxpc3RfbGVuZ3RoKG5vdF9hcmdzKSA9PSAx KTsKKworCQkJLyogYnVpbGQgdGhlIG1hdGNoIGJpdG1hcCBmb3IgdGhlIE5PVC1jbGF1c2Ug Ki8KKwkJCW5vdF9tYXRjaGVzID0gc2FtcGxlX2dldF9tYXRjaF9iaXRtYXAocm9vdCwgbm90 X2FyZ3MsIGtleXMsIGV4cHJzLAorCQkJCQkJCQkJCQkJICBzYW1wbGUsIGZhbHNlKTsKKwor CQkJLyoKKwkJCSAqIE1lcmdlIHRoZSBiaXRtYXAgcHJvZHVjZWQgYnkgbWN2X2dldF9tYXRj aF9iaXRtYXAgaW50byB0aGUKKwkJCSAqIGN1cnJlbnQgb25lLiBXZSdyZSBoYW5kbGluZyBh IE5PVCBjbGF1c2UsIHNvIGludmVydCB0aGUgcmVzdWx0CisJCQkgKiBiZWZvcmUgbWVyZ2lu ZyBpdCBpbnRvIHRoZSBnbG9iYWwgYml0bWFwLgorCQkJICovCisJCQlmb3IgKGkgPSAwOyBp IDwgc2FtcGxlLT5ucm93czsgaSsrKQorCQkJCW1hdGNoZXNbaV0gPSBSRVNVTFRfTUVSR0Uo bWF0Y2hlc1tpXSwgaXNfb3IsICFub3RfbWF0Y2hlc1tpXSk7CisKKwkJCXBmcmVlKG5vdF9t YXRjaGVzKTsKKwkJfQorCQllbHNlIGlmIChJc0EoY2xhdXNlLCBWYXIpKQorCQl7CisJCQkv KiBWYXIgKGhhcyB0byBiZSBhIGJvb2xlYW4gVmFyLCBwb3NzaWJseSBmcm9tIGJlbG93IE5P VCkgKi8KKwkJCVZhcgkJICAgKnZhciA9IChWYXIgKikgKGNsYXVzZSk7CisJCQlpbnQJCQlp OworCisJCQkvKiBtYXRjaCB0aGUgYXR0cmlidXRlIHRvIGEgZGltZW5zaW9uIG9mIHRoZSBz dGF0aXN0aWMgKi8KKwkJCWludAkJCWlkeCA9IGJtc19tZW1iZXJfaW5kZXgoa2V5cywgdmFy LT52YXJhdHRubyk7CisKKwkJCUFzc2VydCh2YXItPnZhcnR5cGUgPT0gQk9PTE9JRCk7CisK KwkJCS8qCisJCQkgKiBXYWxrIHRocm91Z2ggdGhlIE1DViBpdGVtcyBhbmQgZXZhbHVhdGUg dGhlIGN1cnJlbnQgY2xhdXNlLiBXZQorCQkJICogY2FuIHNraXAgaXRlbXMgdGhhdCB3ZXJl IGFscmVhZHkgcnVsZWQgb3V0LCBhbmQgdGVybWluYXRlIGlmCisJCQkgKiB0aGVyZSBhcmUg bm8gcmVtYWluaW5nIE1DViBpdGVtcyB0aGF0IG1pZ2h0IHBvc3NpYmx5IG1hdGNoLgorCQkJ ICovCisJCQlmb3IgKGkgPSAwOyBpIDwgc2FtcGxlLT5ucm93czsgaSsrKQorCQkJeworCQkJ CURhdHVtCSAgICp2YWx1ZXMgPSAmc2FtcGxlLT52YWx1ZXNbaSAqIG5hdHRyc107CisJCQkJ Ym9vbAkgICAqaXNudWxsID0gJnNhbXBsZS0+aXNudWxsW2kgKiBuYXR0cnNdOworCQkJCWJv b2wJCW1hdGNoID0gZmFsc2U7CisKKwkJCQkvKiBpZiB0aGUgaXRlbSBpcyBOVUxMLCBpdCdz IGEgbWlzbWF0Y2ggKi8KKwkJCQlpZiAoIWlzbnVsbFtpZHhdICYmIERhdHVtR2V0Qm9vbCh2 YWx1ZXNbaWR4XSkpCisJCQkJCW1hdGNoID0gdHJ1ZTsKKworCQkJCS8qIHVwZGF0ZSB0aGUg cmVzdWx0IGJpdG1hcCAqLworCQkJCW1hdGNoZXNbaV0gPSBSRVNVTFRfTUVSR0UobWF0Y2hl c1tpXSwgaXNfb3IsIG1hdGNoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCQllbG9nKEVSUk9S LCAidW5rbm93biBjbGF1c2UgdHlwZTogJWQiLCBjbGF1c2UtPnR5cGUpOworCX0KKworCXJl dHVybiBtYXRjaGVzOworfQorCitzdGF0aWMgU2VsZWN0aXZpdHkKK3NhbXBsZV9jbGF1c2Vs aXN0X3NlbGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290LCBTdGF0aXN0aWNFeHRJbmZvICpz dGF0LAorCQkJCQkJCSAgU2FtcGxlICpzYW1wbGUsIExpc3QgKmNsYXVzZXMsIGludCB2YXJS ZWxpZCwKKwkJCQkJCQkgIEpvaW5UeXBlIGpvaW50eXBlLCBTcGVjaWFsSm9pbkluZm8gKnNq aW5mbywKKwkJCQkJCQkgIFJlbE9wdEluZm8gKnJlbCwgYm9vbCBpc19vcikKK3sKKwlpbnQJ CQlpOworCWludAkJCW1hdGNoZWQ7CisKKwkvKiBtYXRjaC9taXNtYXRjaCBiaXRtYXAgZm9y IGVhY2ggc2FtcGxlZCByb3cgKi8KKwlib29sCSAgICptYXRjaGVzID0gTlVMTDsKKworCS8q IGJ1aWxkIGEgbWF0Y2ggYml0bWFwIGZvciB0aGUgY2xhdXNlcyAqLworCW1hdGNoZXMgPSBz YW1wbGVfZ2V0X21hdGNoX2JpdG1hcChyb290LCBjbGF1c2VzLAorCQkJCQkJCQkJICBzYW1w bGUtPmF0dG51bXMsIHNhbXBsZS0+ZXhwcnMsCisJCQkJCQkJCQkgIHNhbXBsZSwgaXNfb3Ip OworCisJLyogc3VtIGZyZXF1ZW5jaWVzIGZvciBhbGwgdGhlIG1hdGNoaW5nIHNhbXBsZWQg cm93cyAqLworCW1hdGNoZWQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBzYW1wbGUtPm5yb3dz OyBpKyspCisJeworCQlpZiAobWF0Y2hlc1tpXSAhPSBmYWxzZSkKKwkJCW1hdGNoZWQrKzsK Kwl9CisKKwlyZXR1cm4gbWF0Y2hlZCAvIChkb3VibGUpIHNhbXBsZS0+bnJvd3M7Cit9CisK Ky8qCisgKiBzdGF0ZXh0X3NhbXBsZV9nZXRfY29uZGl0aW9ucworICoJCUdldCBjb25kaXRp b25zIG9uIGJhc2UgcmVsYXRpb25zLCB0byBiZSB1c2VkIGFzIGNvbmRpdGlvbnMgZm9yIGpv aW5zLgorICoKKyAqIFdoZW4gZXN0aW1hdGluZyBqb2lucyB1c2luZyBleHRlbmRlZCBzdGF0 aXN0aWNzLCB3ZSBjYW4gYXBwbHkgY29uZGl0aW9ucworICogZnJvbSBiYXNlIHJlbGF0aW9u cyBhcyBjb25kaXRpb25zLiBUaGlzIHBlZWtzIGF0IHRoZSBiYXNlcmVzdHJpY3RpbmZvCisg KiBsaXN0IGZvciBhIHJlbGF0aW9uIGFuZCBleHRyYWN0cyB0aG9zZSB0aGF0IGFyZSBjb21w YXRpYmxlIHdpdGggZXh0ZW5kZWQKKyAqIHN0YXRpc3RpY3MuCisgKgorICogWFhYIFJlcXVp cmluZyBzdGF0ZXh0X2lzX2NvbXBhdGlibGVfY2xhdXNlIGZvciBzYW1wbGVzIGlzIGEgYml0 IGJvZ3VzLCBhcworICogc2FtcGxlcyBjYW4gYmUgdXNlZCB0byBlc3RpbWF0ZSBhbG1vc3Qg YW55IGV4cHJlc3Npb24uIFNvIHdlIHNob3VsZCByZWxheAorICogdGhpcyBpbiB0aGUgZnV0 dXJlLCBwcm9iYWJseS4KKyAqLworc3RhdGljIExpc3QgKgorc3RhdGV4dF9zYW1wbGVfZ2V0 X2NvbmRpdGlvbnMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKKwkJCQkJ CSAgIFN0YXRpc3RpY0V4dEluZm8gKmluZm8pCit7CisJTGlzdENlbGwgICAqbGM7CisJTGlz dAkgICAqY29uZGl0aW9ucyA9IE5JTDsKKworCS8qIGV4dHJhY3QgY29uZGl0aW9ucyB0aGF0 IG1heSBiZSBhcHBsaWVkIHRvIHRoZSBNQ1YgbGlzdCAqLworCWZvcmVhY2ggKGxjLCByZWwt PmJhc2VyZXN0cmljdGluZm8pCisJeworCQlSZXN0cmljdEluZm8gKnJpbmZvID0gKFJlc3Ry aWN0SW5mbyAqKSBsZmlyc3QobGMpOworCQlCaXRtYXBzZXQgKmluZGV4ZXMgPSBOVUxMOwor CQlCaXRtYXBzZXQgKmF0dG51bXMgPSBOVUxMOworCQlMaXN0ICpleHBycyA9IE5JTDsKKwor CQkvKiBjbGF1c2UgaGFzIHRvIGJlIHN1cHBvcnRlZCBieSBzYW1wbGUgaW4gZ2VuZXJhbCAq LworCQlpZiAoIXN0YXRleHRfaXNfY29tcGF0aWJsZV9jbGF1c2Uocm9vdCwgKE5vZGUgKikg cmluZm8sIHJlbC0+cmVsaWQsCisJCQkJCQkJCQkJICAmYXR0bnVtcywgJmV4cHJzKSkKKwkJ CWNvbnRpbnVlOworCisJCS8qCisJCSAqIGNsYXVzZSBpcyBjb21wYXRpYmxlIGluIGdlbmVy YWwsIGJ1dCBpcyBpdCBhY3R1YWxseSBjb3ZlcmVkCisJCSAqIGJ5IHRoaXMgcGFydGl1bGFy IHN0YXRpc3RpY3Mgb2JqZWN0PworCQkgKi8KKwkJaWYgKCFibXNfaXNfc3Vic2V0KGF0dG51 bXMsIGluZm8tPmtleXMpIHx8CisJCQkhc3RhdF9jb3ZlcnNfZXhwcmVzc2lvbnMoaW5mbywg ZXhwcnMsICZpbmRleGVzKSkKKwkJCWNvbnRpbnVlOworCisJCWNvbmRpdGlvbnMgPSBsYXBw ZW5kKGNvbmRpdGlvbnMsIHJpbmZvLT5jbGF1c2UpOworCX0KKworCXJldHVybiBjb25kaXRp b25zOworfQorCisvKgorICogc3RhdGV4dF9tY3ZfZXZhbF9jb25kaXRpb25zCisgKgkJRXZh bHVhdGUgYSBsaXN0IG9mIGNvbmRpdGlvbnMgb24gdGhlIHNhbXBsZS4KKyAqCisgKiBUaGlz IHJldHVybnMgYSBtYXRjaCBiaXRtYXAgZm9yIHRoZSBjb25kaXRpb25zLCB3aGljaCBjYW4g YmUgdXNlZCBsYXRlcgorICogdG8gcmVzdHJpY3QganVzdCB0aGUgImludGVyZXN0aW5nIiBw YXJ0IG9mIHRoZSBzYW1wbGUuIEFsc28gcmV0dXJucworICogdGhlIHNlbGVjdGl2aXR5IG9m IHRoZSBjb25kaXRpb25zLCBvciAxLjAgaWYgdGhlcmUgYXJlIG5vIGNvbmRpdGlvbnMuCisg Ki8KK3N0YXRpYyBib29sICoKK3N0YXRleHRfc2FtcGxlX2V2YWxfY29uZGl0aW9ucyhQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJCQkJCSAgIFN0YXRpc3RpY0V4 dEluZm8gKnN0YXQsIFNhbXBsZSAqc2FtcGxlLAorCQkJCQkJCSAgIFNlbGVjdGl2aXR5ICpz ZWwpCit7CisJTGlzdCAgICpjb25kaXRpb25zOworCisJLyogZXZlcnl0aGluZyBtYXRjaGVz IGJ5IGRlZmF1bHQgKi8KKwkqc2VsID0gMS4wOworCisJLyoKKwkgKiBYWFggV2UndmUgYWxy ZWFkeSBldmFsdWF0ZWQgdGhpcyBiZWZvcmUsIHdoZW4gcGlja2luZyB0aGUgc3RhdGlzdGlj cworCSAqIG9iamVjdC4gTWF5YmUgd2Ugc2hvdWxkIHN0YXNoIGl0IHNvbWV3aGVyZSwgc28g dGhhdCB3ZSBkb24ndCBoYXZlIHRvCisJICogZXZhbHVhdGUgaXQgYWdhaW4uCisJICovCisJ Y29uZGl0aW9ucyA9IHN0YXRleHRfc2FtcGxlX2dldF9jb25kaXRpb25zKHJvb3QsIHJlbCwg c3RhdCk7CisKKwkvKiBJZiBubyBjb25kaXRpb25zLCB3ZSdyZSBkb25lLiAqLworCWlmICgh Y29uZGl0aW9ucykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiB3aGF0J3MgdGhlIHNlbGVjdGl2 aXR5IG9mIHRoZSBjb25kaXRpb25zIGFsb25lPyAqLworCSpzZWwgPSBjbGF1c2VsaXN0X3Nl bGVjdGl2aXR5KHJvb3QsIGNvbmRpdGlvbnMsIHJlbC0+cmVsaWQsIDAsIE5VTEwpOworCisJ cmV0dXJuIHNhbXBsZV9nZXRfbWF0Y2hfYml0bWFwKHJvb3QsIGNvbmRpdGlvbnMsIHN0YXQt PmtleXMsIHN0YXQtPmV4cHJzLAorCQkJCQkJCQkgICBzYW1wbGUsIGZhbHNlKTsKK30KKwor c3RhdGljIGJvb2wKK3N0YXRleHRfY2FuX3VzZV9jb3JyZWxhdGVkX3NhbXBsZShQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBMaXN0ICpjbGF1c2VzKQoreworCVJhbmdl VGJsRW50cnkgKnJ0ZSA9IHBsYW5uZXJfcnRfZmV0Y2gocmVsLT5yZWxpZCwgcm9vdCk7CisJ T2lkCQlyZWxpZCA9IHJ0ZS0+cmVsaWQ7CisJT2lkCQljb25zdHJhaW50T2lkOworCUJpdG1h cHNldCAqcGthdHRub3MgPSBOVUxMOworCUJpdG1hcHNldCAqYXR0bm9zID0gTlVMTDsKKwor CXBrYXR0bm9zID0gZ2V0X3ByaW1hcnlfa2V5X2F0dG5vcyhyZWxpZCwgdHJ1ZSwgJmNvbnN0 cmFpbnRPaWQpOworCisJaWYgKCFPaWRJc1ZhbGlkKGNvbnN0cmFpbnRPaWQpKQorCQlyZXR1 cm4gZmFsc2U7CisKKwlwdWxsX3ZhcmF0dG5vcygoTm9kZSAqKSBjbGF1c2VzLCByZWwtPnJl bGlkLCAmYXR0bm9zKTsKKworCWlmICghYm1zX2VxdWFsKGF0dG5vcywgcGthdHRub3MpKQor CQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIHN0YXRleHRf Y29tcGFyZV9zYW1wbGVzCisgKgkJQ2FsY3VsdGUgam9pbiBzZWxlY3Rpdml0eSB1c2luZyBl eHRlbmRlZCBzdGF0aXN0aWNzLCBzaW1pbGFybHkgdG8KKyAqCQllcWpvaW5zZWxfaW5uZXIu CisgKgorICogQ29uc2lkZXJzIHJlc3RyaWN0aW9ucyBvbiBiYXNlIHJlbGF0aW9ucyB0b28s IGVzc2VudGlhbGx5IGNvbXB1dGluZworICogYSBjb25kaXRpb25hbCBwcm9iYWJpbGl0eQor ICoKKyAqCVAoam9pbiBjbGF1c2VzIHwgYmFzZXJlc3RyaWN0aW5mb3Mgb24gZWl0aGVyIHNp ZGUpCisgKgorICogQ29tcGFyZWQgdG8gZXFqb2luc2VsX2lubmVyIHRoZXJlJ3MgYSBjb3Vw bGUgcHJvYmxlbXMuIFdpdGggcGVyLWNvbHVtbgorICogTUNWIGxpc3RzIGl0J3Mgb2J2aW91 cyB0aGF0IHRoZSBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzIG5vdCBjb3ZlcmVkCisgKiBi eSB0aGUgTUNWIGlzIChuZGlzdGluY3QgLSBzaXplKE1DVikpLiBXaXRoIG11bHRpLWNvbHVt biBNQ1ZzIGl0J3Mgbm90CisgKiB0aGF0IHNpbXBsZSwgcGFydGljdWxhcmx5IHdoZW4gdGhl IGNvbmRpdGlvbnMgYXJlIG9uIGEgc3Vic2V0IG9mIHRoZQorICogTUNWIGFuZCBOVUxMcyBh cmUgaW52b2x2ZWQuIEUuZy4gd2l0aCBNQ1YgKGEsYixjKSBhbmQgY29uZGl0aW9ucyBvbgor ICogKGEsYiksIGl0J3Mgbm90IGNsZWFyIGlmIHRoZSBudW1iZXIgb2YgKGEsYikgY29tYmlu YXRpb25zIG5vdCBjb3ZlcmVkCisgKiBieSB0aGUgTUNWIGlzCisgKgorICogKG5kaXN0aW5j dChhLGIpIC0gbmRpc3RpbmN0X21jdihhLGIpKQorICoKKyAqIHdoZXJlIG5kaXN0aW5jdF9t Y3YoYSxiKSBpcyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IChhLGIpIGNvbWJpbmF0aW9ucwor ICogaW5jbHVkZWQgaW4gdGhlIE1DViBsaXN0LiBUaGVzZSBjb21iaW5hdGlvbnMgbWF5IGJl IHByZXNlbnQgaW4gdGhlIHJlc3QKKyAqIG9mIHRoZSBkYXRhIChvdXRzaWRlIE1DViksIGp1 c3Qgd2l0aCBzb21lIGV4dHJhIHZhbHVlcyBpbiAiYyIuIFNvIGluCisgKiBwcmluY2lwbGUg dGhlcmUgbWF5IGJlIGJldHdlZW4KKyAqCisgKiAobmRpc3RpbmN0KGEsYikgLSBuZGlzdGlu Y3RfbWN2KGEsYikpIGFuZCBuZGlzdGluY3QoYSxiKQorICoKKyAqIGRpc3RpbmN0IHZhbHVl cyBpbiB0aGUgcmVzdCBvZiB0aGUgZGF0YS4gU28gd2UgbmVlZCB0byBwaWNrIHNvbWV0aGlu ZworICogaW4gYmV0d2VlbiwgdGhlcmUncyBubyB3YXkgdG8gY2FsY3VsYXRlIHRoaXMgYWNj dXJhdGVseS4KKyAqLworc3RhdGljIFNlbGVjdGl2aXR5CitzdGF0ZXh0X2NvbXBhcmVfc2Ft cGxlcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsMSwgUmVsT3B0SW5mbyAq cmVsMiwKKwkJCQkJCVN0YXRpc3RpY0V4dEluZm8gKnN0YXQxLCBTdGF0aXN0aWNFeHRJbmZv ICpzdGF0MiwKKwkJCQkJCUxpc3QgKmNsYXVzZXMpCit7CisJU2FtcGxlICpzYW1wbGUxOwor CVNhbXBsZSAqc2FtcGxlMjsKKwlpbnQJCWksIGo7CisJU2VsZWN0aXZpdHkgcyA9IDA7CisK KwkvKiBpdGVtcyBlbGltaW5hdGVkIGJ5IGNvbmRpdGlvbnMgKGlmIGFueSkgKi8KKwlib29s ICAgKmNvbmRpdGlvbnMxID0gTlVMTCwKKwkJICAgKmNvbmRpdGlvbnMyID0gTlVMTDsKKwor CWRvdWJsZQljb25kaXRpb25zMV9zZWwgPSAxLjAsCisJCQljb25kaXRpb25zMl9zZWwgPSAx LjA7CisKKwlib29sICAgKm1hdGNoZXMxID0gTlVMTCwKKwkJICAgKm1hdGNoZXMyID0gTlVM TDsKKworCWRvdWJsZQltYXRjaGZyZXExLAorCQkJdW5tYXRjaGZyZXExLAorCQkJbWF0Y2hm cmVxMiwKKwkJCXVubWF0Y2hmcmVxMiwKKwkJCWZyZXExLAorCQkJZnJlcTI7CisKKwlpbnQ2 NAlubWF0Y2hlcyA9IDAsCisJCQlubWF0Y2hlczEgPSAwLAorCQkJbnVubWF0Y2hlczEgPSAw LAorCQkJbm1hdGNoZXMyID0gMCwKKwkJCW51bm1hdGNoZXMyID0gMDsKKwlpbnQ2NAl0b3Rh bCA9IDA7CisKKwlib29sCWNvcnJlbGF0ZWQgPSBmYWxzZTsKKworCS8qCisJICogWFhYIEV4 dHJhY3QgYXR0bnVtcyAvIGV4cHJlc3Npb25zIGFuZCBzYW1wbGUganVzdCB0aG9zZS4KKwkg KgorCSAqIFhYWCBUaGUgb3RoZXIgdGhpbmcgd2UgY291bGQgZG8gaXMgc2FtcGxpbmcganVz dCB0aGUgcm93cworCSAqIG1hdGNoaW5nIHRoZSBjb25kaXRpb25zLCB3aGljaCB3b3VsZCBt YWtlIHRoZSBzYW1wbGUgYSBiaXQKKwkgKiBzbWFsbGVyLgorCSAqCisJICogWFhYIEFuZCBm aW5hbGx5IHdlIGNhbiBkbyBHUk9VUCBCWSB0byBjb21iaW5lIGR1cGxpY2F0ZSB2YWx1ZXMs CisJICogd2hpY2ggc2hvdWxkIG1ha2UgdGhlIHNhbXBsZSB5ZXQgYSBiaXQgc21hbGxlciBh bmQgY2hlYXBlciB0bworCSAqIHByb2Nlc3MuIEl0J2xsIGJlIGEgYml0IGxpa2UgYSBsYXJn ZSBNQ1YsIHdpdGggZWFjaCByb3cgaGF2aW5nIGEKKwkgKiBmcmVxdWVuY3kuIFRoaXMgY2Fu IGJlIGRvbmUgZWFzaWx5IGluIFNQSSwgaG93ZXZlciB0aGF0IG1lYW5zIHRoZQorCSAqIHF1 ZXJ5IHdpbGwgYmUgZGVwZW5kZW50IG9uIHRoZSBwbGFubmVyIChpdCdsbCBwaWNrIHRoZSBn cm91cGluZworCSAqIGFsZ29yaXRobSkuCisJICoKKwkgKiBYWFggV2UgY291bGQgYWxzbyBi dWlsZCBhIGNvdW50LW1pbiBza2V0Y2ggaW5zdGVhZCBvZiB0aGUgc2FtcGxlLgorCSAqIFdl IGNhbid0IHJlc3RyaWN0IHRoZSBjb3VudC1taW4gc2tldGNoIHdpdGggdGhlIGNvbmRpdGlv bnMsIGJ1dAorCSAqIHdlIGNhbiBhcHBseSB0aGUgY29uZGl0aW9ucyAqYmVmb3JlKiB0aGUg c2tldGNoIGdldHMgYnVpbHQuIE5vdAorCSAqIHN1cmUgaWYgdGhhdCBjYW4gYWZmZWN0IHRo ZSBxdWVyeSBwbGFuIChlLmcuIGJ5IHVzaW5nIGluZGV4IGZvcgorCSAqIHRoZSBjb25kaXRp b25zKS4KKwkgKi8KKwlpZiAoZW5hYmxlX3NhbXBsZV9qb2luX2NvcnJlbGF0ZSAmJgorCQlz dGF0ZXh0X2Nhbl91c2VfY29ycmVsYXRlZF9zYW1wbGUocm9vdCwgcmVsMSwgY2xhdXNlcykp CisJeworCQlzYW1wbGUyID0gc3RhdGV4dF9jb2xsZWN0X3NhbXBsZShyb290LCBzdGF0Mik7 CisJCXNhbXBsZTEgPSBzdGF0ZXh0X2NvbGxlY3RfY29ycmVsYXRlZF9zYW1wbGUocm9vdCwg c3RhdDEsIHN0YXQyLCBzYW1wbGUyLCBjbGF1c2VzKTsKKwkJY29ycmVsYXRlZCA9IHRydWU7 CisJfQorCWVsc2UgaWYgKGVuYWJsZV9zYW1wbGVfam9pbl9jb3JyZWxhdGUgJiYKKwkJCSBz dGF0ZXh0X2Nhbl91c2VfY29ycmVsYXRlZF9zYW1wbGUocm9vdCwgcmVsMiwgY2xhdXNlcykp CisJeworCQlzYW1wbGUxID0gc3RhdGV4dF9jb2xsZWN0X3NhbXBsZShyb290LCBzdGF0MSk7 CisJCXNhbXBsZTIgPSBzdGF0ZXh0X2NvbGxlY3RfY29ycmVsYXRlZF9zYW1wbGUocm9vdCwg c3RhdDIsIHN0YXQxLCBzYW1wbGUxLCBjbGF1c2VzKTsKKwkJY29ycmVsYXRlZCA9IHRydWU7 CisJfQorCWVsc2UKKwl7CisJCXNhbXBsZTEgPSBzdGF0ZXh0X2NvbGxlY3Rfc2FtcGxlKHJv b3QsIHN0YXQxKTsKKwkJc2FtcGxlMiA9IHN0YXRleHRfY29sbGVjdF9zYW1wbGUocm9vdCwg c3RhdDIpOworCX0KKworCS8qIHNob3VsZCBvbmx5IGdldCBoZXJlIHdpdGggc2FtcGxlcyBv biBib3RoIHNpZGVzICovCisJQXNzZXJ0KHNhbXBsZTEgJiYgc2FtcGxlMik7CisKKwltYXRj aGVzMSA9IChib29sICopIHBhbGxvYzAoc2l6ZW9mKGJvb2wpICogc2FtcGxlMS0+bnJvd3Mp OworCW1hdGNoZXMyID0gKGJvb2wgKikgcGFsbG9jMChzaXplb2YoYm9vbCkgKiBzYW1wbGUy LT5ucm93cyk7CisKKwkvKiBhcHBseSBiYXNlcmVzdHJpY3RpbmZvIGNvbmRpdGlvbnMgb24g dGhlIE1DViBsaXN0cyAqLworCisJY29uZGl0aW9uczEgPSBzdGF0ZXh0X3NhbXBsZV9ldmFs X2NvbmRpdGlvbnMocm9vdCwgcmVsMSwgc3RhdDEsIHNhbXBsZTEsCisJCQkJCQkJCQkJCQkg JmNvbmRpdGlvbnMxX3NlbCk7CisKKwljb25kaXRpb25zMiA9IHN0YXRleHRfc2FtcGxlX2V2 YWxfY29uZGl0aW9ucyhyb290LCByZWwyLCBzdGF0Miwgc2FtcGxlMiwKKwkJCQkJCQkJCQkJ CSAmY29uZGl0aW9uczJfc2VsKTsKKworCS8qCisJICogTWF0Y2ggaXRlbXMgZnJvbSB0aGUg dHdvIHNhbXBsZXMuCisJICoKKwkgKiBXZSBkb24ndCBrbm93IGlmIHRoZSBtYXRjaGVzIGFy ZSAxOjEgLSB3ZSBtYXkgaGF2ZSBvdmVybGFwIG9uIG9ubHkKKwkgKiBhIHN1YnNldCBvZiBh dHRyaWJ1dGVzLCBlLmcuIChhLGIsYykgdnMuIChiLGMsZCksIHNvIHRoZXJlIG1heSBiZQor CSAqIG11bHRpcGxlIG1hdGNoZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IHNhbXBsZTEt Pm5yb3dzOyBpKyspCisJeworCQlpbnQJc3RhcnQgPSAwOworCQlpbnQJZW5kID0gc2FtcGxl Mi0+bnJvd3M7CisKKwkJLyogc2tpcCBpdGVtcyBlbGltaW5hdGVkIGJ5IHJlc3RyaWN0aW9u cyBvbiByZWwxICovCisJCWlmIChjb25kaXRpb25zMSAmJiAhY29uZGl0aW9uczFbaV0pCisJ CQljb250aW51ZTsKKworCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOworCisJCWlmIChjb3Jy ZWxhdGVkKQorCQl7CisJCQlzdGFydCA9IGk7CisJCQllbmQgPSBpKzE7CisJCX0KKworCQkv KiBmaW5kIG1hdGNoZXMgaW4gdGhlIHNlY29uZCBNQ1YgbGlzdCAqLworCQlmb3IgKGogPSBz dGFydDsgaiA8IGVuZDsgaisrKQorCQl7CisJCQlMaXN0Q2VsbCAgICpsYzsKKwkJCWJvb2wJ CWl0ZW1zX21hdGNoID0gdHJ1ZTsKKworCQkJLyogc2tpcCBpdGVtcyBlbGltaW5hdGVkIGJ5 IHJlc3RyaWN0aW9ucyBvbiByZWwyICovCisJCQlpZiAoY29uZGl0aW9uczIgJiYgIWNvbmRp dGlvbnMyW2pdKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3JlYWNoIChsYywgY2xhdXNlcykK KwkJCXsKKwkJCQlOb2RlICpjbGF1c2UgPSAoTm9kZSAqKSBsZmlyc3QobGMpOworCQkJCUJp dG1hcHNldCAgKmF0dHMxID0gTlVMTDsKKwkJCQlCaXRtYXBzZXQgICphdHRzMiA9IE5VTEw7 CisJCQkJRGF0dW0JCXZhbHVlMSwgdmFsdWUyOworCQkJCWludAkJCWluZGV4MSwgaW5kZXgy OworCQkJCUF0dHJOdW1iZXIJYXR0bnVtMTsKKwkJCQlBdHRyTnVtYmVyCWF0dG51bTI7CisJ CQkJYm9vbAkJbWF0Y2g7CisJCQkJaW50CQkJbmF0dHMxID0gYm1zX251bV9tZW1iZXJzKHNh bXBsZTEtPmF0dG51bXMpICsgbGlzdF9sZW5ndGgoc2FtcGxlMS0+ZXhwcnMpOworCQkJCWlu dAkJCW5hdHRzMiA9IGJtc19udW1fbWVtYmVycyhzYW1wbGUyLT5hdHRudW1zKSArIGxpc3Rf bGVuZ3RoKHNhbXBsZTItPmV4cHJzKTsKKworCQkJCUZtZ3JJbmZvCW9wcHJvYzsKKwkJCQlP cEV4cHIJICAgKmV4cHIgPSAoT3BFeHByICopIGNsYXVzZTsKKworCQkJCUFzc2VydChpc19v cGNsYXVzZShjbGF1c2UpKTsKKworCQkJCWZtZ3JfaW5mbyhnZXRfb3Bjb2RlKGV4cHItPm9w bm8pLCAmb3Bwcm9jKTsKKworCQkJCS8qIGRldGVybWluZSB0aGUgY29sdW1ucyBpbiBlYWNo IHN0YXRpc3RpY3Mgb2JqZWN0ICovCisKKwkJCQkvKiBGSVhNRSBtYWtlIHRoaXMgd29yayB3 aXRoIGV4cHJlc3Npb25zIHRvbyAqLworCQkJCXB1bGxfdmFyYXR0bm9zKGNsYXVzZSwgcmVs MS0+cmVsaWQsICZhdHRzMSk7CisJCQkJYXR0bnVtMSA9IGJtc19zaW5nbGV0b25fbWVtYmVy KGF0dHMxKSArIEZpcnN0TG93SW52YWxpZEhlYXBBdHRyaWJ1dGVOdW1iZXI7CisJCQkJaW5k ZXgxID0gYm1zX21lbWJlcl9pbmRleChzdGF0MS0+a2V5cywgYXR0bnVtMSk7CisKKwkJCQlw dWxsX3ZhcmF0dG5vcyhjbGF1c2UsIHJlbDItPnJlbGlkLCAmYXR0czIpOworCQkJCWF0dG51 bTIgPSBibXNfc2luZ2xldG9uX21lbWJlcihhdHRzMikgKyBGaXJzdExvd0ludmFsaWRIZWFw QXR0cmlidXRlTnVtYmVyOworCQkJCWluZGV4MiA9IGJtc19tZW1iZXJfaW5kZXgoc3RhdDIt PmtleXMsIGF0dG51bTIpOworCisJCQkJLyogdHJhbnNsYXRlIGF0dHIgaW5kZXhlcyB0byBp bmRleCBpbiB0aGUgc2FtcGxlIGFycmF5cyAqLworCQkJCWluZGV4MSA9IGkgKiBuYXR0czEg KyBpbmRleDE7CisJCQkJaW5kZXgyID0gaiAqIG5hdHRzMiArIGluZGV4MjsKKworCQkJCWJt c19mcmVlKGF0dHMxKTsKKwkJCQlibXNfZnJlZShhdHRzMik7CisKKwkJCQkvKiBpZiBlaXRo ZXIgdmFsdWUgaXMgbnVsbCwgd2UncmUgZG9uZSAqLworCQkJCWlmIChzYW1wbGUxLT5pc251 bGxbaW5kZXgxXSB8fCBzYW1wbGUyLT5pc251bGxbaW5kZXgyXSkKKwkJCQkJbWF0Y2ggPSBm YWxzZTsKKwkJCQllbHNlCisJCQkJeworCQkJCQl2YWx1ZTEgPSBzYW1wbGUxLT52YWx1ZXNb aW5kZXgxXTsKKwkJCQkJdmFsdWUyID0gc2FtcGxlMi0+dmFsdWVzW2luZGV4Ml07CisKKwkJ CQkJLyoKKwkJCQkJICogRklYTUUgTWlnaHQgaGF2ZSBpc3N1ZXMgd2l0aCBvcmRlciBvZiBw YXJhbWV0ZXJzLCBidXQgZm9yCisJCQkJCSAqIHNhbWUtdHlwZSBlcXVhbGl0eSB0aGF0IHNo b3VsZCBub3QgbWF0dGVyLgorCQkJCQkgKiAqLworCQkJCQltYXRjaCA9IERhdHVtR2V0Qm9v bChGdW5jdGlvbkNhbGwyQ29sbCgmb3Bwcm9jLAorCQkJCQkJCQkJCQkJCQkgICBJbnZhbGlk T2lkLAorCQkJCQkJCQkJCQkJCQkgICB2YWx1ZTEsIHZhbHVlMikpOworCQkJCX0KKworCQkJ CWl0ZW1zX21hdGNoICY9IG1hdGNoOworCisJCQkJaWYgKCFpdGVtc19tYXRjaCkKKwkJCQkJ YnJlYWs7CisJCQl9CisKKwkJCWlmIChpdGVtc19tYXRjaCkKKwkJCXsKKwkJCQltYXRjaGVz MVtpXSA9IG1hdGNoZXMyW2pdID0gdHJ1ZTsKKwkJCQlubWF0Y2hlcyArPSAxOworCQkJfQor CQl9CisJfQorCisJaWYgKGNvcnJlbGF0ZWQpCisJCXRvdGFsID0gKGludDY0KSBNaW4oc2Ft cGxlMS0+bnJvd3MsIHN0YXQxLT5yZWwtPnR1cGxlcykgKiAoaW50NjQpIE1pbihzYW1wbGUy LT5ucm93cywgc3RhdDItPnJlbC0+dHVwbGVzKTsKKwllbHNlCisJCXRvdGFsID0gKGludDY0 KSBzYW1wbGUxLT5ucm93cyAqIChpbnQ2NCkgc2FtcGxlMi0+bnJvd3M7CisKKwlzID0gbm1h dGNoZXMgLyAoZG91YmxlKSB0b3RhbDsKKworCWVsb2coV0FSTklORywgInN0YXRleHRfY29t cGFyZV9zYW1wbGVzIG5tYXRjaGVzICVsZCBjYXJ0ZXNpYW4gJWxkIHMgJWYiLCBubWF0Y2hl cywgdG90YWwsIHMpOworCisJLyoKKwkgKiBYWFggVGhlICJ1bm1hdGNoZWQiIGZyZXF1ZW5j aWVzIGFyZSBwcm9iYWJseSBub3QgbmVlZGVkLCBhcyB0aGUKKwkgKiBzYW1wbGUgc2hvdWxk IGNvdmVyIHRoZSB3aG9sZSBkYXRhIHNldCAodW5saWtlIGEgTUNWIGxpc3QpLgorCSAqCisJ ICogWFhYIFdlIHNob3VsZCBob3dldmVyIGxvb2sgYXQgdGhlIG51bWJlciBvZiBkaXN0aW5j dCBncm91cHMgaW4KKwkgKiB0aGUgbWF0Y2hlZCBjb2x1bW5zL2V4cHJlc3Npb25zLCB3aGlj aCBzaG91bGQgaGVscCB1cyB0byBjYWxjdWxhdGUKKwkgKiBzZWxlY3Rpdml0eSBmb3IgdGhl IHdob2xlIGNyb3NzIGpvaW4uIE9uZSBwb3NzaWJsZSBleHRyZW1lIGlzIHdlCisJICogc2F3 IGFsbCB0aGUgZGlzdGluY3QgdmFsdWVzLCBhbmQgdGhhdCBhbGwgdGhlIGdyb3VwcyBncm93 IGFib3V0CisJICogcHJvcG9ydGlvbmFsbHkgKGFuZCB0aGUgam9pbiBhcyB+c3F1YXJlIG9m IHRoYXQpLiBPciBtYXliZSB0aGVyZQorCSAqIGFyZSBtYW55IG90aGVyIGRpc3RpbmN0IGdy b3VwcywgaW4gd2hpY2ggY2FzZSB0aGUgam9pbiBncm93cworCSAqIHNsb3dseSAoY2xvc2Vy IHRvIGxpbmVhcikuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgc2FtcGxlMS0+bnJvd3M7 IGkrKykKKwl7CisJCWlmIChjb25kaXRpb25zMSAmJiAhY29uZGl0aW9uczFbaV0pCisJCQlj b250aW51ZTsKKworCQlpZiAobWF0Y2hlczFbaV0pCisJCQlubWF0Y2hlczErKzsKKwkJZWxz ZQorCQkJbnVubWF0Y2hlczErKzsKKwl9CisKKwltYXRjaGZyZXExID0gbm1hdGNoZXMxIC8g KGRvdWJsZSkgc2FtcGxlMS0+bnJvd3M7CisJdW5tYXRjaGZyZXExID0gbnVubWF0Y2hlczEg LyAoZG91YmxlKSBzYW1wbGUxLT5ucm93czsKKwlmcmVxMSA9IDEuMDsKKworCWZvciAoaSA9 IDA7IGkgPCBzYW1wbGUyLT5ucm93czsgaSsrKQorCXsKKwkJaWYgKGNvbmRpdGlvbnMyICYm ICFjb25kaXRpb25zMltpXSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtYXRjaGVzMltpXSkK KwkJCW5tYXRjaGVzMisrOworCQllbHNlCisJCQludW5tYXRjaGVzMisrOworCX0KKworCW1h dGNoZnJlcTIgPSBubWF0Y2hlczIgLyAoZG91YmxlKSBzYW1wbGUyLT5ucm93czsKKwl1bm1h dGNoZnJlcTIgPSBudW5tYXRjaGVzMiAvIChkb3VibGUpIHNhbXBsZTItPm5yb3dzOworCWZy ZXEyID0gMS4wOworCisJLyoKKwkgKiBjb3JyZWN0aW9uIGZvciBzYW1wbGUgcGFydHMgZWxp bWluYXRlZCBieSB0aGUgY29uZGl0aW9ucworCSAqCisJICogRklYTUUgZm9yICJpbXBvc3Np YmxlIiBjb25kaXRpb25zIHRoaXMgZG9lcyAvMCwgd2hpY2ggcmVzdWx0cyBpbgorCSAqIE5h TiBhbmQgb3RoZXIgd2VpcmQgc3R1ZmYuCisJICovCisJaWYgKChtYXRjaGZyZXExICsgdW5t YXRjaGZyZXExKSA+IDAgJiYgKG1hdGNoZnJlcTIgKyB1bm1hdGNoZnJlcTIpID4gMCkKKwkJ cyA9IHMgKiBmcmVxMSAqIGZyZXEyIC8gKG1hdGNoZnJlcTEgKyB1bm1hdGNoZnJlcTEpIC8g KG1hdGNoZnJlcTIgKyB1bm1hdGNoZnJlcTIpOworCWVsc2UKKwkJcyA9IDAuMDsKKworCWVs b2coV0FSTklORywgInN0YXRleHRfY29tcGFyZV9zYW1wbGVzIGNvcnJlY3RlZCAlZiIsIHMp OworCisJc2FtcGxlX2ZyZWUoc2FtcGxlMSk7CisJc2FtcGxlX2ZyZWUoc2FtcGxlMik7CisK KwlyZXR1cm4gczsKK30KKworLyoKKyAqIHN0YXRleHRfaXNfc3VwcG9ydGVkX2pvaW5fY2xh dXNlCisgKgkJQ2hlY2sgaWYgYSBqb2luIGNsYXVzZSBtYXkgYmUgZXN0aW1hdGVkIHVzaW5n IGV4dGVuZGVkIHN0YXRzLgorICoKKyAqIERldGVybWluZXMgaWYgdGhpcyBpcyBhIGpvaW4g Y2xhdXNlIG9mIHRoZSBmb3JtIChFeHByIG9wIEV4cHIpIHdoaWNoCisgKiBtYXkgYmUgZXN0 aW1hdGVkIHVzaW5nIGV4dGVuZGVkIHN0YXRpc3RpY3MuIEVhY2ggc2lkZSBtdXN0IHJlZmVy ZW5jZQorICoganVzdCBvbmUgcmVsYXRpb24gZm9yIG5vdy4KKyAqLworc3RhdGljIGJvb2wK K3N0YXRleHRfaXNfc3VwcG9ydGVkX2pvaW5fY2xhdXNlKFBsYW5uZXJJbmZvICpyb290LCBO b2RlICpjbGF1c2UsCisJCQkJCQkJCSBpbnQgdmFyUmVsaWQsIFNwZWNpYWxKb2luSW5mbyAq c2ppbmZvKQoreworCU9pZAlvcHJzZWw7CisJUmVzdHJpY3RJbmZvICAgKnJpbmZvOworCU9w RXhwcgkJICAgKm9wY2xhdXNlOworCUxpc3RDZWxsCSAgICpsYzsKKworCS8qCisJICogZXZh bHVhdGlvbiBhcyBhIHJlc3RyaWN0aW9uIGNsYXVzZSwgZWl0aGVyIGF0IHNjYW4gbm9kZSBv ciBmb3JjZWQKKwkgKgorCSAqIFhYWCBTZWUgdHJlYXRfYXNfam9pbl9jbGF1c2UuCisJICov CisJaWYgKCh2YXJSZWxpZCAhPSAwKSB8fCAoc2ppbmZvID09IE5VTEwpKQorCQlyZXR1cm4g ZmFsc2U7CisKKwkvKiBYWFggQ2FuIHdlIHJlbHkgb24gYWx3YXlzIGdldHRpbmcgUmVzdHJp Y3RJbmZvIGhlcmU/ICovCisJaWYgKCFJc0EoY2xhdXNlLCBSZXN0cmljdEluZm8pKQorCQly ZXR1cm4gZmFsc2U7CisKKwkvKiBzdHJpcCB0aGUgUmVzdHJpY3RJbmZvICovCisJcmluZm8g PSAoUmVzdHJpY3RJbmZvICopIGNsYXVzZTsKKwljbGF1c2UgPSAoTm9kZSAqKSByaW5mby0+ Y2xhdXNlOworCisJLyogaXMgaXQgcmVmZXJlbmNpbmcgbXVsdGlwbGUgcmVsYXRpb25zPyAq LworCWlmIChibXNfbWVtYmVyc2hpcChyaW5mby0+Y2xhdXNlX3JlbGlkcykgIT0gQk1TX01V TFRJUExFKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiB3ZSBvbmx5IHN1cHBvcnQgc2ltcGxl IG9wZXJhdG9yIGNsYXVzZXMgZm9yIG5vdyAqLworCWlmICghaXNfb3BjbGF1c2UoY2xhdXNl KSkKKwkJcmV0dXJuIGZhbHNlOworCisJb3BjbGF1c2UgPSAoT3BFeHByICopIGNsYXVzZTsK KworCS8qIGZvciBub3cgd2Ugb25seSBzdXBwb3J0IGVzdGltYXRpbmcgZXF1aWpvaW5zICov CisJb3Byc2VsID0gZ2V0X29wcmpvaW4ob3BjbGF1c2UtPm9wbm8pOworCisJaWYgKG9wcnNl bCAhPSBGX0VRSk9JTlNFTCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBNYWtlIHN1 cmUgd2UncmUgbm90IG1peGluZyB2YXJzIGZyb20gbXVsdGlwbGUgcmVsYXRpb25zIG9uIHRo ZSBzYW1lCisJICogc2lkZSwgbGlrZQorCSAqCisJICogICAodDEuYSArIHQyLmEpID0gKHQx LmIgKyB0Mi5iKQorCSAqCisJICogd2hpY2ggaXMgc3RpbGwgdGVjaG5pY2FsbHkgYW4gb3Bj bGF1c2UsIGJ1dCB3ZSBjYW4ndCBtYXRjaCBpdCB0bworCSAqIGV4dGVuZGVkIHN0YXRpc3Rp Y3MgaW4gYSBzaW1wbGUgd2F5LgorCSAqCisJICogWFhYIFRoaXMgYWxzbyBtZWFucyB3ZSBy ZXF1aXJlIHJpbmZvLT5jbGF1c2VfcmVsaWRzIHRvIGhhdmUgMiByZWxzLgorCSAqCisJICog WFhYIEFsc28gY2hlY2sgaXQncyBub3QgZXhwcmVzc2lvbiBvbiBzeXN0ZW0gYXR0cmlidXRl cywgd2hpY2ggd2UKKwkgKiBkb24ndCBhbGxvdyBpbiBleHRlbmRlZCBzdGF0aXN0aWNzLgor CSAqCisJICogWFhYIEFsdGhvdWdoIG1heWJlIHdlIGNvdWxkIGFsbG93IGNhc2VzIHRoYXQg Y29tYmluZSBleHByZXNzaW9ucworCSAqIGZyb20gYm90aCByZWxhdGlvbnMgb24gZWl0aGVy IHNpZGU/IExpa2UgKHQxLmEgKyB0Mi5iID0gdDEuYyAtIHQyLmQpCisJICogb3Igc29tZXRo aW5nIGxpa2UgdGhhdC4gV2UgY291bGQgZG8gImNhcnRlc2lhbiBwcm9kdWN0IiBvZiB0aGUg TUNWCisJICogc3RhdHMgYW5kIHJlc3RyaWN0IGl0IHVzaW5nIHRoaXMgY29uZGl0aW9uLgor CSAqLworCWZvcmVhY2ggKGxjLCBvcGNsYXVzZS0+YXJncykKKwl7CisJCUJpdG1hcHNldCAq dmFybm9zID0gTlVMTDsKKwkJTm9kZSAqZXhwciA9IChOb2RlICopIGxmaXJzdChsYyk7CisK KwkJdmFybm9zID0gcHVsbF92YXJub3Mocm9vdCwgZXhwcik7CisKKwkJLyoKKwkJICogTm8g YXJndW1lbnQgc2hvdWxkIHJlZmVyZW5jZSBtb3JlIHRoYW4ganVzdCBvbmUgcmVsYXRpb24u CisJCSAqCisJCSAqIFRoaXMgZWZmZWN0aXZlbHkgbWVhbnMgZWFjaCBzaWRlIHJlZmVyZW5j ZXMganVzdCB0d28gcmVsYXRpb25zLgorCQkgKiBJZiB0aGVyZSdzIG5vIHJlbGF0aW9uIG9u IG9uZSBzaWRlLCBpdCdzIGEgQ29uc3QsIGFuZCB0aGUgb3RoZXIKKwkJICogc2lkZSBoYXMg dG8gYmUgZWl0aGVyIENvbnN0IG9yIEV4cHIgd2l0aCBhIHNpbmdsZSByZWwuIEluIHdoaWNo CisJCSAqIGNhc2UgaXQgY2FuJ3QgYmUgYSBqb2luIGNsYXVzZS4KKwkJICovCisJCWlmIChi bXNfbnVtX21lbWJlcnModmFybm9zKSA+IDEpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyoK KwkJICogWFhYIE1heWJlIGNoZWNrIHRoYXQgYm90aCByZWxhdGlvbnMgaGF2ZSBleHRlbmRl ZCBzdGF0aXN0aWNzCisJCSAqIChubyBwb2ludCBpbiBjb25zaWRlcmluZyB0aGUgY2xhdXNl IGFzIHVzZWZ1bCB3aXRob3V0IGl0KS4gQnV0CisJCSAqIHdlJ2xsIGRvIHRoYXQgY2hlY2sg bGF0ZXIgYW55d2F5LCBzbyBrZWVwIHRoaXMgY2hlYXAuCisJCSAqLworCX0KKworCXJldHVy biB0cnVlOworfQorCisvKgorICogc3RhdGV4dF90cnlfam9pbl9lc3RpbWF0ZXMKKyAqCQlD aGVja3MgaWYgaXQncyB3b3J0aCBjb25zaWRlcmluZyBleHRlbmRlZCBzdGF0cyBvbiBqb2lu IGVzdGltYXRlcy4KKyAqCisgKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIGEgcXVpY2svY2hl YXAgY2hlY2sgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZXhwZW5kCisgKiBtb3JlIGVmZm9ydCBv biBhcHBseWluZyBleHRlbmRlZCBzdGF0aXN0aWNzIHRvIGpvaW4gY2xhdXNlcy4KKyAqLwor Ym9vbAorc3RhdGV4dF90cnlfam9pbl9lc3RpbWF0ZXMoUGxhbm5lckluZm8gKnJvb3QsIExp c3QgKmNsYXVzZXMsIGludCB2YXJSZWxpZCwKKwkJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBl LCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbywKKwkJCQkJCSAgIEJpdG1hcHNldCAqZXN0aW1h dGVkY2xhdXNlcykKK3sKKwlpbnQJCQlsaXN0aWR4OworCWludAkJCWs7CisJTGlzdENlbGwg ICAqbGM7CisJQml0bWFwc2V0ICAqcmVsaWRzID0gTlVMTDsKKworCS8qCisJICogWFhYIE5v dCBoYXZpbmcgdGhlc2UgdmFsdWVzIG1lYW5zIHRyZWF0X2FzX2pvaW5fY2xhdXNlIHJldHVy bnMgZmFsc2UsCisJICogc28gd2UncmUgbm90IHN1cHBvc2VkIHRvIGhhbmRsZSBqb2luIGNs YXVzZXMgaGVyZS4gU28ganVzdCBiYWlsIG91dC4KKwkgKi8KKwlpZiAoKHZhclJlbGlkICE9 IDApIHx8IChzamluZm8gPT0gTlVMTCkpCisJCXJldHVybiBmYWxzZTsKKworCWxpc3RpZHgg PSAtMTsKKwlmb3JlYWNoIChsYywgY2xhdXNlcykKKwl7CisJCU5vZGUgKmNsYXVzZSA9IChO b2RlICopIGxmaXJzdChsYyk7CisJCVJlc3RyaWN0SW5mbyAqcmluZm87CisJCWxpc3RpZHgr KzsKKworCQkvKiBza2lwIGVzdGltYXRlZCBjbGF1c2VzICovCisJCWlmIChibXNfaXNfbWVt YmVyKGxpc3RpZHgsIGVzdGltYXRlZGNsYXVzZXMpKQorCQkJY29udGludWU7CisKKwkJLyoK KwkJICogU2tpcCBjbGF1c2VzIHRoYXQgYXJlIG5vdCBqb2luIGNsYXVzZXMgb3IgdGhhdCB3 ZSBkb24ndCBrbm93CisJCSAqIGhvdyB0byBoYW5kbGUgZXN0aW1hdGUgdXNpbmcgZXh0ZW5k ZWQgc3RhdGlzdGljcy4KKwkJICovCisJCWlmICghc3RhdGV4dF9pc19zdXBwb3J0ZWRfam9p bl9jbGF1c2Uocm9vdCwgY2xhdXNlLCB2YXJSZWxpZCwgc2ppbmZvKSkKKwkJCWNvbnRpbnVl OworCisJCS8qCisJCSAqIENvbGxlY3QgcmVsaWRzIGZyb20gYWxsIHVzYWJsZSBjbGF1c2Vz LgorCQkgKgorCQkgKiBYWFggV2UncmUgZ3VhcmFudGVlZCB0byBoYXZlIFJlc3RyaWN0SW5m byB0aGFua3MgdG8gdGhlIGNoZWNrcworCQkgKiBpbiBzdGF0ZXh0X2lzX3N1cHBvcnRlZF9q b2luX2NsYXVzZS4KKwkJICovCisJCXJpbmZvID0gKFJlc3RyaWN0SW5mbyAqKSBjbGF1c2U7 CisJCXJlbGlkcyA9IGJtc191bmlvbihyZWxpZHMsIHJpbmZvLT5jbGF1c2VfcmVsaWRzKTsK Kwl9CisKKwkvKiBubyBqb2luIGNsYXVzZXMgZm91bmQsIGRvbid0IHRyeSBhcHBseWluZyBl eHRlbmRlZCBzdGF0cyAqLworCWlmIChibXNfbnVtX21lbWJlcnMocmVsaWRzKSA9PSAwKQor CQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIFdlIGV4cGVjdCBlaXRoZXIgMCBvciA+PSAy IHJlbGlkcywgYSBjYXNlIHdpdGggMSByZWxpZCBpbiBqb2luIGNsYXVzZXMKKwkgKiBzaG91 bGQgYmUgaW1wb3NzaWJsZS4gQW5kIHdlIGp1c3QgcnVsZWQgb3V0IDAsIHNvIHRoZXJlIGFy ZSBhdCBsZWFzdCAyLgorCSAqLworCUFzc2VydChibXNfbnVtX21lbWJlcnMocmVsaWRzKSA+ PSAyKTsKKworCS8qCisJICogQ2hlY2sgdGhhdCBhdCBsZWFzdCBzb21lIG9mIHRoZSByZWxz IHJlZmVyZW5jZWQgYnkgdGhlIGNsYXVzZXMgaGF2ZQorCSAqIGV4dGVuZGVkIHN0YXRzLgor CSAqCisJICogWFhYIE1heWJlIHdlIHNob3VsZCBjaGVjayBob3cgbWFueSByZWxzIGhhdmUg c3RhdHMsIGFuZCBjcm9zcy1jaGVjaworCSAqIGhvdyBjb21wYXRpYmxlIHRoZXkgYXJlIChl LmcuIHRoYXQgYm90aCBoYXZlIE1DVnMsIGV0Yy4pLiBBbHNvLAorCSAqIG1heWJlIHRoaXMg c2hvdWxkIGNyb3NzLWNoZWNrIHRoZSBleGFjdCBwYWlycyBvZiByZWxzIHdpdGggYSBqb2lu CisJICogY2xhdXNlIGJldHdlZW4gdGhlbT8gT1RPSCB0aGlzIGlzIHN1cHBvc2VkIHRvIGJl IGEgY2hlYXAgY2hlY2ssIHNvCisJICogbWF5YmUgYmV0dGVyIGxlYXZlIHRoYXQgZm9yIGxh dGVyLgorCSAqCisJICogWFhYIFdlIGNvdWxkIGFsc28gY2hlY2sgaWYgdGhlcmUgYXJlIGVu b3VnaCBwYXJhbWV0ZXJzIGluIGVhY2ggcmVsCisJICogdG8gY29uc2lkZXIgZXh0ZW5kZWQg c3RhdHMuIElmIHRoZXJlJ3MganVzdCBhIHNpbmdsZSBhdHRyaWJ1dGUsIGl0J3MKKwkgKiBw cm9iYWJseSBiZXR0ZXIgdG8gdXNlIGp1c3QgcmVndWxhciBzdGF0aXN0aWNzLiBPVE9IIHdl IGNhbiBhbHNvCisJICogY29uc2lkZXIgcmVzdHJpY3Rpb24gY2xhdXNlcyBmcm9tIGJhc2Vy ZXN0cmljdGluZm8gYW5kIHVzZSB0aGVtCisJICogdG8gY2FsY3VsYXRlIGNvbmRpdGlvbmFs IHByb2JhYmlsaXRpZXMuCisJICovCisJayA9IC0xOworCXdoaWxlICgoayA9IGJtc19uZXh0 X21lbWJlcihyZWxpZHMsIGspKSA+PSAwKQorCXsKKwkJUmVsT3B0SW5mbyAqcmVsID0gZmlu ZF9iYXNlX3JlbChyb290LCBrKTsKKwkJaWYgKHJlbC0+c3RhdGxpc3QpCisJCQlyZXR1cm4g dHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBJbmZvcm1hdGlvbiBh Ym91dCBhIGpvaW4gYmV0d2VlbiB0d28gcmVsYXRpb25zLiBJdCB0cmFja3MgcmVsYXRpb25z IGJlaW5nCisgKiBqb2luZWQgYW5kIHRoZSBqb2luIGNsYXVzZXMuCisgKi8KK3R5cGVkZWYg c3RydWN0IEpvaW5QYWlySW5mbworeworCUJpdG1hcHNldCAgKnJlbHM7CisJTGlzdAkgICAq Y2xhdXNlczsKK30gSm9pblBhaXJJbmZvOworCisvKgorICogc3RhdGV4dF9idWlsZF9qb2lu X3BhaXJzCisgKgkJRXh0cmFjdCBwYWlycyBvZiBqb2luZWQgcmVscyB3aXRoIGpvaW4gY2xh dXNlcyBmb3IgZWFjaCBwYWlyLgorICoKKyAqIFdhbGtzIHRoZSByZW1haW5pbmcgKG5vdCB5 ZXQgZXN0aW1hdGVkKSBjbGF1c2VzLCBhbmQgc3BsaXRzIHRoZW0gaW50bworICogbGlzdHMg Zm9yIGVhY2ggcGFpciBvZiBqb2luZWQgcmVsYXRpb25zLiBSZXR1cm5zIE5VTEwgaWYgdGhl cmUgYXJlIG5vCisgKiBzdWl0YWJsZSBqb2luIHBhaXJzIHRoYXQgbWlnaHQgYmUgZXN0aW1h dGVkIHVzaW5nIGV4dGVuZGVkIHN0YXRzLgorICoKKyAqIFhYWCBJdCdzIHBvc3NpYmxlIHRo ZXJlIGFyZSBqb2luIGNsYXVzZXMsIGJ1dCB0aGUgY2xhdXNlcyBhcmUgbm90CisgKiBzdXBw b3J0ZWQgYnkgdGhlIGV4dGVuZGVkIHN0YXRzIG1hY2hpbmVyeSAod2Ugb25seSBzdXBwb3J0 IG9wY2xhdXNlcworICogd2l0aCBGX0VRSk9JTlNFTCBzZWxlY3Rpdml0eSBmdW5jdGlvbiBh dCB0aGUgbW9tZW50KS4gQnV0IGZvciBzYW1wbGVzCisgKiBpdCBzaG91bGQgYmUgcG9zc2li bGUgdG8gc3VwcG9ydCBhbG1vc3QgYW55dGhpbmcsIGFsdGhvdWdoIG1heWJlIG5vdAorICog d2l0aCB0aGUgZWZmaWNpZW50IGNvcnJlbGF0ZWQgc2FtcGxpbmcuCisgKgorICogWFhYIFRo aXMgc2hvdWxkIGFsc28gb3JkZXIgdGhlIGpvaW4gcGFpcnMgaW4gYSB3YXkgdGhhdCBzdXBw b3J0cyB0aGUKKyAqIGNvcnJlbGF0ZWQgc2FtcGxpbmcsIHNvIGZvciBleGFtcGxlIGluIGEg c25vd2ZsYWtlIGpvaW4KKyAqCisgKiBGIC0+IEQxIC0+IEQyCisgKgorICogd2Ugc2hvdWxk IGpvaW4gRi0+RDEgZmlyc3QsIHRoZW4gRDEtPkQyLiBUaGlzIHdheSB3ZSBjYW4gZW5yaWNo IHRoZQorICogZmlyc3Qgc2FtcGxlLiBGb3Igc3RhciBzY2hlbWEgdGhpcyBwcm9iYWJseSBk b2VzIG5vdCBtYXR0ZXIgdG9vIG11Y2guCisgKi8KK3N0YXRpYyBKb2luUGFpckluZm8gKgor c3RhdGV4dF9idWlsZF9qb2luX3BhaXJzKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpjbGF1 c2VzLCBpbnQgdmFyUmVsaWQsCisJCQkJCQkgSm9pblR5cGUgam9pbnR5cGUsIFNwZWNpYWxK b2luSW5mbyAqc2ppbmZvLAorCQkJCQkJIEJpdG1hcHNldCAqZXN0aW1hdGVkY2xhdXNlcywg aW50ICpucGFpcnMpCit7CisJaW50CQkJCWNudDsKKwlpbnQJCQkJbGlzdGlkeDsKKwlKb2lu UGFpckluZm8gICAqaW5mbzsKKwlMaXN0Q2VsbAkgICAqbGM7CisKKwkvKgorCSAqIEFzc3Vt ZSBlYWNoIGNsYXVzZSBpcyBmb3IgYSBkaWZmZXJlbnQgcGFpciBvZiByZWxhdGlvbnMgKHNv bWUgb2YgdGhlbQorCSAqIG1pZ2h0IGJlIGFscmVhZHkgZXN0aW1hdGVkLCBidXQgbWVoIC0g dGhlcmUgc2hvdWxkbid0IGJlIHRvbyBtYW55IG9mCisJICogdGhlbSBhbmQgaXQncyBjaGVh cGVyIHRoYW4gcmVwYWxsb2MuCisJICovCisJaW5mbyA9IChKb2luUGFpckluZm8gKikgcGFs bG9jMChzaXplb2YoSm9pblBhaXJJbmZvKSAqIGxpc3RfbGVuZ3RoKGNsYXVzZXMpKTsKKwlj bnQgPSAwOworCisJbGlzdGlkeCA9IC0xOworCWZvcmVhY2gobGMsIGNsYXVzZXMpCisJewor CQlpbnQJCQkJaTsKKwkJYm9vbAkJCWZvdW5kOworCQlOb2RlCQkgICAqY2xhdXNlID0gKE5v ZGUgKikgbGZpcnN0KGxjKTsKKwkJUmVzdHJpY3RJbmZvICAgKnJpbmZvOworCisJCWxpc3Rp ZHgrKzsKKworCQkvKiBza2lwIGFscmVhZHkgZXN0aW1hdGVkIGNsYXVzZXMgKi8KKwkJaWYg KGJtc19pc19tZW1iZXIobGlzdGlkeCwgZXN0aW1hdGVkY2xhdXNlcykpCisJCQljb250aW51 ZTsKKworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIGNsYXVzZSBpcyBhIGpvaW4gY2xhdXNl IG9mIGEgc3VwcG9ydGVkIHNoYXBlIChhdAorCQkgKiB0aGUgbW9tZW50IHdlIHN1cHBvcnQg anVzdCAoRXhwciBvcCBFeHByKSBjbGF1c2VzIHdpdGggZWFjaAorCQkgKiBzaWRlIHJlZmVy ZW5jaW5nIGp1c3QgYSBzaW5nbGUgcmVsYXRpb24uCisJCSAqLworCQlpZiAoIXN0YXRleHRf aXNfc3VwcG9ydGVkX2pvaW5fY2xhdXNlKHJvb3QsIGNsYXVzZSwgdmFyUmVsaWQsIHNqaW5m bykpCisJCQljb250aW51ZTsKKworCQkvKiBzdGF0ZXh0X2lzX3N1cHBvcnRlZF9qb2luX2Ns YXVzZSBndWFyYW50ZWVzIFJlc3RyaWN0SW5mbyAqLworCQlyaW5mbyA9IChSZXN0cmljdElu Zm8gKikgY2xhdXNlOworCQljbGF1c2UgPSAoTm9kZSAqKSByaW5mby0+Y2xhdXNlOworCisJ CS8qIHNlYXJjaCBmb3IgYSBtYXRjaGluZyBqb2luIHBhaXIgKi8KKwkJZm91bmQgPSBmYWxz ZTsKKwkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQorCQl7CisJCQlpZiAoYm1zX2lzX3N1 YnNldChyaW5mby0+Y2xhdXNlX3JlbGlkcywgaW5mb1tpXS5yZWxzKSkKKwkJCXsKKwkJCQlp bmZvW2ldLmNsYXVzZXMgPSBsYXBwZW5kKGluZm9baV0uY2xhdXNlcywgY2xhdXNlKTsKKwkJ CQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5k KQorCQl7CisJCQlpbmZvW2NudF0ucmVscyA9IHJpbmZvLT5jbGF1c2VfcmVsaWRzOworCQkJ aW5mb1tjbnRdLmNsYXVzZXMgPSBsYXBwZW5kKGluZm9bY250XS5jbGF1c2VzLCBjbGF1c2Up OworCQkJY250Kys7CisJCX0KKwl9CisKKwlpZiAoY250ID09IDApCisJCXJldHVybiBOVUxM OworCisJKm5wYWlycyA9IGNudDsKKwlyZXR1cm4gaW5mbzsKK30KKworLyoKKyAqIGV4dHJh Y3RfcmVsYXRpb25faW5mbworICoJCUV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgYSByZWxh dGlvbiBpbiBhIGpvaW4gcGFpci4KKyAqCisgKiBUaGUgcmVsYXRpb24gaXMgaWRlbnRpZmll ZCBieSBpbmRleCAoZ2VuZXJhbGx5IDAgb3IgMSksIGFuZCBwaWNrcyBleHRlbmRlZAorICog c3RhdGlzdGljcyBjb3ZlcmluZyBtYXRjaGluZyB0aGUgam9pbiBjbGF1c2VzIGFuZCBiYXNl cmVsIHJlc3RyaWN0aW9ucy4KKyAqCisgKiBYWFggQ2FuIHdlIGhhdmUgY2FzZXMgd2l0aCBp bmRleGVzIGFib3ZlIDE/IFByb2JhYmx5IGZvciBjbGF1c2VzIG1peGluZworICogdmFycyBm cm9tIDMgcmVsYXRpb25zLCBidXQgd2UncmUgcmVqZWN0aW5nIHRob3NlLgorICovCitzdGF0 aWMgUmVsT3B0SW5mbyAqCitleHRyYWN0X3JlbGF0aW9uX2luZm8oUGxhbm5lckluZm8gKnJv b3QsIEpvaW5QYWlySW5mbyAqaW5mbywgaW50IGluZGV4LAorCQkJCQkgIFN0YXRpc3RpY0V4 dEluZm8gKipzdGF0KQoreworCWludAlrOworCWludAlyZWxpZDsKKwlSZWxPcHRJbmZvICpy ZWw7CisJTGlzdENlbGwgKmxjOworCisJQml0bWFwc2V0ICAqYXR0bnVtcyA9IE5VTEw7CisJ TGlzdAkgICAqZXhwcnMgPSBOSUw7CisKKwlrID0gLTE7CisJd2hpbGUgKGluZGV4ID49IDAp CisJeworCQlrID0gYm1zX25leHRfbWVtYmVyKGluZm8tPnJlbHMsIGspOworCQlpZiAoayA8 IDApCisJCQllbG9nKEVSUk9SLCAiZmFpbGVkIHRvIGV4dHJhY3QgcmVsaWQiKTsKKworCQly ZWxpZCA9IGs7CisJCWluZGV4LS07CisJfQorCisJcmVsID0gZmluZF9iYXNlX3JlbChyb290 LCByZWxpZCk7CisKKwkvKgorCSAqIFdhbGsgdGhlIGNsYXVzZXMgZm9yIHRoaXMgam9pbiBw YWlyLCBhbmQgZXh0cmFjdCBleHByZXNzaW9ucyBhYm91dAorCSAqIHRoZSByZWxhdGlvbiBp ZGVudGlmaWVkIGJ5IGluZGV4IC8gcmVsaWQuIEZvciBzaW1wbGUgVmFycyB3ZSBleHRyYWN0 CisJICogdGhlIGF0dG51bS4gT3RoZXJ3aXNlIHdlIGtlZXAgdGhlIHdob2xlIGV4cHJlc3Np b24uCisJICovCisJZm9yZWFjaCAobGMsIGluZm8tPmNsYXVzZXMpCisJeworCQlMaXN0Q2Vs bCAqbGMyOworCQlOb2RlICpjbGF1c2UgPSAoTm9kZSAqKSBsZmlyc3QobGMpOworCQlPcEV4 cHIgKm9wY2xhdXNlID0gKE9wRXhwciAqKSBjbGF1c2U7CisKKwkJLyogb25seSBvcGNsYXVz ZXMgc3VwcG9ydGVkIGZvciBub3cgKi8KKwkJQXNzZXJ0KGlzX29wY2xhdXNlKGNsYXVzZSkp OworCisJCWZvcmVhY2ggKGxjMiwgb3BjbGF1c2UtPmFyZ3MpCisJCXsKKwkJCU5vZGUgKmFy ZyA9IChOb2RlICopIGxmaXJzdChsYzIpOworCQkJQml0bWFwc2V0ICp2YXJub3MgPSBOVUxM OworCisJCQkvKiBwbGFpbiBWYXIgcmVmZXJlbmNlcyAoYm9vbGVhbiBWYXJzIG9yIHJlY3Vy c2l2ZSBjaGVja3MpICovCisJCQlpZiAoSXNBKGFyZywgVmFyKSkKKwkJCXsKKwkJCQlWYXIJ CSAgICp2YXIgPSAoVmFyICopIGFyZzsKKworCQkJCS8qIElnbm9yZSB2YXJzIGZyb20gb3Ro ZXIgcmVsYXRpb25zLiAqLworCQkJCWlmICh2YXItPnZhcm5vICE9IHJlbGlkKQorCQkJCQlj b250aW51ZTsKKworCQkJCS8qIHdlIGFsc28gYmV0dGVyIGVuc3VyZSB0aGUgVmFyIGlzIGZy b20gdGhlIGN1cnJlbnQgbGV2ZWwgKi8KKwkJCQlpZiAodmFyLT52YXJsZXZlbHN1cCA+IDAp CisJCQkJCWNvbnRpbnVlOworCisJCQkJLyogQWxzbyBza2lwIHN5c3RlbSBhdHRyaWJ1dGVz ICh3ZSBkb24ndCBhbGxvdyBzdGF0cyBvbiB0aG9zZSkuICovCisJCQkJaWYgKCFBdHRyTnVt YmVySXNGb3JVc2VyRGVmaW5lZEF0dHIodmFyLT52YXJhdHRubykpCisJCQkJCWVsb2coRVJS T1IsICJ1bmV4cGVjdGVkIHN5c3RlbSBhdHRyaWJ1dGUiKTsKKworCQkJCWF0dG51bXMgPSBi bXNfYWRkX21lbWJlcihhdHRudW1zLCB2YXItPnZhcmF0dG5vKTsKKworCQkJCS8qIERvbmUs IHByb2Nlc3MgdGhlIG5leHQgYXJndW1lbnQuICovCisJCQkJY29udGludWU7CisJCQl9CisK KwkJCS8qCisJCQkgKiBPSywgaXQncyBhIG1vcmUgY29tcGxleCBleHByZXNzaW9uLCBzbyBj aGVjayBpZiBpdCBtYXRjaGVzCisJCQkgKiB0aGUgcmVsaWQgYW5kIG1heWJlIGtlZXAgaXQg YXMgYSB3aG9sZS4gSXQgc2hvdWxkIGJlCisJCQkgKiBjb21wYXRpYmxlIGJlY2F1c2Ugd2Ug YWxyZWFkeSBjaGVja2VkIGl0IHdoZW4gYnVpbGRpbmcgdGhlCisJCQkgKiBqb2luIHBhaXJz LgorCQkJICovCisJCQl2YXJub3MgPSBwdWxsX3Zhcm5vcyhyb290LCBhcmcpOworCisJCQlp ZiAocmVsaWQgPT0gYm1zX3NpbmdsZXRvbl9tZW1iZXIodmFybm9zKSkKKwkJCQlleHBycyA9 IGxhcHBlbmQoZXhwcnMsIGFyZyk7CisJCX0KKwl9CisKKwkqc3RhdCA9IGZpbmRfbWF0Y2hp bmdfc2FtcGxlKHJvb3QsIHJlbCwgYXR0bnVtcywgZXhwcnMpOworCisJcmV0dXJuIHJlbDsK K30KKworLyoKKyAqIHN0YXRleHRfY2xhdXNlbGlzdF9qb2luX3NlbGVjdGl2aXR5CisgKgkJ VXNlIGV4dGVuZGVkIHN0YXRzIHRvIGVzdGltYXRlIGpvaW4gY2xhdXNlcy4KKyAqCisgKiBY WFggSW4gcHJpbmNpcGxlLCB3ZSBzaG91bGQgbm90IHJlc3RyaWN0IHRoaXMgdG8gY2FzZXMg d2l0aCBtdWx0aXBsZQorICogam9pbiBjbGF1c2VzIC0gd2Ugc2hvdWxkIGNvbnNpZGVyIGRl cGVuZGVuY2llcyB3aXRoIGNvbmRpdGlvbnMgYXQgdGhlCisgKiBiYXNlIHJlbGF0aW9ucywg aS5lLiBjYWxjdWxhdGUgUChqb2luIGNsYXVzZSB8IGJhc2UgcmVzdHJpY3Rpb25zKS4KKyAq IEJ1dCBjdXJyZW50bHkgdGhhdCBkb2VzIG5vdCBoYXBwZW4sIGJlY2F1c2UgY2xhdXNlbGlz dF9zZWxlY3Rpdml0eV9leHQKKyAqIHRyZWF0cyBhIHNpbmdsZSBjbGF1c2UgYXMgYSBzcGVj aWFsIGNhc2UgKGFuZCB3ZSBkb24ndCBhcHBseSBleHRlbmRlZAorICogc3RhdGlzdGljcyBp biB0aGF0IGNhc2UgeWV0KS4KKyAqLworU2VsZWN0aXZpdHkKK3N0YXRleHRfY2xhdXNlbGlz dF9qb2luX3NlbGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpjbGF1c2VzLCBp bnQgdmFyUmVsaWQsCisJCQkJCQkJCQlKb2luVHlwZSBqb2ludHlwZSwgU3BlY2lhbEpvaW5J bmZvICpzamluZm8sCisJCQkJCQkJCQlCaXRtYXBzZXQgKiplc3RpbWF0ZWRjbGF1c2VzKQor eworCWludAkJCWk7CisJaW50CQkJbGlzdGlkeDsKKwlTZWxlY3Rpdml0eQlzID0gMS4wOwor CisJSm9pblBhaXJJbmZvICppbmZvOworCWludAkJCQluaW5mbzsKKworCWlmICghY2xhdXNl cyB8fCAhZW5hYmxlX3NhbXBsZV9lc3RpbWF0ZXNfam9pbikKKwkJcmV0dXJuIDEuMDsKKwor CS8qIGV4dHJhY3QgcGFpcnMgb2Ygam9pbmVkIHJlbGF0aW9ucyBmcm9tIHRoZSBsaXN0IG9m IGNsYXVzZXMgKi8KKwlpbmZvID0gc3RhdGV4dF9idWlsZF9qb2luX3BhaXJzKHJvb3QsIGNs YXVzZXMsIHZhclJlbGlkLCBqb2ludHlwZSwgc2ppbmZvLAorCQkJCQkJCQkJKmVzdGltYXRl ZGNsYXVzZXMsICZuaW5mbyk7CisKKwkvKiBubyB1c2VmdWwgam9pbiBwYWlycyAqLworCWlm ICghaW5mbykKKwkJcmV0dXJuIDEuMDsKKworCS8qCisJICogUHJvY2VzcyB0aGUgam9pbiBw YWlycywgdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBNQ1Ygb24gZWFjaCBzaWRlLgorCSAqCisJ ICogWFhYIFRoZSBiYXNpYyBwcmluY2lwbGUgaXMgcXVpdGUgc2ltaWxhciB0byBlcWpvaW5z ZWxfaW5uZXIsIGkuZS4KKwkgKiB3ZSB0cnkgdG8gZmluZCBhIE1DViBvbiBib3RoIHNpZGVz IG9mIHRoZSBqb2luLCBhbmQgdXNlIGl0IHRvIGdldAorCSAqIGJldHRlciBqb2luIGVzdGlt YXRlLiBJdCdzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQsIGJlY2F1c2UgdGhlcmUKKwkgKiBt aWdodCBiZSBtdWx0aXBsZSBNQ1YgbGlzdHMsIHdlIGFsc28gbmVlZCBuZGlzdGluY3QgZXN0 aW1hdGUsIGFuZAorCSAqIHRoZXJlIG1heSBiZSBpbnRlcmVzdGluZyBiYXNlcmVzdHJpY3Rp b25zIHRvby4KKwkgKgorCSAqIFhYWCBBdCB0aGUgbW9tZW50IHdlIG9ubHkgaGFuZGxlIHRo ZSBjYXNlIHdpdGggbWF0Y2hpbmcgTUNWcyBvbgorCSAqIGJvdGggc2lkZXMsIGJ1dCBpdCdk IGJlIGdvb2QgdG8gYWxzbyBoYW5kbGUgY2FzZSB3aXRoIGp1c3QgbmRpc3RpbmN0CisJICog c3RhdGlzdGljcyBpbXByb3ZpbmcgbmRpc3RpbmN0IGVzdGltYXRlcy4KKwkgKgorCSAqIFhY WCBQZXJoYXBzIGl0J2QgYmUgZ29vZCB0byBhbHNvIGhhbmRsZSBjYXNlIHdpdGggb25lIHNp ZGUgb25seQorCSAqIGhhdmluZyAicmVndWxhciIgc3RhdGlzdGljcyAoZS5nLiBNQ1YpLCBl c3BlY2lhbGx5IGluIGNhc2VzIHdpdGgKKwkgKiBubyBjb25kaXRpb25zIG9uIHRoYXQgc2lk ZSBvZiB0aGUgam9pbiAod2hlcmUgd2UgY2FuJ3QgdXNlIHRoZQorCSAqIGV4dGVuZGVkIE1D ViB0byBjYWxjdWxhdGUgY29uZGl0aW9uYWwgcHJvYmFiaWxpdHkpLgorCSAqLworCWZvciAo aSA9IDA7IGkgPCBuaW5mbzsgaSsrKQorCXsKKwkJUmVsT3B0SW5mbyAqcmVsMTsKKwkJUmVs T3B0SW5mbyAqcmVsMjsKKwkJU3RhdGlzdGljRXh0SW5mbyAqc3RhdDE7CisJCVN0YXRpc3Rp Y0V4dEluZm8gKnN0YXQyOworCisJCUxpc3RDZWxsICpsYzsKKworCQkvKiBleHRyYWN0IGlu Zm8gYWJvdXQgdGhlIGZpcnN0IHJlbGF0aW9uICovCisJCXJlbDEgPSBleHRyYWN0X3JlbGF0 aW9uX2luZm8ocm9vdCwgJmluZm9baV0sIDAsICZzdGF0MSk7CisKKwkJLyogZXh0cmFjdCBp bmZvIGFib3V0IHRoZSBzZWNvbmQgcmVsYXRpb24gKi8KKwkJcmVsMiA9IGV4dHJhY3RfcmVs YXRpb25faW5mbyhyb290LCAmaW5mb1tpXSwgMSwgJnN0YXQyKTsKKworCQkvKiBYWFggb25s eSBoYW5kbGluZyBjYXNlIHdpdGggTUNWIG9uIGJvdGggc2lkZXMgZm9yIG5vdyAqLworCQlp ZiAoIXN0YXQxIHx8ICFzdGF0MikKKwkJCWNvbnRpbnVlOworCisJCXMgKj0gc3RhdGV4dF9j b21wYXJlX3NhbXBsZXMocm9vdCwgcmVsMSwgcmVsMiwgc3RhdDEsIHN0YXQyLCBpbmZvW2ld LmNsYXVzZXMpOworCisJCS8qCisJCSAqIE5vdyBtYXJrIGFsbCB0aGUgY2xhdXNlcyBmb3Ig dGhpcyBqb2luIHBhaXIgYXMgZXN0aW1hdGVkLgorCQkgKgorCQkgKiBYWFggTWF5YmUgdHJh Y2sgdGhlIGluZGV4ZXMgaW4gSm9pblBhaXJJbmZvLCBzbyB0aGF0IHdlIGNhbgorCQkgKiBz aW1wbHkgdW5pb24gdGhlIHR3byBiaXRtYXBzLCB3aXRob3V0IHRoZSBleHRyYSBtYXRjaGlu Zy4KKwkJICovCisJCWZvcmVhY2ggKGxjLCBpbmZvLT5jbGF1c2VzKQorCQl7CisJCQlOb2Rl ICpjbGF1c2UgPSAoTm9kZSAqKSBsZmlyc3QobGMpOworCQkJTGlzdENlbGwgKmxjMjsKKwor CQkJbGlzdGlkeCA9IC0xOworCQkJZm9yZWFjaCAobGMyLCBjbGF1c2VzKQorCQkJeworCQkJ CU5vZGUgKmNsYXVzZTIgPSAoTm9kZSAqKSBsZmlyc3QobGMyKTsKKwkJCQlsaXN0aWR4Kys7 CisKKwkJCQlBc3NlcnQoSXNBKGNsYXVzZTIsIFJlc3RyaWN0SW5mbykpOworCisJCQkJY2xh dXNlMiA9IChOb2RlICopICgoUmVzdHJpY3RJbmZvICopIGNsYXVzZTIpLT5jbGF1c2U7CisK KwkJCQlpZiAoZXF1YWwoY2xhdXNlLCBjbGF1c2UyKSkKKwkJCQl7CisJCQkJCSplc3RpbWF0 ZWRjbGF1c2VzID0gYm1zX2FkZF9tZW1iZXIoKmVzdGltYXRlZGNsYXVzZXMsIGxpc3RpZHgp OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gczsKK30K ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9ydWxldXRpbHMuYyBiL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9ydWxldXRpbHMuYwppbmRleCAwMzliMWQyYjk1MS4uNmE5MzJl YTAyNTkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9ydWxldXRpbHMuYwor KysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxzLmMKQEAgLTE1NzIsNiArMTU3 Miw3IEBAIHBnX2dldF9zdGF0aXN0aWNzb2JqX3dvcmtlcihPaWQgc3RhdGV4dGlkLCBib29s IGNvbHVtbnNfb25seSwgYm9vbCBtaXNzaW5nX29rKQogCWJvb2wJCW5kaXN0aW5jdF9lbmFi bGVkOwogCWJvb2wJCWRlcGVuZGVuY2llc19lbmFibGVkOwogCWJvb2wJCW1jdl9lbmFibGVk OworCWJvb2wJCXNhbXBsZV9lbmFibGVkOwogCWludAkJCWk7CiAJTGlzdAkgICAqY29udGV4 dDsKIAlMaXN0Q2VsbCAgICpsYzsKQEAgLTE2NDMsNiArMTY0NCw3IEBAIHBnX2dldF9zdGF0 aXN0aWNzb2JqX3dvcmtlcihPaWQgc3RhdGV4dGlkLCBib29sIGNvbHVtbnNfb25seSwgYm9v bCBtaXNzaW5nX29rKQogCQluZGlzdGluY3RfZW5hYmxlZCA9IGZhbHNlOwogCQlkZXBlbmRl bmNpZXNfZW5hYmxlZCA9IGZhbHNlOwogCQltY3ZfZW5hYmxlZCA9IGZhbHNlOworCQlzYW1w bGVfZW5hYmxlZCA9IGZhbHNlOwogCiAJCWZvciAoaSA9IDA7IGkgPCBBUlJfRElNUyhhcnIp WzBdOyBpKyspCiAJCXsKQEAgLTE2NTIsNiArMTY1NCw4IEBAIHBnX2dldF9zdGF0aXN0aWNz b2JqX3dvcmtlcihPaWQgc3RhdGV4dGlkLCBib29sIGNvbHVtbnNfb25seSwgYm9vbCBtaXNz aW5nX29rKQogCQkJCWRlcGVuZGVuY2llc19lbmFibGVkID0gdHJ1ZTsKIAkJCWVsc2UgaWYg KGVuYWJsZWRbaV0gPT0gU1RBVFNfRVhUX01DVikKIAkJCQltY3ZfZW5hYmxlZCA9IHRydWU7 CisJCQllbHNlIGlmIChlbmFibGVkW2ldID09IFNUQVRTX0VYVF9TQU1QTEUpCisJCQkJc2Ft cGxlX2VuYWJsZWQgPSB0cnVlOwogCiAJCQkvKiBpZ25vcmUgU1RBVFNfRVhUX0VYUFJFU1NJ T05TIChpdCdzIGJ1aWx0IGF1dG9tYXRpY2FsbHkpICovCiAJCX0KQEAgLTE2NjYsOCArMTY3 MCwxMSBAQCBwZ19nZXRfc3RhdGlzdGljc29ial93b3JrZXIoT2lkIHN0YXRleHRpZCwgYm9v bCBjb2x1bW5zX29ubHksIGJvb2wgbWlzc2luZ19vaykKIAkJICogQnV0IGlmIHRoZSBzdGF0 aXN0aWNzIGlzIGRlZmluZWQgb24ganVzdCBhIHNpbmdsZSBjb2x1bW4sIGl0IGhhcyB0bwog CQkgKiBiZSBhbiBleHByZXNzaW9uIHN0YXRpc3RpY3MuIEluIHRoYXQgY2FzZSB3ZSBkb24n dCBuZWVkIHRvIHNwZWNpZnkKIAkJICoga2luZHMuCisJCSAqCisJCSAqIFhYWCBUaGlzIGlu dGVudGlvbmFsbHkgaW52ZXJ0cyB0aGUgc2FtcGxlIGZsYWcsIGJlY2F1c2Ugd2UgdHJlYXQg aXQKKwkJICogZGlmZmVyZW50bHkgLSBpdCdzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQsIGp1 c3QgZXhwbGljaXRseS4KIAkJICovCi0JCWlmICgoIW5kaXN0aW5jdF9lbmFibGVkIHx8ICFk ZXBlbmRlbmNpZXNfZW5hYmxlZCB8fCAhbWN2X2VuYWJsZWQpICYmCisJCWlmICgoIShuZGlz dGluY3RfZW5hYmxlZCAmJiBkZXBlbmRlbmNpZXNfZW5hYmxlZCAmJiBtY3ZfZW5hYmxlZCkg fHwgc2FtcGxlX2VuYWJsZWQpICYmCiAJCQkobmNvbHVtbnMgPiAxKSkKIAkJewogCQkJYm9v bAkJZ290b25lID0gZmFsc2U7CkBAIC0xNjg3LDcgKzE2OTQsMTMgQEAgcGdfZ2V0X3N0YXRp c3RpY3NvYmpfd29ya2VyKE9pZCBzdGF0ZXh0aWQsIGJvb2wgY29sdW1uc19vbmx5LCBib29s IG1pc3Npbmdfb2spCiAJCQl9CiAKIAkJCWlmIChtY3ZfZW5hYmxlZCkKKwkJCXsKIAkJCQlh cHBlbmRTdHJpbmdJbmZvKCZidWYsICIlc21jdiIsIGdvdG9uZSA/ICIsICIgOiAiIik7CisJ CQkJZ290b25lID0gdHJ1ZTsKKwkJCX0KKworCQkJaWYgKHNhbXBsZV9lbmFibGVkKQorCQkJ CWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwgIiVzc2FtcGxlIiwgZ290b25lID8gIiwgIiA6ICIi KTsKIAogCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmJ1ZiwgJyknKTsKIAkJfQpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWMuYyBiL3NyYy9iYWNrZW5kL3V0aWxz L21pc2MvZ3VjLmMKaW5kZXggNGM5NGYwOWM2NDUuLjcwZDg1MjE2NDMxIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Yy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxz L21pc2MvZ3VjLmMKQEAgLTE0MCw2ICsxNDAsMTEgQEAgZXh0ZXJuIGJvb2wgaWdub3JlX2No ZWNrc3VtX2ZhaWx1cmU7CiBleHRlcm4gYm9vbCBpZ25vcmVfaW52YWxpZF9wYWdlczsKIGV4 dGVybiBib29sIHN5bmNocm9uaXplX3NlcXNjYW5zOwogCitleHRlcm4gYm9vbCBlbmFibGVf c2FtcGxlX2VzdGltYXRlc19zY2FuOworZXh0ZXJuIGJvb2wgZW5hYmxlX3NhbXBsZV9lc3Rp bWF0ZXNfam9pbjsKK2V4dGVybiBib29sIGVuYWJsZV9zYW1wbGVfam9pbl9jb3JyZWxhdGU7 CitleHRlcm4gZG91YmxlIGVzdGltYXRlX3NhbXBsZV9yYXRlOworCiAjaWZkZWYgVFJBQ0Vf U1lOQ1NDQU4KIGV4dGVybiBib29sIHRyYWNlX3N5bmNzY2FuOwogI2VuZGlmCkBAIC0yMTMy LDYgKzIxMzcsMzMgQEAgc3RhdGljIHN0cnVjdCBjb25maWdfYm9vbCBDb25maWd1cmVOYW1l c0Jvb2xbXSA9CiAJCU5VTEwsIE5VTEwsIE5VTEwKIAl9LAogCisJeworCQl7ImVuYWJsZV9z YW1wbGVfc2Nhbl9lc3RpbWF0ZXMiLCBQR0NfVVNFUlNFVCwgREVWRUxPUEVSX09QVElPTlMs CisJCQlnZXR0ZXh0X25vb3AoIkRlY2lkZXMgd2hldGhlciBzYW1wbGluZyB3aWxsIGJlIHVz ZWQgZm9yIGNhcmRpbmFsaXR5IGVzdGltYXRlcyBmb3Igc2NhbnMuIiksCisJCX0sCisJCSZl bmFibGVfc2FtcGxlX2VzdGltYXRlc19zY2FuLAorCQl0cnVlLAorCQlOVUxMLCBOVUxMLCBO VUxMCisJfSwKKworCXsKKwkJeyJlbmFibGVfc2FtcGxlX2pvaW5fZXN0aW1hdGVzIiwgUEdD X1VTRVJTRVQsIERFVkVMT1BFUl9PUFRJT05TLAorCQkJZ2V0dGV4dF9ub29wKCJEZWNpZGVz IHdoZXRoZXIgc2FtcGxpbmcgd2lsbCBiZSB1c2VkIGZvciBjYXJkaW5hbGl0eSBlc3RpbWF0 ZXMgZm9yIGpvaW5zLiIpLAorCQl9LAorCQkmZW5hYmxlX3NhbXBsZV9lc3RpbWF0ZXNfam9p biwKKwkJdHJ1ZSwKKwkJTlVMTCwgTlVMTCwgTlVMTAorCX0sCisKKwl7CisJCXsiZW5hYmxl X3NhbXBsZV9qb2luX2NvcnJlbGF0ZSIsIFBHQ19VU0VSU0VULCBERVZFTE9QRVJfT1BUSU9O UywKKwkJCWdldHRleHRfbm9vcCgiVHJ5IHVzaW5nIGNvcnJlbGF0ZWQgc2FtcGxlcyBmb3Ig am9pbnMuIiksCisJCX0sCisJCSZlbmFibGVfc2FtcGxlX2pvaW5fY29ycmVsYXRlLAorCQl0 cnVlLAorCQlOVUxMLCBOVUxMLCBOVUxMCisJfSwKKwogCS8qIEVuZC1vZi1saXN0IG1hcmtl ciAqLwogCXsKIAkJe05VTEwsIDAsIDAsIE5VTEwsIE5VTEx9LCBOVUxMLCBmYWxzZSwgTlVM TCwgTlVMTCwgTlVMTApAQCAtMzg2OSw2ICszOTAxLDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY29u ZmlnX3JlYWwgQ29uZmlndXJlTmFtZXNSZWFsW10gPQogCQlOVUxMLCBOVUxMLCBOVUxMCiAJ fSwKIAorCXsKKwkJeyJlc3RpbWF0ZV9zYW1wbGVfcmF0ZSIsIFBHQ19TVVNFVCwgREVWRUxP UEVSX09QVElPTlMsCisJCQlnZXR0ZXh0X25vb3AoIkZyYWN0aW9uIG9mIHRhYmxlIHRvIHNh bXBsZSBmb3IgcnVuLXRpbWUgY2FyZGluYWxpdHkgZXN0aW1hdGVzIiksCisJCQlOVUxMCisJ CX0sCisJCSZlc3RpbWF0ZV9zYW1wbGVfcmF0ZSwKKwkJMC4wMSwgMC4wLCAxLjAsCisJCU5V TEwsIE5VTEwsIE5VTEwKKwl9LAorCiAJLyogRW5kLW9mLWxpc3QgbWFya2VyICovCiAJewog CQl7TlVMTCwgMCwgMCwgTlVMTCwgTlVMTH0sIE5VTEwsIDAuMCwgMC4wLCAwLjAsIE5VTEws IE5VTEwsIE5VTEwKZGlmZiAtLWdpdCBhL3NyYy9iaW4vcHNxbC9kZXNjcmliZS5jIGIvc3Jj L2Jpbi9wc3FsL2Rlc2NyaWJlLmMKaW5kZXggNDA0MzNlMzJmYTAuLjYzYTZjZTk1YjJiIDEw MDY0NAotLS0gYS9zcmMvYmluL3BzcWwvZGVzY3JpYmUuYworKysgYi9zcmMvYmluL3BzcWwv ZGVzY3JpYmUuYwpAQCAtMjYxNCw2ICsyNjE0LDcgQEAgZGVzY3JpYmVPbmVUYWJsZURldGFp bHMoY29uc3QgY2hhciAqc2NoZW1hbmFtZSwKIAkJCQkJCQkgICIgICdkJyA9IGFueShzdHhr aW5kKSBBUyBuZGlzdF9lbmFibGVkLFxuIgogCQkJCQkJCSAgIiAgJ2YnID0gYW55KHN0eGtp bmQpIEFTIGRlcHNfZW5hYmxlZCxcbiIKIAkJCQkJCQkgICIgICdtJyA9IGFueShzdHhraW5k KSBBUyBtY3ZfZW5hYmxlZCxcbiIKKwkJCQkJCQkgICIgICdzJyA9IGFueShzdHhraW5kKSBB UyBzYW1wbGVfZW5hYmxlZCxcbiIKIAkJCQkJCQkgICJzdHhzdGF0dGFyZ2V0XG4iCiAJCQkJ CQkJICAiRlJPTSBwZ19jYXRhbG9nLnBnX3N0YXRpc3RpY19leHRcbiIKIAkJCQkJCQkgICJX SEVSRSBzdHhyZWxpZCA9ICclcydcbiIKQEAgLTI2MzYsMTIgKzI2MzcsMTQgQEAgZGVzY3Jp YmVPbmVUYWJsZURldGFpbHMoY29uc3QgY2hhciAqc2NoZW1hbmFtZSwKIAkJCQkJYm9vbAkJ aGFzX25kaXN0aW5jdDsKIAkJCQkJYm9vbAkJaGFzX2RlcGVuZGVuY2llczsKIAkJCQkJYm9v bAkJaGFzX21jdjsKKwkJCQkJYm9vbAkJaGFzX3NhbXBsZTsKIAkJCQkJYm9vbAkJaGFzX2Fs bDsKIAkJCQkJYm9vbAkJaGFzX3NvbWU7CiAKIAkJCQkJaGFzX25kaXN0aW5jdCA9IChzdHJj bXAoUFFnZXR2YWx1ZShyZXN1bHQsIGksIDUpLCAidCIpID09IDApOwogCQkJCQloYXNfZGVw ZW5kZW5jaWVzID0gKHN0cmNtcChQUWdldHZhbHVlKHJlc3VsdCwgaSwgNiksICJ0IikgPT0g MCk7CiAJCQkJCWhhc19tY3YgPSAoc3RyY21wKFBRZ2V0dmFsdWUocmVzdWx0LCBpLCA3KSwg InQiKSA9PSAwKTsKKwkJCQkJaGFzX3NhbXBsZSA9IChzdHJjbXAoUFFnZXR2YWx1ZShyZXN1 bHQsIGksIDgpLCAidCIpID09IDApOwogCiAJCQkJCXByaW50ZlBRRXhwQnVmZmVyKCZidWYs ICIgICAgIik7CiAKQEAgLTI2NTgsOCArMjY2MSw4IEBAIGRlc2NyaWJlT25lVGFibGVEZXRh aWxzKGNvbnN0IGNoYXIgKnNjaGVtYW5hbWUsCiAJCQkJCSAqIHNpbmdsZSBleHByKSBvciB3 aGVuIGFsbCBhcmUgc3BlY2lmaWVkIChpbiB3aGljaCBjYXNlCiAJCQkJCSAqIHdlIGFzc3Vt ZSBpdCdzIGV4cGFuZGVkIGJ5IENSRUFURSBTVEFUSVNUSUNTKS4KIAkJCQkJICovCi0JCQkJ CWhhc19hbGwgPSAoaGFzX25kaXN0aW5jdCAmJiBoYXNfZGVwZW5kZW5jaWVzICYmIGhhc19t Y3YpOwotCQkJCQloYXNfc29tZSA9IChoYXNfbmRpc3RpbmN0IHx8IGhhc19kZXBlbmRlbmNp ZXMgfHwgaGFzX21jdik7CisJCQkJCWhhc19hbGwgPSAoaGFzX25kaXN0aW5jdCAmJiBoYXNf ZGVwZW5kZW5jaWVzICYmIGhhc19tY3YgJiYgIWhhc19zYW1wbGUpOworCQkJCQloYXNfc29t ZSA9IChoYXNfbmRpc3RpbmN0IHx8IGhhc19kZXBlbmRlbmNpZXMgfHwgaGFzX21jdiB8fCBo YXNfc2FtcGxlKTsKIAogCQkJCQlpZiAoaGFzX3NvbWUgJiYgIWhhc19hbGwpCiAJCQkJCXsK QEAgLTI2ODEsOCArMjY4NCwxMiBAQCBkZXNjcmliZU9uZVRhYmxlRGV0YWlscyhjb25zdCBj aGFyICpzY2hlbWFuYW1lLAogCQkJCQkJaWYgKGhhc19tY3YpCiAJCQkJCQl7CiAJCQkJCQkJ YXBwZW5kUFFFeHBCdWZmZXIoJmJ1ZiwgIiVzbWN2IiwgZ290b25lID8gIiwgIiA6ICIiKTsK KwkJCQkJCQlnb3RvbmUgPSB0cnVlOwogCQkJCQkJfQogCisJCQkJCQlpZiAoaGFzX3NhbXBs ZSkKKwkJCQkJCQlhcHBlbmRQUUV4cEJ1ZmZlcigmYnVmLCAiJXNzYW1wbGUiLCBnb3RvbmUg PyAiLCAiIDogIiIpOworCiAJCQkJCQlhcHBlbmRQUUV4cEJ1ZmZlckNoYXIoJmJ1ZiwgJykn KTsKIAkJCQkJfQogCkBAIC0yNjkxLDkgKzI2OTgsOSBAQCBkZXNjcmliZU9uZVRhYmxlRGV0 YWlscyhjb25zdCBjaGFyICpzY2hlbWFuYW1lLAogCQkJCQkJCQkJICBQUWdldHZhbHVlKHJl c3VsdCwgaSwgMSkpOwogCiAJCQkJCS8qIFNob3cgdGhlIHN0YXRzIHRhcmdldCBpZiBpdCdz IG5vdCBkZWZhdWx0ICovCi0JCQkJCWlmIChzdHJjbXAoUFFnZXR2YWx1ZShyZXN1bHQsIGks IDgpLCAiLTEiKSAhPSAwKQorCQkJCQlpZiAoc3RyY21wKFBRZ2V0dmFsdWUocmVzdWx0LCBp LCA5KSwgIi0xIikgIT0gMCkKIAkJCQkJCWFwcGVuZFBRRXhwQnVmZmVyKCZidWYsICI7IFNU QVRJU1RJQ1MgJXMiLAotCQkJCQkJCQkJCSAgUFFnZXR2YWx1ZShyZXN1bHQsIGksIDgpKTsK KwkJCQkJCQkJCQkgIFBRZ2V0dmFsdWUocmVzdWx0LCBpLCA5KSk7CiAKIAkJCQkJcHJpbnRU YWJsZUFkZEZvb3RlcigmY29udCwgYnVmLmRhdGEpOwogCQkJCX0KZGlmZiAtLWdpdCBhL3Ny Yy9iaW4vcHNxbC90YWItY29tcGxldGUuYyBiL3NyYy9iaW4vcHNxbC90YWItY29tcGxldGUu YwppbmRleCA2YmQzM2EwNmNiMS4uN2FhZjRmNDJiNmEgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4v cHNxbC90YWItY29tcGxldGUuYworKysgYi9zcmMvYmluL3BzcWwvdGFiLWNvbXBsZXRlLmMK QEAgLTI4OTMsNyArMjg5Myw3IEBAIHBzcWxfY29tcGxldGlvbihjb25zdCBjaGFyICp0ZXh0 LCBpbnQgc3RhcnQsIGludCBlbmQpCiAJZWxzZSBpZiAoTWF0Y2hlcygiQ1JFQVRFIiwgIlNU QVRJU1RJQ1MiLCBNYXRjaEFueSkpCiAJCUNPTVBMRVRFX1dJVEgoIigiLCAiT04iKTsKIAll bHNlIGlmIChNYXRjaGVzKCJDUkVBVEUiLCAiU1RBVElTVElDUyIsIE1hdGNoQW55LCAiKCIp KQotCQlDT01QTEVURV9XSVRIKCJuZGlzdGluY3QiLCAiZGVwZW5kZW5jaWVzIiwgIm1jdiIp OworCQlDT01QTEVURV9XSVRIKCJuZGlzdGluY3QiLCAiZGVwZW5kZW5jaWVzIiwgIm1jdiIs ICJzYW1wbGUiKTsKIAllbHNlIGlmIChNYXRjaGVzKCJDUkVBVEUiLCAiU1RBVElTVElDUyIs IE1hdGNoQW55LCAiKCopIikpCiAJCUNPTVBMRVRFX1dJVEgoIk9OIik7CiAJZWxzZSBpZiAo SGVhZE1hdGNoZXMoIkNSRUFURSIsICJTVEFUSVNUSUNTIiwgTWF0Y2hBbnkpICYmCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3N0YXRpc3RpY19leHQuaCBiL3NyYy9p bmNsdWRlL2NhdGFsb2cvcGdfc3RhdGlzdGljX2V4dC5oCmluZGV4IGI4NTIwYmE5MjNiLi41 MzNiYzU3ODk5MSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19zdGF0aXN0 aWNfZXh0LmgKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19zdGF0aXN0aWNfZXh0LmgK QEAgLTgyLDYgKzgyLDcgQEAgREVDTEFSRV9BUlJBWV9GT1JFSUdOX0tFWSgoc3R4cmVsaWQs IHN0eGtleXMpLCBwZ19hdHRyaWJ1dGUsIChhdHRyZWxpZCwgYXR0bnVtKSkKICNkZWZpbmUg U1RBVFNfRVhUX0RFUEVOREVOQ0lFUwkJJ2YnCiAjZGVmaW5lIFNUQVRTX0VYVF9NQ1YJCQkJ J20nCiAjZGVmaW5lIFNUQVRTX0VYVF9FWFBSRVNTSU9OUwkJJ2UnCisjZGVmaW5lIFNUQVRT X0VYVF9TQU1QTEUJCQkncycKIAogI2VuZGlmCQkJCQkJCS8qIEVYUE9TRV9UT19DTElFTlRf Q09ERSAqLwogCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3Rp Y3MuaCBiL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3RhdGlzdGljcy5oCmluZGV4IGJiN2Vm MTI0MGUwLi5hNTdlZDZlMjliNCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RhdGlzdGlj cy9zdGF0aXN0aWNzLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RhdGlzdGljcy9zdGF0aXN0aWNz LmgKQEAgLTEwMyw2ICsxMDMsNyBAQCBleHRlcm4gdm9pZCBCdWlsZFJlbGF0aW9uRXh0U3Rh dGlzdGljcyhSZWxhdGlvbiBvbmVyZWwsIGJvb2wgaW5oLCBkb3VibGUgdG90YWxybwogCQkJ CQkJCQkJICAgaW50IG5hdHRzLCBWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3RhdHMpOwogZXh0 ZXJuIGludAlDb21wdXRlRXh0U3RhdGlzdGljc1Jvd3MoUmVsYXRpb24gb25lcmVsLAogCQkJ CQkJCQkJIGludCBuYXR0cywgVmFjQXR0clN0YXRzICoqc3RhdHMpOworZXh0ZXJuIGJvb2wg c3RhdGV4dF9pc19raW5kX2VuYWJsZWQoSGVhcFR1cGxlIGh0dXAsIGNoYXIga2luZCk7CiBl eHRlcm4gYm9vbCBzdGF0ZXh0X2lzX2tpbmRfYnVpbHQoSGVhcFR1cGxlIGh0dXAsIGNoYXIg a2luZCk7CiBleHRlcm4gU2VsZWN0aXZpdHkgZGVwZW5kZW5jaWVzX2NsYXVzZWxpc3Rfc2Vs ZWN0aXZpdHkoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkJCQkJICAgTGlzdCAqY2xh dXNlcywKQEAgLTEyNyw0ICsxMjgsMTYgQEAgZXh0ZXJuIFN0YXRpc3RpY0V4dEluZm8gKmNo b29zZV9iZXN0X3N0YXRpc3RpY3MoTGlzdCAqc3RhdHMsIGNoYXIgcmVxdWlyZWRraW5kLAog CQkJCQkJCQkJCQkJaW50IG5jbGF1c2VzKTsKIGV4dGVybiBIZWFwVHVwbGUgc3RhdGV4dF9l eHByZXNzaW9uc19sb2FkKE9pZCBzdHhvaWQsIGJvb2wgaW5oLCBpbnQgaWR4KTsKIAorZXh0 ZXJuIFN0YXRpc3RpY0V4dEluZm8gKmZpbmRfbWF0Y2hpbmdfc2FtcGxlKFBsYW5uZXJJbmZv ICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkJCQkJCSAgQml0bWFwc2V0ICphdHRu dW1zLCBMaXN0ICpleHBycyk7CisKK2V4dGVybiBib29sIHN0YXRleHRfdHJ5X2pvaW5fZXN0 aW1hdGVzKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpjbGF1c2VzLCBpbnQgdmFyUmVsaWQs CisJCQkJCQkJCQkgICBKb2luVHlwZSBqb2ludHlwZSwgU3BlY2lhbEpvaW5JbmZvICpzamlu Zm8sCisJCQkJCQkJCQkgICBCaXRtYXBzZXQgKmVzdGltYXRlZGNsYXVzZXMpOworCitleHRl cm4gU2VsZWN0aXZpdHkgc3RhdGV4dF9jbGF1c2VsaXN0X2pvaW5fc2VsZWN0aXZpdHkoUGxh bm5lckluZm8gKnJvb3QsIExpc3QgKmNsYXVzZXMsCisJCQkJCQkJCQkJCQkJICAgaW50IHZh clJlbGlkLAorCQkJCQkJCQkJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLCBTcGVjaWFsSm9p bkluZm8gKnNqaW5mbywKKwkJCQkJCQkJCQkJCQkgICBCaXRtYXBzZXQgKiplc3RpbWF0ZWRj bGF1c2VzKTsKKwogI2VuZGlmCQkJCQkJCS8qIFNUQVRJU1RJQ1NfSCAqLwpkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dAppbmRleCAyMDg4ODU3NjE1YS4uNWEzZjZi YmMxMGIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mu b3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0CkBAIC0x MTksMTAgKzExOSwxMyBAQCBzZWxlY3QgbmFtZSwgc2V0dGluZyBmcm9tIHBnX3NldHRpbmdz IHdoZXJlIG5hbWUgbGlrZSAnZW5hYmxlJSc7CiAgZW5hYmxlX3BhcnRpdGlvbl9wcnVuaW5n ICAgICAgIHwgb24KICBlbmFibGVfcGFydGl0aW9ud2lzZV9hZ2dyZWdhdGUgfCBvZmYKICBl bmFibGVfcGFydGl0aW9ud2lzZV9qb2luICAgICAgfCBvZmYKKyBlbmFibGVfc2FtcGxlX2pv aW5fY29ycmVsYXRlICAgfCBvbgorIGVuYWJsZV9zYW1wbGVfam9pbl9lc3RpbWF0ZXMgICB8 IG9uCisgZW5hYmxlX3NhbXBsZV9zY2FuX2VzdGltYXRlcyAgIHwgb24KICBlbmFibGVfc2Vx c2NhbiAgICAgICAgICAgICAgICAgfCBvbgogIGVuYWJsZV9zb3J0ICAgICAgICAgICAgICAg ICAgICB8IG9uCiAgZW5hYmxlX3RpZHNjYW4gICAgICAgICAgICAgICAgIHwgb24KLSgyMCBy b3dzKQorKDIzIHJvd3MpCiAKIC0tIFRlc3QgdGhhdCB0aGUgcGdfdGltZXpvbmVfbmFtZXMg YW5kIHBnX3RpbWV6b25lX2FiYnJldnMgdmlld3MgYXJlCiAtLSBtb3JlLW9yLWxlc3Mgd29y a2luZy4gIFdlIGNhbid0IHRlc3QgdGhlaXIgY29udGVudHMgaW4gYW55IGdyZWF0IGRldGFp bAo= --------------8BpghH4vn1jTlYfa0DsWLSI6--