Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:49573 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 53685 invoked from network); 5 Sep 2010 13:29:15 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 5 Sep 2010 13:29:15 -0000 Authentication-Results: pb1.pair.com header.from=derick@php.net; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=derick@php.net; spf=unknown; sender-id=unknown Received-SPF: unknown (pb1.pair.com: domain php.net does not designate 82.113.146.227 as permitted sender) X-PHP-List-Original-Sender: derick@php.net X-Host-Fingerprint: 82.113.146.227 xdebug.org Linux 2.6 Received: from [82.113.146.227] ([82.113.146.227:41702] helo=xdebug.org) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id BD/E8-52399-82B938C4 for ; Sun, 05 Sep 2010 09:29:15 -0400 Received: from localhost (xdebug.org [127.0.0.1]) by xdebug.org (Postfix) with ESMTPS id 0370CDE13D; Sun, 5 Sep 2010 14:29:09 +0100 (BST) Date: Sun, 5 Sep 2010 14:29:09 +0100 (BST) X-X-Sender: derick@kossu.derickrethans.nl To: Stas Malyshev cc: Zeev Suraski , PHP Internals In-Reply-To: Message-ID: References: <4C62EC4A.9020106@sugarcrm.com> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-662644695-1283693350=:24012" Subject: [PATCH] Delegate type hint/checks to alternative locations (Re: [PHP-DEV] back to 5.4 alpha) From: derick@php.net (Derick Rethans) --8323329-662644695-1283693350=:24012 Content-Type: TEXT/PLAIN; charset=US-ASCII On Wed, 11 Aug 2010, Derick Rethans wrote: > On Wed, 11 Aug 2010, Stas Malyshev wrote: > > > So I'd propose doing the following: > > > > 1. Moving parameter typing to a feature branch (by branching current trunk and > > then rolling back the typing part in the trunk). > > 2. Starting 5.4 alpha process after that basing on trunk. > > > > Any objections to this? > > A little bit; yes. There is indeed 0 consensus for having the strict > typehints. However, instead of removing it altogether, and instead > answering every mail in this thread :P, I wrote/am writing a patch that > removes the hard type checks. It however keeps the parsed structures and > reflection API for it. In this sense, they're actually real hints. The > patch also adds a mechanism similariy to the zend_error_cb mechanism so > that extensions could override the argument type checking. As my use > case for strict checking is development I'd be happy to just move the > hard checks into an extension. I could even offer a soft check. It also > allows some type inference which might be useful for webservice > introspecition generation. I am sure SOAP might have some benefit of > this, and I know that at least pecl/dbus does. The patch is attached, > but not ready (I haven't remove the hard checks yet because things got > busy at work). I've spend some more time on this, and have attached a new patch that: - Removes the strict type verification, changing it back into typehints only. - Keeps the current syntax so that typehints create structures in the function entries. - Keeps the reflection API for the syntax, so that you can query the typehints. - Changed the API so that the verification function can also modify the variables. I've also written a proof of concept extension at svn://svn.xdebug.org/svn/php/typed and http://svn.xdebug.org/cgi-bin/viewvc.cgi/typed/?root=php that implements both the current strict-type verification, and a form of the "option 1" from http://wiki.php.net/rfc/typecheckingstrictandweak#option_1_current_type_juggeling_rules_with_e_strict_on_data_loss (I've not done the E_STRICT warnings for all, as the RFC didn't specifiy when data loss was considered to occur). Here follows an example script: 12), NULL, '' ); $funcs = array( 'testString', 'testFloat', 'testInt', 'testNumeric', 'testScalar', 'testBool', 'testArray', ); function testString( string $a ) { } function testFloat( float $a ) { } function testInt( int $a ) { } function testBool( boolean $a ) { } function testArray( array $a ) { } function testNumeric( numeric $a ) { } function testScalar( scalar $a ) { } echo "string float int numeric scalar bool array\n"; foreach( $values as $value ) { foreach( $funcs as $func ) { $ok = true; $func($value); echo $ok === true ? "pass " : ( $ok === 0x1000 ? "fail " : "warn " ); } echo ' ', str_replace( "\n", '', var_export( $value, true ) ); echo "\n"; } ?> And the output (with the three different validation/verification methods: No validation/verification: derick@kossu:/home/httpd/html/test/verify-arg$ php -dextension=typed.so -dtyped.mode=0 option2.php string float int numeric scalar bool array pass pass pass pass pass pass fail true pass pass pass pass pass pass fail false pass pass pass pass pass pass fail 0 pass pass pass pass pass pass fail 1 pass pass pass pass pass pass fail 12 pass pass pass pass pass pass fail 12 pass pass pass pass pass pass fail 12.23 pass pass pass pass pass pass fail 'true' pass pass pass pass pass pass fail 'false' pass pass pass pass pass pass fail '0' pass pass pass pass pass pass fail '1' pass pass pass pass pass pass fail '12' pass pass pass pass pass pass fail '12abc' pass pass pass pass pass pass fail '12.0' pass pass pass pass pass pass fail '12.34' pass pass pass pass pass pass fail 'foo' pass pass pass pass pass pass pass array ( 0 => 1, 1 => 2, 2 => 3,) pass pass pass pass pass pass pass array ( 345 => 12,) pass pass pass pass pass pass fail NULL pass pass pass pass pass pass fail '' Script type-checks: derick@kossu:/home/httpd/html/test/verify-arg$ php -dextension=typed.so -dtyped.mode=1 option2.php string float int numeric scalar bool array fail fail fail fail pass pass fail true fail fail fail fail pass pass fail false fail fail pass pass pass fail fail 0 fail fail pass pass pass fail fail 1 fail fail pass pass pass fail fail 12 fail pass fail pass pass fail fail 12 fail pass fail pass pass fail fail 12.23 pass fail fail fail pass fail fail 'true' pass fail fail fail pass fail fail 'false' pass fail fail pass pass fail fail '0' pass fail fail pass pass fail fail '1' pass fail fail pass pass fail fail '12' pass fail fail fail pass fail fail '12abc' pass fail fail pass pass fail fail '12.0' pass fail fail pass pass fail fail '12.34' pass fail fail fail pass fail fail 'foo' fail fail fail fail fail fail pass array ( 0 => 1, 1 => 2, 2 => 3,) fail fail fail fail fail fail pass array ( 345 => 12,) fail fail fail fail fail fail fail NULL pass fail fail fail pass fail fail '' "Option 1" type-casting: derick@kossu:/home/httpd/html/test/verify-arg$ php -dextension=typed.so -dtyped.mode=2 option2.php string float int numeric scalar bool array pass pass pass fail pass pass fail true pass pass pass fail pass pass fail false pass pass pass pass pass pass fail 0 pass pass pass pass pass pass fail 1 pass pass pass pass pass pass fail 12 pass pass warn pass pass pass fail 12 pass pass warn pass pass pass fail 12.23 pass fail warn fail pass pass fail 'true' pass fail warn fail pass pass fail 'false' pass pass pass pass pass pass fail '0' pass pass pass pass pass pass fail '1' pass pass pass pass pass pass fail '12' pass fail warn fail pass pass fail '12abc' pass pass pass pass pass pass fail '12.0' pass pass pass pass pass pass fail '12.34' pass fail warn fail pass pass fail 'foo' fail fail fail fail fail fail pass array ( 0 => 1, 1 => 2, 2 => 3,) fail fail fail fail fail fail pass array ( 345 => 12,) pass pass pass fail fail pass fail NULL pass fail warn fail pass pass fail '' I'd hope to commit this patch in the next week or so, so that we can get started with 5.4. regards, Derick -- http://derickrethans.nl | http://xdebug.org Like Xdebug? Consider a donation: http://xdebug.org/donate.php twitter: @derickr and @xdebug --8323329-662644695-1283693350=:24012 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=php-types-20100905.diff.txt Content-Transfer-Encoding: BASE64 Content-Description: Content-Disposition: attachment; filename=php-types-20100905.diff.txt SW5kZXg6IFplbmQvemVuZC5jDQo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot LS0gWmVuZC96ZW5kLmMJKHJldmlzaW9uIDMwMjg4NSkNCisrKyBaZW5kL3pl bmQuYwkod29ya2luZyBjb3B5KQ0KQEAgLTYwLDYgKzYwLDcgQEANCiBpbnQg KCp6ZW5kX3ZzcHByaW50ZikoY2hhciAqKnBidWYsIHNpemVfdCBtYXhfbGVu LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOw0KIFpFTkRfQVBJ IGNoYXIgKigqemVuZF9nZXRlbnYpKGNoYXIgKm5hbWUsIHNpemVfdCBuYW1l X2xlbiBUU1JNTFNfREMpOw0KIFpFTkRfQVBJIGNoYXIgKigqemVuZF9yZXNv bHZlX3BhdGgpKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmlsZW5hbWVf bGVuIFRTUk1MU19EQyk7DQorWkVORF9BUEkgaW50ICgqemVuZF92ZXJpZnlf YXJnX3R5cGUpKHVuaW9uIF96ZW5kX2Z1bmN0aW9uICp6ZiwgemVuZF91aW50 IGFyZ19udW0sIHp2YWwgKiphcmcsIHVsb25nIGZldGNoX3R5cGUgVFNSTUxT X0RDKTsNCiANCiB2b2lkICgqemVuZF9vbl90aW1lb3V0KShpbnQgc2Vjb25k cyBUU1JNTFNfREMpOw0KIA0KQEAgLTY0OCw2ICs2NDksNyBAQA0KIAl6ZW5k X3ZzcHByaW50ZiA9IHV0aWxpdHlfZnVuY3Rpb25zLT52c3BwcmludGZfZnVu Y3Rpb247DQogCXplbmRfZ2V0ZW52ID0gdXRpbGl0eV9mdW5jdGlvbnMtPmdl dGVudl9mdW5jdGlvbjsNCiAJemVuZF9yZXNvbHZlX3BhdGggPSB1dGlsaXR5 X2Z1bmN0aW9ucy0+cmVzb2x2ZV9wYXRoX2Z1bmN0aW9uOw0KKwl6ZW5kX3Zl cmlmeV9hcmdfdHlwZSA9IHV0aWxpdHlfZnVuY3Rpb25zLT52ZXJpZnlfYXJn X3R5cGVfZnVuY3Rpb247DQogDQogI2lmIEhBVkVfRFRSQUNFDQogLyogYnVp bGQgd2l0aCBkdHJhY2Ugc3VwcG9ydCAqLw0KSW5kZXg6IFplbmQvemVuZC5o DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gWmVuZC96ZW5kLmgJKHJl dmlzaW9uIDMwMjg4NSkNCisrKyBaZW5kL3plbmQuaAkod29ya2luZyBjb3B5 KQ0KQEAgLTUzNiw2ICs1MzYsNyBAQA0KIAlpbnQgKCp2c3BwcmludGZfZnVu Y3Rpb24pKGNoYXIgKipwYnVmLCBzaXplX3QgbWF4X2xlbiwgY29uc3QgY2hh ciAqZm9ybWF0LCB2YV9saXN0IGFwKTsNCiAJY2hhciAqKCpnZXRlbnZfZnVu Y3Rpb24pKGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbiBUU1JNTFNfREMp Ow0KIAljaGFyICooKnJlc29sdmVfcGF0aF9mdW5jdGlvbikoY29uc3QgY2hh ciAqZmlsZW5hbWUsIGludCBmaWxlbmFtZV9sZW4gVFNSTUxTX0RDKTsNCisJ aW50ICgqdmVyaWZ5X2FyZ190eXBlX2Z1bmN0aW9uKSh1bmlvbiBfemVuZF9m dW5jdGlvbiAqemYsIHplbmRfdWludCBhcmdfbnVtLCB6dmFsICoqYXJnLCB1 bG9uZyBmZXRjaF90eXBlIFRTUk1MU19EQyk7DQogfSB6ZW5kX3V0aWxpdHlf ZnVuY3Rpb25zOw0KIA0KIHR5cGVkZWYgc3RydWN0IF96ZW5kX3V0aWxpdHlf dmFsdWVzIHsNCkBAIC02ODMsNiArNjg0LDcgQEANCiBleHRlcm4gaW50ICgq emVuZF92c3BwcmludGYpKGNoYXIgKipwYnVmLCBzaXplX3QgbWF4X2xlbiwg Y29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsNCiBleHRlcm4gWkVO RF9BUEkgY2hhciAqKCp6ZW5kX2dldGVudikoY2hhciAqbmFtZSwgc2l6ZV90 IG5hbWVfbGVuIFRTUk1MU19EQyk7DQogZXh0ZXJuIFpFTkRfQVBJIGNoYXIg KigqemVuZF9yZXNvbHZlX3BhdGgpKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBp bnQgZmlsZW5hbWVfbGVuIFRTUk1MU19EQyk7DQorZXh0ZXJuIFpFTkRfQVBJ IGludCAoKnplbmRfdmVyaWZ5X2FyZ190eXBlKSh1bmlvbiBfemVuZF9mdW5j dGlvbiAqemYsIHplbmRfdWludCBhcmdfbnVtLCB6dmFsICoqYXJnLCB1bG9u ZyBmZXRjaF90eXBlIFRTUk1MU19EQyk7DQogDQogWkVORF9BUEkgdm9pZCB6 ZW5kX2Vycm9yKGludCB0eXBlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikg WkVORF9BVFRSSUJVVEVfRk9STUFUKHByaW50ZiwgMiwgMyk7DQogDQpJbmRl eDogWmVuZC96ZW5kX2V4ZWN1dGUuYw0KPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQ0KLS0tIFplbmQvemVuZF9leGVjdXRlLmMJKHJldmlzaW9uIDMwMjg4NSkN CisrKyBaZW5kL3plbmRfZXhlY3V0ZS5jCSh3b3JraW5nIGNvcHkpDQpAQCAt NTc3LDcgKzU3Nyw3IEBADQogCX0NCiB9DQogDQotc3RhdGljIGlubGluZSBj aGFyICogemVuZF92ZXJpZnlfYXJnX2NsYXNzX2tpbmQoY29uc3QgemVuZF9h cmdfaW5mbyAqY3VyX2FyZ19pbmZvLCB1bG9uZyBmZXRjaF90eXBlLCBjb25z dCBjaGFyICoqY2xhc3NfbmFtZSwgemVuZF9jbGFzc19lbnRyeSAqKnBjZSBU U1JNTFNfREMpDQorWkVORF9BUEkgY2hhciAqIHplbmRfdmVyaWZ5X2FyZ19j bGFzc19raW5kKGNvbnN0IHplbmRfYXJnX2luZm8gKmN1cl9hcmdfaW5mbywg dWxvbmcgZmV0Y2hfdHlwZSwgY29uc3QgY2hhciAqKmNsYXNzX25hbWUsIHpl bmRfY2xhc3NfZW50cnkgKipwY2UgVFNSTUxTX0RDKQ0KIHsNCiAJKnBjZSA9 IHplbmRfZmV0Y2hfY2xhc3MoY3VyX2FyZ19pbmZvLT5jbGFzc19uYW1lLCBj dXJfYXJnX2luZm8tPmNsYXNzX25hbWVfbGVuLCAoZmV0Y2hfdHlwZSB8IFpF TkRfRkVUQ0hfQ0xBU1NfQVVUTyB8IFpFTkRfRkVUQ0hfQ0xBU1NfTk9fQVVU T0xPQUQpIFRTUk1MU19DQyk7DQogDQpAQCAtNTg5LDcgKzU4OSw3IEBADQog CX0NCiB9DQogDQotc3RhdGljIGlubGluZSBpbnQgemVuZF92ZXJpZnlfYXJn X2Vycm9yKGNvbnN0IHplbmRfZnVuY3Rpb24gKnpmLCB6ZW5kX3VpbnQgYXJn X251bSwgY29uc3QgY2hhciAqbmVlZF9tc2csIGNvbnN0IGNoYXIgKm5lZWRf a2luZCwgY29uc3QgY2hhciAqZ2l2ZW5fbXNnLCBjaGFyICpnaXZlbl9raW5k IFRTUk1MU19EQykNCitaRU5EX0FQSSBpbnQgemVuZF92ZXJpZnlfYXJnX2Vy cm9yKGludCBlcnJvcl90eXBlLCBjb25zdCB6ZW5kX2Z1bmN0aW9uICp6Ziwg emVuZF91aW50IGFyZ19udW0sIGNvbnN0IGNoYXIgKm5lZWRfbXNnLCBjb25z dCBjaGFyICpuZWVkX2tpbmQsIGNvbnN0IGNoYXIgKmdpdmVuX21zZywgY2hh ciAqZ2l2ZW5fa2luZCBUU1JNTFNfREMpDQogew0KIAl6ZW5kX2V4ZWN1dGVf ZGF0YSAqcHRyID0gRUcoY3VycmVudF9leGVjdXRlX2RhdGEpLT5wcmV2X2V4 ZWN1dGVfZGF0YTsNCiAJY2hhciAqZm5hbWUgPSB6Zi0+Y29tbW9uLmZ1bmN0 aW9uX25hbWU7DQpAQCAtNjA1LDE0ICs2MDUsMTQgQEANCiAJfQ0KIA0KIAlp ZiAocHRyICYmIHB0ci0+b3BfYXJyYXkpIHsNCi0JCXplbmRfZXJyb3IoRV9S RUNPVkVSQUJMRV9FUlJPUiwgIkFyZ3VtZW50ICVkIHBhc3NlZCB0byAlcyVz JXMoKSBtdXN0ICVzJXMsICVzJXMgZ2l2ZW4sIGNhbGxlZCBpbiAlcyBvbiBs aW5lICVkIGFuZCBkZWZpbmVkIiwgYXJnX251bSwgZmNsYXNzLCBmc2VwLCBm bmFtZSwgbmVlZF9tc2csIG5lZWRfa2luZCwgZ2l2ZW5fbXNnLCBnaXZlbl9r aW5kLCBwdHItPm9wX2FycmF5LT5maWxlbmFtZSwgcHRyLT5vcGxpbmUtPmxp bmVubyk7DQorCQl6ZW5kX2Vycm9yKGVycm9yX3R5cGUsICJBcmd1bWVudCAl ZCBwYXNzZWQgdG8gJXMlcyVzKCkgbXVzdCAlcyVzLCAlcyVzIGdpdmVuLCBj YWxsZWQgaW4gJXMgb24gbGluZSAlZCBhbmQgZGVmaW5lZCIsIGFyZ19udW0s IGZjbGFzcywgZnNlcCwgZm5hbWUsIG5lZWRfbXNnLCBuZWVkX2tpbmQsIGdp dmVuX21zZywgZ2l2ZW5fa2luZCwgcHRyLT5vcF9hcnJheS0+ZmlsZW5hbWUs IHB0ci0+b3BsaW5lLT5saW5lbm8pOw0KIAl9IGVsc2Ugew0KLQkJemVuZF9l cnJvcihFX1JFQ09WRVJBQkxFX0VSUk9SLCAiQXJndW1lbnQgJWQgcGFzc2Vk IHRvICVzJXMlcygpIG11c3QgJXMlcywgJXMlcyBnaXZlbiIsIGFyZ19udW0s IGZjbGFzcywgZnNlcCwgZm5hbWUsIG5lZWRfbXNnLCBuZWVkX2tpbmQsIGdp dmVuX21zZywgZ2l2ZW5fa2luZCk7DQorCQl6ZW5kX2Vycm9yKGVycm9yX3R5 cGUsICJBcmd1bWVudCAlZCBwYXNzZWQgdG8gJXMlcyVzKCkgbXVzdCAlcyVz LCAlcyVzIGdpdmVuIiwgYXJnX251bSwgZmNsYXNzLCBmc2VwLCBmbmFtZSwg bmVlZF9tc2csIG5lZWRfa2luZCwgZ2l2ZW5fbXNnLCBnaXZlbl9raW5kKTsN CiAJfQ0KIAlyZXR1cm4gMDsNCiB9DQogDQotc3RhdGljIGlubGluZSBpbnQg emVuZF92ZXJpZnlfYXJnX3R5cGUoemVuZF9mdW5jdGlvbiAqemYsIHplbmRf dWludCBhcmdfbnVtLCB6dmFsICphcmcsIHVsb25nIGZldGNoX3R5cGUgVFNS TUxTX0RDKQ0KK1pFTkRfQVBJIGludCB6ZW5kX29yaWdpbmFsX3ZlcmlmeV9h cmdfdHlwZSh6ZW5kX2Z1bmN0aW9uICp6ZiwgemVuZF91aW50IGFyZ19udW0s IHp2YWwgKiphcmcsIHVsb25nIGZldGNoX3R5cGUgVFNSTUxTX0RDKQ0KIHsN CiAJemVuZF9hcmdfaW5mbyAqY3VyX2FyZ19pbmZvOw0KIAljaGFyICpuZWVk X21zZzsNCkBAIC02MjgsNDYgKzYyOCwyNyBAQA0KIAlpZiAoY3VyX2FyZ19p bmZvLT5jbGFzc19uYW1lKSB7DQogCQljb25zdCBjaGFyICpjbGFzc19uYW1l Ow0KIA0KLQkJaWYgKCFhcmcpIHsNCisJCWlmICghYXJnIHx8ICEqYXJnKSB7 DQogCQkJbmVlZF9tc2cgPSB6ZW5kX3ZlcmlmeV9hcmdfY2xhc3Nfa2luZChj dXJfYXJnX2luZm8sIGZldGNoX3R5cGUsICZjbGFzc19uYW1lLCAmY2UgVFNS TUxTX0NDKTsNCi0JCQlyZXR1cm4gemVuZF92ZXJpZnlfYXJnX2Vycm9yKHpm LCBhcmdfbnVtLCBuZWVkX21zZywgY2xhc3NfbmFtZSwgIm5vbmUiLCAiIiBU U1JNTFNfQ0MpOw0KKwkJCXJldHVybiB6ZW5kX3ZlcmlmeV9hcmdfZXJyb3Io RV9SRUNPVkVSQUJMRV9FUlJPUiwgemYsIGFyZ19udW0sIG5lZWRfbXNnLCBj bGFzc19uYW1lLCAibm9uZSIsICIiIFRTUk1MU19DQyk7DQogCQl9DQotCQlp ZiAoWl9UWVBFX1AoYXJnKSA9PSBJU19PQkpFQ1QpIHsNCisJCWlmIChaX1RZ UEVfUFAoYXJnKSA9PSBJU19PQkpFQ1QpIHsNCiAJCQluZWVkX21zZyA9IHpl bmRfdmVyaWZ5X2FyZ19jbGFzc19raW5kKGN1cl9hcmdfaW5mbywgZmV0Y2hf dHlwZSwgJmNsYXNzX25hbWUsICZjZSBUU1JNTFNfQ0MpOw0KLQkJCWlmICgh Y2UgfHwgIWluc3RhbmNlb2ZfZnVuY3Rpb24oWl9PQkpDRV9QKGFyZyksIGNl IFRTUk1MU19DQykpIHsNCi0JCQkJcmV0dXJuIHplbmRfdmVyaWZ5X2FyZ19l cnJvcih6ZiwgYXJnX251bSwgbmVlZF9tc2csIGNsYXNzX25hbWUsICJpbnN0 YW5jZSBvZiAiLCBaX09CSkNFX1AoYXJnKS0+bmFtZSBUU1JNTFNfQ0MpOw0K KwkJCWlmICghY2UgfHwgIWluc3RhbmNlb2ZfZnVuY3Rpb24oWl9PQkpDRV9Q UChhcmcpLCBjZSBUU1JNTFNfQ0MpKSB7DQorCQkJCXJldHVybiB6ZW5kX3Zl cmlmeV9hcmdfZXJyb3IoRV9SRUNPVkVSQUJMRV9FUlJPUiwgemYsIGFyZ19u dW0sIG5lZWRfbXNnLCBjbGFzc19uYW1lLCAiaW5zdGFuY2Ugb2YgIiwgWl9P QkpDRV9QUChhcmcpLT5uYW1lIFRTUk1MU19DQyk7DQogCQkJfQ0KLQkJfSBl bHNlIGlmIChaX1RZUEVfUChhcmcpICE9IElTX05VTEwgfHwgIWN1cl9hcmdf aW5mby0+YWxsb3dfbnVsbCkgew0KKwkJfSBlbHNlIGlmIChaX1RZUEVfUFAo YXJnKSAhPSBJU19OVUxMIHx8ICFjdXJfYXJnX2luZm8tPmFsbG93X251bGwp IHsNCiAJCQluZWVkX21zZyA9IHplbmRfdmVyaWZ5X2FyZ19jbGFzc19raW5k KGN1cl9hcmdfaW5mbywgZmV0Y2hfdHlwZSwgJmNsYXNzX25hbWUsICZjZSBU U1JNTFNfQ0MpOw0KLQkJCXJldHVybiB6ZW5kX3ZlcmlmeV9hcmdfZXJyb3Io emYsIGFyZ19udW0sIG5lZWRfbXNnLCBjbGFzc19uYW1lLCB6ZW5kX3p2YWxf dHlwZV9uYW1lKGFyZyksICIiIFRTUk1MU19DQyk7DQorCQkJcmV0dXJuIHpl bmRfdmVyaWZ5X2FyZ19lcnJvcihFX1JFQ09WRVJBQkxFX0VSUk9SLCB6Ziwg YXJnX251bSwgbmVlZF9tc2csIGNsYXNzX25hbWUsIHplbmRfenZhbF90eXBl X25hbWUoKmFyZyksICIiIFRTUk1MU19DQyk7DQogCQl9DQotCX0gZWxzZSBp ZiAoY3VyX2FyZ19pbmZvLT50eXBlX2hpbnQpIHsNCi0JCWlmICghYXJnKSB7 DQotCQkJcmV0dXJuIHplbmRfdmVyaWZ5X2FyZ19lcnJvcih6ZiwgYXJnX251 bSwgImJlIG9mIHRoZSB0eXBlICIsIHplbmRfZ2V0X3R5cGVfYnlfY29uc3Qo Y3VyX2FyZ19pbmZvLT50eXBlX2hpbnQpLCAibm9uZSIsICIiIFRTUk1MU19D Qyk7DQorCX0gZWxzZSBpZiAoY3VyX2FyZ19pbmZvLT50eXBlX2hpbnQgJiYg Y3VyX2FyZ19pbmZvLT50eXBlX2hpbnQgPT0gSVNfQVJSQVkpIHsNCisJCWlm ICghYXJnIHx8ICEqYXJnKSB7DQorCQkJcmV0dXJuIHplbmRfdmVyaWZ5X2Fy Z19lcnJvcihFX1JFQ09WRVJBQkxFX0VSUk9SLCB6ZiwgYXJnX251bSwgImJl IG9mIHRoZSB0eXBlIGFycmF5IiwgIiIsICJub25lIiwgIiIgVFNSTUxTX0ND KTsNCiAJCX0NCiANCi0JCS8qIGV4aXN0aW5nIHR5cGUgYWxyZWFkeSBtYXRj aGVzIHRoZSBoaW50IG9yIGZvcmNlZCB0eXBlICovDQotCQlpZiAoWl9UWVBF X1AoYXJnKSA9PSBjdXJfYXJnX2luZm8tPnR5cGVfaGludCkgew0KLQkJCXJl dHVybiAxOw0KKwkJaWYgKFpfVFlQRV9QUChhcmcpICE9IElTX0FSUkFZICYm IChaX1RZUEVfUFAoYXJnKSAhPSBJU19OVUxMIHx8ICFjdXJfYXJnX2luZm8t PmFsbG93X251bGwpKSB7DQorCQkJcmV0dXJuIHplbmRfdmVyaWZ5X2FyZ19l cnJvcihFX1JFQ09WRVJBQkxFX0VSUk9SLCB6ZiwgYXJnX251bSwgImJlIG9m IHRoZSB0eXBlIGFycmF5IiwgIiIsIHplbmRfenZhbF90eXBlX25hbWUoKmFy ZyksICIiIFRTUk1MU19DQyk7DQogCQl9DQotDQotCQkvKiBOVUxMIHR5cGUg Z2l2ZW4sIGNoZWNrIGlmIHBhcmFtZXRlciBpcyBvcHRpb25hbCAqLw0KLQkJ aWYgKFpfVFlQRV9QKGFyZykgPT0gSVNfTlVMTCAmJiBjdXJfYXJnX2luZm8t PmFsbG93X251bGwpIHsNCi0JCQlyZXR1cm4gMTsNCi0JCX0NCi0NCi0JCWlm IChjdXJfYXJnX2luZm8tPnR5cGVfaGludCA9PSBJU19TQ0FMQVIgJiYgWl9U WVBFX1AoYXJnKSAhPSBJU19OVUxMICYmIFpfVFlQRV9QKGFyZykgIT0gSVNf QVJSQVkgJiYgWl9UWVBFX1AoYXJnKSAhPSBJU19PQkpFQ1QgJiYgWl9UWVBF X1AoYXJnKSAhPSBJU19SRVNPVVJDRSkgew0KLQkJCXJldHVybiAxOw0KLQkJ fQ0KLQ0KLQkJaWYgKGN1cl9hcmdfaW5mby0+dHlwZV9oaW50ID09IElTX05V TUVSSUMgJiYgKA0KLQkJCQkoWl9UWVBFX1AoYXJnKSA9PSBJU19MT05HIHx8 IFpfVFlQRV9QKGFyZykgPT0gSVNfRE9VQkxFKQ0KLQkJCQl8fCAoWl9UWVBF X1AoYXJnKSA9PSBJU19TVFJJTkcgJiYgaXNfbnVtZXJpY19zdHJpbmcoWl9T VFJWQUxfUChhcmcpLCBaX1NUUkxFTl9QKGFyZyksIE5VTEwsIE5VTEwsIDAp KQ0KLQkJKSkgew0KLQkJCXJldHVybiAxOw0KLQkJfQ0KLQ0KLQkJcmV0dXJu IHplbmRfdmVyaWZ5X2FyZ19lcnJvcih6ZiwgYXJnX251bSwgImJlIG9mIHRo ZSB0eXBlICIsIHplbmRfZ2V0X3R5cGVfYnlfY29uc3QoY3VyX2FyZ19pbmZv LT50eXBlX2hpbnQpLCAiIiwgemVuZF96dmFsX3R5cGVfbmFtZShhcmcpIFRT Uk1MU19DQyk7DQogCX0NCiAJcmV0dXJuIDE7DQogfQ0KSW5kZXg6IFplbmQv emVuZF9leGVjdXRlLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBa ZW5kL3plbmRfZXhlY3V0ZS5oCShyZXZpc2lvbiAzMDI4ODUpDQorKysgWmVu ZC96ZW5kX2V4ZWN1dGUuaAkod29ya2luZyBjb3B5KQ0KQEAgLTM4OSw3ICsz ODksMTEgQEANCiBaRU5EX0FQSSB6ZW5kX2NsYXNzX2VudHJ5ICp6ZW5kX2Zl dGNoX2NsYXNzKGNvbnN0IGNoYXIgKmNsYXNzX25hbWUsIHVpbnQgY2xhc3Nf bmFtZV9sZW4sIGludCBmZXRjaF90eXBlIFRTUk1MU19EQyk7DQogWkVORF9B UEkgemVuZF9jbGFzc19lbnRyeSAqemVuZF9mZXRjaF9jbGFzc19ieV9uYW1l KGNvbnN0IGNoYXIgKmNsYXNzX25hbWUsIHVpbnQgY2xhc3NfbmFtZV9sZW4s IGNvbnN0IHplbmRfbGl0ZXJhbCAqa2V5LCBpbnQgZmV0Y2hfdHlwZSBUU1JN TFNfREMpOw0KIHZvaWQgemVuZF92ZXJpZnlfYWJzdHJhY3RfY2xhc3MoemVu ZF9jbGFzc19lbnRyeSAqY2UgVFNSTUxTX0RDKTsNCitaRU5EX0FQSSBpbnQg emVuZF92ZXJpZnlfYXJnX2Vycm9yKGludCBlcnJvcl90eXBlLCBjb25zdCB6 ZW5kX2Z1bmN0aW9uICp6ZiwgemVuZF91aW50IGFyZ19udW0sIGNvbnN0IGNo YXIgKm5lZWRfbXNnLCBjb25zdCBjaGFyICpuZWVkX2tpbmQsIGNvbnN0IGNo YXIgKmdpdmVuX21zZywgY2hhciAqZ2l2ZW5fa2luZCBUU1JNTFNfREMpOw0K K1pFTkRfQVBJIGludCB6ZW5kX29yaWdpbmFsX3ZlcmlmeV9hcmdfdHlwZSh6 ZW5kX2Z1bmN0aW9uICp6ZiwgemVuZF91aW50IGFyZ19udW0sIHp2YWwgKiph cmcsIHVsb25nIGZldGNoX3R5cGUgVFNSTUxTX0RDKTsNCitaRU5EX0FQSSBj aGFyICp6ZW5kX3ZlcmlmeV9hcmdfY2xhc3Nfa2luZChjb25zdCB6ZW5kX2Fy Z19pbmZvICpjdXJfYXJnX2luZm8sIHVsb25nIGZldGNoX3R5cGUsIGNvbnN0 IGNoYXIgKipjbGFzc19uYW1lLCB6ZW5kX2NsYXNzX2VudHJ5ICoqcGNlIFRT Uk1MU19EQyk7DQogDQorDQogI2lmZGVmIFpFTkRfV0lOMzINCiB2b2lkIHpl bmRfaW5pdF90aW1lb3V0X3RocmVhZCh2b2lkKTsNCiB2b2lkIHplbmRfc2h1 dGRvd25fdGltZW91dF90aHJlYWQodm9pZCk7DQpJbmRleDogWmVuZC90ZXN0 cy9oaW50L3BhcmFtX3R5cGVfaGludF8wMjEucGhwdA0KPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQ0KLS0tIFplbmQvdGVzdHMvaGludC9wYXJhbV90eXBlX2hp bnRfMDIxLnBocHQJKHJldmlzaW9uIDMwMjg4NSkNCisrKyBaZW5kL3Rlc3Rz L2hpbnQvcGFyYW1fdHlwZV9oaW50XzAyMS5waHB0CSh3b3JraW5nIGNvcHkp DQpAQCAtMSw0NiArMCwwIEBADQotLS1URVNULS0NCi1QYXJhbWV0ZXIgdHlw ZSBoaW50IC0gbnVtZXJpYyB0eXBlIGhpbnRzDQotLS1GSUxFLS0NCi08P3Bo cA0KLQ0KLWZ1bmN0aW9uIHgoJGVycm9yLCAkbXNnKSB7IHZhcl9kdW1wKCRt c2cpOyB9DQotc2V0X2Vycm9yX2hhbmRsZXIoJ3gnLCBFX1JFQ09WRVJBQkxF X0VSUk9SKTsNCi0NCi1mdW5jdGlvbiBmb28obnVtZXJpYyAkcGFyYW0pIHsg dmFyX2R1bXAoJHBhcmFtKTsgfQ0KLQ0KLWZvbygxKTsNCi1mb28odHJ1ZSk7 DQotZm9vKE5VTEwpOw0KLWZvbyhhcnJheSgxKSk7DQotZm9vKCJmb28iKTsN Ci1mb28oIjEyMy4zMyIpOw0KLWZvbygiMTIzIik7DQotZm9vKCIiKTsNCi1m b28oMTExLjIyMik7DQotZm9vKG5ldyBTdGRjbGFzcyk7DQotZm9vKHRtcGZp bGUoKSk7DQotDQotPz4NCi0tLUVYUEVDVEYtLQ0KLWludCgxKQ0KLXN0cmlu ZyglZCkgIkFyZ3VtZW50IDEgcGFzc2VkIHRvIGZvbygpIG11c3QgYmUgb2Yg dGhlIHR5cGUgbnVtZXJpYywgYm9vbGVhbiBnaXZlbiwgY2FsbGVkIGluICVz IG9uIGxpbmUgJWQgYW5kIGRlZmluZWQiDQotYm9vbCh0cnVlKQ0KLXN0cmlu ZyglZCkgIkFyZ3VtZW50IDEgcGFzc2VkIHRvIGZvbygpIG11c3QgYmUgb2Yg dGhlIHR5cGUgbnVtZXJpYywgbnVsbCBnaXZlbiwgY2FsbGVkIGluICVzIG9u IGxpbmUgJWQgYW5kIGRlZmluZWQiDQotTlVMTA0KLXN0cmluZyglZCkgIkFy Z3VtZW50IDEgcGFzc2VkIHRvIGZvbygpIG11c3QgYmUgb2YgdGhlIHR5cGUg bnVtZXJpYywgYXJyYXkgZ2l2ZW4sIGNhbGxlZCBpbiAlcyBvbiBsaW5lICVk IGFuZCBkZWZpbmVkIg0KLWFycmF5KDEpIHsNCi0gIFswXT0+DQotICBpbnQo MSkNCi19DQotc3RyaW5nKCVkKSAiQXJndW1lbnQgMSBwYXNzZWQgdG8gZm9v KCkgbXVzdCBiZSBvZiB0aGUgdHlwZSBudW1lcmljLCBzdHJpbmcgZ2l2ZW4s IGNhbGxlZCBpbiAlcyBvbiBsaW5lICVkIGFuZCBkZWZpbmVkIg0KLXN0cmlu ZygzKSAiZm9vIg0KLXN0cmluZyg2KSAiMTIzLjMzIg0KLXN0cmluZygzKSAi MTIzIg0KLXN0cmluZyglZCkgIkFyZ3VtZW50IDEgcGFzc2VkIHRvIGZvbygp IG11c3QgYmUgb2YgdGhlIHR5cGUgbnVtZXJpYywgc3RyaW5nIGdpdmVuLCBj YWxsZWQgaW4gJXMgb24gbGluZSAlZCBhbmQgZGVmaW5lZCINCi1zdHJpbmco MCkgIiINCi1mbG9hdCgxMTEuMjIyKQ0KLXN0cmluZyglZCkgIkFyZ3VtZW50 IDEgcGFzc2VkIHRvIGZvbygpIG11c3QgYmUgb2YgdGhlIHR5cGUgbnVtZXJp Yywgb2JqZWN0IGdpdmVuLCBjYWxsZWQgaW4gJXMgb24gbGluZSAlZCBhbmQg ZGVmaW5lZCINCi1vYmplY3Qoc3RkQ2xhc3MpIzEgKDApIHsNCi19DQotc3Ry aW5nKCVkKSAiQXJndW1lbnQgMSBwYXNzZWQgdG8gZm9vKCkgbXVzdCBiZSBv ZiB0aGUgdHlwZSBudW1lcmljLCByZXNvdXJjZSBnaXZlbiwgY2FsbGVkIGlu ICVzIG9uIGxpbmUgJWQgYW5kIGRlZmluZWQiDQotcmVzb3VyY2UoNCkgb2Yg dHlwZSAoc3RyZWFtKQ0KSW5kZXg6IFplbmQvdGVzdHMvaGludC9wYXJhbV90 eXBlX2hpbnRfMDAzLnBocHQNCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0t LSBaZW5kL3Rlc3RzL2hpbnQvcGFyYW1fdHlwZV9oaW50XzAwMy5waHB0CShy ZXZpc2lvbiAzMDI4ODUpDQorKysgWmVuZC90ZXN0cy9oaW50L3BhcmFtX3R5 cGVfaGludF8wMDMucGhwdAkod29ya2luZyBjb3B5KQ0KQEAgLTEsMTYgKzAs MCBAQA0KLS0tVEVTVC0tDQotUGFyYW1ldGVyIHR5cGUgaGludCAtIFdyb25n IHBhcmFtZXRlciBmb3IgaW50ZWdlcg0KLS0tRklMRS0tDQotPD9waHANCi0N Ci1mdW5jdGlvbiB0ZXN0X2ludChpbnQgJGEpIHsNCi0JZWNobyAkYSwgIlxu IjsJDQotfQ0KLQ0KLXRlc3RfaW50KCcrMScpOw0KLQ0KLT8+DQotLS1FWFBF Q1RGLS0NCi1DYXRjaGFibGUgZmF0YWwgZXJyb3I6IEFyZ3VtZW50IDEgcGFz c2VkIHRvIHRlc3RfaW50KCkgbXVzdCBiZSBvZiB0aGUgdHlwZSBpbnRlZ2Vy LCBzdHJpbmcgZ2l2ZW4sIGNhbGxlZCBpbiAlcyBvbiBsaW5lICVkIGFuZCBk ZWZpbmVkIGluICVzIG9uIGxpbmUgJWQNCi0tLVVFWFBFQ1RGLS0NCi1DYXRj aGFibGUgZmF0YWwgZXJyb3I6IEFyZ3VtZW50IDEgcGFzc2VkIHRvIHRlc3Rf aW50KCkgbXVzdCBiZSBvZiB0aGUgdHlwZSBpbnRlZ2VyLCBVbmljb2RlIHN0 cmluZyBnaXZlbiwgY2FsbGVkIGluICVzIG9uIGxpbmUgJWQgYW5kIGRlZmlu ZWQgaW4gJXMgb24gbGluZSAlZA0KSW5kZXg6IFplbmQvdGVzdHMvaGludC9w YXJhbV90eXBlX2hpbnRfMDEyLnBocHQNCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCi0tLSBaZW5kL3Rlc3RzL2hpbnQvcGFyYW1fdHlwZV9oaW50XzAxMi5w aHB0CShyZXZpc2lvbiAzMDI4ODUpDQorKysgWmVuZC90ZXN0cy9oaW50L3Bh cmFtX3R5cGVfaGludF8wMTIucGhwdAkod29ya2luZyBjb3B5KQ0KQEAgLTEs MTggKzAsMCBAQA0KLS0tVEVTVC0tDQotUGFyYW1ldGVyIHR5cGUgaGludCAt IFRlc3Rpbmcgd2l0aCBsYW1iZGEgZnVuY3Rpb24NCi0tLUZJTEUtLQ0KLTw/ cGhwDQotDQotJHRlc3QgPSBjcmVhdGVfZnVuY3Rpb24oJ2ludGVnZXIgJGkn LCAncmV0dXJuICRpICsgMTsnKTsNCi12YXJfZHVtcCgkdGVzdCgxKSk7DQot dmFyX2R1bXAoJHRlc3QoJ2ZvbycpKTsNCi0NCi0/Pg0KLS0tRVhQRUNURi0t DQotaW50KDIpDQotDQotQ2F0Y2hhYmxlIGZhdGFsIGVycm9yOiBBcmd1bWVu dCAxIHBhc3NlZCB0byBfX2xhbWJkYV9mdW5jKCkgbXVzdCBiZSBvZiB0aGUg dHlwZSBpbnRlZ2VyLCBzdHJpbmcgZ2l2ZW4sIGNhbGxlZCBpbiAlcyBvbiBs aW5lICVkIGFuZCBkZWZpbmVkIGluICVzKCVkKSA6IHJ1bnRpbWUtY3JlYXRl ZCBmdW5jdGlvbiBvbiBsaW5lICVkDQotLS1VRVhQRUNURi0tDQotaW50KDIp DQotDQotQ2F0Y2hhYmxlIGZhdGFsIGVycm9yOiBBcmd1bWVudCAxIHBhc3Nl ZCB0byBfX2xhbWJkYV9mdW5jKCkgbXVzdCBiZSBvZiB0aGUgdHlwZSBpbnRl Z2VyLCBVbmljb2RlIHN0cmluZyBnaXZlbiwgY2FsbGVkIGluICVzIG9uIGxp bmUgJWQgYW5kIGRlZmluZWQgaW4gJXMoJWQpIDogcnVudGltZS1jcmVhdGVk IGZ1bmN0aW9uIG9uIGxpbmUgJWQNCkluZGV4OiBaZW5kL3Rlc3RzL2hpbnQv cGFyYW1fdHlwZV9oaW50XzAwNC5waHB0DQo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09DQotLS0gWmVuZC90ZXN0cy9oaW50L3BhcmFtX3R5cGVfaGludF8wMDQu cGhwdAkocmV2aXNpb24gMzAyODg1KQ0KKysrIFplbmQvdGVzdHMvaGludC9w YXJhbV90eXBlX2hpbnRfMDA0LnBocHQJKHdvcmtpbmcgY29weSkNCkBAIC0x LDE2ICswLDAgQEANCi0tLVRFU1QtLQ0KLVBhcmFtZXRlciB0eXBlIGhpbnQg LSBXcm9uZyBwYXJhbWV0ZXIgZm9yIGRvdWJsZQ0KLS0tRklMRS0tDQotPD9w aHANCi0NCi1mdW5jdGlvbiB0ZXN0X2RvdWJsZShyZWFsICRhKSB7DQotCWVj aG8gJGEsICJcbiI7CQ0KLX0NCi0NCi10ZXN0X2RvdWJsZSgnKzEuMScpOw0K LQ0KLT8+DQotLS1FWFBFQ1RGLS0NCi1DYXRjaGFibGUgZmF0YWwgZXJyb3I6 IEFyZ3VtZW50IDEgcGFzc2VkIHRvIHRlc3RfZG91YmxlKCkgbXVzdCBiZSBv ZiB0aGUgdHlwZSBkb3VibGUsIHN0cmluZyBnaXZlbiwgY2FsbGVkIGluICVz IG9uIGxpbmUgJWQgYW5kIGRlZmluZWQgaW4gJXMgb24gbGluZSAlZA0KLS0t VUVYUEVDVEYtLQ0KLUNhdGNoYWJsZSBmYXRhbCBlcnJvcjogQXJndW1lbnQg MSBwYXNzZWQgdG8gdGVzdF9kb3VibGUoKSBtdXN0IGJlIG9mIHRoZSB0eXBl IGRvdWJsZSwgVW5pY29kZSBzdHJpbmcgZ2l2ZW4sIGNhbGxlZCBpbiAlcyBv biBsaW5lICVkIGFuZCBkZWZpbmVkIGluICVzIG9uIGxpbmUgJWQNCkluZGV4 OiBaZW5kL3Rlc3RzL2hpbnQvcGFyYW1fdHlwZV9oaW50XzAxMy5waHB0DQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09DQotLS0gWmVuZC90ZXN0cy9oaW50L3Bh cmFtX3R5cGVfaGludF8wMTMucGhwdAkocmV2aXNpb24gMzAyODg1KQ0KKysr IFplbmQvdGVzdHMvaGludC9wYXJhbV90eXBlX2hpbnRfMDEzLnBocHQJKHdv cmtpbmcgY29weSkNCkBAIC0xLDE2ICswLDAgQEANCi0tLVRFU1QtLQ0KLVBh cmFtZXRlciB0eXBlIGhpbnQgLSBUZXN0aW5nIHdpdGggbGFtYmRhIGZ1bmN0 aW9uIHVzaW5nIDIgcGFyYW1ldGVycw0KLS0tRklMRS0tDQotPD9waHANCi0N Ci0kdGVzdCA9IGNyZWF0ZV9mdW5jdGlvbignaW50ZWdlciAkaSwgc3RyaW5n ICRqJywgJ3JldHVybiAkaSArICRqOycpOw0KLXZhcl9kdW1wKCR0ZXN0KDEs ICdmb28nKSk7DQotdmFyX2R1bXAoJHRlc3QoMSwgJzEnKSk7DQotdmFyX2R1 bXAoJHRlc3QoMSwgTlVMTCkpOw0KLQ0KLT8+DQotLS1FWFBFQ1RGLS0NCi1p bnQoMSkNCi1pbnQoMikNCi0NCi1DYXRjaGFibGUgZmF0YWwgZXJyb3I6IEFy Z3VtZW50IDIgcGFzc2VkIHRvIF9fbGFtYmRhX2Z1bmMoKSBtdXN0IGJlIG9m IHRoZSB0eXBlIHN0cmluZywgbnVsbCBnaXZlbiwgY2FsbGVkIGluICVzIG9u IGxpbmUgJWQgYW5kIGRlZmluZWQgaW4gJXMoJWQpIDogcnVudGltZS1jcmVh dGVkIGZ1bmN0aW9uIG9uIGxpbmUgJWQNCkluZGV4OiBaZW5kL3Rlc3RzL2hp bnQvcGFyYW1fdHlwZV9oaW50XzAwNS5waHB0DQo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09DQotLS0gWmVuZC90ZXN0cy9oaW50L3BhcmFtX3R5cGVfaGludF8w MDUucGhwdAkocmV2aXNpb24gMzAyODg1KQ0KKysrIFplbmQvdGVzdHMvaGlu dC9wYXJhbV90eXBlX2hpbnRfMDA1LnBocHQJKHdvcmtpbmcgY29weSkNCkBA IC0xLDIzICswLDAgQEANCi0tLVRFU1QtLQ0KLVBhcmFtZXRlciB0eXBlIGhp bnQgLSBXcm9uZyBwYXJhbWV0ZXIgZm9yIHN0cmluZw0KLS0tRklMRS0tDQot PD9waHANCi0NCi1mdW5jdGlvbiB0ZXN0X3N0cihzdHJpbmcgJGEpIHsNCi0J ZWNobyAkYSwgIlxuIjsJDQotfQ0KLQ0KLXRlc3Rfc3RyKCcrMS4xJyk7DQot dGVzdF9zdHIoJy0uMScpOw0KLXRlc3Rfc3RyKCcxMTIxMzExMTExMjMyMTMx MicpOw0KLXRlc3Rfc3RyKCcnKTsNCi10ZXN0X3N0cihudWxsKTsNCi0NCi0/ Pg0KLS0tRVhQRUNURi0tDQotKzEuMQ0KLS0uMQ0KLTExMjEzMTExMTEyMzIx MzEyDQotDQotDQotQ2F0Y2hhYmxlIGZhdGFsIGVycm9yOiBBcmd1bWVudCAx IHBhc3NlZCB0byB0ZXN0X3N0cigpIG11c3QgYmUgb2YgdGhlIHR5cGUgc3Ry aW5nLCBudWxsIGdpdmVuLCBjYWxsZWQgaW4gJXMgb24gbGluZSAlZCBhbmQg ZGVmaW5lZCBpbiAlcyBvbiBsaW5lICVkDQpJbmRleDogWmVuZC90ZXN0cy9o aW50L3BhcmFtX3R5cGVfaGludF8wMTQucGhwdA0KPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQ0KLS0tIFplbmQvdGVzdHMvaGludC9wYXJhbV90eXBlX2hpbnRf MDE0LnBocHQJKHJldmlzaW9uIDMwMjg4NSkNCisrKyBaZW5kL3Rlc3RzL2hp bnQvcGFyYW1fdHlwZV9oaW50XzAxNC5waHB0CSh3b3JraW5nIGNvcHkpDQpA QCAtMSwxNiArMCwwIEBADQotLS1URVNULS0NCi1QYXJhbWV0ZXIgdHlwZSBo aW50IC0gVGVzdGluZyBpbiBmdW5jdGlvbiBpbnNpZGUgZnVuY3Rpb24NCi0t LUZJTEUtLQ0KLTw/cGhwDQotDQotZnVuY3Rpb24gYSgpIHsNCi0JZnVuY3Rp b24gYihyZWFsICRjKSB7DQotCX0NCi0JcmV0dXJuIGIoMSk7DQotfQ0KLQ0K LWEoKTsNCi0NCi0/Pg0KLS0tRVhQRUNURi0tDQotQ2F0Y2hhYmxlIGZhdGFs IGVycm9yOiBBcmd1bWVudCAxIHBhc3NlZCB0byBiKCkgbXVzdCBiZSBvZiB0 aGUgdHlwZSBkb3VibGUsIGludGVnZXIgZ2l2ZW4sIGNhbGxlZCBpbiAlcyBv biBsaW5lICVkIGFuZCBkZWZpbmVkIGluICVzIG9uIGxpbmUgJWQNCkluZGV4 OiBaZW5kL3Rlc3RzL2hpbnQvcGFyYW1fdHlwZV9oaW50XzAxNS5waHB0DQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09DQotLS0gWmVuZC90ZXN0cy9oaW50L3Bh cmFtX3R5cGVfaGludF8wMTUucGhwdAkocmV2aXNpb24gMzAyODg1KQ0KKysr IFplbmQvdGVzdHMvaGludC9wYXJhbV90eXBlX2hpbnRfMDE1LnBocHQJKHdv cmtpbmcgY29weSkNCkBAIC0xLDE5ICswLDAgQEANCi0tLVRFU1QtLQ0KLVBh cmFtZXRlciB0eXBlIGhpbnQgLSBUZXN0aW5nIHdpdGggY2FsbF91c2VyX2Z1 bmMoKQ0KLS0tRklMRS0tDQotPD9waHANCi0NCi1mdW5jdGlvbiB0ZXN0KGJv b2wgJGIpIHsNCi0JcHJpbnQgIm9rXG4iOw0KLX0NCi0NCi1jYWxsX3VzZXJf ZnVuYygndGVzdCcsIHRydWUpOw0KLWNhbGxfdXNlcl9mdW5jKCd0ZXN0Jywg ZmFsc2UpOw0KLWNhbGxfdXNlcl9mdW5jKCd0ZXN0JywgTlVMTCk7DQotDQot Pz4NCi0tLUVYUEVDVEYtLQ0KLW9rDQotb2sNCi0NCi1DYXRjaGFibGUgZmF0 YWwgZXJyb3I6IEFyZ3VtZW50IDEgcGFzc2VkIHRvIHRlc3QoKSBtdXN0IGJl IG9mIHRoZSB0eXBlIGJvb2xlYW4sIG51bGwgZ2l2ZW4gaW4gJXMgb24gbGlu ZSAlZA0KSW5kZXg6IFplbmQvdGVzdHMvaGludC9wYXJhbV90eXBlX2hpbnRf MDE5LnBocHQNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBaZW5kL3Rl c3RzL2hpbnQvcGFyYW1fdHlwZV9oaW50XzAxOS5waHB0CShyZXZpc2lvbiAz MDI4ODUpDQorKysgWmVuZC90ZXN0cy9oaW50L3BhcmFtX3R5cGVfaGludF8w MTkucGhwdAkod29ya2luZyBjb3B5KQ0KQEAgLTEsMzcgKzAsMCBAQA0KLS0t VEVTVC0tDQotUGFyYW1ldGVyIHR5cGUgaGludCAtIHNjYWxhciB0eXBlIGhp bnRzDQotLS1GSUxFLS0NCi08P3BocA0KLQ0KLWZ1bmN0aW9uIHgoJGVycm9y LCAkbXNnKSB7IHZhcl9kdW1wKCRtc2cpOyB9DQotc2V0X2Vycm9yX2hhbmRs ZXIoJ3gnLCBFX1JFQ09WRVJBQkxFX0VSUk9SKTsNCi0NCi1mdW5jdGlvbiBm b28oc2NhbGFyICRwYXJhbSkgeyB2YXJfZHVtcCgkcGFyYW0pOyB9DQotDQot Zm9vKDEpOw0KLWZvbyh0cnVlKTsNCi1mb28oTlVMTCk7DQotZm9vKGFycmF5 KDEpKTsNCi1mb28oImZvbyIpOw0KLWZvbygxMTEuMjIyKTsNCi1mb28obmV3 IFN0ZGNsYXNzKTsNCi1mb28odG1wZmlsZSgpKTsNCi0NCi0/Pg0KLS0tRVhQ RUNURi0tDQotaW50KDEpDQotYm9vbCh0cnVlKQ0KLXN0cmluZyglZCkgIkFy Z3VtZW50IDEgcGFzc2VkIHRvIGZvbygpIG11c3QgYmUgb2YgdGhlIHR5cGUg c2NhbGFyLCBudWxsIGdpdmVuLCBjYWxsZWQgaW4gJXMgb24gbGluZSAlZCBh bmQgZGVmaW5lZCINCi1OVUxMDQotc3RyaW5nKCVkKSAiQXJndW1lbnQgMSBw YXNzZWQgdG8gZm9vKCkgbXVzdCBiZSBvZiB0aGUgdHlwZSBzY2FsYXIsIGFy cmF5IGdpdmVuLCBjYWxsZWQgaW4gJXMgb24gbGluZSAlZCBhbmQgZGVmaW5l ZCINCi1hcnJheSgxKSB7DQotICBbMF09Pg0KLSAgaW50KDEpDQotfQ0KLXN0 cmluZygzKSAiZm9vIg0KLWZsb2F0KDExMS4yMjIpDQotc3RyaW5nKCVkKSAi QXJndW1lbnQgMSBwYXNzZWQgdG8gZm9vKCkgbXVzdCBiZSBvZiB0aGUgdHlw ZSBzY2FsYXIsIG9iamVjdCBnaXZlbiwgY2FsbGVkIGluICVzIG9uIGxpbmUg JWQgYW5kIGRlZmluZWQiDQotb2JqZWN0KHN0ZENsYXNzKSMxICgwKSB7DQot fQ0KLXN0cmluZyglZCkgIkFyZ3VtZW50IDEgcGFzc2VkIHRvIGZvbygpIG11 c3QgYmUgb2YgdGhlIHR5cGUgc2NhbGFyLCByZXNvdXJjZSBnaXZlbiwgY2Fs bGVkIGluICVzIG9uIGxpbmUgJWQgYW5kIGRlZmluZWQiDQotcmVzb3VyY2Uo NCkgb2YgdHlwZSAoc3RyZWFtKQ0KSW5kZXg6IFplbmQvdGVzdHMvaGludC9w YXJhbV90eXBlX2hpbnRfMDAxLnBocHQNCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCi0tLSBaZW5kL3Rlc3RzL2hpbnQvcGFyYW1fdHlwZV9oaW50XzAwMS5w aHB0CShyZXZpc2lvbiAzMDI4ODUpDQorKysgWmVuZC90ZXN0cy9oaW50L3Bh cmFtX3R5cGVfaGludF8wMDEucGhwdAkod29ya2luZyBjb3B5KQ0KQEAgLTEs MzggKzAsMCBAQA0KLS0tVEVTVC0tDQotUGFyYW1ldGVyIHR5cGUgaGludCAt IFRlc3RpbmcgaW50ZWdlciBoaW50DQotLS1GSUxFLS0NCi08P3BocA0KLQ0K LWZ1bmN0aW9uIHRlc3RfaW50KCR4LCBpbnQgJGEgPSAxKSB7DQotfQ0KLQ0K LXRlc3RfaW50KDEpOw0KLXByaW50ICJPa1xuIjsNCi0NCi10ZXN0X2ludCgn MTIxMScpOw0KLXByaW50ICJPa1xuIjsNCi0NCi10ZXN0X2ludChudWxsKTsN Ci1wcmludCAiT2tcbiI7DQotDQotdGVzdF9pbnQoMSwgMSk7DQotcHJpbnQg Ik9rXG4iOw0KLQ0KLXRlc3RfaW50KG51bGwsICcxMjExJyk7DQotcHJpbnQg Ik9rXG4iOw0KLQ0KLT8+DQotLS1FWFBFQ1RGLS0NCi1Paw0KLU9rDQotT2sN Ci1Paw0KLQ0KLUNhdGNoYWJsZSBmYXRhbCBlcnJvcjogQXJndW1lbnQgMiBw YXNzZWQgdG8gdGVzdF9pbnQoKSBtdXN0IGJlIG9mIHRoZSB0eXBlIGludGVn ZXIsIHN0cmluZyBnaXZlbiwgY2FsbGVkIGluICVzIG9uIGxpbmUgJWQgYW5k IGRlZmluZWQgaW4gJXMgb24gbGluZSAlZA0KLS0tVUVYUEVDVEYtLQ0KLU9r DQotT2sNCi1Paw0KLU9rDQotDQotQ2F0Y2hhYmxlIGZhdGFsIGVycm9yOiBB cmd1bWVudCAyIHBhc3NlZCB0byB0ZXN0X2ludCgpIG11c3QgYmUgb2YgdGhl IHR5cGUgaW50ZWdlciwgVW5pY29kZSBzdHJpbmcgZ2l2ZW4sIGNhbGxlZCBp biAlcyBvbiBsaW5lICVkIGFuZCBkZWZpbmVkIGluICVzIG9uIGxpbmUgJWQN CkluZGV4OiBaZW5kL3Rlc3RzL2hpbnQvcGFyYW1fdHlwZV9oaW50XzAxMS5w aHB0DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gWmVuZC90ZXN0cy9o aW50L3BhcmFtX3R5cGVfaGludF8wMTEucGhwdAkocmV2aXNpb24gMzAyODg1 KQ0KKysrIFplbmQvdGVzdHMvaGludC9wYXJhbV90eXBlX2hpbnRfMDExLnBo cHQJKHdvcmtpbmcgY29weSkNCkBAIC0xLDE1ICswLDAgQEANCi0tLVRFU1Qt LQ0KLVBhcmFtZXRlciB0eXBlIGhpbnQgLSBUZXN0aW5nIHdpdGggdW5kZWZp bmVkIHZhcmlhYmxlDQotLS1GSUxFLS0NCi08P3BocA0KLQ0KLWZ1bmN0aW9u IHRlc3Qoc3RyaW5nICRhKSB7DQotfQ0KLQ0KLXRlc3QoJHgpOw0KLQ0KLT8+ DQotLS1FWFBFQ1RGLS0NCi1Ob3RpY2U6IFVuZGVmaW5lZCB2YXJpYWJsZTog eCBpbiAlcyBvbiBsaW5lICVkDQotDQotQ2F0Y2hhYmxlIGZhdGFsIGVycm9y OiBBcmd1bWVudCAxIHBhc3NlZCB0byB0ZXN0KCkgbXVzdCBiZSBvZiB0aGUg dHlwZSBzdHJpbmcsIG51bGwgZ2l2ZW4sIGNhbGxlZCBpbiAlcyBvbiBsaW5l ICVkIGFuZCBkZWZpbmVkIGluICVzIG9uIGxpbmUgJWQNCkluZGV4OiBaZW5k L3plbmRfdm1fZGVmLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBa ZW5kL3plbmRfdm1fZGVmLmgJKHJldmlzaW9uIDMwMjg4NSkNCisrKyBaZW5k L3plbmRfdm1fZGVmLmgJKHdvcmtpbmcgY29weSkNCkBAIC0yNTg2LDcgKzI1 ODYsNyBAQA0KIAkJCXVsb25nIGFyZ19jb3VudCA9IG9wbGluZS0+ZXh0ZW5k ZWRfdmFsdWU7DQogDQogCQkJd2hpbGUgKGFyZ19jb3VudD4wKSB7DQotCQkJ CXplbmRfdmVyaWZ5X2FyZ190eXBlKGZiYywgKytpLCAqKHAtYXJnX2NvdW50 KSwgMCBUU1JNTFNfQ0MpOw0KKwkJCQl6ZW5kX3ZlcmlmeV9hcmdfdHlwZShm YmMsICsraSwgcC1hcmdfY291bnQsIDAgVFNSTUxTX0NDKTsNCiAJCQkJYXJn X2NvdW50LS07DQogCQkJfQ0KIAkJfQ0KQEAgLTMxMTEsNyArMzExMSw3IEBA DQogCX0gZWxzZSB7DQogCQl6dmFsICoqdmFyX3B0cjsNCiANCi0JCXplbmRf dmVyaWZ5X2FyZ190eXBlKCh6ZW5kX2Z1bmN0aW9uICopIEVHKGFjdGl2ZV9v cF9hcnJheSksIGFyZ19udW0sICpwYXJhbSwgb3BsaW5lLT5leHRlbmRlZF92 YWx1ZSBUU1JNTFNfQ0MpOw0KKwkJemVuZF92ZXJpZnlfYXJnX3R5cGUoKHpl bmRfZnVuY3Rpb24gKikgRUcoYWN0aXZlX29wX2FycmF5KSwgYXJnX251bSwg cGFyYW0sIG9wbGluZS0+ZXh0ZW5kZWRfdmFsdWUgVFNSTUxTX0NDKTsNCiAJ CXZhcl9wdHIgPSBfZ2V0X3p2YWxfcHRyX3B0cl9jdl9CUF9WQVJfVyhFWF9D VnMoKSwgb3BsaW5lLT5yZXN1bHQudmFyIFRTUk1MU19DQyk7DQogCQlaX0RF TFJFRl9QUCh2YXJfcHRyKTsNCiAJCSp2YXJfcHRyID0gKnBhcmFtOw0KQEAg LTMxNDcsNyArMzE0Nyw3IEBADQogCQlaX0FERFJFRl9QKGFzc2lnbm1lbnRf dmFsdWUpOw0KIAl9DQogDQotCXplbmRfdmVyaWZ5X2FyZ190eXBlKCh6ZW5k X2Z1bmN0aW9uICopIEVHKGFjdGl2ZV9vcF9hcnJheSksIGFyZ19udW0sIGFz c2lnbm1lbnRfdmFsdWUsIG9wbGluZS0+ZXh0ZW5kZWRfdmFsdWUgVFNSTUxT X0NDKTsNCisJemVuZF92ZXJpZnlfYXJnX3R5cGUoKHplbmRfZnVuY3Rpb24g KikgRUcoYWN0aXZlX29wX2FycmF5KSwgYXJnX251bSwgJmFzc2lnbm1lbnRf dmFsdWUsIG9wbGluZS0+ZXh0ZW5kZWRfdmFsdWUgVFNSTUxTX0NDKTsNCiAJ dmFyX3B0ciA9IF9nZXRfenZhbF9wdHJfcHRyX2N2X0JQX1ZBUl9XKEVYX0NW cygpLCBvcGxpbmUtPnJlc3VsdC52YXIgVFNSTUxTX0NDKTsNCiAJWl9ERUxS RUZfUFAodmFyX3B0cik7DQogCSp2YXJfcHRyID0gYXNzaWdubWVudF92YWx1 ZTsNCkluZGV4OiBaZW5kL3plbmRfdm1fZXhlY3V0ZS5oDQo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQotLS0gWmVuZC96ZW5kX3ZtX2V4ZWN1dGUuaAkocmV2 aXNpb24gMzAyODg1KQ0KKysrIFplbmQvemVuZF92bV9leGVjdXRlLmgJKHdv cmtpbmcgY29weSkNCkBAIC02MjgsNyArNjI4LDcgQEANCiAJCQl1bG9uZyBh cmdfY291bnQgPSBvcGxpbmUtPmV4dGVuZGVkX3ZhbHVlOw0KIA0KIAkJCXdo aWxlIChhcmdfY291bnQ+MCkgew0KLQkJCQl6ZW5kX3ZlcmlmeV9hcmdfdHlw ZShmYmMsICsraSwgKihwLWFyZ19jb3VudCksIDAgVFNSTUxTX0NDKTsNCisJ CQkJemVuZF92ZXJpZnlfYXJnX3R5cGUoZmJjLCArK2ksIHAtYXJnX2NvdW50 LCAwIFRTUk1MU19DQyk7DQogCQkJCWFyZ19jb3VudC0tOw0KIAkJCX0NCiAJ CX0NCkBAIC03NzgsNyArNzc4LDcgQEANCiAJfSBlbHNlIHsNCiAJCXp2YWwg Kip2YXJfcHRyOw0KIA0KLQkJemVuZF92ZXJpZnlfYXJnX3R5cGUoKHplbmRf ZnVuY3Rpb24gKikgRUcoYWN0aXZlX29wX2FycmF5KSwgYXJnX251bSwgKnBh cmFtLCBvcGxpbmUtPmV4dGVuZGVkX3ZhbHVlIFRTUk1MU19DQyk7DQorCQl6 ZW5kX3ZlcmlmeV9hcmdfdHlwZSgoemVuZF9mdW5jdGlvbiAqKSBFRyhhY3Rp dmVfb3BfYXJyYXkpLCBhcmdfbnVtLCBwYXJhbSwgb3BsaW5lLT5leHRlbmRl ZF92YWx1ZSBUU1JNTFNfQ0MpOw0KIAkJdmFyX3B0ciA9IF9nZXRfenZhbF9w dHJfcHRyX2N2X0JQX1ZBUl9XKEVYX0NWcygpLCBvcGxpbmUtPnJlc3VsdC52 YXIgVFNSTUxTX0NDKTsNCiAJCVpfREVMUkVGX1BQKHZhcl9wdHIpOw0KIAkJ KnZhcl9wdHIgPSAqcGFyYW07DQpAQCAtMTI5NCw3ICsxMjk0LDcgQEANCiAJ CVpfQUREUkVGX1AoYXNzaWdubWVudF92YWx1ZSk7DQogCX0NCiANCi0JemVu ZF92ZXJpZnlfYXJnX3R5cGUoKHplbmRfZnVuY3Rpb24gKikgRUcoYWN0aXZl X29wX2FycmF5KSwgYXJnX251bSwgYXNzaWdubWVudF92YWx1ZSwgb3BsaW5l LT5leHRlbmRlZF92YWx1ZSBUU1JNTFNfQ0MpOw0KKwl6ZW5kX3ZlcmlmeV9h cmdfdHlwZSgoemVuZF9mdW5jdGlvbiAqKSBFRyhhY3RpdmVfb3BfYXJyYXkp LCBhcmdfbnVtLCAmYXNzaWdubWVudF92YWx1ZSwgb3BsaW5lLT5leHRlbmRl ZF92YWx1ZSBUU1JNTFNfQ0MpOw0KIAl2YXJfcHRyID0gX2dldF96dmFsX3B0 cl9wdHJfY3ZfQlBfVkFSX1coRVhfQ1ZzKCksIG9wbGluZS0+cmVzdWx0LnZh ciBUU1JNTFNfQ0MpOw0KIAlaX0RFTFJFRl9QUCh2YXJfcHRyKTsNCiAJKnZh cl9wdHIgPSBhc3NpZ25tZW50X3ZhbHVlOw0KSW5kZXg6IG1haW4vbWFpbi5j DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gbWFpbi9tYWluLmMJKHJl dmlzaW9uIDMwMjg4NSkNCisrKyBtYWluL21haW4uYwkod29ya2luZyBjb3B5 KQ0KQEAgLTE4ODUsNiArMTg4NSw3IEBADQogCXp1Zi52c3BwcmludGZfZnVu Y3Rpb24gPSB2c3BwcmludGY7DQogCXp1Zi5nZXRlbnZfZnVuY3Rpb24gPSBz YXBpX2dldGVudjsNCiAJenVmLnJlc29sdmVfcGF0aF9mdW5jdGlvbiA9IHBo cF9yZXNvbHZlX3BhdGhfZm9yX3plbmQ7DQorCXp1Zi52ZXJpZnlfYXJnX3R5 cGVfZnVuY3Rpb24gPSB6ZW5kX29yaWdpbmFsX3ZlcmlmeV9hcmdfdHlwZTsN CiAJemVuZF9zdGFydHVwKCZ6dWYsIE5VTEwgVFNSTUxTX0NDKTsNCiANCiAj aWZkZWYgWlRTDQo= --8323329-662644695-1283693350=:24012--