Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qbynd-00DVPT-1P for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Sep 2023 07:42:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qbynb-00CsOW-TK for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Sep 2023 07:42:35 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qbynb-00CsOO-Gh for pgsql-hackers@lists.postgresql.org; Fri, 01 Sep 2023 07:42:35 +0000 Received: from mail-ua1-x92b.google.com ([2607:f8b0:4864:20::92b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qbynX-002IXv-9A for pgsql-hackers@postgresql.org; Fri, 01 Sep 2023 07:42:34 +0000 Received: by mail-ua1-x92b.google.com with SMTP id a1e0cc1a2514c-7a294a4ee4bso983316241.0 for ; Fri, 01 Sep 2023 00:42:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693554150; x=1694158950; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=fLa70dDdz0g5hhXVnh72CTj0LyM+RUCIxu3Nk+U9vlE=; b=WjxTfMfp9CalNgyp0aNUQNfOVPQpHR+65nWUCe8ZtOC0sYluNmd4l3fcpqs8Ap3k9I VOg8cyoOTTMCUCKy8vyQcOU6lgtcxqQTV3Bb79ZyfuUmdo7gb8j4jaoNWaxq+RFcvbVx IlLbUr422SGVYWPeAZerFd1SGHS9K3mQkcR5bhv0Wtacsu45Xeh2vjFLelCLhRDflfL4 m3SGRYqNJAQfiAentDORuFZiJvjfAnegGX/U6RLoHNLPr9E3YuvXUzEYovfr6NRvDxNh qsQOYe4CdekRAWyTYqm8ZxS6Wh0WgsMy2z96pdkoRtajfhMfwHgFoMk+/TQzWzABBnUT aNiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693554150; x=1694158950; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=fLa70dDdz0g5hhXVnh72CTj0LyM+RUCIxu3Nk+U9vlE=; b=kqyk09mQHXssouLvYMB5mmipX7KTth9REDqVej2Qx52qXKRXzxMp5KNHGkNGuO+74d cpab0pbnXsntZjpNb0sQG06cA0ihgbrrzEEA79eLD3QSsWhKbYfApIhDLKSKwvyFw8iO egwwJVTBFrWon7bjD5GuCOa8rYHXVBTqQHk9LWD6ifk8jcqPu1CqjD0F6uAzA2jmCEoT xdcYVd78PIDcPNGb9a7VnOM6Lg0rv0yZEtBjYOR1p/sdTUXGnEyEsSgEyCO6g5RbtlJ4 YD6/gvo3xK0mgBcXSJX74gJleDn6bHiBR58wQLFR55Bavz16UQDin/5CyFhlvel9dMT7 A+jw== X-Gm-Message-State: AOJu0Yx0MuwKcIYCzPuF01IUo62vE8v0W+3maLWGCMMwrarEV/udQf8c WKpYaNFKAel1C++SskcWC1PzOiefZ3RdA+7iOmcDjcLS7Ac= X-Google-Smtp-Source: AGHT+IFTAWf09I6TYN4SqxQv+6Oq5wZKcKzxqShM91euupNYycG+jNnHx3U8GAeSrh2fFBpm9LoELsoCCDQ3ziIWwFc= X-Received: by 2002:a05:6102:823:b0:44e:e45f:3543 with SMTP id k3-20020a056102082300b0044ee45f3543mr2378684vsb.7.1693554149817; Fri, 01 Sep 2023 00:42:29 -0700 (PDT) MIME-Version: 1.0 References: <20230601235909.0e1572c27e59112f9d0cbe86@sraoss.co.jp> <20230601034703.9e4f81f5d92ae6e3949b84d2@sraoss.co.jp> <20230628170604.505955118ac2f91abd554f13@sraoss.co.jp> <20230828024908.2667bcde8d2963256375bd6c@sraoss.co.jp> <20230828115252.c1b018605b9a0756a30c3382@sraoss.co.jp> <20230828160530.adde1e20f257d7d345989163@sraoss.co.jp> In-Reply-To: <20230828160530.adde1e20f257d7d345989163@sraoss.co.jp> From: jian he Date: Fri, 1 Sep 2023 15:42:17 +0800 Message-ID: Subject: Re: Incremental View Maintenance, take 2 To: Yugo NAGATA Cc: pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="0000000000008217160604474d24" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000008217160604474d24 Content-Type: text/plain; charset="UTF-8" hi based on v29. based on https://stackoverflow.com/a/4014981/1560347: I added a new function append_update_set_caluse, and deleted functions: {append_set_clause_for_count, append_set_clause_for_sum, append_set_clause_for_avg, append_set_clause_for_minmax} I guess this way is more extensible/generic than yours. replaced the following code with the generic function: append_update_set_caluse. + /* For views with aggregates, we need to build SET clause for updating aggregate + * values. */ + if (query->hasAggs && IsA(tle->expr, Aggref)) + { + Aggref *aggref = (Aggref *) tle->expr; + const char *aggname = get_func_name(aggref->aggfnoid); + + /* + * We can use function names here because it is already checked if these + * can be used in IMMV by its OID at the definition time. + */ + + /* count */ + if (!strcmp(aggname, "count")) + append_set_clause_for_count(resname, aggs_set_old, aggs_set_new, aggs_list_buf); + + /* sum */ + else if (!strcmp(aggname, "sum")) + append_set_clause_for_sum(resname, aggs_set_old, aggs_set_new, aggs_list_buf); + + /* avg */ + else if (!strcmp(aggname, "avg")) + append_set_clause_for_avg(resname, aggs_set_old, aggs_set_new, aggs_list_buf, + format_type_be(aggref->aggtype)); + + else + elog(ERROR, "unsupported aggregate function: %s", aggname); + } ----------------------<<< attached is my refactor. there is some whitespace errors in the patches, you need use git apply --reject --whitespace=fix basedon_v29_matview_c_refactor_update_set_clause.patch Also you patch cannot use git apply, i finally found out bulk apply using gnu patch from https://serverfault.com/questions/102324/apply-multiple-patch-files. previously I just did it manually one by one. I think if you use { for i in $PATCHES/v29*.patch; do patch -p1 < $i; done } GNU patch, it will generate an .orig file for every modified file? -----------------<<<<< src/backend/commands/matview.c 2268: /* For tuple deletion */ maybe "/* For tuple deletion and update*/" is more accurate? -----------------<<<<< currently at here: src/test/regress/sql/incremental_matview.sql 98: -- support SUM(), COUNT() and AVG() aggregate functions 99: BEGIN; 100: CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_agg AS SELECT i, SUM(j), COUNT(i), AVG(j) FROM mv_base_a GROUP BY i; 101: SELECT * FROM mv_ivm_agg ORDER BY 1,2,3,4; 102: INSERT INTO mv_base_a VALUES(2,100); src/backend/commands/matview.c 2858: if (SPI_exec(querybuf.data, 0) != SPI_OK_INSERT) 2859: elog(ERROR, "SPI_exec failed: %s", querybuf.data); then I debug, print out querybuf.data: WITH updt AS (UPDATE public.mv_ivm_agg AS mv SET __ivm_count__ = mv.__ivm_count__ OPERATOR(pg_catalog.+) diff.__ivm_count__ , sum = (CASE WHEN mv.__ivm_count_sum__ OPERATOR(pg_catalog.=) 0 AND diff.__ivm_count_sum__ OPERATOR(pg_catalog.=) 0 THEN NULL WHEN mv.sum IS NULL THEN diff.sum WHEN diff.sum IS NULL THEN mv.sum ELSE (mv.sum OPERATOR(pg_catalog.+) diff.sum) END), __ivm_count_sum__ = (mv.__ivm_count_sum__ OPERATOR(pg_catalog.+) diff.__ivm_count_sum__), count = (mv.count OPERATOR(pg_catalog.+) diff.count), avg = (CASE WHEN mv.__ivm_count_avg__ OPERATOR(pg_catalog.=) 0 AND diff.__ivm_count_avg__ OPERATOR(pg_catalog.=) 0 THEN NULL WHEN mv.__ivm_sum_avg__ IS NULL THEN diff.__ivm_sum_avg__ WHEN diff.__ivm_sum_avg__ IS NULL THEN mv.__ivm_sum_avg__ ELSE (mv.__ivm_sum_avg__ OPERATOR(pg_catalog.+) diff.__ivm_sum_avg__)::numeric END) OPERATOR(pg_catalog./) (mv.__ivm_count_avg__ OPERATOR(pg_catalog.+) diff.__ivm_count_avg__), __ivm_sum_avg__ = (CASE WHEN mv.__ivm_count_avg__ OPERATOR(pg_catalog.=) 0 AND diff.__ivm_count_avg__ OPERATOR(pg_catalog.=) 0 THEN NULL WHEN mv.__ivm_sum_avg__ IS NULL THEN diff.__ivm_sum_avg__ WHEN diff.__ivm_sum_avg__ IS NULL THEN mv.__ivm_sum_avg__ ELSE (mv.__ivm_sum_avg__ OPERATOR(pg_catalog.+) diff.__ivm_sum_avg__) END), __ivm_count_avg__ = (mv.__ivm_count_avg__ OPERATOR(pg_catalog.+) diff.__ivm_count_avg__) FROM new_delta AS diff WHERE (mv.i OPERATOR(pg_catalog.=) diff.i OR (mv.i IS NULL AND diff.i IS NULL)) RETURNING mv.i) INSERT INTO public.mv_ivm_agg (i, sum, count, avg, __ivm_count_sum__, __ivm_count_avg__, __ivm_sum_avg__, __ivm_count__) SELECT i, sum, count, avg, __ivm_count_sum__, __ivm_count_avg__, __ivm_sum_avg__, __ivm_count__ FROM new_delta AS diff WHERE NOT EXISTS (SELECT 1 FROM updt AS mv WHERE (mv.i OPERATOR(pg_catalog.=) diff.i OR (mv.i IS NULL AND diff.i IS NULL))); At this final SPI_exec, we have a update statement with related columns { __ivm_count_sum__, sum, __ivm_count__, count, avg, __ivm_sum_avg__, __ivm_count_avg__}. At this time, my mind stops working, querybuf.data is way too big, but I still feel like there is some logic associated with these columns, maybe we can use it as an assertion to prove that this query (querybuf.len = 1834) is indeed correct. Since the apply delta query is quite complex, I feel like adding some "if debug then print out the final querybuf.data end if" would be a good idea. we add hidden columns somewhere, also to avoid corner cases, so maybe somewhere we should assert total attribute number is sane. --0000000000008217160604474d24 Content-Type: text/x-patch; charset="US-ASCII"; name="basedon_v29_matview_c_refactor_update_set_clause.patch" Content-Disposition: attachment; filename="basedon_v29_matview_c_refactor_update_set_clause.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lm0abebm0 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL21hdHZpZXcuYyBiL3NyYy9iYWNrZW5k L2NvbW1hbmRzL21hdHZpZXcuYwppbmRleCBlZmY1MTJkNC4uMzNmMzg1Y2IgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL2NvbW1hbmRzL21hdHZpZXcuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5k cy9tYXR2aWV3LmMKQEAgLTE0OSwxMiArMTQ5LDM5IEBAIHR5cGVkZWYgZW51bQogCUlWTV9TVUIK IH0gSXZtT3A7CiAKK3R5cGVkZWYgZW51bQoreworICAgIEJBRF9BR0dGVU5DLAorICAgIElWTV9D T1VOVCwKKyAgICBJVk1fU1VNLAorICAgIElWTV9BVkcsCisgICAgSVZNX01JTiwKKyAgICBJVk1f TUFYCit9IEl2bUFnZ1R5cGU7CisKK3R5cGVkZWYgc3RydWN0IGFnZ25hbWVfZW50cnkKK3sKKyAg ICBjb25zdCBjaGFyICphZ2dfbmFtZTsKKyAgICBpbnQgdmFsOworfSBhZ2duYW1lX2VudHJ5Owor CisvKiBtYXAgYWdncmVnYXRlIG5hbWUgd2l0aCBlbnVtICovCitzdGF0aWMgYWdnbmFtZV9lbnRy eSBpdm1fYWdnX2xvb2t1cFtdID0KK3sKKyAgICB7ICJjb3VudCIsSVZNX0NPVU5UfSwKKyAgICB7 ICJzdW0iLCBJVk1fU1VNfSwKKyAgICB7ICJhdmciLCBJVk1fQVZHfSwKKyAgICB7ICJtaW4iLElW TV9NSU59LAorICAgIHsgIm1heCIsSVZNX01BWH0KK307CisKIC8qIEVOUiBuYW1lIGZvciBtYXRl cmlhbGl6ZWQgdmlldyBkZWx0YSAqLwogI2RlZmluZSBORVdfREVMVEFfRU5STkFNRSAibmV3X2Rl bHRhIgogI2RlZmluZSBPTERfREVMVEFfRU5STkFNRSAib2xkX2RlbHRhIgogCiBzdGF0aWMgaW50 CW1hdHZpZXdfbWFpbnRlbmFuY2VfZGVwdGggPSAwOwogCitzdGF0aWMgaW50IGdldF9pdm1fYWdn ZnVuYyhjb25zdCBjaGFyICphZ2dfbmFtZSk7CiBzdGF0aWMgdm9pZCB0cmFuc2llbnRyZWxfc3Rh cnR1cChEZXN0UmVjZWl2ZXIgKnNlbGYsIGludCBvcGVyYXRpb24sIFR1cGxlRGVzYyB0eXBlaW5m byk7CiBzdGF0aWMgYm9vbCB0cmFuc2llbnRyZWxfcmVjZWl2ZShUdXBsZVRhYmxlU2xvdCAqc2xv dCwgRGVzdFJlY2VpdmVyICpzZWxmKTsKIHN0YXRpYyB2b2lkIHRyYW5zaWVudHJlbF9zaHV0ZG93 bihEZXN0UmVjZWl2ZXIgKnNlbGYpOwpAQCAtMTkxLDE2ICsyMTgsNyBAQCBzdGF0aWMgUXVlcnkg KnJld3JpdGVfcXVlcnlfZm9yX3Bvc3R1cGRhdGVfc3RhdGUoUXVlcnkgKnF1ZXJ5LCBNVl9Ucmln Z2VyVGFibGUgKgogc3RhdGljIHZvaWQgYXBwbHlfZGVsdGEoT2lkIG1hdHZpZXdPaWQsIFR1cGxl c3RvcmVzdGF0ZSAqb2xkX3R1cGxlc3RvcmVzLCBUdXBsZXN0b3Jlc3RhdGUgKm5ld190dXBsZXN0 b3JlcywKIAkJCVR1cGxlRGVzYyB0dXBkZXNjX29sZCwgVHVwbGVEZXNjIHR1cGRlc2NfbmV3LAog CQkJUXVlcnkgKnF1ZXJ5LCBib29sIHVzZV9jb3VudCwgY2hhciAqY291bnRfY29sbmFtZSk7Ci1z dGF0aWMgdm9pZCBhcHBlbmRfc2V0X2NsYXVzZV9mb3JfY291bnQoY29uc3QgY2hhciAqcmVzbmFt ZSwgU3RyaW5nSW5mbyBidWZfb2xkLAotCQkJCQkJCVN0cmluZ0luZm8gYnVmX25ldyxTdHJpbmdJ bmZvIGFnZ3NfbGlzdCk7Ci1zdGF0aWMgdm9pZCBhcHBlbmRfc2V0X2NsYXVzZV9mb3Jfc3VtKGNv bnN0IGNoYXIgKnJlc25hbWUsIFN0cmluZ0luZm8gYnVmX29sZCwKLQkJCQkJCSAgU3RyaW5nSW5m byBidWZfbmV3LCBTdHJpbmdJbmZvIGFnZ3NfbGlzdCk7Ci1zdGF0aWMgdm9pZCBhcHBlbmRfc2V0 X2NsYXVzZV9mb3JfYXZnKGNvbnN0IGNoYXIgKnJlc25hbWUsIFN0cmluZ0luZm8gYnVmX29sZCwK LQkJCQkJCSAgU3RyaW5nSW5mbyBidWZfbmV3LCBTdHJpbmdJbmZvIGFnZ3NfbGlzdCwKLQkJCQkJ CSAgY29uc3QgY2hhciAqYWdndHlwZSk7Ci1zdGF0aWMgdm9pZCBhcHBlbmRfc2V0X2NsYXVzZV9m b3JfbWlubWF4KGNvbnN0IGNoYXIgKnJlc25hbWUsIFN0cmluZ0luZm8gYnVmX29sZCwKLQkJCQkJ CQkgU3RyaW5nSW5mbyBidWZfbmV3LCBTdHJpbmdJbmZvIGFnZ3NfbGlzdCwKLQkJCQkJCQkgYm9v bCBpc19taW4pOworCiBzdGF0aWMgY2hhciAqZ2V0X29wZXJhdGlvbl9zdHJpbmcoSXZtT3Agb3As IGNvbnN0IGNoYXIgKmNvbCwgY29uc3QgY2hhciAqYXJnMSwgY29uc3QgY2hhciAqYXJnMiwKIAkJ CQkJIGNvbnN0IGNoYXIqIGNvdW50X2NvbCwgY29uc3QgY2hhciAqY2FzdFR5cGUpOwogc3RhdGlj IGNoYXIgKmdldF9udWxsX2NvbmRpdGlvbl9zdHJpbmcoSXZtT3Agb3AsIGNvbnN0IGNoYXIgKmFy ZzEsIGNvbnN0IGNoYXIgKmFyZzIsCkBAIC0yMzUsNiArMjUzLDI1IEBAIHN0YXRpYyB2b2lkIG12 X0hhc2hQcmVwYXJlZFBsYW4oTVZfUXVlcnlLZXkgKmtleSwgU1BJUGxhblB0ciBwbGFuKTsKIHN0 YXRpYyB2b2lkIG12X0J1aWxkUXVlcnlLZXkoTVZfUXVlcnlLZXkgKmtleSwgT2lkIG1hdHZpZXdf aWQsIGludDMyIHF1ZXJ5X3R5cGUpOwogc3RhdGljIHZvaWQgY2xlYW5fdXBfSVZNX2hhc2hfZW50 cnkoTVZfVHJpZ2dlckhhc2hFbnRyeSAqZW50cnksIGJvb2wgaXNfYWJvcnQpOwogCitzdGF0aWMg dm9pZCBhcHBlbmRfdXBkYXRlX3NldF9jYWx1c2UoY29uc3QgY2hhciAqYWdnbmFtZSwgY2hhciAq cmVzbmFtZSwgU3RyaW5nSW5mbyBidWZfb2xkLAorCQkJCQkJCVN0cmluZ0luZm8gYnVmX25ldyxT dHJpbmdJbmZvIGFnZ3NfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICph Z2d0eXBlKTsKKworaW50CitnZXRfaXZtX2FnZ2Z1bmMoY29uc3QgY2hhciAqYWdnX25hbWUpCit7 CisjZGVmaW5lIE5LRVlTIChzaXplb2YoaXZtX2FnZ19sb29rdXApL3NpemVvZihhZ2duYW1lX2Vu dHJ5KSkKKworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpIDwgTktFWVM7IGkrKykKKyAgICB7 CisgICAgICAgIGFnZ25hbWVfZW50cnkgKmVudHJ5ID0gJml2bV9hZ2dfbG9va3VwW2ldOworICAg ICAgICBpZiAoc3RyY21wKGVudHJ5LT5hZ2dfbmFtZSwgYWdnX25hbWUpID09IDApCisgICAgICAg ICAgICByZXR1cm4gZW50cnktPnZhbDsKKyAgICB9CisgICAgcmV0dXJuIEJBRF9BR0dGVU5DOwor fQorCiAvKgogICogU2V0TWF0Vmlld1BvcHVsYXRlZFN0YXRlCiAgKgkJTWFyayBhIG1hdGVyaWFs aXplZCB2aWV3IGFzIHBvcHVsYXRlZCwgb3Igbm90LgpAQCAtMjIxMCwzOCArMjI0NywyMyBAQCBh cHBseV9kZWx0YShPaWQgbWF0dmlld09pZCwgVHVwbGVzdG9yZXN0YXRlICpvbGRfdHVwbGVzdG9y ZXMsIFR1cGxlc3RvcmVzdGF0ZSAqbgogCQl7CiAJCQlBZ2dyZWYgKmFnZ3JlZiA9IChBZ2dyZWYg KikgdGxlLT5leHByOwogCQkJY29uc3QgY2hhciAqYWdnbmFtZSA9IGdldF9mdW5jX25hbWUoYWdn cmVmLT5hZ2dmbm9pZCk7CisJCQljaGFyICphZ2d0eXBlID0gZm9ybWF0X3R5cGVfYmUoYWdncmVm LT5hZ2d0eXBlKTsKIAogCQkJLyoKIAkJCSAqIFdlIGNhbiB1c2UgZnVuY3Rpb24gbmFtZXMgaGVy ZSBiZWNhdXNlIGl0IGlzIGFscmVhZHkgY2hlY2tlZCBpZiB0aGVzZQogCQkJICogY2FuIGJlIHVz ZWQgaW4gSU1NViBieSBpdHMgT0lEIGF0IHRoZSBkZWZpbml0aW9uIHRpbWUuCiAJCQkgKi8KLQot CQkJLyogY291bnQgKi8KLQkJCWlmICghc3RyY21wKGFnZ25hbWUsICJjb3VudCIpKQotCQkJCWFw cGVuZF9zZXRfY2xhdXNlX2Zvcl9jb3VudChyZXNuYW1lLCBhZ2dzX3NldF9vbGQsIGFnZ3Nfc2V0 X25ldywgYWdnc19saXN0X2J1Zik7Ci0KLQkJCS8qIHN1bSAqLwotCQkJZWxzZSBpZiAoIXN0cmNt cChhZ2duYW1lLCAic3VtIikpCi0JCQkJYXBwZW5kX3NldF9jbGF1c2VfZm9yX3N1bShyZXNuYW1l LCBhZ2dzX3NldF9vbGQsIGFnZ3Nfc2V0X25ldywgYWdnc19saXN0X2J1Zik7Ci0KLQkJCS8qIGF2 ZyAqLwotCQkJZWxzZSBpZiAoIXN0cmNtcChhZ2duYW1lLCAiYXZnIikpCi0JCQkJYXBwZW5kX3Nl dF9jbGF1c2VfZm9yX2F2ZyhyZXNuYW1lLCBhZ2dzX3NldF9vbGQsIGFnZ3Nfc2V0X25ldywgYWdn c19saXN0X2J1ZiwKLQkJCQkJCQkJCQkgIGZvcm1hdF90eXBlX2JlKGFnZ3JlZi0+YWdndHlwZSkp OwotCi0JCQkvKiBtaW4vbWF4ICovCi0JCQllbHNlIGlmICghc3RyY21wKGFnZ25hbWUsICJtaW4i KSB8fCAhc3RyY21wKGFnZ25hbWUsICJtYXgiKSkKKyAgICAgICAgICAgICh2b2lkKSBhcHBlbmRf dXBkYXRlX3NldF9jYWx1c2UoYWdnbmFtZSwgcmVzbmFtZSwgYWdnc19zZXRfb2xkLAorCQkJCQkJ CWFnZ3Nfc2V0X25ldywgYWdnc19saXN0X2J1ZiwgYWdndHlwZSk7CisgICAgICAgICAgICAKKwkJ CWlmICghc3RyY21wKGFnZ25hbWUsICJtaW4iKSB8fCAhc3RyY21wKGFnZ25hbWUsICJtYXgiKSkK IAkJCXsKIAkJCQlib29sCWlzX21pbiA9ICghc3RyY21wKGFnZ25hbWUsICJtaW4iKSk7CiAKLQkJ CQlhcHBlbmRfc2V0X2NsYXVzZV9mb3JfbWlubWF4KHJlc25hbWUsIGFnZ3Nfc2V0X29sZCwgYWdn c19zZXRfbmV3LCBhZ2dzX2xpc3RfYnVmLCBpc19taW4pOwotCiAJCQkJLyogbWFrZSBhIHJlc25h bWUgbGlzdCBvZiBtaW4gYW5kIG1heCBhZ2dyZWdhdGVzICovCiAJCQkJbWlubWF4X2xpc3QgPSBs YXBwZW5kKG1pbm1heF9saXN0LCByZXNuYW1lKTsKIAkJCQlpc19taW5fbGlzdCA9IGxhcHBlbmRf aW50KGlzX21pbl9saXN0LCBpc19taW4pOwogCQkJfQotCQkJZWxzZQotCQkJCWVsb2coRVJST1Is ICJ1bnN1cHBvcnRlZCBhZ2dyZWdhdGUgZnVuY3Rpb246ICVzIiwgYWdnbmFtZSk7CiAJCX0KIAl9 CiAKQEAgLTIzMzgsMjI0ICsyMzYwLDYgQEAgYXBwbHlfZGVsdGEoT2lkIG1hdHZpZXdPaWQsIFR1 cGxlc3RvcmVzdGF0ZSAqb2xkX3R1cGxlc3RvcmVzLCBUdXBsZXN0b3Jlc3RhdGUgKm4KIAkJZWxv ZyhFUlJPUiwgIlNQSV9maW5pc2ggZmFpbGVkIik7CiB9CiAKLS8qCi0gKiBhcHBlbmRfc2V0X2Ns YXVzZV9mb3JfY291bnQKLSAqCi0gKiBBcHBlbmQgU0VUIGNsYXVzZSBzdHJpbmcgZm9yIGNvdW50 IGFnZ3JlZ2F0aW9uIHRvIGdpdmVuIGJ1ZmZlcnMuCi0gKiBBbHNvLCBhcHBlbmQgcmVzbmFtZXMg cmVxdWlyZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBhZ2dyZWdhdGUgdmFsdWUuCi0gKi8KLXN0YXRp YyB2b2lkCi1hcHBlbmRfc2V0X2NsYXVzZV9mb3JfY291bnQoY29uc3QgY2hhciAqcmVzbmFtZSwg U3RyaW5nSW5mbyBidWZfb2xkLAotCQkJCQkJCVN0cmluZ0luZm8gYnVmX25ldyxTdHJpbmdJbmZv IGFnZ3NfbGlzdCkKLXsKLQkvKiBGb3IgdHVwbGUgZGVsZXRpb24gKi8KLQlpZiAoYnVmX29sZCkK LQl7Ci0JCS8qIHJlc25hbWUgPSBtdi5yZXNuYW1lIC0gdC5yZXNuYW1lICovCi0JCWFwcGVuZFN0 cmluZ0luZm8oYnVmX29sZCwKLQkJCSIsICVzID0gJXMiLAotCQkJcXVvdGVfcXVhbGlmaWVkX2lk ZW50aWZpZXIoTlVMTCwgcmVzbmFtZSksCi0JCQlnZXRfb3BlcmF0aW9uX3N0cmluZyhJVk1fU1VC LCByZXNuYW1lLCAibXYiLCAidCIsIE5VTEwsIE5VTEwpKTsKLQl9Ci0JLyogRm9yIHR1cGxlIGlu c2VydGlvbiAqLwotCWlmIChidWZfbmV3KQotCXsKLQkJLyogcmVzbmFtZSA9IG12LnJlc25hbWUg KyBkaWZmLnJlc25hbWUgKi8KLQkJYXBwZW5kU3RyaW5nSW5mbyhidWZfbmV3LAotCQkJIiwgJXMg PSAlcyIsCi0JCQlxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcihOVUxMLCByZXNuYW1lKSwKLQkJ CWdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9BREQsIHJlc25hbWUsICJtdiIsICJkaWZmIiwgTlVM TCwgTlVMTCkpOwotCX0KLQotCWFwcGVuZFN0cmluZ0luZm8oYWdnc19saXN0LCAiLCAlcyIsCi0J CXF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKCJkaWZmIiwgcmVzbmFtZSkKLQkpOwotfQotCi0v KgotICogYXBwZW5kX3NldF9jbGF1c2VfZm9yX3N1bQotICoKLSAqIEFwcGVuZCBTRVQgY2xhdXNl IHN0cmluZyBmb3Igc3VtIGFnZ3JlZ2F0aW9uIHRvIGdpdmVuIGJ1ZmZlcnMuCi0gKiBBbHNvLCBh cHBlbmQgcmVzbmFtZXMgcmVxdWlyZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBhZ2dyZWdhdGUgdmFs dWUuCi0gKi8KLXN0YXRpYyB2b2lkCi1hcHBlbmRfc2V0X2NsYXVzZV9mb3Jfc3VtKGNvbnN0IGNo YXIgKnJlc25hbWUsIFN0cmluZ0luZm8gYnVmX29sZCwKLQkJCQkJCSAgU3RyaW5nSW5mbyBidWZf bmV3LCBTdHJpbmdJbmZvIGFnZ3NfbGlzdCkKLXsKLQljaGFyICpjb3VudF9jb2wgPSBJVk1fY29s bmFtZSgiY291bnQiLCByZXNuYW1lKTsKLQotCS8qIEZvciB0dXBsZSBkZWxldGlvbiAqLwotCWlm IChidWZfb2xkKQotCXsKLQkJLyogc3VtID0gbXYuc3VtIC0gdC5zdW0gKi8KLQkJYXBwZW5kU3Ry aW5nSW5mbyhidWZfb2xkLAotCQkJIiwgJXMgPSAlcyIsCi0JCQlxdW90ZV9xdWFsaWZpZWRfaWRl bnRpZmllcihOVUxMLCByZXNuYW1lKSwKLQkJCWdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9TVUIs IHJlc25hbWUsICJtdiIsICJ0IiwgY291bnRfY29sLCBOVUxMKQotCQkpOwotCQkvKiBjb3VudCA9 IG12LmNvdW50IC0gdC5jb3VudCAqLwotCQlhcHBlbmRTdHJpbmdJbmZvKGJ1Zl9vbGQsCi0JCQki LCAlcyA9ICVzIiwKLQkJCXF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEwsIGNvdW50X2Nv bCksCi0JCQlnZXRfb3BlcmF0aW9uX3N0cmluZyhJVk1fU1VCLCBjb3VudF9jb2wsICJtdiIsICJ0 IiwgTlVMTCwgTlVMTCkKLQkJKTsKLQl9Ci0JLyogRm9yIHR1cGxlIGluc2VydGlvbiAqLwotCWlm IChidWZfbmV3KQotCXsKLQkJLyogc3VtID0gbXYuc3VtICsgZGlmZi5zdW0gKi8KLQkJYXBwZW5k U3RyaW5nSW5mbyhidWZfbmV3LAotCQkJIiwgJXMgPSAlcyIsCi0JCQlxdW90ZV9xdWFsaWZpZWRf aWRlbnRpZmllcihOVUxMLCByZXNuYW1lKSwKLQkJCWdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9B REQsIHJlc25hbWUsICJtdiIsICJkaWZmIiwgY291bnRfY29sLCBOVUxMKQotCQkpOwotCQkvKiBj b3VudCA9IG12LmNvdW50ICsgZGlmZi5jb3VudCAqLwotCQlhcHBlbmRTdHJpbmdJbmZvKGJ1Zl9u ZXcsCi0JCQkiLCAlcyA9ICVzIiwKLQkJCXF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEws IGNvdW50X2NvbCksCi0JCQlnZXRfb3BlcmF0aW9uX3N0cmluZyhJVk1fQURELCBjb3VudF9jb2ws ICJtdiIsICJkaWZmIiwgTlVMTCwgTlVMTCkKLQkJKTsKLQl9Ci0KLQlhcHBlbmRTdHJpbmdJbmZv KGFnZ3NfbGlzdCwgIiwgJXMsICVzIiwKLQkJcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRp ZmYiLCByZXNuYW1lKSwKLQkJcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRpZmYiLCBJVk1f Y29sbmFtZSgiY291bnQiLCByZXNuYW1lKSkKLQkpOwotfQotCi0vKgotICogYXBwZW5kX3NldF9j bGF1c2VfZm9yX2F2ZwotICoKLSAqIEFwcGVuZCBTRVQgY2xhdXNlIHN0cmluZyBmb3IgYXZnIGFn Z3JlZ2F0aW9uIHRvIGdpdmVuIGJ1ZmZlcnMuCi0gKiBBbHNvLCBhcHBlbmQgcmVzbmFtZXMgcmVx dWlyZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBhZ2dyZWdhdGUgdmFsdWUuCi0gKi8KLXN0YXRpYyB2 b2lkCi1hcHBlbmRfc2V0X2NsYXVzZV9mb3JfYXZnKGNvbnN0IGNoYXIgKnJlc25hbWUsIFN0cmlu Z0luZm8gYnVmX29sZCwKLQkJCQkJCSAgU3RyaW5nSW5mbyBidWZfbmV3LCBTdHJpbmdJbmZvIGFn Z3NfbGlzdCwKLQkJCQkJCSAgY29uc3QgY2hhciAqYWdndHlwZSkKLXsKLQljaGFyICpzdW1fY29s ID0gSVZNX2NvbG5hbWUoInN1bSIsIHJlc25hbWUpOwotCWNoYXIgKmNvdW50X2NvbCA9IElWTV9j b2xuYW1lKCJjb3VudCIsIHJlc25hbWUpOwotCi0JLyogRm9yIHR1cGxlIGRlbGV0aW9uICovCi0J aWYgKGJ1Zl9vbGQpCi0JewotCQkvKiBhdmcgPSAobXYuc3VtIC0gdC5zdW0pOjphZ2d0eXBlIC8g KG12LmNvdW50IC0gdC5jb3VudCkgKi8KLQkJYXBwZW5kU3RyaW5nSW5mbyhidWZfb2xkLAotCQkJ IiwgJXMgPSAlcyBPUEVSQVRPUihwZ19jYXRhbG9nLi8pICVzIiwKLQkJCXF1b3RlX3F1YWxpZmll ZF9pZGVudGlmaWVyKE5VTEwsIHJlc25hbWUpLAotCQkJZ2V0X29wZXJhdGlvbl9zdHJpbmcoSVZN X1NVQiwgc3VtX2NvbCwgIm12IiwgInQiLCBjb3VudF9jb2wsIGFnZ3R5cGUpLAotCQkJZ2V0X29w ZXJhdGlvbl9zdHJpbmcoSVZNX1NVQiwgY291bnRfY29sLCAibXYiLCAidCIsIE5VTEwsIE5VTEwp Ci0JCSk7Ci0JCS8qIHN1bSA9IG12LnN1bSAtIHQuc3VtICovCi0JCWFwcGVuZFN0cmluZ0luZm8o YnVmX29sZCwKLQkJCSIsICVzID0gJXMiLAotCQkJcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIo TlVMTCwgc3VtX2NvbCksCi0JCQlnZXRfb3BlcmF0aW9uX3N0cmluZyhJVk1fU1VCLCBzdW1fY29s LCAibXYiLCAidCIsIGNvdW50X2NvbCwgTlVMTCkKLQkJKTsKLQkJLyogY291bnQgPSBtdi5jb3Vu dCAtIHQuY291bnQgKi8KLQkJYXBwZW5kU3RyaW5nSW5mbyhidWZfb2xkLAotCQkJIiwgJXMgPSAl cyIsCi0JCQlxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcihOVUxMLCBjb3VudF9jb2wpLAotCQkJ Z2V0X29wZXJhdGlvbl9zdHJpbmcoSVZNX1NVQiwgY291bnRfY29sLCAibXYiLCAidCIsIE5VTEws IE5VTEwpCi0JCSk7Ci0KLQl9Ci0JLyogRm9yIHR1cGxlIGluc2VydGlvbiAqLwotCWlmIChidWZf bmV3KQotCXsKLQkJLyogYXZnID0gKG12LnN1bSArIGRpZmYuc3VtKTo6YWdndHlwZSAvIChtdi5j b3VudCArIGRpZmYuY291bnQpICovCi0JCWFwcGVuZFN0cmluZ0luZm8oYnVmX25ldywKLQkJCSIs ICVzID0gJXMgT1BFUkFUT1IocGdfY2F0YWxvZy4vKSAlcyIsCi0JCQlxdW90ZV9xdWFsaWZpZWRf aWRlbnRpZmllcihOVUxMLCByZXNuYW1lKSwKLQkJCWdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9B REQsIHN1bV9jb2wsICJtdiIsICJkaWZmIiwgY291bnRfY29sLCBhZ2d0eXBlKSwKLQkJCWdldF9v cGVyYXRpb25fc3RyaW5nKElWTV9BREQsIGNvdW50X2NvbCwgIm12IiwgImRpZmYiLCBOVUxMLCBO VUxMKQotCQkpOwotCQkvKiBzdW0gPSBtdi5zdW0gKyBkaWZmLnN1bSAqLwotCQlhcHBlbmRTdHJp bmdJbmZvKGJ1Zl9uZXcsCi0JCQkiLCAlcyA9ICVzIiwKLQkJCXF1b3RlX3F1YWxpZmllZF9pZGVu dGlmaWVyKE5VTEwsIHN1bV9jb2wpLAotCQkJZ2V0X29wZXJhdGlvbl9zdHJpbmcoSVZNX0FERCwg c3VtX2NvbCwgIm12IiwgImRpZmYiLCBjb3VudF9jb2wsIE5VTEwpCi0JCSk7Ci0JCS8qIGNvdW50 ID0gbXYuY291bnQgKyBkaWZmLmNvdW50ICovCi0JCWFwcGVuZFN0cmluZ0luZm8oYnVmX25ldywK LQkJCSIsICVzID0gJXMiLAotCQkJcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoTlVMTCwgY291 bnRfY29sKSwKLQkJCWdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9BREQsIGNvdW50X2NvbCwgIm12 IiwgImRpZmYiLCBOVUxMLCBOVUxMKQotCQkpOwotCX0KLQotCWFwcGVuZFN0cmluZ0luZm8oYWdn c19saXN0LCAiLCAlcywgJXMsICVzIiwKLQkJcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRp ZmYiLCByZXNuYW1lKSwKLQkJcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRpZmYiLCBJVk1f Y29sbmFtZSgic3VtIiwgcmVzbmFtZSkpLAotCQlxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcigi ZGlmZiIsIElWTV9jb2xuYW1lKCJjb3VudCIsIHJlc25hbWUpKQotCSk7Ci19Ci0KLS8qCi0gKiBh cHBlbmRfc2V0X2NsYXVzZV9mb3JfbWlubWF4Ci0gKgotICogQXBwZW5kIFNFVCBjbGF1c2Ugc3Ry aW5nIGZvciBtaW4gb3IgbWF4IGFnZ3JlZ2F0aW9uIHRvIGdpdmVuIGJ1ZmZlcnMuCi0gKiBBbHNv LCBhcHBlbmQgcmVzbmFtZXMgcmVxdWlyZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBhZ2dyZWdhdGUg dmFsdWUuCi0gKiBpc19taW4gaXMgdHJ1ZSBpZiB0aGlzIGlzIG1pbiwgZmFsc2UgaWYgbm90Lgot ICovCi1zdGF0aWMgdm9pZAotYXBwZW5kX3NldF9jbGF1c2VfZm9yX21pbm1heChjb25zdCBjaGFy ICpyZXNuYW1lLCBTdHJpbmdJbmZvIGJ1Zl9vbGQsCi0JCQkJCQkJIFN0cmluZ0luZm8gYnVmX25l dywgU3RyaW5nSW5mbyBhZ2dzX2xpc3QsCi0JCQkJCQkJIGJvb2wgaXNfbWluKQotewotCWNoYXIg KmNvdW50X2NvbCA9IElWTV9jb2xuYW1lKCJjb3VudCIsIHJlc25hbWUpOwotCi0JLyogRm9yIHR1 cGxlIGRlbGV0aW9uICovCi0JaWYgKGJ1Zl9vbGQpCi0JewotCQkvKgotCQkgKiBJZiB0aGUgbmV3 IHZhbHVlIGRvZXNuJ3QgYmVjYW1lIE5VTEwgdGhlbiB1c2UgdGhlIHZhbHVlIHJlbWFpbmluZwot CQkgKiBpbiB0aGUgdmlldyBhbHRob3VnaCB0aGlzIHdpbGwgYmUgcmVjb21wdXRhdGVkIGFmdGVy d29yZHMuCi0JCSAqLwotCQlhcHBlbmRTdHJpbmdJbmZvKGJ1Zl9vbGQsCi0JCQkiLCAlcyA9IENB U0UgV0hFTiAlcyBUSEVOIE5VTEwgRUxTRSAlcyBFTkQiLAotCQkJcXVvdGVfcXVhbGlmaWVkX2lk ZW50aWZpZXIoTlVMTCwgcmVzbmFtZSksCi0JCQlnZXRfbnVsbF9jb25kaXRpb25fc3RyaW5nKElW TV9TVUIsICJtdiIsICJ0IiwgY291bnRfY29sKSwKLQkJCXF1b3RlX3F1YWxpZmllZF9pZGVudGlm aWVyKCJtdiIsIHJlc25hbWUpCi0JCSk7Ci0JCS8qIGNvdW50ID0gbXYuY291bnQgLSB0LmNvdW50 ICovCi0JCWFwcGVuZFN0cmluZ0luZm8oYnVmX29sZCwKLQkJCSIsICVzID0gJXMiLAotCQkJcXVv dGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoTlVMTCwgY291bnRfY29sKSwKLQkJCWdldF9vcGVyYXRp b25fc3RyaW5nKElWTV9TVUIsIGNvdW50X2NvbCwgIm12IiwgInQiLCBOVUxMLCBOVUxMKQotCQkp OwotCX0KLQkvKiBGb3IgdHVwbGUgaW5zZXJ0aW9uICovCi0JaWYgKGJ1Zl9uZXcpCi0JewotCQkv KgotCQkgKiBtaW4gPSBMRUFTVChtdi5taW4sIGRpZmYubWluKQotCQkgKiBtYXggPSBHUkVBVEVT VChtdi5tYXgsIGRpZmYubWF4KQotCQkgKi8KLQkJYXBwZW5kU3RyaW5nSW5mbyhidWZfbmV3LAot CQkJIiwgJXMgPSBDQVNFIFdIRU4gJXMgVEhFTiBOVUxMIEVMU0UgJXMoJXMsJXMpIEVORCIsCi0J CQlxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcihOVUxMLCByZXNuYW1lKSwKLQkJCWdldF9udWxs X2NvbmRpdGlvbl9zdHJpbmcoSVZNX0FERCwgIm12IiwgImRpZmYiLCBjb3VudF9jb2wpLAotCi0J CQlpc19taW4gPyAiTEVBU1QiIDogIkdSRUFURVNUIiwKLQkJCXF1b3RlX3F1YWxpZmllZF9pZGVu dGlmaWVyKCJtdiIsIHJlc25hbWUpLAotCQkJcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRp ZmYiLCByZXNuYW1lKQotCQkpOwotCQkvKiBjb3VudCA9IG12LmNvdW50ICsgZGlmZi5jb3VudCAq LwotCQlhcHBlbmRTdHJpbmdJbmZvKGJ1Zl9uZXcsCi0JCQkiLCAlcyA9ICVzIiwKLQkJCXF1b3Rl X3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEwsIGNvdW50X2NvbCksCi0JCQlnZXRfb3BlcmF0aW9u X3N0cmluZyhJVk1fQURELCBjb3VudF9jb2wsICJtdiIsICJkaWZmIiwgTlVMTCwgTlVMTCkKLQkJ KTsKLQl9Ci0KLQlhcHBlbmRTdHJpbmdJbmZvKGFnZ3NfbGlzdCwgIiwgJXMsICVzIiwKLQkJcXVv dGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRpZmYiLCByZXNuYW1lKSwKLQkJcXVvdGVfcXVhbGlm aWVkX2lkZW50aWZpZXIoImRpZmYiLCBJVk1fY29sbmFtZSgiY291bnQiLCByZXNuYW1lKSkKLQkp OwotfQotCiAvKgogICogZ2V0X29wZXJhdGlvbl9zdHJpbmcKICAqCkBAIC0zNDgyLDMgKzMyODYs MjI4IEBAIGlzSXZtTmFtZShjb25zdCBjaGFyICpzKQogCQlyZXR1cm4gKHN0cm5jbXAocywgIl9f aXZtXyIsIDYpID09IDApOwogCXJldHVybiBmYWxzZTsKIH0KKwordm9pZAorYXBwZW5kX3VwZGF0 ZV9zZXRfY2FsdXNlKGNvbnN0IGNoYXIgKmFnZ25hbWUsIGNoYXIgKnJlc25hbWUsIFN0cmluZ0lu Zm8gYnVmX29sZCwKKwkJCQkJCQlTdHJpbmdJbmZvIGJ1Zl9uZXcsIFN0cmluZ0luZm8gYWdnc19s aXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmFnZ3R5cGUpCit7ICAgIAor ICAgIGNoYXIgKmNvdW50X2NvbCA9IElWTV9jb2xuYW1lKCJjb3VudCIsIHJlc25hbWUpOworCWNo YXIgKnN1bV9jb2wgPSBJVk1fY29sbmFtZSgic3VtIiwgcmVzbmFtZSk7CisKKyAgICBzd2l0Y2gg KGdldF9pdm1fYWdnZnVuYyhhZ2duYW1lKSkKKyAgICB7CisgICAgICAgIGNhc2UgSVZNX0NPVU5U OgorICAgICAgICAgICAgaWYgKGJ1Zl9vbGQpCisgICAgICAgICAgICAgICAgYXBwZW5kU3RyaW5n SW5mbyhidWZfb2xkLAorICAgICAgICAgICAgICAgICAgICAiLCAlcyA9ICVzIiwKKyAgICAgICAg ICAgICAgICAgICAgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoTlVMTCwgcmVzbmFtZSksCisg ICAgICAgICAgICAgICAgICAgIGdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9TVUIsIHJlc25hbWUs ICJtdiIsICJ0IiwgTlVMTCwgTlVMTCkpOworCisgICAgICAgICAgICBpZiAoYnVmX25ldykKKyAg ICAgICAgICAgICAgICBhcHBlbmRTdHJpbmdJbmZvKGJ1Zl9uZXcsCisgICAgICAgICAgICAgICAg ICAgICIsICVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICBxdW90ZV9xdWFsaWZpZWRfaWRl bnRpZmllcihOVUxMLCByZXNuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0X29wZXJhdGlv bl9zdHJpbmcoSVZNX0FERCwgcmVzbmFtZSwgIm12IiwgImRpZmYiLCBOVUxMLCBOVUxMKSk7CisK KyAgICAgICAgICAgIGFwcGVuZFN0cmluZ0luZm8oYWdnc19saXN0LCAiLCAlcyIsCisgICAgICAg ICAgICAgICAgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRpZmYiLCByZXNuYW1lKSk7CisJ CQlicmVhazsKKworICAgICAgICBjYXNlIElWTV9TVU06CisgICAgICAgICAgICBpZiAoYnVmX29s ZCkKKyAgICAgICAgICAgIHsKKwkJCQkvKiBzdW0gPSBtdi5zdW0gLSB0LnN1bSAqLworICAgICAg ICAgICAgICAgIGFwcGVuZFN0cmluZ0luZm8oYnVmX29sZCwKKyAgICAgICAgICAgICAgICAgICAg IiwgJXMgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlm aWVyKE5VTEwsIHJlc25hbWUpLAorICAgICAgICAgICAgICAgICAgICBnZXRfb3BlcmF0aW9uX3N0 cmluZyhJVk1fU1VCLCByZXNuYW1lLCAibXYiLCAidCIsIGNvdW50X2NvbCwgTlVMTCkKKyAgICAg ICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgLyogY291bnQgPSBtdi5jb3VudCAtIHQu Y291bnQgKi8KKyAgICAgICAgICAgICAgICBhcHBlbmRTdHJpbmdJbmZvKGJ1Zl9vbGQsCisgICAg ICAgICAgICAgICAgICAgICIsICVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICBxdW90ZV9x dWFsaWZpZWRfaWRlbnRpZmllcihOVUxMLCBjb3VudF9jb2wpLAorICAgICAgICAgICAgICAgICAg ICBnZXRfb3BlcmF0aW9uX3N0cmluZyhJVk1fU1VCLCBjb3VudF9jb2wsICJtdiIsICJ0IiwgTlVM TCwgTlVMTCkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisgICAgICAgICAg ICBpZiAoYnVmX25ldykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdW0gPSBt di5zdW0gKyBkaWZmLnN1bSAqLworICAgICAgICAgICAgICAgIGFwcGVuZFN0cmluZ0luZm8oYnVm X25ldywKKyAgICAgICAgICAgICAgICAgICAgIiwgJXMgPSAlcyIsCisgICAgICAgICAgICAgICAg ICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEwsIHJlc25hbWUpLAorICAgICAgICAg ICAgICAgICAgICBnZXRfb3BlcmF0aW9uX3N0cmluZyhJVk1fQURELCByZXNuYW1lLCAibXYiLCAi ZGlmZiIsIGNvdW50X2NvbCwgTlVMTCkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAg ICAgIAorCQkJCS8qIGNvdW50ID0gbXYuY291bnQgKyBkaWZmLmNvdW50ICovCisgICAgICAgICAg ICAgICAgYXBwZW5kU3RyaW5nSW5mbyhidWZfbmV3LAorICAgICAgICAgICAgICAgICAgICAiLCAl cyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIo TlVMTCwgY291bnRfY29sKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0X29wZXJhdGlvbl9zdHJp bmcoSVZNX0FERCwgY291bnRfY29sLCAibXYiLCAiZGlmZiIsIE5VTEwsIE5VTEwpCisgICAgICAg ICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXBwZW5kU3RyaW5nSW5m byhhZ2dzX2xpc3QsICIsICVzLCAlcyIsCisgICAgICAgICAgICAgICAgcXVvdGVfcXVhbGlmaWVk X2lkZW50aWZpZXIoImRpZmYiLCByZXNuYW1lKSwKKyAgICAgICAgICAgICAgICBxdW90ZV9xdWFs aWZpZWRfaWRlbnRpZmllcigiZGlmZiIsIElWTV9jb2xuYW1lKCJjb3VudCIsIHJlc25hbWUpKSk7 CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElWTV9BVkc6CisgICAgICAgICAg ICBpZiAoYnVmX29sZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBhdmcgPSAo bXYuc3VtIC0gdC5zdW0pOjphZ2d0eXBlIC8gKG12LmNvdW50IC0gdC5jb3VudCkgKi8KKyAgICAg ICAgICAgICAgICBhcHBlbmRTdHJpbmdJbmZvKGJ1Zl9vbGQsCisgICAgICAgICAgICAgICAgICAg ICIsICVzID0gJXMgT1BFUkFUT1IocGdfY2F0YWxvZy4vKSAlcyIsCisgICAgICAgICAgICAgICAg ICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEwsIHJlc25hbWUpLAorICAgICAgICAg ICAgICAgICAgICBnZXRfb3BlcmF0aW9uX3N0cmluZyhJVk1fU1VCLCBzdW1fY29sLCAibXYiLCAi dCIsIGNvdW50X2NvbCwgYWdndHlwZSksCisgICAgICAgICAgICAgICAgICAgIGdldF9vcGVyYXRp b25fc3RyaW5nKElWTV9TVUIsIGNvdW50X2NvbCwgIm12IiwgInQiLCBOVUxMLCBOVUxMKQorICAg ICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgCisJCQkJLyogc3VtID0gbXYuc3VtIC0g dC5zdW0gKi8KKyAgICAgICAgICAgICAgICBhcHBlbmRTdHJpbmdJbmZvKGJ1Zl9vbGQsCisgICAg ICAgICAgICAgICAgICAgICIsICVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICBxdW90ZV9x dWFsaWZpZWRfaWRlbnRpZmllcihOVUxMLCBzdW1fY29sKSwKKyAgICAgICAgICAgICAgICAgICAg Z2V0X29wZXJhdGlvbl9zdHJpbmcoSVZNX1NVQiwgc3VtX2NvbCwgIm12IiwgInQiLCBjb3VudF9j b2wsIE5VTEwpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAKKwkJCQkvKiBj b3VudCA9IG12LmNvdW50IC0gdC5jb3VudCAqLworICAgICAgICAgICAgICAgIGFwcGVuZFN0cmlu Z0luZm8oYnVmX29sZCwKKyAgICAgICAgICAgICAgICAgICAgIiwgJXMgPSAlcyIsCisgICAgICAg ICAgICAgICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEwsIGNvdW50X2NvbCks CisgICAgICAgICAgICAgICAgICAgIGdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9TVUIsIGNvdW50 X2NvbCwgIm12IiwgInQiLCBOVUxMLCBOVUxMKQorICAgICAgICAgICAgICAgICk7CisgICAgICAg ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChidWZfbmV3KQorICAgICAgICAg ICAgeworICAgICAgICAgICAgICAgIC8qIGF2ZyA9IChtdi5zdW0gKyBkaWZmLnN1bSk6OmFnZ3R5 cGUgLyAobXYuY291bnQgKyBkaWZmLmNvdW50KSAqLworICAgICAgICAgICAgICAgIGFwcGVuZFN0 cmluZ0luZm8oYnVmX25ldywKKyAgICAgICAgICAgICAgICAgICAgIiwgJXMgPSAlcyBPUEVSQVRP UihwZ19jYXRhbG9nLi8pICVzIiwKKyAgICAgICAgICAgICAgICAgICAgcXVvdGVfcXVhbGlmaWVk X2lkZW50aWZpZXIoTlVMTCwgcmVzbmFtZSksCisgICAgICAgICAgICAgICAgICAgIGdldF9vcGVy YXRpb25fc3RyaW5nKElWTV9BREQsIHN1bV9jb2wsICJtdiIsICJkaWZmIiwgY291bnRfY29sLCBh Z2d0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0X29wZXJhdGlvbl9zdHJpbmcoSVZNX0FE RCwgY291bnRfY29sLCAibXYiLCAiZGlmZiIsIE5VTEwsIE5VTEwpCisgICAgICAgICAgICAgICAg KTsKKyAgICAgICAgICAgICAgICAvKiBzdW0gPSBtdi5zdW0gKyBkaWZmLnN1bSAqLworICAgICAg ICAgICAgICAgIGFwcGVuZFN0cmluZ0luZm8oYnVmX25ldywKKyAgICAgICAgICAgICAgICAgICAg IiwgJXMgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlm aWVyKE5VTEwsIHN1bV9jb2wpLAorICAgICAgICAgICAgICAgICAgICBnZXRfb3BlcmF0aW9uX3N0 cmluZyhJVk1fQURELCBzdW1fY29sLCAibXYiLCAiZGlmZiIsIGNvdW50X2NvbCwgTlVMTCkKKyAg ICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIC8qIGNvdW50ID0gbXYuY291bnQgKyBk aWZmLmNvdW50ICovCisgICAgICAgICAgICAgICAgYXBwZW5kU3RyaW5nSW5mbyhidWZfbmV3LAor ICAgICAgICAgICAgICAgICAgICAiLCAlcyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgcXVv dGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoTlVMTCwgY291bnRfY29sKSwKKyAgICAgICAgICAgICAg ICAgICAgZ2V0X29wZXJhdGlvbl9zdHJpbmcoSVZNX0FERCwgY291bnRfY29sLCAibXYiLCAiZGlm ZiIsIE5VTEwsIE5VTEwpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworCQkJ YXBwZW5kU3RyaW5nSW5mbyhhZ2dzX2xpc3QsICIsICVzLCAlcywgJXMiLAorCQkJCXF1b3RlX3F1 YWxpZmllZF9pZGVudGlmaWVyKCJkaWZmIiwgcmVzbmFtZSksCisJCQkJcXVvdGVfcXVhbGlmaWVk X2lkZW50aWZpZXIoImRpZmYiLCBJVk1fY29sbmFtZSgic3VtIiwgcmVzbmFtZSkpLAorCQkJCXF1 b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKCJkaWZmIiwgSVZNX2NvbG5hbWUoImNvdW50IiwgcmVz bmFtZSkpKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJVk1fTUlOOgor ICAgICAgICAgICAgaWYgKGJ1Zl9vbGQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg LyoKKyAgICAgICAgICAgICAgICAqIElmIHRoZSBuZXcgdmFsdWUgZG9lc24ndCBiZWNhbWUgTlVM TCB0aGVuIHVzZSB0aGUgdmFsdWUgcmVtYWluaW5nCisgICAgICAgICAgICAgICAgKiBpbiB0aGUg dmlldyBhbHRob3VnaCB0aGlzIHdpbGwgYmUgcmVjb21wdXRhdGVkIGFmdGVyd29yZHMuCisgICAg ICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhcHBlbmRTdHJpbmdJbmZvKGJ1Zl9vbGQs CisgICAgICAgICAgICAgICAgICAgICIsICVzID0gQ0FTRSBXSEVOICVzIFRIRU4gTlVMTCBFTFNF ICVzIEVORCIsCisgICAgICAgICAgICAgICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVy KE5VTEwsIHJlc25hbWUpLAorICAgICAgICAgICAgICAgICAgICBnZXRfbnVsbF9jb25kaXRpb25f c3RyaW5nKElWTV9TVUIsICJtdiIsICJ0IiwgY291bnRfY29sKSwKKyAgICAgICAgICAgICAgICAg ICAgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoIm12IiwgcmVzbmFtZSkKKyAgICAgICAgICAg ICAgICApOworICAgICAgICAgICAgICAgIC8qIGNvdW50ID0gbXYuY291bnQgLSB0LmNvdW50ICov CisgICAgICAgICAgICAgICAgYXBwZW5kU3RyaW5nSW5mbyhidWZfb2xkLAorICAgICAgICAgICAg ICAgICAgICAiLCAlcyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgcXVvdGVfcXVhbGlmaWVk X2lkZW50aWZpZXIoTlVMTCwgY291bnRfY29sKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0X29w ZXJhdGlvbl9zdHJpbmcoSVZNX1NVQiwgY291bnRfY29sLCAibXYiLCAidCIsIE5VTEwsIE5VTEwp CisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ1 Zl9uZXcpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8q IG1pbiA9IExFQVNUKG12Lm1pbiwgZGlmZi5taW4pICovICAgICAgICAgCisgICAgICAgICAgICAg ICAgYXBwZW5kU3RyaW5nSW5mbyhidWZfbmV3LAorICAgICAgICAgICAgICAgICAgICAiLCAlcyA9 IENBU0UgV0hFTiAlcyBUSEVOIE5VTEwgRUxTRSAlcyglcywlcykgRU5EIiwKKyAgICAgICAgICAg ICAgICAgICAgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoTlVMTCwgcmVzbmFtZSksCisgICAg ICAgICAgICAgICAgICAgIGdldF9udWxsX2NvbmRpdGlvbl9zdHJpbmcoSVZNX0FERCwgIm12Iiwg ImRpZmYiLCBjb3VudF9jb2wpLAorICAgICAgICAgICAgICAgICAgICAiTEVBU1QiLAorICAgICAg ICAgICAgICAgICAgICBxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcigibXYiLCByZXNuYW1lKSwK KyAgICAgICAgICAgICAgICAgICAgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRpZmYiLCBy ZXNuYW1lKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAvKiBjb3VudCA9 IG12LmNvdW50ICsgZGlmZi5jb3VudCAqLworICAgICAgICAgICAgICAgIGFwcGVuZFN0cmluZ0lu Zm8oYnVmX25ldywKKyAgICAgICAgICAgICAgICAgICAgIiwgJXMgPSAlcyIsCisgICAgICAgICAg ICAgICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEwsIGNvdW50X2NvbCksCisg ICAgICAgICAgICAgICAgICAgIGdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9BREQsIGNvdW50X2Nv bCwgIm12IiwgImRpZmYiLCBOVUxMLCBOVUxMKQorICAgICAgICAgICAgICAgICk7CisgICAgICAg ICAgICB9CisgICAgICAgIAlhcHBlbmRTdHJpbmdJbmZvKGFnZ3NfbGlzdCwgIiwgJXMsICVzIiwK KyAgICAgICAgICAgICAgICBxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcigiZGlmZiIsIHJlc25h bWUpLAorICAgICAgICAgICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKCJkaWZmIiwg SVZNX2NvbG5hbWUoImNvdW50IiwgcmVzbmFtZSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisg ICAgICAgIGNhc2UgSVZNX01BWDoKKyAgICAgICAgICAgIGlmIChidWZfb2xkKQorICAgICAgICAg ICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgKiBJZiB0aGUgbmV3IHZh bHVlIGRvZXNuJ3QgYmVjYW1lIE5VTEwgdGhlbiB1c2UgdGhlIHZhbHVlIHJlbWFpbmluZworICAg ICAgICAgICAgICAgICogaW4gdGhlIHZpZXcgYWx0aG91Z2ggdGhpcyB3aWxsIGJlIHJlY29tcHV0 YXRlZCBhZnRlcndvcmRzLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYXBw ZW5kU3RyaW5nSW5mbyhidWZfb2xkLAorICAgICAgICAgICAgICAgICAgICAiLCAlcyA9IENBU0Ug V0hFTiAlcyBUSEVOIE5VTEwgRUxTRSAlcyBFTkQiLAorICAgICAgICAgICAgICAgICAgICBxdW90 ZV9xdWFsaWZpZWRfaWRlbnRpZmllcihOVUxMLCByZXNuYW1lKSwKKyAgICAgICAgICAgICAgICAg ICAgZ2V0X251bGxfY29uZGl0aW9uX3N0cmluZyhJVk1fU1VCLCAibXYiLCAidCIsIGNvdW50X2Nv bCksCisgICAgICAgICAgICAgICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKCJtdiIs IHJlc25hbWUpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAvKiBjb3VudCA9 IG12LmNvdW50IC0gdC5jb3VudCAqLworICAgICAgICAgICAgICAgIGFwcGVuZFN0cmluZ0luZm8o YnVmX29sZCwKKyAgICAgICAgICAgICAgICAgICAgIiwgJXMgPSAlcyIsCisgICAgICAgICAgICAg ICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEwsIGNvdW50X2NvbCksCisgICAg ICAgICAgICAgICAgICAgIGdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9TVUIsIGNvdW50X2NvbCwg Im12IiwgInQiLCBOVUxMLCBOVUxMKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9 CisKKyAgICAgICAgICAgIGlmIChidWZfbmV3KQorICAgICAgICAgICAgeworICAgICAgICAgICAg ICAgIC8qIG1heCA9IEdSRUFURVNUKG12Lm1heCwgZGlmZi5tYXgpICovCisgICAgICAgICAgICAg ICAgYXBwZW5kU3RyaW5nSW5mbyhidWZfbmV3LAorICAgICAgICAgICAgICAgICAgICAiLCAlcyA9 IENBU0UgV0hFTiAlcyBUSEVOIE5VTEwgRUxTRSAlcyglcywlcykgRU5EIiwKKyAgICAgICAgICAg ICAgICAgICAgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoTlVMTCwgcmVzbmFtZSksCisgICAg ICAgICAgICAgICAgICAgIGdldF9udWxsX2NvbmRpdGlvbl9zdHJpbmcoSVZNX0FERCwgIm12Iiwg ImRpZmYiLCBjb3VudF9jb2wpLAorICAgICAgICAgICAgICAgICAgICAiR1JFQVRFU1QiLAorICAg ICAgICAgICAgICAgICAgICBxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcigibXYiLCByZXNuYW1l KSwKKyAgICAgICAgICAgICAgICAgICAgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRpZmYi LCByZXNuYW1lKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAvKiBjb3Vu dCA9IG12LmNvdW50ICsgZGlmZi5jb3VudCAqLworICAgICAgICAgICAgICAgIGFwcGVuZFN0cmlu Z0luZm8oYnVmX25ldywKKyAgICAgICAgICAgICAgICAgICAgIiwgJXMgPSAlcyIsCisgICAgICAg ICAgICAgICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEwsIGNvdW50X2NvbCks CisgICAgICAgICAgICAgICAgICAgIGdldF9vcGVyYXRpb25fc3RyaW5nKElWTV9BREQsIGNvdW50 X2NvbCwgIm12IiwgImRpZmYiLCBOVUxMLCBOVUxMKQorICAgICAgICAgICAgICAgICk7CisgICAg ICAgICAgICB9CisKKyAgICAgICAgCWFwcGVuZFN0cmluZ0luZm8oYWdnc19saXN0LCAiLCAlcywg JXMiLAorICAgICAgICAgICAgICAgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKCJkaWZmIiwg cmVzbmFtZSksCisgICAgICAgICAgICAgICAgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoImRp ZmYiLCBJVk1fY29sbmFtZSgiY291bnQiLCByZXNuYW1lKSkpOworCQkJYnJlYWs7CisKKwkJY2Fz ZSBCQURfQUdHRlVOQzoKKyAgICAgICAgICAgIGVsb2coRVJST1IsICJ1bnN1cHBvcnRlZCBhZ2dy ZWdhdGUgZnVuY3Rpb246ICVzIiwgYWdnbmFtZSk7CisgICAgICAgICAgICBicmVhazsKKworICAg ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZWxvZyhFUlJPUiwgInVuc3VwcG9ydGVkIGFnZ3Jl Z2F0ZSBmdW5jdGlvbjogJXMiLCBhZ2duYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0K KwlyZXR1cm47Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo= --0000000000008217160604474d24--