Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:38453 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 81308 invoked from network); 20 Jun 2008 11:12:22 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 20 Jun 2008 11:12:22 -0000 Authentication-Results: pb1.pair.com smtp.mail=dmitry@zend.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=dmitry@zend.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 212.25.124.162 as permitted sender) X-PHP-List-Original-Sender: dmitry@zend.com X-Host-Fingerprint: 212.25.124.162 mail.zend.com Windows 2000 SP4, XP SP1 Received: from [212.25.124.162] ([212.25.124.162:59037] helo=mx1.zend.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 30/BB-16112-3909B584 for ; Fri, 20 Jun 2008 07:12:21 -0400 Received: from ws.home ([10.1.1.1]) by mx1.zend.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 20 Jun 2008 14:12:26 +0300 Message-ID: <485B908D.7000106@zend.com> Date: Fri, 20 Jun 2008 15:12:13 +0400 User-Agent: Thunderbird 2.0.0.14 (X11/20080501) MIME-Version: 1.0 To: Christian Seiler CC: php-dev List , Andi Gutmans , Stanislav Malyshev References: <4856A547.3080801@gmx.net> <485A35A0.9050602@zend.com> <485AF253.2070400@gmx.net> In-Reply-To: <485AF253.2070400@gmx.net> X-Enigmail-Version: 0.95.6 Content-Type: multipart/mixed; boundary="------------090607060708070200050105" X-OriginalArrivalTime: 20 Jun 2008 11:12:26.0562 (UTC) FILETIME=[8586CA20:01C8D2C6] Subject: Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP From: dmitry@zend.com (Dmitry Stogov) --------------090607060708070200050105 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi Christian, I'm fine with your suggestion for lexical variables syntax, but I don't know if we really need brackets around them. For now I changed syntax in the following way. $func = function ($x, $y) use $a, $b, $c { } According to segfault, I added a check that emits fatal error. I don't like to use separate HashTable for lexical variables, because - it takes memory (however it won't be used for all regular op_arrays) - it requires new special modifier for FETCH opcode - opcode caches must check for this additional table and copy it My idea with usage of static_variables doesn't require any opcode cache modification at all. I'm fine if you'll improve my patch (It's mainly yours :) Thanks. Dmitry. Christian Seiler wrote: > Hi Dmitry, > > First of all: Your patch does really simplify things internally quite a > bit - I like it. I have a few issues though: > >> The patch shouldn't affect opcode caches and other extensions as it >> doesn't change any structures. > > I don't see a problem in changing structures for either extensions nor > opcode caches - as long as only entries are added. Binary compability > with PHP 5.2 is not provided anyway (by neither 5.3 nor 6) and source > compability is not affected if the old members are not touched or their > semantics change. > >> It uses the op_array->static_variables for lexical variables. > > That's a point I don't like. Although you use IS_CONSTANT to cleverly > mask lexical variables, I really think a separate hash table would be a > far better idea, especially for code maintainability. > >> The patch also fixes several small issues and adds some missing >> functionality which didn't allow preg_replace_callback() (and may be >> others) to work with lambda functions. > > Oh yes, I somehow missed that, thanks! > >> Please review. > > I (personally) have some smaller issues with the patch and one big > issue: > > Smaller issues: > > * A separate hash table for the lexical variables would be much cleaner > in my eyes. > > * The segfault that occurs with my patch still occurs with yours (see > below for an example) > > But the one big issue is the syntax: ($foo | $bar) is just extremely > painful in my eyes. I wouldn't want to use it - and it would be quite > confusing (which side are the normal parameters, which side are the > lexical vars?). I do see your point that the 'lexical' keyword inside > the function body to actually have an effect on the function semantics > is not optimal and that the list of lexical variables is probably better > placed in the function definition. I therefore propose the following > syntax: > > function (parameters) { } // no closure, simply lambda > function (parameters) KEYWORD (lexical) { } // closure with lexical vars > > KEYWORD could be for example 'use'. That probably describes best what > the function does: Use/import those variables from the current scope. > Example: > > return function ($x) use ($s) { > static $n = 0; > $n++; > $s = $n.':'.$s; > $this->foo($x[0].':'.$s); > }; > > As for simply omitting the keyword, e.g. function () () - as already > suggested: I don't like that syntax either. Although I'm not a fan of > too much language verbosity (that's why I don't like Fortran, Basic and > Pascal), I think in this case, a little more verbosity wouldn't hurt - > and typing 'use' is just 3 additional characters. > > Now for the examples for the smaller issues: > > Segfault: > > > $a = function () { > $GLOBALS['a'] = NULL; > echo "destroyed closure\n"; > }; > > var_dump ($a); > $a (); > ?> > > This crashes - due to the fact that the currently used op_array is > destroyed upon destruction of the variable. This could get even more > interesting if the closure called itself recursively. My proposal is to > create a copy (but not a reference, just do a normal copy, for resources > or objects that will just do the trick) of the variable internally in > zend_call_function and zend_do_fcall_common_helper into a dummy zval and > destroy that zval after the function call ended. That way, the GC won't > kick in until after the execution of the closure. In zend_call_function > that's easy - in zend_do_fcall_common helper we have the problem that > the variable containing the closure is no longer available. An idea > could be that the INIT_FCALL functions always additionally push the > lambda zval to the argument stack (inside the function it will be > ignored) and the fcall_common_helper will remove that zval from the > stack prior to returning (and free it). If a non-closure is called, NULL > (or an empty zval or whatever) could be pushed to the stack instead. > Hmm, perhap's I'll have a better idea tomorrow. > > Anyway, since Andi suggested to use objects instead of resources, I'd > like to use your patch as a starting point, if there are no objections. > > Regards, > Christian --------------090607060708070200050105 Content-Type: text/plain; name="lambda.diff.txt" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="lambda.diff.txt" SW5kZXg6IFplbmQvemVuZF9BUEkuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcmVwb3Np dG9yeS9aZW5kRW5naW5lMi96ZW5kX0FQSS5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjI5 Ni4yLjI3LjIuMzQuMi4zOApkaWZmIC11IC1wIC1kIC1yMS4yOTYuMi4yNy4yLjM0LjIuMzgg emVuZF9BUEkuYwotLS0gWmVuZC96ZW5kX0FQSS5jCTUgSnVuIDIwMDggMTg6NTM6MDYgLTAw MDAJMS4yOTYuMi4yNy4yLjM0LjIuMzgKKysrIFplbmQvemVuZF9BUEkuYwkyMCBKdW4gMjAw OCAxMDo1NzowOSAtMDAwMApAQCAtMjYxNSw2ICsyNjE1LDI4IEBAIFpFTkRfQVBJIHplbmRf Ym9vbCB6ZW5kX2lzX2NhbGxhYmxlX2V4KHoKIAkJCX0KIAkJCXJldHVybiAwOwogCisJCWNh c2UgSVNfUkVTT1VSQ0U6CisJCQl7CisJCQkJemVuZF9jbG9zdXJlICpjbG9zdXJlID0gKHpl bmRfY2xvc3VyZSopIHplbmRfZmV0Y2hfcmVzb3VyY2UoJmNhbGxhYmxlIFRTUk1MU19DQywg LTEsIE5VTEwsIE5VTEwsIDEsIGxlX2xhbWJkYV9mdW5jKTsKKworCQkJCWlmIChjbG9zdXJl KSB7CisJCQkJCSpmcHRyX3B0ciA9ICh6ZW5kX2Z1bmN0aW9uKikmY2xvc3VyZS0+b3BfYXJy YXk7CisJCQkJCWlmIChjbG9zdXJlLT5UaGlzKSB7CisJCQkJCQkqem9ial9wdHJfcHRyID0g JmNsb3N1cmUtPlRoaXM7CisJCQkJCQkqY2VfcHRyID0gWl9PQkpDRV9QKGNsb3N1cmUtPlRo aXMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJKnpvYmpfcHRyX3B0ciA9IE5VTEw7CisJCQkJ CQkqY2VfcHRyID0gY2xvc3VyZS0+b3BfYXJyYXkuc2NvcGU7CisJCQkJCX0KKwkJCQkJaWYg KGNhbGxhYmxlX25hbWUpIHsKKwkJCQkJCSpjYWxsYWJsZV9uYW1lX2xlbiA9IHN0cmxlbihj bG9zdXJlLT5vcF9hcnJheS5mdW5jdGlvbl9uYW1lKTsKKwkJCQkJCSpjYWxsYWJsZV9uYW1l ID0gZXN0cm5kdXAoY2xvc3VyZS0+b3BfYXJyYXkuZnVuY3Rpb25fbmFtZSwgKmNhbGxhYmxl X25hbWVfbGVuKTsKKwkJCQkJfQkJCQkJCQkJCQorCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJ CQl9CisJCQkvKiBicmVhayBtaXNzaW5nIGludGVudGlvbmFsbHkgKi8KKwogCQlkZWZhdWx0 OgogCQkJaWYgKGNhbGxhYmxlX25hbWUpIHsKIAkJCQl6dmFsIGV4cHJfY29weTsKSW5kZXg6 IFplbmQvemVuZF9jb21waWxlLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRv cnkvWmVuZEVuZ2luZTIvemVuZF9jb21waWxlLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEu NjQ3LjIuMjcuMi40MS4yLjY4CmRpZmYgLXUgLXAgLWQgLXIxLjY0Ny4yLjI3LjIuNDEuMi42 OCB6ZW5kX2NvbXBpbGUuYwotLS0gWmVuZC96ZW5kX2NvbXBpbGUuYwkxNSBKdW4gMjAwOCAx ODoyNzozNyAtMDAwMAkxLjY0Ny4yLjI3LjIuNDEuMi42OAorKysgWmVuZC96ZW5kX2NvbXBp bGUuYwkyMCBKdW4gMjAwOCAxMDo1NzowOSAtMDAwMApAQCAtMTM3NSw2ICsxMzc1LDI5IEBA IHZvaWQgemVuZF9kb19iZWdpbl9mdW5jdGlvbl9kZWNsYXJhdGlvbigKIAlDRyhsYWJlbHMp ID0gTlVMTDsKIH0KIAordm9pZCB6ZW5kX2RvX2JlZ2luX2xhbWJkYV9mdW5jdGlvbl9kZWNs YXJhdGlvbih6bm9kZSAqcmVzdWx0LCB6bm9kZSAqZnVuY3Rpb25fdG9rZW4sIGludCByZXR1 cm5fcmVmZXJlbmNlIFRTUk1MU19EQykKK3sKKwl6bm9kZSAgICAgICAgICBmdW5jdGlvbl9u YW1lOworCXplbmRfb3BfYXJyYXkgKmN1cnJlbnRfb3BfYXJyYXkgPSBDRyhhY3RpdmVfb3Bf YXJyYXkpOworCWludCAgICAgICAgICAgIGN1cnJlbnRfb3BfbnVtYmVyID0gZ2V0X25leHRf b3BfbnVtYmVyKENHKGFjdGl2ZV9vcF9hcnJheSkpOworCXplbmRfb3AgICAgICAgKmN1cnJl bnRfb3A7CisKKwlmdW5jdGlvbl9uYW1lLm9wX3R5cGUgPSBJU19DT05TVDsKKwlaVkFMX1NU UklOR0woJmZ1bmN0aW9uX25hbWUudS5jb25zdGFudCwgImxhbWJkYSIsIHNpemVvZigibGFt YmRhIiktMSwgMSk7CisKKwl6ZW5kX2RvX2JlZ2luX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKGZ1 bmN0aW9uX3Rva2VuLCAmZnVuY3Rpb25fbmFtZSwgMCwgcmV0dXJuX3JlZmVyZW5jZSwgTlVM TCBUU1JNTFNfQ0MpOworCisJcmVzdWx0LT5vcF90eXBlID0gSVNfVE1QX1ZBUjsKKwlyZXN1 bHQtPnUudmFyID0gZ2V0X3RlbXBvcmFyeV92YXJpYWJsZShjdXJyZW50X29wX2FycmF5KTs7 CisKKwljdXJyZW50X29wID0gJmN1cnJlbnRfb3BfYXJyYXktPm9wY29kZXNbY3VycmVudF9v cF9udW1iZXJdOworCWN1cnJlbnRfb3AtPm9wY29kZSA9IFpFTkRfREVDTEFSRV9MQU1CREFf RlVOQ1RJT047CisJenZhbF9kdG9yKCZjdXJyZW50X29wLT5vcDIudS5jb25zdGFudCk7CisJ WlZBTF9MT05HKCZjdXJyZW50X29wLT5vcDIudS5jb25zdGFudCwgemVuZF9oYXNoX2Z1bmMo Wl9TVFJWQUwoY3VycmVudF9vcC0+b3AxLnUuY29uc3RhbnQpLCBaX1NUUkxFTihjdXJyZW50 X29wLT5vcDEudS5jb25zdGFudCkpKTsKKwljdXJyZW50X29wLT5yZXN1bHQgPSAqcmVzdWx0 OworfQorCisKIHZvaWQgemVuZF9kb19oYW5kbGVfZXhjZXB0aW9uKFRTUk1MU19EKQogewog CXplbmRfb3AgKm9wbGluZSA9IGdldF9uZXh0X29wKENHKGFjdGl2ZV9vcF9hcnJheSkgVFNS TUxTX0NDKTsKQEAgLTQxNDksNiArNDE3MiwyMSBAQCB2b2lkIHplbmRfZG9fZmV0Y2hfc3Rh dGljX3ZhcmlhYmxlKHpub2RlCiAvKgl6dmFsX2R0b3IoJnZhcm5hbWUtPnUuY29uc3RhbnQp OyAqLwogfQogCit2b2lkIHplbmRfZG9fZmV0Y2hfbGV4aWNhbF92YXJpYWJsZSh6bm9kZSAq dmFybmFtZSBUU1JNTFNfREMpCit7CisJem5vZGUgdmFsdWU7CisKKwkvKiBFbXB0eSBjb25z dGFudCBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgb2YgbGV4aWNhbCB2YXJpYWJsZS4KKwkgKiBJ dCBpcyBzdWJzdGl0dXRlZCBieSByZWFsIHZhbHVlIGluIFpFTkRfREVDTEFSRV9MQU1CREFf RlVOQ1RJT04gKi8KKwl2YWx1ZS5vcF90eXBlID0gSVNfQ09OU1Q7CisJWlZBTF9FTVBUWV9T VFJJTkcoJnZhbHVlLnUuY29uc3RhbnQpOworCVpfVFlQRSh2YWx1ZS51LmNvbnN0YW50KSA9 IElTX0NPTlNUQU5UOworCVpfU0VUX1JFRkNPVU5UX1AoJnZhbHVlLnUuY29uc3RhbnQsIDEp OworCVpfVU5TRVRfSVNSRUZfUCgmdmFsdWUudS5jb25zdGFudCk7CisJCisJemVuZF9kb19m ZXRjaF9zdGF0aWNfdmFyaWFibGUodmFybmFtZSwgJnZhbHVlLCBaRU5EX0ZFVENIX1NUQVRJ QyBUU1JNTFNfQ0MpOworfQorCiB2b2lkIHplbmRfZG9fZmV0Y2hfZ2xvYmFsX3ZhcmlhYmxl KHpub2RlICp2YXJuYW1lLCB6bm9kZSAqc3RhdGljX2Fzc2lnbm1lbnQsIGludCBmZXRjaF90 eXBlIFRTUk1MU19EQykKIHsKIAl6ZW5kX29wICpvcGxpbmU7CkluZGV4OiBaZW5kL3plbmRf Y29tcGlsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9yZXBvc2l0b3J5L1plbmRFbmdp bmUyL3plbmRfY29tcGlsZS5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjMxNi4yLjguMi4x Mi4yLjI1CmRpZmYgLXUgLXAgLWQgLXIxLjMxNi4yLjguMi4xMi4yLjI1IHplbmRfY29tcGls ZS5oCi0tLSBaZW5kL3plbmRfY29tcGlsZS5oCTExIEp1biAyMDA4IDEzOjE4OjM5IC0wMDAw CTEuMzE2LjIuOC4yLjEyLjIuMjUKKysrIFplbmQvemVuZF9jb21waWxlLmgJMjAgSnVuIDIw MDggMTA6NTc6MDkgLTAwMDAKQEAgLTQyOSw2ICs0MjksMTQgQEAgdm9pZCB6ZW5kX2RvX2Vu ZF9mdW5jdGlvbl9jYWxsKHpub2RlICpmdQogdm9pZCB6ZW5kX2RvX3JldHVybih6bm9kZSAq ZXhwciwgaW50IGRvX2VuZF92cGFyc2UgVFNSTUxTX0RDKTsKIHZvaWQgemVuZF9kb19oYW5k bGVfZXhjZXB0aW9uKFRTUk1MU19EKTsKIAordHlwZWRlZiBzdHJ1Y3QgX3plbmRfY2xvc3Vy ZSB7CisJemVuZF9vcF9hcnJheSAgICAgb3BfYXJyYXk7CisJenZhbCAgICAgICAgICAgICAq VGhpczsKK30gemVuZF9jbG9zdXJlOworCit2b2lkIHplbmRfZG9fYmVnaW5fbGFtYmRhX2Z1 bmN0aW9uX2RlY2xhcmF0aW9uKHpub2RlICpyZXN1bHQsIHpub2RlICpmdW5jdGlvbl90b2tl biwgaW50IHJldHVybl9yZWZlcmVuY2UgVFNSTUxTX0RDKTsKK3ZvaWQgemVuZF9kb19mZXRj aF9sZXhpY2FsX3ZhcmlhYmxlKHpub2RlICp2YXJuYW1lIFRTUk1MU19EQyk7CisKIHZvaWQg emVuZF9kb190cnkoem5vZGUgKnRyeV90b2tlbiBUU1JNTFNfREMpOwogdm9pZCB6ZW5kX2Rv X2JlZ2luX2NhdGNoKHpub2RlICp0cnlfdG9rZW4sIHpub2RlICpjYXRjaF9jbGFzcywgem5v ZGUgKmNhdGNoX3Zhciwgem5vZGUgKmZpcnN0X2NhdGNoIFRTUk1MU19EQyk7CiB2b2lkIHpl bmRfZG9fZW5kX2NhdGNoKHpub2RlICp0cnlfdG9rZW4gVFNSTUxTX0RDKTsKSW5kZXg6IFpl bmQvemVuZF9leGVjdXRlLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkv WmVuZEVuZ2luZTIvemVuZF9leGVjdXRlLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNzE2 LjIuMTIuMi4yNC4yLjMwCmRpZmYgLXUgLXAgLWQgLXIxLjcxNi4yLjEyLjIuMjQuMi4zMCB6 ZW5kX2V4ZWN1dGUuYwotLS0gWmVuZC96ZW5kX2V4ZWN1dGUuYwkxMSBKdW4gMjAwOCAxMzox ODozOSAtMDAwMAkxLjcxNi4yLjEyLjIuMjQuMi4zMAorKysgWmVuZC96ZW5kX2V4ZWN1dGUu YwkyMCBKdW4gMjAwOCAxMDo1NzowOSAtMDAwMApAQCAtMTI1OSw2ICsxMjU5LDI3IEBAIHN0 YXRpYyBpbmxpbmUgemVuZF9icmtfY29udF9lbGVtZW50KiB6ZW4KIAlyZXR1cm4gam1wX3Rv OwogfQogCitzdGF0aWMgaW50IHp2YWxfY29weV9zdGF0aWNfdmFyKHp2YWwgKipwLCBpbnQg bnVtX2FyZ3MsIHZhX2xpc3QgYXJncywgemVuZF9oYXNoX2tleSAqa2V5KQoreworCUhhc2hU YWJsZSAqdGFyZ2V0ID0gdmFfYXJnKGFyZ3MsIEhhc2hUYWJsZSopOworCisJaWYgKFpfVFlQ RV9QUChwKSA9PSBJU19DT05TVEFOVCAmJiBaX1NUUkxFTl9QUChwKSA9PSAwKSB7CisJCVRT Uk1MU19GRVRDSCgpOworCisJCWlmICghRUcoYWN0aXZlX3N5bWJvbF90YWJsZSkpIHsKKwkJ CXplbmRfcmVidWlsZF9zeW1ib2xfdGFibGUoVFNSTUxTX0MpOworCQl9CisJCWlmICh6ZW5k X2hhc2hfcXVpY2tfZmluZChFRyhhY3RpdmVfc3ltYm9sX3RhYmxlKSwga2V5LT5hcktleSwg a2V5LT5uS2V5TGVuZ3RoLCBrZXktPmgsICh2b2lkICoqKSAmcCkgPT0gRkFJTFVSRSkgewor CQkJcmV0dXJuIFpFTkRfSEFTSF9BUFBMWV9LRUVQOworCQl9CisJCVNFUEFSQVRFX1pWQUxf VE9fTUFLRV9JU19SRUYocCk7CisJfQorCWlmICh6ZW5kX2hhc2hfcXVpY2tfYWRkKHRhcmdl dCwga2V5LT5hcktleSwga2V5LT5uS2V5TGVuZ3RoLCBrZXktPmgsIHAsIHNpemVvZih6dmFs KiksIE5VTEwpID09IFNVQ0NFU1MpIHsKKwkJWl9BRERSRUZfUFAocCk7CisJfQorCXJldHVy biBaRU5EX0hBU0hfQVBQTFlfS0VFUDsKK30KKwogI2lmIFpFTkRfSU5URU5TSVZFX0RFQlVH R0lORwogCiAjZGVmaW5lIENIRUNLX1NZTUJPTF9UQUJMRVMoKQkJCQkJCQkJCQkJCQkJXApJ bmRleDogWmVuZC96ZW5kX2V4ZWN1dGVfQVBJLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTog L3JlcG9zaXRvcnkvWmVuZEVuZ2luZTIvemVuZF9leGVjdXRlX0FQSS5jLHYKcmV0cmlldmlu ZyByZXZpc2lvbiAxLjMzMS4yLjIwLjIuMjQuMi40MgpkaWZmIC11IC1wIC1kIC1yMS4zMzEu Mi4yMC4yLjI0LjIuNDIgemVuZF9leGVjdXRlX0FQSS5jCi0tLSBaZW5kL3plbmRfZXhlY3V0 ZV9BUEkuYwk1IEp1biAyMDA4IDE4OjUwOjI5IC0wMDAwCTEuMzMxLjIuMjAuMi4yNC4yLjQy CisrKyBaZW5kL3plbmRfZXhlY3V0ZV9BUEkuYwkyMCBKdW4gMjAwOCAxMDo1NzowOSAtMDAw MApAQCAtNzM5LDYgKzczOSwyMSBAQCBpbnQgemVuZF9jYWxsX2Z1bmN0aW9uKHplbmRfZmNh bGxfaW5mbyAqCiAJCQlTRVBBUkFURV9aVkFMX0lGX05PVF9SRUYodG1wX29iamVjdF9wdHIp OwogCQkJZmNpLT5vYmplY3RfcHAgPSB0bXBfb2JqZWN0X3B0cjsKIAkJCVpfU0VUX0lTUkVG X1BQKGZjaS0+b2JqZWN0X3BwKTsKKwkJfSBlbHNlIGlmIChaX1RZUEVfUChmY2ktPmZ1bmN0 aW9uX25hbWUpID09IElTX1JFU09VUkNFKSB7CisJCQl6ZW5kX2Nsb3N1cmUgKmNsb3N1cmUg PSAoemVuZF9jbG9zdXJlKikgemVuZF9mZXRjaF9yZXNvdXJjZSgmZmNpLT5mdW5jdGlvbl9u YW1lIFRTUk1MU19DQywgLTEsIE5VTEwsIE5VTEwsIDEsIGxlX2xhbWJkYV9mdW5jKTsKKwor CQkJaWYgKCFjbG9zdXJlKSB7CisJCQkJcmV0dXJuIEZBSUxVUkU7CisJCQl9CisJCQlFWChm dW5jdGlvbl9zdGF0ZSkuZnVuY3Rpb24gPSAoemVuZF9mdW5jdGlvbiopJmNsb3N1cmUtPm9w X2FycmF5OworCQkJaWYgKGNsb3N1cmUtPlRoaXMpIHsKKwkJCQlmY2ktPm9iamVjdF9wcCA9 ICZjbG9zdXJlLT5UaGlzOworCQkJCWNhbGxpbmdfc2NvcGUgPSBaX09CSkNFX1AoY2xvc3Vy ZS0+VGhpcyk7CisJCQl9IGVsc2UgeworCQkJCWZjaS0+b2JqZWN0X3BwID0gTlVMTDsKKwkJ CQljYWxsaW5nX3Njb3BlID0gY2xvc3VyZS0+b3BfYXJyYXkuc2NvcGU7CisJCQl9CisJCQln b3RvIGluaXRfZmNpX2NhY2hlOwogCQl9CiAKIAkJaWYgKGZjaS0+b2JqZWN0X3BwICYmICEq ZmNpLT5vYmplY3RfcHApIHsKQEAgLTkzNSw2ICs5NTAsOCBAQCBpbnQgemVuZF9jYWxsX2Z1 bmN0aW9uKHplbmRfZmNhbGxfaW5mbyAqCiAJCQkJcmV0dXJuIEZBSUxVUkU7CiAJCQl9CiAJ CX0KKworaW5pdF9mY2lfY2FjaGU6CiAJCWlmIChmY2lfY2FjaGUgJiYKIAkJCShFWChmdW5j dGlvbl9zdGF0ZSkuZnVuY3Rpb24tPnR5cGUgIT0gWkVORF9JTlRFUk5BTF9GVU5DVElPTiB8 fAogCQkJKCh6ZW5kX2ludGVybmFsX2Z1bmN0aW9uKilFWChmdW5jdGlvbl9zdGF0ZSkuZnVu Y3Rpb24pLT5oYW5kbGVyICE9IHplbmRfc3RkX2NhbGxfdXNlcl9jYWxsKQpJbmRleDogWmVu ZC96ZW5kX2xhbmd1YWdlX3BhcnNlci55Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9yZXBv c2l0b3J5L1plbmRFbmdpbmUyL3plbmRfbGFuZ3VhZ2VfcGFyc2VyLnksdgpyZXRyaWV2aW5n IHJldmlzaW9uIDEuMTYwLjIuNC4yLjguMi4yMQpkaWZmIC11IC1wIC1kIC1yMS4xNjAuMi40 LjIuOC4yLjIxIHplbmRfbGFuZ3VhZ2VfcGFyc2VyLnkKLS0tIFplbmQvemVuZF9sYW5ndWFn ZV9wYXJzZXIueQk4IEp1biAyMDA4IDA5OjM4OjQ3IC0wMDAwCTEuMTYwLjIuNC4yLjguMi4y MQorKysgWmVuZC96ZW5kX2xhbmd1YWdlX3BhcnNlci55CTIwIEp1biAyMDA4IDEwOjU3OjA5 IC0wMDAwCkBAIC0zMDIsNyArMzAyLDcgQEAgaXNfcmVmZXJlbmNlOgogCiAKIHVudGlja2Vk X2Z1bmN0aW9uX2RlY2xhcmF0aW9uX3N0YXRlbWVudDoKLQkJVF9GVU5DVElPTiB7ICQxLnUu b3BsaW5lX251bSA9IENHKHplbmRfbGluZW5vKTsgfSBpc19yZWZlcmVuY2UgVF9TVFJJTkcg eyB6ZW5kX2RvX2JlZ2luX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKCYkMSwgJiQ0LCAwLCAkMy5v cF90eXBlLCBOVUxMIFRTUk1MU19DQyk7IH0KKwkJZnVuY3Rpb24gaXNfcmVmZXJlbmNlIFRf U1RSSU5HIHsgemVuZF9kb19iZWdpbl9mdW5jdGlvbl9kZWNsYXJhdGlvbigmJDEsICYkMywg MCwgJDIub3BfdHlwZSwgTlVMTCBUU1JNTFNfQ0MpOyB9CiAJCQknKCcgcGFyYW1ldGVyX2xp c3QgJyknICd7JyBpbm5lcl9zdGF0ZW1lbnRfbGlzdCAnfScgeyB6ZW5kX2RvX2VuZF9mdW5j dGlvbl9kZWNsYXJhdGlvbigmJDEgVFNSTUxTX0NDKTsgfQogOwogCkBAIC01MTAsOCArNTEw LDggQEAgY2xhc3Nfc3RhdGVtZW50X2xpc3Q6CiBjbGFzc19zdGF0ZW1lbnQ6CiAJCXZhcmlh YmxlX21vZGlmaWVycyB7IENHKGFjY2Vzc190eXBlKSA9IFpfTFZBTCgkMS51LmNvbnN0YW50 KTsgfSBjbGFzc192YXJpYWJsZV9kZWNsYXJhdGlvbiAnOycKIAl8CWNsYXNzX2NvbnN0YW50 X2RlY2xhcmF0aW9uICc7JwotCXwJbWV0aG9kX21vZGlmaWVycyBUX0ZVTkNUSU9OIHsgJDIu dS5vcGxpbmVfbnVtID0gQ0coemVuZF9saW5lbm8pOyB9IGlzX3JlZmVyZW5jZSBUX1NUUklO RyB7IHplbmRfZG9fYmVnaW5fZnVuY3Rpb25fZGVjbGFyYXRpb24oJiQyLCAmJDUsIDEsICQ0 Lm9wX3R5cGUsICYkMSBUU1JNTFNfQ0MpOyB9ICcoJwotCQkJcGFyYW1ldGVyX2xpc3QgJykn IG1ldGhvZF9ib2R5IHsgemVuZF9kb19hYnN0cmFjdF9tZXRob2QoJiQ1LCAmJDEsICYkMTAg VFNSTUxTX0NDKTsgemVuZF9kb19lbmRfZnVuY3Rpb25fZGVjbGFyYXRpb24oJiQyIFRTUk1M U19DQyk7IH0KKwl8CW1ldGhvZF9tb2RpZmllcnMgZnVuY3Rpb24gaXNfcmVmZXJlbmNlIFRf U1RSSU5HIHsgemVuZF9kb19iZWdpbl9mdW5jdGlvbl9kZWNsYXJhdGlvbigmJDIsICYkNCwg MSwgJDMub3BfdHlwZSwgJiQxIFRTUk1MU19DQyk7IH0gJygnCisJCQlwYXJhbWV0ZXJfbGlz dCAnKScgbWV0aG9kX2JvZHkgeyB6ZW5kX2RvX2Fic3RyYWN0X21ldGhvZCgmJDQsICYkMSwg JiQ5IFRTUk1MU19DQyk7IHplbmRfZG9fZW5kX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKCYkMiBU U1JNTFNfQ0MpOyB9CiA7CiAKIApAQCAtNjQzLDYgKzY0MywyMiBAQCBleHByX3dpdGhvdXRf dmFyaWFibGU6CiAJfAlUX0FSUkFZICcoJyBhcnJheV9wYWlyX2xpc3QgJyknIHsgJCQgPSAk MzsgfQogCXwJJ2AnIGVuY2Fwc19saXN0ICdgJyB7IHplbmRfZG9fc2hlbGxfZXhlYygmJCQs ICYkMiBUU1JNTFNfQ0MpOyB9CiAJfAlUX1BSSU5UIGV4cHIgIHsgemVuZF9kb19wcmludCgm JCQsICYkMiBUU1JNTFNfQ0MpOyB9CisJfAlmdW5jdGlvbiBpc19yZWZlcmVuY2UgJygnIHsg emVuZF9kb19iZWdpbl9sYW1iZGFfZnVuY3Rpb25fZGVjbGFyYXRpb24oJiQkLCAmJDEsICQy Lm9wX3R5cGUgVFNSTUxTX0NDKTsgfQorCQkJcGFyYW1ldGVyX2xpc3QgJyknIGxleGljYWxf dmFycyAneycgaW5uZXJfc3RhdGVtZW50X2xpc3QgJ30nIHsgIHplbmRfZG9fZW5kX2Z1bmN0 aW9uX2RlY2xhcmF0aW9uKCYkMSBUU1JNTFNfQ0MpOyAkJCA9ICQ0OyB9Cis7CisKK2Z1bmN0 aW9uOgorCVRfRlVOQ1RJT04geyAkJC51Lm9wbGluZV9udW0gPSBDRyh6ZW5kX2xpbmVubyk7 IH0KKzsKKworbGV4aWNhbF92YXJzOgorCQkvKiBlbXB0cnkgKi8KKwl8CVRfVVNFIGxleGlj YWxfdmFyX2xpc3QKKzsKKworbGV4aWNhbF92YXJfbGlzdDoKKwkJbGV4aWNhbF92YXJfbGlz dCAnLCcgVF9WQVJJQUJMRQkJeyB6ZW5kX2RvX2ZldGNoX2xleGljYWxfdmFyaWFibGUoJiQz IFRTUk1MU19DQyk7IH0KKwl8CVRfVkFSSUFCTEUJCQkJCQkJeyB6ZW5kX2RvX2ZldGNoX2xl eGljYWxfdmFyaWFibGUoJiQxIFRTUk1MU19DQyk7IH0KIDsKIAogZnVuY3Rpb25fY2FsbDoK SW5kZXg6IFplbmQvemVuZF9saXN0LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9z aXRvcnkvWmVuZEVuZ2luZTIvemVuZF9saXN0LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEu NjYuMi4xLjIuMS4yLjEKZGlmZiAtdSAtcCAtZCAtcjEuNjYuMi4xLjIuMS4yLjEgemVuZF9s aXN0LmMKLS0tIFplbmQvemVuZF9saXN0LmMJMzEgRGVjIDIwMDcgMDc6MTc6MDQgLTAwMDAJ MS42Ni4yLjEuMi4xLjIuMQorKysgWmVuZC96ZW5kX2xpc3QuYwkyMCBKdW4gMjAwOCAxMDo1 NzowOSAtMDAwMApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgInplbmRfZ2xvYmFscy5o IgogCiBaRU5EX0FQSSBpbnQgbGVfaW5kZXhfcHRyOworWkVORF9BUEkgaW50IGxlX2xhbWJk YV9mdW5jOwogCiAvKiB0cnVlIGdsb2JhbCAqLwogc3RhdGljIEhhc2hUYWJsZSBsaXN0X2Rl c3RydWN0b3JzOwpAQCAtMzMzLDYgKzMzNCwyNiBAQCBaRU5EX0FQSSBpbnQgemVuZF9mZXRj aF9saXN0X2R0b3JfaWQoY2hhCiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIHZvaWQgemVu ZF9sYW1iZGFfZnVuY19yZXNvdXJjZV9kdG9yKHplbmRfcnNyY19saXN0X2VudHJ5ICpyc3Jj IFRTUk1MU19EQykKK3sKKwl6ZW5kX2Nsb3N1cmUgKmNsb3N1cmUgPSAoemVuZF9jbG9zdXJl ICopcnNyYy0+cHRyOworCXplbmRfZXhlY3V0ZV9kYXRhICpleCA9IEVHKGN1cnJlbnRfZXhl Y3V0ZV9kYXRhKTsKKworCXdoaWxlIChleCkgeworCQlpZiAoZXgtPm9wX2FycmF5ID09ICZj bG9zdXJlLT5vcF9hcnJheSkgeworCQkJemVuZF9lcnJvcihFX0VSUk9SLCAiQ2Fubm90IGRl c3Ryb3kgYWN0aXZlIGxhbWJkYSBmdW5jdGlvbiIpOworCQl9CisJCWV4ID0gZXgtPnByZXZf ZXhlY3V0ZV9kYXRhOworCX0KKwlkZXN0cm95X29wX2FycmF5KCZjbG9zdXJlLT5vcF9hcnJh eSBUU1JNTFNfQ0MpOworCWlmIChjbG9zdXJlLT5UaGlzKSB7CisJCXp2YWxfcHRyX2R0b3Io JmNsb3N1cmUtPlRoaXMpOworCX0KKwllZnJlZShjbG9zdXJlKTsKK30KKworCiBpbnQgemVu ZF9pbml0X3JzcmNfbGlzdF9kdG9ycyh2b2lkKQogewogCWludCByZXR2YWw7CkBAIC0zNDAs NiArMzYxLDggQEAgaW50IHplbmRfaW5pdF9yc3JjX2xpc3RfZHRvcnModm9pZCkKIAlyZXR2 YWwgPSB6ZW5kX2hhc2hfaW5pdCgmbGlzdF9kZXN0cnVjdG9ycywgNTAsIE5VTEwsIE5VTEws IDEpOwogCWxpc3RfZGVzdHJ1Y3RvcnMubk5leHRGcmVlRWxlbWVudD0xOwkvKiB3ZSBkb24n dCB3YW50IHJlc291cmNlIHR5cGUgMCAqLwogCisJbGVfbGFtYmRhX2Z1bmMgPSB6ZW5kX3Jl Z2lzdGVyX2xpc3RfZGVzdHJ1Y3RvcnNfZXgoemVuZF9sYW1iZGFfZnVuY19yZXNvdXJjZV9k dG9yLCBOVUxMLCAibGFtYmRhIGZ1bmN0aW9uIiwgMCk7CisKIAlyZXR1cm4gcmV0dmFsOwog fQogCkBAIC0zNjQsNyArMzg3LDYgQEAgY2hhciAqemVuZF9yc3JjX2xpc3RfZ2V0X3JzcmNf dHlwZShpbnQgcgogCQlyZXR1cm4gTlVMTDsKIAl9CiB9Ci0KIC8qCiAgKiBMb2NhbCB2YXJp YWJsZXM6CiAgKiB0YWItd2lkdGg6IDQKSW5kZXg6IFplbmQvemVuZF9saXN0LmgKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvWmVuZEVuZ2luZTIvemVuZF9saXN0Lmgs dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNDguMi4xLjIuMS4yLjEKZGlmZiAtdSAtcCAtZCAt cjEuNDguMi4xLjIuMS4yLjEgemVuZF9saXN0LmgKLS0tIFplbmQvemVuZF9saXN0LmgJMzEg RGVjIDIwMDcgMDc6MTc6MDQgLTAwMDAJMS40OC4yLjEuMi4xLjIuMQorKysgWmVuZC96ZW5k X2xpc3QuaAkyMCBKdW4gMjAwOCAxMDo1NzowOSAtMDAwMApAQCAtODYsNiArODYsNyBAQCBa RU5EX0FQSSBjaGFyICp6ZW5kX3JzcmNfbGlzdF9nZXRfcnNyY190CiBaRU5EX0FQSSBpbnQg emVuZF9mZXRjaF9saXN0X2R0b3JfaWQoY2hhciAqdHlwZV9uYW1lKTsKIAogZXh0ZXJuIFpF TkRfQVBJIGludCBsZV9pbmRleF9wdHI7ICAvKiBsaXN0IGVudHJ5IHR5cGUgZm9yIGluZGV4 IHBvaW50ZXJzICovCitleHRlcm4gWkVORF9BUEkgaW50IGxlX2xhbWJkYV9mdW5jOyAgLyog bGlzdCBlbnRyeSB0eXBlIGZvciBsYW1iZGEgZnVuY3Rpb25zICovCiAKICNkZWZpbmUgWkVO RF9WRVJJRllfUkVTT1VSQ0UocnNyYykJCVwKIAlpZiAoIXJzcmMpIHsJCQkJCQlcCkluZGV4 OiBaZW5kL3plbmRfdm1fZGVmLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRv cnkvWmVuZEVuZ2luZTIvemVuZF92bV9kZWYuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS41 OS4yLjI5LjIuNDguMi41OApkaWZmIC11IC1wIC1kIC1yMS41OS4yLjI5LjIuNDguMi41OCB6 ZW5kX3ZtX2RlZi5oCi0tLSBaZW5kL3plbmRfdm1fZGVmLmgJMTEgSnVuIDIwMDggMTM6MTg6 MzkgLTAwMDAJMS41OS4yLjI5LjIuNDguMi41OAorKysgWmVuZC96ZW5kX3ZtX2RlZi5oCTIw IEp1biAyMDA4IDEwOjU3OjA5IC0wMDAwCkBAIC0yMDI4LDYgKzIwMjgsMjAgQEAgWkVORF9W TV9IQU5ETEVSKDU5LCBaRU5EX0lOSVRfRkNBTExfQllfTgogCQl9CiAJfSBlbHNlIHsKIAkJ ZnVuY3Rpb25fbmFtZSA9IEdFVF9PUDJfWlZBTF9QVFIoQlBfVkFSX1IpOworCQl6ZW5kX2Ns b3N1cmUgKmNsb3N1cmU7CisKKwkJaWYgKFpfVFlQRV9QKGZ1bmN0aW9uX25hbWUpID09IElT X1JFU09VUkNFICYmCisJCSAgICAoY2xvc3VyZSA9ICh6ZW5kX2Nsb3N1cmUqKSB6ZW5kX2Zl dGNoX3Jlc291cmNlICgmZnVuY3Rpb25fbmFtZSBUU1JNTFNfQ0MsIC0xLCBOVUxMLCBOVUxM LCAxLCBsZV9sYW1iZGFfZnVuYykpICE9IE5VTEwpIHsKKwkJCUVYKGZiYykgPSAoemVuZF9m dW5jdGlvbiopJmNsb3N1cmUtPm9wX2FycmF5OworCQkJaWYgKChFWChvYmplY3QpID0gY2xv c3VyZS0+VGhpcykgIT0gTlVMTCkgeworCQkJCVpfQUREUkVGX1AoRVgob2JqZWN0KSk7CisJ CQkJRVgoY2FsbGVkX3Njb3BlKSA9IFpfT0JKQ0VfUChFWChvYmplY3QpKTsKKwkJCX0gZWxz ZSB7CisJCQkJRVgoY2FsbGVkX3Njb3BlKSA9IGNsb3N1cmUtPm9wX2FycmF5LnNjb3BlOwor CQkJfQorCQkJRlJFRV9PUDIoKTsKKwkJCVpFTkRfVk1fTkVYVF9PUENPREUoKTsKKwkJfQog CiAJCWlmIChaX1RZUEVfUChmdW5jdGlvbl9uYW1lKSAhPSBJU19TVFJJTkcpIHsKIAkJCXpl bmRfZXJyb3Jfbm9yZXR1cm4oRV9FUlJPUiwgIkZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0 cmluZyIpOwpAQCAtNDMyNyw0ICs0MzQxLDQyIEBAIFpFTkRfVk1fSEFORExFUigxNDMsIFpF TkRfREVDTEFSRV9DT05TVCwKIAlaRU5EX1ZNX05FWFRfT1BDT0RFKCk7CiB9CiAKK1pFTkRf Vk1fSEFORExFUigxNTMsIFpFTkRfREVDTEFSRV9MQU1CREFfRlVOQ1RJT04sIENPTlNULCBD T05TVCkKK3sKKwl6ZW5kX29wICpvcGxpbmUgPSBFWChvcGxpbmUpOworCXplbmRfb3BfYXJy YXkgKm9wX2FycmF5OworCXplbmRfY2xvc3VyZSAgKmNsb3N1cmU7CisKKwlpZiAoemVuZF9o YXNoX3F1aWNrX2ZpbmQoRUcoZnVuY3Rpb25fdGFibGUpLCBaX1NUUlZBTChvcGxpbmUtPm9w MS51LmNvbnN0YW50KSwgWl9TVFJMRU4ob3BsaW5lLT5vcDEudS5jb25zdGFudCksIFpfTFZB TChvcGxpbmUtPm9wMi51LmNvbnN0YW50KSwgKHZvaWQgKikgJm9wX2FycmF5KSA9PSBGQUlM VVJFIHx8CisJICAgIG9wX2FycmF5LT50eXBlICE9IFpFTkRfVVNFUl9GVU5DVElPTikgewor CQl6ZW5kX2Vycm9yX25vcmV0dXJuKEVfRVJST1IsICJCYXNlIGxhbWJkYSBmdW5jdGlvbiBm b3IgY2xvc3VyZSBub3QgZm91bmQiKTsKKwl9CisJCisJY2xvc3VyZSA9IGVtYWxsb2Moc2l6 ZW9mKHplbmRfY2xvc3VyZSkpOworCWNsb3N1cmUtPm9wX2FycmF5ID0gKm9wX2FycmF5Owor CisJaWYgKGNsb3N1cmUtPm9wX2FycmF5LnN0YXRpY192YXJpYWJsZXMpIHsKKwkJSGFzaFRh YmxlICpzdGF0aWNfdmFyaWFibGVzID0gY2xvc3VyZS0+b3BfYXJyYXkuc3RhdGljX3Zhcmlh YmxlczsKKwkKKwkJQUxMT0NfSEFTSFRBQkxFKGNsb3N1cmUtPm9wX2FycmF5LnN0YXRpY192 YXJpYWJsZXMpOworCQl6ZW5kX2hhc2hfaW5pdChjbG9zdXJlLT5vcF9hcnJheS5zdGF0aWNf dmFyaWFibGVzLCB6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKHN0YXRpY192YXJpYWJsZXMpLCBO VUxMLCBaVkFMX1BUUl9EVE9SLCAwKTsKKwkJemVuZF9oYXNoX2FwcGx5X3dpdGhfYXJndW1l bnRzKHN0YXRpY192YXJpYWJsZXMsIChhcHBseV9mdW5jX2FyZ3NfdCl6dmFsX2NvcHlfc3Rh dGljX3ZhciwgMSwgY2xvc3VyZS0+b3BfYXJyYXkuc3RhdGljX3ZhcmlhYmxlcyk7CisJfQor CisJaWYgKChjbG9zdXJlLT5vcF9hcnJheS5zY29wZSA9IEVHKHNjb3BlKSkgIT0gTlVMTCkg eworCQljbG9zdXJlLT5vcF9hcnJheS5mbl9mbGFncyB8PSBaRU5EX0FDQ19QVUJMSUM7CisJ CWlmICgoY2xvc3VyZS0+VGhpcyA9IEVHKFRoaXMpKSAhPSBOVUxMKSB7CisJCQlaX0FERFJF Rl9QKGNsb3N1cmUtPlRoaXMpOworCQl9IGVsc2UgeworCQkJY2xvc3VyZS0+b3BfYXJyYXku Zm5fZmxhZ3MgfD0gWkVORF9BQ0NfU1RBVElDOworCQl9CisJfSBlbHNlIHsKKwkJY2xvc3Vy ZS0+VGhpcyA9IE5VTEw7CisJfQorCSgqY2xvc3VyZS0+b3BfYXJyYXkucmVmY291bnQpKys7 CisKKwlaRU5EX1JFR0lTVEVSX1JFU09VUkNFKCZFWF9UKG9wbGluZS0+cmVzdWx0LnUudmFy KS50bXBfdmFyLCBjbG9zdXJlLCBsZV9sYW1iZGFfZnVuYyk7CisJWkVORF9WTV9ORVhUX09Q Q09ERSgpOworfQorCiBaRU5EX1ZNX0VYUE9SVF9IRUxQRVIoemVuZF9kb19mY2FsbCwgemVu ZF9kb19mY2FsbF9jb21tb25faGVscGVyKQpJbmRleDogWmVuZC96ZW5kX3ZtX2V4ZWN1dGUu aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcmVwb3NpdG9yeS9aZW5kRW5naW5lMi96ZW5k X3ZtX2V4ZWN1dGUuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS42Mi4yLjMwLjIuNDkuMi41 OApkaWZmIC11IC1wIC1kIC1yMS42Mi4yLjMwLjIuNDkuMi41OCB6ZW5kX3ZtX2V4ZWN1dGUu aAotLS0gWmVuZC96ZW5kX3ZtX2V4ZWN1dGUuaAkxMSBKdW4gMjAwOCAxMzoxODozOSAtMDAw MAkxLjYyLjIuMzAuMi40OS4yLjU4CisrKyBaZW5kL3plbmRfdm1fZXhlY3V0ZS5oCTIwIEp1 biAyMDA4IDEwOjU3OjExIC0wMDAwCkBAIC03NDYsNiArNzQ2LDIwIEBAIHN0YXRpYyBpbnQg WkVORF9GQVNUQ0FMTCAgWkVORF9JTklUX0ZDQUwKIAkJfQogCX0gZWxzZSB7CiAJCWZ1bmN0 aW9uX25hbWUgPSAmb3BsaW5lLT5vcDIudS5jb25zdGFudDsKKwkJemVuZF9jbG9zdXJlICpj bG9zdXJlOworCisJCWlmIChaX1RZUEVfUChmdW5jdGlvbl9uYW1lKSA9PSBJU19SRVNPVVJD RSAmJgorCQkgICAgKGNsb3N1cmUgPSAoemVuZF9jbG9zdXJlKikgemVuZF9mZXRjaF9yZXNv dXJjZSAoJmZ1bmN0aW9uX25hbWUgVFNSTUxTX0NDLCAtMSwgTlVMTCwgTlVMTCwgMSwgbGVf bGFtYmRhX2Z1bmMpKSAhPSBOVUxMKSB7CisJCQlFWChmYmMpID0gKHplbmRfZnVuY3Rpb24q KSZjbG9zdXJlLT5vcF9hcnJheTsKKwkJCWlmICgoRVgob2JqZWN0KSA9IGNsb3N1cmUtPlRo aXMpICE9IE5VTEwpIHsKKwkJCQlaX0FERFJFRl9QKEVYKG9iamVjdCkpOworCQkJCUVYKGNh bGxlZF9zY29wZSkgPSBaX09CSkNFX1AoRVgob2JqZWN0KSk7CisJCQl9IGVsc2UgeworCQkJ CUVYKGNhbGxlZF9zY29wZSkgPSBjbG9zdXJlLT5vcF9hcnJheS5zY29wZTsKKwkJCX0KKwor CQkJWkVORF9WTV9ORVhUX09QQ09ERSgpOworCQl9CiAKIAkJaWYgKFpfVFlQRV9QKGZ1bmN0 aW9uX25hbWUpICE9IElTX1NUUklORykgewogCQkJemVuZF9lcnJvcl9ub3JldHVybihFX0VS Uk9SLCAiRnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7CkBAIC05MzQsNiArOTQ4 LDIwIEBAIHN0YXRpYyBpbnQgWkVORF9GQVNUQ0FMTCAgWkVORF9JTklUX0ZDQUwKIAkJfQog CX0gZWxzZSB7CiAJCWZ1bmN0aW9uX25hbWUgPSBfZ2V0X3p2YWxfcHRyX3RtcCgmb3BsaW5l LT5vcDIsIEVYKFRzKSwgJmZyZWVfb3AyIFRTUk1MU19DQyk7CisJCXplbmRfY2xvc3VyZSAq Y2xvc3VyZTsKKworCQlpZiAoWl9UWVBFX1AoZnVuY3Rpb25fbmFtZSkgPT0gSVNfUkVTT1VS Q0UgJiYKKwkJICAgIChjbG9zdXJlID0gKHplbmRfY2xvc3VyZSopIHplbmRfZmV0Y2hfcmVz b3VyY2UgKCZmdW5jdGlvbl9uYW1lIFRTUk1MU19DQywgLTEsIE5VTEwsIE5VTEwsIDEsIGxl X2xhbWJkYV9mdW5jKSkgIT0gTlVMTCkgeworCQkJRVgoZmJjKSA9ICh6ZW5kX2Z1bmN0aW9u KikmY2xvc3VyZS0+b3BfYXJyYXk7CisJCQlpZiAoKEVYKG9iamVjdCkgPSBjbG9zdXJlLT5U aGlzKSAhPSBOVUxMKSB7CisJCQkJWl9BRERSRUZfUChFWChvYmplY3QpKTsKKwkJCQlFWChj YWxsZWRfc2NvcGUpID0gWl9PQkpDRV9QKEVYKG9iamVjdCkpOworCQkJfSBlbHNlIHsKKwkJ CQlFWChjYWxsZWRfc2NvcGUpID0gY2xvc3VyZS0+b3BfYXJyYXkuc2NvcGU7CisJCQl9CisJ CQl6dmFsX2R0b3IoZnJlZV9vcDIudmFyKTsKKwkJCVpFTkRfVk1fTkVYVF9PUENPREUoKTsK KwkJfQogCiAJCWlmIChaX1RZUEVfUChmdW5jdGlvbl9uYW1lKSAhPSBJU19TVFJJTkcpIHsK IAkJCXplbmRfZXJyb3Jfbm9yZXR1cm4oRV9FUlJPUiwgIkZ1bmN0aW9uIG5hbWUgbXVzdCBi ZSBhIHN0cmluZyIpOwpAQCAtMTAzMCw2ICsxMDU4LDIwIEBAIHN0YXRpYyBpbnQgWkVORF9G QVNUQ0FMTCAgWkVORF9JTklUX0ZDQUwKIAkJfQogCX0gZWxzZSB7CiAJCWZ1bmN0aW9uX25h bWUgPSBfZ2V0X3p2YWxfcHRyX3Zhcigmb3BsaW5lLT5vcDIsIEVYKFRzKSwgJmZyZWVfb3Ay IFRTUk1MU19DQyk7CisJCXplbmRfY2xvc3VyZSAqY2xvc3VyZTsKKworCQlpZiAoWl9UWVBF X1AoZnVuY3Rpb25fbmFtZSkgPT0gSVNfUkVTT1VSQ0UgJiYKKwkJICAgIChjbG9zdXJlID0g KHplbmRfY2xvc3VyZSopIHplbmRfZmV0Y2hfcmVzb3VyY2UgKCZmdW5jdGlvbl9uYW1lIFRT Uk1MU19DQywgLTEsIE5VTEwsIE5VTEwsIDEsIGxlX2xhbWJkYV9mdW5jKSkgIT0gTlVMTCkg eworCQkJRVgoZmJjKSA9ICh6ZW5kX2Z1bmN0aW9uKikmY2xvc3VyZS0+b3BfYXJyYXk7CisJ CQlpZiAoKEVYKG9iamVjdCkgPSBjbG9zdXJlLT5UaGlzKSAhPSBOVUxMKSB7CisJCQkJWl9B RERSRUZfUChFWChvYmplY3QpKTsKKwkJCQlFWChjYWxsZWRfc2NvcGUpID0gWl9PQkpDRV9Q KEVYKG9iamVjdCkpOworCQkJfSBlbHNlIHsKKwkJCQlFWChjYWxsZWRfc2NvcGUpID0gY2xv c3VyZS0+b3BfYXJyYXkuc2NvcGU7CisJCQl9CisJCQlpZiAoZnJlZV9vcDIudmFyKSB7enZh bF9wdHJfZHRvcigmZnJlZV9vcDIudmFyKTt9OworCQkJWkVORF9WTV9ORVhUX09QQ09ERSgp OworCQl9CiAKIAkJaWYgKFpfVFlQRV9QKGZ1bmN0aW9uX25hbWUpICE9IElTX1NUUklORykg ewogCQkJemVuZF9lcnJvcl9ub3JldHVybihFX0VSUk9SLCAiRnVuY3Rpb24gbmFtZSBtdXN0 IGJlIGEgc3RyaW5nIik7CkBAIC0xMTU0LDYgKzExOTYsMjAgQEAgc3RhdGljIGludCBaRU5E X0ZBU1RDQUxMICBaRU5EX0lOSVRfRkNBTAogCQl9CiAJfSBlbHNlIHsKIAkJZnVuY3Rpb25f bmFtZSA9IF9nZXRfenZhbF9wdHJfY3YoJm9wbGluZS0+b3AyLCBFWChUcyksIEJQX1ZBUl9S IFRTUk1MU19DQyk7CisJCXplbmRfY2xvc3VyZSAqY2xvc3VyZTsKKworCQlpZiAoWl9UWVBF X1AoZnVuY3Rpb25fbmFtZSkgPT0gSVNfUkVTT1VSQ0UgJiYKKwkJICAgIChjbG9zdXJlID0g KHplbmRfY2xvc3VyZSopIHplbmRfZmV0Y2hfcmVzb3VyY2UgKCZmdW5jdGlvbl9uYW1lIFRT Uk1MU19DQywgLTEsIE5VTEwsIE5VTEwsIDEsIGxlX2xhbWJkYV9mdW5jKSkgIT0gTlVMTCkg eworCQkJRVgoZmJjKSA9ICh6ZW5kX2Z1bmN0aW9uKikmY2xvc3VyZS0+b3BfYXJyYXk7CisJ CQlpZiAoKEVYKG9iamVjdCkgPSBjbG9zdXJlLT5UaGlzKSAhPSBOVUxMKSB7CisJCQkJWl9B RERSRUZfUChFWChvYmplY3QpKTsKKwkJCQlFWChjYWxsZWRfc2NvcGUpID0gWl9PQkpDRV9Q KEVYKG9iamVjdCkpOworCQkJfSBlbHNlIHsKKwkJCQlFWChjYWxsZWRfc2NvcGUpID0gY2xv c3VyZS0+b3BfYXJyYXkuc2NvcGU7CisJCQl9CisKKwkJCVpFTkRfVk1fTkVYVF9PUENPREUo KTsKKwkJfQogCiAJCWlmIChaX1RZUEVfUChmdW5jdGlvbl9uYW1lKSAhPSBJU19TVFJJTkcp IHsKIAkJCXplbmRfZXJyb3Jfbm9yZXR1cm4oRV9FUlJPUiwgIkZ1bmN0aW9uIG5hbWUgbXVz dCBiZSBhIHN0cmluZyIpOwpAQCAtMjg3NSw2ICsyOTMxLDQ0IEBAIHN0YXRpYyBpbnQgWkVO RF9GQVNUQ0FMTCAgWkVORF9ERUNMQVJFX0MKIAlaRU5EX1ZNX05FWFRfT1BDT0RFKCk7CiB9 CiAKK3N0YXRpYyBpbnQgWkVORF9GQVNUQ0FMTCAgWkVORF9ERUNMQVJFX0xBTUJEQV9GVU5D VElPTl9TUEVDX0NPTlNUX0NPTlNUX0hBTkRMRVIoWkVORF9PUENPREVfSEFORExFUl9BUkdT KQoreworCXplbmRfb3AgKm9wbGluZSA9IEVYKG9wbGluZSk7CisJemVuZF9vcF9hcnJheSAq b3BfYXJyYXk7CisJemVuZF9jbG9zdXJlICAqY2xvc3VyZTsKKworCWlmICh6ZW5kX2hhc2hf cXVpY2tfZmluZChFRyhmdW5jdGlvbl90YWJsZSksIFpfU1RSVkFMKG9wbGluZS0+b3AxLnUu Y29uc3RhbnQpLCBaX1NUUkxFTihvcGxpbmUtPm9wMS51LmNvbnN0YW50KSwgWl9MVkFMKG9w bGluZS0+b3AyLnUuY29uc3RhbnQpLCAodm9pZCAqKSAmb3BfYXJyYXkpID09IEZBSUxVUkUg fHwKKwkgICAgb3BfYXJyYXktPnR5cGUgIT0gWkVORF9VU0VSX0ZVTkNUSU9OKSB7CisJCXpl bmRfZXJyb3Jfbm9yZXR1cm4oRV9FUlJPUiwgIkJhc2UgbGFtYmRhIGZ1bmN0aW9uIGZvciBj bG9zdXJlIG5vdCBmb3VuZCIpOworCX0KKworCWNsb3N1cmUgPSBlbWFsbG9jKHNpemVvZih6 ZW5kX2Nsb3N1cmUpKTsKKwljbG9zdXJlLT5vcF9hcnJheSA9ICpvcF9hcnJheTsKKworCWlm IChjbG9zdXJlLT5vcF9hcnJheS5zdGF0aWNfdmFyaWFibGVzKSB7CisJCUhhc2hUYWJsZSAq c3RhdGljX3ZhcmlhYmxlcyA9IGNsb3N1cmUtPm9wX2FycmF5LnN0YXRpY192YXJpYWJsZXM7 CisKKwkJQUxMT0NfSEFTSFRBQkxFKGNsb3N1cmUtPm9wX2FycmF5LnN0YXRpY192YXJpYWJs ZXMpOworCQl6ZW5kX2hhc2hfaW5pdChjbG9zdXJlLT5vcF9hcnJheS5zdGF0aWNfdmFyaWFi bGVzLCB6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKHN0YXRpY192YXJpYWJsZXMpLCBOVUxMLCBa VkFMX1BUUl9EVE9SLCAwKTsKKwkJemVuZF9oYXNoX2FwcGx5X3dpdGhfYXJndW1lbnRzKHN0 YXRpY192YXJpYWJsZXMsIChhcHBseV9mdW5jX2FyZ3NfdCl6dmFsX2NvcHlfc3RhdGljX3Zh ciwgMSwgY2xvc3VyZS0+b3BfYXJyYXkuc3RhdGljX3ZhcmlhYmxlcyk7CisJfQorCisJaWYg KChjbG9zdXJlLT5vcF9hcnJheS5zY29wZSA9IEVHKHNjb3BlKSkgIT0gTlVMTCkgeworCQlj bG9zdXJlLT5vcF9hcnJheS5mbl9mbGFncyB8PSBaRU5EX0FDQ19QVUJMSUM7CisJCWlmICgo Y2xvc3VyZS0+VGhpcyA9IEVHKFRoaXMpKSAhPSBOVUxMKSB7CisJCQlaX0FERFJFRl9QKGNs b3N1cmUtPlRoaXMpOworCQl9IGVsc2UgeworCQkJY2xvc3VyZS0+b3BfYXJyYXkuZm5fZmxh Z3MgfD0gWkVORF9BQ0NfU1RBVElDOworCQl9CisJfSBlbHNlIHsKKwkJY2xvc3VyZS0+VGhp cyA9IE5VTEw7CisJfQorCSgqY2xvc3VyZS0+b3BfYXJyYXkucmVmY291bnQpKys7CisKKwla RU5EX1JFR0lTVEVSX1JFU09VUkNFKCZFWF9UKG9wbGluZS0+cmVzdWx0LnUudmFyKS50bXBf dmFyLCBjbG9zdXJlLCBsZV9sYW1iZGFfZnVuYyk7CisJWkVORF9WTV9ORVhUX09QQ09ERSgp OworfQorCiBzdGF0aWMgaW50IFpFTkRfRkFTVENBTEwgIFpFTkRfQUREX1NQRUNfQ09OU1Rf VE1QX0hBTkRMRVIoWkVORF9PUENPREVfSEFORExFUl9BUkdTKQogewogCXplbmRfb3AgKm9w bGluZSA9IEVYKG9wbGluZSk7CkBAIC0zMzUwOCw2ICszMzYwMiwzMSBAQCB2b2lkIHplbmRf aW5pdF9vcGNvZGVzX2hhbmRsZXJzKHZvaWQpCiAgIAlaRU5EX0pNUF9TRVRfU1BFQ19DVl9I QU5ETEVSLAogICAJWkVORF9KTVBfU0VUX1NQRUNfQ1ZfSEFORExFUiwKICAgCVpFTkRfSk1Q X1NFVF9TUEVDX0NWX0hBTkRMRVIsCisgIAlaRU5EX0RFQ0xBUkVfTEFNQkRBX0ZVTkNUSU9O X1NQRUNfQ09OU1RfQ09OU1RfSEFORExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJ WkVORF9OVUxMX0hBTkRMRVIsCisgIAlaRU5EX05VTExfSEFORExFUiwKKyAgCVpFTkRfTlVM TF9IQU5ETEVSLAorICAJWkVORF9OVUxMX0hBTkRMRVIsCisgIAlaRU5EX05VTExfSEFORExF UiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJWkVORF9OVUxMX0hBTkRMRVIsCisgIAla RU5EX05VTExfSEFORExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJWkVORF9OVUxM X0hBTkRMRVIsCisgIAlaRU5EX05VTExfSEFORExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVS LAorICAJWkVORF9OVUxMX0hBTkRMRVIsCisgIAlaRU5EX05VTExfSEFORExFUiwKKyAgCVpF TkRfTlVMTF9IQU5ETEVSLAorICAJWkVORF9OVUxMX0hBTkRMRVIsCisgIAlaRU5EX05VTExf SEFORExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJWkVORF9OVUxMX0hBTkRMRVIs CisgIAlaRU5EX05VTExfSEFORExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJWkVO RF9OVUxMX0hBTkRMRVIsCisgIAlaRU5EX05VTExfSEFORExFUiwKICAgCVpFTkRfTlVMTF9I QU5ETEVSCiAgIH07CiAgIHplbmRfb3Bjb2RlX2hhbmRsZXJzID0gKG9wY29kZV9oYW5kbGVy X3QqKWxhYmVsczsKSW5kZXg6IFplbmQvemVuZF92bV9vcGNvZGVzLmgKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvWmVuZEVuZ2luZTIvemVuZF92bV9vcGNvZGVzLmgs dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNDIuMi4xNy4yLjEuMi42CmRpZmYgLXUgLXAgLWQg LXIxLjQyLjIuMTcuMi4xLjIuNiB6ZW5kX3ZtX29wY29kZXMuaAotLS0gWmVuZC96ZW5kX3Zt X29wY29kZXMuaAkyOCBNYXIgMjAwOCAxNDozNTowMSAtMDAwMAkxLjQyLjIuMTcuMi4xLjIu NgorKysgWmVuZC96ZW5kX3ZtX29wY29kZXMuaAkyMCBKdW4gMjAwOCAxMDo1NzoxMSAtMDAw MApAQCAtMTUyLDMgKzE1Miw0IEBACiAjZGVmaW5lIFpFTkRfSEFORExFX0VYQ0VQVElPTiAg ICAgICAgICAgICAgICAxNDkKICNkZWZpbmUgWkVORF9VU0VSX09QQ09ERSAgICAgICAgICAg ICAgICAgICAgIDE1MAogI2RlZmluZSBaRU5EX0pNUF9TRVQgICAgICAgICAgICAgICAgICAg ICAgICAgMTUyCisjZGVmaW5lIFpFTkRfREVDTEFSRV9MQU1CREFfRlVOQ1RJT04gICAgICAg ICAxNTMKSW5kZXg6IGV4dC9wY3JlL3BocF9wY3JlLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmls ZTogL3JlcG9zaXRvcnkvcGhwLXNyYy9leHQvcGNyZS9waHBfcGNyZS5jLHYKcmV0cmlldmlu ZyByZXZpc2lvbiAxLjE2OC4yLjkuMi4yMS4yLjE1CmRpZmYgLXUgLXAgLWQgLXIxLjE2OC4y LjkuMi4yMS4yLjE1IHBocF9wY3JlLmMKLS0tIGV4dC9wY3JlL3BocF9wY3JlLmMJMSBKdW4g MjAwOCAxODo0NzoyMCAtMDAwMAkxLjE2OC4yLjkuMi4yMS4yLjE1CisrKyBleHQvcGNyZS9w aHBfcGNyZS5jCTIwIEp1biAyMDA4IDEwOjU3OjExIC0wMDAwCkBAIC0xMzEyLDcgKzEzMTIs NyBAQCBzdGF0aWMgdm9pZCBwcmVnX3JlcGxhY2VfaW1wbChJTlRFUk5BTF9GCiAJfQogCiAJ U0VQQVJBVEVfWlZBTChyZXBsYWNlKTsKLQlpZiAoWl9UWVBFX1BQKHJlcGxhY2UpICE9IElT X0FSUkFZKQorCWlmIChaX1RZUEVfUFAocmVwbGFjZSkgIT0gSVNfQVJSQVkgJiYgWl9UWVBF X1BQKHJlcGxhY2UpICE9IElTX1JFU09VUkNFKQogCQljb252ZXJ0X3RvX3N0cmluZ19leChy ZXBsYWNlKTsKIAlpZiAoaXNfY2FsbGFibGVfcmVwbGFjZSkgewogCQlpZiAoIXplbmRfaXNf Y2FsbGFibGUoKnJlcGxhY2UsIDAsICZjYWxsYmFja19uYW1lKSkgewo= --------------090607060708070200050105--