Received: from magus.postgresql.org (magus.postgresql.org [87.238.57.229]) by mail.postgresql.org (Postfix) with ESMTP id 81145C3830E for ; Thu, 14 Jun 2012 09:30:30 -0300 (ADT) Received: from mail-pb0-f46.google.com ([209.85.160.46]) by magus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1Sf9Bo-00010s-Pl for pgsql-hackers@postgresql.org; Thu, 14 Jun 2012 12:30:29 +0000 Received: by pbbrp8 with SMTP id rp8so3743649pbb.19 for ; Thu, 14 Jun 2012 05:30:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject :content-type; bh=F3Q03CuvddpGXMBFNVR3hbxESB5EcXKWQKoyefQiaT8=; b=ApZ4L8jS62cwJTteQD+oR6hDSF4fkTmftP/LdiuRFhscYHGbwl5lprFAdBXXU/00Vi b+taREW29SsVXZQOCjvc1NBb0rcsMn6eWqFZxe3NGFTaEVMEgoBI4qiYSjNeCDbFfsCR FdmS0QtZIZEM1GvSLucRcno9xqmSnjuGJ9WIVpa8YYHf1/SEBlnp5r9sfUyDLFI1ySa7 THXECttvJF1SlfZ1sxKyUscGyHzkXzdHPLrLb572aQEB/vtrukdclbLs5jMe23+jsAXn DV6osrx5wmsY3Z9+rbExh05WqPxqE3RlbbMIpReChkD35fKgqmwztKDL+1eGyrcC51N7 oyag== Received: by 10.68.226.168 with SMTP id rt8mr8093946pbc.23.1339677003202; Thu, 14 Jun 2012 05:30:03 -0700 (PDT) Received: from [192.168.1.99] ([61.199.203.168]) by mx.google.com with ESMTPS id hc7sm9372974pbc.54.2012.06.14.05.30.00 (version=SSLv3 cipher=OTHER); Thu, 14 Jun 2012 05:30:01 -0700 (PDT) Message-ID: <4FD9D947.1020803@gmail.com> Date: Thu, 14 Jun 2012 21:29:59 +0900 From: Shigeru HANADA User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20120428 Thunderbird/12.0.1 MIME-Version: 1.0 To: PostgreSQL-development Subject: pgsql_fdw in contrib Content-Type: multipart/mixed; boundary="------------000707040002070205070603" X-Pg-Spam-Score: -2.7 (--) X-Archive-Number: 201206/628 X-Sequence-Number: 209468 This is a multi-part message in MIME format. --------------000707040002070205070603 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit I'd like to propose pgsql_fdw, FDW for PostgreSQL, as a contrib module in core, again. This patch is basically rebased version of the patches proposed in 9.2 development cycle, and contains some additional changes such as concern about volatile variables for PG_CATCH blocks. In addition, I combined old three patches (pgsql_fdw core functionality, push-down support, and analyze support) into one patch for ease of review. (I think these features are necessary for pgsql_fdw use.) After the development for 9.2 cycle, pgsql_fdw can gather statistics from remote side by providing sampling function to analyze module in backend core, use them to estimate selectivity of WHERE clauses which will be pushed-down, and retrieve query results from remote side with custom row processor which prevents memory exhaustion from huge result set. It would be possible to add some more features, such as ORDER BY push-down with index information support, without changing existing APIs, but at first add relatively simple pgsql_fdw and enhance it seems better. In addition, once pgsql_fdw has been merged, it would help implementing proof-of-concept of SQL/MED-related features. Regards, -- Shigeru HANADA --------------000707040002070205070603 Content-Type: text/plain; charset=Shift_JIS; name="pgsql_fdw.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pgsql_fdw.patch" ZGlmZiAtLWdpdCBhL2NvbnRyaWIvTWFrZWZpbGUgYi9jb250cmliL01ha2VmaWxlCmluZGV4 IGQyMzA0NTEuLjliYzM1ZGQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvTWFrZWZpbGUKKysrIGIv Y29udHJpYi9NYWtlZmlsZQpAQCAtNDIsNiArNDIsNyBAQCBTVUJESVJTID0gXAogCQlwZ2Jl bmNoCQlcCiAJCXBnY3J5cHRvCVwKIAkJcGdyb3dsb2NrcwlcCisJCXBnc3FsX2ZkdwlcCiAJ CXBnc3RhdHR1cGxlCVwKIAkJc2VnCQlcCiAJCXNwaQkJXApkaWZmIC0tZ2l0IGEvY29udHJp Yi9wZ3NxbF9mZHcvLmdpdGlnbm9yZSBiL2NvbnRyaWIvcGdzcWxfZmR3Ly5naXRpZ25vcmUK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1NDcyOAotLS0gL2Rldi9u dWxsCisrKyBiL2NvbnRyaWIvcGdzcWxfZmR3Ly5naXRpZ25vcmUKQEAgLTAsMCArMSw0IEBA CisjIEdlbmVyYXRlZCBzdWJkaXJlY3RvcmllcworL3Jlc3VsdHMvCisqLm8KKyouc28KZGlm ZiAtLWdpdCBhL2NvbnRyaWIvcGdzcWxfZmR3L01ha2VmaWxlIGIvY29udHJpYi9wZ3NxbF9m ZHcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4MTM2 NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcGdzcWxfZmR3L01ha2VmaWxlCkBAIC0w LDAgKzEsMjIgQEAKKyMgY29udHJpYi9wZ3NxbF9mZHcvTWFrZWZpbGUKKworTU9EVUxFX2Jp ZyA9IHBnc3FsX2ZkdworT0JKUwk9IHBnc3FsX2Zkdy5vIG9wdGlvbi5vIGRlcGFyc2UubyBj b25uZWN0aW9uLm8KK1BHX0NQUEZMQUdTID0gLUkkKGxpYnBxX3NyY2RpcikKK1NITElCX0xJ TksgPSAkKGxpYnBxKQorCitFWFRFTlNJT04gPSBwZ3NxbF9mZHcKK0RBVEEgPSBwZ3NxbF9m ZHctLTEuMC5zcWwKKworUkVHUkVTUyA9IHBnc3FsX2ZkdworCitpZmRlZiBVU0VfUEdYUwor UEdfQ09ORklHID0gcGdfY29uZmlnCitQR1hTIDo9ICQoc2hlbGwgJChQR19DT05GSUcpIC0t cGd4cykKK2luY2x1ZGUgJChQR1hTKQorZWxzZQorc3ViZGlyID0gY29udHJpYi9wZ3NxbF9m ZHcKK3RvcF9idWlsZGRpciA9IC4uLy4uCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9zcmMv TWFrZWZpbGUuZ2xvYmFsCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29udHJpYi9jb250cmli LWdsb2JhbC5taworZW5kaWYKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdzcWxfZmR3L2Nvbm5l Y3Rpb24uYyBiL2NvbnRyaWIvcGdzcWxfZmR3L2Nvbm5lY3Rpb24uYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2I0NDhiCi0tLSAvZGV2L251bGwKKysrIGIvY29u dHJpYi9wZ3NxbF9mZHcvY29ubmVjdGlvbi5jCkBAIC0wLDAgKzEsNTU1IEBACisvKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqCisgKiBjb25uZWN0aW9uLmMKKyAqCQkgIENvbm5lY3Rpb24g bWFuYWdlbWVudCBmb3IgcGdzcWxfZmR3CisgKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChj KSAyMDEyLCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAqIElE RU5USUZJQ0FUSU9OCisgKgkJICBjb250cmliL3Bnc3FsX2Zkdy9jb25uZWN0aW9uLmMKKyAq CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgInBvc3RncmVzLmgiCisK KyNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlwZS5o IgorI2luY2x1ZGUgImZvcmVpZ24vZm9yZWlnbi5oIgorI2luY2x1ZGUgImZ1bmNhcGkuaCIK KyNpbmNsdWRlICJsaWJwcS1mZS5oIgorI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgiCisjaW5j bHVkZSAibWlzY2FkbWluLmgiCisjaW5jbHVkZSAidXRpbHMvYXJyYXkuaCIKKyNpbmNsdWRl ICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL2hzZWFyY2guaCIKKyNpbmNs dWRlICJ1dGlscy9tZW11dGlscy5oIgorI2luY2x1ZGUgInV0aWxzL3Jlc293bmVyLmgiCisj aW5jbHVkZSAidXRpbHMvdHVwbGVzdG9yZS5oIgorCisjaW5jbHVkZSAicGdzcWxfZmR3Lmgi CisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CisgKiBDb25uZWN0aW9uIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisgKiA9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PSovCisKKy8qCisgKiBDb25uZWN0aW9uIGNhY2hlIGVudHJ5IG1hbmFnZWQgd2l0 aCBoYXNoIHRhYmxlLgorICovCit0eXBlZGVmIHN0cnVjdCBDb25uQ2FjaGVFbnRyeQorewor CS8qIGhhc2gga2V5IG11c3QgYmUgZmlyc3QgKi8KKwlPaWQJCQkJc2VydmVyaWQ7CS8qIG9p ZCBvZiBmb3JlaWduIHNlcnZlciAqLworCU9pZAkJCQl1c2VyaWQ7CQkvKiBvaWQgb2YgbG9j YWwgdXNlciAqLworCisJYm9vbAkJCXVzZV90eDsJCS8qIHRydWUgd2hlbiB1c2luZyByZW1v dGUgdHJhbnNhY3Rpb24gKi8KKwlpbnQJCQkJcmVmczsJCS8qIHJlZmVyZW5jZSBjb3VudGVy ICovCisJUEdjb25uCQkgICAqY29ubjsJCS8qIGZvcmVpZ24gc2VydmVyIGNvbm5lY3Rpb24g Ki8KK30gQ29ubkNhY2hlRW50cnk7CisKKy8qCisgKiBIYXNoIHRhYmxlIHdoaWNoIGlzIHVz ZWQgdG8gY2FjaGUgY29ubmVjdGlvbiB0byBQb3N0Z3JlU1FMIHNlcnZlcnMsIHdpbGwgYmUK KyAqIGluaXRpYWxpemVkIGJlZm9yZSBmaXJzdCBhdHRlbXB0IHRvIGNvbm5lY3QgUG9zdGdy ZVNRTCBzZXJ2ZXIgYnkgdGhlIGJhY2tlbmQuCisgKi8KK3N0YXRpYyBIVEFCICpGU0Nvbm5l Y3Rpb25IYXNoOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBwcm90b3R5cGUg b2YgcHJpdmF0ZSBmdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRp YyB2b2lkCitjbGVhbnVwX2Nvbm5lY3Rpb24oUmVzb3VyY2VSZWxlYXNlUGhhc2UgcGhhc2Us CisJCQkJICAgYm9vbCBpc0NvbW1pdCwKKwkJCQkgICBib29sIGlzVG9wTGV2ZWwsCisJCQkJ ICAgdm9pZCAqYXJnKTsKK3N0YXRpYyBQR2Nvbm4gKmNvbm5lY3RfcGdfc2VydmVyKEZvcmVp Z25TZXJ2ZXIgKnNlcnZlciwgVXNlck1hcHBpbmcgKnVzZXIpOworc3RhdGljIHZvaWQgYmVn aW5fcmVtb3RlX3R4KFBHY29ubiAqY29ubik7CitzdGF0aWMgdm9pZCBhYm9ydF9yZW1vdGVf dHgoUEdjb25uICpjb25uKTsKKworLyoKKyAqIEdldCBhIFBHY29ubiB3aGljaCBjYW4gYmUg dXNlZCB0byBleGVjdXRlIGZvcmVpZ24gcXVlcnkgb24gdGhlIHJlbW90ZQorICogUG9zdGdy ZVNRTCBzZXJ2ZXIgd2l0aCB0aGUgdXNlcidzIGF1dGhvcml6YXRpb24uICBJZiB0aGlzIHdh cyB0aGUgZmlyc3QKKyAqIHJlcXVlc3QgZm9yIHRoZSBzZXJ2ZXIsIG5ldyBjb25uZWN0aW9u IGlzIGVzdGFibGlzaGVkLgorICoKKyAqIFdoZW4gdXNlX3R4IGlzIHRydWUsIHJlbW90ZSB0 cmFuc2FjdGlvbiBpcyBzdGFydGVkIGlmIGNhbGxlciBpcyB0aGUgb25seQorICogdXNlciBv ZiB0aGUgY29ubmVjdGlvbi4gIElzb2xhdGlvbiBsZXZlbCBvZiB0aGUgcmVtb3RlIHRyYW5z YWN0aW9uIGlzIHNhbWUKKyAqIGFzIGxvY2FsIHRyYW5zYWN0aW9uLCBhbmQgcmVtb3RlIHRy YW5zYWN0aW9uIHdpbGwgYmUgYWJvcnRlZCB3aGVuIGxhc3QKKyAqIHVzZXIgcmVsZWFzZS4K KyAqCisgKiBUT0RPOiBOb3RlIHRoYXQgY2FjaGluZyBjb25uZWN0aW9ucyByZXF1aXJlcyBh IG1lY2hhbmlzbSB0byBkZXRlY3QgY2hhbmdlIG9mCisgKiBGRFcgb2JqZWN0IHRvIGludmFs aWRhdGUgYWxyZWFkeSBlc3RhYmxpc2hlZCBjb25uZWN0aW9ucy4KKyAqLworUEdjb25uICoK K0dldENvbm5lY3Rpb24oRm9yZWlnblNlcnZlciAqc2VydmVyLCBVc2VyTWFwcGluZyAqdXNl ciwgYm9vbCB1c2VfdHgpCit7CisJYm9vbAkJCWZvdW5kOworCUNvbm5DYWNoZUVudHJ5ICpl bnRyeTsKKwlDb25uQ2FjaGVFbnRyeQlrZXk7CisKKwkvKiBpbml0aWFsaXplIGNvbm5lY3Rp b24gY2FjaGUgaWYgaXQgaXNuJ3QgKi8KKwlpZiAoRlNDb25uZWN0aW9uSGFzaCA9PSBOVUxM KQorCXsKKwkJSEFTSENUTAkJY3RsOworCisJCS8qIGhhc2gga2V5IGlzIGEgcGFpciBvZiBv aWRzOiBzZXJ2ZXJpZCBhbmQgdXNlcmlkICovCisJCU1lbVNldCgmY3RsLCAwLCBzaXplb2Yo Y3RsKSk7CisJCWN0bC5rZXlzaXplID0gc2l6ZW9mKE9pZCkgKyBzaXplb2YoT2lkKTsKKwkJ Y3RsLmVudHJ5c2l6ZSA9IHNpemVvZihDb25uQ2FjaGVFbnRyeSk7CisJCWN0bC5oYXNoID0g dGFnX2hhc2g7CisJCWN0bC5tYXRjaCA9IG1lbWNtcDsKKwkJY3RsLmtleWNvcHkgPSBtZW1j cHk7CisJCS8qIGFsbG9jYXRlIEZTQ29ubmVjdGlvbkhhc2ggaW4gdGhlIGNhY2hlIGNvbnRl eHQgKi8KKwkJY3RsLmhjeHQgPSBDYWNoZU1lbW9yeUNvbnRleHQ7CisJCUZTQ29ubmVjdGlv bkhhc2ggPSBoYXNoX2NyZWF0ZSgiRm9yZWlnbiBDb25uZWN0aW9ucyIsIDMyLAorCQkJCQkJ CQkJICAgJmN0bCwKKwkJCQkJCQkJCSAgIEhBU0hfRUxFTSB8IEhBU0hfQ09OVEVYVCB8CisJ CQkJCQkJCQkgICBIQVNIX0ZVTkNUSU9OIHwgSEFTSF9DT01QQVJFIHwKKwkJCQkJCQkJCSAg IEhBU0hfS0VZQ09QWSk7CisJfQorCisJLyogQ3JlYXRlIGtleSB2YWx1ZSBmb3IgdGhlIGVu dHJ5LiAqLworCU1lbVNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7CisJa2V5LnNlcnZlcmlk ID0gc2VydmVyLT5zZXJ2ZXJpZDsKKwlrZXkudXNlcmlkID0gR2V0T3V0ZXJVc2VySWQoKTsK KworCS8qCisJICogRmluZCBjYWNoZWQgZW50cnkgZm9yIHJlcXVlc3RlZCBjb25uZWN0aW9u LiAgSWYgd2UgY291bGRuJ3QgZmluZCwKKwkgKiBjYWxsYmFjayBmdW5jdGlvbiBvZiBSZXNv dXJjZU93bmVyIHNob3VsZCBiZSByZWdpc3RlcmVkIHRvIGNsZWFuIHRoZQorCSAqIGNvbm5l Y3Rpb24gdXAgb24gZXJyb3IgaW5jbHVkaW5nIHVzZXIgaW50ZXJydXB0LgorCSAqLworCWVu dHJ5ID0gaGFzaF9zZWFyY2goRlNDb25uZWN0aW9uSGFzaCwgJmtleSwgSEFTSF9FTlRFUiwg JmZvdW5kKTsKKwlpZiAoIWZvdW5kKQorCXsKKwkJZW50cnktPnJlZnMgPSAwOworCQllbnRy eS0+dXNlX3R4ID0gZmFsc2U7CisJCWVudHJ5LT5jb25uID0gTlVMTDsKKwkJUmVnaXN0ZXJS ZXNvdXJjZVJlbGVhc2VDYWxsYmFjayhjbGVhbnVwX2Nvbm5lY3Rpb24sIGVudHJ5KTsKKwl9 CisKKwkvKgorCSAqIFdlIGRvbid0IGNoZWNrIHRoZSBoZWFsdGggb2YgY2FjaGVkIGNvbm5l Y3Rpb24gaGVyZSwgYmVjYXVzZSBpdCB3b3VsZAorCSAqIHJlcXVpcmUgc29tZSBvdmVyaGVh ZC4gIEJyb2tlbiBjb25uZWN0aW9uIGFuZCBpdHMgY2FjaGUgZW50cnkgd2lsbCBiZQorCSAq IGNsZWFuZWQgdXAgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBhY3R1YWxseSB1c2VkLgorCSAq LworCisJLyoKKwkgKiBJZiBjYWNoZSBlbnRyeSBkb2Vzbid0IGhhdmUgY29ubmVjdGlvbiwg d2UgaGF2ZSB0byBlc3RhYmxpc2ggbmV3CisJICogY29ubmVjdGlvbi4KKwkgKi8KKwlpZiAo ZW50cnktPmNvbm4gPT0gTlVMTCkKKwl7CisJCS8qCisJCSAqIFVzZSBQR19UUlkgYmxvY2sg dG8gZW5zdXJlIGNsb3NpbmcgY29ubmVjdGlvbiBvbiBlcnJvci4KKwkJICovCisJCVBHX1RS WSgpOworCQl7CisJCQkvKgorCQkJICogQ29ubmVjdCB0byB0aGUgZm9yZWlnbiBQb3N0Z3Jl U1FMIHNlcnZlciwgYW5kIHN0b3JlIGl0IGluIGNhY2hlCisJCQkgKiBlbnRyeSB0byBrZWVw IG5ldyBjb25uZWN0aW9uLgorCQkJICogTm90ZToga2V5IGl0ZW1zIG9mIGVudHJ5IGhhcyBh bHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgaW4KKwkJCSAqIGhhc2hfc2VhcmNoKEhBU0hfRU5U RVIpLgorCQkJICovCisJCQllbnRyeS0+Y29ubiA9IGNvbm5lY3RfcGdfc2VydmVyKHNlcnZl ciwgdXNlcik7CisJCX0KKwkJUEdfQ0FUQ0goKTsKKwkJeworCQkJLyogQ2xlYXIgY29ubmVj dGlvbiBjYWNoZSBlbnRyeSBvbiBlcnJvciBjYXNlLiAqLworCQkJUFFmaW5pc2goZW50cnkt PmNvbm4pOworCQkJZW50cnktPnJlZnMgPSAwOworCQkJZW50cnktPnVzZV90eCA9IGZhbHNl OworCQkJZW50cnktPmNvbm4gPSBOVUxMOworCQkJUEdfUkVfVEhST1coKTsKKwkJfQorCQlQ R19FTkRfVFJZKCk7CisJfQorCisJLyogSW5jcmVhc2UgY29ubmVjdGlvbiByZWZlcmVuY2Ug Y291bnRlci4gKi8KKwllbnRyeS0+cmVmcysrOworCisJLyoKKwkgKiBJZiByZXF1ZXN0ZXIg aXMgdGhlIG9ubHkgcmVmZXJyZXIgb2YgdGhpcyBjb25uZWN0aW9uLCBzdGFydCB0cmFuc2Fj dGlvbgorCSAqIHdpdGggdGhlIHNhbWUgaXNvbGF0aW9uIGxldmVsIGFzIHRoZSBsb2NhbCB0 cmFuc2FjdGlvbiB3ZSBhcmUgaW4uCisJICogV2UgbmVlZCB0byByZW1lbWJlciB3aGV0aGVy IHRoaXMgY29ubmVjdGlvbiB1c2VzIHJlbW90ZSB0cmFuc2FjdGlvbiB0bworCSAqIGFib3J0 IGl0IHdoZW4gdGhpcyBjb25uZWN0aW9uIGlzIHJlbGVhc2VkIGNvbXBsZXRlbHkuCisJICov CisJaWYgKHVzZV90eCAmJiBlbnRyeS0+cmVmcyA9PSAxKQorCQliZWdpbl9yZW1vdGVfdHgo ZW50cnktPmNvbm4pOworCWVudHJ5LT51c2VfdHggPSB1c2VfdHg7CisKKworCXJldHVybiBl bnRyeS0+Y29ubjsKK30KKworLyoKKyAqIEZvciBub24tc3VwZXJ1c2VycywgaW5zaXN0IHRo YXQgdGhlIGNvbm5zdHIgc3BlY2lmeSBhIHBhc3N3b3JkLglUaGlzCisgKiBwcmV2ZW50cyBh IHBhc3N3b3JkIGZyb20gYmVpbmcgcGlja2VkIHVwIGZyb20gLnBncGFzcywgYSBzZXJ2aWNl IGZpbGUsCisgKiB0aGUgZW52aXJvbm1lbnQsIGV0Yy4gIFdlIGRvbid0IHdhbnQgdGhlIHBv c3RncmVzIHVzZXIncyBwYXNzd29yZHMKKyAqIHRvIGJlIGFjY2Vzc2libGUgdG8gbm9uLXN1 cGVydXNlcnMuCisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19jb25uX3BhcmFtcyhjb25zdCBj aGFyICoqa2V5d29yZHMsIGNvbnN0IGNoYXIgKip2YWx1ZXMpCit7CisJaW50CQkJaTsKKwor CS8qIG5vIGNoZWNrIHJlcXVpcmVkIGlmIHN1cGVydXNlciAqLworCWlmIChzdXBlcnVzZXIo KSkKKwkJcmV0dXJuOworCisJLyogb2sgaWYgcGFyYW1zIGNvbnRhaW4gYSBub24tZW1wdHkg cGFzc3dvcmQgKi8KKwlmb3IgKGkgPSAwOyBrZXl3b3Jkc1tpXSAhPSBOVUxMOyBpKyspCisJ eworCQlpZiAoc3RyY21wKGtleXdvcmRzW2ldLCAicGFzc3dvcmQiKSA9PSAwICYmIHZhbHVl c1tpXVswXSAhPSAnXDAnKQorCQkJcmV0dXJuOworCX0KKworCWVyZXBvcnQoRVJST1IsCisJ CSAgKGVycmNvZGUoRVJSQ09ERV9TX1JfRV9QUk9ISUJJVEVEX1NRTF9TVEFURU1FTlRfQVRU RU1QVEVEKSwKKwkJICAgZXJybXNnKCJwYXNzd29yZCBpcyByZXF1aXJlZCIpLAorCQkgICBl cnJkZXRhaWwoIk5vbi1zdXBlcnVzZXJzIG11c3QgcHJvdmlkZSBhIHBhc3N3b3JkIGluIHRo ZSBjb25uZWN0aW9uIHN0cmluZy4iKSkpOworfQorCitzdGF0aWMgUEdjb25uICoKK2Nvbm5l Y3RfcGdfc2VydmVyKEZvcmVpZ25TZXJ2ZXIgKnNlcnZlciwgVXNlck1hcHBpbmcgKnVzZXIp Cit7CisJY29uc3QgY2hhcgkgICAqY29ubmFtZSA9IHNlcnZlci0+c2VydmVybmFtZTsKKwlQ R2Nvbm4JCSAgICpjb25uOworCWNvbnN0IGNoYXIJICAqKmFsbF9rZXl3b3JkczsKKwljb25z dCBjaGFyCSAgKiphbGxfdmFsdWVzOworCWNvbnN0IGNoYXIJICAqKmtleXdvcmRzOworCWNv bnN0IGNoYXIJICAqKnZhbHVlczsKKwlpbnQJCQkJbjsKKwlpbnQJCQkJaSwgajsKKworCS8q CisJICogQ29uc3RydWN0IGNvbm5lY3Rpb24gcGFyYW1zIGZyb20gZ2VuZXJpYyBvcHRpb25z IG9mIEZvcmVpZ25TZXJ2ZXIgYW5kCisJICogVXNlck1hcHBpbmcuICBUaG9zZSB0d28gb2Jq ZWN0IGhvbGQgb25seSBsaWJwcSBvcHRpb25zLgorCSAqIEV4dHJhIDMgaXRlbXMgYXJlIGZv cjoKKwkgKiAgICopIGZhbGxiYWNrX2FwcGxpY2F0aW9uX25hbWUKKwkgKiAgICopIGNsaWVu dF9lbmNvZGluZworCSAqICAgKikgTlVMTCB0ZXJtaW5hdGlvbiAoZW5kIG1hcmtlcikKKwkg KgorCSAqIE5vdGU6IFdlIGRvbid0IG9taXQgYW55IHBhcmFtZXRlcnMgZXZlbiB0YXJnZXQg ZGF0YWJhc2UgbWlnaHQgYmUgb2xkZXIKKwkgKiB0aGFuIGxvY2FsLCBiZWNhdXNlIHVuZXhw ZWN0ZWQgcGFyYW1ldGVycyBhcmUganVzdCBpZ25vcmVkLgorCSAqLworCW4gPSBsaXN0X2xl bmd0aChzZXJ2ZXItPm9wdGlvbnMpICsgbGlzdF9sZW5ndGgodXNlci0+b3B0aW9ucykgKyAz OworCWFsbF9rZXl3b3JkcyA9IChjb25zdCBjaGFyICoqKSBwYWxsb2Moc2l6ZW9mKGNoYXIg KikgKiBuKTsKKwlhbGxfdmFsdWVzID0gKGNvbnN0IGNoYXIgKiopIHBhbGxvYyhzaXplb2Yo Y2hhciAqKSAqIG4pOworCWtleXdvcmRzID0gKGNvbnN0IGNoYXIgKiopIHBhbGxvYyhzaXpl b2YoY2hhciAqKSAqIG4pOworCXZhbHVlcyA9IChjb25zdCBjaGFyICoqKSBwYWxsb2Moc2l6 ZW9mKGNoYXIgKikgKiBuKTsKKwluID0gMDsKKwluICs9IEV4dHJhY3RDb25uZWN0aW9uT3B0 aW9ucyhzZXJ2ZXItPm9wdGlvbnMsCisJCQkJCQkJCSAgYWxsX2tleXdvcmRzICsgbiwgYWxs X3ZhbHVlcyArIG4pOworCW4gKz0gRXh0cmFjdENvbm5lY3Rpb25PcHRpb25zKHVzZXItPm9w dGlvbnMsCisJCQkJCQkJCSAgYWxsX2tleXdvcmRzICsgbiwgYWxsX3ZhbHVlcyArIG4pOwor CWFsbF9rZXl3b3Jkc1tuXSA9IGFsbF92YWx1ZXNbbl0gPSBOVUxMOworCisJZm9yIChpID0g MCwgaiA9IDA7IGFsbF9rZXl3b3Jkc1tpXTsgaSsrKQorCXsKKwkJa2V5d29yZHNbal0gPSBh bGxfa2V5d29yZHNbaV07CisJCXZhbHVlc1tqXSA9IGFsbF92YWx1ZXNbaV07CisJCWorKzsK Kwl9CisKKwkvKiBVc2UgInBnc3FsX2ZkdyIgYXMgZmFsbGJhY2tfYXBwbGljYXRpb25fbmFt ZS4gKi8KKwlrZXl3b3Jkc1tqXSA9ICJmYWxsYmFja19hcHBsaWNhdGlvbl9uYW1lIjsKKwl2 YWx1ZXNbaisrXSA9ICJwZ3NxbF9mZHciOworCisJLyogU2V0IGNsaWVudF9lbmNvZGluZyBz byB0aGF0IGxpYnBxIGNhbiBjb252ZXJ0IGVuY29kaW5nIHByb3Blcmx5LiAqLworCWtleXdv cmRzW2pdID0gImNsaWVudF9lbmNvZGluZyI7CisJdmFsdWVzW2orK10gPSBHZXREYXRhYmFz ZUVuY29kaW5nTmFtZSgpOworCisJa2V5d29yZHNbal0gPSB2YWx1ZXNbal0gPSBOVUxMOwor CXBmcmVlKGFsbF9rZXl3b3Jkcyk7CisJcGZyZWUoYWxsX3ZhbHVlcyk7CisKKwkvKiB2ZXJp ZnkgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGFuZCBkbyBjb25uZWN0ICovCisJY2hlY2tfY29u bl9wYXJhbXMoa2V5d29yZHMsIHZhbHVlcyk7CisJY29ubiA9IFBRY29ubmVjdGRiUGFyYW1z KGtleXdvcmRzLCB2YWx1ZXMsIDApOworCWlmICghY29ubiB8fCBQUXN0YXR1cyhjb25uKSAh PSBDT05ORUNUSU9OX09LKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNP REVfU1FMQ0xJRU5UX1VOQUJMRV9UT19FU1RBQkxJU0hfU1FMQ09OTkVDVElPTiksCisJCQkJ IGVycm1zZygiY291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIFwiJXNcIiIsIGNvbm5hbWUp LAorCQkJCSBlcnJkZXRhaWwoIiVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpKSk7CisJcGZy ZWUoa2V5d29yZHMpOworCXBmcmVlKHZhbHVlcyk7CisKKwkvKgorCSAqIENoZWNrIHRoYXQg bm9uLXN1cGVydXNlciBoYXMgdXNlZCBwYXNzd29yZCB0byBlc3RhYmxpc2ggY29ubmVjdGlv bi4KKwkgKiBUaGlzIGNoZWNrIGxvZ2ljIGlzIGJhc2VkIG9uIGRibGlua19zZWN1cml0eV9j aGVjaygpIGluIGNvbnRyaWIvZGJsaW5rLgorCSAqCisJICogWFhYIFNob3VsZCB3ZSBjaGVj ayB0aGlzIGV2ZW4gaWYgd2UgZG9uJ3QgcHJvdmlkZSB1bnNhZmUgdmVyc2lvbiBsaWtlCisJ ICogZGJsaW5rX2Nvbm5lY3RfdSgpPworCSAqLworCWlmICghc3VwZXJ1c2VyKCkgJiYgIVBR Y29ubmVjdGlvblVzZWRQYXNzd29yZChjb25uKSkKKwl7CisJCVBRZmluaXNoKGNvbm4pOwor CQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfU19SX0VfUFJPSElCSVRF RF9TUUxfU1RBVEVNRU5UX0FUVEVNUFRFRCksCisJCQkJIGVycm1zZygicGFzc3dvcmQgaXMg cmVxdWlyZWQiKSwKKwkJCQkgZXJyZGV0YWlsKCJOb24tc3VwZXJ1c2VyIGNhbm5vdCBjb25u ZWN0IGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgcmVxdWVzdCBhIHBhc3N3b3JkLiIpLAorCQkJ CSBlcnJoaW50KCJUYXJnZXQgc2VydmVyJ3MgYXV0aGVudGljYXRpb24gbWV0aG9kIG11c3Qg YmUgY2hhbmdlZC4iKSkpOworCX0KKworCXJldHVybiBjb25uOworfQorCisvKgorICogU3Rh cnQgcmVtb3RlIHRyYW5zYWN0aW9uIHdpdGggcHJvcGVyIGlzb2xhdGlvbiBsZXZlbC4KKyAq Lworc3RhdGljIHZvaWQKK2JlZ2luX3JlbW90ZV90eChQR2Nvbm4gKmNvbm4pCit7CisJY29u c3QgY2hhcgkgICAqc3FsID0gTlVMTDsJCS8qIGtlZXAgY29tcGlsZXIgcXVpZXQuICovCisJ UEdyZXN1bHQJICAgKnJlczsKKworCXN3aXRjaCAoWGFjdElzb0xldmVsKQorCXsKKwkJY2Fz ZSBYQUNUX1JFQURfVU5DT01NSVRURUQ6CisJCWNhc2UgWEFDVF9SRUFEX0NPTU1JVFRFRDoK KwkJY2FzZSBYQUNUX1JFUEVBVEFCTEVfUkVBRDoKKwkJCXNxbCA9ICJTVEFSVCBUUkFOU0FD VElPTiBJU09MQVRJT04gTEVWRUwgUkVQRUFUQUJMRSBSRUFEIjsKKwkJCWJyZWFrOworCQlj YXNlIFhBQ1RfU0VSSUFMSVpBQkxFOgorCQkJc3FsID0gIlNUQVJUIFRSQU5TQUNUSU9OIElT T0xBVElPTiBMRVZFTCBTRVJJQUxJWkFCTEUiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJ CQllbG9nKEVSUk9SLCAidW5leHBlY3RlZCBpc29sYXRpb24gbGV2ZWw6ICVkIiwgWGFjdElz b0xldmVsKTsKKwkJCWJyZWFrOworCX0KKworCWVsb2coREVCVUczLCAic3RhcnRpbmcgcmVt b3RlIHRyYW5zYWN0aW9uIHdpdGggXCIlc1wiIiwgc3FsKTsKKworCXJlcyA9IFBRZXhlYyhj b25uLCBzcWwpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRf T0spCisJeworCQlQUWNsZWFyKHJlcyk7CisJCWVsb2coRVJST1IsICJjb3VsZCBub3Qgc3Rh cnQgdHJhbnNhY3Rpb246ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCX0KKwlQUWNs ZWFyKHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkCithYm9ydF9yZW1vdGVfdHgoUEdjb25uICpj b25uKQoreworCVBHcmVzdWx0CSAgICpyZXM7CisKKwllbG9nKERFQlVHMywgImFib3J0aW5n IHJlbW90ZSB0cmFuc2FjdGlvbiIpOworCisJcmVzID0gUFFleGVjKGNvbm4sICJBQk9SVCBU UkFOU0FDVElPTiIpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1B TkRfT0spCisJeworCQlQUWNsZWFyKHJlcyk7CisJCWVsb2coRVJST1IsICJjb3VsZCBub3Qg YWJvcnQgdHJhbnNhY3Rpb246ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCX0KKwlQ UWNsZWFyKHJlcyk7Cit9CisKKy8qCisgKiBNYXJrIHRoZSBjb25uZWN0aW9uIGFzICJ1bnVz ZWQiLCBhbmQgY2xvc2UgaXQgaWYgdGhlIGNhbGxlciB3YXMgdGhlIGxhc3QKKyAqIHVzZXIg b2YgdGhlIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQKK1JlbGVhc2VDb25uZWN0aW9uKFBHY29u biAqY29ubikKK3sKKwlIQVNIX1NFUV9TVEFUVVMJCXNjYW47CisJQ29ubkNhY2hlRW50cnkJ ICAgKmVudHJ5OworCisJaWYgKGNvbm4gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyoKKwkg KiBXZSBuZWVkIHRvIHNjYW4gc2VxdWVudGlhbGx5IHNpbmNlIHdlIHVzZSB0aGUgYWRkcmVz cyB0byBmaW5kCisJICogYXBwcm9wcmlhdGUgUEdjb25uIGZyb20gdGhlIGhhc2ggdGFibGUu CisJICovCisJaGFzaF9zZXFfaW5pdCgmc2NhbiwgRlNDb25uZWN0aW9uSGFzaCk7CisJd2hp bGUgKChlbnRyeSA9IChDb25uQ2FjaGVFbnRyeSAqKSBoYXNoX3NlcV9zZWFyY2goJnNjYW4p KSkKKwl7CisJCWlmIChlbnRyeS0+Y29ubiA9PSBjb25uKQorCQl7CisJCQloYXNoX3NlcV90 ZXJtKCZzY2FuKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSWYgdGhlIHJlbGVhc2Vk IGNvbm5lY3Rpb24gd2FzIGFuIG9ycGhhbiwganVzdCBjbG9zZSBpdC4gKi8KKwlpZiAoZW50 cnkgPT0gTlVMTCkKKwl7CisJCVBRZmluaXNoKGNvbm4pOworCQlyZXR1cm47CisJfQorCisJ LyoKKwkgKiBJZiB0aGlzIGNvbm5lY3Rpb24gdXNlcyByZW1vdGUgdHJhbnNhY3Rpb24gYW5k IGNhbGxlciBpcyB0aGUgbGFzdCB1c2VyLAorCSAqIGFib3J0IHJlbW90ZSB0cmFuc2FjdGlv biBhbmQgZm9yZ2V0IGFib3V0IGl0LgorCSAqLworCWlmIChlbnRyeS0+dXNlX3R4ICYmIGVu dHJ5LT5yZWZzID09IDEpCisJeworCQlhYm9ydF9yZW1vdGVfdHgoY29ubik7CisJCWVudHJ5 LT51c2VfdHggPSBmYWxzZTsKKwl9CisKKwkvKgorCSAqIERlY3JlYXNlIHJlZmVyZW5jZSBj b3VudGVyIG9mIHRoaXMgY29ubmVjdGlvbi4gIEV2ZW4gaWYgdGhlIGNhbGxlciB3YXMKKwkg KiB0aGUgbGFzdCByZWZlcnJlciwgd2UgZG9uJ3QgdW5yZWdpc3RlciBpdCBmcm9tIGNhY2hl LgorCSAqLworCWVudHJ5LT5yZWZzLS07Cit9CisKKy8qCisgKiBDbGVhbiB0aGUgY29ubmVj dGlvbiB1cCB2aWEgUmVzb3VyY2VPd25lci4KKyAqLworc3RhdGljIHZvaWQKK2NsZWFudXBf Y29ubmVjdGlvbihSZXNvdXJjZVJlbGVhc2VQaGFzZSBwaGFzZSwKKwkJCQkgICBib29sIGlz Q29tbWl0LAorCQkJCSAgIGJvb2wgaXNUb3BMZXZlbCwKKwkJCQkgICB2b2lkICphcmcpCit7 CisJQ29ubkNhY2hlRW50cnkgKmVudHJ5ID0gKENvbm5DYWNoZUVudHJ5ICopIGFyZzsKKwor CS8qIElmIHRoZSB0cmFuc2FjdGlvbiB3YXMgY29tbWl0dGVkLCBkb24ndCBjbG9zZSBjb25u ZWN0aW9ucy4gKi8KKwlpZiAoaXNDb21taXQpCisJCXJldHVybjsKKworCS8qCisJICogV2Ug Y2xlYW4gdGhlIGNvbm5lY3Rpb24gdXAgb24gcG9zdC1sb2NrIGJlY2F1c2UgZm9yZWlnbiBj b25uZWN0aW9ucyBhcmUKKwkgKiBiYWNrZW5kLWludGVybmFsIHJlc291cmNlLgorCSAqLwor CWlmIChwaGFzZSAhPSBSRVNPVVJDRV9SRUxFQVNFX0FGVEVSX0xPQ0tTKQorCQlyZXR1cm47 CisKKwkvKgorCSAqIFdlIGlnbm9yZSBjbGVhbnVwIGZvciBSZXNvdXJjZU93bmVycyBvdGhl ciB0aGFuIHRyYW5zYWN0aW9uLiAgQXQgdGhpcworCSAqIHBvaW50LCBzdWNoIGEgUmVzb3Vy Y2VPd25lciBpcyBvbmx5IFBvcnRhbC4KKwkgKi8KKwlpZiAoQ3VycmVudFJlc291cmNlT3du ZXIgIT0gQ3VyVHJhbnNhY3Rpb25SZXNvdXJjZU93bmVyKQorCQlyZXR1cm47CisKKwkvKgor CSAqIFdlIGRvbid0IG5lZWQgdG8gY2xlYW4gdXAgYXQgZW5kIG9mIHN1YnRyYW5zYWN0aW9u cywgYmVjYXVzZSB0aGV5IG1pZ2h0CisJICogYmUgcmVjb3ZlcmVkIHRvIGNvbnNpc3RlbnQg c3RhdGUgd2l0aCBzYXZlcG9pbnRzLgorCSAqLworCWlmICghaXNUb3BMZXZlbCkKKwkJcmV0 dXJuOworCisJLyoKKwkgKiBIZXJlLCBpdCBtdXN0IGJlIGFmdGVyIGFib3J0IG9mIHRvcCBs ZXZlbCB0cmFuc2FjdGlvbi4gIERpc2Nvbm5lY3QgYW5kCisJICogZm9yZ2V0IGV2ZXJ5IHJl ZmVycmVyLgorCSAqLworCWlmIChlbnRyeS0+Y29ubiAhPSBOVUxMKQorCXsKKwkJUFFmaW5p c2goZW50cnktPmNvbm4pOworCQllbnRyeS0+cmVmcyA9IDA7CisJCWVudHJ5LT5jb25uID0g TlVMTDsKKwl9Cit9CisKKy8qCisgKiBHZXQgbGlzdCBvZiBjb25uZWN0aW9ucyBjdXJyZW50 bHkgYWN0aXZlLgorICovCitEYXR1bSBwZ3NxbF9mZHdfZ2V0X2Nvbm5lY3Rpb25zKFBHX0ZV TkNUSU9OX0FSR1MpOworUEdfRlVOQ1RJT05fSU5GT19WMShwZ3NxbF9mZHdfZ2V0X2Nvbm5l Y3Rpb25zKTsKK0RhdHVtCitwZ3NxbF9mZHdfZ2V0X2Nvbm5lY3Rpb25zKFBHX0ZVTkNUSU9O X0FSR1MpCit7CisJUmV0dXJuU2V0SW5mbwkgICAqcnNpbmZvID0gKFJldHVyblNldEluZm8g KikgZmNpbmZvLT5yZXN1bHRpbmZvOworCUhBU0hfU0VRX1NUQVRVUwkJc2NhbjsKKwlDb25u Q2FjaGVFbnRyeQkgICAqZW50cnk7CisJTWVtb3J5Q29udGV4dAkJb2xkY29udGV4dCA9IEN1 cnJlbnRNZW1vcnlDb250ZXh0OworCVR1cGxlc3RvcmVzdGF0ZQkgICAqdHVwbGVzdG9yZTsK KwlUdXBsZURlc2MJCQl0dXBkZXNjOworCisJLyogV2UgcmV0dXJuIGxpc3Qgb2YgY29ubmVj dGlvbiB3aXRoIHN0b3JpbmcgdGhlbSBpbiBhIFR1cGxlc3RvcmUuICovCisJcnNpbmZvLT5y ZXR1cm5Nb2RlID0gU0ZSTV9NYXRlcmlhbGl6ZTsKKwlyc2luZm8tPnNldFJlc3VsdCA9IE5V TEw7CisJcnNpbmZvLT5zZXREZXNjID0gTlVMTDsKKworCS8qIENyZWF0ZSB0dXBsZXN0b3Jl IGFuZCBjb3B5IG9mIFR1cGxlRGVzYyBpbiBwZXItcXVlcnkgY29udGV4dC4gKi8KKwlNZW1v cnlDb250ZXh0U3dpdGNoVG8ocnNpbmZvLT5lY29udGV4dC0+ZWN4dF9wZXJfcXVlcnlfbWVt b3J5KTsKKworCXR1cGRlc2MgPSBDcmVhdGVUZW1wbGF0ZVR1cGxlRGVzYygyLCBmYWxzZSk7 CisJVHVwbGVEZXNjSW5pdEVudHJ5KHR1cGRlc2MsIDEsICJzcnZpZCIsIE9JRE9JRCwgLTEs IDApOworCVR1cGxlRGVzY0luaXRFbnRyeSh0dXBkZXNjLCAyLCAidXNlc3lzaWQiLCBPSURP SUQsIC0xLCAwKTsKKwlyc2luZm8tPnNldERlc2MgPSB0dXBkZXNjOworCisJdHVwbGVzdG9y ZSA9IHR1cGxlc3RvcmVfYmVnaW5faGVhcChmYWxzZSwgZmFsc2UsIHdvcmtfbWVtKTsKKwly c2luZm8tPnNldFJlc3VsdCA9IHR1cGxlc3RvcmU7CisKKwlNZW1vcnlDb250ZXh0U3dpdGNo VG8ob2xkY29udGV4dCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gc2NhbiBzZXF1ZW50aWFs bHkgc2luY2Ugd2UgdXNlIHRoZSBhZGRyZXNzIHRvIGZpbmQKKwkgKiBhcHByb3ByaWF0ZSBQ R2Nvbm4gZnJvbSB0aGUgaGFzaCB0YWJsZS4KKwkgKi8KKwlpZiAoRlNDb25uZWN0aW9uSGFz aCAhPSBOVUxMKQorCXsKKwkJaGFzaF9zZXFfaW5pdCgmc2NhbiwgRlNDb25uZWN0aW9uSGFz aCk7CisJCXdoaWxlICgoZW50cnkgPSAoQ29ubkNhY2hlRW50cnkgKikgaGFzaF9zZXFfc2Vh cmNoKCZzY2FuKSkpCisJCXsKKwkJCURhdHVtCQl2YWx1ZXNbMl07CisJCQlib29sCQludWxs c1syXTsKKwkJCUhlYXBUdXBsZQl0dXBsZTsKKworCQkJLyogSWdub3JlIGluYWN0aXZlIGNv bm5lY3Rpb25zICovCisJCQlpZiAoUFFzdGF0dXMoZW50cnktPmNvbm4pICE9IENPTk5FQ1RJ T05fT0spCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBJZ25vcmUgb3RoZXIgdXNl cnMnIGNvbm5lY3Rpb25zIGlmIGN1cnJlbnQgdXNlciBpc24ndCBhCisJCQkgKiBzdXBlcnVz ZXIuCisJCQkgKi8KKwkJCWlmICghc3VwZXJ1c2VyKCkgJiYgZW50cnktPnVzZXJpZCAhPSBH ZXRVc2VySWQoKSkKKwkJCQljb250aW51ZTsKKworCQkJdmFsdWVzWzBdID0gT2JqZWN0SWRH ZXREYXR1bShlbnRyeS0+c2VydmVyaWQpOworCQkJdmFsdWVzWzFdID0gT2JqZWN0SWRHZXRE YXR1bShlbnRyeS0+dXNlcmlkKTsKKwkJCW51bGxzWzBdID0gZmFsc2U7CisJCQludWxsc1sx XSA9IGZhbHNlOworCisJCQl0dXBsZSA9IGhlYXBfZm9ybXR1cGxlKHR1cGRlc2MsIHZhbHVl cywgbnVsbHMpOworCQkJdHVwbGVzdG9yZV9wdXR0dXBsZSh0dXBsZXN0b3JlLCB0dXBsZSk7 CisJCX0KKwl9CisJdHVwbGVzdG9yZV9kb25lc3RvcmluZyh0dXBsZXN0b3JlKTsKKworCVBH X1JFVFVSTl9WT0lEKCk7Cit9CisKKy8qCisgKiBEaXNjYXJkIHBlcnNpc3RlbnQgY29ubmVj dGlvbiBkZXNpZ25hdGVkIGJ5IGdpdmVuIGNvbm5lY3Rpb24gbmFtZS4KKyAqLworRGF0dW0g cGdzcWxfZmR3X2Rpc2Nvbm5lY3QoUEdfRlVOQ1RJT05fQVJHUyk7CitQR19GVU5DVElPTl9J TkZPX1YxKHBnc3FsX2Zkd19kaXNjb25uZWN0KTsKK0RhdHVtCitwZ3NxbF9mZHdfZGlzY29u bmVjdChQR19GVU5DVElPTl9BUkdTKQoreworCU9pZAkJCQkJc2VydmVyaWQgPSBQR19HRVRB UkdfT0lEKDApOworCU9pZAkJCQkJdXNlcmlkID0gUEdfR0VUQVJHX09JRCgxKTsKKwlDb25u Q2FjaGVFbnRyeQkJa2V5OworCUNvbm5DYWNoZUVudHJ5CSAgICplbnRyeSA9IE5VTEw7CisJ Ym9vbAkJCQlmb3VuZDsKKworCS8qIE5vbi1zdXBlcnVzZXIgY2FuJ3QgZGlzY2FyZCBvdGhl ciB1c2VycycgY29ubmVjdGlvbi4gKi8KKwlpZiAoIXN1cGVydXNlcigpICYmIHVzZXJpZCAh PSBHZXRPdXRlclVzZXJJZCgpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVS UkNPREVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyksCisJCQkJIGVycm1zZygib25seSBzdXBl cnVzZXIgY2FuIGRpc2NhcmQgb3RoZXIgdXNlcidzIGNvbm5lY3Rpb24iKSkpOworCisJLyoK KwkgKiBJZiBubyBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLCBvciBubyBzdWNo IGNvbm5lY3Rpb25zLCBqdXN0CisJICogcmV0dXJuICJORyIgdG8gaW5kaWNhdGUgbm90aGlu ZyBoYXMgZG9uZS4KKwkgKi8KKwlpZiAoRlNDb25uZWN0aW9uSGFzaCA9PSBOVUxMKQorCQlQ R19SRVRVUk5fVEVYVF9QKGNzdHJpbmdfdG9fdGV4dCgiTkciKSk7CisKKwlrZXkuc2VydmVy aWQgPSBzZXJ2ZXJpZDsKKwlrZXkudXNlcmlkID0gdXNlcmlkOworCWVudHJ5ID0gaGFzaF9z ZWFyY2goRlNDb25uZWN0aW9uSGFzaCwgJmtleSwgSEFTSF9GSU5ELCAmZm91bmQpOworCWlm ICghZm91bmQpCisJCVBHX1JFVFVSTl9URVhUX1AoY3N0cmluZ190b190ZXh0KCJORyIpKTsK KworCS8qIERpc2NhcmQgY2FjaGVkIGNvbm5lY3Rpb24sIGFuZCBjbGVhciByZWZlcmVuY2Ug Y291bnRlci4gKi8KKwlQUWZpbmlzaChlbnRyeS0+Y29ubik7CisJZW50cnktPnJlZnMgPSAw OworCWVudHJ5LT5jb25uID0gTlVMTDsKKworCVBHX1JFVFVSTl9URVhUX1AoY3N0cmluZ190 b190ZXh0KCJPSyIpKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdzcWxfZmR3L2Nvbm5l Y3Rpb24uaCBiL2NvbnRyaWIvcGdzcWxfZmR3L2Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDI3ZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29u dHJpYi9wZ3NxbF9mZHcvY29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorICoKKyAqIGNvbm5lY3Rpb24uaAorICoJCSAgQ29ubmVjdGlvbiBt YW5hZ2VtZW50IGZvciBwZ3NxbF9mZHcKKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMp IDIwMTIsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisgKgorICogSURF TlRJRklDQVRJT04KKyAqCQkgIGNvbnRyaWIvcGdzcWxfZmR3L2Nvbm5lY3Rpb24uaAorICoK KyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIENPTk5FQ1RJT05fSAorI2Rl ZmluZSBDT05ORUNUSU9OX0gKKworI2luY2x1ZGUgImZvcmVpZ24vZm9yZWlnbi5oIgorI2lu Y2x1ZGUgImxpYnBxLWZlLmgiCisKKy8qCisgKiBDb25uZWN0aW9uIG1hbmFnZW1lbnQKKyAq LworUEdjb25uICpHZXRDb25uZWN0aW9uKEZvcmVpZ25TZXJ2ZXIgKnNlcnZlciwgVXNlck1h cHBpbmcgKnVzZXIsIGJvb2wgdXNlX3R4KTsKK3ZvaWQgUmVsZWFzZUNvbm5lY3Rpb24oUEdj b25uICpjb25uKTsKKworI2VuZGlmIC8qIENPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEv Y29udHJpYi9wZ3NxbF9mZHcvZGVwYXJzZS5jIGIvY29udHJpYi9wZ3NxbF9mZHcvZGVwYXJz ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MzdhMGMKLS0tIC9k ZXYvbnVsbAorKysgYi9jb250cmliL3Bnc3FsX2Zkdy9kZXBhcnNlLmMKQEAgLTAsMCArMSwx MjEyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBkZXBhcnNlLmMKKyAqCQkg IHF1ZXJ5IGRlcGFyc2VyIGZvciBQb3N0Z3JlU1FMCisgKgorICogQ29weXJpZ2h0IChjKSAy MDEyLCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAqIElERU5U SUZJQ0FUSU9OCisgKgkJICBjb250cmliL3Bnc3FsX2Zkdy9kZXBhcnNlLmMKKyAqCisgKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgInBvc3RncmVzLmgiCisKKyNpbmNs dWRlICJhY2Nlc3MvdHJhbnNhbS5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfY2xhc3MuaCIK KyNpbmNsdWRlICJjYXRhbG9nL3BnX29wZXJhdG9yLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9w Z190eXBlLmgiCisjaW5jbHVkZSAiY29tbWFuZHMvZGVmcmVtLmgiCisjaW5jbHVkZSAiZm9y ZWlnbi9mb3JlaWduLmgiCisjaW5jbHVkZSAibGliL3N0cmluZ2luZm8uaCIKKyNpbmNsdWRl ICJub2Rlcy9ub2RlRnVuY3MuaCIKKyNpbmNsdWRlICJub2Rlcy9ub2Rlcy5oIgorI2luY2x1 ZGUgIm5vZGVzL21ha2VmdW5jcy5oIgorI2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgi CisjaW5jbHVkZSAib3B0aW1pemVyL3Zhci5oIgorI2luY2x1ZGUgInBhcnNlci9wYXJzZXIu aCIKKyNpbmNsdWRlICJwYXJzZXIvcGFyc2V0cmVlLmgiCisjaW5jbHVkZSAidXRpbHMvYnVp bHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKKyNpbmNsdWRlICJ1dGls cy9yZWwuaCIKKyNpbmNsdWRlICJ1dGlscy9zeXNjYWNoZS5oIgorCisjaW5jbHVkZSAicGdz cWxfZmR3LmgiCisKKy8qCisgKiBDb250ZXh0IGZvciB3YWxrLXRocm91Z2ggdGhlIGV4cHJl c3Npb24gdHJlZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZm9yZWlnbl9leGVjdXRhYmxlX2N4 dAoreworCVBsYW5uZXJJbmZvCSAgICpyb290OworCVJlbE9wdEluZm8JICAgKmZvcmVpZ25y ZWw7CisJYm9vbAkJCWhhc19wYXJhbTsKK30gZm9yZWlnbl9leGVjdXRhYmxlX2N4dDsKKwor LyoKKyAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gd2hpY2ggY2FuIGJlIHVzZWQgaW4g U1FMIHN0YXRlbWVudCBmcm9tIGEgbm9kZS4KKyAqLworc3RhdGljIHZvaWQgZGVwYXJzZUV4 cHIoU3RyaW5nSW5mbyBidWYsIEV4cHIgKmV4cHIsIFBsYW5uZXJJbmZvICpyb290KTsKK3N0 YXRpYyB2b2lkIGRlcGFyc2VSZWxhdGlvbihTdHJpbmdJbmZvIGJ1ZiwgT2lkIHJlbGlkLCBQ bGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCQlib29sIG5lZWRfcHJlZml4KTsKK3N0YXRpYyB2 b2lkIGRlcGFyc2VWYXIoU3RyaW5nSW5mbyBidWYsIFZhciAqbm9kZSwgUGxhbm5lckluZm8g KnJvb3QsCisJCQkJCSAgIGJvb2wgbmVlZF9wcmVmaXgpOworc3RhdGljIHZvaWQgZGVwYXJz ZUNvbnN0KFN0cmluZ0luZm8gYnVmLCBDb25zdCAqbm9kZSwgUGxhbm5lckluZm8gKnJvb3Qp Oworc3RhdGljIHZvaWQgZGVwYXJzZUJvb2xFeHByKFN0cmluZ0luZm8gYnVmLCBCb29sRXhw ciAqbm9kZSwgUGxhbm5lckluZm8gKnJvb3QpOworc3RhdGljIHZvaWQgZGVwYXJzZU51bGxU ZXN0KFN0cmluZ0luZm8gYnVmLCBOdWxsVGVzdCAqbm9kZSwgUGxhbm5lckluZm8gKnJvb3Qp Oworc3RhdGljIHZvaWQgZGVwYXJzZURpc3RpbmN0RXhwcihTdHJpbmdJbmZvIGJ1ZiwgRGlz dGluY3RFeHByICpub2RlLAorCQkJCQkJCQlQbGFubmVySW5mbyAqcm9vdCk7CitzdGF0aWMg dm9pZCBkZXBhcnNlUmVsYWJlbFR5cGUoU3RyaW5nSW5mbyBidWYsIFJlbGFiZWxUeXBlICpu b2RlLAorCQkJCQkJCSAgIFBsYW5uZXJJbmZvICpyb290KTsKK3N0YXRpYyB2b2lkIGRlcGFy c2VGdW5jRXhwcihTdHJpbmdJbmZvIGJ1ZiwgRnVuY0V4cHIgKm5vZGUsIFBsYW5uZXJJbmZv ICpyb290KTsKK3N0YXRpYyB2b2lkIGRlcGFyc2VQYXJhbShTdHJpbmdJbmZvIGJ1ZiwgUGFy YW0gKm5vZGUsIFBsYW5uZXJJbmZvICpyb290KTsKK3N0YXRpYyB2b2lkIGRlcGFyc2VTY2Fs YXJBcnJheU9wRXhwcihTdHJpbmdJbmZvIGJ1ZiwgU2NhbGFyQXJyYXlPcEV4cHIgKm5vZGUs CisJCQkJCQkJCQkgUGxhbm5lckluZm8gKnJvb3QpOworc3RhdGljIHZvaWQgZGVwYXJzZU9w RXhwcihTdHJpbmdJbmZvIGJ1ZiwgT3BFeHByICpub2RlLCBQbGFubmVySW5mbyAqcm9vdCk7 CitzdGF0aWMgdm9pZCBkZXBhcnNlQXJyYXlSZWYoU3RyaW5nSW5mbyBidWYsIEFycmF5UmVm ICpub2RlLCBQbGFubmVySW5mbyAqcm9vdCk7CitzdGF0aWMgdm9pZCBkZXBhcnNlQXJyYXlF eHByKFN0cmluZ0luZm8gYnVmLCBBcnJheUV4cHIgKm5vZGUsIFBsYW5uZXJJbmZvICpyb290 KTsKKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIGFuIGV4cHJlc3Npb24gY2FuIGJlIGV2 YWx1YXRlZCBvbiByZW1vdGUgc2lkZSBzYWZlbHkuCisgKi8KK3N0YXRpYyBib29sIGlzX2Zv cmVpZ25fZXhwcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqYmFzZXJlbCwgRXhw ciAqZXhwciwKKwkJCQkJCQlib29sICpoYXNfcGFyYW0pOworc3RhdGljIGJvb2wgZm9yZWln bl9leHByX3dhbGtlcihOb2RlICpub2RlLCBmb3JlaWduX2V4ZWN1dGFibGVfY3h0ICpjb250 ZXh0KTsKK3N0YXRpYyBib29sIGlzX2J1aWx0aW4oT2lkIHByb2NpZCk7CisKKy8qCisgKiBE ZXBhcnNlIHF1ZXJ5IHJlcHJlc2VudGF0aW9uIGludG8gU1FMIHN0YXRlbWVudCB3aGljaCBz dWl0cyBmb3IgcmVtb3RlCisgKiBQb3N0Z3JlU1FMIHNlcnZlci4gIFRoaXMgZnVuY3Rpb24g YmFzaWNhbGx5IGNyZWF0ZXMgc2ltcGxlIHF1ZXJ5IHN0cmluZworICogd2hpY2ggY29uc2lz dHMgb2Ygb25seSBTRUxFQ1QsIEZST00gY2xhdXNlcy4KKyAqLwordm9pZAorZGVwYXJzZVNp bXBsZVNxbChTdHJpbmdJbmZvIGJ1ZiwKKwkJCQkgT2lkIHJlbGlkLAorCQkJICAgICBQbGFu bmVySW5mbyAqcm9vdCwKKwkJCSAgICAgUmVsT3B0SW5mbyAqYmFzZXJlbCkKK3sKKwlTdHJp bmdJbmZvRGF0YQlmb3JlaWduX3JlbG5hbWU7CisJYm9vbAkJZmlyc3Q7CisJQXR0ck51bWJl cglhdHRyOworCUxpc3QJICAgKmF0dHJfdXNlZCA9IE5JTDsJLyogTGlzdCBvZiBBdHROdW1i ZXIgdXNlZCBpbiB0aGUgcXVlcnkgKi8KKworCWluaXRTdHJpbmdJbmZvKGJ1Zik7CisJaW5p dFN0cmluZ0luZm8oJmZvcmVpZ25fcmVsbmFtZSk7CisKKwkvKgorCSAqIEZpcnN0IG9mIGFs bCwgZGV0ZXJtaW5lIHdoaWNoIGNvbHVtbiBzaG91bGQgYmUgcmV0cmlldmVkIGZvciB0aGlz IHNjYW4uCisJICoKKwkgKiBXZSBkbyB0aGlzIGJlZm9yZSBkZXBhcnNpbmcgU0VMRUNUIGNs YXVzZSBiZWNhdXNlIGF0dHJpYnV0ZXMgd2hpY2ggYXJlCisJICogbm90IHVzZWQgaW4gbmVp dGhlciByZWx0YXJnZXRsaXN0IG5vciBiYXNlcmVsLT5iYXNlcmVzdHJpY3RpbmZvLCBxdWFs cworCSAqIGV2YWx1YXRlZCBvbiBsb2NhbCwgY2FuIGJlIHJlcGxhY2VkIHdpdGggbGl0ZXJh bCAiTlVMTCIgaW4gdGhlIFNFTEVDVAorCSAqIGNsYXVzZSB0byByZWR1Y2Ugb3ZlcmhlYWQg b2YgdHVwbGUgaGFuZGxpbmcgdHVwbGUgYW5kIGRhdGEgdHJhbnNmZXIuCisJICovCisJaWYg KGJhc2VyZWwtPmJhc2VyZXN0cmljdGluZm8gIT0gTklMKQorCXsKKwkJTGlzdENlbGwgICAq bGM7CisKKwkJZm9yZWFjaCAobGMsIGJhc2VyZWwtPmJhc2VyZXN0cmljdGluZm8pCisJCXsK KwkJCVJlc3RyaWN0SW5mbyAgICpyaSA9IChSZXN0cmljdEluZm8gKikgbGZpcnN0KGxjKTsK KwkJCUxpc3QJCSAgICphdHRyczsKKworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8ga25vdyB3 aGljaCBhdHRyaWJ1dGVzIGFyZSB1c2VkIGluIHF1YWwgZXZhbHVhdGVkCisJCQkgKiBvbiB0 aGUgbG9jYWwgc2VydmVyLCBiZWNhdXNlIHRoZXkgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGUK KwkJCSAqIFNFTEVDVCBjbGF1c2Ugb2YgcmVtb3RlIHF1ZXJ5LiAgV2UgY2FuIGlnbm9yZSBh dHRyaWJ1dGVzCisJCQkgKiB3aGljaCBhcmUgcmVmZXJlbmNlZCBvbmx5IGluIE9SREVSIEJZ L0dST1VQIEJZIGNsYXVzZSBiZWNhdXNlCisJCQkgKiBzdWNoIGF0dHJpYnV0ZXMgaGFzIGFs cmVhZHkgYmVlbiBrZXB0IGluIHJlbHRhcmdldGxpc3QuCisJCQkgKi8KKwkJCWF0dHJzID0g cHVsbF92YXJfY2xhdXNlKChOb2RlICopIHJpLT5jbGF1c2UsCisJCQkJCQkJCQlQVkNfUkVD VVJTRV9BR0dSRUdBVEVTLAorCQkJCQkJCQkJUFZDX1JFQ1VSU0VfUExBQ0VIT0xERVJTKTsK KwkJCWF0dHJfdXNlZCA9IGxpc3RfdW5pb24oYXR0cl91c2VkLCBhdHRycyk7CisJCX0KKwl9 CisKKwkvKgorCSAqIGRlcGFyc2UgU0VMRUNUIGNsYXVzZQorCSAqCisJICogTGlzdCBhdHRy aWJ1dGVzIHdoaWNoIGFyZSBpbiBlaXRoZXIgdGFyZ2V0IGxpc3Qgb3IgbG9jYWwgcmVzdHJp Y3Rpb24uCisJICogVW51c2VkIGF0dHJpYnV0ZXMgYXJlIHJlcGxhY2VkIHdpdGggYSBsaXRl cmFsICJOVUxMIiBmb3Igb3B0aW1pemF0aW9uLgorCSAqCisJICogTm90ZSB0aGF0IG5vdGhp bmcgaXMgYWRkZWQgZm9yIGRyb3BwZWQgY29sdW1ucywgdGhvdWdoIHR1cGxlIGNvbnN0cnVj dG9yCisJICogZnVuY3Rpb24gcmVxdWlyZXMgZW50cmllcyBmb3IgZHJvcHBlZCBjb2x1bW5z LiAgU3VjaCBlbnRyaWVzIG11c3QgYmUKKwkgKiBpbml0aWFsaXplZCB3aXRoIE5VTEwgYmVm b3JlIGNhbGxpbmcgdHVwbGUgY29uc3RydWN0b3IuCisJICovCisJYXBwZW5kU3RyaW5nSW5m byhidWYsICJTRUxFQ1QgIik7CisJYXR0cl91c2VkID0gbGlzdF91bmlvbihhdHRyX3VzZWQs IGJhc2VyZWwtPnJlbHRhcmdldGxpc3QpOworCWZpcnN0ID0gdHJ1ZTsKKwlmb3IgKGF0dHIg PSAxOyBhdHRyIDw9IGJhc2VyZWwtPm1heF9hdHRyOyBhdHRyKyspCisJeworCQlSYW5nZVRi bEVudHJ5ICpydGUgPSByb290LT5zaW1wbGVfcnRlX2FycmF5W2Jhc2VyZWwtPnJlbGlkXTsK KwkJVmFyCQkgICAqdmFyID0gTlVMTDsKKwkJTGlzdENlbGwgICAqbGM7CisKKwkJLyogSWdu b3JlIGRyb3BwZWQgYXR0cmlidXRlcy4gKi8KKwkJaWYgKGdldF9ydGVfYXR0cmlidXRlX2lz X2Ryb3BwZWQocnRlLCBhdHRyKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZmlyc3QpCisJ CQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiwgIik7CisJCWZpcnN0ID0gZmFsc2U7CisKKwkJ LyoKKwkJICogV2UgdXNlIGxpbmVhciBzZWFyY2ggaGVyZSwgYnV0IGl0IHdvdWxkbid0IGJl IHByb2JsZW0gc2luY2UKKwkJICogYXR0cl91c2VkIHNlZW1zIHRvIG5vdCBiZWNvbWUgc28g bGFyZ2UuCisJCSAqLworCQlmb3JlYWNoIChsYywgYXR0cl91c2VkKQorCQl7CisJCQl2YXIg PSBsZmlyc3QobGMpOworCQkJaWYgKHZhci0+dmFyYXR0bm8gPT0gYXR0cikKKwkJCQlicmVh azsKKwkJCXZhciA9IE5VTEw7CisJCX0KKwkJaWYgKHZhciAhPSBOVUxMKQorCQkJZGVwYXJz ZVZhcihidWYsIHZhciwgcm9vdCwgZmFsc2UpOworCQllbHNlCisJCQlhcHBlbmRTdHJpbmdJ bmZvKGJ1ZiwgIk5VTEwiKTsKKwl9CisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnICcp OworCisJLyoKKwkgKiBkZXBhcnNlIEZST00gY2xhdXNlLCBpbmNsdWRpbmcgYWxpYXMgaWYg YW55CisJICovCisJYXBwZW5kU3RyaW5nSW5mbyhidWYsICJGUk9NICIpOworCWRlcGFyc2VS ZWxhdGlvbihidWYsIHJlbGlkLCByb290LCB0cnVlKTsKKworCWVsb2coREVCVUczLCAiUmVt b3RlIFNRTDogJXMiLCBidWYtPmRhdGEpOworfQorCisvKgorICogRXhhbWluZSBlYWNoIGVs ZW1lbnQgaW4gdGhlIGxpc3QgYmFzZXJlc3RyaWN0aW5mbyBvZiBiYXNlcmVsLCBhbmQgc29y dCB0aGVtCisgKiBpbnRvIHRocmVlIGdyb3VwczogcmVtb3RlX2NvbmRzIGNvbnRhaW5zIGNv bmRpdGlvbnMgd2hpY2ggY2FuIGJlIGV2YWx1YXRlZAorICogICAtIHJlbW90ZV9jb25kcyBp cyBwdXNoLWRvd24gc2FmZSwgYW5kIGRvbid0IGNvbnRhaW4gYW55IFBhcmFtIG5vZGUKKyAq ICAgLSBwYXJhbV9jb25kcyBpcyBwdXNoLWRvd24gc2FmZSwgYnV0IGNvbnRhaW4gc29tZSBQ YXJhbSBub2RlCisgKiAgIC0gbG9jYWxfY29uZHMgaXMgbm90IHB1c2gtZG93biBzYWZlCisg KgorICogT25seSByZW1vdGVfY29uZHMgY2FuIGJlIHVzZWQgaW4gcmVtb3RlIEVYUExBSU4s IGFuZCByZW1vdGVfY29uZHMgYW5kCisgKiBwYXJhbV9jb25kcyBjYW4gYmUgdXNlZCBpbiBm aW5hbCByZW1vdGUgcXVlcnkuCisgKi8KK3ZvaWQKK3NvcnRDb25kaXRpb25zKFBsYW5uZXJJ bmZvICpyb290LAorCQkJCSAgIFJlbE9wdEluZm8gKmJhc2VyZWwsCisJCQkJICAgTGlzdCAq KnJlbW90ZV9jb25kcywKKwkJCQkgICBMaXN0ICoqcGFyYW1fY29uZHMsCisJCQkJICAgTGlz dCAqKmxvY2FsX2NvbmRzKQoreworCUxpc3RDZWxsCSAgICpsYzsKKwlib29sCQkJaGFzX3Bh cmFtOworCisJQXNzZXJ0KHJlbW90ZV9jb25kcyk7CisJQXNzZXJ0KHBhcmFtX2NvbmRzKTsK KwlBc3NlcnQobG9jYWxfY29uZHMpOworCisJZm9yZWFjaChsYywgYmFzZXJlbC0+YmFzZXJl c3RyaWN0aW5mbykKKwl7CisJCVJlc3RyaWN0SW5mbyAqcmkgPSAoUmVzdHJpY3RJbmZvICop IGxmaXJzdChsYyk7CisKKwkJaWYgKGlzX2ZvcmVpZ25fZXhwcihyb290LCBiYXNlcmVsLCBy aS0+Y2xhdXNlLCAmaGFzX3BhcmFtKSkKKwkJeworCQkJaWYgKGhhc19wYXJhbSkKKwkJCQkq cGFyYW1fY29uZHMgPSBsYXBwZW5kKCpwYXJhbV9jb25kcywgcmkpOworCQkJZWxzZQorCQkJ CSpyZW1vdGVfY29uZHMgPSBsYXBwZW5kKCpyZW1vdGVfY29uZHMsIHJpKTsKKwkJfQorCQll bHNlCisJCQkqbG9jYWxfY29uZHMgPSBsYXBwZW5kKCpsb2NhbF9jb25kcywgcmkpOworCX0K K30KKworLyoKKyAqIERlcGFyc2UgU0VMRUNUIHN0YXRlbWVudCB0byBhY3F1aXJlIHNhbXBs ZSByb3dzIG9mIGdpdmVuIHJlbGF0aW9uIGludG8gYnVmLgorICovCit2b2lkCitkZXBhcnNl QW5hbHl6ZVNxbChTdHJpbmdJbmZvIGJ1ZiwgUmVsYXRpb24gcmVsKQoreworCU9pZAkJCXJl bGlkID0gUmVsYXRpb25HZXRSZWxpZChyZWwpOworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVs YXRpb25HZXREZXNjcihyZWwpOworCWludAkJCWk7CisJY2hhcgkgICAqY29sbmFtZTsKKwlM aXN0CSAgICpvcHRpb25zOworCUxpc3RDZWxsICAgKmxjOworCWJvb2wJCWZpcnN0ID0gdHJ1 ZTsKKwljaGFyCSAgICpuc3BuYW1lOworCWNoYXIJICAgKnJlbG5hbWU7CisJRm9yZWlnblRh YmxlICp0YWJsZTsKKwkKKwkvKiBEZXBhcnNlIFNFTEVDVCBjbGF1c2UsIHVzZSBhdHRyaWJ1 dGUgbmFtZSBvciBjb2xuYW1lIG9wdGlvbi4gKi8KKwlhcHBlbmRTdHJpbmdJbmZvKGJ1Ziwg IlNFTEVDVCAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgdHVwZGVzYy0+bmF0dHM7IGkrKykKKwl7 CisJCWlmICh0dXBkZXNjLT5hdHRyc1tpXS0+YXR0aXNkcm9wcGVkKQorCQkJY29udGludWU7 CisKKwkJY29sbmFtZSA9IE5hbWVTdHIodHVwZGVzYy0+YXR0cnNbaV0tPmF0dG5hbWUpOwor CQlvcHRpb25zID0gR2V0Rm9yZWlnbkNvbHVtbk9wdGlvbnMocmVsaWQsIHR1cGRlc2MtPmF0 dHJzW2ldLT5hdHRudW0pOworCisJCWZvcmVhY2gobGMsIG9wdGlvbnMpCisJCXsKKwkJCURl ZkVsZW0JICAgKmRlZj0gKERlZkVsZW0gKikgbGZpcnN0KGxjKTsKKworCQkJaWYgKHN0cmNt cChkZWYtPmRlZm5hbWUsICJjb2xuYW1lIikgPT0gMCkKKwkJCXsKKwkJCQljb2xuYW1lID0g ZGVmR2V0U3RyaW5nKGRlZik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZp cnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIsICIpOworCQlhcHBlbmRTdHJpbmdJ bmZvKGJ1ZiwgIiVzIiwgcXVvdGVfaWRlbnRpZmllcihjb2xuYW1lKSk7CisJCWZpcnN0ID0g ZmFsc2U7CisJfQorCisJLyoKKwkgKiBEZXBhcnNlIEZST00gY2xhdXNlLCB1c2UgbmFtZXNw YWNlIGFuZCByZWxhdGlvbiBuYW1lLCBvciB1c2UgbnNwbmFtZSBhbmQKKwkgKiBjb2xuYW1l IG9wdGlvbnMgcmVzcGVjdGl2ZWx5LgorCSAqLworCW5zcG5hbWUgPSBnZXRfbmFtZXNwYWNl X25hbWUoZ2V0X3JlbF9uYW1lc3BhY2UocmVsaWQpKTsKKwlyZWxuYW1lID0gZ2V0X3JlbF9u YW1lKHJlbGlkKTsKKwl0YWJsZSA9IEdldEZvcmVpZ25UYWJsZShyZWxpZCk7CisJZm9yZWFj aChsYywgdGFibGUtPm9wdGlvbnMpCisJeworCQlEZWZFbGVtCSAgICpkZWY9IChEZWZFbGVt ICopIGxmaXJzdChsYyk7CisKKwkJaWYgKHN0cmNtcChkZWYtPmRlZm5hbWUsICJuc3BuYW1l IikgPT0gMCkKKwkJCW5zcG5hbWUgPSBkZWZHZXRTdHJpbmcoZGVmKTsKKwkJZWxzZSBpZiAo c3RyY21wKGRlZi0+ZGVmbmFtZSwgInJlbG5hbWUiKSA9PSAwKQorCQkJcmVsbmFtZSA9IGRl ZkdldFN0cmluZyhkZWYpOworCX0KKworCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIEZST00g JXMuJXMiLCBxdW90ZV9pZGVudGlmaWVyKG5zcG5hbWUpLAorCQkJCQkgcXVvdGVfaWRlbnRp ZmllcihyZWxuYW1lKSk7Cit9CisKKy8qCisgKiBEZXBhcnNlIGdpdmVuIGV4cHJlc3Npb24g aW50byBidWYuICBBY3R1YWwgc3RyaW5nIG9wZXJhdGlvbiBpcyBkZWxlZ2F0ZWQgdG8KKyAq IG5vZGUtdHlwZS1zcGVjaWZpYyBmdW5jdGlvbnMuCisgKgorICogTm90ZSB0aGF0IHN3aXRj aCBzdGF0ZW1lbnQgb2YgdGhpcyBmdW5jdGlvbiBNVVNUIG1hdGNoIHRoZSBvbmUgaW4KKyAq IGZvcmVpZ25fZXhwcl93YWxrZXIgdG8gYXZvaWQgdW5zdXBwb3J0ZWQgZXJyb3IuLgorICov CitzdGF0aWMgdm9pZAorZGVwYXJzZUV4cHIoU3RyaW5nSW5mbyBidWYsIEV4cHIgKm5vZGUs IFBsYW5uZXJJbmZvICpyb290KQoreworCS8qCisJICogVGhpcyBwYXJ0IG11c3QgYmUgbWF0 Y2ggZm9yZWlnbl9leHByX3dhbGtlci4KKwkgKi8KKwlzd2l0Y2ggKG5vZGVUYWcobm9kZSkp CisJeworCQljYXNlIFRfQ29uc3Q6CisJCQlkZXBhcnNlQ29uc3QoYnVmLCAoQ29uc3QgKikg bm9kZSwgcm9vdCk7CisJCQlicmVhazsKKwkJY2FzZSBUX0Jvb2xFeHByOgorCQkJZGVwYXJz ZUJvb2xFeHByKGJ1ZiwgKEJvb2xFeHByICopIG5vZGUsIHJvb3QpOworCQkJYnJlYWs7CisJ CWNhc2UgVF9OdWxsVGVzdDoKKwkJCWRlcGFyc2VOdWxsVGVzdChidWYsIChOdWxsVGVzdCAq KSBub2RlLCByb290KTsKKwkJCWJyZWFrOworCQljYXNlIFRfRGlzdGluY3RFeHByOgorCQkJ ZGVwYXJzZURpc3RpbmN0RXhwcihidWYsIChEaXN0aW5jdEV4cHIgKikgbm9kZSwgcm9vdCk7 CisJCQlicmVhazsKKwkJY2FzZSBUX1JlbGFiZWxUeXBlOgorCQkJZGVwYXJzZVJlbGFiZWxU eXBlKGJ1ZiwgKFJlbGFiZWxUeXBlICopIG5vZGUsIHJvb3QpOworCQkJYnJlYWs7CisJCWNh c2UgVF9GdW5jRXhwcjoKKwkJCWRlcGFyc2VGdW5jRXhwcihidWYsIChGdW5jRXhwciAqKSBu b2RlLCByb290KTsKKwkJCWJyZWFrOworCQljYXNlIFRfUGFyYW06CisJCQlkZXBhcnNlUGFy YW0oYnVmLCAoUGFyYW0gKikgbm9kZSwgcm9vdCk7CisJCQlicmVhazsKKwkJY2FzZSBUX1Nj YWxhckFycmF5T3BFeHByOgorCQkJZGVwYXJzZVNjYWxhckFycmF5T3BFeHByKGJ1ZiwgKFNj YWxhckFycmF5T3BFeHByICopIG5vZGUsIHJvb3QpOworCQkJYnJlYWs7CisJCWNhc2UgVF9P cEV4cHI6CisJCQlkZXBhcnNlT3BFeHByKGJ1ZiwgKE9wRXhwciAqKSBub2RlLCByb290KTsK KwkJCWJyZWFrOworCQljYXNlIFRfVmFyOgorCQkJZGVwYXJzZVZhcihidWYsIChWYXIgKikg bm9kZSwgcm9vdCwgZmFsc2UpOworCQkJYnJlYWs7CisJCWNhc2UgVF9BcnJheVJlZjoKKwkJ CWRlcGFyc2VBcnJheVJlZihidWYsIChBcnJheVJlZiAqKSBub2RlLCByb290KTsKKwkJCWJy ZWFrOworCQljYXNlIFRfQXJyYXlFeHByOgorCQkJZGVwYXJzZUFycmF5RXhwcihidWYsIChB cnJheUV4cHIgKikgbm9kZSwgcm9vdCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXsK KwkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJKGVycm1zZygidW5zdXBwb3J0ZWQgZXhwcmVz c2lvbiBmb3IgZGVwYXJzZSIpLAorCQkJCQkJIGVycmRldGFpbCgiJXMiLCBub2RlVG9TdHJp bmcobm9kZSkpKSk7CisJCQl9CisJCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBEZXBhcnNl IG5vZGUgaW50byBidWYsIHdpdGggcmVsYXRpb24gcXVhbGlmaWVyIGlmIG5lZWRfcHJlZml4 IHdhcyB0cnVlLiAgSWYKKyAqIG5vZGUgaXMgYSBjb2x1bW4gb2YgYSBmb3JlaWduIHRhYmxl LCB1c2UgdmFsdWUgb2YgY29sbmFtZSBGRFcgb3B0aW9uIChpZiBhbnkpCisgKiBpbnN0ZWFk IG9mIGF0dHJpYnV0ZSBuYW1lLgorICovCitzdGF0aWMgdm9pZAorZGVwYXJzZVZhcihTdHJp bmdJbmZvIGJ1ZiwKKwkJICAgVmFyICpub2RlLAorCQkgICBQbGFubmVySW5mbyAqcm9vdCwK KwkJICAgYm9vbCBuZWVkX3ByZWZpeCkKK3sKKwlSYW5nZVRibEVudHJ5ICAqcnRlOworCWNo YXIJCSAgICpjb2xuYW1lID0gTlVMTDsKKwljb25zdCBjaGFyCSAgICpxX2NvbG5hbWUgPSBO VUxMOworCUxpc3QJCSAgICpvcHRpb25zOworCUxpc3RDZWxsCSAgICpsYzsKKworCS8qIG5v ZGUgbXVzdCBub3QgYmUgYW55IG9mIE9VVEVSX1ZBUixJTk5FUl9WQVIgYW5kIElOREVYX1ZB Ui4gKi8KKwlBc3NlcnQobm9kZS0+dmFybm8gPj0gMSAmJiBub2RlLT52YXJubyA8PSByb290 LT5zaW1wbGVfcmVsX2FycmF5X3NpemUpOworCisJLyogR2V0IFJhbmdlVGJsRW50cnkgZnJv bSBhcnJheSBpbiBQbGFubmVySW5mby4gKi8KKwlydGUgPSByb290LT5zaW1wbGVfcnRlX2Fy cmF5W25vZGUtPnZhcm5vXTsKKworCS8qCisJICogSWYgdGhlIG5vZGUgaXMgYSBjb2x1bW4g b2YgYSBmb3JlaWduIHRhYmxlLCBhbmQgaXQgaGFzIGNvbG5hbWUgRkRXCisJICogb3B0aW9u LCB1c2UgaXRzIHZhbHVlLgorCSAqLworCWlmIChydGUtPnJlbGtpbmQgPT0gUkVMS0lORF9G T1JFSUdOX1RBQkxFKQorCXsKKwkJb3B0aW9ucyA9IEdldEZvcmVpZ25Db2x1bW5PcHRpb25z KHJ0ZS0+cmVsaWQsIG5vZGUtPnZhcmF0dG5vKTsKKwkJZm9yZWFjaChsYywgb3B0aW9ucykK KwkJeworCQkJRGVmRWxlbQkgICAqZGVmID0gKERlZkVsZW0gKikgbGZpcnN0KGxjKTsKKwor CQkJaWYgKHN0cmNtcChkZWYtPmRlZm5hbWUsICJjb2xuYW1lIikgPT0gMCkKKwkJCXsKKwkJ CQljb2xuYW1lID0gZGVmR2V0U3RyaW5nKGRlZik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0K Kwl9CisKKwkvKgorCSAqIElmIHRoZSBub2RlIHJlZmVycyBhIGNvbHVtbiBvZiBhIHJlZ3Vs YXIgdGFibGUgb3IgaXQgZG9lc24ndCBoYXZlIGNvbG5hbWUKKwkgKiBGRFcgb3B0aW9uLCB1 c2UgYXR0cmlidXRlIG5hbWUuCisJICovCisJaWYgKGNvbG5hbWUgPT0gTlVMTCkKKwkJY29s bmFtZSA9IGdldF9hdHRuYW1lKHJ0ZS0+cmVsaWQsIG5vZGUtPnZhcmF0dG5vKTsKKworCWlm IChuZWVkX3ByZWZpeCkKKwl7CisJCWNoYXIgKmFsaWFzbmFtZTsKKwkJY29uc3QgY2hhciAq cV9hbGlhc25hbWU7CisKKwkJaWYgKHJ0ZS0+ZXJlZiAhPSBOVUxMICYmIHJ0ZS0+ZXJlZi0+ YWxpYXNuYW1lICE9IE5VTEwpCisJCQlhbGlhc25hbWUgPSBydGUtPmVyZWYtPmFsaWFzbmFt ZTsKKwkJZWxzZSBpZiAocnRlLT5hbGlhcyAhPSBOVUxMICYmIHJ0ZS0+YWxpYXMtPmFsaWFz bmFtZSAhPSBOVUxMKQorCQkJYWxpYXNuYW1lID0gcnRlLT5hbGlhcy0+YWxpYXNuYW1lOwor CisJCXFfYWxpYXNuYW1lID0gcXVvdGVfaWRlbnRpZmllcihhbGlhc25hbWUpOworCQlhcHBl bmRTdHJpbmdJbmZvKGJ1ZiwgIiVzLiIsIHFfYWxpYXNuYW1lKTsKKwl9CisKKwlxX2NvbG5h bWUgPSBxdW90ZV9pZGVudGlmaWVyKGNvbG5hbWUpOworCWFwcGVuZFN0cmluZ0luZm8oYnVm LCAiJXMiLCBxX2NvbG5hbWUpOworfQorCisvKgorICogRGVwYXJzZSB0YWJsZSB3aGljaCBo YXMgcmVsaWQgYXMgb2lkIGludG8gYnVmLCB3aXRoIHNjaGVtYSBxdWFsaWZpZXIgaWYKKyAq IG5lZWRfcHJlZml4IHdhcyB0cnVlLiAgSWYgcmVsaWQgcG9pbnRzIGEgZm9yZWlnbiB0YWJs ZSwgdXNlIHZhbHVlIG9mIHJlbG5hbWUKKyAqIEZEVyBvcHRpb24gKGlmIGFueSkgaW5zdGVh ZCBvZiByZWxhdGlvbidzIG5hbWUuICBTaW1pbGFybHksIG5zcG5hbWUgRkRXCisgKiBvcHRp b24gb3ZlcnJpZGVzIHNjaGVtYSBuYW1lLgorICovCitzdGF0aWMgdm9pZAorZGVwYXJzZVJl bGF0aW9uKFN0cmluZ0luZm8gYnVmLAorCQkJCU9pZCByZWxpZCwKKwkJCQlQbGFubmVySW5m byAqcm9vdCwKKwkJCQlib29sIG5lZWRfcHJlZml4KQoreworCWludAkJCWk7CisJUmFuZ2VU YmxFbnRyeSAqcnRlID0gTlVMTDsKKwlMaXN0Q2VsbCAgICpsYzsKKwljb25zdCBjaGFyICpu c3BuYW1lID0gTlVMTDsJCS8qIHBsYWluIG5hbWVzcGFjZSBuYW1lICovCisJY29uc3QgY2hh ciAqcmVsbmFtZSA9IE5VTEw7CQkvKiBwbGFpbiByZWxhdGlvbiBuYW1lICovCisJY29uc3Qg Y2hhciAqcV9uc3BuYW1lOwkJCS8qIHF1b3RlZCBuYW1lc3BhY2UgbmFtZSAqLworCWNvbnN0 IGNoYXIgKnFfcmVsbmFtZTsJCQkvKiBxdW90ZWQgcmVsYXRpb24gbmFtZSAqLworCisJLyog RmluZCBSYW5nZVRibEVudHJ5IGZvciB0aGUgcmVsYXRpb24gZnJvbSBQbGFubmVySW5mby4g Ki8KKwlmb3IgKGkgPSAxOyBpIDwgcm9vdC0+c2ltcGxlX3JlbF9hcnJheV9zaXplOyBpKysp CisJeworCQlpZiAocm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtpXS0+cmVsaWQgPT0gcmVsaWQp CisJCXsKKwkJCXJ0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbaV07CisJCQlicmVhazsK KwkJfQorCX0KKwlpZiAocnRlID09IE5VTEwpCisJCWVsb2coRVJST1IsICJyZWxhdGlvbiB3 aXRoIE9JRCAldSBpcyBub3QgdXNlZCBpbiB0aGUgcXVlcnkiLCByZWxpZCk7CisKKwkvKiBJ ZiB0YXJnZXQgaXMgYSBmb3JlaWduIHRhYmxlLCBvYnRhaW4gYWRkaXRpb25hbCBjYXRhbG9n IGluZm9ybWF0aW9uLiAqLworCWlmIChydGUtPnJlbGtpbmQgPT0gUkVMS0lORF9GT1JFSUdO X1RBQkxFKQorCXsKKwkJRm9yZWlnblRhYmxlICp0YWJsZSA9IEdldEZvcmVpZ25UYWJsZShy dGUtPnJlbGlkKTsKKworCQkvKgorCQkgKiBVc2UgdmFsdWUgb2YgRkRXIG9wdGlvbnMgaWYg YW55LCBpbnN0ZWFkIG9mIHRoZSBuYW1lIG9mIG9iamVjdAorCQkgKiBpdHNlbGYuCisJCSAq LworCQlmb3JlYWNoKGxjLCB0YWJsZS0+b3B0aW9ucykKKwkJeworCQkJRGVmRWxlbQkgICAq ZGVmID0gKERlZkVsZW0gKikgbGZpcnN0KGxjKTsKKworCQkJaWYgKG5lZWRfcHJlZml4ICYm IHN0cmNtcChkZWYtPmRlZm5hbWUsICJuc3BuYW1lIikgPT0gMCkKKwkJCQluc3BuYW1lID0g ZGVmR2V0U3RyaW5nKGRlZik7CisJCQllbHNlIGlmIChzdHJjbXAoZGVmLT5kZWZuYW1lLCAi cmVsbmFtZSIpID09IDApCisJCQkJcmVsbmFtZSA9IGRlZkdldFN0cmluZyhkZWYpOworCQl9 CisJfQorCisJLyogUXVvdGUgZWFjaCBpZGVudGlmaWVyLCBpZiBuZWNlc3NhcnkuICovCisJ aWYgKG5lZWRfcHJlZml4KQorCXsKKwkJaWYgKG5zcG5hbWUgPT0gTlVMTCkKKwkJCW5zcG5h bWUgPSBnZXRfbmFtZXNwYWNlX25hbWUoZ2V0X3JlbF9uYW1lc3BhY2UocmVsaWQpKTsKKwkJ cV9uc3BuYW1lID0gcXVvdGVfaWRlbnRpZmllcihuc3BuYW1lKTsKKwl9CisKKwlpZiAocmVs bmFtZSA9PSBOVUxMKQorCQlyZWxuYW1lID0gZ2V0X3JlbF9uYW1lKHJlbGlkKTsKKwlxX3Jl bG5hbWUgPSBxdW90ZV9pZGVudGlmaWVyKHJlbG5hbWUpOworCisJLyogQ29uc3RydWN0IHJl bGF0aW9uIHJlZmVyZW5jZSBpbnRvIHRoZSBidWZmZXIuICovCisJaWYgKG5lZWRfcHJlZml4 KQorCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiVzLiIsIHFfbnNwbmFtZSk7CisJYXBwZW5k U3RyaW5nSW5mbyhidWYsICIlcyIsIHFfcmVsbmFtZSk7Cit9CisKKy8qCisgKiBEZXBhcnNl IGdpdmVuIGNvbnN0YW50IHZhbHVlIGludG8gYnVmLiAgVGhpcyBmdW5jdGlvbiBoYXZlIHRv IGJlIGtlcHQgaW4KKyAqIHN5bmMgd2l0aCBnZXRfY29uc3RfZXhwci4KKyAqLworc3RhdGlj IHZvaWQKK2RlcGFyc2VDb25zdChTdHJpbmdJbmZvIGJ1ZiwKKwkJCSBDb25zdCAqbm9kZSwK KwkJCSBQbGFubmVySW5mbyAqcm9vdCkKK3sKKwlPaWQJCQl0eXBvdXRwdXQ7CisJYm9vbAkJ dHlwSXNWYXJsZW5hOworCWNoYXIJICAgKmV4dHZhbDsKKwlib29sCQlpc2Zsb2F0ID0gZmFs c2U7CisJYm9vbAkJbmVlZGxhYmVsOworCisJaWYgKG5vZGUtPmNvbnN0aXNudWxsKQorCXsK KwkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICJOVUxMIik7CisJCXJldHVybjsKKwl9CisKKwln ZXRUeXBlT3V0cHV0SW5mbyhub2RlLT5jb25zdHR5cGUsCisJCQkJCSAgJnR5cG91dHB1dCwg JnR5cElzVmFybGVuYSk7CisJZXh0dmFsID0gT2lkT3V0cHV0RnVuY3Rpb25DYWxsKHR5cG91 dHB1dCwgbm9kZS0+Y29uc3R2YWx1ZSk7CisKKwlzd2l0Y2ggKG5vZGUtPmNvbnN0dHlwZSkK Kwl7CisJCWNhc2UgQU5ZQVJSQVlPSUQ6CisJCWNhc2UgQU5ZTk9OQVJSQVlPSUQ6CisJCQll bG9nKEVSUk9SLCAiYW55YXJyYXkgYW5kIGFueWVudW0gYXJlIG5vdCBzdXBwb3J0ZWQiKTsK KwkJCWJyZWFrOworCQljYXNlIElOVDJPSUQ6CisJCWNhc2UgSU5UNE9JRDoKKwkJY2FzZSBJ TlQ4T0lEOgorCQljYXNlIE9JRE9JRDoKKwkJY2FzZSBGTE9BVDRPSUQ6CisJCWNhc2UgRkxP QVQ4T0lEOgorCQljYXNlIE5VTUVSSUNPSUQ6CisJCQl7CisJCQkJLyoKKwkJCQkgKiBObyBu ZWVkIHRvIHF1b3RlIHVubGVzcyB0aGV5IGNvbnRhaW4gc3BlY2lhbCB2YWx1ZXMgc3VjaCBh cworCQkJCSAqICdOYW4nLgorCQkJCSAqLworCQkJCWlmIChzdHJzcG4oZXh0dmFsLCAiMDEy MzQ1Njc4OSstZUUuIikgPT0gc3RybGVuKGV4dHZhbCkpCisJCQkJeworCQkJCQlpZiAoZXh0 dmFsWzBdID09ICcrJyB8fCBleHR2YWxbMF0gPT0gJy0nKQorCQkJCQkJYXBwZW5kU3RyaW5n SW5mbyhidWYsICIoJXMpIiwgZXh0dmFsKTsKKwkJCQkJZWxzZQorCQkJCQkJYXBwZW5kU3Ry aW5nSW5mb1N0cmluZyhidWYsIGV4dHZhbCk7CisJCQkJCWlmIChzdHJjc3BuKGV4dHZhbCwg ImVFLiIpICE9IHN0cmxlbihleHR2YWwpKQorCQkJCQkJaXNmbG9hdCA9IHRydWU7CS8qIGl0 IGxvb2tzIGxpa2UgYSBmbG9hdCAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJCWFwcGVuZFN0 cmluZ0luZm8oYnVmLCAiJyVzJyIsIGV4dHZhbCk7CisJCQl9CisJCQlicmVhazsKKwkJY2Fz ZSBCSVRPSUQ6CisJCWNhc2UgVkFSQklUT0lEOgorCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYs ICJCJyVzJyIsIGV4dHZhbCk7CisJCQlicmVhazsKKwkJY2FzZSBCT09MT0lEOgorCQkJaWYg KHN0cmNtcChleHR2YWwsICJ0IikgPT0gMCkKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KGJ1ZiwgInRydWUiKTsKKwkJCWVsc2UKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1 ZiwgImZhbHNlIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJeworCQkJCWNvbnN0 IGNoYXIgKnZhbHB0cjsKKworCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJ1wnJyk7 CisJCQkJZm9yICh2YWxwdHIgPSBleHR2YWw7ICp2YWxwdHI7IHZhbHB0cisrKQorCQkJCXsK KwkJCQkJY2hhcgkJY2ggPSAqdmFscHRyOworCisJCQkJCS8qCisJCQkJCSAqIHN0YW5kYXJk X2NvbmZvcm1pbmdfc3RyaW5ncyBvZiByZW1vdGUgc2Vzc2lvbiBzaG91bGQgYmUKKwkJCQkJ ICogc2V0IHRvIHNpbWlsYXIgdmFsdWUgYXMgbG9jYWwgc2Vzc2lvbi4KKwkJCQkJICovCisJ CQkJCWlmIChTUUxfU1RSX0RPVUJMRShjaCwgIXN0YW5kYXJkX2NvbmZvcm1pbmdfc3RyaW5n cykpCisJCQkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsIGNoKTsKKwkJCQkJYXBwZW5k U3RyaW5nSW5mb0NoYXIoYnVmLCBjaCk7CisJCQkJfQorCQkJCWFwcGVuZFN0cmluZ0luZm9D aGFyKGJ1ZiwgJ1wnJyk7CisJCQl9CisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIEFwcGVu ZCA6OnR5cGVuYW1lIHVubGVzcyB0aGUgY29uc3RhbnQgd2lsbCBiZSBpbXBsaWNpdGx5IHR5 cGVkIGFzIHRoZQorCSAqIHJpZ2h0IHR5cGUgd2hlbiBpdCBpcyByZWFkIGluLgorCSAqCisJ ICogWFhYIHRoaXMgY29kZSBoYXMgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJlaGF2 aW9yIG9mIHRoZSBwYXJzZXIsCisJICogZXNwZWNpYWxseSBtYWtlX2NvbnN0LgorCSAqLwor CXN3aXRjaCAobm9kZS0+Y29uc3R0eXBlKQorCXsKKwkJY2FzZSBCT09MT0lEOgorCQljYXNl IElOVDRPSUQ6CisJCWNhc2UgVU5LTk9XTk9JRDoKKwkJCW5lZWRsYWJlbCA9IGZhbHNlOwor CQkJYnJlYWs7CisJCWNhc2UgTlVNRVJJQ09JRDoKKwkJCW5lZWRsYWJlbCA9ICFpc2Zsb2F0 IHx8IChub2RlLT5jb25zdHR5cG1vZCA+PSAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0Ogor CQkJbmVlZGxhYmVsID0gdHJ1ZTsKKwkJCWJyZWFrOworCX0KKwlpZiAobmVlZGxhYmVsKQor CXsKKwkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICI6OiVzIiwKKwkJCQkJCSBmb3JtYXRfdHlw ZV93aXRoX3R5cGVtb2Qobm9kZS0+Y29uc3R0eXBlLAorCQkJCQkJCQkJCQkJICBub2RlLT5j b25zdHR5cG1vZCkpOworCX0KK30KKworc3RhdGljIHZvaWQKK2RlcGFyc2VCb29sRXhwcihT dHJpbmdJbmZvIGJ1ZiwKKwkJCQlCb29sRXhwciAqbm9kZSwKKwkJCQlQbGFubmVySW5mbyAq cm9vdCkKK3sKKwlMaXN0Q2VsbCAgICpsYzsKKwljaGFyCSAgICpvcDsKKwlib29sCQlmaXJz dDsKKworCXN3aXRjaCAobm9kZS0+Ym9vbG9wKQorCXsKKwkJY2FzZSBBTkRfRVhQUjoKKwkJ CW9wID0gIkFORCI7CisJCQlicmVhazsKKwkJY2FzZSBPUl9FWFBSOgorCQkJb3AgPSAiT1Ii OworCQkJYnJlYWs7CisJCWNhc2UgTk9UX0VYUFI6CisJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1 ZiwgIihOT1QgIik7CisJCQlkZXBhcnNlRXhwcihidWYsIGxpc3RfbnRoKG5vZGUtPmFyZ3Ms IDApLCByb290KTsKKwkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiKSIpOworCQkJcmV0dXJu OworCX0KKworCWZpcnN0ID0gdHJ1ZTsKKwlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIigiKTsK Kwlmb3JlYWNoKGxjLCBub2RlLT5hcmdzKQorCXsKKwkJaWYgKCFmaXJzdCkKKwkJCWFwcGVu ZFN0cmluZ0luZm8oYnVmLCAiICVzICIsIG9wKTsKKwkJZGVwYXJzZUV4cHIoYnVmLCAoRXhw ciAqKSBsZmlyc3QobGMpLCByb290KTsKKwkJZmlyc3QgPSBmYWxzZTsKKwl9CisJYXBwZW5k U3RyaW5nSW5mbyhidWYsICIpIik7Cit9CisKKy8qCisgKiBEZXBhcnNlIGdpdmVuIElTIFtO T1RdIE5VTEwgdGVzdCBleHByZXNzaW9uIGludG8gYnVmLgorICovCitzdGF0aWMgdm9pZAor ZGVwYXJzZU51bGxUZXN0KFN0cmluZ0luZm8gYnVmLAorCQkJCU51bGxUZXN0ICpub2RlLAor CQkJCVBsYW5uZXJJbmZvICpyb290KQoreworCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1Ziwg JygnKTsKKwlkZXBhcnNlRXhwcihidWYsIG5vZGUtPmFyZywgcm9vdCk7CisJaWYgKG5vZGUt Pm51bGx0ZXN0dHlwZSA9PSBJU19OVUxMKQorCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBJ UyBOVUxMKSIpOworCWVsc2UKKwkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgSVMgTk9UIE5V TEwpIik7Cit9CisKK3N0YXRpYyB2b2lkCitkZXBhcnNlRGlzdGluY3RFeHByKFN0cmluZ0lu Zm8gYnVmLAorCQkJCQlEaXN0aW5jdEV4cHIgKm5vZGUsCisJCQkJCVBsYW5uZXJJbmZvICpy b290KQoreworCUFzc2VydChsaXN0X2xlbmd0aChub2RlLT5hcmdzKSA9PSAyKTsKKworCWRl cGFyc2VFeHByKGJ1ZiwgbGluaXRpYWwobm9kZS0+YXJncyksIHJvb3QpOworCWFwcGVuZFN0 cmluZ0luZm8oYnVmLCAiIElTIERJU1RJTkNUIEZST00gIik7CisJZGVwYXJzZUV4cHIoYnVm LCBsc2Vjb25kKG5vZGUtPmFyZ3MpLCByb290KTsKK30KKworc3RhdGljIHZvaWQKK2RlcGFy c2VSZWxhYmVsVHlwZShTdHJpbmdJbmZvIGJ1ZiwKKwkJCQkgICBSZWxhYmVsVHlwZSAqbm9k ZSwKKwkJCQkgICBQbGFubmVySW5mbyAqcm9vdCkKK3sKKwljaGFyCSAgICp0eXBuYW1lOwor CisJQXNzZXJ0KG5vZGUtPmFyZyk7CisKKwkvKiBXZSBkb24ndCBuZWVkIHRvIGRlcGFyc2Ug Y2FzdCB3aGVuIGFyZ3VtZW50IGhhcyBzYW1lIHR5cGUgYXMgcmVzdWx0LiAqLworCWlmIChJ c0Eobm9kZS0+YXJnLCBDb25zdCkgJiYKKwkJKChDb25zdCAqKSBub2RlLT5hcmcpLT5jb25z dHR5cGUgPT0gbm9kZS0+cmVzdWx0dHlwZSAmJgorCQkoKENvbnN0ICopIG5vZGUtPmFyZykt PmNvbnN0dHlwbW9kID09IC0xKQorCXsKKwkJZGVwYXJzZUV4cHIoYnVmLCBub2RlLT5hcmcs IHJvb3QpOworCQlyZXR1cm47CisJfQorCisJdHlwbmFtZSA9IGZvcm1hdF90eXBlX3dpdGhf dHlwZW1vZChub2RlLT5yZXN1bHR0eXBlLCBub2RlLT5yZXN1bHR0eXBtb2QpOworCWFwcGVu ZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJygnKTsKKwlkZXBhcnNlRXhwcihidWYsIG5vZGUtPmFy Zywgcm9vdCk7CisJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIpOjolcyIsIHR5cG5hbWUpOwor fQorCisvKgorICogRGVwYXJzZSBnaXZlbiBub2RlIHdoaWNoIHJlcHJlc2VudHMgYSBmdW5j dGlvbiBjYWxsIGludG8gYnVmLiAgV2UgdHJlYXQgb25seQorICogZXhwbGljaXQgZnVuY3Rp b24gY2FsbCBhbmQgZXhwbGljaXQgY2FzdCAoY29lcmNlKSwgYmVjYXVzZSBvdGhlcnMgYXJl CisgKiBwcm9jZXNzZWQgb24gcmVtb3RlIHNpZGUgaWYgbmVjZXNzYXJ5LgorICoKKyAqIEZ1 bmN0aW9uIG5hbWUgKGFuZCB0eXBlIG5hbWUpIGlzIGFsd2F5cyBxdWFsaWZpZWQgYnkgc2No ZW1hIG5hbWUgdG8gYXZvaWQKKyAqIHByb2JsZW1zIGNhdXNlZCBieSBkaWZmZXJlbnQgc2V0 dGluZyBvZiBzZWFyY2hfcGF0aCBvbiByZW1vdGUgc2lkZS4KKyAqLworc3RhdGljIHZvaWQK K2RlcGFyc2VGdW5jRXhwcihTdHJpbmdJbmZvIGJ1ZiwKKwkJCQlGdW5jRXhwciAqbm9kZSwK KwkJCQlQbGFubmVySW5mbyAqcm9vdCkKK3sKKwlPaWQJCQkJcHJvbmFtZXNwYWNlOworCWNv bnN0IGNoYXIJICAgKnNjaGVtYW5hbWU7CisJY29uc3QgY2hhcgkgICAqZnVuY25hbWU7CisJ TGlzdENlbGwJICAgKmFyZzsKKwlib29sCQkJZmlyc3Q7CisKKwlwcm9uYW1lc3BhY2UgPSBn ZXRfZnVuY19uYW1lc3BhY2Uobm9kZS0+ZnVuY2lkKTsKKwlzY2hlbWFuYW1lID0gcXVvdGVf aWRlbnRpZmllcihnZXRfbmFtZXNwYWNlX25hbWUocHJvbmFtZXNwYWNlKSk7CisJZnVuY25h bWUgPSBxdW90ZV9pZGVudGlmaWVyKGdldF9mdW5jX25hbWUobm9kZS0+ZnVuY2lkKSk7CisK KwlpZiAobm9kZS0+ZnVuY2Zvcm1hdCA9PSBDT0VSQ0VfRVhQTElDSVRfQ0FMTCkKKwl7CisJ CS8qIEZ1bmN0aW9uIGNhbGwsIGRlcGFyc2UgYWxsIGFyZ3VtZW50cyByZWN1cnNpdmVseS4g Ki8KKwkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIlcy4lcygiLCBzY2hlbWFuYW1lLCBmdW5j bmFtZSk7CisJCWZpcnN0ID0gdHJ1ZTsKKwkJZm9yZWFjaChhcmcsIG5vZGUtPmFyZ3MpCisJ CXsKKwkJCWlmICghZmlyc3QpCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIsICIpOwor CQkJZGVwYXJzZUV4cHIoYnVmLCBsZmlyc3QoYXJnKSwgcm9vdCk7CisJCQlmaXJzdCA9IGZh bHNlOworCQl9CisJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyknKTsKKwl9CisJZWxz ZSBpZiAobm9kZS0+ZnVuY2Zvcm1hdCA9PSBDT0VSQ0VfRVhQTElDSVRfQ0FTVCkKKwl7CisJ CS8qIEV4cGxpY2l0IGNhc3QsIGRlcGFyc2Ugb25seSBmaXJzdCBhcmd1bWVudC4gKi8KKwkJ YXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKCcpOworCQlkZXBhcnNlRXhwcihidWYsIGxp bml0aWFsKG5vZGUtPmFyZ3MpLCByb290KTsKKwkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIp OjolcyIsIGZ1bmNuYW1lKTsKKwl9CisJZWxzZQorCXsKKwkJLyogSW1wbGljaXQgY2FzdCwg ZGVwYXJzZSBvbmx5IGZpcnN0IGFyZ3VtZW50LiAqLworCQlkZXBhcnNlRXhwcihidWYsIGxp bml0aWFsKG5vZGUtPmFyZ3MpLCByb290KTsKKwl9Cit9CisKKy8qCisgKiBEZXBhcnNlIGdp dmVuIFBhcmFtIG5vZGUgaW50byBidWYuCisgKgorICogV2UgZG9uJ3QgcmVudW1iZXIgcGFy YW1ldGVyIGlkLCBiZWNhdXNlIHNraXBwaW5nICQxIGlzIG5vdCBjYXVzZSBwcm9ibGVtCisg KiBhcyBmYXIgYXMgd2UgcGFzcyB0aHJvdWdoIGFsbCBhcmd1bWVudHMuCisgKi8KK3N0YXRp YyB2b2lkCitkZXBhcnNlUGFyYW0oU3RyaW5nSW5mbyBidWYsCisJCQkgUGFyYW0gKm5vZGUs CisJCQkgUGxhbm5lckluZm8gKnJvb3QpCit7CisJQXNzZXJ0KG5vZGUtPnBhcmFta2luZCA9 PSBQQVJBTV9FWFRFUk4pOworCisJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIkJWQiLCBub2Rl LT5wYXJhbWlkKTsKK30KKworLyoKKyAqIERlcGFyc2UgZ2l2ZW4gU2NhbGFyQXJyYXlPcEV4 cHIgZXhwcmVzc2lvbiBpbnRvIGJ1Zi4gIFRvIGF2b2lkIHByb2JsZW1zCisgKiBhcm91bmQg cHJpb3JpdHkgb2Ygb3BlcmF0aW9ucywgd2UgYWx3YXlzIHBhcmVudGhlc2l6ZSB0aGUgYXJn dW1lbnRzLiAgQWxzbyB3ZQorICogdXNlIE9QRVJBVE9SKHNjaGVtYS5vcGVyYXRvcikgbm90 YXRpb24gdG8gZGV0ZXJtaW5lIHJlbW90ZSBvcGVyYXRvciBleGFjdGx5LgorICovCitzdGF0 aWMgdm9pZAorZGVwYXJzZVNjYWxhckFycmF5T3BFeHByKFN0cmluZ0luZm8gYnVmLAorCQkJ CQkJIFNjYWxhckFycmF5T3BFeHByICpub2RlLAorCQkJCQkJIFBsYW5uZXJJbmZvICpyb290 KQoreworCUhlYXBUdXBsZQl0dXBsZTsKKwlGb3JtX3BnX29wZXJhdG9yIGZvcm07CisJY29u c3QgY2hhciAqb3Buc3BuYW1lOworCWNoYXIJICAgKm9wbmFtZTsKKwlFeHByCSAgICphcmcx OworCUV4cHIJICAgKmFyZzI7CisKKwkvKiBSZXRyaWV2ZSBuZWNlc3NhcnkgaW5mb3JtYXRp b24gYWJvdXQgdGhlIG9wZXJhdG9yIGZyb20gc3lzdGVtIGNhdGFsb2cuICovCisJdHVwbGUg PSBTZWFyY2hTeXNDYWNoZTEoT1BFUk9JRCwgT2JqZWN0SWRHZXREYXR1bShub2RlLT5vcG5v KSk7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1cGxlKSkKKwkJZWxvZyhFUlJPUiwgImNh Y2hlIGxvb2t1cCBmYWlsZWQgZm9yIG9wZXJhdG9yICV1Iiwgbm9kZS0+b3Bubyk7CisJZm9y bSA9IChGb3JtX3BnX29wZXJhdG9yKSBHRVRTVFJVQ1QodHVwbGUpOworCS8qIG9wbmFtZSBp cyBub3QgYSBTUUwgaWRlbnRpZmllciwgc28gd2UgZG9uJ3QgbmVlZCB0byBxdW90ZSBpdC4g Ki8KKwlvcG5hbWUgPSBOYW1lU3RyKGZvcm0tPm9wcm5hbWUpOworCW9wbnNwbmFtZSA9IHF1 b3RlX2lkZW50aWZpZXIoZ2V0X25hbWVzcGFjZV9uYW1lKGZvcm0tPm9wcm5hbWVzcGFjZSkp OworCVJlbGVhc2VTeXNDYWNoZSh0dXBsZSk7CisKKwkvKiBTYW5pdHkgY2hlY2suICovCisJ QXNzZXJ0KGxpc3RfbGVuZ3RoKG5vZGUtPmFyZ3MpID09IDIpOworCisJLyogQWx3YXlzIHBh cmVudGhlc2l6ZSB0aGUgZXhwcmVzc2lvbi4gKi8KKwlhcHBlbmRTdHJpbmdJbmZvQ2hhcihi dWYsICcoJyk7CisKKwkvKiBFeHRyYWN0IG9wZXJhbmRzLiAqLworCWFyZzEgPSBsaW5pdGlh bChub2RlLT5hcmdzKTsKKwlhcmcyID0gbHNlY29uZChub2RlLT5hcmdzKTsKKworCS8qIERl cGFyc2UgZnVsbHkgcXVhbGlmaWVkIG9wZXJhdG9yIG5hbWUuICovCisJZGVwYXJzZUV4cHIo YnVmLCBhcmcxLCByb290KTsKKwlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBPUEVSQVRPUigl cy4lcykgJXMgKCIsCisJCQkJCSBvcG5zcG5hbWUsIG9wbmFtZSwgbm9kZS0+dXNlT3IgPyAi QU5ZIiA6ICJBTEwiKTsKKwlkZXBhcnNlRXhwcihidWYsIGFyZzIsIHJvb3QpOworCWFwcGVu ZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyknKTsKKworCS8qIEFsd2F5cyBwYXJlbnRoZXNpemUg dGhlIGV4cHJlc3Npb24uICovCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOwor fQorCisvKgorICogRGVwYXJzZSBnaXZlbiBvcGVyYXRvciBleHByZXNzaW9uIGludG8gYnVm LiAgVG8gYXZvaWQgcHJvYmxlbXMgYXJvdW5kCisgKiBwcmlvcml0eSBvZiBvcGVyYXRpb25z LCB3ZSBhbHdheXMgcGFyZW50aGVzaXplIHRoZSBhcmd1bWVudHMuICBBbHNvIHdlIHVzZQor ICogT1BFUkFUT1Ioc2NoZW1hLm9wZXJhdG9yKSBub3RhdGlvbiB0byBkZXRlcm1pbmUgcmVt b3RlIG9wZXJhdG9yIGV4YWN0bHkuCisgKi8KK3N0YXRpYyB2b2lkCitkZXBhcnNlT3BFeHBy KFN0cmluZ0luZm8gYnVmLAorCQkJICBPcEV4cHIgKm5vZGUsCisJCQkgIFBsYW5uZXJJbmZv ICpyb290KQoreworCUhlYXBUdXBsZQl0dXBsZTsKKwlGb3JtX3BnX29wZXJhdG9yIGZvcm07 CisJY29uc3QgY2hhciAqb3Buc3BuYW1lOworCWNoYXIJICAgKm9wbmFtZTsKKwljaGFyCQlv cHJraW5kOworCUxpc3RDZWxsICAgKmFyZzsKKworCS8qIFJldHJpZXZlIG5lY2Vzc2FyeSBp bmZvcm1hdGlvbiBhYm91dCB0aGUgb3BlcmF0b3IgZnJvbSBzeXN0ZW0gY2F0YWxvZy4gKi8K Kwl0dXBsZSA9IFNlYXJjaFN5c0NhY2hlMShPUEVST0lELCBPYmplY3RJZEdldERhdHVtKG5v ZGUtPm9wbm8pKTsKKwlpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHVwbGUpKQorCQllbG9nKEVS Uk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3Igb3BlcmF0b3IgJXUiLCBub2RlLT5vcG5v KTsKKwlmb3JtID0gKEZvcm1fcGdfb3BlcmF0b3IpIEdFVFNUUlVDVCh0dXBsZSk7CisJb3Bu c3BuYW1lID0gcXVvdGVfaWRlbnRpZmllcihnZXRfbmFtZXNwYWNlX25hbWUoZm9ybS0+b3By bmFtZXNwYWNlKSk7CisJLyogb3BuYW1lIGlzIG5vdCBhIFNRTCBpZGVudGlmaWVyLCBzbyB3 ZSBkb24ndCBuZWVkIHRvIHF1b3RlIGl0LiAqLworCW9wbmFtZSA9IE5hbWVTdHIoZm9ybS0+ b3BybmFtZSk7CisJb3Bya2luZCA9IGZvcm0tPm9wcmtpbmQ7CisJUmVsZWFzZVN5c0NhY2hl KHR1cGxlKTsKKworCS8qIFNhbml0eSBjaGVjay4gKi8KKwlBc3NlcnQoKG9wcmtpbmQgPT0g J3InICYmIGxpc3RfbGVuZ3RoKG5vZGUtPmFyZ3MpID09IDEpIHx8CisJCSAgIChvcHJraW5k ID09ICdsJyAmJiBsaXN0X2xlbmd0aChub2RlLT5hcmdzKSA9PSAxKSB8fAorCQkgICAob3By a2luZCA9PSAnYicgJiYgbGlzdF9sZW5ndGgobm9kZS0+YXJncykgPT0gMikpOworCisJLyog QWx3YXlzIHBhcmVudGhlc2l6ZSB0aGUgZXhwcmVzc2lvbi4gKi8KKwlhcHBlbmRTdHJpbmdJ bmZvQ2hhcihidWYsICcoJyk7CisKKwkvKiBEZXBhcnNlIGZpcnN0IG9wZXJhbmQuICovCisJ YXJnID0gbGlzdF9oZWFkKG5vZGUtPmFyZ3MpOworCWlmIChvcHJraW5kID09ICdyJyB8fCBv cHJraW5kID09ICdiJykKKwl7CisJCWRlcGFyc2VFeHByKGJ1ZiwgbGZpcnN0KGFyZyksIHJv b3QpOworCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcgJyk7CisJfQorCisJLyogRGVw YXJzZSBmdWxseSBxdWFsaWZpZWQgb3BlcmF0b3IgbmFtZS4gKi8KKwlhcHBlbmRTdHJpbmdJ bmZvKGJ1ZiwgIk9QRVJBVE9SKCVzLiVzKSIsIG9wbnNwbmFtZSwgb3BuYW1lKTsKKworCS8q IERlcGFyc2UgbGFzdCBvcGVyYW5kLiAqLworCWFyZyA9IGxpc3RfdGFpbChub2RlLT5hcmdz KTsKKwlpZiAob3Bya2luZCA9PSAnbCcgfHwgb3Bya2luZCA9PSAnYicpCisJeworCQlhcHBl bmRTdHJpbmdJbmZvQ2hhcihidWYsICcgJyk7CisJCWRlcGFyc2VFeHByKGJ1ZiwgbGZpcnN0 KGFyZyksIHJvb3QpOworCX0KKworCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyknKTsK K30KKworc3RhdGljIHZvaWQKK2RlcGFyc2VBcnJheVJlZihTdHJpbmdJbmZvIGJ1ZiwKKwkJ CQlBcnJheVJlZiAqbm9kZSwKKwkJCQlQbGFubmVySW5mbyAqcm9vdCkKK3sKKwlMaXN0Q2Vs bAkgICAqbG93bGlzdF9pdGVtOworCUxpc3RDZWxsCSAgICp1cGxpc3RfaXRlbTsKKworCS8q IEFsd2F5cyBwYXJlbnRoZXNpemUgdGhlIGV4cHJlc3Npb24uICovCisJYXBwZW5kU3RyaW5n SW5mb0NoYXIoYnVmLCAnKCcpOworCisJLyogRGVwYXJzZSByZWZlcmVuY2VkIGFycmF5IGV4 cHJlc3Npb24gZmlyc3QuICovCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKCcpOwor CWRlcGFyc2VFeHByKGJ1Ziwgbm9kZS0+cmVmZXhwciwgcm9vdCk7CisJYXBwZW5kU3RyaW5n SW5mb0NoYXIoYnVmLCAnKScpOworCisJLyogRGVwYXJzZSBzdWJzY3JpcHRzIGV4cHJlc3Np b24uICovCisJbG93bGlzdF9pdGVtID0gbGlzdF9oZWFkKG5vZGUtPnJlZmxvd2VyaW5kZXhw cik7CS8qIGNvdWxkIGJlIE5VTEwgKi8KKwlmb3JlYWNoKHVwbGlzdF9pdGVtLCBub2RlLT5y ZWZ1cHBlcmluZGV4cHIpCisJeworCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICdbJyk7 CisJCWlmIChsb3dsaXN0X2l0ZW0pCisJCXsKKwkJCWRlcGFyc2VFeHByKGJ1ZiwgbGZpcnN0 KGxvd2xpc3RfaXRlbSksIHJvb3QpOworCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAn OicpOworCQkJbG93bGlzdF9pdGVtID0gbG5leHQobG93bGlzdF9pdGVtKTsKKwkJfQorCQlk ZXBhcnNlRXhwcihidWYsIGxmaXJzdCh1cGxpc3RfaXRlbSksIHJvb3QpOworCQlhcHBlbmRT dHJpbmdJbmZvQ2hhcihidWYsICddJyk7CisJfQorCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIo YnVmLCAnKScpOworfQorCisKKy8qCisgKiBEZXBhcnNlIGdpdmVuIGFycmF5IG9mIHNvbWV0 aGluZyBpbnRvIGJ1Zi4KKyAqLworc3RhdGljIHZvaWQKK2RlcGFyc2VBcnJheUV4cHIoU3Ry aW5nSW5mbyBidWYsCisJCQkJIEFycmF5RXhwciAqbm9kZSwKKwkJCQkgUGxhbm5lckluZm8g KnJvb3QpCit7CisJTGlzdENlbGwJICAgKmxjOworCWJvb2wJCQlmaXJzdCA9IHRydWU7CisK KwlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIkFSUkFZWyIpOworCWZvcmVhY2gobGMsIG5vZGUt PmVsZW1lbnRzKQorCXsKKwkJaWYgKCFmaXJzdCkKKwkJCWFwcGVuZFN0cmluZ0luZm8oYnVm LCAiLCAiKTsKKwkJZGVwYXJzZUV4cHIoYnVmLCBsZmlyc3QobGMpLCByb290KTsKKworCQlm aXJzdCA9IGZhbHNlOworCX0KKwlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICddJyk7CisK KwkvKiBJZiB0aGUgYXJyYXkgaXMgZW1wdHksIHdlIG5lZWQgZXhwbGljaXQgY2FzdCB0byB0 aGUgYXJyYXkgdHlwZS4gKi8KKwlpZiAobm9kZS0+ZWxlbWVudHMgPT0gTklMKQorCXsKKwkJ Y2hhcgkgICAqdHlwbmFtZTsKKworCQl0eXBuYW1lID0gZm9ybWF0X3R5cGVfd2l0aF90eXBl bW9kKG5vZGUtPmFycmF5X3R5cGVpZCwgLTEpOworCQlhcHBlbmRTdHJpbmdJbmZvKGJ1Ziwg Ijo6JXMiLCB0eXBuYW1lKTsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgZ2l2 ZW4gZXhwciBpcyBzYWZlIHRvIGV2YWx1YXRlIG9uIHRoZSBmb3JlaWduIHNlcnZlci4gIElm CisgKiByZXN1bHQgaXMgdHJ1ZSwgZXh0cmEgaW5mb3JtYXRpb24gaGFzX3BhcmFtIHRlbGxz IHdoZXRoZXIgZ2l2ZW4gZXhwcmVzc2lvbgorICogY29udGFpbnMgYW55IFBhcmFtIG5vZGUu ICBUaGlzIGlzIHVzZWZ1bCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZXhwcmVzc2lvbgor ICogY2FuIGJlIHVzZWQgaW4gcmVtb3RlIEVYUExBSU4uCisgKi8KK3N0YXRpYyBib29sCitp c19mb3JlaWduX2V4cHIoUGxhbm5lckluZm8gKnJvb3QsCisJCQkJUmVsT3B0SW5mbyAqYmFz ZXJlbCwKKwkJCQlFeHByICpleHByLAorCQkJCWJvb2wgKmhhc19wYXJhbSkKK3sKKwlmb3Jl aWduX2V4ZWN1dGFibGVfY3h0CWNvbnRleHQ7CisJY29udGV4dC5yb290ID0gcm9vdDsKKwlj b250ZXh0LmZvcmVpZ25yZWwgPSBiYXNlcmVsOworCWNvbnRleHQuaGFzX3BhcmFtID0gZmFs c2U7CisKKwkvKgorCSAqIEFuIGV4cHJlc3Npb24gd2hpY2ggaW5jbHVkZXMgYW55IG11dGFi bGUgZnVuY3Rpb24gY2FuJ3QgYmUgcHVzaGVkIGRvd24KKwkgKiBiZWNhdXNlIGl0J3MgcmVz dWx0IGlzIG5vdCBzdGFibGUuICBGb3IgZXhhbXBsZSwgcHVzaGluZyBub3coKSBkb3duIHRv CisJICogcmVtb3RlIHNpZGUgd291bGQgY2F1c2UgY29uZnVzaW9uIGZyb20gdGhlIGNsb2Nr IG9mZnNldC4KKwkgKiBJZiB3ZSBoYXZlIHJvdXRpbmUgbWFwcGluZyBpbmZyYXN0cnVjdHVy ZSBpbiBmdXR1cmUgcmVsZWFzZSwgd2Ugd2lsbCBiZQorCSAqIGFibGUgdG8gY2hvb3NlIGZ1 bmN0aW9uIHRvIGJlIHB1c2hlZCBkb3duIGluIGZpbmVyIGdyYW51bGFyaXR5LgorCSAqLwor CWlmIChjb250YWluX211dGFibGVfZnVuY3Rpb25zKChOb2RlICopIGV4cHIpKQorCQlyZXR1 cm4gZmFsc2U7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIGV4cHJlc3Npb24gY29uc2lz dHMgb2Ygbm9kZXMgd2hpY2ggYXJlIGtub3duIGFzIHNhZmUgdG8KKwkgKiBiZSBwdXNoZWQg ZG93bi4KKwkgKi8KKwlpZiAoZm9yZWlnbl9leHByX3dhbGtlcigoTm9kZSAqKSBleHByLCAm Y29udGV4dCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogVGVsbCBjYWxsZXIgd2hl dGhlciB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBjb250YWlucyBhbnkgUGFyYW0gbm9kZSwgd2hp Y2gKKwkgKiBjYW4ndCBiZSB1c2VkIGluIEVYUExBSU4gc3RhdGVtZW50IGJlZm9yZSBleGVj dXRvciBzdGFydHMuCisJICovCisJKmhhc19wYXJhbSA9IGNvbnRleHQuaGFzX3BhcmFtOwor CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiBub2RlIGluY2x1 ZGVzIGFueSBub2RlIHdoaWNoIGlzIG5vdCBrbm93biBhcyBzYWZlIHRvIGJlCisgKiBwdXNo ZWQgZG93bi4KKyAqLworc3RhdGljIGJvb2wKK2ZvcmVpZ25fZXhwcl93YWxrZXIoTm9kZSAq bm9kZSwgZm9yZWlnbl9leGVjdXRhYmxlX2N4dCAqY29udGV4dCkKK3sKKwlpZiAobm9kZSA9 PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIFNwZWNpYWwgY2FzZSBoYW5k bGluZyBmb3IgTGlzdDsgZXhwcmVzc2lvbl90cmVlX3dhbGtlciBoYW5kbGVzIExpc3QgYXMK KwkgKiB3ZWxsIGFzIG90aGVyIEV4cHIgbm9kZXMuICBGb3IgaW5zdGFuY2UsIExpc3QgaXMg dXNlZCBpbiBSZXN0cmljdEluZm8KKwkgKiBmb3IgYXJncyBvZiBGdW5jRXhwciBub2RlLgor CSAqCisJICogQWx0aG91Z2ggdGhlIGNvbW1lbnRzIG9mIGV4cHJlc3Npb25fdHJlZV93YWxr ZXIgbWVudGlvbiB0aGF0CisJICogUmFuZ2VUYmxSZWYsIEZyb21FeHByLCBKb2luRXhwciwg YW5kIFNldE9wZXJhdGlvblN0bXQgYXJlIGhhbmRsZWQgYXMKKwkgKiB3ZWxsLCBidXQgd2Ug ZG9uJ3QgY2FyZSB0aGVtIGJlY2F1c2UgdGhleSBhcmUgbm90IHVzZWQgaW4gUmVzdHJpY3RJ bmZvLgorCSAqIElmIG9uZSBvZiB0aGVtIHdhcyBwYXNzZWQgaW50bywgZGVmYXVsdCBsYWJl bCBjYXRjaGVzIGl0IGFuZCBnaXZlIHVwCisJICogdHJhdmVyc2luZy4KKwkgKi8KKwlpZiAo SXNBKG5vZGUsIExpc3QpKQorCXsKKwkJTGlzdENlbGwJICAgKmxjOworCisJCWZvcmVhY2go bGMsIChMaXN0ICopIG5vZGUpCisJCXsKKwkJCWlmIChmb3JlaWduX2V4cHJfd2Fsa2VyKGxm aXJzdChsYyksIGNvbnRleHQpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBm YWxzZTsKKwl9CisKKwkvKgorCSAqIElmIHJldHVybiB0eXBlIG9mIGdpdmVuIGV4cHJlc3Np b24gaXMgbm90IGJ1aWx0LWluLCBpdCBjYW4ndCBiZSBwdXNoZWQKKwkgKiBkb3duIGJlY2F1 c2UgaXQgbWlnaHQgaGFzIGluY29tcGF0aWJsZSBzZW1hbnRpY3Mgb24gcmVtb3RlIHNpZGUu CisJICovCisJaWYgKCFpc19idWlsdGluKGV4cHJUeXBlKG5vZGUpKSkKKwkJcmV0dXJuIHRy dWU7CisKKwlzd2l0Y2ggKG5vZGVUYWcobm9kZSkpCisJeworCQljYXNlIFRfQ29uc3Q6CisJ CQkvKgorCQkJICogVXNpbmcgYW55YXJyYXkgYW5kL29yIGFueWVudW0gaW4gcmVtb3RlIHF1 ZXJ5IGlzIG5vdCBzdXBwb3J0ZWQuCisJCQkgKi8KKwkJCWlmICgoKENvbnN0ICopIG5vZGUp LT5jb25zdHR5cGUgPT0gQU5ZQVJSQVlPSUQgfHwKKwkJCQkoKENvbnN0ICopIG5vZGUpLT5j b25zdHR5cGUgPT0gQU5ZTk9OQVJSQVlPSUQpCisJCQkJcmV0dXJuIHRydWU7CisJCQlicmVh azsKKwkJY2FzZSBUX0Jvb2xFeHByOgorCQljYXNlIFRfTnVsbFRlc3Q6CisJCWNhc2UgVF9E aXN0aW5jdEV4cHI6CisJCWNhc2UgVF9SZWxhYmVsVHlwZToKKwkJCS8qCisJCQkgKiBUaGVz ZSB0eXBlIG9mIG5vZGVzIGFyZSBrbm93biBhcyBzYWZlIHRvIGJlIHB1c2hlZCBkb3duLgor CQkJICogT2YgY291cnNlIHRoZSBzdWJ0cmVlIG9mIHRoZSBub2RlLCBpZiBhbnksIHNob3Vs ZCBiZSBjaGVja2VkCisJCQkgKiBjb250aW51b3VzbHkgYXQgdGhlIHRhaWwgb2YgdGhpcyBm dW5jdGlvbi4KKwkJCSAqLworCQkJYnJlYWs7CisJCS8qCisJCSAqIElmIGZ1bmN0aW9uIHVz ZWQgYnkgdGhlIGV4cHJlc3Npb24gaXMgbm90IGJ1aWx0LWluLCBpdCBjYW4ndCBiZQorCQkg KiBwdXNoZWQgZG93biBiZWNhdXNlIGl0IG1pZ2h0IGhhcyBpbmNvbXBhdGlibGUgc2VtYW50 aWNzIG9uIHJlbW90ZQorCQkgKiBzaWRlLgorCQkgKi8KKwkJY2FzZSBUX0Z1bmNFeHByOgor CQkJeworCQkJCUZ1bmNFeHByCSAgICpmZSA9IChGdW5jRXhwciAqKSBub2RlOworCQkJCWlm ICghaXNfYnVpbHRpbihmZS0+ZnVuY2lkKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJ CQlicmVhazsKKwkJY2FzZSBUX1BhcmFtOgorCQkJLyoKKwkJCSAqIE9ubHkgZXh0ZXJuYWwg cGFyYW1ldGVycyBjYW4gYmUgcHVzaGVkIGRvd24uOgorCQkJICovCisJCQl7CisJCQkJaWYg KCgoUGFyYW0gKikgbm9kZSktPnBhcmFta2luZCAhPSBQQVJBTV9FWFRFUk4pCisJCQkJCXJl dHVybiB0cnVlOworCisJCQkJLyogTWFyayB0aGF0IHRoaXMgZXhwcmVzc2lvbiBjb250YWlu cyBQYXJhbSBub2RlLiAqLworCQkJCWNvbnRleHQtPmhhc19wYXJhbSA9IHRydWU7CisJCQl9 CisJCQlicmVhazsKKwkJY2FzZSBUX1NjYWxhckFycmF5T3BFeHByOgorCQkJLyoKKwkJCSAq IE9ubHkgYnVpbHQtaW4gb3BlcmF0b3JzIGNhbiBiZSBwdXNoZWQgZG93bi4gIEluIGFkZGl0 aW9uLAorCQkJICogdW5kZXJseWluZyBmdW5jdGlvbiBtdXN0IGJlIGJ1aWx0LWluIGFuZCBp bW11dGFibGUsIGJ1dCB3ZSBkb24ndAorCQkJICogY2hlY2sgdm9sYXRpbGl0eSBoZXJlOyBz dWNoIGNoZWNrIG11c3QgYmUgZG9uZSBhbHJlYWR5IHdpdGgKKwkJCSAqIGNvbnRhaW5fbXV0 YWJsZV9mdW5jdGlvbnMuCisJCQkgKi8KKwkJCXsKKwkJCQlTY2FsYXJBcnJheU9wRXhwciAg ICpvZSA9IChTY2FsYXJBcnJheU9wRXhwciAqKSBub2RlOworCisJCQkJaWYgKCFpc19idWls dGluKG9lLT5vcG5vKSB8fCAhaXNfYnVpbHRpbihvZS0+b3BmdW5jaWQpKQorCQkJCQlyZXR1 cm4gdHJ1ZTsKKworCQkJCS8qCisJCQkJICogSWYgdGhlIG9wZXJhdG9yIHRha2VzIGNvbGxh dGFibGUgdHlwZSBhcyBvcGVyYW5kcywgd2UgcHVzaAorCQkJCSAqIGRvd24gb25seSAiPSIg YW5kICI8PiIgd2hpY2ggYXJlIG5vdCBhZmZlY3RlZCBieSBjb2xsYXRpb24uCisJCQkJICog T3RoZXIgb3BlcmF0b3JzIG1pZ2h0IGJlIHNhZmUgYWJvdXQgY29sbGF0aW9uLCBidXQgdGhl c2UgdHdvCisJCQkJICogc2VlbSBlbm91Z2ggdG8gY292ZXIgcHJhY3RpY2FsIHVzZSBjYXNl cy4KKwkJCQkgKi8KKwkJCQlpZiAoZXhwcklucHV0Q29sbGF0aW9uKG5vZGUpICE9IEludmFs aWRPaWQpCisJCQkJeworCQkJCQljaGFyICAgKm9wbmFtZSA9IGdldF9vcG5hbWUob2UtPm9w bm8pOworCisJCQkJCWlmIChzdHJjbXAob3BuYW1lLCAiPSIpICE9IDAgJiYgc3RyY21wKG9w bmFtZSwgIjw+IikgIT0gMCkKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKworCQkJCS8q IG9wZXJhbmRzIGFyZSBjaGVja2VkIGxhdGVyICovCisJCQl9CisJCQlicmVhazsKKwkJY2Fz ZSBUX09wRXhwcjoKKwkJCS8qCisJCQkgKiBPbmx5IGJ1aWx0LWluIG9wZXJhdG9ycyBjYW4g YmUgcHVzaGVkIGRvd24uICBJbiBhZGRpdGlvbiwKKwkJCSAqIHVuZGVybHlpbmcgZnVuY3Rp b24gbXVzdCBiZSBidWlsdC1pbiBhbmQgaW1tdXRhYmxlLCBidXQgd2UgZG9uJ3QKKwkJCSAq IGNoZWNrIHZvbGF0aWxpdHkgaGVyZTsgc3VjaCBjaGVjayBtdXN0IGJlIGRvbmUgYWxyZWFk eSB3aXRoCisJCQkgKiBjb250YWluX211dGFibGVfZnVuY3Rpb25zLgorCQkJICovCisJCQl7 CisJCQkJT3BFeHByCSAgICpvZSA9IChPcEV4cHIgKikgbm9kZTsKKworCQkJCWlmICghaXNf YnVpbHRpbihvZS0+b3BubykgfHwgIWlzX2J1aWx0aW4ob2UtPm9wZnVuY2lkKSkKKwkJCQkJ cmV0dXJuIHRydWU7CisKKwkJCQkvKgorCQkJCSAqIElmIHRoZSBvcGVyYXRvciB0YWtlcyBj b2xsYXRhYmxlIHR5cGUgYXMgb3BlcmFuZHMsIHdlIHB1c2gKKwkJCQkgKiBkb3duIG9ubHkg Ij0iIGFuZCAiPD4iIHdoaWNoIGFyZSBub3QgYWZmZWN0ZWQgYnkgY29sbGF0aW9uLgorCQkJ CSAqIE90aGVyIG9wZXJhdG9ycyBtaWdodCBiZSBzYWZlIGFib3V0IGNvbGxhdGlvbiwgYnV0 IHRoZXNlIHR3bworCQkJCSAqIHNlZW0gZW5vdWdoIHRvIGNvdmVyIHByYWN0aWNhbCB1c2Ug Y2FzZXMuCisJCQkJICovCisJCQkJaWYgKGV4cHJJbnB1dENvbGxhdGlvbihub2RlKSAhPSBJ bnZhbGlkT2lkKQorCQkJCXsKKwkJCQkJY2hhciAgICpvcG5hbWUgPSBnZXRfb3BuYW1lKG9l LT5vcG5vKTsKKworCQkJCQlpZiAoc3RyY21wKG9wbmFtZSwgIj0iKSAhPSAwICYmIHN0cmNt cChvcG5hbWUsICI8PiIpICE9IDApCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisKKwkJ CQkvKiBvcGVyYW5kcyBhcmUgY2hlY2tlZCBsYXRlciAqLworCQkJfQorCQkJYnJlYWs7CisJ CWNhc2UgVF9WYXI6CisJCQkvKgorCQkJICogVmFyIGNhbiBiZSBwdXNoZWQgZG93biBpZiBp dCBpcyBpbiB0aGUgZm9yZWlnbiB0YWJsZS4KKwkJCSAqIFhYWCBWYXIgb2Ygb3RoZXIgcmVs YXRpb24gY2FuIGJlIGhlcmU/CisJCQkgKi8KKwkJCXsKKwkJCQlWYXIJICAgKnZhciA9IChW YXIgKikgbm9kZTsKKwkJCQlmb3JlaWduX2V4ZWN1dGFibGVfY3h0ICpmX2NvbnRleHQ7CisK KwkJCQlmX2NvbnRleHQgPSAoZm9yZWlnbl9leGVjdXRhYmxlX2N4dCAqKSBjb250ZXh0Owor CQkJCWlmICh2YXItPnZhcm5vICE9IGZfY29udGV4dC0+Zm9yZWlnbnJlbC0+cmVsaWQgfHwK KwkJCQkJdmFyLT52YXJsZXZlbHN1cCAhPSAwKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0K KwkJCWJyZWFrOworCQljYXNlIFRfQXJyYXlSZWY6CisJCQkvKgorCQkJICogQXJyYXlSZWYg d2hpY2ggaG9sZHMgbm9uLWJ1aWx0LWluIHR5cGVkIGVsZW1lbnRzIGNhbid0IGJlIHB1c2hl ZAorCQkJICogZG93bi4KKwkJCSAqLworCQkJeworCQkJCUFycmF5UmVmCSAgICphciA9IChB cnJheVJlZiAqKSBub2RlOzsKKworCQkJCWlmICghaXNfYnVpbHRpbihhci0+cmVmZWxlbXR5 cGUpKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJCS8qIEFzc2lnbm1lbnQgc2hvdWxkIG5v dCBiZSBpbiByZXN0cmljdGlvbnMuICovCisJCQkJaWYgKGFyLT5yZWZhc3NnbmV4cHIgIT0g TlVMTCkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX0Fy cmF5RXhwcjoKKwkJCS8qCisJCQkgKiBBcnJheUV4cHIgd2hpY2ggaG9sZHMgbm9uLWJ1aWx0 LWluIHR5cGVkIGVsZW1lbnRzIGNhbid0IGJlIHB1c2hlZAorCQkJICogZG93bi4KKwkJCSAq LworCQkJeworCQkJCWlmICghaXNfYnVpbHRpbigoKEFycmF5RXhwciAqKSBub2RlKS0+ZWxl bWVudF90eXBlaWQpKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQlk ZWZhdWx0OgorCQkJeworCQkJCWVyZXBvcnQoREVCVUczLAorCQkJCQkJKGVycm1zZygiZXhw cmVzc2lvbiBpcyB0b28gY29tcGxleCIpLAorCQkJCQkJIGVycmRldGFpbCgiJXMiLCBub2Rl VG9TdHJpbmcobm9kZSkpKSk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlicmVhazsK Kwl9CisKKwlyZXR1cm4gZXhwcmVzc2lvbl90cmVlX3dhbGtlcihub2RlLCBmb3JlaWduX2V4 cHJfd2Fsa2VyLCBjb250ZXh0KTsKK30KKworLyoKKyAqIFJldHVybiB0cnVlIGlmIGdpdmVu IG9iamVjdCBpcyBvbmUgb2YgYnVpbHQtaW4gb2JqZWN0cy4KKyAqLworc3RhdGljIGJvb2wK K2lzX2J1aWx0aW4oT2lkIG9pZCkKK3sKKwlyZXR1cm4gKG9pZCA8IEZpcnN0Tm9ybWFsT2Jq ZWN0SWQpOworfQorCisvKgorICogRGVwYXJzZSBXSEVSRSBjbGF1c2UgZnJvbSBnaXZlbiBs aXN0IG9mIFJlc3RyaWN0SW5mbyBhbmQgYXBwZW5kIHRoZW0gdG8gYnVmLgorICogV2UgYXNz dW1lIHRoYXQgYnVmIGFscmVhZHkgaG9sZHMgYSBTUUwgc3RhdGVtZW50IHdoaWNoIGVuZHMg d2l0aCB2YWxpZCBXSEVSRQorICogY2xhdXNlLgorICoKKyAqIE9ubHkgd2hlbiBjYWxsaW5n IHRoZSBmaXJzdCB0aW1lIGZvciBhIHN0YXRlbWVudCwgaXNfZmlyc3Qgc2hvdWxkIGJlIHRy dWUuCisgKi8KK3ZvaWQKK2FwcGVuZFdoZXJlQ2xhdXNlKFN0cmluZ0luZm8gYnVmLAorCQkJ CSAgYm9vbCBpc19maXJzdCwKKwkJCQkgIExpc3QgKmV4cHJzLAorCQkJCSAgUGxhbm5lcklu Zm8gKnJvb3QpCit7CisJYm9vbAkJCWZpcnN0ID0gdHJ1ZTsKKwlMaXN0Q2VsbAkgICAqbGM7 CisKKwlmb3JlYWNoKGxjLCBleHBycykKKwl7CisJCVJlc3RyaWN0SW5mbyAgICpyaSA9IChS ZXN0cmljdEluZm8gKikgbGZpcnN0KGxjKTsKKworCQkvKiBDb25uZWN0IGV4cHJlc3Npb25z IHdpdGggIkFORCIgYW5kIHBhcmVudGhlc2l6ZSB3aG9sZSBjb25kaXRpb24uICovCisJCWlm IChpc19maXJzdCAmJiBmaXJzdCkKKwkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIFdIRVJF ICIpOworCQllbHNlCisJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBBTkQgIik7CisKKwkJ YXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKCcpOworCQlkZXBhcnNlRXhwcihidWYsIHJp LT5jbGF1c2UsIHJvb3QpOworCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CisK KwkJZmlyc3QgPSBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3Bnc3FsX2Zk dy9leHBlY3RlZC9wZ3NxbF9mZHcub3V0IGIvY29udHJpYi9wZ3NxbF9mZHcvZXhwZWN0ZWQv cGdzcWxfZmR3Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzkw NmRhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wZ3NxbF9mZHcvZXhwZWN0ZWQvcGdz cWxfZmR3Lm91dApAQCAtMCwwICsxLDY0NCBAQAorLS0gPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gY3Jl YXRlIEZEVyBvYmplY3RzCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLSBDbGVhbiB1cCBpbiBjYXNl IGEgcHJpb3IgcmVncmVzc2lvbiBydW4gZmFpbGVkCistLSBTdXBwcmVzcyBOT1RJQ0UgbWVz c2FnZXMgd2hlbiByb2xlcyBkb24ndCBleGlzdAorU0VUIGNsaWVudF9taW5fbWVzc2FnZXMg VE8gJ2Vycm9yJzsKK0RST1AgUk9MRSBJRiBFWElTVFMgcGdzcWxfZmR3X3VzZXI7CitSRVNF VCBjbGllbnRfbWluX21lc3NhZ2VzOworQ1JFQVRFIFJPTEUgcGdzcWxfZmR3X3VzZXIgTE9H SU4gU1VQRVJVU0VSOworU0VUIFNFU1NJT04gQVVUSE9SSVpBVElPTiAncGdzcWxfZmR3X3Vz ZXInOworQ1JFQVRFIEVYVEVOU0lPTiBwZ3NxbF9mZHc7CitDUkVBVEUgU0VSVkVSIGxvb3Bi YWNrMSBGT1JFSUdOIERBVEEgV1JBUFBFUiBwZ3NxbF9mZHc7CitDUkVBVEUgU0VSVkVSIGxv b3BiYWNrMiBGT1JFSUdOIERBVEEgV1JBUFBFUiBwZ3NxbF9mZHcKKyAgT1BUSU9OUyAoZGJu YW1lICdjb250cmliX3JlZ3Jlc3Npb24nKTsKK0NSRUFURSBVU0VSIE1BUFBJTkcgRk9SIHB1 YmxpYyBTRVJWRVIgbG9vcGJhY2sxCisJT1BUSU9OUyAodXNlciAndmFsdWUnLCBwYXNzd29y ZCAndmFsdWUnKTsKK0NSRUFURSBVU0VSIE1BUFBJTkcgRk9SIHBnc3FsX2Zkd191c2VyIFNF UlZFUiBsb29wYmFjazI7CitDUkVBVEUgRk9SRUlHTiBUQUJMRSBmdDEgKAorCWMwIGludCwK KwljMSBpbnQgTk9UIE5VTEwsCisJYzIgaW50IE5PVCBOVUxMLAorCWMzIHRleHQsCisJYzQg dGltZXN0YW1wdHosCisJYzUgdGltZXN0YW1wLAorCWM2IHZhcmNoYXIoMTApLAorCWM3IGNo YXIoMTApCispIFNFUlZFUiBsb29wYmFjazI7CitBTFRFUiBGT1JFSUdOIFRBQkxFIGZ0MSBE Uk9QIENPTFVNTiBjMDsKK0NSRUFURSBGT1JFSUdOIFRBQkxFIGZ0MiAoCisJYzAgaW50LAor CWMxIGludCBOT1QgTlVMTCwKKwljMiBpbnQgTk9UIE5VTEwsCisJYzMgdGV4dCwKKwljNCB0 aW1lc3RhbXB0eiwKKwljNSB0aW1lc3RhbXAsCisJYzYgdmFyY2hhcigxMCksCisJYzcgY2hh cigxMCkKKykgU0VSVkVSIGxvb3BiYWNrMjsKK0FMVEVSIEZPUkVJR04gVEFCTEUgZnQyIERS T1AgQ09MVU1OIGMwOworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gY3JlYXRlIG9iamVjdHMgdXNl ZCB0aHJvdWdoIEZEVworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ1JFQVRFIFNDSEVNQSAiUyAxIjsK K0NSRUFURSBUQUJMRSAiUyAxIi4iVCAxIiAoCisJIkMgMSIgaW50IE5PVCBOVUxMLAorCWMy IGludCBOT1QgTlVMTCwKKwljMyB0ZXh0LAorCWM0IHRpbWVzdGFtcHR6LAorCWM1IHRpbWVz dGFtcCwKKwljNiB2YXJjaGFyKDEwKSwKKwljNyBjaGFyKDEwKSwKKwlDT05TVFJBSU5UIHQx X3BrZXkgUFJJTUFSWSBLRVkgKCJDIDEiKQorKTsKK05PVElDRTogIENSRUFURSBUQUJMRSAv IFBSSU1BUlkgS0VZIHdpbGwgY3JlYXRlIGltcGxpY2l0IGluZGV4ICJ0MV9wa2V5IiBmb3Ig dGFibGUgIlQgMSIKK0NSRUFURSBUQUJMRSAiUyAxIi4iVCAyIiAoCisJYzEgaW50IE5PVCBO VUxMLAorCWMyIHRleHQsCisJQ09OU1RSQUlOVCB0Ml9wa2V5IFBSSU1BUlkgS0VZIChjMSkK Kyk7CitOT1RJQ0U6ICBDUkVBVEUgVEFCTEUgLyBQUklNQVJZIEtFWSB3aWxsIGNyZWF0ZSBp bXBsaWNpdCBpbmRleCAidDJfcGtleSIgZm9yIHRhYmxlICJUIDIiCitCRUdJTjsKK1RSVU5D QVRFICJTIDEiLiJUIDEiOworSU5TRVJUIElOVE8gIlMgMSIuIlQgMSIKKwlTRUxFQ1QgaWQs CisJICAgICAgIGlkICUgMTAsCisJICAgICAgIHRvX2NoYXIoaWQsICdGTTAwMDAwJyksCisJ ICAgICAgICcxOTcwLTAxLTAxJzo6dGltZXN0YW1wdHogKyAoKGlkICUgMTAwKSB8fCAnIGRh eXMnKTo6aW50ZXJ2YWwsCisJICAgICAgICcxOTcwLTAxLTAxJzo6dGltZXN0YW1wICsgKChp ZCAlIDEwMCkgfHwgJyBkYXlzJyk6OmludGVydmFsLAorCSAgICAgICBpZCAlIDEwLAorCSAg ICAgICBpZCAlIDEwCisJRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwMCkgaWQ7CitUUlVO Q0FURSAiUyAxIi4iVCAyIjsKK0lOU0VSVCBJTlRPICJTIDEiLiJUIDIiCisJU0VMRUNUIGlk LAorCSAgICAgICAnQUFBJyB8fCB0b19jaGFyKGlkLCAnRk0wMDAnKQorCUZST00gZ2VuZXJh dGVfc2VyaWVzKDEsIDEwMCkgaWQ7CitDT01NSVQ7CistLSA9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLSB0 ZXN0cyBmb3IgcGdzcWxfZmR3X3ZhbGlkYXRvcgorLS0gPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUxURVIg Rk9SRUlHTiBEQVRBIFdSQVBQRVIgcGdzcWxfZmR3IE9QVElPTlMgKGhvc3QgJ3ZhbHVlJyk7 ICAgIC0tIEVSUk9SCitFUlJPUjogIGludmFsaWQgb3B0aW9uICJob3N0IgorSElOVDogIFZh bGlkIG9wdGlvbnMgaW4gdGhpcyBjb250ZXh0IGFyZTogCistLSByZXF1aXJlc3NsLCBrcmJz cnZuYW1lIGFuZCBnc3NsaWIgYXJlIG9taXR0ZWQgYmVjYXVzZSB0aGV5IGRlcGVuZCBvbgor LS0gY29uZmlndXJlIG9wdGlvbgorQUxURVIgU0VSVkVSIGxvb3BiYWNrMSBPUFRJT05TICgK KwlhdXRodHlwZSAndmFsdWUnLAorCXNlcnZpY2UgJ3ZhbHVlJywKKwljb25uZWN0X3RpbWVv dXQgJ3ZhbHVlJywKKwlkYm5hbWUgJ3ZhbHVlJywKKwlob3N0ICd2YWx1ZScsCisJaG9zdGFk ZHIgJ3ZhbHVlJywKKwlwb3J0ICd2YWx1ZScsCisJLS1jbGllbnRfZW5jb2RpbmcgJ3ZhbHVl JywKKwl0dHkgJ3ZhbHVlJywKKwlvcHRpb25zICd2YWx1ZScsCisJYXBwbGljYXRpb25fbmFt ZSAndmFsdWUnLAorCS0tZmFsbGJhY2tfYXBwbGljYXRpb25fbmFtZSAndmFsdWUnLAorCWtl ZXBhbGl2ZXMgJ3ZhbHVlJywKKwlrZWVwYWxpdmVzX2lkbGUgJ3ZhbHVlJywKKwlrZWVwYWxp dmVzX2ludGVydmFsICd2YWx1ZScsCisJLS0gcmVxdWlyZXNzbCAndmFsdWUnLAorCXNzbGNv bXByZXNzaW9uICd2YWx1ZScsCisJc3NsbW9kZSAndmFsdWUnLAorCXNzbGNlcnQgJ3ZhbHVl JywKKwlzc2xrZXkgJ3ZhbHVlJywKKwlzc2xyb290Y2VydCAndmFsdWUnLAorCXNzbGNybCAn dmFsdWUnCisJLS1yZXF1aXJlcGVlciAndmFsdWUnLAorCS0tIGtyYnNydm5hbWUgJ3ZhbHVl JywKKwktLSBnc3NsaWIgJ3ZhbHVlJywKKwktLXJlcGxpY2F0aW9uICd2YWx1ZScKKyk7CitB TFRFUiBTRVJWRVIgbG9vcGJhY2sxIE9QVElPTlMgKHVzZXIgJ3ZhbHVlJyk7ICAgICAgICAg ICAgICAgICAgLS0gRVJST1IKK0VSUk9SOiAgaW52YWxpZCBvcHRpb24gInVzZXIiCitISU5U OiAgVmFsaWQgb3B0aW9ucyBpbiB0aGlzIGNvbnRleHQgYXJlOiBhdXRodHlwZSwgc2Vydmlj ZSwgY29ubmVjdF90aW1lb3V0LCBkYm5hbWUsIGhvc3QsIGhvc3RhZGRyLCBwb3J0LCB0dHks IG9wdGlvbnMsIGFwcGxpY2F0aW9uX25hbWUsIGtlZXBhbGl2ZXMsIGtlZXBhbGl2ZXNfaWRs ZSwga2VlcGFsaXZlc19pbnRlcnZhbCwga2VlcGFsaXZlc19jb3VudCwgcmVxdWlyZXNzbCwg c3NsY29tcHJlc3Npb24sIHNzbG1vZGUsIHNzbGNlcnQsIHNzbGtleSwgc3Nscm9vdGNlcnQs IHNzbGNybCwgcmVxdWlyZXBlZXIsIGtyYnNydm5hbWUsIGdzc2xpYgorQUxURVIgVVNFUiBN QVBQSU5HIEZPUiBwdWJsaWMgU0VSVkVSIGxvb3BiYWNrMQorCU9QVElPTlMgKERST1AgdXNl ciwgRFJPUCBwYXNzd29yZCk7CitBTFRFUiBVU0VSIE1BUFBJTkcgRk9SIHB1YmxpYyBTRVJW RVIgbG9vcGJhY2sxCisJT1BUSU9OUyAoaG9zdCAndmFsdWUnKTsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLS0gRVJST1IKK0VSUk9SOiAgaW52YWxpZCBvcHRpb24g Imhvc3QiCitISU5UOiAgVmFsaWQgb3B0aW9ucyBpbiB0aGlzIGNvbnRleHQgYXJlOiB1c2Vy LCBwYXNzd29yZAorQUxURVIgRk9SRUlHTiBUQUJMRSBmdDEgT1BUSU9OUyAobnNwbmFtZSAn UyAxJywgcmVsbmFtZSAnVCAxJyk7CitBTFRFUiBGT1JFSUdOIFRBQkxFIGZ0MiBPUFRJT05T IChuc3BuYW1lICdTIDEnLCByZWxuYW1lICdUIDEnKTsKK0FMVEVSIEZPUkVJR04gVEFCTEUg ZnQxIE9QVElPTlMgKGludmFsaWQgJ3ZhbHVlJyk7ICAgICAgICAgICAgICAtLSBFUlJPUgor RVJST1I6ICBpbnZhbGlkIG9wdGlvbiAiaW52YWxpZCIKK0hJTlQ6ICBWYWxpZCBvcHRpb25z IGluIHRoaXMgY29udGV4dCBhcmU6IG5zcG5hbWUsIHJlbG5hbWUKK0FMVEVSIEZPUkVJR04g VEFCTEUgZnQxIEFMVEVSIENPTFVNTiBjMSBPUFRJT05TIChpbnZhbGlkICd2YWx1ZScpOyAt LSBFUlJPUgorRVJST1I6ICBpbnZhbGlkIG9wdGlvbiAiaW52YWxpZCIKK0hJTlQ6ICBWYWxp ZCBvcHRpb25zIGluIHRoaXMgY29udGV4dCBhcmU6IGNvbG5hbWUKK0FMVEVSIEZPUkVJR04g VEFCTEUgZnQxIEFMVEVSIENPTFVNTiBjMSBPUFRJT05TIChjb2xuYW1lICdDIDEnKTsKK0FM VEVSIEZPUkVJR04gVEFCTEUgZnQyIEFMVEVSIENPTFVNTiBjMSBPUFRJT05TIChjb2xuYW1l ICdDIDEnKTsKK1xkZXcrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIExpc3Qgb2YgZm9yZWlnbi1kYXRhIHdyYXBwZXJzCisgICBOYW1lICAgIHwgICAg IE93bmVyICAgICAgfCAgICAgIEhhbmRsZXIgICAgICB8ICAgICAgVmFsaWRhdG9yICAgICAg fCBBY2Nlc3MgcHJpdmlsZWdlcyB8IEZEVyBPcHRpb25zIHwgRGVzY3JpcHRpb24gCistLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tCisgcGdzcWxfZmR3IHwgcGdzcWxfZmR3X3VzZXIgfCBwZ3NxbF9mZHdfaGFuZGxl ciB8IHBnc3FsX2Zkd192YWxpZGF0b3IgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAg ICAgIHwgCisoMSByb3cpCisKK1xkZXMrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIGZvcmVpZ24gc2VydmVy cworICAgTmFtZSAgICB8ICAgICBPd25lciAgICAgIHwgRm9yZWlnbi1kYXRhIHdyYXBwZXIg fCBBY2Nlc3MgcHJpdmlsZWdlcyB8IFR5cGUgfCBWZXJzaW9uIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBG RFcgT3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gCistLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0KKyBsb29wYmFjazEgfCBwZ3NxbF9mZHdfdXNlciB8 IHBnc3FsX2ZkdyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAg ICAgICB8IChhdXRodHlwZSAndmFsdWUnLCBzZXJ2aWNlICd2YWx1ZScsIGNvbm5lY3RfdGlt ZW91dCAndmFsdWUnLCBkYm5hbWUgJ3ZhbHVlJywgaG9zdCAndmFsdWUnLCBob3N0YWRkciAn dmFsdWUnLCBwb3J0ICd2YWx1ZScsIHR0eSAndmFsdWUnLCBvcHRpb25zICd2YWx1ZScsIGFw cGxpY2F0aW9uX25hbWUgJ3ZhbHVlJywga2VlcGFsaXZlcyAndmFsdWUnLCBrZWVwYWxpdmVz X2lkbGUgJ3ZhbHVlJywga2VlcGFsaXZlc19pbnRlcnZhbCAndmFsdWUnLCBzc2xjb21wcmVz c2lvbiAndmFsdWUnLCBzc2xtb2RlICd2YWx1ZScsIHNzbGNlcnQgJ3ZhbHVlJywgc3Nsa2V5 ICd2YWx1ZScsIHNzbHJvb3RjZXJ0ICd2YWx1ZScsIHNzbGNybCAndmFsdWUnKSB8IAorIGxv b3BiYWNrMiB8IHBnc3FsX2Zkd191c2VyIHwgcGdzcWxfZmR3ICAgICAgICAgICAgfCAgICAg ICAgICAgICAgICAgICB8ICAgICAgfCAgICAgICAgIHwgKGRibmFtZSAnY29udHJpYl9yZWdy ZXNzaW9uJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgCisoMiByb3dzKQorCitcZGV1KworICAgICAgICAgIExp c3Qgb2YgdXNlciBtYXBwaW5ncworICBTZXJ2ZXIgICB8ICAgVXNlciBuYW1lICAgIHwgRkRX IE9wdGlvbnMgCistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0K KyBsb29wYmFjazEgfCBwdWJsaWMgICAgICAgICB8IAorIGxvb3BiYWNrMiB8IHBnc3FsX2Zk d191c2VyIHwgCisoMiByb3dzKQorCitcZGV0KworICAgICAgICAgICAgICAgICAgICAgICAg ICBMaXN0IG9mIGZvcmVpZ24gdGFibGVzCisgU2NoZW1hIHwgVGFibGUgfCAgU2VydmVyICAg fCAgICAgICAgICBGRFcgT3B0aW9ucyAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAKKy0tLS0t LS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLQorIHB1YmxpYyB8IGZ0MSAgIHwgbG9vcGJhY2syIHwgKG5zcG5h bWUgJ1MgMScsIHJlbG5hbWUgJ1QgMScpIHwgCisgcHVibGljIHwgZnQyICAgfCBsb29wYmFj azIgfCAobnNwbmFtZSAnUyAxJywgcmVsbmFtZSAnVCAxJykgfCAKKygyIHJvd3MpCisKKy0t ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KKy0tIHNpbXBsZSBxdWVyaWVzCistLSA9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cist LSBzaW5nbGUgdGFibGUsIHdpdGgvd2l0aG91dCBhbGlhcworRVhQTEFJTiAoQ09TVFMgZmFs c2UpIFNFTEVDVCAqIEZST00gZnQxIE9SREVSIEJZIGMzLCBjMSBPRkZTRVQgMTAwIExJTUlU IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBMaW1pdAorICAgLT4gIFNvcnQKKyAgICAgICAgIFNvcnQgS2V5OiBjMywg YzEKKyAgICAgICAgIC0+ICBGb3JlaWduIFNjYW4gb24gZnQxCisgICAgICAgICAgICAgICBS ZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIsIGMyLCBjMywgYzQsIGM1LCBjNiwgYzcgRlJPTSAi UyAxIi4iVCAxIgorKDUgcm93cykKKworU0VMRUNUICogRlJPTSBmdDEgT1JERVIgQlkgYzMs IGMxIE9GRlNFVCAxMDAgTElNSVQgMTA7CisgYzEgIHwgYzIgfCAgYzMgICB8ICAgICAgICAg ICAgICBjNCAgICAgICAgICAgICAgfCAgICAgICAgICAgIGM1ICAgICAgICAgICAgfCBjNiB8 ICAgICBjNyAgICAgCistLS0tLSstLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0rLS0tLS0tLS0tLS0t CisgMTAxIHwgIDEgfCAwMDEwMSB8IEZyaSBKYW4gMDIgMDA6MDA6MDAgMTk3MCBQU1QgfCBG cmkgSmFuIDAyIDAwOjAwOjAwIDE5NzAgfCAxICB8IDEgICAgICAgICAKKyAxMDIgfCAgMiB8 IDAwMTAyIHwgU2F0IEphbiAwMyAwMDowMDowMCAxOTcwIFBTVCB8IFNhdCBKYW4gMDMgMDA6 MDA6MDAgMTk3MCB8IDIgIHwgMiAgICAgICAgIAorIDEwMyB8ICAzIHwgMDAxMDMgfCBTdW4g SmFuIDA0IDAwOjAwOjAwIDE5NzAgUFNUIHwgU3VuIEphbiAwNCAwMDowMDowMCAxOTcwIHwg MyAgfCAzICAgICAgICAgCisgMTA0IHwgIDQgfCAwMDEwNCB8IE1vbiBKYW4gMDUgMDA6MDA6 MDAgMTk3MCBQU1QgfCBNb24gSmFuIDA1IDAwOjAwOjAwIDE5NzAgfCA0ICB8IDQgICAgICAg ICAKKyAxMDUgfCAgNSB8IDAwMTA1IHwgVHVlIEphbiAwNiAwMDowMDowMCAxOTcwIFBTVCB8 IFR1ZSBKYW4gMDYgMDA6MDA6MDAgMTk3MCB8IDUgIHwgNSAgICAgICAgIAorIDEwNiB8ICA2 IHwgMDAxMDYgfCBXZWQgSmFuIDA3IDAwOjAwOjAwIDE5NzAgUFNUIHwgV2VkIEphbiAwNyAw MDowMDowMCAxOTcwIHwgNiAgfCA2ICAgICAgICAgCisgMTA3IHwgIDcgfCAwMDEwNyB8IFRo dSBKYW4gMDggMDA6MDA6MDAgMTk3MCBQU1QgfCBUaHUgSmFuIDA4IDAwOjAwOjAwIDE5NzAg fCA3ICB8IDcgICAgICAgICAKKyAxMDggfCAgOCB8IDAwMTA4IHwgRnJpIEphbiAwOSAwMDow MDowMCAxOTcwIFBTVCB8IEZyaSBKYW4gMDkgMDA6MDA6MDAgMTk3MCB8IDggIHwgOCAgICAg ICAgIAorIDEwOSB8ICA5IHwgMDAxMDkgfCBTYXQgSmFuIDEwIDAwOjAwOjAwIDE5NzAgUFNU IHwgU2F0IEphbiAxMCAwMDowMDowMCAxOTcwIHwgOSAgfCA5ICAgICAgICAgCisgMTEwIHwg IDAgfCAwMDExMCB8IFN1biBKYW4gMTEgMDA6MDA6MDAgMTk3MCBQU1QgfCBTdW4gSmFuIDEx IDAwOjAwOjAwIDE5NzAgfCAwICB8IDAgICAgICAgICAKKygxMCByb3dzKQorCitFWFBMQUlO IChDT1NUUyBmYWxzZSkgU0VMRUNUICogRlJPTSBmdDEgdDEgT1JERVIgQlkgdDEuYzMsIHQx LmMxIE9GRlNFVCAxMDAgTElNSVQgMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIExpbWl0CisgICAtPiAgU29ydAorICAg ICAgICAgU29ydCBLZXk6IGMzLCBjMQorICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBm dDEgdDEKKyAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgYzIsIGMz LCBjNCwgYzUsIGM2LCBjNyBGUk9NICJTIDEiLiJUIDEiCisoNSByb3dzKQorCitTRUxFQ1Qg KiBGUk9NIGZ0MSB0MSBPUkRFUiBCWSB0MS5jMywgdDEuYzEgT0ZGU0VUIDEwMCBMSU1JVCAx MDsKKyBjMSAgfCBjMiB8ICBjMyAgIHwgICAgICAgICAgICAgIGM0ICAgICAgICAgICAgICB8 ICAgICAgICAgICAgYzUgICAgICAgICAgICB8IGM2IHwgICAgIGM3ICAgICAKKy0tLS0tKy0t LS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0tLS0KKyAxMDEgfCAgMSB8IDAwMTAxIHwg RnJpIEphbiAwMiAwMDowMDowMCAxOTcwIFBTVCB8IEZyaSBKYW4gMDIgMDA6MDA6MDAgMTk3 MCB8IDEgIHwgMSAgICAgICAgIAorIDEwMiB8ICAyIHwgMDAxMDIgfCBTYXQgSmFuIDAzIDAw OjAwOjAwIDE5NzAgUFNUIHwgU2F0IEphbiAwMyAwMDowMDowMCAxOTcwIHwgMiAgfCAyICAg ICAgICAgCisgMTAzIHwgIDMgfCAwMDEwMyB8IFN1biBKYW4gMDQgMDA6MDA6MDAgMTk3MCBQ U1QgfCBTdW4gSmFuIDA0IDAwOjAwOjAwIDE5NzAgfCAzICB8IDMgICAgICAgICAKKyAxMDQg fCAgNCB8IDAwMTA0IHwgTW9uIEphbiAwNSAwMDowMDowMCAxOTcwIFBTVCB8IE1vbiBKYW4g MDUgMDA6MDA6MDAgMTk3MCB8IDQgIHwgNCAgICAgICAgIAorIDEwNSB8ICA1IHwgMDAxMDUg fCBUdWUgSmFuIDA2IDAwOjAwOjAwIDE5NzAgUFNUIHwgVHVlIEphbiAwNiAwMDowMDowMCAx OTcwIHwgNSAgfCA1ICAgICAgICAgCisgMTA2IHwgIDYgfCAwMDEwNiB8IFdlZCBKYW4gMDcg MDA6MDA6MDAgMTk3MCBQU1QgfCBXZWQgSmFuIDA3IDAwOjAwOjAwIDE5NzAgfCA2ICB8IDYg ICAgICAgICAKKyAxMDcgfCAgNyB8IDAwMTA3IHwgVGh1IEphbiAwOCAwMDowMDowMCAxOTcw IFBTVCB8IFRodSBKYW4gMDggMDA6MDA6MDAgMTk3MCB8IDcgIHwgNyAgICAgICAgIAorIDEw OCB8ICA4IHwgMDAxMDggfCBGcmkgSmFuIDA5IDAwOjAwOjAwIDE5NzAgUFNUIHwgRnJpIEph biAwOSAwMDowMDowMCAxOTcwIHwgOCAgfCA4ICAgICAgICAgCisgMTA5IHwgIDkgfCAwMDEw OSB8IFNhdCBKYW4gMTAgMDA6MDA6MDAgMTk3MCBQU1QgfCBTYXQgSmFuIDEwIDAwOjAwOjAw IDE5NzAgfCA5ICB8IDkgICAgICAgICAKKyAxMTAgfCAgMCB8IDAwMTEwIHwgU3VuIEphbiAx MSAwMDowMDowMCAxOTcwIFBTVCB8IFN1biBKYW4gMTEgMDA6MDA6MDAgMTk3MCB8IDAgIHwg MCAgICAgICAgIAorKDEwIHJvd3MpCisKKy0tIHdpdGggV0hFUkUgY2xhdXNlCitFWFBMQUlO IChDT1NUUyBmYWxzZSkgU0VMRUNUICogRlJPTSBmdDEgdDEgV0hFUkUgdDEuYzEgPSAxMDEg QU5EIHQxLmM2ID0gJzEnIEFORCB0MS5jNyA+PSAnMSc7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGb3JlaWduIFNj YW4gb24gZnQxIHQxCisgICBGaWx0ZXI6IChjNyA+PSAnMSc6OmJwY2hhcikKKyAgIFJlbW90 ZSBTUUw6IFNFTEVDVCAiQyAxIiwgYzIsIGMzLCBjNCwgYzUsIGM2LCBjNyBGUk9NICJTIDEi LiJUIDEiIFdIRVJFICgoIkMgMSIgT1BFUkFUT1IocGdfY2F0YWxvZy49KSAxMDEpKSBBTkQg KCgoYzYpOjp0ZXh0IE9QRVJBVE9SKHBnX2NhdGFsb2cuPSkgJzEnOjp0ZXh0KSkKKygzIHJv d3MpCisKK1NFTEVDVCAqIEZST00gZnQxIHQxIFdIRVJFIHQxLmMxID0gMTAxIEFORCB0MS5j NiA9ICcxJyBBTkQgdDEuYzcgPj0gJzEnOworIGMxICB8IGMyIHwgIGMzICAgfCAgICAgICAg ICAgICAgYzQgICAgICAgICAgICAgIHwgICAgICAgICAgICBjNSAgICAgICAgICAgIHwgYzYg fCAgICAgYzcgICAgIAorLS0tLS0rLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tKy0tLS0tLS0tLS0t LQorIDEwMSB8ICAxIHwgMDAxMDEgfCBGcmkgSmFuIDAyIDAwOjAwOjAwIDE5NzAgUFNUIHwg RnJpIEphbiAwMiAwMDowMDowMCAxOTcwIHwgMSAgfCAxICAgICAgICAgCisoMSByb3cpCisK Ky0tIGFnZ3JlZ2F0ZQorU0VMRUNUIENPVU5UKCopIEZST00gZnQxIHQxOworIGNvdW50IAor LS0tLS0tLQorICAxMDAwCisoMSByb3cpCisKKy0tIGpvaW4gdHdvIHRhYmxlcworU0VMRUNU IHQxLmMxIEZST00gZnQxIHQxIEpPSU4gZnQyIHQyIE9OICh0MS5jMSA9IHQyLmMxKSBPUkRF UiBCWSB0MS5jMywgdDEuYzEgT0ZGU0VUIDEwMCBMSU1JVCAxMDsKKyBjMSAgCistLS0tLQor IDEwMQorIDEwMgorIDEwMworIDEwNAorIDEwNQorIDEwNgorIDEwNworIDEwOAorIDEwOQor IDExMAorKDEwIHJvd3MpCisKKy0tIHN1YnF1ZXJ5CitTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBX SEVSRSB0MS5jMyBJTiAoU0VMRUNUIGMzIEZST00gZnQyIHQyIFdIRVJFIGMxIDw9IDEwKSBP UkRFUiBCWSBjMTsKKyBjMSB8IGMyIHwgIGMzICAgfCAgICAgICAgICAgICAgYzQgICAgICAg ICAgICAgIHwgICAgICAgICAgICBjNSAgICAgICAgICAgIHwgYzYgfCAgICAgYzcgICAgIAor LS0tLSstLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0rLS0tLS0tLS0tLS0tCisgIDEgfCAgMSB8IDAw MDAxIHwgRnJpIEphbiAwMiAwMDowMDowMCAxOTcwIFBTVCB8IEZyaSBKYW4gMDIgMDA6MDA6 MDAgMTk3MCB8IDEgIHwgMSAgICAgICAgIAorICAyIHwgIDIgfCAwMDAwMiB8IFNhdCBKYW4g MDMgMDA6MDA6MDAgMTk3MCBQU1QgfCBTYXQgSmFuIDAzIDAwOjAwOjAwIDE5NzAgfCAyICB8 IDIgICAgICAgICAKKyAgMyB8ICAzIHwgMDAwMDMgfCBTdW4gSmFuIDA0IDAwOjAwOjAwIDE5 NzAgUFNUIHwgU3VuIEphbiAwNCAwMDowMDowMCAxOTcwIHwgMyAgfCAzICAgICAgICAgCisg IDQgfCAgNCB8IDAwMDA0IHwgTW9uIEphbiAwNSAwMDowMDowMCAxOTcwIFBTVCB8IE1vbiBK YW4gMDUgMDA6MDA6MDAgMTk3MCB8IDQgIHwgNCAgICAgICAgIAorICA1IHwgIDUgfCAwMDAw NSB8IFR1ZSBKYW4gMDYgMDA6MDA6MDAgMTk3MCBQU1QgfCBUdWUgSmFuIDA2IDAwOjAwOjAw IDE5NzAgfCA1ICB8IDUgICAgICAgICAKKyAgNiB8ICA2IHwgMDAwMDYgfCBXZWQgSmFuIDA3 IDAwOjAwOjAwIDE5NzAgUFNUIHwgV2VkIEphbiAwNyAwMDowMDowMCAxOTcwIHwgNiAgfCA2 ICAgICAgICAgCisgIDcgfCAgNyB8IDAwMDA3IHwgVGh1IEphbiAwOCAwMDowMDowMCAxOTcw IFBTVCB8IFRodSBKYW4gMDggMDA6MDA6MDAgMTk3MCB8IDcgIHwgNyAgICAgICAgIAorICA4 IHwgIDggfCAwMDAwOCB8IEZyaSBKYW4gMDkgMDA6MDA6MDAgMTk3MCBQU1QgfCBGcmkgSmFu IDA5IDAwOjAwOjAwIDE5NzAgfCA4ICB8IDggICAgICAgICAKKyAgOSB8ICA5IHwgMDAwMDkg fCBTYXQgSmFuIDEwIDAwOjAwOjAwIDE5NzAgUFNUIHwgU2F0IEphbiAxMCAwMDowMDowMCAx OTcwIHwgOSAgfCA5ICAgICAgICAgCisgMTAgfCAgMCB8IDAwMDEwIHwgU3VuIEphbiAxMSAw MDowMDowMCAxOTcwIFBTVCB8IFN1biBKYW4gMTEgMDA6MDA6MDAgMTk3MCB8IDAgIHwgMCAg ICAgICAgIAorKDEwIHJvd3MpCisKKy0tIHN1YnF1ZXJ5K01BWAorU0VMRUNUICogRlJPTSBm dDEgdDEgV0hFUkUgdDEuYzMgPSAoU0VMRUNUIE1BWChjMykgRlJPTSBmdDIgdDIpIE9SREVS IEJZIGMxOworICBjMSAgfCBjMiB8ICBjMyAgIHwgICAgICAgICAgICAgIGM0ICAgICAgICAg ICAgICB8ICAgICAgICAgICAgYzUgICAgICAgICAgICB8IGM2IHwgICAgIGM3ICAgICAKKy0t LS0tLSstLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0rLS0tLS0tLS0tLS0tCisgMTAwMCB8ICAwIHwg MDEwMDAgfCBUaHUgSmFuIDAxIDAwOjAwOjAwIDE5NzAgUFNUIHwgVGh1IEphbiAwMSAwMDow MDowMCAxOTcwIHwgMCAgfCAwICAgICAgICAgCisoMSByb3cpCisKKy0tIHVzZWQgaW4gQ1RF CitXSVRIIHQxIEFTIChTRUxFQ1QgKiBGUk9NIGZ0MSBXSEVSRSBjMSA8PSAxMCkgU0VMRUNU IHQyLmMxLCB0Mi5jMiwgdDIuYzMsIHQyLmM0IEZST00gdDEsIGZ0MiB0MiBXSEVSRSB0MS5j MSA9IHQyLmMxIE9SREVSIEJZIHQxLmMxOworIGMxIHwgYzIgfCAgYzMgICB8ICAgICAgICAg ICAgICBjNCAgICAgICAgICAgICAgCistLS0tKy0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAgMSB8ICAxIHwgMDAwMDEgfCBGcmkgSmFuIDAyIDAwOjAw OjAwIDE5NzAgUFNUCisgIDIgfCAgMiB8IDAwMDAyIHwgU2F0IEphbiAwMyAwMDowMDowMCAx OTcwIFBTVAorICAzIHwgIDMgfCAwMDAwMyB8IFN1biBKYW4gMDQgMDA6MDA6MDAgMTk3MCBQ U1QKKyAgNCB8ICA0IHwgMDAwMDQgfCBNb24gSmFuIDA1IDAwOjAwOjAwIDE5NzAgUFNUCisg IDUgfCAgNSB8IDAwMDA1IHwgVHVlIEphbiAwNiAwMDowMDowMCAxOTcwIFBTVAorICA2IHwg IDYgfCAwMDAwNiB8IFdlZCBKYW4gMDcgMDA6MDA6MDAgMTk3MCBQU1QKKyAgNyB8ICA3IHwg MDAwMDcgfCBUaHUgSmFuIDA4IDAwOjAwOjAwIDE5NzAgUFNUCisgIDggfCAgOCB8IDAwMDA4 IHwgRnJpIEphbiAwOSAwMDowMDowMCAxOTcwIFBTVAorICA5IHwgIDkgfCAwMDAwOSB8IFNh dCBKYW4gMTAgMDA6MDA6MDAgMTk3MCBQU1QKKyAxMCB8ICAwIHwgMDAwMTAgfCBTdW4gSmFu IDExIDAwOjAwOjAwIDE5NzAgUFNUCisoMTAgcm93cykKKworLS0gZml4ZWQgdmFsdWVzCitT RUxFQ1QgJ2ZpeGVkJywgTlVMTCBGUk9NIGZ0MSB0MSBXSEVSRSBjMSA9IDE7CisgP2NvbHVt bj8gfCA/Y29sdW1uPyAKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLQorIGZpeGVkICAgIHwgCiso MSByb3cpCisKKy0tIHVzZXItZGVmaW5lZCBvcGVyYXRvci9mdW5jdGlvbgorQ1JFQVRFIEZV TkNUSU9OIHBnc3FsX2Zkd19hYnMoaW50KSBSRVRVUk5TIGludCBBUyAkJAorQkVHSU4KK1JF VFVSTiBhYnMoJDEpOworRU5ECiskJCBMQU5HVUFHRSBwbHBnc3FsIElNTVVUQUJMRTsKK0NS RUFURSBPUEVSQVRPUiA9PT0gKAorICAgIExFRlRBUkcgPSBpbnQsCisgICAgUklHSFRBUkcg PSBpbnQsCisgICAgUFJPQ0VEVVJFID0gaW50NGVxLAorICAgIENPTU1VVEFUT1IgPSA9PT0s CisgICAgTkVHQVRPUiA9ICE9PQorKTsKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBTRUxFQ1Qg KiBGUk9NIGZ0MSB0MSBXSEVSRSB0MS5jMSA9IHBnc3FsX2Zkd19hYnModDEuYzIpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGb3JlaWduIFNjYW4gb24gZnQxIHQx CisgICBGaWx0ZXI6IChjMSA9IHBnc3FsX2Zkd19hYnMoYzIpKQorICAgUmVtb3RlIFNRTDog U0VMRUNUICJDIDEiLCBjMiwgYzMsIGM0LCBjNSwgYzYsIGM3IEZST00gIlMgMSIuIlQgMSIK KygzIHJvd3MpCisKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBTRUxFQ1QgKiBGUk9NIGZ0MSB0 MSBXSEVSRSB0MS5jMSA9PT0gdDEuYzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIEZvcmVpZ24gU2NhbiBvbiBmdDEgdDEKKyAgIEZpbHRlcjogKGMxID09PSBjMikK KyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgYzIsIGMzLCBjNCwgYzUsIGM2LCBjNyBG Uk9NICJTIDEiLiJUIDEiCisoMyByb3dzKQorCitFWFBMQUlOIChDT1NUUyBmYWxzZSkgU0VM RUNUICogRlJPTSBmdDEgdDEgV0hFUkUgdDEuYzEgPSBhYnModDEuYzIpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZvcmVpZ24gU2NhbiBvbiBmdDEg dDEKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgYzIsIGMzLCBjNCwgYzUsIGM2LCBj NyBGUk9NICJTIDEiLiJUIDEiIFdIRVJFICgoIkMgMSIgT1BFUkFUT1IocGdfY2F0YWxvZy49 KSBwZ19jYXRhbG9nLmFicyhjMikpKQorKDIgcm93cykKKworRVhQTEFJTiAoQ09TVFMgZmFs c2UpIFNFTEVDVCAqIEZST00gZnQxIHQxIFdIRVJFIHQxLmMxID0gdDEuYzI7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIEZvcmVpZ24gU2NhbiBvbiBmdDEgdDEKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAx IiwgYzIsIGMzLCBjNCwgYzUsIGM2LCBjNyBGUk9NICJTIDEiLiJUIDEiIFdIRVJFICgoIkMg MSIgT1BFUkFUT1IocGdfY2F0YWxvZy49KSBjMikpCisoMiByb3dzKQorCistLSA9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CistLSBXSEVSRSBwdXNoIGRvd24KKy0tID09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0VYUExBSU4g KENPU1RTIGZhbHNlKSBTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBXSEVSRSB0MS5jMSA9IDE7ICAg ICAgICAgLS0gVmFyLCBPcEV4cHIoYiksIENvbnN0CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGb3JlaWduIFNjYW4g b24gZnQxIHQxCisgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIsIGMyLCBjMywgYzQsIGM1 LCBjNiwgYzcgRlJPTSAiUyAxIi4iVCAxIiBXSEVSRSAoKCJDIDEiIE9QRVJBVE9SKHBnX2Nh dGFsb2cuPSkgMSkpCisoMiByb3dzKQorCitFWFBMQUlOIChDT1NUUyBmYWxzZSkgU0VMRUNU ICogRlJPTSBmdDEgdDEgV0hFUkUgdDEuYzEgPSAxMDAgQU5EIHQxLmMyID0gMDsgLS0gQm9v bEV4cHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGb3JlaWduIFNjYW4gb24g ZnQxIHQxCisgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIsIGMyLCBjMywgYzQsIGM1LCBj NiwgYzcgRlJPTSAiUyAxIi4iVCAxIiBXSEVSRSAoKCJDIDEiIE9QRVJBVE9SKHBnX2NhdGFs b2cuPSkgMTAwKSkgQU5EICgoYzIgT1BFUkFUT1IocGdfY2F0YWxvZy49KSAwKSkKKygyIHJv d3MpCisKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBXSEVS RSBjMSBJUyBOVUxMOyAgICAgICAgLS0gTnVsbFRlc3QKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgRm9yZWlnbiBTY2FuIG9uIGZ0MSB0MQorICAgUmVtb3RlIFNRTDogU0VMRUNU ICJDIDEiLCBjMiwgYzMsIGM0LCBjNSwgYzYsIGM3IEZST00gIlMgMSIuIlQgMSIgV0hFUkUg KCgiQyAxIiBJUyBOVUxMKSkKKygyIHJvd3MpCisKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBT RUxFQ1QgKiBGUk9NIGZ0MSB0MSBXSEVSRSBjMSBJUyBOT1QgTlVMTDsgICAgLS0gTnVsbFRl c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGb3JlaWduIFNjYW4g b24gZnQxIHQxCisgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIsIGMyLCBjMywgYzQsIGM1 LCBjNiwgYzcgRlJPTSAiUyAxIi4iVCAxIiBXSEVSRSAoKCJDIDEiIElTIE5PVCBOVUxMKSkK KygyIHJvd3MpCisKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBTRUxFQ1QgKiBGUk9NIGZ0MSB0 MSBXSEVSRSByb3VuZChhYnMoYzEpLCAwKSA9IDE7IC0tIEZ1bmNFeHByCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZvcmVpZ24gU2NhbiBvbiBm dDEgdDEKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgYzIsIGMzLCBjNCwgYzUsIGM2 LCBjNyBGUk9NICJTIDEiLiJUIDEiIFdIRVJFICgocGdfY2F0YWxvZy5yb3VuZChwZ19jYXRh bG9nLmFicygiQyAxIiksIDApIE9QRVJBVE9SKHBnX2NhdGFsb2cuPSkgMTo6bnVtZXJpYykp CisoMiByb3dzKQorCitFWFBMQUlOIChDT1NUUyBmYWxzZSkgU0VMRUNUICogRlJPTSBmdDEg dDEgV0hFUkUgYzEgPSAtYzE7ICAgICAgICAgIC0tIE9wRXhwcihsKQorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IEZvcmVpZ24gU2NhbiBvbiBmdDEgdDEKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwg YzIsIGMzLCBjNCwgYzUsIGM2LCBjNyBGUk9NICJTIDEiLiJUIDEiIFdIRVJFICgoIkMgMSIg T1BFUkFUT1IocGdfY2F0YWxvZy49KSAoT1BFUkFUT1IocGdfY2F0YWxvZy4tKSAiQyAxIikp KQorKDIgcm93cykKKworRVhQTEFJTiAoQ09TVFMgZmFsc2UpIFNFTEVDVCAqIEZST00gZnQx IHQxIFdIRVJFIDEgPSBjMSE7ICAgICAgICAgICAtLSBPcEV4cHIocikKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgRm9yZWlnbiBTY2FuIG9uIGZ0MSB0MQorICAgUmVtb3RlIFNRTDogU0VM RUNUICJDIDEiLCBjMiwgYzMsIGM0LCBjNSwgYzYsIGM3IEZST00gIlMgMSIuIlQgMSIgV0hF UkUgKCgxOjpudW1lcmljIE9QRVJBVE9SKHBnX2NhdGFsb2cuPSkgKCJDIDEiIE9QRVJBVE9S KHBnX2NhdGFsb2cuISkpKSkKKygyIHJvd3MpCisKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBT RUxFQ1QgKiBGUk9NIGZ0MSB0MSBXSEVSRSAoYzEgSVMgTk9UIE5VTEwpIElTIERJU1RJTkNU IEZST00gKGMxIElTIE5PVCBOVUxMKTsgLS0gRGlzdGluY3RFeHByCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGb3JlaWduIFNj YW4gb24gZnQxIHQxCisgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIsIGMyLCBjMywgYzQs IGM1LCBjNiwgYzcgRlJPTSAiUyAxIi4iVCAxIiBXSEVSRSAoKCJDIDEiIElTIE5PVCBOVUxM KSBJUyBESVNUSU5DVCBGUk9NICgiQyAxIiBJUyBOT1QgTlVMTCkpCisoMiByb3dzKQorCitF WFBMQUlOIChDT1NUUyBmYWxzZSkgU0VMRUNUICogRlJPTSBmdDEgdDEgV0hFUkUgYzEgPSBB TlkoQVJSQVlbYzIsIDEsIGMxICsgMF0pOyAtLSBTY2FsYXJBcnJheU9wRXhwcgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRm9y ZWlnbiBTY2FuIG9uIGZ0MSB0MQorICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiLCBjMiwg YzMsIGM0LCBjNSwgYzYsIGM3IEZST00gIlMgMSIuIlQgMSIgV0hFUkUgKCgiQyAxIiBPUEVS QVRPUihwZ19jYXRhbG9nLj0pIEFOWSAoQVJSQVlbYzIsIDEsICgiQyAxIiBPUEVSQVRPUihw Z19jYXRhbG9nLispIDApXSkpKQorKDIgcm93cykKKworRVhQTEFJTiAoQ09TVFMgZmFsc2Up IFNFTEVDVCAqIEZST00gZnQxIGZ0IFdIRVJFIGMxID0gKEFSUkFZW2MxLGMyLDNdKVsxXTsg LS0gQXJyYXlSZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgRm9yZWlnbiBTY2FuIG9uIGZ0MSBmdAorICAgUmVtb3RlIFNR TDogU0VMRUNUICJDIDEiLCBjMiwgYzMsIGM0LCBjNSwgYzYsIGM3IEZST00gIlMgMSIuIlQg MSIgV0hFUkUgKCgiQyAxIiBPUEVSQVRPUihwZ19jYXRhbG9nLj0pICgoQVJSQVlbIkMgMSIs IGMyLCAzXSlbMV0pKSkKKygyIHJvd3MpCisKKy0tID09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIHBhcmFt ZXRlcml6ZWQgcXVlcmllcworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gc2ltcGxlIGpvaW4KK1BS RVBBUkUgc3QxKGludCwgaW50KSBBUyBTRUxFQ1QgdDEuYzMsIHQyLmMzIEZST00gZnQxIHQx LCBmdDIgdDIgV0hFUkUgdDEuYzEgPSAkMSBBTkQgdDIuYzEgPSAkMjsKK0VYUExBSU4gKENP U1RTIGZhbHNlKSBFWEVDVVRFIHN0MSgxLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIC0+ICBGb3JlaWduIFNjYW4gb24g ZnQxIHQxCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIsIE5VTEwsIGMzLCBO VUxMLCBOVUxMLCBOVUxMLCBOVUxMIEZST00gIlMgMSIuIlQgMSIgV0hFUkUgKCgiQyAxIiBP UEVSQVRPUihwZ19jYXRhbG9nLj0pIDEpKQorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBmdDIg dDIKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgTlVMTCwgYzMsIE5VTEws IE5VTEwsIE5VTEwsIE5VTEwgRlJPTSAiUyAxIi4iVCAxIiBXSEVSRSAoKCJDIDEiIE9QRVJB VE9SKHBnX2NhdGFsb2cuPSkgMikpCisoNSByb3dzKQorCitFWEVDVVRFIHN0MSgxLCAxKTsK KyAgYzMgICB8ICBjMyAgIAorLS0tLS0tLSstLS0tLS0tCisgMDAwMDEgfCAwMDAwMQorKDEg cm93KQorCitFWEVDVVRFIHN0MSgxMDEsIDEwMSk7CisgIGMzICAgfCAgYzMgICAKKy0tLS0t LS0rLS0tLS0tLQorIDAwMTAxIHwgMDAxMDEKKygxIHJvdykKKworLS0gc3VicXVlcnkgdXNp bmcgc3RhYmxlIGZ1bmN0aW9uIChjYW4ndCBiZSBwdXNoZWQgZG93bikKK1BSRVBBUkUgc3Qy KGludCkgQVMgU0VMRUNUICogRlJPTSBmdDEgdDEgV0hFUkUgdDEuYzEgPCAkMiBBTkQgdDEu YzMgSU4gKFNFTEVDVCBjMyBGUk9NIGZ0MiB0MiBXSEVSRSBjMSA+ICQxIEFORCBFWFRSQUNU KGRvdyBGUk9NIGM0KSA9IDYpIE9SREVSIEJZIGMxOworRVhQTEFJTiAoQ09TVFMgZmFsc2Up IEVYRUNVVEUgc3QyKDEwLCAyMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBT b3J0IEtleTogdDEuYzEKKyAgIC0+ICBIYXNoIEpvaW4KKyAgICAgICAgIEhhc2ggQ29uZDog KHQxLmMzID0gdDIuYzMpCisgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuIG9uIGZ0MSB0MQor ICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiLCBjMiwgYzMsIGM0LCBj NSwgYzYsIGM3IEZST00gIlMgMSIuIlQgMSIgV0hFUkUgKCgiQyAxIiBPUEVSQVRPUihwZ19j YXRhbG9nLjwpIDIwKSkKKyAgICAgICAgIC0+ICBIYXNoCisgICAgICAgICAgICAgICAtPiAg SGFzaEFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbiBv biBmdDIgdDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcjogKGRhdGVfcGFy dCgnZG93Jzo6dGV4dCwgYzQpID0gNjo6ZG91YmxlIHByZWNpc2lvbikKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgTlVMTCwgYzMsIGM0 LCBOVUxMLCBOVUxMLCBOVUxMIEZST00gIlMgMSIuIlQgMSIgV0hFUkUgKCgiQyAxIiBPUEVS QVRPUihwZ19jYXRhbG9nLj4pIDEwKSkKKygxMSByb3dzKQorCitFWEVDVVRFIHN0MigxMCwg MjApOworIGMxIHwgYzIgfCAgYzMgICB8ICAgICAgICAgICAgICBjNCAgICAgICAgICAgICAg fCAgICAgICAgICAgIGM1ICAgICAgICAgICAgfCBjNiB8ICAgICBjNyAgICAgCistLS0tKy0t LS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0tLS0KKyAxNiB8ICA2IHwgMDAwMTYgfCBT YXQgSmFuIDE3IDAwOjAwOjAwIDE5NzAgUFNUIHwgU2F0IEphbiAxNyAwMDowMDowMCAxOTcw IHwgNiAgfCA2ICAgICAgICAgCisoMSByb3cpCisKK0VYRUNVVEUgc3QxKDEwMSwgMTAxKTsK KyAgYzMgICB8ICBjMyAgIAorLS0tLS0tLSstLS0tLS0tCisgMDAxMDEgfCAwMDEwMQorKDEg cm93KQorCistLSBzdWJxdWVyeSB1c2luZyBpbW11dGFibGUgZnVuY3Rpb24gKGNhbiBiZSBw dXNoZWQgZG93bikKK1BSRVBBUkUgc3QzKGludCkgQVMgU0VMRUNUICogRlJPTSBmdDEgdDEg V0hFUkUgdDEuYzEgPCAkMiBBTkQgdDEuYzMgSU4gKFNFTEVDVCBjMyBGUk9NIGZ0MiB0MiBX SEVSRSBjMSA+ICQxIEFORCBFWFRSQUNUKGRvdyBGUk9NIGM1KSA9IDYpIE9SREVSIEJZIGMx OworRVhQTEFJTiAoQ09TVFMgZmFsc2UpIEVYRUNVVEUgc3QzKDEwLCAyMCk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgU29ydAorICAgU29ydCBLZXk6IHQxLmMxCisgICAtPiAgTmVz dGVkIExvb3AgU2VtaSBKb2luCisgICAgICAgICBKb2luIEZpbHRlcjogKHQxLmMzID0gdDIu YzMpCisgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuIG9uIGZ0MSB0MQorICAgICAgICAgICAg ICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiLCBjMiwgYzMsIGM0LCBjNSwgYzYsIGM3IEZS T00gIlMgMSIuIlQgMSIgV0hFUkUgKCgiQyAxIiBPUEVSQVRPUihwZ19jYXRhbG9nLjwpIDIw KSkKKyAgICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIEZvcmVp Z24gU2NhbiBvbiBmdDIgdDIKKyAgICAgICAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNF TEVDVCAiQyAxIiwgTlVMTCwgYzMsIE5VTEwsIGM1LCBOVUxMLCBOVUxMIEZST00gIlMgMSIu IlQgMSIgV0hFUkUgKCgiQyAxIiBPUEVSQVRPUihwZ19jYXRhbG9nLj4pIDEwKSkgQU5EICgo cGdfY2F0YWxvZy5kYXRlX3BhcnQoJ2Rvdyc6OnRleHQsIGM1KSBPUEVSQVRPUihwZ19jYXRh bG9nLj0pIDY6OmRvdWJsZSBwcmVjaXNpb24pKQorKDkgcm93cykKKworRVhFQ1VURSBzdDMo MTAsIDIwKTsKKyBjMSB8IGMyIHwgIGMzICAgfCAgICAgICAgICAgICAgYzQgICAgICAgICAg ICAgIHwgICAgICAgICAgICBjNSAgICAgICAgICAgIHwgYzYgfCAgICAgYzcgICAgIAorLS0t LSstLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0rLS0tLS0tLS0tLS0tCisgMTYgfCAgNiB8IDAwMDE2 IHwgU2F0IEphbiAxNyAwMDowMDowMCAxOTcwIFBTVCB8IFNhdCBKYW4gMTcgMDA6MDA6MDAg MTk3MCB8IDYgIHwgNiAgICAgICAgIAorKDEgcm93KQorCitFWEVDVVRFIHN0MygyMCwgMzAp OworIGMxIHwgYzIgfCAgYzMgICB8ICAgICAgICAgICAgICBjNCAgICAgICAgICAgICAgfCAg ICAgICAgICAgIGM1ICAgICAgICAgICAgfCBjNiB8ICAgICBjNyAgICAgCistLS0tKy0tLS0r LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0tLS0KKyAyMyB8ICAzIHwgMDAwMjMgfCBTYXQg SmFuIDI0IDAwOjAwOjAwIDE5NzAgUFNUIHwgU2F0IEphbiAyNCAwMDowMDowMCAxOTcwIHwg MyAgfCAzICAgICAgICAgCisoMSByb3cpCisKKy0tIGN1c3RvbSBwbGFuIHNob3VsZCBiZSBj aG9zZW4KK1BSRVBBUkUgc3Q0KGludCkgQVMgU0VMRUNUICogRlJPTSBmdDEgdDEgV0hFUkUg dDEuYzEgPSAkMTsKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBFWEVDVVRFIHN0NCgxKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIEZvcmVpZ24gU2NhbiBvbiBmdDEgdDEKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAi QyAxIiwgYzIsIGMzLCBjNCwgYzUsIGM2LCBjNyBGUk9NICJTIDEiLiJUIDEiIFdIRVJFICgo IkMgMSIgT1BFUkFUT1IocGdfY2F0YWxvZy49KSAxKSkKKygyIHJvd3MpCisKK0VYUExBSU4g KENPU1RTIGZhbHNlKSBFWEVDVVRFIHN0NCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZvcmVpZ24gU2NhbiBv biBmdDEgdDEKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgYzIsIGMzLCBjNCwgYzUs IGM2LCBjNyBGUk9NICJTIDEiLiJUIDEiIFdIRVJFICgoIkMgMSIgT1BFUkFUT1IocGdfY2F0 YWxvZy49KSAxKSkKKygyIHJvd3MpCisKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBFWEVDVVRF IHN0NCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIEZvcmVpZ24gU2NhbiBvbiBmdDEgdDEKKyAgIFJlbW90ZSBT UUw6IFNFTEVDVCAiQyAxIiwgYzIsIGMzLCBjNCwgYzUsIGM2LCBjNyBGUk9NICJTIDEiLiJU IDEiIFdIRVJFICgoIkMgMSIgT1BFUkFUT1IocGdfY2F0YWxvZy49KSAxKSkKKygyIHJvd3Mp CisKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBFWEVDVVRFIHN0NCgxKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZv cmVpZ24gU2NhbiBvbiBmdDEgdDEKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgYzIs IGMzLCBjNCwgYzUsIGM2LCBjNyBGUk9NICJTIDEiLiJUIDEiIFdIRVJFICgoIkMgMSIgT1BF UkFUT1IocGdfY2F0YWxvZy49KSAxKSkKKygyIHJvd3MpCisKK0VYUExBSU4gKENPU1RTIGZh bHNlKSBFWEVDVVRFIHN0NCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZvcmVpZ24gU2NhbiBvbiBmdDEgdDEK KyAgIFJlbW90ZSBTUUw6IFNFTEVDVCAiQyAxIiwgYzIsIGMzLCBjNCwgYzUsIGM2LCBjNyBG Uk9NICJTIDEiLiJUIDEiIFdIRVJFICgoIkMgMSIgT1BFUkFUT1IocGdfY2F0YWxvZy49KSAx KSkKKygyIHJvd3MpCisKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBFWEVDVVRFIHN0NCgxKTsK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVF UlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgRm9yZWlnbiBTY2FuIG9uIGZ0MSB0MQorICAgUmVtb3RlIFNRTDogU0VM RUNUICJDIDEiLCBjMiwgYzMsIGM0LCBjNSwgYzYsIGM3IEZST00gIlMgMSIuIlQgMSIgV0hF UkUgKCgiQyAxIiBPUEVSQVRPUihwZ19jYXRhbG9nLj0pICQxKSkKKygyIHJvd3MpCisKKy0t IGNsZWFudXAKK0RFQUxMT0NBVEUgc3QxOworREVBTExPQ0FURSBzdDI7CitERUFMTE9DQVRF IHN0MzsKK0RFQUxMT0NBVEUgc3Q0OworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gY29ubmVjdGlv biBtYW5hZ2VtZW50CistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitTRUxFQ1Qgc3J2bmFtZSwgdXNlbmFt ZSBGUk9NIHBnc3FsX2Zkd19jb25uZWN0aW9uczsKKyAgc3J2bmFtZSAgfCAgICB1c2VuYW1l ICAgICAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0KKyBsb29wYmFjazIgfCBwZ3Nx bF9mZHdfdXNlcgorKDEgcm93KQorCitTRUxFQ1QgcGdzcWxfZmR3X2Rpc2Nvbm5lY3Qoc3J2 aWQsIHVzZXN5c2lkKSBGUk9NIHBnc3FsX2Zkd19nZXRfY29ubmVjdGlvbnMoKTsKKyBwZ3Nx bF9mZHdfZGlzY29ubmVjdCAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBPSworKDEgcm93 KQorCitTRUxFQ1Qgc3J2bmFtZSwgdXNlbmFtZSBGUk9NIHBnc3FsX2Zkd19jb25uZWN0aW9u czsKKyBzcnZuYW1lIHwgdXNlbmFtZSAKKy0tLS0tLS0tLSstLS0tLS0tLS0KKygwIHJvd3Mp CisKKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KKy0tIGNvbnZlcnNpb24gZXJyb3IKKy0tID09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KK0FMVEVSIEZPUkVJR04gVEFCTEUgZnQxIEFMVEVSIENPTFVNTiBjNSBUWVBFIGlu dDsKK1NFTEVDVCAqIEZST00gZnQxIFdIRVJFIGMxID0gMTsgIC0tIEVSUk9SCitFUlJPUjog IGludmFsaWQgaW5wdXQgc3ludGF4IGZvciBpbnRlZ2VyOiAiMTk3MC0wMS0wMiAwMDowMDow MCIKK0NPTlRFWFQ6ICBjb2x1bW4gYzUgb2YgZm9yZWlnbiB0YWJsZSBmdDEKK0FMVEVSIEZP UkVJR04gVEFCTEUgZnQxIEFMVEVSIENPTFVNTiBjNSBUWVBFIHRpbWVzdGFtcDsKKy0tID09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KKy0tIHN1YnRyYW5zYWN0aW9uCistLSA9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitCRUdJ TjsKK0RFQ0xBUkUgYyBDVVJTT1IgRk9SIFNFTEVDVCAqIEZST00gZnQxIE9SREVSIEJZIGMx OworRkVUQ0ggYzsKKyBjMSB8IGMyIHwgIGMzICAgfCAgICAgICAgICAgICAgYzQgICAgICAg ICAgICAgIHwgICAgICAgICAgICBjNSAgICAgICAgICAgIHwgYzYgfCAgICAgYzcgICAgIAor LS0tLSstLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0rLS0tLS0tLS0tLS0tCisgIDEgfCAgMSB8IDAw MDAxIHwgRnJpIEphbiAwMiAwMDowMDowMCAxOTcwIFBTVCB8IEZyaSBKYW4gMDIgMDA6MDA6 MDAgMTk3MCB8IDEgIHwgMSAgICAgICAgIAorKDEgcm93KQorCitTQVZFUE9JTlQgczsKK0VS Uk9SIE9VVDsgICAgICAgICAgLS0gRVJST1IKK0VSUk9SOiAgc3ludGF4IGVycm9yIGF0IG9y IG5lYXIgIkVSUk9SIgorTElORSAxOiBFUlJPUiBPVVQ7CisgICAgICAgIF4KK1JPTExCQUNL IFRPIHM7CitTRUxFQ1Qgc3J2bmFtZSBGUk9NIHBnc3FsX2Zkd19jb25uZWN0aW9uczsKKyAg c3J2bmFtZSAgCistLS0tLS0tLS0tLQorIGxvb3BiYWNrMgorKDEgcm93KQorCitGRVRDSCBj OworIGMxIHwgYzIgfCAgYzMgICB8ICAgICAgICAgICAgICBjNCAgICAgICAgICAgICAgfCAg ICAgICAgICAgIGM1ICAgICAgICAgICAgfCBjNiB8ICAgICBjNyAgICAgCistLS0tKy0tLS0r LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0tLS0KKyAgMiB8ICAyIHwgMDAwMDIgfCBTYXQg SmFuIDAzIDAwOjAwOjAwIDE5NzAgUFNUIHwgU2F0IEphbiAwMyAwMDowMDowMCAxOTcwIHwg MiAgfCAyICAgICAgICAgCisoMSByb3cpCisKK0NPTU1JVDsKK1NFTEVDVCBzcnZuYW1lIEZS T00gcGdzcWxfZmR3X2Nvbm5lY3Rpb25zOworICBzcnZuYW1lICAKKy0tLS0tLS0tLS0tCisg bG9vcGJhY2syCisoMSByb3cpCisKK0VSUk9SIE9VVDsgICAgICAgICAgLS0gRVJST1IKK0VS Uk9SOiAgc3ludGF4IGVycm9yIGF0IG9yIG5lYXIgIkVSUk9SIgorTElORSAxOiBFUlJPUiBP VVQ7CisgICAgICAgIF4KK1NFTEVDVCBzcnZuYW1lIEZST00gcGdzcWxfZmR3X2Nvbm5lY3Rp b25zOworIHNydm5hbWUgCistLS0tLS0tLS0KKygwIHJvd3MpCisKKy0tID09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KKy0tIGNsZWFudXAKKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0RST1AgT1BFUkFUT1IgPT09IChp bnQsIGludCkgQ0FTQ0FERTsKK0RST1AgT1BFUkFUT1IgIT09IChpbnQsIGludCkgQ0FTQ0FE RTsKK0RST1AgRlVOQ1RJT04gcGdzcWxfZmR3X2FicyhpbnQpOworRFJPUCBTQ0hFTUEgIlMg MSIgQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gMiBvdGhlciBvYmplY3Rz CitERVRBSUw6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlICJTIDEiLiJUIDEiCitkcm9wIGNh c2NhZGVzIHRvIHRhYmxlICJTIDEiLiJUIDIiCitEUk9QIEVYVEVOU0lPTiBwZ3NxbF9mZHcg Q0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gNiBvdGhlciBvYmplY3RzCitE RVRBSUw6ICBkcm9wIGNhc2NhZGVzIHRvIHNlcnZlciBsb29wYmFjazEKK2Ryb3AgY2FzY2Fk ZXMgdG8gdXNlciBtYXBwaW5nIGZvciBwdWJsaWMKK2Ryb3AgY2FzY2FkZXMgdG8gc2VydmVy IGxvb3BiYWNrMgorZHJvcCBjYXNjYWRlcyB0byB1c2VyIG1hcHBpbmcgZm9yIHBnc3FsX2Zk d191c2VyCitkcm9wIGNhc2NhZGVzIHRvIGZvcmVpZ24gdGFibGUgZnQxCitkcm9wIGNhc2Nh ZGVzIHRvIGZvcmVpZ24gdGFibGUgZnQyCitcYworRFJPUCBST0xFIHBnc3FsX2Zkd191c2Vy OwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ3NxbF9mZHcvb3B0aW9uLmMgYi9jb250cmliL3Bn c3FsX2Zkdy9vcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4w MTkyZmQyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wZ3NxbF9mZHcvb3B0aW9uLmMK QEAgLTAsMCArMSwyMjIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIG9wdGlv bi5jCisgKgkJICBGRFcgb3B0aW9uIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChjKSAy MDEyLCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAqIElERU5U SUZJQ0FUSU9OCisgKgkJICBjb250cmliL3Bnc3FsX2Zkdy9vcHRpb24uYworICoKKyAqLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1 ZGUgImFjY2Vzcy9yZWxvcHRpb25zLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19mb3JlaWdu X2RhdGFfd3JhcHBlci5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfZm9yZWlnbl9zZXJ2ZXIu aCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2ZvcmVpZ25fdGFibGUuaCIKKyNpbmNsdWRlICJj YXRhbG9nL3BnX3VzZXJfbWFwcGluZy5oIgorI2luY2x1ZGUgImNvbW1hbmRzL2RlZnJlbS5o IgorI2luY2x1ZGUgImZtZ3IuaCIKKyNpbmNsdWRlICJmb3JlaWduL2ZvcmVpZ24uaCIKKyNp bmNsdWRlICJsaWIvc3RyaW5naW5mby5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgorCisj aW5jbHVkZSAicGdzcWxfZmR3LmgiCisKKy8qCisgKiBTUUwgZnVuY3Rpb25zCisgKi8KK2V4 dGVybiBEYXR1bSBwZ3NxbF9mZHdfdmFsaWRhdG9yKFBHX0ZVTkNUSU9OX0FSR1MpOworUEdf RlVOQ1RJT05fSU5GT19WMShwZ3NxbF9mZHdfdmFsaWRhdG9yKTsKKworLyoKKyAqIERlc2Ny aWJlcyB0aGUgdmFsaWQgb3B0aW9ucyBmb3Igb2JqZWN0cyB0aGF0IHVzZSB0aGlzIHdyYXBw ZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IFBnc3FsRmR3T3B0aW9uCit7CisJY29uc3QgY2hh ciAqb3B0bmFtZTsKKwlPaWQJCQlvcHRjb250ZXh0OwkJLyogT2lkIG9mIGNhdGFsb2cgaW4g d2hpY2ggb3B0aW9ucyBtYXkgYXBwZWFyICovCisJYm9vbAkJaXNfbGlicHFfb3B0OwkvKiB0 cnVlIGlmIGl0J3MgdXNlZCBpbiBsaWJwcSAqLworfSBQZ3NxbEZkd09wdGlvbjsKKworLyoK KyAqIFZhbGlkIG9wdGlvbnMgZm9yIHBnc3FsX2Zkdy4KKyAqLworc3RhdGljIFBnc3FsRmR3 T3B0aW9uIHZhbGlkX29wdGlvbnNbXSA9IHsKKworCS8qCisJICogT3B0aW9ucyBmb3IgbGli cHEgY29ubmVjdGlvbi4KKwkgKiBOb3RlOiBUaGlzIGxpc3Qgc2hvdWxkIGJlIHVwZGF0ZWQg YWxvbmcgd2l0aCBQUWNvbm5pbmZvT3B0aW9ucyBpbgorCSAqIGludGVyZmFjZXMvbGlicHEv ZmUtY29ubmVjdC5jLCBzbyB0aGUgb3JkZXIgaXMga2VwdCBhcyBpcy4KKwkgKgorCSAqIFNv bWUgdXNlbGVzcyBsaWJwcSBjb25uZWN0aW9uIG9wdGlvbnMgYXJlIG5vdCBhY2NlcHRlZCBi eSBwZ3NxbF9mZHc6CisJICogICBjbGllbnRfZW5jb2Rpbmc6IHNldCB0byBsb2NhbCBkYXRh YmFzZSBlbmNvZGluZyBhdXRvbWF0aWNhbGx5CisJICogICBmYWxsYmFja19hcHBsaWNhdGlv bl9uYW1lOiBmaXhlZCB0byAicGdzcWxfZmR3IgorCSAqICAgcmVwbGljYXRpb246IHBnc3Fs X2ZkdyBuZXZlciBiZSByZXBsaWNhdGlvbiBjbGllbnQKKwkgKi8KKwl7ImF1dGh0eXBlIiwg Rm9yZWlnblNlcnZlclJlbGF0aW9uSWQsIHRydWV9LAorCXsic2VydmljZSIsIEZvcmVpZ25T ZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwKKwl7InVzZXIiLCBVc2VyTWFwcGluZ1JlbGF0aW9u SWQsIHRydWV9LAorCXsicGFzc3dvcmQiLCBVc2VyTWFwcGluZ1JlbGF0aW9uSWQsIHRydWV9 LAorCXsiY29ubmVjdF90aW1lb3V0IiwgRm9yZWlnblNlcnZlclJlbGF0aW9uSWQsIHRydWV9 LAorCXsiZGJuYW1lIiwgRm9yZWlnblNlcnZlclJlbGF0aW9uSWQsIHRydWV9LAorCXsiaG9z dCIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwKKwl7Imhvc3RhZGRyIiwgRm9y ZWlnblNlcnZlclJlbGF0aW9uSWQsIHRydWV9LAorCXsicG9ydCIsIEZvcmVpZ25TZXJ2ZXJS ZWxhdGlvbklkLCB0cnVlfSwKKyNpZmRlZiBOT1RfVVNFRAorCXsiY2xpZW50X2VuY29kaW5n IiwgRm9yZWlnblNlcnZlclJlbGF0aW9uSWQsIHRydWV9LAorI2VuZGlmCisJeyJ0dHkiLCBG b3JlaWduU2VydmVyUmVsYXRpb25JZCwgdHJ1ZX0sCisJeyJvcHRpb25zIiwgRm9yZWlnblNl cnZlclJlbGF0aW9uSWQsIHRydWV9LAorCXsiYXBwbGljYXRpb25fbmFtZSIsIEZvcmVpZ25T ZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwKKyNpZmRlZiBOT1RfVVNFRAorCXsiZmFsbGJhY2tf YXBwbGljYXRpb25fbmFtZSIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwKKyNl bmRpZgorCXsia2VlcGFsaXZlcyIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwK Kwl7ImtlZXBhbGl2ZXNfaWRsZSIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwK Kwl7ImtlZXBhbGl2ZXNfaW50ZXJ2YWwiLCBGb3JlaWduU2VydmVyUmVsYXRpb25JZCwgdHJ1 ZX0sCisJeyJrZWVwYWxpdmVzX2NvdW50IiwgRm9yZWlnblNlcnZlclJlbGF0aW9uSWQsIHRy dWV9LAorCXsicmVxdWlyZXNzbCIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwK Kwl7InNzbGNvbXByZXNzaW9uIiwgRm9yZWlnblNlcnZlclJlbGF0aW9uSWQsIHRydWV9LAor CXsic3NsbW9kZSIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwKKwl7InNzbGNl cnQiLCBGb3JlaWduU2VydmVyUmVsYXRpb25JZCwgdHJ1ZX0sCisJeyJzc2xrZXkiLCBGb3Jl aWduU2VydmVyUmVsYXRpb25JZCwgdHJ1ZX0sCisJeyJzc2xyb290Y2VydCIsIEZvcmVpZ25T ZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwKKwl7InNzbGNybCIsIEZvcmVpZ25TZXJ2ZXJSZWxh dGlvbklkLCB0cnVlfSwKKwl7InJlcXVpcmVwZWVyIiwgRm9yZWlnblNlcnZlclJlbGF0aW9u SWQsIHRydWV9LAorCXsia3Jic3J2bmFtZSIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCB0 cnVlfSwKKwl7Imdzc2xpYiIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCB0cnVlfSwKKyNp ZmRlZiBOT1RfVVNFRAorCXsicmVwbGljYXRpb24iLCBGb3JlaWduU2VydmVyUmVsYXRpb25J ZCwgdHJ1ZX0sCisjZW5kaWYKKworCS8qCisJICogT3B0aW9ucyBmb3IgdHJhbnNsYXRpb24g b2Ygb2JqZWN0IG5hbWVzLgorCSAqLworCXsibnNwbmFtZSIsIEZvcmVpZ25UYWJsZVJlbGF0 aW9uSWQsIGZhbHNlfSwKKwl7InJlbG5hbWUiLCBGb3JlaWduVGFibGVSZWxhdGlvbklkLCBm YWxzZX0sCisJeyJjb2xuYW1lIiwgQXR0cmlidXRlUmVsYXRpb25JZCwgZmFsc2V9LAorCisJ LyogVGVybWluYXRpbmcgZW50cnkgLS0tIE1VU1QgQkUgTEFTVCAqLworCXtOVUxMLCBJbnZh bGlkT2lkLCBmYWxzZX0KK307CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb25zCisgKi8KK3N0 YXRpYyBib29sIGlzX3ZhbGlkX29wdGlvbihjb25zdCBjaGFyICpvcHRuYW1lLCBPaWQgY29u dGV4dCk7CisKKy8qCisgKiBWYWxpZGF0ZSB0aGUgZ2VuZXJpYyBvcHRpb25zIGdpdmVuIHRv IGEgRk9SRUlHTiBEQVRBIFdSQVBQRVIsIFNFUlZFUiwKKyAqIFVTRVIgTUFQUElORyBvciBG T1JFSUdOIFRBQkxFIHRoYXQgdXNlcyBwZ3NxbF9mZHcuCisgKgorICogUmFpc2UgYW4gRVJS T1IgaWYgdGhlIG9wdGlvbiBvciBpdHMgdmFsdWUgaXMgY29uc2lkZXJlZCBpbnZhbGlkLgor ICovCitEYXR1bQorcGdzcWxfZmR3X3ZhbGlkYXRvcihQR19GVU5DVElPTl9BUkdTKQorewor CUxpc3QJICAgKm9wdGlvbnNfbGlzdCA9IHVudHJhbnNmb3JtUmVsT3B0aW9ucyhQR19HRVRB UkdfREFUVU0oMCkpOworCU9pZAkJCWNhdGFsb2cgPSBQR19HRVRBUkdfT0lEKDEpOworCUxp c3RDZWxsICAgKmNlbGw7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgb25seSBvcHRpb25zIHN1 cHBvcnRlZCBieSBwZ3NxbF9mZHcsIGFuZCBhbGxvd2VkIGZvciB0aGUKKwkgKiBjdXJyZW50 IG9iamVjdCB0eXBlLCBhcmUgZ2l2ZW4uCisJICovCisJZm9yZWFjaChjZWxsLCBvcHRpb25z X2xpc3QpCisJeworCQlEZWZFbGVtICAgICpkZWYgPSAoRGVmRWxlbSAqKSBsZmlyc3QoY2Vs bCk7CisKKwkJaWYgKCFpc192YWxpZF9vcHRpb24oZGVmLT5kZWZuYW1lLCBjYXRhbG9nKSkK KwkJeworCQkJUGdzcWxGZHdPcHRpb24gKm9wdDsKKwkJCVN0cmluZ0luZm9EYXRhIGJ1ZjsK KworCQkJLyoKKwkJCSAqIFVua25vd24gb3B0aW9uIHNwZWNpZmllZCwgY29tcGxhaW4gYWJv dXQgaXQuIFByb3ZpZGUgYSBoaW50CisJCQkgKiB3aXRoIGxpc3Qgb2YgdmFsaWQgb3B0aW9u cyBmb3IgdGhlIG9iamVjdC4KKwkJCSAqLworCQkJaW5pdFN0cmluZ0luZm8oJmJ1Zik7CisJ CQlmb3IgKG9wdCA9IHZhbGlkX29wdGlvbnM7IG9wdC0+b3B0bmFtZTsgb3B0KyspCisJCQl7 CisJCQkJaWYgKGNhdGFsb2cgPT0gb3B0LT5vcHRjb250ZXh0KQorCQkJCQlhcHBlbmRTdHJp bmdJbmZvKCZidWYsICIlcyVzIiwgKGJ1Zi5sZW4gPiAwKSA/ICIsICIgOiAiIiwKKwkJCQkJ CQkJCSBvcHQtPm9wdG5hbWUpOworCQkJfQorCisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQko ZXJyY29kZShFUlJDT0RFX0ZEV19JTlZBTElEX09QVElPTl9OQU1FKSwKKwkJCQkJIGVycm1z ZygiaW52YWxpZCBvcHRpb24gXCIlc1wiIiwgZGVmLT5kZWZuYW1lKSwKKwkJCQkJIGVycmhp bnQoIlZhbGlkIG9wdGlvbnMgaW4gdGhpcyBjb250ZXh0IGFyZTogJXMiLAorCQkJCQkJCSBi dWYuZGF0YSkpKTsKKwkJfQorCX0KKworCS8qCisJICogV2UgZG9uJ3QgY2FyZSBvcHRpb24t c3BlY2lmaWMgbGltaXRhdGlvbiBoZXJlOyB0aGV5IHdpbGwgYmUgdmFsaWRhdGVkIGF0CisJ ICogdGhlIGV4ZWN1dGlvbiB0aW1lLgorCSAqLworCisJUEdfUkVUVVJOX1ZPSUQoKTsKK30K KworLyoKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG9wdGlvbiBpcyBvbmUgb2YgdGhl IHZhbGlkIHBnc3FsX2ZkdyBvcHRpb25zLgorICogY29udGV4dCBpcyB0aGUgT2lkIG9mIHRo ZSBjYXRhbG9nIGhvbGRpbmcgdGhlIG9iamVjdCB0aGUgb3B0aW9uIGlzIGZvci4KKyAqLwor c3RhdGljIGJvb2wKK2lzX3ZhbGlkX29wdGlvbihjb25zdCBjaGFyICpvcHRuYW1lLCBPaWQg Y29udGV4dCkKK3sKKwlQZ3NxbEZkd09wdGlvbiAqb3B0OworCisJZm9yIChvcHQgPSB2YWxp ZF9vcHRpb25zOyBvcHQtPm9wdG5hbWU7IG9wdCsrKQorCXsKKwkJaWYgKGNvbnRleHQgPT0g b3B0LT5vcHRjb250ZXh0ICYmIHN0cmNtcChvcHQtPm9wdG5hbWUsIG9wdG5hbWUpID09IDAp CisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogQ2hl Y2sgd2hldGhlciB0aGUgZ2l2ZW4gb3B0aW9uIGlzIG9uZSBvZiB0aGUgdmFsaWQgbGlicHEg b3B0aW9ucy4KKyAqIGNvbnRleHQgaXMgdGhlIE9pZCBvZiB0aGUgY2F0YWxvZyBob2xkaW5n IHRoZSBvYmplY3QgdGhlIG9wdGlvbiBpcyBmb3IuCisgKi8KK3N0YXRpYyBib29sCitpc19s aWJwcV9vcHRpb24oY29uc3QgY2hhciAqb3B0bmFtZSkKK3sKKwlQZ3NxbEZkd09wdGlvbiAq b3B0OworCisJZm9yIChvcHQgPSB2YWxpZF9vcHRpb25zOyBvcHQtPm9wdG5hbWU7IG9wdCsr KQorCXsKKwkJaWYgKHN0cmNtcChvcHQtPm9wdG5hbWUsIG9wdG5hbWUpID09IDAgJiYgb3B0 LT5pc19saWJwcV9vcHQpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOwor fQorCisvKgorICogR2VuZXJhdGUga2V5LXZhbHVlIGFycmF5cyB3aGljaCBpbmNsdWRlcyBv bmx5IGxpYnBxIG9wdGlvbnMgZnJvbSB0aGUgbGlzdAorICogd2hpY2ggY29udGFpbnMgYW55 IGtpbmQgb2Ygb3B0aW9ucy4KKyAqLworaW50CitFeHRyYWN0Q29ubmVjdGlvbk9wdGlvbnMo TGlzdCAqZGVmZWxlbXMsIGNvbnN0IGNoYXIgKiprZXl3b3JkcywgY29uc3QgY2hhciAqKnZh bHVlcykKK3sKKwlMaXN0Q2VsbCAqbGM7CisJaW50IGk7CisKKwlpID0gMDsKKwlmb3JlYWNo KGxjLCBkZWZlbGVtcykKKwl7CisJCURlZkVsZW0gKmQgPSAoRGVmRWxlbSAqKSBsZmlyc3Qo bGMpOworCQlpZiAoaXNfbGlicHFfb3B0aW9uKGQtPmRlZm5hbWUpKQorCQl7CisJCQlrZXl3 b3Jkc1tpXSA9IGQtPmRlZm5hbWU7CisJCQl2YWx1ZXNbaV0gPSBkZWZHZXRTdHJpbmcoZCk7 CisJCQlpKys7CisJCX0KKwl9CisJcmV0dXJuIGk7Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRy aWIvcGdzcWxfZmR3L3Bnc3FsX2Zkdy0tMS4wLnNxbCBiL2NvbnRyaWIvcGdzcWxfZmR3L3Bn c3FsX2Zkdy0tMS4wLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5i MGVhMmIyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wZ3NxbF9mZHcvcGdzcWxfZmR3 LS0xLjAuc3FsCkBAIC0wLDAgKzEsMzkgQEAKKy8qIGNvbnRyaWIvcGdzcWxfZmR3L3Bnc3Fs X2Zkdy0tMS4wLnNxbCAqLworCistLSBjb21wbGFpbiBpZiBzY3JpcHQgaXMgc291cmNlZCBp biBwc3FsLCByYXRoZXIgdGhhbiB2aWEgQ1JFQVRFIEVYVEVOU0lPTgorXGVjaG8gVXNlICJD UkVBVEUgRVhURU5TSU9OIHBnc3FsX2ZkdyIgdG8gbG9hZCB0aGlzIGZpbGUuIFxxdWl0CisK K0NSRUFURSBGVU5DVElPTiBwZ3NxbF9mZHdfaGFuZGxlcigpCitSRVRVUk5TIGZkd19oYW5k bGVyCitBUyAnTU9EVUxFX1BBVEhOQU1FJworTEFOR1VBR0UgQyBTVFJJQ1Q7CisKK0NSRUFU RSBGVU5DVElPTiBwZ3NxbF9mZHdfdmFsaWRhdG9yKHRleHRbXSwgb2lkKQorUkVUVVJOUyB2 b2lkCitBUyAnTU9EVUxFX1BBVEhOQU1FJworTEFOR1VBR0UgQyBTVFJJQ1Q7CisKK0NSRUFU RSBGT1JFSUdOIERBVEEgV1JBUFBFUiBwZ3NxbF9mZHcKKyAgSEFORExFUiBwZ3NxbF9mZHdf aGFuZGxlcgorICBWQUxJREFUT1IgcGdzcWxfZmR3X3ZhbGlkYXRvcjsKKworLyogY29ubmVj dGlvbiBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBhbmQgdmlldyAqLworQ1JFQVRFIEZVTkNUSU9O IHBnc3FsX2Zkd19nZXRfY29ubmVjdGlvbnMob3V0IHNydmlkIG9pZCwgb3V0IHVzZXN5c2lk IG9pZCkKK1JFVFVSTlMgU0VUT0YgcmVjb3JkCitBUyAnTU9EVUxFX1BBVEhOQU1FJworTEFO R1VBR0UgQyBTVFJJQ1Q7CisKK0NSRUFURSBGVU5DVElPTiBwZ3NxbF9mZHdfZGlzY29ubmVj dChvaWQsIG9pZCkKK1JFVFVSTlMgdGV4dAorQVMgJ01PRFVMRV9QQVRITkFNRScKK0xBTkdV QUdFIEMgU1RSSUNUOworCitDUkVBVEUgVklFVyBwZ3NxbF9mZHdfY29ubmVjdGlvbnMgQVMK K1NFTEVDVCBjLnNydmlkIHNydmlkLAorICAgICAgIHMuc3J2bmFtZSBzcnZuYW1lLAorICAg ICAgIGMudXNlc3lzaWQgdXNlc3lzaWQsCisgICAgICAgcGdfZ2V0X3VzZXJieWlkKGMudXNl c3lzaWQpIHVzZW5hbWUKKyAgRlJPTSBwZ3NxbF9mZHdfZ2V0X2Nvbm5lY3Rpb25zKCkgYwor ICAgICAgICAgICBKT0lOIHBnX2NhdGFsb2cucGdfZm9yZWlnbl9zZXJ2ZXIgcyBPTiAocy5v aWQgPSBjLnNydmlkKTsKK0dSQU5UIFNFTEVDVCBPTiBwZ3NxbF9mZHdfY29ubmVjdGlvbnMg VE8gcHVibGljOworCmRpZmYgLS1naXQgYS9jb250cmliL3Bnc3FsX2Zkdy9wZ3NxbF9mZHcu YyBiL2NvbnRyaWIvcGdzcWxfZmR3L3Bnc3FsX2Zkdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAuLjUyNTI5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3Bn c3FsX2Zkdy9wZ3NxbF9mZHcuYwpAQCAtMCwwICsxLDEzMTAgQEAKKy8qLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICoKKyAqIHBnc3FsX2Zkdy5jCisgKgkJICBmb3JlaWduLWRhdGEgd3JhcHBl ciBmb3IgcmVtb3RlIFBvc3RncmVTUUwgc2VydmVycy4KKyAqCisgKiBDb3B5cmlnaHQgKGMp IDIwMTIsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisgKgorICogSURF TlRJRklDQVRJT04KKyAqCQkgIGNvbnRyaWIvcGdzcWxfZmR3L3Bnc3FsX2Zkdy5jCisgKgor ICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorI2lu Y2x1ZGUgImZtZ3IuaCIKKworI2luY2x1ZGUgImNhdGFsb2cvcGdfZm9yZWlnbl9zZXJ2ZXIu aCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2ZvcmVpZ25fdGFibGUuaCIKKyNpbmNsdWRlICJj b21tYW5kcy9kZWZyZW0uaCIKKyNpbmNsdWRlICJjb21tYW5kcy9leHBsYWluLmgiCisjaW5j bHVkZSAiY29tbWFuZHMvdmFjdXVtLmgiCisjaW5jbHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIK KyNpbmNsdWRlICJmdW5jYXBpLmgiCisjaW5jbHVkZSAibWlzY2FkbWluLmgiCisjaW5jbHVk ZSAib3B0aW1pemVyL2Nvc3QuaCIKKyNpbmNsdWRlICJvcHRpbWl6ZXIvcGF0aG5vZGUuaCIK KyNpbmNsdWRlICJvcHRpbWl6ZXIvcGxhbm1haW4uaCIKKyNpbmNsdWRlICJvcHRpbWl6ZXIv cmVzdHJpY3RpbmZvLmgiCisjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRl ICJ1dGlscy9sc3lzY2FjaGUuaCIKKyNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgorI2lu Y2x1ZGUgInV0aWxzL3JlbC5oIgorCisjaW5jbHVkZSAicGdzcWxfZmR3LmgiCisjaW5jbHVk ZSAiY29ubmVjdGlvbi5oIgorCitQR19NT0RVTEVfTUFHSUM7CisKKy8qCisgKiBDb3N0IHRv IGVzdGFibGlzaCBhIGNvbm5lY3Rpb24uCisgKiBYWFg6IHNob3VsZCBiZSBjb25maWd1cmFi bGUgcGVyIHNlcnZlcj8KKyAqLworI2RlZmluZSBDT05ORUNUSU9OX0NPU1RTCQkJMTAwLjAK KworLyoKKyAqIENvc3QgdG8gdHJhbnNmZXIgMSBieXRlIGZyb20gcmVtb3RlIHNlcnZlci4K KyAqIFhYWDogc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSBwZXIgc2VydmVyPworICovCisjZGVm aW5lIFRSQU5TRkVSX0NPU1RTX1BFUl9CWVRFCQkwLjAwMQorCisvKgorICogVGhlIGluaXRp YWwgc2l6ZSBvZiB0aGUgYnVmZmVyIHdoaWNoIGlzIHVzZWQgdG8gaG9sZCBzdHJpbmcgcmVw cmVzZW50YXRpb24KKyAqIG9mIHZhbHVlIG9mIGZldGNoZWQgY29sdW1uIGluIGxpYnBxIHJv dyBwcm9jZXNzb3IuCisgKi8KKyNkZWZpbmUgSU5JVElBTF9DT0xCVUZfU0laRQkJCTEwMjQK KworLyoKKyAqIEZEVy1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgUmVsT3B0SW5mby5mZHdf cHJpdmF0ZS4gIFRoaXMgaXMgdXNlZCB0byBwYXNzCisgKiBpbmZvcm1hdGlvbiBmcm9tIHBn c3FsR2V0Rm9yZWlnblJlbFNpemUgdG8gcGdzcWxHZXRGb3JlaWduUGF0aHMuCisgKi8KK3R5 cGVkZWYgc3RydWN0IFBnc3FsRmR3UGxhblN0YXRlIHsKKwkvKgorCSAqIFRoZXNlIGFyZSBn ZW5lcmF0ZWQgaW4gR2V0Rm9yZWlnblJlbFNpemUsIGFuZCBhbHNvIHVzZWQgaW4gc3Vic2Vx dWVudAorCSAqIEdldEZvcmVpZ25QYXRocy4KKwkgKi8KKwlTdHJpbmdJbmZvRGF0YQlzcWw7 CisJQ29zdAkJCXN0YXJ0dXBfY29zdDsKKwlDb3N0CQkJdG90YWxfY29zdDsKKwlMaXN0CQkg ICAqcmVtb3RlX2NvbmRzOworCUxpc3QJCSAgICpwYXJhbV9jb25kczsKKwlMaXN0CQkgICAq bG9jYWxfY29uZHM7CisKKwkvKiBDYWNoZWQgY2F0YWxvZyBpbmZvcm1hdGlvbi4gKi8KKwlG b3JlaWduVGFibGUgICAqdGFibGU7CisJRm9yZWlnblNlcnZlciAgKnNlcnZlcjsKK30gUGdz cWxGZHdQbGFuU3RhdGU7CisKKy8qCisgKiBJbmRleCBvZiBGRFctcHJpdmF0ZSBpbmZvcm1h dGlvbiBzdG9yZWQgaW4gZmR3X3ByaXZhdGUgbGlzdC4KKyAqCisgKiBXZSBzdG9yZSB2YXJp b3VzIGluZm9ybWF0aW9uIGluIEZvcmVpZ25TY2FuLmZkd19wcml2YXRlIHRvIHBhc3MgdGhl bSBiZXlvbmQKKyAqIHRoZSBib3VuZGFyeSBiZXR3ZWVuIHBsYW5uZXIgYW5kIGV4ZWN1dG9y LiAgRmluYWxseSBGZHdQbGFuIGhvbGRzIGl0ZW1zCisgKiBiZWxvdzoKKyAqCisgKiAxKSBw bGFpbiBTRUxFQ1Qgc3RhdGVtZW50CisgKgorICogVGhlc2UgaXRlbXMgYXJlIGluZGV4ZWQg d2l0aCB0aGUgZW51bSBGZHdQcml2YXRlSW5kZXgsIHNvIGFuIGl0ZW0KKyAqIGNhbiBiZSBh Y2Nlc3NlZCBkaXJlY3RseSB2aWEgbGlzdF9udGgoKS4gIEZvciBleGFtcGxlIG9mIFNFTEVD VCBzdGF0ZW1lbnQ6CisgKiAgICAgIHNxbCA9IGxpc3RfbnRoKGZkd19wcml2YXRlLCBGZHdQ cml2YXRlU2VsZWN0U3FsKQorICovCitlbnVtIEZkd1ByaXZhdGVJbmRleCB7CisJLyogU1FM IHN0YXRlbWVudHMgKi8KKwlGZHdQcml2YXRlU2VsZWN0U3FsLAorCisJLyogIyBvZiBlbGVt ZW50cyBzdG9yZWQgaW4gdGhlIGxpc3QgZmR3X3ByaXZhdGUgKi8KKwlGZHdQcml2YXRlTnVt LAorfTsKKworLyoKKyAqIERlc2NyaWJlIHRoZSBhdHRyaWJ1dGUgd2hlcmUgZGF0YSBjb252 ZXJzaW9uIGZhaWxzLgorICovCit0eXBlZGVmIHN0cnVjdCBFcnJvclBvcyB7CisJT2lkCQkJ cmVsaWQ7CQkJLyogb2lkIG9mIHRoZSBmb3JlaWduIHRhYmxlICovCisJQXR0ck51bWJlcglj dXJfYXR0bm87CQkvKiBhdHRyaWJ1dGUgbnVtYmVyIHVuZGVyIHByb2Nlc3MgKi8KK30gRXJy b3JQb3M7CisKKy8qCisgKiBEZXNjcmliZXMgYW4gZXhlY3V0aW9uIHN0YXRlIG9mIGEgZm9y ZWlnbiBzY2FuIGFnYWluc3QgYSBmb3JlaWduIHRhYmxlCisgKiB1c2luZyBwZ3NxbF9mZHcu CisgKi8KK3R5cGVkZWYgc3RydWN0IFBnc3FsRmR3RXhlY3V0aW9uU3RhdGUKK3sKKwlMaXN0 CSAgICpmZHdfcHJpdmF0ZTsJLyogRkRXLXByaXZhdGUgaW5mb3JtYXRpb24gKi8KKworCS8q IGZvciByZW1vdGUgcXVlcnkgZXhlY3V0aW9uICovCisJUEdjb25uCSAgICpjb25uOwkJCS8q IGNvbm5lY3Rpb24gZm9yIHRoZSBzY2FuICovCisJT2lkCQkgICAqcGFyYW1fdHlwZXM7CS8q IHR5cGUgYXJyYXkgb2YgZXh0ZXJuYWwgcGFyYW1ldGVyICovCisJY29uc3QgY2hhciAqKnBh cmFtX3ZhbHVlczsJLyogdmFsdWUgYXJyYXkgb2YgZXh0ZXJuYWwgcGFyYW1ldGVyICovCisK KwkvKiBmb3IgdHVwbGUgZ2VuZXJhdGlvbi4gKi8KKwljaGFyCSAgICpjb2xidWY7CQkJLyog Y29sdW1uIHZhbHVlIGJ1ZmZlciBmb3Igcm93IHByb2Nlc3NvciAqLworCWludAkJCWNvbGJ1 ZmxlbjsJCS8qIGNvbHVtbiB2YWx1ZSBidWZmZXIgc2l6ZSBmb3Igcm93IHByb2Nlc3NvciAq LworCUF0dHJOdW1iZXIJYXR0bnVtOwkJCS8qICMgb2Ygbm9uLWRyb3BwZWQgYXR0cmlidXRl ICovCisJRGF0dW0JICAgKnZhbHVlczsJCQkvKiBjb2x1bW4gdmFsdWUgYnVmZmVyICovCisJ Ym9vbAkgICAqbnVsbHM7CQkJLyogY29sdW1uIG51bGwgaW5kaWNhdG9yIGJ1ZmZlciAqLwor CUF0dEluTWV0YWRhdGEgKmF0dGlubWV0YTsJLyogYXR0cmlidXRlIG1ldGFkYXRhICovCisK KwkvKiBmb3Igc3RvcmluZyByZXN1bHQgdHVwbGVzICovCisJTWVtb3J5Q29udGV4dCBzY2Fu X2N4dDsJCS8qIGNvbnRleHQgZm9yIHBlci1zY2FuIGxpZmVzcGFuIGRhdGEgKi8KKwlNZW1v cnlDb250ZXh0IHRlbXBfY3h0OwkJLyogY29udGV4dCBmb3IgcGVyLXR1cGxlIHRlbXBvcmFy eSBkYXRhICovCisJVHVwbGVzdG9yZXN0YXRlICp0dXBsZXM7CS8qIHJlc3VsdCBvZiB0aGUg c2NhbiAqLworCisJLyogZm9yIGVycm9yIGhhbmRsaW5nLiAqLworCUVycm9yUG9zCWVycnBv czsKK30gUGdzcWxGZHdFeGVjdXRpb25TdGF0ZTsKKworLyoKKyAqIERlc2NyaWJlcyBhIHN0 YXRlIG9mIGFuYWx5emUgcmVxdWVzdCBmb3IgYSBmb3JlaWduIHRhYmxlLgorICovCit0eXBl ZGVmIHN0cnVjdCBQZ3NxbEFuYWx5emVTdGF0ZQoreworCS8qIGZvciB0dXBsZSBnZW5lcmF0 aW9uLiAqLworCVR1cGxlRGVzYwl0dXBkZXNjOworCUF0dEluTWV0YWRhdGEgKmF0dGlubWV0 YTsKKwljaGFyCSAgICpjb2xidWY7CQkJLyogY29sdW1uIHZhbHVlIGJ1ZmZlciBmb3Igcm93 IHByb2Nlc3NvciAqLworCWludAkJCWNvbGJ1ZmxlbjsJCS8qIGNvbHVtbiB2YWx1ZSBidWZm ZXIgc2l6ZSBmb3Igcm93IHByb2Nlc3NvciAqLworCURhdHVtCSAgICp2YWx1ZXM7CisJYm9v bAkgICAqbnVsbHM7CisKKwkvKiBmb3IgcmFuZG9tIHNhbXBsaW5nICovCisJSGVhcFR1cGxl ICAqcm93czsJCQkvKiByZXN1bHQgYnVmZmVyICovCisJaW50CQkJdGFyZ3Jvd3M7CQkvKiB0 YXJnZXQgIyBvZiBzYW1wbGUgcm93cyAqLworCWludAkJCW51bXJvd3M7CQkvKiAjIG9mIHNh bXBsZXMgY29sbGVjdGVkICovCisJZG91YmxlCQlzYW1wbGVyb3dzOwkJLyogIyBvZiByb3dz IGZldGNoZWQgKi8KKwlkb3VibGUJCXJvd3N0b3NraXA7CQkvKiAjIG9mIHJvd3Mgc2tpcHBl ZCBiZWZvcmUgbmV4dCBzYW1wbGUgKi8KKwlkb3VibGUJCXJzdGF0ZTsJCQkvKiByYW5kb20g c3RhdGUgKi8KKworCS8qIGZvciBzdG9yaW5nIHJlc3VsdCB0dXBsZXMgKi8KKwlNZW1vcnlD b250ZXh0IGFubF9jeHQ7CQkvKiBjb250ZXh0IGZvciBwZXItYW5hbHl6ZSBsaWZlc3BhbiBk YXRhICovCisJTWVtb3J5Q29udGV4dCB0ZW1wX2N4dDsJCS8qIGNvbnRleHQgZm9yIHBlci10 dXBsZSB0ZW1wb3JhcnkgZGF0YSAqLworCisJLyogZm9yIGVycm9yIGhhbmRsaW5nLiAqLwor CUVycm9yUG9zCWVycnBvczsKK30gUGdzcWxBbmFseXplU3RhdGU7CisKKy8qCisgKiBTUUwg ZnVuY3Rpb25zCisgKi8KK2V4dGVybiBEYXR1bSBwZ3NxbF9mZHdfaGFuZGxlcihQR19GVU5D VElPTl9BUkdTKTsKK1BHX0ZVTkNUSU9OX0lORk9fVjEocGdzcWxfZmR3X2hhbmRsZXIpOwor CisvKgorICogRkRXIGNhbGxiYWNrIHJvdXRpbmVzCisgKi8KK3N0YXRpYyB2b2lkIHBnc3Fs R2V0Rm9yZWlnblJlbFNpemUoUGxhbm5lckluZm8gKnJvb3QsCisJCQkJCQkJCSAgIFJlbE9w dEluZm8gKmJhc2VyZWwsCisJCQkJCQkJCSAgIE9pZCBmb3JlaWdudGFibGVpZCk7CitzdGF0 aWMgdm9pZCBwZ3NxbEdldEZvcmVpZ25QYXRocyhQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJ CQkJIFJlbE9wdEluZm8gKmJhc2VyZWwsCisJCQkJCQkJCSBPaWQgZm9yZWlnbnRhYmxlaWQp Oworc3RhdGljIEZvcmVpZ25TY2FuICpwZ3NxbEdldEZvcmVpZ25QbGFuKFBsYW5uZXJJbmZv ICpyb290LAorCQkJCQkJCQkJCVJlbE9wdEluZm8gKmJhc2VyZWwsCisJCQkJCQkJCQkJT2lk IGZvcmVpZ250YWJsZWlkLAorCQkJCQkJCQkJCUZvcmVpZ25QYXRoICpiZXN0X3BhdGgsCisJ CQkJCQkJCQkJTGlzdCAqdGxpc3QsCisJCQkJCQkJCQkJTGlzdCAqc2Nhbl9jbGF1c2VzKTsK K3N0YXRpYyB2b2lkIHBnc3FsRXhwbGFpbkZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUg Km5vZGUsIEV4cGxhaW5TdGF0ZSAqZXMpOworc3RhdGljIHZvaWQgcGdzcWxCZWdpbkZvcmVp Z25TY2FuKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsIGludCBlZmxhZ3MpOworc3RhdGljIFR1 cGxlVGFibGVTbG90ICpwZ3NxbEl0ZXJhdGVGb3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRl ICpub2RlKTsKK3N0YXRpYyB2b2lkIHBnc3FsUmVTY2FuRm9yZWlnblNjYW4oRm9yZWlnblNj YW5TdGF0ZSAqbm9kZSk7CitzdGF0aWMgdm9pZCBwZ3NxbEVuZEZvcmVpZ25TY2FuKEZvcmVp Z25TY2FuU3RhdGUgKm5vZGUpOworc3RhdGljIGJvb2wgcGdzcWxBbmFseXplRm9yZWlnblRh YmxlKFJlbGF0aW9uIHJlbGF0aW9uLAorCQkJCQkJCQkJIEFjcXVpcmVTYW1wbGVSb3dzRnVu YyAqZnVuYywKKwkJCQkJCQkJCSBCbG9ja051bWJlciAqdG90YWxwYWdlcyk7CisKKy8qCisg KiBIZWxwZXIgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIGdldF9yZW1vdGVfZXN0aW1h dGUoY29uc3QgY2hhciAqc3FsLAorCQkJCQkJCQlQR2Nvbm4gKmNvbm4sCisJCQkJCQkJCWRv dWJsZSAqcm93cywKKwkJCQkJCQkJaW50ICp3aWR0aCwKKwkJCQkJCQkJQ29zdCAqc3RhcnR1 cF9jb3N0LAorCQkJCQkJCQlDb3N0ICp0b3RhbF9jb3N0KTsKK3N0YXRpYyB2b2lkIGFkanVz dF9jb3N0cyhkb3VibGUgcm93cywgaW50IHdpZHRoLAorCQkJCQkJIENvc3QgKnN0YXJ0dXBf Y29zdCwgQ29zdCAqdG90YWxfY29zdCk7CitzdGF0aWMgdm9pZCBleGVjdXRlX3F1ZXJ5KEZv cmVpZ25TY2FuU3RhdGUgKm5vZGUpOworc3RhdGljIGludCBxdWVyeV9yb3dfcHJvY2Vzc29y KFBHcmVzdWx0ICpyZXMsIGNvbnN0IFBHZGF0YVZhbHVlICpjb2x1bW5zLAorCQkJCQkJCSAg IGNvbnN0IGNoYXIgKiplcnJtc2dwLCB2b2lkICpwYXJhbSk7CitzdGF0aWMgdm9pZCBwZ3Nx bF9mZHdfZXJyb3JfY2FsbGJhY2sodm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgcGdzcWxBY3F1 aXJlU2FtcGxlUm93c0Z1bmMoUmVsYXRpb24gcmVsYXRpb24sIGludCBlbGV2ZWwsCisJCQkJ CQkJCQkgIEhlYXBUdXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAorCQkJCQkJCQkJICBkb3Vi bGUgKnRvdGFscm93cywKKwkJCQkJCQkJCSAgZG91YmxlICp0b3RhbGRlYWRyb3dzKTsKK3N0 YXRpYyBpbnQgYW5hbHl6ZV9yb3dfcHJvY2Vzc29yKFBHcmVzdWx0ICpyZXMsIGNvbnN0IFBH ZGF0YVZhbHVlICpjb2x1bW5zLAorCQkJCQkJCQkgY29uc3QgY2hhciAqKmVycm1zZ3AsIHZv aWQgKnBhcmFtKTsKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zLCBidXQgbm90IHdyaXR0ZW4g aW4gcGdzcWxfZmR3LmguICovCit2b2lkIF9QR19pbml0KHZvaWQpOwordm9pZCBfUEdfZmlu aSh2b2lkKTsKKworLyoKKyAqIE1vZHVsZS1zcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KKyAq Lwordm9pZAorX1BHX2luaXQodm9pZCkKK3sKK30KKworLyoKKyAqIE1vZHVsZS1zcGVjaWZp YyBjbGVhbiB1cC4KKyAqLwordm9pZAorX1BHX2Zpbmkodm9pZCkKK3sKK30KKworLyoKKyAq IFRoZSBjb250ZW50IG9mIEZkd1JvdXRpbmUgb2YgcGdzcWxfZmR3IGlzIG5ldmVyIGNoYW5n ZWQsIHNvIHdlIHVzZSBvbmUKKyAqIHN0YXRpYyBvYmplY3QgZm9yIGFsbCBzY2FuLgorICov CitzdGF0aWMgRmR3Um91dGluZSBmZHdyb3V0aW5lID0geworCisJLyogTm9kZSB0eXBlICov CisJVF9GZHdSb3V0aW5lLAorCisJLyogUmVxdWlyZWQgaGFuZGxlciBmdW5jdGlvbnMuICov CisJcGdzcWxHZXRGb3JlaWduUmVsU2l6ZSwKKwlwZ3NxbEdldEZvcmVpZ25QYXRocywKKwlw Z3NxbEdldEZvcmVpZ25QbGFuLAorCXBnc3FsRXhwbGFpbkZvcmVpZ25TY2FuLAorCXBnc3Fs QmVnaW5Gb3JlaWduU2NhbiwKKwlwZ3NxbEl0ZXJhdGVGb3JlaWduU2NhbiwKKwlwZ3NxbFJl U2NhbkZvcmVpZ25TY2FuLAorCXBnc3FsRW5kRm9yZWlnblNjYW4sCisKKwkvKiBPcHRpb25h bCBoYW5kbGVyIGZ1bmN0aW9ucy4gKi8KKwlwZ3NxbEFuYWx5emVGb3JlaWduVGFibGUsCit9 OworCisvKgorICogRm9yZWlnbi1kYXRhIHdyYXBwZXIgaGFuZGxlciBmdW5jdGlvbjogcmV0 dXJuIGEgc3RydWN0IHdpdGggcG9pbnRlcnMKKyAqIHRvIG15IGNhbGxiYWNrIHJvdXRpbmVz LgorICovCitEYXR1bQorcGdzcWxfZmR3X2hhbmRsZXIoUEdfRlVOQ1RJT05fQVJHUykKK3sK KwlQR19SRVRVUk5fUE9JTlRFUigmZmR3cm91dGluZSk7Cit9CisKKy8qCisgKiBwZ3NxbEdl dEZvcmVpZ25SZWxTaXplCisgKgkJRXN0aW1hdGUgIyBvZiByb3dzIGFuZCB3aWR0aCBvZiB0 aGUgcmVzdWx0IG9mIHRoZSBzY2FuCisgKgorICogSGVyZSB3ZSBlc3RpbWF0ZSBudW1iZXIg b2Ygcm93cyByZXR1cm5lZCBieSB0aGUgc2NhbiBpbiB0d28gc3RlcHMuICBJbiB0aGUKKyAq IGZpcnN0IHN0ZXAsIHdlIGV4ZWN1dGUgcmVtb3RlIEVYUExBSU4gY29tbWFuZCB0byBvYnRh aW4gdGhlIG51bWJlciBvZiByb3dzCisgKiByZXR1cm5lZCBmcm9tIHJlbW90ZSBzaWRlLiAg SW4gdGhlIHNlY29uZCBzdGVwLCB3ZSBjYWxjdWxhdGUgdGhlIHNlbGVjdGl2aXR5CisgKiBv ZiB0aGUgZmlsdGVyaW5nIGRvbmUgb24gbG9jYWwgc2lkZSwgYW5kIG1vZGlmeSBmaXJzdCBl c3RpbWF0ZS4KKyAqCisgKiBXZSBoYXZlIHRvIGdldCBzb21lIGNhdGFsb2cgb2JqZWN0cyBh bmQgZ2VuZXJhdGUgcmVtb3RlIHF1ZXJ5IHN0cmluZyBoZXJlLAorICogc28gd2Ugc3RvcmUg c3VjaCBleHBlbnNpdmUgaW5mb3JtYXRpb24gaW4gRkRXIHByaXZhdGUgYXJlYSBvZiBSZWxP cHRJbmZvIGFuZAorICogcGFzcyB0aGVtIHRvIHN1YnNlcXVlbnQgZnVuY3Rpb25zIGZvciBy ZXVzZS4KKyAqLworc3RhdGljIHZvaWQKK3Bnc3FsR2V0Rm9yZWlnblJlbFNpemUoUGxhbm5l ckluZm8gKnJvb3QsCisJCQkJCSAgIFJlbE9wdEluZm8gKmJhc2VyZWwsCisJCQkJCSAgIE9p ZCBmb3JlaWdudGFibGVpZCkKK3sKKwlQZ3NxbEZkd1BsYW5TdGF0ZSAqZnBzdGF0ZTsKKwlT dHJpbmdJbmZvCQlzcWw7CisJRm9yZWlnblRhYmxlICAgKnRhYmxlOworCUZvcmVpZ25TZXJ2 ZXIgICpzZXJ2ZXI7CisJVXNlck1hcHBpbmcJICAgKnVzZXI7CisJUEdjb25uCQkgICAqY29u bjsKKwlkb3VibGUJCQlyb3dzOworCWludAkJCQl3aWR0aDsKKwlDb3N0CQkJc3RhcnR1cF9j b3N0OworCUNvc3QJCQl0b3RhbF9jb3N0OworCUxpc3QJCSAgICpyZW1vdGVfY29uZHMgPSBO SUw7CisJTGlzdAkJICAgKnBhcmFtX2NvbmRzID0gTklMOworCUxpc3QJCSAgICpsb2NhbF9j b25kcyA9IE5JTDsKKwlTZWxlY3Rpdml0eQkJc2VsOworCisJLyoKKwkgKiBXZSB1c2UgUGdz cWxGZHdQbGFuU3RhdGUgdG8gcGFzcyB2YXJpb3VzIGluZm9ybWF0aW9uIHRvIHN1YnNlcXVl bnQKKwkgKiBmdW5jdGlvbnMuCisJICovCisJZnBzdGF0ZSA9IHBhbGxvYzAoc2l6ZW9mKFBn c3FsRmR3UGxhblN0YXRlKSk7CisJaW5pdFN0cmluZ0luZm8oJmZwc3RhdGUtPnNxbCk7CisJ c3FsID0gJmZwc3RhdGUtPnNxbDsKKworCS8qIFJldHJpZXZlIGNhdGFsb2cgb2JqZWN0cyB3 aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGVzdGltYXRlIHJvd3MuICovCisJdGFibGUgPSBHZXRG b3JlaWduVGFibGUoZm9yZWlnbnRhYmxlaWQpOworCXNlcnZlciA9IEdldEZvcmVpZ25TZXJ2 ZXIodGFibGUtPnNlcnZlcmlkKTsKKwl1c2VyID0gR2V0VXNlck1hcHBpbmcoR2V0T3V0ZXJV c2VySWQoKSwgc2VydmVyLT5zZXJ2ZXJpZCk7CisKKwkvKgorCSAqIENvbnN0cnVjdCByZW1v dGUgcXVlcnkgd2hpY2ggY29uc2lzdHMgb2YgU0VMRUNULCBGUk9NLCBhbmQgV0hFUkUKKwkg KiBjbGF1c2VzLCBidXQgY29uZGl0aW9ucyBjb250YWluIGFueSBQYXJhbSBub2RlIGFyZSBl eGNsdWRlZCBiZWNhdXNlCisJICogcGxhY2Vob2xkZXIgY2FuJ3QgYmUgdXNlZCBpbiBFWFBM QUlOIHN0YXRlbWVudC4gIFN1Y2ggY29uZGl0aW9ucyBhcmUKKwkgKiBhcHBlbmRlZCBsYXRl ci4KKwkgKi8KKwlzb3J0Q29uZGl0aW9ucyhyb290LCBiYXNlcmVsLCAmcmVtb3RlX2NvbmRz LCAmcGFyYW1fY29uZHMsICZsb2NhbF9jb25kcyk7CisJZGVwYXJzZVNpbXBsZVNxbChzcWws IGZvcmVpZ250YWJsZWlkLCByb290LCBiYXNlcmVsKTsKKwlpZiAobGlzdF9sZW5ndGgocmVt b3RlX2NvbmRzKSA+IDApCisJCWFwcGVuZFdoZXJlQ2xhdXNlKHNxbCwgdHJ1ZSwgcmVtb3Rl X2NvbmRzLCByb290KTsKKwljb25uID0gR2V0Q29ubmVjdGlvbihzZXJ2ZXIsIHVzZXIsIGZh bHNlKTsKKwlnZXRfcmVtb3RlX2VzdGltYXRlKHNxbC0+ZGF0YSwgY29ubiwgJnJvd3MsICZ3 aWR0aCwKKwkJCQkJCSZzdGFydHVwX2Nvc3QsICZ0b3RhbF9jb3N0KTsKKwlSZWxlYXNlQ29u bmVjdGlvbihjb25uKTsKKwlpZiAobGlzdF9sZW5ndGgocGFyYW1fY29uZHMpID4gMCkKKwkJ YXBwZW5kV2hlcmVDbGF1c2Uoc3FsLCAhKGxpc3RfbGVuZ3RoKHJlbW90ZV9jb25kcykgPiAw KSwgcGFyYW1fY29uZHMsCisJCQkJCQkgIHJvb3QpOworCisJLyoKKwkgKiBFc3RpbWF0ZSBz ZWxlY3Rpdml0eSBvZiBjb25kaXRpb25zIHdoaWNoIGFyZSBub3QgdXNlZCBpbiByZW1vdGUg RVhQTEFJTgorCSAqIGJ5IGNhbGxpbmcgY2xhdXNlbGlzdF9zZWxlY3Rpdml0eSgpLiAgVGhl IGJlc3Qgd2UgY2FuIGRvIGZvcgorCSAqIHBhcmFtZXRlcml6ZWQgY29uZGl0aW9uIGlzIHRv IGVzdGltYXRlIHNlbGVjdGl2aXR5IG9uIHRoZSBiYXNpcyBvZiBsb2NhbAorCSAqIHN0YXRp c3RpY3MuICBXaGVuIHdlIGFjdHVhbGx5IG9idGFpbiByZXN1bHQgcm93cywgc3VjaCBjb25k aXRpb25zIGFyZQorCSAqIGRlcGFyc2VkIGludG8gcmVtb3RlIHF1ZXJ5IGFuZCByZWR1Y2Ug cm93cyB0cmFuc2ZlcnJlZC4KKwkgKi8KKwlzZWwgPSAxLjA7CisJc2VsICo9IGNsYXVzZWxp c3Rfc2VsZWN0aXZpdHkocm9vdCwgcGFyYW1fY29uZHMsCisJCQkJCQkJCSAgYmFzZXJlbC0+ cmVsaWQsIEpPSU5fSU5ORVIsIE5VTEwpOworCXNlbCAqPSBjbGF1c2VsaXN0X3NlbGVjdGl2 aXR5KHJvb3QsIGxvY2FsX2NvbmRzLAorCQkJCQkJCQkgIGJhc2VyZWwtPnJlbGlkLCBKT0lO X0lOTkVSLCBOVUxMKTsKKwliYXNlcmVsLT5yb3dzID0gcm93cyAqIHNlbDsKKwliYXNlcmVs LT53aWR0aCA9IHdpZHRoOworCisJLyoKKwkgKiBQYWNrIG9idGFpbmVkIGluZm9ybWF0aW9u IGludG8gYSBvYmplY3QgYW5kIHN0b3JlIGl0IGluIEZEVy1wcml2YXRlIGFyZWEKKwkgKiBv ZiBSZWxPcHRJbmZvIHRvIHBhc3MgdGhlbSB0byBzdWJzZXF1ZW50IGZ1bmN0aW9ucy4KKwkg Ki8KKwlmcHN0YXRlLT5zdGFydHVwX2Nvc3QgPSBzdGFydHVwX2Nvc3Q7CisJZnBzdGF0ZS0+ dG90YWxfY29zdCA9IHRvdGFsX2Nvc3Q7CisJZnBzdGF0ZS0+cmVtb3RlX2NvbmRzID0gcmVt b3RlX2NvbmRzOworCWZwc3RhdGUtPnBhcmFtX2NvbmRzID0gcGFyYW1fY29uZHM7CisJZnBz dGF0ZS0+bG9jYWxfY29uZHMgPSBsb2NhbF9jb25kczsKKwlmcHN0YXRlLT50YWJsZSA9IHRh YmxlOworCWZwc3RhdGUtPnNlcnZlciA9IHNlcnZlcjsKKwliYXNlcmVsLT5mZHdfcHJpdmF0 ZSA9ICh2b2lkICopIGZwc3RhdGU7Cit9CisKKy8qCisgKiBwZ3NxbEdldEZvcmVpZ25QYXRo cworICoJCUNyZWF0ZSBwb3NzaWJsZSBzY2FuIHBhdGhzIGZvciBhIHNjYW4gb24gdGhlIGZv cmVpZ24gdGFibGUKKyAqLworc3RhdGljIHZvaWQKK3Bnc3FsR2V0Rm9yZWlnblBhdGhzKFBs YW5uZXJJbmZvICpyb290LAorCQkJCQkgUmVsT3B0SW5mbyAqYmFzZXJlbCwKKwkJCQkJIE9p ZCBmb3JlaWdudGFibGVpZCkKK3sKKwlQZ3NxbEZkd1BsYW5TdGF0ZSAqZnBzdGF0ZSA9IChQ Z3NxbEZkd1BsYW5TdGF0ZSAqKSBiYXNlcmVsLT5mZHdfcHJpdmF0ZTsKKwlGb3JlaWduUGF0 aAkgICAqcGF0aDsKKwlDb3N0CQkJc3RhcnR1cF9jb3N0OworCUNvc3QJCQl0b3RhbF9jb3N0 OworCUxpc3QJCSAgICpmZHdfcHJpdmF0ZTsKKworCS8qCisJICogV2UgaGF2ZSBjb3N0IHZh bHVlcyB3aGljaCBhcmUgZXN0aW1hdGVkIG9uIHJlbW90ZSBzaWRlLCBzbyB1c2UgdGhlbSB0 bworCSAqIGVzdGltYXRlIGJldHRlciBjb3N0cyB3aGljaCByZXNwZWN0IHZhcmlvdXMgc3R1 ZmZzIHRvIGNvbXBsZXRlIHRoZSBzY2FuLAorCSAqIHN1Y2ggYXMgc2VuZGluZyBxdWVyeSwg dHJhbnNmZXJyaW5nIHJlc3VsdCwgYW5kIGxvY2FsIGZpbHRlcmluZy4KKwkgKgorCSAqIFhY WCBXZSBhc3N1bWUgdGhhdCByZW1vdGUgY29zdCBmYWN0b3JzIGFyZSBzYW1lIGFzIGxvY2Fs LCBidXQgaXQgbWlnaHQKKwkgKiBiZSB3b3J0aCB0byBtYWtlIGNvbmZpZ3VyYWJsZS4KKwkg Ki8KKwlzdGFydHVwX2Nvc3QgPSBmcHN0YXRlLT5zdGFydHVwX2Nvc3Q7CisJdG90YWxfY29z dCA9IGZwc3RhdGUtPnRvdGFsX2Nvc3Q7CisJYWRqdXN0X2Nvc3RzKGJhc2VyZWwtPnJvd3Ms IGJhc2VyZWwtPndpZHRoLCAmc3RhcnR1cF9jb3N0LCAmdG90YWxfY29zdCk7CisKKwkvKiBD b25zdHJ1Y3QgbGlzdCBvZiBTUUwgc3RhdGVtZW50cyBhbmQgYmluZCBpdCB3aXRoIHRoZSBw YXRoLiAqLworCWZkd19wcml2YXRlID0gbGFwcGVuZChOSUwsIG1ha2VTdHJpbmcoZnBzdGF0 ZS0+c3FsLmRhdGEpKTsKKworCS8qCisJICogQ3JlYXRlIHNpbXBsZXN0IEZvcmVpZ25TY2Fu IHBhdGggbm9kZSBhbmQgYWRkIGl0IHRvIGJhc2VyZWwuICBUaGlzIHBhdGgKKwkgKiBjb3Jy ZXNwb25kcyB0byBTZXFTY2FuIHBhdGggb2YgcmVndWxhciB0YWJsZXMuCisJICovCisJcGF0 aCA9IGNyZWF0ZV9mb3JlaWduc2Nhbl9wYXRoKHJvb3QsIGJhc2VyZWwsCisJCQkJCQkJCSAg IGJhc2VyZWwtPnJvd3MsCisJCQkJCQkJCSAgIHN0YXJ0dXBfY29zdCwKKwkJCQkJCQkJICAg dG90YWxfY29zdCwKKwkJCQkJCQkJICAgTklMLAkJCQkvKiBubyBwYXRoa2V5cyAqLworCQkJ CQkJCQkgICBOVUxMLAkJCS8qIG5vIG91dGVyIHJlbCBlaXRoZXIgKi8KKwkJCQkJCQkJICAg ZmR3X3ByaXZhdGUpOworCWFkZF9wYXRoKGJhc2VyZWwsIChQYXRoICopIHBhdGgpOyAKKwor CS8qCisJICogWFhYIFdlIGNhbiBjb25zaWRlciBzb3J0ZWQgcGF0aCBvciBwYXJhbWV0ZXJp emVkIHBhdGggaGVyZSBpZiB3ZSBrbm93CisJICogdGhhdCBmb3JlaWduIHRhYmxlIGlzIGlu ZGV4ZWQgb24gcmVtb3RlIGVuZC4gIEZvciB0aGlzIHB1cnBvc2UsIHdlCisJICogbWlnaHQg aGF2ZSB0byBzdXBwb3J0IEZPUkVJR04gSU5ERVggdG8gcmVwcmVzZW50IHBvc3NpYmxlIHNl dHMgb2Ygc29ydAorCSAqIGtleXMgYW5kL29yIGZpbHRlcmluZy4KKwkgKi8KK30KKworLyoK KyAqIHBnc3FsR2V0Rm9yZWlnblBsYW4KKyAqCQlDcmVhdGUgRm9yZWlnblNjYW4gcGxhbiBu b2RlIHdoaWNoIGltcGxlbWVudHMgc2VsZWN0ZWQgYmVzdCBwYXRoCisgKi8KK3N0YXRpYyBG b3JlaWduU2NhbiAqCitwZ3NxbEdldEZvcmVpZ25QbGFuKFBsYW5uZXJJbmZvICpyb290LAor CQkJCQlSZWxPcHRJbmZvICpiYXNlcmVsLAorCQkJCQlPaWQgZm9yZWlnbnRhYmxlaWQsCisJ CQkJCUZvcmVpZ25QYXRoICpiZXN0X3BhdGgsCisJCQkJCUxpc3QgKnRsaXN0LAorCQkJCQlM aXN0ICpzY2FuX2NsYXVzZXMpCit7CisJUGdzcWxGZHdQbGFuU3RhdGUgKmZwc3RhdGUgPSAo UGdzcWxGZHdQbGFuU3RhdGUgKikgYmFzZXJlbC0+ZmR3X3ByaXZhdGU7CisJSW5kZXgJCQlz Y2FuX3JlbGlkID0gYmFzZXJlbC0+cmVsaWQ7CisJTGlzdAkJICAgKmZkd19wcml2YXRlID0g TklMOworCUxpc3QJCSAgICpmZHdfZXhwcnMgPSBOSUw7CisJTGlzdAkJICAgKmxvY2FsX2V4 cHJzID0gTklMOworCUxpc3RDZWxsCSAgICpsYzsKKworCS8qCisJICogV2UgbmVlZCBsaXN0 cyBvZiBFeHByIG90aGVyIHRoYW4gdGhlIGxpc3RzIG9mIFJlc3RyaWN0SW5mby4gIE5vdyB3 ZSBjYW4KKwkgKiBtZXJnZSByZW1vdGVfY29uZHMgYW5kIHBhcmFtX2NvbmRzIGludG8gZmR3 X2V4cHJzLCBiZWNhdXNlIHRoZXkgYXJlCisJICogZXZhbHVhdGVkIG9uIHJlbW90ZSBzaWRl IGZvciBhY3R1YWwgcmVtb3RlIHF1ZXJ5LgorCSAqLworCWZvcmVhY2gobGMsIGZwc3RhdGUt PnJlbW90ZV9jb25kcykKKwkJZmR3X2V4cHJzID0gbGFwcGVuZChmZHdfZXhwcnMsICgoUmVz dHJpY3RJbmZvICopIGxmaXJzdChsYykpLT5jbGF1c2UpOworCWZvcmVhY2gobGMsIGZwc3Rh dGUtPnBhcmFtX2NvbmRzKQorCQlmZHdfZXhwcnMgPSBsYXBwZW5kKGZkd19leHBycywgKChS ZXN0cmljdEluZm8gKikgbGZpcnN0KGxjKSktPmNsYXVzZSk7CisJZm9yZWFjaChsYywgZnBz dGF0ZS0+bG9jYWxfY29uZHMpCisJCWxvY2FsX2V4cHJzID0gbGFwcGVuZChsb2NhbF9leHBy cywKKwkJCQkJCQkgICgoUmVzdHJpY3RJbmZvICopIGxmaXJzdChsYykpLT5jbGF1c2UpOwor CisJLyoKKwkgKiBNYWtlIGEgbGlzdCBjb250YWlucyBTRUxFQ1Qgc3RhdGVtZW50IHRvIGl0 IHRvIGV4ZWN1dG9yIHdpdGggcGxhbiBub2RlCisJICogZm9yIGxhdGVyIHVzZS4KKwkgKi8K KwlmZHdfcHJpdmF0ZSA9IGxhcHBlbmQoZmR3X3ByaXZhdGUsIG1ha2VTdHJpbmcoZnBzdGF0 ZS0+c3FsLmRhdGEpKTsKKworCS8qCisJICogQ3JlYXRlIHRoZSBGb3JlaWduU2NhbiBub2Rl IGZyb20gdGFyZ2V0IGxpc3QsIGxvY2FsIGZpbHRlcmluZworCSAqIGV4cHJlc3Npb25zLCBy ZW1vdGUgZmlsdGVyaW5nIGV4cHJlc3Npb25zLCBhbmQgRkRXIHByaXZhdGUgaW5mb3JtYXRp b24uCisJICoKKwkgKiBXZSByZW1vdmUgZXhwcmVzc2lvbnMgd2hpY2ggYXJlIGV2YWx1YXRl ZCBvbiByZW1vdGUgc2lkZSBmcm9tIHF1YWwgb2YKKwkgKiB0aGUgc2NhbiBub2RlIHRvIGF2 b2lkIHJlZHVuZGFudCBmaWx0ZXJpbmcuICBTdWNoIGZpbHRlciByZWR1Y3Rpb24KKwkgKiBj YW4gYmUgZG9uZSBvbmx5IGhlcmUsIGRvbmUgYWZ0ZXIgY2hvb3NpbmcgYmVzdCBwYXRoLCBi ZWNhdXNlCisJICogYmFzZXJlc3RyaWN0aW5mbyBpbiBSZWxPcHRJbmZvIGlzIHNoYXJlZCBi eSBhbGwgcG9zc2libGUgcGF0aHMgdW50aWwKKwkgKiBiZXN0IHBhdGggaXMgY2hvc2VuLgor CSAqLworCXJldHVybiBtYWtlX2ZvcmVpZ25zY2FuKHRsaXN0LAorCQkJCQkJCWxvY2FsX2V4 cHJzLAorCQkJCQkJCXNjYW5fcmVsaWQsCisJCQkJCQkJZmR3X2V4cHJzLAorCQkJCQkJCWZk d19wcml2YXRlKTsKK30KKworLyoKKyAqIHBnc3FsRXhwbGFpbkZvcmVpZ25TY2FuCisgKgkJ UHJvZHVjZSBleHRyYSBvdXRwdXQgZm9yIEVYUExBSU4KKyAqLworc3RhdGljIHZvaWQKK3Bn c3FsRXhwbGFpbkZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsIEV4cGxhaW5T dGF0ZSAqZXMpCit7CisJTGlzdAkgICAqZmR3X3ByaXZhdGU7CisJY2hhcgkgICAqc3FsOwor CisJZmR3X3ByaXZhdGUgPSAoKEZvcmVpZ25TY2FuICopIG5vZGUtPnNzLnBzLnBsYW4pLT5m ZHdfcHJpdmF0ZTsKKwlzcWwgPSBzdHJWYWwobGlzdF9udGgoZmR3X3ByaXZhdGUsIEZkd1By aXZhdGVTZWxlY3RTcWwpKTsKKwlFeHBsYWluUHJvcGVydHlUZXh0KCJSZW1vdGUgU1FMIiwg c3FsLCBlcyk7Cit9CisKKy8qCisgKiBwZ3NxbEJlZ2luRm9yZWlnblNjYW4KKyAqCQlJbml0 aWF0ZSBhY2Nlc3MgdG8gYSBmb3JlaWduIFBvc3RncmVTUUwgdGFibGUuCisgKi8KK3N0YXRp YyB2b2lkCitwZ3NxbEJlZ2luRm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSwg aW50IGVmbGFncykKK3sKKwlQZ3NxbEZkd0V4ZWN1dGlvblN0YXRlICpmZXN0YXRlOworCVBH Y29ubgkJICAgKmNvbm47CisJT2lkCQkJCXJlbGlkOworCUZvcmVpZ25UYWJsZSAgICp0YWJs ZTsKKwlGb3JlaWduU2VydmVyICAqc2VydmVyOworCVVzZXJNYXBwaW5nCSAgICp1c2VyOwor CVR1cGxlVGFibGVTbG90ICpzbG90ID0gbm9kZS0+c3Muc3NfU2NhblR1cGxlU2xvdDsKKwor CS8qCisJICogRG8gbm90aGluZyBpbiBFWFBMQUlOIChubyBBTkFMWVpFKSBjYXNlLiAgbm9k ZS0+ZmR3X3N0YXRlIHN0YXlzIE5VTEwuCisJICovCisJaWYgKGVmbGFncyAmIEVYRUNfRkxB R19FWFBMQUlOX09OTFkpCisJCXJldHVybjsKKworCS8qCisJICogU2F2ZSBzdGF0ZSBpbiBu b2RlLT5mZHdfc3RhdGUuCisJICovCisJZmVzdGF0ZSA9IChQZ3NxbEZkd0V4ZWN1dGlvblN0 YXRlICopIHBhbGxvYyhzaXplb2YoUGdzcWxGZHdFeGVjdXRpb25TdGF0ZSkpOworCWZlc3Rh dGUtPmZkd19wcml2YXRlID0gKChGb3JlaWduU2NhbiAqKSBub2RlLT5zcy5wcy5wbGFuKS0+ ZmR3X3ByaXZhdGU7CisKKwkvKgorCSAqIENyZWF0ZSBjb250ZXh0cyBmb3IgcGVyLXNjYW4g dHVwbGVzdG9yZSB1bmRlciBwZXItcXVlcnkgY29udGV4dC4KKwkgKi8KKwlmZXN0YXRlLT5z Y2FuX2N4dCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShub2RlLT5zcy5wcy5zdGF0ZS0+ZXNf cXVlcnlfY3h0LAorCQkJCQkJCQkJCQkgICJwZ3NxbF9mZHcgcGVyLXNjYW4gZGF0YSIsCisJ CQkJCQkJCQkJCSAgQUxMT0NTRVRfREVGQVVMVF9NSU5TSVpFLAorCQkJCQkJCQkJCQkgIEFM TE9DU0VUX0RFRkFVTFRfSU5JVFNJWkUsCisJCQkJCQkJCQkJCSAgQUxMT0NTRVRfREVGQVVM VF9NQVhTSVpFKTsKKwlmZXN0YXRlLT50ZW1wX2N4dCA9IEFsbG9jU2V0Q29udGV4dENyZWF0 ZShub2RlLT5zcy5wcy5zdGF0ZS0+ZXNfcXVlcnlfY3h0LAorCQkJCQkJCQkJCQkgICJwZ3Nx bF9mZHcgdGVtcG9yYXJ5IGRhdGEiLAorCQkJCQkJCQkJCQkgIEFMTE9DU0VUX0RFRkFVTFRf TUlOU0laRSwKKwkJCQkJCQkJCQkJICBBTExPQ1NFVF9ERUZBVUxUX0lOSVRTSVpFLAorCQkJ CQkJCQkJCQkgIEFMTE9DU0VUX0RFRkFVTFRfTUFYU0laRSk7CisKKwkvKgorCSAqIEdldCBj b25uZWN0aW9uIHRvIHRoZSBmb3JlaWduIHNlcnZlci4gIENvbm5lY3Rpb24gbWFuYWdlciB3 b3VsZAorCSAqIGVzdGFibGlzaCBuZXcgY29ubmVjdGlvbiBpZiBuZWNlc3NhcnkuCisJICov CisJcmVsaWQgPSBSZWxhdGlvbkdldFJlbGlkKG5vZGUtPnNzLnNzX2N1cnJlbnRSZWxhdGlv bik7CisJdGFibGUgPSBHZXRGb3JlaWduVGFibGUocmVsaWQpOworCXNlcnZlciA9IEdldEZv cmVpZ25TZXJ2ZXIodGFibGUtPnNlcnZlcmlkKTsKKwl1c2VyID0gR2V0VXNlck1hcHBpbmco R2V0T3V0ZXJVc2VySWQoKSwgc2VydmVyLT5zZXJ2ZXJpZCk7CisJY29ubiA9IEdldENvbm5l Y3Rpb24oc2VydmVyLCB1c2VyLCB0cnVlKTsKKwlmZXN0YXRlLT5jb25uID0gY29ubjsKKwor CS8qIFJlc3VsdCB3aWxsIGJlIGZpbGxlZCBpbiBmaXJzdCBJdGVyYXRlIGNhbGwuICovCisJ ZmVzdGF0ZS0+dHVwbGVzID0gTlVMTDsKKworCS8qIEFsbG9jYXRlIGJ1ZmZlcnMgZm9yIGNv bHVtbiB2YWx1ZXMuICovCisJeworCQlUdXBsZURlc2MJdHVwZGVzYyA9IHNsb3QtPnR0c190 dXBsZURlc2NyaXB0b3I7CisJCWZlc3RhdGUtPnZhbHVlcyA9IHBhbGxvYyhzaXplb2YoRGF0 dW0pICogdHVwZGVzYy0+bmF0dHMpOworCQlmZXN0YXRlLT5udWxscyA9IHBhbGxvYyhzaXpl b2YoYm9vbCkgKiB0dXBkZXNjLT5uYXR0cyk7CisJCWZlc3RhdGUtPmF0dGlubWV0YSA9IFR1 cGxlRGVzY0dldEF0dEluTWV0YWRhdGEodHVwZGVzYyk7CisJfQorCisJLyogQWxsb2NhdGUg YnVmZmVycyBmb3IgcXVlcnkgcGFyYW1ldGVycy4gKi8KKwl7CisJCVBhcmFtTGlzdEluZm8J cGFyYW1zID0gbm9kZS0+c3MucHMuc3RhdGUtPmVzX3BhcmFtX2xpc3RfaW5mbzsKKwkJaW50 CQkJCW51bVBhcmFtcyA9IHBhcmFtcyA/IHBhcmFtcy0+bnVtUGFyYW1zIDogMDsKKworCQlp ZiAobnVtUGFyYW1zID4gMCkKKwkJeworCQkJZmVzdGF0ZS0+cGFyYW1fdHlwZXMgPSBwYWxs b2MwKHNpemVvZihPaWQpICogbnVtUGFyYW1zKTsKKwkJCWZlc3RhdGUtPnBhcmFtX3ZhbHVl cyA9IHBhbGxvYzAoc2l6ZW9mKGNoYXIgKikgKiBudW1QYXJhbXMpOworCQl9CisJCWVsc2UK KwkJeworCQkJZmVzdGF0ZS0+cGFyYW1fdHlwZXMgPSBOVUxMOworCQkJZmVzdGF0ZS0+cGFy YW1fdmFsdWVzID0gTlVMTDsKKwkJfQorCX0KKworCS8qIFJlbWVtYmVyIHdoaWNoIGZvcmVp Z24gdGFibGUgd2UgYXJlIHNjYW5uaW5nLiAqLworCWZlc3RhdGUtPmVycnBvcy5yZWxpZCA9 IHJlbGlkOworCisJLyogU3RvcmUgRkRXLXNwZWNpZmljIHN0YXRlIGludG8gRm9yZWlnblNj YW5TdGF0ZSAqLworCW5vZGUtPmZkd19zdGF0ZSA9ICh2b2lkICopIGZlc3RhdGU7CisKKwly ZXR1cm47Cit9CisKKy8qCisgKiBwZ3NxbEl0ZXJhdGVGb3JlaWduU2NhbgorICoJCVJldHJp ZXZlIG5leHQgcm93IGZyb20gdGhlIHJlc3VsdCBzZXQsIG9yIGNsZWFyIHR1cGxlIHNsb3Qg dG8gaW5kaWNhdGUKKyAqCQlFT0YuCisgKgorICoJCU5vdGUgdGhhdCB1c2luZyBwZXItcXVl cnkgY29udGV4dCB3aGVuIHJldHJpZXZpbmcgdHVwbGVzIGZyb20KKyAqCQl0dXBsZXN0b3Jl IHRvIGVuc3VyZSB0aGF0IHJldHVybmVkIHR1cGxlcyBjYW4gc3Vydml2ZSB1bnRpbCBuZXh0 CisgKgkJaXRlcmF0aW9uIGJlY2F1c2UgdGhlIHR1cGxlIGlzIHJlbGVhc2VkIGltcGxpY2l0 bHkgdmlhIEV4ZWNDbGVhclR1cGxlLgorICoJCVJldHJpZXZpbmcgYSB0dXBsZSBmcm9tIHR1 cGxlc3RvcmUgaW4gQ3VycmVudE1lbW9yeUNvbnRleHQgKGl0J3MgYQorICoJCXBlci10dXBs ZSBjb250ZXh0KSwgRXhlY0NsZWFyVHVwbGUgd2lsbCBmcmVlIGRhbmdsaW5nIHBvaW50ZXIu CisgKi8KK3N0YXRpYyBUdXBsZVRhYmxlU2xvdCAqCitwZ3NxbEl0ZXJhdGVGb3JlaWduU2Nh bihGb3JlaWduU2NhblN0YXRlICpub2RlKQoreworCVBnc3FsRmR3RXhlY3V0aW9uU3RhdGUg KmZlc3RhdGU7CisJVHVwbGVUYWJsZVNsb3QgKnNsb3QgPSBub2RlLT5zcy5zc19TY2FuVHVw bGVTbG90OworCU1lbW9yeUNvbnRleHQJb2xkY29udGV4dCA9IEN1cnJlbnRNZW1vcnlDb250 ZXh0OworCisJZmVzdGF0ZSA9IChQZ3NxbEZkd0V4ZWN1dGlvblN0YXRlICopIG5vZGUtPmZk d19zdGF0ZTsKKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCBhZnRlciBC ZWdpbiBvciBSZVNjYW4sIHdlIG5lZWQgdG8gZXhlY3V0ZQorCSAqIHJlbW90ZSBxdWVyeSBh bmQgZ2V0IHJlc3VsdCBzZXQuCisJICovCisJaWYgKGZlc3RhdGUtPnR1cGxlcyA9PSBOVUxM KQorCQlleGVjdXRlX3F1ZXJ5KG5vZGUpOworCisJLyoKKwkgKiBJZiB0dXBsZXMgYXJlIHN0 aWxsIGxlZnQgaW4gdHVwbGVzdG9yZSwganVzdCByZXR1cm4gbmV4dCB0dXBsZSBmcm9tIGl0 LgorCSAqCisJICogSXQgaXMgbmVjZXNzYXJ5IHRvIHN3aXRjaCB0byBwZXItc2NhbiBjb250 ZXh0IHRvIG1ha2UgcmV0dXJuZWQgdHVwbGUKKwkgKiB2YWxpZCB1bnRpbCBuZXh0IEl0ZXJh dGVGb3JlaWduU2NhbiBjYWxsLCBiZWNhdXNlIGl0IHdpbGwgYmUgcmVsZWFzZWQKKwkgKiB3 aXRoIEV4ZWNDbGVhclR1cGxlIHRoZW4uICBPdGhlcndpc2UsIHBpY2tlZCB0dXBsZSBpcyBh bGxvY2F0ZWQgaW4KKwkgKiBwZXItdHVwbGUgY29udGV4dCwgYW5kIGRvdWJsZS1mcmVlIG9m IHRoYXQgdHVwbGUgbWlnaHQgaGFwcGVuLgorCSAqIAorCSAqIElmIHdlIGRvbid0IGhhdmUg YW55IHJlc3VsdCBpbiB0dXBsZXN0b3JlLCBjbGVhciByZXN1bHQgc2xvdCB0byB0ZWxsCisJ ICogZXhlY3V0b3IgdGhhdCB0aGlzIHNjYW4gaXMgb3Zlci4KKwkgKi8KKwlNZW1vcnlDb250 ZXh0U3dpdGNoVG8oZmVzdGF0ZS0+c2Nhbl9jeHQpOworCXR1cGxlc3RvcmVfZ2V0dHVwbGVz bG90KGZlc3RhdGUtPnR1cGxlcywgdHJ1ZSwgZmFsc2UsIHNsb3QpOworCU1lbW9yeUNvbnRl eHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKKworCXJldHVybiBzbG90OworfQorCisvKgorICog cGdzcWxSZVNjYW5Gb3JlaWduU2NhbgorICogICAtIFJlc3RhcnQgdGhpcyBzY2FuIGJ5IGNs ZWFyaW5nIG9sZCByZXN1bHRzIGFuZCBzZXQgcmUtZXhlY3V0ZSBmbGFnLgorICovCitzdGF0 aWMgdm9pZAorcGdzcWxSZVNjYW5Gb3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpub2Rl KQoreworCVBnc3FsRmR3RXhlY3V0aW9uU3RhdGUgKmZlc3RhdGU7CisKKwlmZXN0YXRlID0g KFBnc3FsRmR3RXhlY3V0aW9uU3RhdGUgKikgbm9kZS0+ZmR3X3N0YXRlOworCisJLyogSWYg d2UgaGF2ZW4ndCBoYXZlIHZhbGlkIHJlc3VsdCB5ZXQsIG5vdGhpbmcgdG8gZG8uICovCisJ aWYgKGZlc3RhdGUtPnR1cGxlcyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE9u bHkgcmV3aW5kIHRoZSBjdXJyZW50IHJlc3VsdCBzZXQgaXMgZW5vdWdoLgorCSAqLworCXR1 cGxlc3RvcmVfcmVzY2FuKGZlc3RhdGUtPnR1cGxlcyk7Cit9CisKKy8qCisgKiBwZ3NxbEVu ZEZvcmVpZ25TY2FuCisgKgkJRmluaXNoIHNjYW5uaW5nIGZvcmVpZ24gdGFibGUgYW5kIGRp c3Bvc2Ugb2JqZWN0cyB1c2VkIGZvciB0aGlzIHNjYW4KKyAqLworc3RhdGljIHZvaWQKK3Bn c3FsRW5kRm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSkKK3sKKwlQZ3NxbEZk d0V4ZWN1dGlvblN0YXRlICpmZXN0YXRlOworCisJZmVzdGF0ZSA9IChQZ3NxbEZkd0V4ZWN1 dGlvblN0YXRlICopIG5vZGUtPmZkd19zdGF0ZTsKKworCS8qIGlmIGZlc3RhdGUgaXMgTlVM TCwgd2UgYXJlIGluIEVYUExBSU47IG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoZmVzdGF0ZSA9 PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRoZSBjb25uZWN0aW9uIHdoaWNoIHdh cyB1c2VkIGZvciB0aGlzIHNjYW4gc2hvdWxkIGJlIHZhbGlkIHVudGlsIHRoZQorCSAqIGVu ZCBvZiB0aGUgc2NhbiB0byBtYWtlIHRoZSBsaWZlc3BhbiBvZiByZW1vdGUgdHJhbnNhY3Rp b24gc2FtZSBhcyB0aGUKKwkgKiBsb2NhbCBxdWVyeS4KKwkgKi8KKwlSZWxlYXNlQ29ubmVj dGlvbihmZXN0YXRlLT5jb25uKTsKKwlmZXN0YXRlLT5jb25uID0gTlVMTDsKKworCS8qIERp c2NhcmQgZmV0Y2ggcmVzdWx0cyAqLworCWlmIChmZXN0YXRlLT50dXBsZXMgIT0gTlVMTCkK Kwl7CisJCXR1cGxlc3RvcmVfZW5kKGZlc3RhdGUtPnR1cGxlcyk7CisJCWZlc3RhdGUtPnR1 cGxlcyA9IE5VTEw7CisJfQorCisJLyogTWVtb3J5Q29udGV4dCB3aWxsIGJlIGRlbGV0ZWQg YXV0b21hdGljYWxseS4gKi8KK30KKworLyoKKyAqIEVzdGltYXRlIGNvc3RzIG9mIGV4ZWN1 dGluZyBnaXZlbiBTUUwgc3RhdGVtZW50LgorICovCitzdGF0aWMgdm9pZAorZ2V0X3JlbW90 ZV9lc3RpbWF0ZShjb25zdCBjaGFyICpzcWwsIFBHY29ubiAqY29ubiwKKwkJCQkJZG91Ymxl ICpyb3dzLCBpbnQgKndpZHRoLAorCQkJCQlDb3N0ICpzdGFydHVwX2Nvc3QsIENvc3QgKnRv dGFsX2Nvc3QpCit7CisJUEdyZXN1bHQJICAgKnJlcyA9IE5VTEw7CisJU3RyaW5nSW5mb0Rh dGEgIGJ1ZjsKKwljaGFyCQkgICAqcGxhbjsKKwljaGFyCQkgICAqcDsKKwlpbnQJCQkJbjsK KworCS8qCisJICogQ29uc3RydWN0IEVYUExBSU4gc3RhdGVtZW50IHdpdGggZ2l2ZW4gU1FM IHN0YXRlbWVudC4KKwkgKi8KKwlpbml0U3RyaW5nSW5mbygmYnVmKTsKKwlhcHBlbmRTdHJp bmdJbmZvKCZidWYsICJFWFBMQUlOICVzIiwgc3FsKTsKKworCS8qIFBHcmVzdWx0IG11c3Qg YmUgcmVsZWFzZWQgYmVmb3JlIGxlYXZpbmcgdGhpcyBmdW5jdGlvbi4gKi8KKwlQR19UUlko KTsKKwl7CisJCXJlcyA9IFBRZXhlYyhjb25uLCBidWYuZGF0YSk7CisJCWlmIChQUXJlc3Vs dFN0YXR1cyhyZXMpICE9IFBHUkVTX1RVUExFU19PSyB8fCBQUW50dXBsZXMocmVzKSA9PSAw KQorCQl7CisJCQljaGFyICptc2c7CisKKwkJCW1zZyA9IHBzdHJkdXAoUFFlcnJvck1lc3Nh Z2UoY29ubikpOworCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycm1zZygiY291bGQgbm90 IGV4ZWN1dGUgRVhQTEFJTiBmb3IgY29zdCBlc3RpbWF0aW9uIiksCisJCQkJCSBlcnJkZXRh aWwoIiVzIiwgbXNnKSwKKwkJCQkJIGVycmhpbnQoIiVzIiwgc3FsKSkpOworCQl9CisKKwkJ LyoKKwkJICogRmluZCBlc3RpbWF0aW9uIHBvcnRpb24gZnJvbSB0b3AgcGxhbiBub2RlLiBI ZXJlIHdlIHNlYXJjaCBvcGVuaW5nCisJCSAqIHBhcmVudGhlc2VzIGZyb20gdGhlIGVuZCBv ZiB0aGUgbGluZSB0byBhdm9pZCBmaW5kaW5nIHVuZXhwZWN0ZWQKKwkJICogcGFyZW50aGVz ZXMuCisJCSAqLworCQlwbGFuID0gUFFnZXR2YWx1ZShyZXMsIDAsIDApOworCQlwID0gc3Ry cmNocihwbGFuLCAnKCcpOworCQlpZiAocCA9PSBOVUxMKQorCQkJZWxvZyhFUlJPUiwgIndy b25nIEVYUExBSU4gb3V0cHV0OiAlcyIsIHBsYW4pOworCQluID0gc3NjYW5mKHAsCisJCQkJ ICAgIihjb3N0PSVsZi4uJWxmIHJvd3M9JWxmIHdpZHRoPSVkKSIsCisJCQkJICAgc3RhcnR1 cF9jb3N0LCB0b3RhbF9jb3N0LCByb3dzLCB3aWR0aCk7CisJCWlmIChuICE9IDQpCisJCQll bG9nKEVSUk9SLCAiY291bGQgbm90IGdldCBlc3RpbWF0aW9uIGZyb20gRVhQTEFJTiBvdXRw dXQiKTsKKworCQlQUWNsZWFyKHJlcyk7CisJCXJlcyA9IE5VTEw7CisJfQorCVBHX0NBVENI KCk7CisJeworCQlQUWNsZWFyKHJlcyk7CisJCVBHX1JFX1RIUk9XKCk7CisJfQorCVBHX0VO RF9UUlkoKTsKK30KKworLyoKKyAqIEFkanVzdCBjb3N0cyBlc3RpbWF0ZWQgb24gcmVtb3Rl IGVuZCB3aXRoIHNvbWUgb3ZlcmhlYWRzIHN1Y2ggYXMgY29ubmVjdGlvbgorICogYW5kIGRh dGEgdHJhbnNmZXIuCisgKi8KK3N0YXRpYyB2b2lkCithZGp1c3RfY29zdHMoZG91YmxlIHJv d3MsIGludCB3aWR0aCwgQ29zdCAqc3RhcnR1cF9jb3N0LCBDb3N0ICp0b3RhbF9jb3N0KQor eworCS8qCisJICogVE9ETyBTZWxlY3Rpdml0eSBvZiBxdWFscyB3aGljaCBhcmUgTk9UIHB1 c2hlZCBkb3duIHNob3VsZCBiZSBhbHNvCisJICogY29uc2lkZXJlZC4KKwkgKi8KKworCS8q IGFkZCBjb3N0IHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLiAqLworCSpzdGFydHVwX2Nvc3Qg Kz0gQ09OTkVDVElPTl9DT1NUUzsKKwkqdG90YWxfY29zdCArPSBDT05ORUNUSU9OX0NPU1RT OworCisJLyogYWRkIGNvc3QgdG8gdHJhbnNmZXIgcmVzdWx0LiAqLworCSp0b3RhbF9jb3N0 ICs9IFRSQU5TRkVSX0NPU1RTX1BFUl9CWVRFICogd2lkdGggKiByb3dzOworCSp0b3RhbF9j b3N0ICs9IGNwdV90dXBsZV9jb3N0ICogcm93czsKK30KKworLyoKKyAqIEV4ZWN1dGUgcmVt b3RlIHF1ZXJ5IHdpdGggY3VycmVudCBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdm9pZAor ZXhlY3V0ZV9xdWVyeShGb3JlaWduU2NhblN0YXRlICpub2RlKQoreworCVBnc3FsRmR3RXhl Y3V0aW9uU3RhdGUgKmZlc3RhdGU7CisJUGFyYW1MaXN0SW5mbwlwYXJhbXMgPSBub2RlLT5z cy5wcy5zdGF0ZS0+ZXNfcGFyYW1fbGlzdF9pbmZvOworCWludAkJCQludW1QYXJhbXMgPSBw YXJhbXMgPyBwYXJhbXMtPm51bVBhcmFtcyA6IDA7CisJT2lkCQkJICAgKnR5cGVzID0gTlVM TDsKKwljb25zdCBjaGFyCSAgKip2YWx1ZXMgPSBOVUxMOworCWNoYXIJCSAgICpzcWw7CisJ UEdjb25uCQkgICAqY29ubjsKKwlQR3Jlc3VsdAkgICAqcmVzID0gTlVMTDsKKworCWZlc3Rh dGUgPSAoUGdzcWxGZHdFeGVjdXRpb25TdGF0ZSAqKSBub2RlLT5mZHdfc3RhdGU7CisJdHlw ZXMgPSBmZXN0YXRlLT5wYXJhbV90eXBlczsKKwl2YWx1ZXMgPSBmZXN0YXRlLT5wYXJhbV92 YWx1ZXM7CisKKwkvKgorCSAqIENvbnN0cnVjdCBwYXJhbWV0ZXIgYXJyYXkgaW4gdGV4dCBm b3JtYXQuICBXZSBkb24ndCByZWxlYXNlIG1lbW9yeSBmb3IKKwkgKiB0aGUgYXJyYXlzIGV4 cGxpY2l0bHksIGJlY2F1c2UgdGhlIG1lbW9yeSB1c2FnZSB3b3VsZCBub3QgYmUgdmVyeSBs YXJnZSwKKwkgKiBhbmQgYW55d2F5IHRoZXkgd2lsbCBiZSByZWxlYXNlZCBpbiBjb250ZXh0 IGNsZWFudXAuCisJICovCisJaWYgKG51bVBhcmFtcyA+IDApCisJeworCQlpbnQgaTsKKwor CQlmb3IgKGkgPSAwOyBpIDwgbnVtUGFyYW1zOyBpKyspCisJCXsKKwkJCXR5cGVzW2ldID0g cGFyYW1zLT5wYXJhbXNbaV0ucHR5cGU7CisJCQlpZiAocGFyYW1zLT5wYXJhbXNbaV0uaXNu dWxsKQorCQkJCXZhbHVlc1tpXSA9IE5VTEw7CisJCQllbHNlCisJCQl7CisJCQkJT2lkCQkJ b3V0X2Z1bmNfb2lkOwkKKwkJCQlib29sCQlpc3ZhcmxlbmE7CisJCQkJRm1nckluZm8JZnVu YzsKKworCQkJCWdldFR5cGVPdXRwdXRJbmZvKHR5cGVzW2ldLCAmb3V0X2Z1bmNfb2lkLCAm aXN2YXJsZW5hKTsKKwkJCQlmbWdyX2luZm8ob3V0X2Z1bmNfb2lkLCAmZnVuYyk7CisJCQkJ dmFsdWVzW2ldID0gT3V0cHV0RnVuY3Rpb25DYWxsKCZmdW5jLCBwYXJhbXMtPnBhcmFtc1tp XS52YWx1ZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBQR3Jlc3VsdCBtdXN0IGJlIHJlbGVh c2VkIGJlZm9yZSBsZWF2aW5nIHRoaXMgZnVuY3Rpb24uICovCisJUEdfVFJZKCk7CisJewor CQkvKgorCQkgKiBFeGVjdXRlIHJlbW90ZSBxdWVyeSB3aXRoIHBhcmFtZXRlcnMsIGFuZCBy ZXRyaWV2ZSByZXN1bHRzIHdpdGgKKwkJICogY3VzdG9tIHJvdyBwcm9jZXNzb3Igd2hpY2gg c3RvcmVzIHJlc3VsdHMgaW4gdHVwbGVzdG9yZS4KKwkJICoKKwkJICogV2UgdW5pbnN0YWxs IHRoZSBjdXN0b20gcm93IHByb2Nlc3NvciByaWdodCBhZnRlciBwcm9jZXNzaW5nIGFsbAor CQkgKiByZXN1bHRzLgorCQkgKi8KKwkJY29ubiA9IGZlc3RhdGUtPmNvbm47CisJCXNxbCA9 IHN0clZhbChsaXN0X250aChmZXN0YXRlLT5mZHdfcHJpdmF0ZSwgRmR3UHJpdmF0ZVNlbGVj dFNxbCkpOworCQlQUXNldFJvd1Byb2Nlc3Nvcihjb25uLCBxdWVyeV9yb3dfcHJvY2Vzc29y LCBub2RlKTsKKwkJcmVzID0gUFFleGVjUGFyYW1zKGNvbm4sIHNxbCwgbnVtUGFyYW1zLCB0 eXBlcywgdmFsdWVzLCBOVUxMLCBOVUxMLCAwKTsKKwkJUFFzZXRSb3dQcm9jZXNzb3IoY29u biwgTlVMTCwgTlVMTCk7CisKKwkJLyoKKwkJICogV2UgY2FuJ3Qga25vdyB3aGV0aGVyIHRo ZSBzY2FuIGlzIG92ZXIgb3Igbm90IGluIGN1c3RvbSByb3cKKwkJICogcHJvY2Vzc29yLCBz byBtYXJrIHRoYXQgdGhlIHJlc3VsdCBpcyB2YWxpZCBoZXJlLgorCQkgKi8KKwkJdHVwbGVz dG9yZV9kb25lc3RvcmluZyhmZXN0YXRlLT50dXBsZXMpOworCisJCS8qCisJCSAqIElmIHRo ZSBxdWVyeSBoYXMgZmFpbGVkLCByZXBvcnRpbmcgZGV0YWlscyBpcyBlbm91Z2ggaGVyZS4K KwkJICogQ29ubmVjdGlvbihzKSB3aGljaCBhcmUgdXNlZCBieSB0aGlzIHF1ZXJ5IChhdCBs ZWFzdCB1c2VkIGJ5CisJCSAqIHBnc3FsX2Zkdykgd2lsbCBiZSBjbGVhbmVkIHVwIGJ5IHRo ZSBmb3JlaWduIGNvbm5lY3Rpb24gbWFuYWdlci4KKwkJICovCisJCWlmIChQUXJlc3VsdFN0 YXR1cyhyZXMpICE9IFBHUkVTX1RVUExFU19PSykKKwkJeworCQkJZXJlcG9ydChFUlJPUiwK KwkJCQkJKGVycm1zZygiY291bGQgbm90IGV4ZWN1dGUgcmVtb3RlIHF1ZXJ5IiksCisJCQkJ CSBlcnJkZXRhaWwoIiVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpLAorCQkJCQkgZXJyaGlu dCgiJXMiLCBzcWwpKSk7CisJCX0KKworCQkvKiBEaXNjYXJkIHJlc3VsdCBvZiBTRUxFQ1Qg c3RhdGVtZW50LiAqLworCQlQUWNsZWFyKHJlcyk7CisJCXJlcyA9IE5VTEw7CisJfQorCVBH X0NBVENIKCk7CisJeworCQlQUWNsZWFyKHJlcyk7CisJCVBHX1JFX1RIUk9XKCk7CisJfQor CVBHX0VORF9UUlkoKTsKK30KKworLyoKKyAqIENyZWF0ZSB0dXBsZXMgZnJvbSBQR3Jlc3Vs dCBhbmQgc3RvcmUgdGhlbSBpbnRvIHR1cGxlc3RvcmUuCisgKgorICogQ2FsbGVyIG11c3Qg dXNlIFBHX1RSWSBibG9jayB0byBjYXRjaCBleGNlcHRpb24gYW5kIHJlbGVhc2UgUEdyZXN1 bHQKKyAqIHN1cmVseS4KKyAqLworc3RhdGljIGludAorcXVlcnlfcm93X3Byb2Nlc3NvcihQ R3Jlc3VsdCAqcmVzLAorCQkJCQljb25zdCBQR2RhdGFWYWx1ZSAqY29sdW1ucywKKwkJCQkJ Y29uc3QgY2hhciAqKmVycm1zZ3AsCisJCQkJCXZvaWQgKnBhcmFtKQoreworCUZvcmVpZ25T Y2FuU3RhdGUgICAqbm9kZSA9IChGb3JlaWduU2NhblN0YXRlICopIHBhcmFtOworCWludAkJ CW5maWVsZHMgPSBQUW5maWVsZHMocmVzKTsKKwlpbnQJCQlpOworCWludAkJCWo7CisJaW50 CQkJYXR0bnVtOwkJLyogbnVtYmVyIG9mIG5vbi1kcm9wcGVkIGNvbHVtbnMgKi8KKwlUdXBs ZVRhYmxlU2xvdCAqc2xvdCA9IG5vZGUtPnNzLnNzX1NjYW5UdXBsZVNsb3Q7CisJVHVwbGVE ZXNjCXR1cGRlc2MgPSBzbG90LT50dHNfdHVwbGVEZXNjcmlwdG9yOworCUZvcm1fcGdfYXR0 cmlidXRlICAqYXR0cnMgPSB0dXBkZXNjLT5hdHRyczsKKwlQZ3NxbEZkd0V4ZWN1dGlvblN0 YXRlICpmZXN0YXRlID0gKFBnc3FsRmR3RXhlY3V0aW9uU3RhdGUgKikgbm9kZS0+ZmR3X3N0 YXRlOworCUF0dEluTWV0YWRhdGEgKmF0dGlubWV0YSA9IGZlc3RhdGUtPmF0dGlubWV0YTsK KwlIZWFwVHVwbGUJdHVwbGU7CisJRXJyb3JDb250ZXh0Q2FsbGJhY2sgZXJyY29udGV4dDsK KwlNZW1vcnlDb250ZXh0IG9sZGNvbnRleHQ7CisKKwlpZiAoY29sdW1ucyA9PSBOVUxMKQor CXsKKwkJLyogY291bnQgbm9uLWRyb3BwZWQgY29sdW1ucyAqLworCQlmb3IgKGF0dG51bSA9 IDAsIGkgPSAwOyBpIDwgdHVwZGVzYy0+bmF0dHM7IGkrKykKKwkJCWlmICghYXR0cnNbaV0t PmF0dGlzZHJvcHBlZCkKKwkJCQlhdHRudW0rKzsKKworCQkvKiBjaGVjayByZXN1bHQgYW5k IHR1cGxlIGRlc2NyaXB0b3IgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgY29sdW1ucyAqLwor CQlpZiAoYXR0bnVtID4gMCAmJiBhdHRudW0gIT0gbmZpZWxkcykKKwkJCWVyZXBvcnQoRVJS T1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfREFUQVRZUEVfTUlTTUFUQ0gpLAorCQkJCQkg ZXJybXNnKCJyZW1vdGUgcXVlcnkgcmVzdWx0IHJvd3R5cGUgZG9lcyBub3QgbWF0Y2ggIgor CQkJCQkJCSJ0aGUgc3BlY2lmaWVkIEZST00gY2xhdXNlIHJvd3R5cGUiKSwKKwkJCQkJIGVy cmRldGFpbCgiZXhwZWN0ZWQgJWQsIGFjdHVhbCAlZCIsIGF0dG51bSwgbmZpZWxkcykpKTsK KworCQkvKiBGaXJzdCwgZW5zdXJlIHRoYXQgdGhlIHR1cGxlc3RvcmUgaXMgZW1wdHkuICov CisJCWlmIChmZXN0YXRlLT50dXBsZXMgPT0gTlVMTCkKKwkJeworCisJCQkvKgorCQkJICog Q3JlYXRlIHR1cGxlc3RvcmUgdG8gc3RvcmUgcmVzdWx0IG9mIHRoZSBxdWVyeSBpbiBwZXIt cXVlcnkKKwkJCSAqIGNvbnRleHQuICBOb3RlIHRoYXQgd2UgdXNlIHRoaXMgbWVtb3J5IGNv bnRleHQgdG8gYXZvaWQgbWVtb3J5CisJCQkgKiBsZWFrIGluIGVycm9yIGNhc2VzLgorCQkJ ICovCisJCQlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKGZlc3RhdGUtPnNj YW5fY3h0KTsKKwkJCWZlc3RhdGUtPnR1cGxlcyA9IHR1cGxlc3RvcmVfYmVnaW5faGVhcChm YWxzZSwgZmFsc2UsIHdvcmtfbWVtKTsKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRj b250ZXh0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIENsZWFyIG9sZCByZXN1bHQganVz dCBpbiBjYXNlLiAqLworCQkJdHVwbGVzdG9yZV9jbGVhcihmZXN0YXRlLT50dXBsZXMpOwor CQl9CisKKwkJLyogSW5pdGlhbGl6ZSBjb2x1bW4gdmFsdWUgYnVmZmVyLiAqLworCQlmZXN0 YXRlLT5jb2xidWZsZW4gPSBJTklUSUFMX0NPTEJVRl9TSVpFOworCQlmZXN0YXRlLT5jb2xi dWYgPSBwYWxsb2MoZmVzdGF0ZS0+Y29sYnVmbGVuKTsKKworCQlyZXR1cm4gMTsKKwl9CisK KwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgYWxs IHJlc3VsdCByb3dzIGFyZSBwcm9jZXNzZWQsCisJICogc28gd2Ugc2hvdWxkIGFsbG93IGlu dGVycnVwdC4KKwkgKi8KKwlDSEVDS19GT1JfSU5URVJSVVBUUygpOworCisJLyoKKwkgKiBE byB0aGUgZm9sbG93aW5nIHdvcmsgaW4gYSB0ZW1wIGNvbnRleHQgdGhhdCB3ZSByZXNldCBh ZnRlciBlYWNoIHR1cGxlLgorCSAqIFRoaXMgY2xlYW5zIHVwIG5vdCBvbmx5IHRoZSBkYXRh IHdlIGhhdmUgZGlyZWN0IGFjY2VzcyB0bywgYnV0IGFueQorCSAqIGNydWZ0IHRoZSBJL08g ZnVuY3Rpb25zIG1pZ2h0IGxlYWsuCisJICovCisJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRl eHRTd2l0Y2hUbyhmZXN0YXRlLT50ZW1wX2N4dCk7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsg aSA8IHR1cGRlc2MtPm5hdHRzOyBpKyspCisJeworCQlpbnQJCWxlbiA9IGNvbHVtbnNbal0u bGVuOworCisJCS8qIHNraXAgZHJvcHBlZCBjb2x1bW5zLiAqLworCQlpZiAoYXR0cnNbaV0t PmF0dGlzZHJvcHBlZCkKKwkJeworCQkJZmVzdGF0ZS0+bnVsbHNbaV0gPSB0cnVlOworCQkJ Y29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBTZXQgTlVMTCBpbmRpY2F0b3IsIGFuZCBj b252ZXJ0IHRleHQgcmVwcmVzZW50YXRpb24gdG8gaW50ZXJuYWwKKwkJICogcmVwcmVzZW50 YXRpb24gaWYgYW55LgorCQkgKi8KKwkJaWYgKGxlbiA8IDApCisJCQlmZXN0YXRlLT5udWxs c1tpXSA9IHRydWU7CisJCWVsc2UKKwkJeworCQkJRGF0dW0JdmFsdWU7CisKKwkJCWZlc3Rh dGUtPm51bGxzW2ldID0gZmFsc2U7CisKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhmZXN0 YXRlLT5zY2FuX2N4dCk7CisJCQl3aGlsZSAoZmVzdGF0ZS0+Y29sYnVmbGVuIDwgbGVuICsg MSkKKwkJCXsKKwkJCQlmZXN0YXRlLT5jb2xidWZsZW4gKj0gMjsKKwkJCQlmZXN0YXRlLT5j b2xidWYgPSByZXBhbGxvYyhmZXN0YXRlLT5jb2xidWYsIGZlc3RhdGUtPmNvbGJ1Zmxlbik7 CisJCQl9CisJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8oZmVzdGF0ZS0+dGVtcF9jeHQpOwor CQkJbWVtY3B5KGZlc3RhdGUtPmNvbGJ1ZiwgY29sdW1uc1tqXS52YWx1ZSwgbGVuKTsKKwkJ CWZlc3RhdGUtPmNvbGJ1Zltjb2x1bW5zW2pdLmxlbl0gPSAnXDAnOworCisJCQkvKgorCQkJ ICogU2V0IHVwIGFuZCBpbnN0YWxsIGNhbGxiYWNrIHRvIHJlcG9ydCB3aGVyZSBjb252ZXJz aW9uIGVycm9yCisJCQkgKiBvY2N1cnMuCisJCQkgKi8KKwkJCWZlc3RhdGUtPmVycnBvcy5j dXJfYXR0bm8gPSBpICsgMTsKKwkJCWVycmNvbnRleHQuY2FsbGJhY2sgPSBwZ3NxbF9mZHdf ZXJyb3JfY2FsbGJhY2s7CisJCQllcnJjb250ZXh0LmFyZyA9ICh2b2lkICopICZmZXN0YXRl LT5lcnJwb3M7CisJCQllcnJjb250ZXh0LnByZXZpb3VzID0gZXJyb3JfY29udGV4dF9zdGFj azsKKwkJCWVycm9yX2NvbnRleHRfc3RhY2sgPSAmZXJyY29udGV4dDsKKworCQkJdmFsdWUg PSBJbnB1dEZ1bmN0aW9uQ2FsbCgmYXR0aW5tZXRhLT5hdHRpbmZ1bmNzW2ldLAorCQkJCQkJ CQkJICBmZXN0YXRlLT5jb2xidWYsCisJCQkJCQkJCQkgIGF0dGlubWV0YS0+YXR0aW9wYXJh bXNbaV0sCisJCQkJCQkJCQkgIGF0dGlubWV0YS0+YXR0dHlwbW9kc1tpXSk7CisJCQlmZXN0 YXRlLT52YWx1ZXNbaV0gPSB2YWx1ZTsKKworCQkJLyogVW5pbnN0YWxsIGVycm9yIGNvbnRl eHQgY2FsbGJhY2suICovCisJCQllcnJvcl9jb250ZXh0X3N0YWNrID0gZXJyY29udGV4dC5w cmV2aW91czsKKwkJfQorCQlqKys7CisJfQorCisJLyoKKwkgKiBCdWlsZCB0aGUgdHVwbGUg YW5kIHB1dCBpdCBpbnRvIHRoZSBzbG90LgorCSAqIFdlIGRvbid0IGhhdmUgdG8gZnJlZSB0 aGUgdHVwbGUgZXhwbGljaXRseSBiZWNhdXNlIGl0J3MgYmVlbgorCSAqIGFsbG9jYXRlZCBp biB0aGUgcGVyLXR1cGxlIGNvbnRleHQuCisJICovCisJdHVwbGUgPSBoZWFwX2Zvcm1fdHVw bGUodHVwZGVzYywgZmVzdGF0ZS0+dmFsdWVzLCBmZXN0YXRlLT5udWxscyk7CisJdHVwbGVz dG9yZV9wdXR0dXBsZShmZXN0YXRlLT50dXBsZXMsIHR1cGxlKTsKKworCS8qIENsZWFuIHVw ICovCisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCU1lbW9yeUNvbnRl eHRSZXNldChmZXN0YXRlLT50ZW1wX2N4dCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAq IENhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGVycm9yIG9jY3VycyBk dXJpbmcgY29sdW1uIHZhbHVlCisgKiBjb252ZXJzaW9uLiAgUHJpbnQgbmFtZXMgb2YgY29s dW1uIGFuZCByZWxhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK3Bnc3FsX2Zkd19lcnJvcl9j YWxsYmFjayh2b2lkICphcmcpCit7CisJRXJyb3JQb3MgKmVycnBvcyA9IChFcnJvclBvcyAq KSBhcmc7CisJY29uc3QgY2hhcgkgICAqcmVsbmFtZTsKKwljb25zdCBjaGFyCSAgICpjb2xu YW1lOworCisJcmVsbmFtZSA9IGdldF9yZWxfbmFtZShlcnJwb3MtPnJlbGlkKTsKKwljb2xu YW1lID0gZ2V0X2F0dG5hbWUoZXJycG9zLT5yZWxpZCwgZXJycG9zLT5jdXJfYXR0bm8pOwor CWVycmNvbnRleHQoImNvbHVtbiAlcyBvZiBmb3JlaWduIHRhYmxlICVzIiwKKwkJCSAgIHF1 b3RlX2lkZW50aWZpZXIoY29sbmFtZSksIHF1b3RlX2lkZW50aWZpZXIocmVsbmFtZSkpOwor fQorCisvKgorICogcGdzcWxBbmFseXplRm9yZWlnblRhYmxlCisgKiAJCVRlc3Qgd2hldGhl ciBhbmFseXppbmcgdGhpcyBmb3JlaWduIHRhYmxlIGlzIHN1cHBvcnRlZAorICovCitzdGF0 aWMgYm9vbAorcGdzcWxBbmFseXplRm9yZWlnblRhYmxlKFJlbGF0aW9uIHJlbGF0aW9uLAor CQkJCQkJIEFjcXVpcmVTYW1wbGVSb3dzRnVuYyAqZnVuYywKKwkJCQkJCSBCbG9ja051bWJl ciAqdG90YWxwYWdlcykKK3sKKwkqdG90YWxwYWdlcyA9IDA7CisJKmZ1bmMgPSBwZ3NxbEFj cXVpcmVTYW1wbGVSb3dzRnVuYzsKKworCXJldHVybiB0cnVlOworfQorCisvKgorICogQWNx dWlyZSBhIHJhbmRvbSBzYW1wbGUgb2Ygcm93cyBmcm9tIGZvcmVpZ24gdGFibGUgbWFuYWdl ZCBieSBwZ3NxbF9mZHcuCisgKgorICogcGdzcWxfZmR3IGRvZXNuJ3QgcHJvdmlkZSBkaXJl Y3QgYWNjZXNzIHRvIHJlbW90ZSBidWZmZXIsIHNvIHdlIGV4ZWN1dGUKKyAqIHNpbXBsZSBT RUxFQ1Qgc3RhdGVtZW50IHdoaWNoIHJldHJpZXZlcyB3aG9sZSByb3dzIGZyb20gcmVtb3Rl IHNpZGUsIGFuZAorICogcGljayBzb21lIHNhbXBsZXMgZnJvbSB0aGVtLgorICovCitzdGF0 aWMgaW50CitwZ3NxbEFjcXVpcmVTYW1wbGVSb3dzRnVuYyhSZWxhdGlvbiByZWxhdGlvbiwg aW50IGVsZXZlbCwKKwkJCQkJCSAgIEhlYXBUdXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAor CQkJCQkJICAgZG91YmxlICp0b3RhbHJvd3MsCisJCQkJCQkgICBkb3VibGUgKnRvdGFsZGVh ZHJvd3MpCit7CisJUGdzcWxBbmFseXplU3RhdGUgYXN0YXRlOworCVN0cmluZ0luZm9EYXRh IHNxbDsKKwlGb3JlaWduVGFibGUgKnRhYmxlOworCUZvcmVpZ25TZXJ2ZXIgKnNlcnZlcjsK KwlVc2VyTWFwcGluZyAqdXNlcjsKKwlQR2Nvbm4JICAgKmNvbm4gPSBOVUxMOworCVBHcmVz dWx0ICAgKnJlcyA9IE5VTEw7CisKKwkvKgorCSAqIE9ubHkgZmV3IGluZm9ybWF0aW9uIGFy ZSBuZWNlc3NhcnkgYXMgaW5wdXQgdG8gcm93IHByb2Nlc3Nvci4gIE90aGVyCisJICogaW5p dGlhbGl6YXRpb24gd2lsbCBiZSBkb25lIGF0IHRoZSBmaXJzdCByb3cgcHJvY2Vzc29yIGNh bGwuCisJICovCisJYXN0YXRlLmFubF9jeHQgPSBDdXJyZW50TWVtb3J5Q29udGV4dDsKKwlh c3RhdGUudGVtcF9jeHQgPSBBbGxvY1NldENvbnRleHRDcmVhdGUoQ3VycmVudE1lbW9yeUNv bnRleHQsCisJCQkJCQkJCQkJCSJwZ3NxbF9mZHcgYW5hbHl6ZSB0ZW1wb3JhcnkgZGF0YSIs CisJCQkJCQkJCQkJCUFMTE9DU0VUX0RFRkFVTFRfTUlOU0laRSwKKwkJCQkJCQkJCQkJQUxM T0NTRVRfREVGQVVMVF9JTklUU0laRSwKKwkJCQkJCQkJCQkJQUxMT0NTRVRfREVGQVVMVF9N QVhTSVpFKTsKKwlhc3RhdGUucm93cyA9IHJvd3M7CisJYXN0YXRlLnRhcmdyb3dzID0gdGFy Z3Jvd3M7CisJYXN0YXRlLnR1cGRlc2MgPSByZWxhdGlvbi0+cmRfYXR0OworCWFzdGF0ZS5l cnJwb3MucmVsaWQgPSByZWxhdGlvbi0+cmRfaWQ7CisKKwkvKgorCSAqIENvbnN0cnVjdCBT RUxFQ1Qgc3RhdGVtZW50IHdoaWNoIHJldHJpZXZlcyB3aG9sZSByb3dzIGZyb20gcmVtb3Rl LiAgV2UKKwkgKiBjYW4ndCBhdm9pZCBydW5uaW5nIHNlcXVlbnRpYWwgc2NhbiBvbiByZW1v dGUgc2lkZSB0byBnZXQgcHJhY3RpY2FsCisJICogc3RhdGlzdGljcywgc28gdGhpcyBzZWVt cyByZWFzb25hYmxlIGNvbXByb21pc2UuCisJICovCisJaW5pdFN0cmluZ0luZm8oJnNxbCk7 CisJZGVwYXJzZUFuYWx5emVTcWwoJnNxbCwgcmVsYXRpb24pOworCisJdGFibGUgPSBHZXRG b3JlaWduVGFibGUocmVsYXRpb24tPnJkX2lkKTsKKwlzZXJ2ZXIgPSBHZXRGb3JlaWduU2Vy dmVyKHRhYmxlLT5zZXJ2ZXJpZCk7CisJdXNlciA9IEdldFVzZXJNYXBwaW5nKEdldE91dGVy VXNlcklkKCksIHNlcnZlci0+c2VydmVyaWQpOworCWNvbm4gPSBHZXRDb25uZWN0aW9uKHNl cnZlciwgdXNlciwgdHJ1ZSk7CisKKwkvKgorCSAqIEFjcXVpcmUgc2FtcGxlIHJvd3MgZnJv bSB0aGUgcmVzdWx0IHNldC4KKwkgKi8KKwlQR19UUlkoKTsKKwl7CisJCS8qCisJCSAqIEV4 ZWN1dGUgcmVtb3RlIHF1ZXJ5IGFuZCByZXRyaWV2ZSByZXN1bHRzIHdpdGggbGlicHEgcm93 IHByb2Nlc3Nvci4KKwkJICovCisJCVBRc2V0Um93UHJvY2Vzc29yKGNvbm4sIGFuYWx5emVf cm93X3Byb2Nlc3NvciwgJmFzdGF0ZSk7CisJCXJlcyA9IFBRZXhlYyhjb25uLCBzcWwuZGF0 YSk7CisJCVBRc2V0Um93UHJvY2Vzc29yKGNvbm4sIE5VTEwsIE5VTEwpOworCQlpZiAoUFFy ZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJCQllcmVwb3J0KEVSUk9S LAorCQkJCQkoZXJybXNnKCJjb3VsZCBub3QgZXhlY3V0ZSByZW1vdGUgcXVlcnkgZm9yIGFu YWx5emUiKSwKKwkJCQkJIGVycmRldGFpbCgiJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSks CisJCQkJCSBlcnJoaW50KCIlcyIsIHNxbC5kYXRhKSkpOworCQlQUWNsZWFyKHJlcyk7CisJ CXJlcyA9IE5VTEw7CisJfQorCVBHX0NBVENIKCk7CisJeworCQlQUWNsZWFyKHJlcyk7CisJ CVBHX1JFX1RIUk9XKCk7CisJfQorCVBHX0VORF9UUlkoKTsKKworCVJlbGVhc2VDb25uZWN0 aW9uKGNvbm4pOworCisJLyogV2UgYXNzdW1lIHRoYXQgd2UgaGF2ZSBubyBkZWFkIHR1cGxl LiAqLworCSp0b3RhbGRlYWRyb3dzID0gMC4wOworCisJLyogV2UndmUgcmV0cmlldmVkIGFs bCBsaXZpbmcgdHVwbGVzIGZyb20gZm9yZWlnbiBzZXJ2ZXIuICovCisJKnRvdGFscm93cyA9 IGFzdGF0ZS5zYW1wbGVyb3dzOworCisJLyoKKwkgKiBXZSBkb24ndCB1cGRhdGUgcGdfY2xh c3MucmVscGFnZXMgYmVjYXVzZSB3ZSBkb24ndCBjYXJlIHRoYXQgaW4KKwkgKiBwbGFubmlu ZyBhdCBhbGwuCisJICovCisKKwkvKgorCSAqIEVtaXQgc29tZSBpbnRlcmVzdGluZyByZWxh dGlvbiBpbmZvCisJICovCisJZXJlcG9ydChlbGV2ZWwsCisJCQkoZXJybXNnKCJcIiVzXCI6 IHNjYW5uZWQgd2l0aCBcIiVzXCIsICIKKwkJCQkJImNvbnRhaW5pbmcgJS4wZiBsaXZlIHJv d3MgYW5kICUuMGYgZGVhZCByb3dzOyAiCisJCQkJCSIlZCByb3dzIGluIHNhbXBsZSwgJS4w ZiBlc3RpbWF0ZWQgdG90YWwgcm93cyIsCisJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1l KHJlbGF0aW9uKSwgc3FsLmRhdGEsCisJCQkJCWFzdGF0ZS5zYW1wbGVyb3dzLCAwLjAsCisJ CQkJCWFzdGF0ZS5udW1yb3dzLCBhc3RhdGUuc2FtcGxlcm93cykpKTsKKworCXJldHVybiBh c3RhdGUubnVtcm93czsKK30KKworLyoKKyAqIEN1c3RvbSByb3cgcHJvY2Vzc29yIGZvciBh Y3F1aXJlX3NhbXBsZV9yb3dzLgorICoKKyAqIENvbGxlY3Qgc2FtcGxlIHJvd3MgZnJvbSB0 aGUgcmVzdWx0IG9mIHF1ZXJ5LgorICogICAtIFVzZSBhbGwgdHVwbGVzIGFzIHNhbXBsZSB1 bnRpbCB0YXJnZXQgcm93cyBzYW1wbGVzIGFyZSBjb2xsZWN0ZWQuIAorICogICAtIE9uY2Ug cmVhY2hlZCB0aGUgdGFyZ2V0LCBza2lwIHNvbWUgdHVwbGVzIGFuZCByZXBsYWNlIGFscmVh ZHkgc2FtcGxlZAorICogICAgIHR1cGxlIHJhbmRvbWx5LgorICovCitzdGF0aWMgaW50Cith bmFseXplX3Jvd19wcm9jZXNzb3IoUEdyZXN1bHQgKnJlcywgY29uc3QgUEdkYXRhVmFsdWUg KmNvbHVtbnMsCisJCQkJCSAgY29uc3QgY2hhciAqKmVycm1zZ3AsIHZvaWQgKnBhcmFtKQor eworCVBnc3FsQW5hbHl6ZVN0YXRlICphc3RhdGUgPSAoUGdzcWxBbmFseXplU3RhdGUgKikg cGFyYW07CisJaW50CQkJdGFyZ3Jvd3MgPSBhc3RhdGUtPnRhcmdyb3dzOworCVR1cGxlRGVz Ywl0dXBkZXNjID0gYXN0YXRlLT50dXBkZXNjOworCUF0dEluTWV0YWRhdGEgKmF0dGlubWV0 YSA9IGFzdGF0ZS0+YXR0aW5tZXRhOworCWludAkJCWk7CisJaW50CQkJajsKKwlpbnQJCQlw b3M7CS8qIHBvc2l0aW9uIHdoZXJlIG5leHQgc2FtcGxlIHNob3VsZCBiZSBzdG9yZWQuICov CisJSGVhcFR1cGxlCXR1cGxlOworCUVycm9yQ29udGV4dENhbGxiYWNrIGVycmNvbnRleHQ7 CisJTWVtb3J5Q29udGV4dCBjYWxsZXJjb250ZXh0OworCisJaWYgKGNvbHVtbnMgPT0gTlVM TCkKKwl7CisJCS8qIFByZXBhcmUgZm9yIHNhbXBsaW5nIHJvd3MgKi8KKwkJYXN0YXRlLT5h dHRpbm1ldGEgPSBUdXBsZURlc2NHZXRBdHRJbk1ldGFkYXRhKHR1cGRlc2MpOworCQlhc3Rh dGUtPmNvbGJ1ZmxlbiA9IElOSVRJQUxfQ09MQlVGX1NJWkU7CisJCWFzdGF0ZS0+Y29sYnVm ID0gcGFsbG9jKGFzdGF0ZS0+Y29sYnVmbGVuKTsKKwkJYXN0YXRlLT52YWx1ZXMgPSAoRGF0 dW0gKikgcGFsbG9jKHNpemVvZihEYXR1bSkgKiB0dXBkZXNjLT5uYXR0cyk7CisJCWFzdGF0 ZS0+bnVsbHMgPSAoYm9vbCAqKSBwYWxsb2Moc2l6ZW9mKGJvb2wpICogdHVwZGVzYy0+bmF0 dHMpOworCQlhc3RhdGUtPm51bXJvd3MgPSAwOworCQlhc3RhdGUtPnNhbXBsZXJvd3MgPSAw OworCQlhc3RhdGUtPnJvd3N0b3NraXAgPSAtMTsKKwkJYXN0YXRlLT5udW1yb3dzID0gMDsK KwkJYXN0YXRlLT5yc3RhdGUgPSBhbmxfaW5pdF9zZWxlY3Rpb25fc3RhdGUoYXN0YXRlLT50 YXJncm93cyk7CisKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBBTkFMWVpFIGFnYWlu c3QgZm9yZWlnbiB0YWJsZXMgYXJlIG5vdCBkb25lIGluIHByb2Nlc3NlcyBvZgorCSAqIHZh Y3V1bSwgc28gaGVyZSB3ZSB1c2UgQ0hFQ0tfRk9SX0lOVEVSUlVQVFMgaW5zdGVhZCBvZgor CSAqIHZhY3V1bV9kZWxheV9wb2ludCgpLgorCSAqLworCUNIRUNLX0ZPUl9JTlRFUlJVUFRT KCk7CisKKwkvKgorCSAqIERvIHRoZSBmb2xsb3dpbmcgd29yayBpbiBhIHRlbXAgY29udGV4 dCB0aGF0IHdlIHJlc2V0IGFmdGVyIGVhY2ggdHVwbGUuCisJICogVGhpcyBjbGVhbnMgdXAg bm90IG9ubHkgdGhlIGRhdGEgd2UgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvLCBidXQgYW55CisJ ICogY3J1ZnQgdGhlIEkvTyBmdW5jdGlvbnMgbWlnaHQgbGVhay4KKwkgKi8KKwljYWxsZXJj b250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKGFzdGF0ZS0+dGVtcF9jeHQpOworCisJ LyoKKwkgKiBGaXJzdCB0YXJncm93cyByb3dzIGFyZSBvbmNlIHNhbXBsZWQgYWx3YXlzLiAg SWYgd2UgaGF2ZSBtb3JlIHNvdXJjZQorCSAqIHJvd3MsIHBpY2sgdXAgc29tZSBvZiB0aGVt IGJ5IHNraXBwaW5nIGFuZCByZXBsYWNlIGFscmVhZHkgc2FtcGxlZAorCSAqIHR1cGxlIHJh bmRvbWx5LgorCSAqCisJICogSGVyZSB3ZSBqdXN0IGRldGVybWluZSB0aGUgc2xvdCB3aGVy ZSBuZXh0IHNhbXBsZSBzaG91bGQgYmUgc3RvcmVkLiAgU2V0CisJICogcG9zIHRvIG5lZ2F0 aXZlIHZhbHVlIHRvIGluZGljYXRlcyB0aGUgcm93IHNob3VsZCBiZSBza2lwcGVkLgorCSAq LworCWlmIChhc3RhdGUtPm51bXJvd3MgPCB0YXJncm93cykKKwkJcG9zID0gYXN0YXRlLT5u dW1yb3dzKys7CisJZWxzZQorCXsKKwkJLyoKKwkJICogVGhlIGZpcnN0IHRhcmdyb3dzIHNh bXBsZSByb3dzIGFyZSBzaW1wbHkgY29waWVkIGludG8KKwkJICogdGhlIHJlc2Vydm9pci4g IFRoZW4gd2Ugc3RhcnQgcmVwbGFjaW5nIHR1cGxlcyBpbiB0aGUKKwkJICogc2FtcGxlIHVu dGlsIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHJlbGF0aW9uLiAgVGhpcworCQkgKiBhbGdv cml0aG0gaXMgZnJvbSBKZWZmIFZpdHRlcidzIHBhcGVyLCBzaW1pbGFybHkgdG8KKwkJICog YWNxdWlyZV9zYW1wbGVfcm93cyBpbiBhbmFseXplLmMuCisJCSAqCisJCSAqIFdlIGRvbid0 IGhhdmUgYmxvY2std2lzZSBhY2Nlc3NpYmlsaXR5LCBzbyBldmVyeSByb3cgaW4KKwkJICog dGhlIFBHcmVzdWx0IGlzIHBvc3NpYmxlIHRvIGJlIHNhbXBsZS4KKwkJICovCisJCWlmIChh c3RhdGUtPnJvd3N0b3NraXAgPCAwKQorCQkJYXN0YXRlLT5yb3dzdG9za2lwID0gYW5sX2dl dF9uZXh0X1MoYXN0YXRlLT5zYW1wbGVyb3dzLCB0YXJncm93cywKKwkJCQkJCQkJCQkJCSZh c3RhdGUtPnJzdGF0ZSk7CisKKwkJaWYgKGFzdGF0ZS0+cm93c3Rvc2tpcCA8PSAwKQorCQl7 CisJCQlpbnQJCWsgPSAoaW50KSAodGFyZ3Jvd3MgKiBhbmxfcmFuZG9tX2ZyYWN0KCkpOwor CisJCQlBc3NlcnQoayA+PSAwICYmIGsgPCB0YXJncm93cyk7CisKKwkJCS8qCisJCQkgKiBD cmVhdGUgc2FtcGxlIHR1cGxlIGZyb20gdGhlIHJlc3VsdCwgYW5kIHJlcGxhY2UgYXQKKwkJ CSAqIHJhbmRvbS4KKwkJCSAqLworCQkJaGVhcF9mcmVldHVwbGUoYXN0YXRlLT5yb3dzW2td KTsKKwkJCXBvcyA9IGs7CisJCX0KKwkJZWxzZQorCQkJcG9zID0gLTE7CisKKwkJYXN0YXRl LT5yb3dzdG9za2lwIC09IDE7CisJfQorCisJLyogQWx3YXlzIGluY3JlbWVudCBzYW1wbGUg cm93IGNvdW50ZXIuICovCisJYXN0YXRlLT5zYW1wbGVyb3dzICs9IDE7CisKKwlpZiAocG9z ID49IDApCisJeworCQkvKgorCQkgKiBDcmVhdGUgc2FtcGxlIHR1cGxlIGZyb20gY3VycmVu dCByZXN1bHQgcm93LCBhbmQgc3RvcmUgaXQgaW50byB0aGUKKwkJICogcG9zaXRpb24gZGV0 ZXJtaW5lZCBhYm92ZS4gIE5vdGUgdGhhdCBpIGFuZCBqIHBvaW50IGVudHJpZXMgaW4KKwkJ ICogY2F0YWxvZyBhbmQgY29sdW1ucyBhcnJheSByZXNwZWN0aXZlbHkuCisJCSAqLworCQlm b3IgKGkgPSAwLCBqID0gMDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBpKyspCisJCXsKKwkJCWlu dAkJbGVuID0gY29sdW1uc1tqXS5sZW47CisKKwkJCWlmICh0dXBkZXNjLT5hdHRyc1tpXS0+ YXR0aXNkcm9wcGVkKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAobGVuIDwgMCkKKwkJCQlh c3RhdGUtPm51bGxzW2ldID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlEYXR1bQl2YWx1 ZTsKKworCQkJCWFzdGF0ZS0+bnVsbHNbaV0gPSBmYWxzZTsKKworCQkJCS8qCisJCQkJICog RXhwYW5kIGNvbHVtbiB2YWx1ZSBzdHJpbmcgYnVmZmVyIHR3aWNlIGFzIGN1cnJlbnQgdW50 aWwKKwkJCQkgKiBpdCBjYW4gaG9sZCB0aGUgdmFsdWUuICBXZSBuZWVkIHRvIGFsbG9jYXRl IHRoZSBidWZmZXIgaW4KKwkJCQkgKiB0aGUgY29udGV4dCBvZiBhbmFseXplLgorCQkJCSAq LworCQkJCXdoaWxlIChhc3RhdGUtPmNvbGJ1ZmxlbiA8IGxlbiArIDEpCisJCQkJeworCQkJ CQlhc3RhdGUtPmNvbGJ1ZmxlbiAqPSAyOworCQkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8o YXN0YXRlLT5hbmxfY3h0KTsKKwkJCQkJYXN0YXRlLT5jb2xidWYgPSByZXBhbGxvYyhhc3Rh dGUtPmNvbGJ1ZiwKKwkJCQkJCQkJCQkJICBhc3RhdGUtPmNvbGJ1Zmxlbik7CisJCQkJCU1l bW9yeUNvbnRleHRTd2l0Y2hUbyhhc3RhdGUtPnRlbXBfY3h0KTsKKwkJCQl9CisJCQkJbWVt Y3B5KGFzdGF0ZS0+Y29sYnVmLCBjb2x1bW5zW2pdLnZhbHVlLCBsZW4pOworCQkJCWFzdGF0 ZS0+Y29sYnVmW2NvbHVtbnNbal0ubGVuXSA9ICdcMCc7CisKKwkJCQkvKgorCQkJCSAqIFNl dCB1cCBhbmQgaW5zdGFsbCBjYWxsYmFjayB0byByZXBvcnQgd2hlcmUgY29udmVyc2lvbiBl cnJvcgorCQkJCSAqIG9jY3Vycy4KKwkJCQkgKi8KKwkJCQlhc3RhdGUtPmVycnBvcy5jdXJf YXR0bm8gPSBpICsgMTsKKwkJCQllcnJjb250ZXh0LmNhbGxiYWNrID0gcGdzcWxfZmR3X2Vy cm9yX2NhbGxiYWNrOworCQkJCWVycmNvbnRleHQuYXJnID0gKHZvaWQgKikgJmFzdGF0ZS0+ ZXJycG9zOworCQkJCWVycmNvbnRleHQucHJldmlvdXMgPSBlcnJvcl9jb250ZXh0X3N0YWNr OworCQkJCWVycm9yX2NvbnRleHRfc3RhY2sgPSAmZXJyY29udGV4dDsKKworCQkJCXZhbHVl ID0gSW5wdXRGdW5jdGlvbkNhbGwoJmF0dGlubWV0YS0+YXR0aW5mdW5jc1tpXSwKKwkJCQkJ CQkJCQkgIGFzdGF0ZS0+Y29sYnVmLAorCQkJCQkJCQkJCSAgYXR0aW5tZXRhLT5hdHRpb3Bh cmFtc1tpXSwKKwkJCQkJCQkJCQkgIGF0dGlubWV0YS0+YXR0dHlwbW9kc1tpXSk7CisJCQkJ YXN0YXRlLT52YWx1ZXNbaV0gPSB2YWx1ZTsKKworCQkJCS8qIFVuaW5zdGFsbCBlcnJvciBj YWxsYmFjayBmdW5jdGlvbi4gKi8KKwkJCQllcnJvcl9jb250ZXh0X3N0YWNrID0gZXJyY29u dGV4dC5wcmV2aW91czsKKwkJCX0KKwkJCWorKzsKKwkJfQorCisJCS8qCisJCSAqIEdlbmVy YXRlIHR1cGxlIGZyb20gdGhlIHJlc3VsdCByb3cgZGF0YSwgYW5kIHN0b3JlIGl0IGludG8g dGhlIGdpdmUKKwkJICogYnVmZmVyLiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gYWxsb2NhdGUg dGhlIHR1cGxlIGluIHRoZSBhbmFseXplCisJCSAqIGNvbnRleHQgdG8gbWFrZSBpdCB2YWxp ZCBldmVuIGFmdGVyIHRlbXBvcmFyeSBwZXItdHVwbGUgY29udGV4dCBoYXMKKwkJICogYmVl biByZXNldC4KKwkJICovCisJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhhc3RhdGUtPmFubF9j eHQpOworCQl0dXBsZSA9IGhlYXBfZm9ybV90dXBsZSh0dXBkZXNjLCBhc3RhdGUtPnZhbHVl cywgYXN0YXRlLT5udWxscyk7CisJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhhc3RhdGUtPnRl bXBfY3h0KTsKKwkJYXN0YXRlLT5yb3dzW3Bvc10gPSB0dXBsZTsKKwl9CisKKwkvKiBDbGVh biB1cCAqLworCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhjYWxsZXJjb250ZXh0KTsKKwlNZW1v cnlDb250ZXh0UmVzZXQoYXN0YXRlLT50ZW1wX2N4dCk7CisKKwlyZXR1cm4gMTsKK30KZGlm ZiAtLWdpdCBhL2NvbnRyaWIvcGdzcWxfZmR3L3Bnc3FsX2Zkdy5jb250cm9sIGIvY29udHJp Yi9wZ3NxbF9mZHcvcGdzcWxfZmR3LmNvbnRyb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMC4uMGE5YzhmNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcGdzcWxf ZmR3L3Bnc3FsX2Zkdy5jb250cm9sCkBAIC0wLDAgKzEsNSBAQAorIyBwZ3NxbF9mZHcgZXh0 ZW5zaW9uCitjb21tZW50ID0gJ2ZvcmVpZ24tZGF0YSB3cmFwcGVyIGZvciByZW1vdGUgUG9z dGdyZVNRTCBzZXJ2ZXJzJworZGVmYXVsdF92ZXJzaW9uID0gJzEuMCcKK21vZHVsZV9wYXRo bmFtZSA9ICckbGliZGlyL3Bnc3FsX2ZkdycKK3JlbG9jYXRhYmxlID0gdHJ1ZQpkaWZmIC0t Z2l0IGEvY29udHJpYi9wZ3NxbF9mZHcvcGdzcWxfZmR3LmggYi9jb250cmliL3Bnc3FsX2Zk dy9wZ3NxbF9mZHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGU2 ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wZ3NxbF9mZHcvcGdzcWxfZmR3LmgK QEAgLTAsMCArMSw0NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogcGdzcWxf ZmR3LmgKKyAqCQkgIGZvcmVpZ24tZGF0YSB3cmFwcGVyIGZvciByZW1vdGUgUG9zdGdyZVNR TCBzZXJ2ZXJzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgUG9zdGdyZVNRTCBHbG9i YWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBJREVOVElGSUNBVElPTgorICoJCSAgY29u dHJpYi9wZ3NxbF9mZHcvcGdzcWxfZmR3LmgKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqLworCisjaWZuZGVmIFBHU1FMX0ZEV19ICisjZGVmaW5lIFBHU1FMX0ZEV19ICisKKyNp bmNsdWRlICJwb3N0Z3Jlcy5oIgorI2luY2x1ZGUgImZvcmVpZ24vZm9yZWlnbi5oIgorI2lu Y2x1ZGUgIm5vZGVzL3JlbGF0aW9uLmgiCisjaW5jbHVkZSAidXRpbHMvcmVsY2FjaGUuaCIK KworLyogaW4gb3B0aW9uLmMgKi8KK2ludCBFeHRyYWN0Q29ubmVjdGlvbk9wdGlvbnMoTGlz dCAqZGVmZWxlbXMsCisJCQkJCQkJIGNvbnN0IGNoYXIgKiprZXl3b3JkcywKKwkJCQkJCQkg Y29uc3QgY2hhciAqKnZhbHVlcyk7CitpbnQgR2V0RmV0Y2hDb3VudE9wdGlvbihGb3JlaWdu VGFibGUgKnRhYmxlLCBGb3JlaWduU2VydmVyICpzZXJ2ZXIpOworCisvKiBpbiBkZXBhcnNl LmMgKi8KK3ZvaWQgZGVwYXJzZVNpbXBsZVNxbChTdHJpbmdJbmZvIGJ1ZiwKKwkJCQkJICBP aWQgcmVsaWQsCisJCQkJCSAgUGxhbm5lckluZm8gKnJvb3QsCisJCQkJCSAgUmVsT3B0SW5m byAqYmFzZXJlbCk7Cit2b2lkIGFwcGVuZFdoZXJlQ2xhdXNlKFN0cmluZ0luZm8gYnVmLAor CQkJCQkgICBib29sIGhhc193aGVyZSwKKwkJCQkJICAgTGlzdCAqZXhwcnMsCisJCQkJCSAg IFBsYW5uZXJJbmZvICpyb290KTsKK3ZvaWQgc29ydENvbmRpdGlvbnMoUGxhbm5lckluZm8g KnJvb3QsCisJCQkJCVJlbE9wdEluZm8gKmJhc2VyZWwsCisJCQkJCUxpc3QgKipyZW1vdGVf Y29uZHMsCisJCQkJCUxpc3QgKipwYXJhbV9jb25kcywKKwkJCQkJTGlzdCAqKmxvY2FsX2Nv bmRzKTsKK3ZvaWQgZGVwYXJzZUFuYWx5emVTcWwoU3RyaW5nSW5mbyBidWYsIFJlbGF0aW9u IHJlbCk7CisKKyNlbmRpZiAvKiBQR1NRTF9GRFdfSCAqLwpkaWZmIC0tZ2l0IGEvY29udHJp Yi9wZ3NxbF9mZHcvc3FsL3Bnc3FsX2Zkdy5zcWwgYi9jb250cmliL3Bnc3FsX2Zkdy9zcWwv cGdzcWxfZmR3LnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDNl MTY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wZ3NxbF9mZHcvc3FsL3Bnc3FsX2Zk dy5zcWwKQEAgLTAsMCArMSwyNjUgQEAKKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIGNyZWF0ZSBG RFcgb2JqZWN0cworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCistLSBDbGVhbiB1cCBpbiBjYXNlIGEg cHJpb3IgcmVncmVzc2lvbiBydW4gZmFpbGVkCisKKy0tIFN1cHByZXNzIE5PVElDRSBtZXNz YWdlcyB3aGVuIHJvbGVzIGRvbid0IGV4aXN0CitTRVQgY2xpZW50X21pbl9tZXNzYWdlcyBU TyAnZXJyb3InOworCitEUk9QIFJPTEUgSUYgRVhJU1RTIHBnc3FsX2Zkd191c2VyOworCitS RVNFVCBjbGllbnRfbWluX21lc3NhZ2VzOworCitDUkVBVEUgUk9MRSBwZ3NxbF9mZHdfdXNl ciBMT0dJTiBTVVBFUlVTRVI7CitTRVQgU0VTU0lPTiBBVVRIT1JJWkFUSU9OICdwZ3NxbF9m ZHdfdXNlcic7CisKK0NSRUFURSBFWFRFTlNJT04gcGdzcWxfZmR3OworCitDUkVBVEUgU0VS VkVSIGxvb3BiYWNrMSBGT1JFSUdOIERBVEEgV1JBUFBFUiBwZ3NxbF9mZHc7CitDUkVBVEUg U0VSVkVSIGxvb3BiYWNrMiBGT1JFSUdOIERBVEEgV1JBUFBFUiBwZ3NxbF9mZHcKKyAgT1BU SU9OUyAoZGJuYW1lICdjb250cmliX3JlZ3Jlc3Npb24nKTsKKworQ1JFQVRFIFVTRVIgTUFQ UElORyBGT1IgcHVibGljIFNFUlZFUiBsb29wYmFjazEKKwlPUFRJT05TICh1c2VyICd2YWx1 ZScsIHBhc3N3b3JkICd2YWx1ZScpOworQ1JFQVRFIFVTRVIgTUFQUElORyBGT1IgcGdzcWxf ZmR3X3VzZXIgU0VSVkVSIGxvb3BiYWNrMjsKKworQ1JFQVRFIEZPUkVJR04gVEFCTEUgZnQx ICgKKwljMCBpbnQsCisJYzEgaW50IE5PVCBOVUxMLAorCWMyIGludCBOT1QgTlVMTCwKKwlj MyB0ZXh0LAorCWM0IHRpbWVzdGFtcHR6LAorCWM1IHRpbWVzdGFtcCwKKwljNiB2YXJjaGFy KDEwKSwKKwljNyBjaGFyKDEwKQorKSBTRVJWRVIgbG9vcGJhY2syOworQUxURVIgRk9SRUlH TiBUQUJMRSBmdDEgRFJPUCBDT0xVTU4gYzA7CisKK0NSRUFURSBGT1JFSUdOIFRBQkxFIGZ0 MiAoCisJYzAgaW50LAorCWMxIGludCBOT1QgTlVMTCwKKwljMiBpbnQgTk9UIE5VTEwsCisJ YzMgdGV4dCwKKwljNCB0aW1lc3RhbXB0eiwKKwljNSB0aW1lc3RhbXAsCisJYzYgdmFyY2hh cigxMCksCisJYzcgY2hhcigxMCkKKykgU0VSVkVSIGxvb3BiYWNrMjsKK0FMVEVSIEZPUkVJ R04gVEFCTEUgZnQyIERST1AgQ09MVU1OIGMwOworCistLSA9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLSBj cmVhdGUgb2JqZWN0cyB1c2VkIHRocm91Z2ggRkRXCistLSA9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDUkVB VEUgU0NIRU1BICJTIDEiOworQ1JFQVRFIFRBQkxFICJTIDEiLiJUIDEiICgKKwkiQyAxIiBp bnQgTk9UIE5VTEwsCisJYzIgaW50IE5PVCBOVUxMLAorCWMzIHRleHQsCisJYzQgdGltZXN0 YW1wdHosCisJYzUgdGltZXN0YW1wLAorCWM2IHZhcmNoYXIoMTApLAorCWM3IGNoYXIoMTAp LAorCUNPTlNUUkFJTlQgdDFfcGtleSBQUklNQVJZIEtFWSAoIkMgMSIpCispOworQ1JFQVRF IFRBQkxFICJTIDEiLiJUIDIiICgKKwljMSBpbnQgTk9UIE5VTEwsCisJYzIgdGV4dCwKKwlD T05TVFJBSU5UIHQyX3BrZXkgUFJJTUFSWSBLRVkgKGMxKQorKTsKKworQkVHSU47CitUUlVO Q0FURSAiUyAxIi4iVCAxIjsKK0lOU0VSVCBJTlRPICJTIDEiLiJUIDEiCisJU0VMRUNUIGlk LAorCSAgICAgICBpZCAlIDEwLAorCSAgICAgICB0b19jaGFyKGlkLCAnRk0wMDAwMCcpLAor CSAgICAgICAnMTk3MC0wMS0wMSc6OnRpbWVzdGFtcHR6ICsgKChpZCAlIDEwMCkgfHwgJyBk YXlzJyk6OmludGVydmFsLAorCSAgICAgICAnMTk3MC0wMS0wMSc6OnRpbWVzdGFtcCArICgo aWQgJSAxMDApIHx8ICcgZGF5cycpOjppbnRlcnZhbCwKKwkgICAgICAgaWQgJSAxMCwKKwkg ICAgICAgaWQgJSAxMAorCUZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMDApIGlkOworVFJV TkNBVEUgIlMgMSIuIlQgMiI7CitJTlNFUlQgSU5UTyAiUyAxIi4iVCAyIgorCVNFTEVDVCBp ZCwKKwkgICAgICAgJ0FBQScgfHwgdG9fY2hhcihpZCwgJ0ZNMDAwJykKKwlGUk9NIGdlbmVy YXRlX3NlcmllcygxLCAxMDApIGlkOworQ09NTUlUOworCistLSA9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cist LSB0ZXN0cyBmb3IgcGdzcWxfZmR3X3ZhbGlkYXRvcgorLS0gPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUxU RVIgRk9SRUlHTiBEQVRBIFdSQVBQRVIgcGdzcWxfZmR3IE9QVElPTlMgKGhvc3QgJ3ZhbHVl Jyk7ICAgIC0tIEVSUk9SCistLSByZXF1aXJlc3NsLCBrcmJzcnZuYW1lIGFuZCBnc3NsaWIg YXJlIG9taXR0ZWQgYmVjYXVzZSB0aGV5IGRlcGVuZCBvbgorLS0gY29uZmlndXJlIG9wdGlv bgorQUxURVIgU0VSVkVSIGxvb3BiYWNrMSBPUFRJT05TICgKKwlhdXRodHlwZSAndmFsdWUn LAorCXNlcnZpY2UgJ3ZhbHVlJywKKwljb25uZWN0X3RpbWVvdXQgJ3ZhbHVlJywKKwlkYm5h bWUgJ3ZhbHVlJywKKwlob3N0ICd2YWx1ZScsCisJaG9zdGFkZHIgJ3ZhbHVlJywKKwlwb3J0 ICd2YWx1ZScsCisJLS1jbGllbnRfZW5jb2RpbmcgJ3ZhbHVlJywKKwl0dHkgJ3ZhbHVlJywK KwlvcHRpb25zICd2YWx1ZScsCisJYXBwbGljYXRpb25fbmFtZSAndmFsdWUnLAorCS0tZmFs bGJhY2tfYXBwbGljYXRpb25fbmFtZSAndmFsdWUnLAorCWtlZXBhbGl2ZXMgJ3ZhbHVlJywK KwlrZWVwYWxpdmVzX2lkbGUgJ3ZhbHVlJywKKwlrZWVwYWxpdmVzX2ludGVydmFsICd2YWx1 ZScsCisJLS0gcmVxdWlyZXNzbCAndmFsdWUnLAorCXNzbGNvbXByZXNzaW9uICd2YWx1ZScs CisJc3NsbW9kZSAndmFsdWUnLAorCXNzbGNlcnQgJ3ZhbHVlJywKKwlzc2xrZXkgJ3ZhbHVl JywKKwlzc2xyb290Y2VydCAndmFsdWUnLAorCXNzbGNybCAndmFsdWUnCisJLS1yZXF1aXJl cGVlciAndmFsdWUnLAorCS0tIGtyYnNydm5hbWUgJ3ZhbHVlJywKKwktLSBnc3NsaWIgJ3Zh bHVlJywKKwktLXJlcGxpY2F0aW9uICd2YWx1ZScKKyk7CitBTFRFUiBTRVJWRVIgbG9vcGJh Y2sxIE9QVElPTlMgKHVzZXIgJ3ZhbHVlJyk7ICAgICAgICAgICAgICAgICAgLS0gRVJST1IK K0FMVEVSIFVTRVIgTUFQUElORyBGT1IgcHVibGljIFNFUlZFUiBsb29wYmFjazEKKwlPUFRJ T05TIChEUk9QIHVzZXIsIERST1AgcGFzc3dvcmQpOworQUxURVIgVVNFUiBNQVBQSU5HIEZP UiBwdWJsaWMgU0VSVkVSIGxvb3BiYWNrMQorCU9QVElPTlMgKGhvc3QgJ3ZhbHVlJyk7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIEVSUk9SCitBTFRFUiBGT1JF SUdOIFRBQkxFIGZ0MSBPUFRJT05TIChuc3BuYW1lICdTIDEnLCByZWxuYW1lICdUIDEnKTsK K0FMVEVSIEZPUkVJR04gVEFCTEUgZnQyIE9QVElPTlMgKG5zcG5hbWUgJ1MgMScsIHJlbG5h bWUgJ1QgMScpOworQUxURVIgRk9SRUlHTiBUQUJMRSBmdDEgT1BUSU9OUyAoaW52YWxpZCAn dmFsdWUnKTsgICAgICAgICAgICAgIC0tIEVSUk9SCitBTFRFUiBGT1JFSUdOIFRBQkxFIGZ0 MSBBTFRFUiBDT0xVTU4gYzEgT1BUSU9OUyAoaW52YWxpZCAndmFsdWUnKTsgLS0gRVJST1IK K0FMVEVSIEZPUkVJR04gVEFCTEUgZnQxIEFMVEVSIENPTFVNTiBjMSBPUFRJT05TIChjb2xu YW1lICdDIDEnKTsKK0FMVEVSIEZPUkVJR04gVEFCTEUgZnQyIEFMVEVSIENPTFVNTiBjMSBP UFRJT05TIChjb2xuYW1lICdDIDEnKTsKK1xkZXcrCitcZGVzKworXGRldSsKK1xkZXQrCisK Ky0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KKy0tIHNpbXBsZSBxdWVyaWVzCistLSA9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CistLSBzaW5nbGUgdGFibGUsIHdpdGgvd2l0aG91dCBhbGlhcworRVhQTEFJTiAoQ09TVFMg ZmFsc2UpIFNFTEVDVCAqIEZST00gZnQxIE9SREVSIEJZIGMzLCBjMSBPRkZTRVQgMTAwIExJ TUlUIDEwOworU0VMRUNUICogRlJPTSBmdDEgT1JERVIgQlkgYzMsIGMxIE9GRlNFVCAxMDAg TElNSVQgMTA7CitFWFBMQUlOIChDT1NUUyBmYWxzZSkgU0VMRUNUICogRlJPTSBmdDEgdDEg T1JERVIgQlkgdDEuYzMsIHQxLmMxIE9GRlNFVCAxMDAgTElNSVQgMTA7CitTRUxFQ1QgKiBG Uk9NIGZ0MSB0MSBPUkRFUiBCWSB0MS5jMywgdDEuYzEgT0ZGU0VUIDEwMCBMSU1JVCAxMDsK Ky0tIHdpdGggV0hFUkUgY2xhdXNlCitFWFBMQUlOIChDT1NUUyBmYWxzZSkgU0VMRUNUICog RlJPTSBmdDEgdDEgV0hFUkUgdDEuYzEgPSAxMDEgQU5EIHQxLmM2ID0gJzEnIEFORCB0MS5j NyA+PSAnMSc7CitTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBXSEVSRSB0MS5jMSA9IDEwMSBBTkQg dDEuYzYgPSAnMScgQU5EIHQxLmM3ID49ICcxJzsKKy0tIGFnZ3JlZ2F0ZQorU0VMRUNUIENP VU5UKCopIEZST00gZnQxIHQxOworLS0gam9pbiB0d28gdGFibGVzCitTRUxFQ1QgdDEuYzEg RlJPTSBmdDEgdDEgSk9JTiBmdDIgdDIgT04gKHQxLmMxID0gdDIuYzEpIE9SREVSIEJZIHQx LmMzLCB0MS5jMSBPRkZTRVQgMTAwIExJTUlUIDEwOworLS0gc3VicXVlcnkKK1NFTEVDVCAq IEZST00gZnQxIHQxIFdIRVJFIHQxLmMzIElOIChTRUxFQ1QgYzMgRlJPTSBmdDIgdDIgV0hF UkUgYzEgPD0gMTApIE9SREVSIEJZIGMxOworLS0gc3VicXVlcnkrTUFYCitTRUxFQ1QgKiBG Uk9NIGZ0MSB0MSBXSEVSRSB0MS5jMyA9IChTRUxFQ1QgTUFYKGMzKSBGUk9NIGZ0MiB0Mikg T1JERVIgQlkgYzE7CistLSB1c2VkIGluIENURQorV0lUSCB0MSBBUyAoU0VMRUNUICogRlJP TSBmdDEgV0hFUkUgYzEgPD0gMTApIFNFTEVDVCB0Mi5jMSwgdDIuYzIsIHQyLmMzLCB0Mi5j NCBGUk9NIHQxLCBmdDIgdDIgV0hFUkUgdDEuYzEgPSB0Mi5jMSBPUkRFUiBCWSB0MS5jMTsK Ky0tIGZpeGVkIHZhbHVlcworU0VMRUNUICdmaXhlZCcsIE5VTEwgRlJPTSBmdDEgdDEgV0hF UkUgYzEgPSAxOworLS0gdXNlci1kZWZpbmVkIG9wZXJhdG9yL2Z1bmN0aW9uCitDUkVBVEUg RlVOQ1RJT04gcGdzcWxfZmR3X2FicyhpbnQpIFJFVFVSTlMgaW50IEFTICQkCitCRUdJTgor UkVUVVJOIGFicygkMSk7CitFTkQKKyQkIExBTkdVQUdFIHBscGdzcWwgSU1NVVRBQkxFOwor Q1JFQVRFIE9QRVJBVE9SID09PSAoCisgICAgTEVGVEFSRyA9IGludCwKKyAgICBSSUdIVEFS RyA9IGludCwKKyAgICBQUk9DRURVUkUgPSBpbnQ0ZXEsCisgICAgQ09NTVVUQVRPUiA9ID09 PSwKKyAgICBORUdBVE9SID0gIT09CispOworRVhQTEFJTiAoQ09TVFMgZmFsc2UpIFNFTEVD VCAqIEZST00gZnQxIHQxIFdIRVJFIHQxLmMxID0gcGdzcWxfZmR3X2Ficyh0MS5jMik7CitF WFBMQUlOIChDT1NUUyBmYWxzZSkgU0VMRUNUICogRlJPTSBmdDEgdDEgV0hFUkUgdDEuYzEg PT09IHQxLmMyOworRVhQTEFJTiAoQ09TVFMgZmFsc2UpIFNFTEVDVCAqIEZST00gZnQxIHQx IFdIRVJFIHQxLmMxID0gYWJzKHQxLmMyKTsKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBTRUxF Q1QgKiBGUk9NIGZ0MSB0MSBXSEVSRSB0MS5jMSA9IHQxLmMyOworCistLSA9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09CistLSBXSEVSRSBwdXNoIGRvd24KKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0VYUExBSU4gKENP U1RTIGZhbHNlKSBTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBXSEVSRSB0MS5jMSA9IDE7ICAgICAg ICAgLS0gVmFyLCBPcEV4cHIoYiksIENvbnN0CitFWFBMQUlOIChDT1NUUyBmYWxzZSkgU0VM RUNUICogRlJPTSBmdDEgdDEgV0hFUkUgdDEuYzEgPSAxMDAgQU5EIHQxLmMyID0gMDsgLS0g Qm9vbEV4cHIKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBX SEVSRSBjMSBJUyBOVUxMOyAgICAgICAgLS0gTnVsbFRlc3QKK0VYUExBSU4gKENPU1RTIGZh bHNlKSBTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBXSEVSRSBjMSBJUyBOT1QgTlVMTDsgICAgLS0g TnVsbFRlc3QKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBX SEVSRSByb3VuZChhYnMoYzEpLCAwKSA9IDE7IC0tIEZ1bmNFeHByCitFWFBMQUlOIChDT1NU UyBmYWxzZSkgU0VMRUNUICogRlJPTSBmdDEgdDEgV0hFUkUgYzEgPSAtYzE7ICAgICAgICAg IC0tIE9wRXhwcihsKQorRVhQTEFJTiAoQ09TVFMgZmFsc2UpIFNFTEVDVCAqIEZST00gZnQx IHQxIFdIRVJFIDEgPSBjMSE7ICAgICAgICAgICAtLSBPcEV4cHIocikKK0VYUExBSU4gKENP U1RTIGZhbHNlKSBTRUxFQ1QgKiBGUk9NIGZ0MSB0MSBXSEVSRSAoYzEgSVMgTk9UIE5VTEwp IElTIERJU1RJTkNUIEZST00gKGMxIElTIE5PVCBOVUxMKTsgLS0gRGlzdGluY3RFeHByCitF WFBMQUlOIChDT1NUUyBmYWxzZSkgU0VMRUNUICogRlJPTSBmdDEgdDEgV0hFUkUgYzEgPSBB TlkoQVJSQVlbYzIsIDEsIGMxICsgMF0pOyAtLSBTY2FsYXJBcnJheU9wRXhwcgorRVhQTEFJ TiAoQ09TVFMgZmFsc2UpIFNFTEVDVCAqIEZST00gZnQxIGZ0IFdIRVJFIGMxID0gKEFSUkFZ W2MxLGMyLDNdKVsxXTsgLS0gQXJyYXlSZWYKKworLS0gPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gcGFy YW1ldGVyaXplZCBxdWVyaWVzCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLSBzaW1wbGUgam9pbgor UFJFUEFSRSBzdDEoaW50LCBpbnQpIEFTIFNFTEVDVCB0MS5jMywgdDIuYzMgRlJPTSBmdDEg dDEsIGZ0MiB0MiBXSEVSRSB0MS5jMSA9ICQxIEFORCB0Mi5jMSA9ICQyOworRVhQTEFJTiAo Q09TVFMgZmFsc2UpIEVYRUNVVEUgc3QxKDEsIDIpOworRVhFQ1VURSBzdDEoMSwgMSk7CitF WEVDVVRFIHN0MSgxMDEsIDEwMSk7CistLSBzdWJxdWVyeSB1c2luZyBzdGFibGUgZnVuY3Rp b24gKGNhbid0IGJlIHB1c2hlZCBkb3duKQorUFJFUEFSRSBzdDIoaW50KSBBUyBTRUxFQ1Qg KiBGUk9NIGZ0MSB0MSBXSEVSRSB0MS5jMSA8ICQyIEFORCB0MS5jMyBJTiAoU0VMRUNUIGMz IEZST00gZnQyIHQyIFdIRVJFIGMxID4gJDEgQU5EIEVYVFJBQ1QoZG93IEZST00gYzQpID0g NikgT1JERVIgQlkgYzE7CitFWFBMQUlOIChDT1NUUyBmYWxzZSkgRVhFQ1VURSBzdDIoMTAs IDIwKTsKK0VYRUNVVEUgc3QyKDEwLCAyMCk7CitFWEVDVVRFIHN0MSgxMDEsIDEwMSk7Cist LSBzdWJxdWVyeSB1c2luZyBpbW11dGFibGUgZnVuY3Rpb24gKGNhbiBiZSBwdXNoZWQgZG93 bikKK1BSRVBBUkUgc3QzKGludCkgQVMgU0VMRUNUICogRlJPTSBmdDEgdDEgV0hFUkUgdDEu YzEgPCAkMiBBTkQgdDEuYzMgSU4gKFNFTEVDVCBjMyBGUk9NIGZ0MiB0MiBXSEVSRSBjMSA+ ICQxIEFORCBFWFRSQUNUKGRvdyBGUk9NIGM1KSA9IDYpIE9SREVSIEJZIGMxOworRVhQTEFJ TiAoQ09TVFMgZmFsc2UpIEVYRUNVVEUgc3QzKDEwLCAyMCk7CitFWEVDVVRFIHN0MygxMCwg MjApOworRVhFQ1VURSBzdDMoMjAsIDMwKTsKKy0tIGN1c3RvbSBwbGFuIHNob3VsZCBiZSBj aG9zZW4KK1BSRVBBUkUgc3Q0KGludCkgQVMgU0VMRUNUICogRlJPTSBmdDEgdDEgV0hFUkUg dDEuYzEgPSAkMTsKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBFWEVDVVRFIHN0NCgxKTsKK0VY UExBSU4gKENPU1RTIGZhbHNlKSBFWEVDVVRFIHN0NCgxKTsKK0VYUExBSU4gKENPU1RTIGZh bHNlKSBFWEVDVVRFIHN0NCgxKTsKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBFWEVDVVRFIHN0 NCgxKTsKK0VYUExBSU4gKENPU1RTIGZhbHNlKSBFWEVDVVRFIHN0NCgxKTsKK0VYUExBSU4g KENPU1RTIGZhbHNlKSBFWEVDVVRFIHN0NCgxKTsKKy0tIGNsZWFudXAKK0RFQUxMT0NBVEUg c3QxOworREVBTExPQ0FURSBzdDI7CitERUFMTE9DQVRFIHN0MzsKK0RFQUxMT0NBVEUgc3Q0 OworCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CistLSBjb25uZWN0aW9uIG1hbmFnZW1lbnQKKy0tID09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KK1NFTEVDVCBzcnZuYW1lLCB1c2VuYW1lIEZST00gcGdzcWxfZmR3X2Nv bm5lY3Rpb25zOworU0VMRUNUIHBnc3FsX2Zkd19kaXNjb25uZWN0KHNydmlkLCB1c2VzeXNp ZCkgRlJPTSBwZ3NxbF9mZHdfZ2V0X2Nvbm5lY3Rpb25zKCk7CitTRUxFQ1Qgc3J2bmFtZSwg dXNlbmFtZSBGUk9NIHBnc3FsX2Zkd19jb25uZWN0aW9uczsKKworLS0gPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQorLS0gY29udmVyc2lvbiBlcnJvcgorLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUxURVIgRk9SRUlH TiBUQUJMRSBmdDEgQUxURVIgQ09MVU1OIGM1IFRZUEUgaW50OworU0VMRUNUICogRlJPTSBm dDEgV0hFUkUgYzEgPSAxOyAgLS0gRVJST1IKK0FMVEVSIEZPUkVJR04gVEFCTEUgZnQxIEFM VEVSIENPTFVNTiBjNSBUWVBFIHRpbWVzdGFtcDsKKworLS0gPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0g c3VidHJhbnNhY3Rpb24KKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0JFR0lOOworREVDTEFSRSBjIENV UlNPUiBGT1IgU0VMRUNUICogRlJPTSBmdDEgT1JERVIgQlkgYzE7CitGRVRDSCBjOworU0FW RVBPSU5UIHM7CitFUlJPUiBPVVQ7ICAgICAgICAgIC0tIEVSUk9SCitST0xMQkFDSyBUTyBz OworU0VMRUNUIHNydm5hbWUgRlJPTSBwZ3NxbF9mZHdfY29ubmVjdGlvbnM7CitGRVRDSCBj OworQ09NTUlUOworU0VMRUNUIHNydm5hbWUgRlJPTSBwZ3NxbF9mZHdfY29ubmVjdGlvbnM7 CitFUlJPUiBPVVQ7ICAgICAgICAgIC0tIEVSUk9SCitTRUxFQ1Qgc3J2bmFtZSBGUk9NIHBn c3FsX2Zkd19jb25uZWN0aW9uczsKKworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gY2xlYW51cAor LS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQorRFJPUCBPUEVSQVRPUiA9PT0gKGludCwgaW50KSBDQVNDQURF OworRFJPUCBPUEVSQVRPUiAhPT0gKGludCwgaW50KSBDQVNDQURFOworRFJPUCBGVU5DVElP TiBwZ3NxbF9mZHdfYWJzKGludCk7CitEUk9QIFNDSEVNQSAiUyAxIiBDQVNDQURFOworRFJP UCBFWFRFTlNJT04gcGdzcWxfZmR3IENBU0NBREU7CitcYworRFJPUCBST0xFIHBnc3FsX2Zk d191c2VyOwpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2NvbnRyaWIuc2dtbCBiL2RvYy9z cmMvc2dtbC9jb250cmliLnNnbWwKaW5kZXggNmIxM2EwYS4uZGZlNGMxYyAxMDA2NDQKLS0t IGEvZG9jL3NyYy9zZ21sL2NvbnRyaWIuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvY29udHJp Yi5zZ21sCkBAIC0xMjksNiArMTI5LDcgQEAgQ1JFQVRFIEVYVEVOU0lPTiA8cmVwbGFjZWFi bGU+bW9kdWxlX25hbWU8Lz4gRlJPTSB1bnBhY2thZ2VkOwogICZwZ2NyeXB0bzsKICAmcGdm cmVlc3BhY2VtYXA7CiAgJnBncm93bG9ja3M7CisgJnBnc3FsLWZkdzsKICAmcGdzdGF0c3Rh dGVtZW50czsKICAmcGdzdGF0dHVwbGU7CiAgJnBndHJnbTsKZGlmZiAtLWdpdCBhL2RvYy9z cmMvc2dtbC9maWxlbGlzdC5zZ21sIGIvZG9jL3NyYy9zZ21sL2ZpbGVsaXN0LnNnbWwKaW5k ZXggODJiOWUzOS4uNjBjMDc3MyAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2ZpbGVsaXN0 LnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2ZpbGVsaXN0LnNnbWwKQEAgLTEyNSw2ICsxMjUs NyBAQAogPCFFTlRJVFkgcGdjcnlwdG8gICAgICAgIFNZU1RFTSAicGdjcnlwdG8uc2dtbCI+ CiA8IUVOVElUWSBwZ2ZyZWVzcGFjZW1hcCAgU1lTVEVNICJwZ2ZyZWVzcGFjZW1hcC5zZ21s Ij4KIDwhRU5USVRZIHBncm93bG9ja3MgICAgICBTWVNURU0gInBncm93bG9ja3Muc2dtbCI+ Cis8IUVOVElUWSBwZ3NxbC1mZHcgICAgICAgU1lTVEVNICJwZ3NxbC1mZHcuc2dtbCI+CiA8 IUVOVElUWSBwZ3N0YW5kYnkgICAgICAgU1lTVEVNICJwZ3N0YW5kYnkuc2dtbCI+CiA8IUVO VElUWSBwZ3N0YXRzdGF0ZW1lbnRzIFNZU1RFTSAicGdzdGF0c3RhdGVtZW50cy5zZ21sIj4K IDwhRU5USVRZIHBnc3RhdHR1cGxlICAgICBTWVNURU0gInBnc3RhdHR1cGxlLnNnbWwiPgpk aWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3Bnc3FsLWZkdy5zZ21sIGIvZG9jL3NyYy9zZ21s L3Bnc3FsLWZkdy5zZ21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVl OWM5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3JjL3NnbWwvcGdzcWwtZmR3LnNnbWwK QEAgLTAsMCArMSwyMzQgQEAKKzwhLS0gZG9jL3NyYy9zZ21sL3Bnc3FsLWZkdy5zZ21sIC0t PgorCis8c2VjdDEgaWQ9InBnc3FsLWZkdyIgeHJlZmxhYmVsPSJwZ3NxbF9mZHciPgorIDx0 aXRsZT5wZ3NxbF9mZHc8L3RpdGxlPgorCisgPGluZGV4dGVybSB6b25lPSJwZ3NxbC1mZHci PgorICA8cHJpbWFyeT5wZ3NxbF9mZHc8L3ByaW1hcnk+CisgPC9pbmRleHRlcm0+CisKKyA8 cGFyYT4KKyAgVGhlIDxmaWxlbmFtZT5wZ3NxbF9mZHc8L2ZpbGVuYW1lPiBtb2R1bGUgcHJv dmlkZXMgYSBmb3JlaWduLWRhdGEgd3JhcHBlciBmb3IKKyAgZXh0ZXJuYWwgPHByb2R1Y3Ru YW1lPlBvc3RncmVTUUw8L3Byb2R1Y3RuYW1lPiBzZXJ2ZXJzLgorICBXaXRoIHRoaXMgbW9k dWxlLCB1c2VycyBjYW4gYWNjZXNzIGRhdGEgc3RvcmVkIGluIGV4dGVybmFsCisgIDxwcm9k dWN0bmFtZT5Qb3N0Z3JlU1FMPC9wcm9kdWN0bmFtZT4gdmlhIHBsYWluIFNRTCBzdGF0ZW1l bnRzLgorIDwvcGFyYT4KKworIDxwYXJhPgorICBOb3RlIHRoYXQgZGVmYXVsdCB3cmFwcGVy IDxsaXRlcmFsPnBnc3FsX2ZkdzwvbGl0ZXJhbD4gaXMgY3JlYXRlZAorICBhdXRvbWF0aWNh bGx5IGR1cmluZyA8Y29tbWFuZD5DUkVBVEUgRVhURU5TSU9OPC9jb21tYW5kPiBjb21tYW5k IGZvcgorICA8YXBwbGljYXRpb24+cGdzcWxfZmR3PC9hcHBsaWNhdGlvbj4uCisgPC9wYXJh PgorCisgPHNlY3QyPgorICA8dGl0bGU+RkRXIE9wdGlvbnMgb2YgcGdzcWxfZmR3PC90aXRs ZT4KKworICA8c2VjdDM+CisgICA8dGl0bGU+Q29ubmVjdGlvbiBPcHRpb25zPC90aXRsZT4K KyAgIDxwYXJhPgorICAgIEEgZm9yZWlnbiBzZXJ2ZXIgYW5kIHVzZXIgbWFwcGluZyBjcmVh dGVkIHVzaW5nIHRoaXMgd3JhcHBlciBjYW4gaGF2ZQorICAgIDxhcHBsaWNhdGlvbj5saWJw cTwvPiBjb25uZWN0aW9uIG9wdGlvbnMsIGV4cGVjdCBiZWxvdzoKKworICAgIDxpdGVtaXpl ZGxpc3Q+CisgICAgIDxsaXN0aXRlbT48cGFyYT5jbGllbnRfZW5jb2Rpbmc8L3BhcmE+PC9s aXN0aXRlbT4KKyAgICAgPGxpc3RpdGVtPjxwYXJhPmZhbGxiYWNrX2FwcGxpY2F0aW9uX25h bWU8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgPGxpc3RpdGVtPjxwYXJhPnJlcGxpY2F0aW9u PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICBGb3IgZGV0 YWlscyBvZiA8YXBwbGljYXRpb24+bGlicHE8Lz4gY29ubmVjdGlvbiBvcHRpb25zLCBzZWUK KyAgICA8eHJlZiBsaW5rZW5kPSJsaWJwcS1jb25uZWN0Ij4uCisgICA8L3BhcmE+CisKKyAg IDxwYXJhPgorICAgIDxsaXRlcmFsPnVzZXI8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5wYXNz d29yZDwvbGl0ZXJhbD4gY2FuIGJlCisgICAgc3BlY2lmaWVkIG9uIHVzZXIgbWFwcGluZ3Ms IGFuZCBvdGhlcnMgY2FuIGJlIHNwZWNpZmllZCBvbiBmb3JlaWduIHNlcnZlcnMuCisgICA8 L3BhcmE+CisgIDwvc2VjdDM+CisKKyAgPHNlY3QzPgorICAgPHRpdGxlPk9iamVjdCBOYW1l IE9wdGlvbnM8L3RpdGxlPgorICAgPHBhcmE+CisgICAgRm9yZWlnbiB0YWJsZXMgd2hpY2gg d2VyZSBjcmVhdGVkIHVzaW5nIHRoaXMgd3JhcHBlciwgb3IgaXRzIGNvbHVtbnMgY2FuCisg ICAgaGF2ZSBvYmplY3QgbmFtZSBvcHRpb25zLiAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUgdXNl ZCB0byBzcGVjaWZ5IHRoZSBuYW1lcworICAgIHVzZWQgaW4gU1FMIHN0YXRlbWVudCBzZW50 IHRvIHJlbW90ZSA8cHJvZHVjdG5hbWU+UG9zdGdyZVNRTDwvcHJvZHVjdG5hbWU+CisgICAg c2VydmVyLiAgVGhlc2Ugb3B0aW9ucyBhcmUgdXNlZnVsIHdoZW4gYSByZW1vdGUgb2JqZWN0 IGhhcyBkaWZmZXJlbnQgbmFtZQorICAgIGZyb20gY29ycmVzcG9uZGluZyBsb2NhbCBvbmUu CisgICA8L3BhcmE+CisKKyAgIDx2YXJpYWJsZWxpc3Q+CisKKyAgICA8dmFybGlzdGVudHJ5 PgorICAgICA8dGVybT48bGl0ZXJhbD5uc3BuYW1lPC9saXRlcmFsPjwvdGVybT4KKyAgICAg PGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgVGhpcyBvcHRpb24sIHdoaWNoIGNh biBiZSBzcGVjaWZpZWQgb24gYSBmb3JlaWduIHRhYmxlLCBpcyB1c2VkIGFzIGEKKyAgICAg ICBuYW1lc3BhY2UgKHNjaGVtYSkgcmVmZXJlbmNlIGluIHRoZSBTUUwgc3RhdGVtZW50LiAg SWYgdGhpcyBvcHRpb25zIGlzCisgICAgICAgb21pdHRlZCwgPGxpdGVyYWw+cGdfY2xhc3Mu bnNwbmFtZTwvbGl0ZXJhbD4gb2YgdGhlIGZvcmVpZ24gdGFibGUgaXMKKyAgICAgICB1c2Vk LgorICAgICAgPC9wYXJhPgorICAgICA8L2xpc3RpdGVtPgorICAgIDwvdmFybGlzdGVudHJ5 PgorCisgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgPHRlcm0+PGxpdGVyYWw+cmVsbmFtZTwv bGl0ZXJhbD48L3Rlcm0+CisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAg IFRoaXMgb3B0aW9uLCB3aGljaCBjYW4gYmUgc3BlY2lmaWVkIG9uIGEgZm9yZWlnbiB0YWJs ZSwgaXMgdXNlZCBhcyBhCisgICAgICAgcmVsYXRpb24gKHRhYmxlKSByZWZlcmVuY2UgaW4g dGhlIFNRTCBzdGF0ZW1lbnQuICBJZiB0aGlzIG9wdGlvbnMgaXMKKyAgICAgICBvbWl0dGVk LCA8bGl0ZXJhbD5wZ19jbGFzcy5yZWxuYW1lPC9saXRlcmFsPiBvZiB0aGUgZm9yZWlnbiB0 YWJsZSBpcworICAgICAgIHVzZWQuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+ CisgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICA8dmFybGlzdGVudHJ5PgorICAgICA8dGVy bT48bGl0ZXJhbD5jb2xuYW1lPC9saXRlcmFsPjwvdGVybT4KKyAgICAgPGxpc3RpdGVtPgor ICAgICAgPHBhcmE+CisgICAgICAgVGhpcyBvcHRpb24sIHdoaWNoIGNhbiBiZSBzcGVjaWZp ZWQgb24gYSBjb2x1bW4gb2YgYSBmb3JlaWduIHRhYmxlLCBpcworICAgICAgIHVzZWQgYXMg YSBjb2x1bW4gKGF0dHJpYnV0ZSkgcmVmZXJlbmNlIGluIHRoZSBTUUwgc3RhdGVtZW50LiAg SWYgdGhpcworICAgICAgIG9wdGlvbiBpcyBvbWl0dGVkLCA8bGl0ZXJhbD5wZ19hdHRyaWJ1 dGUuYXR0bmFtZTwvbGl0ZXJhbD4gb2YgdGhlIGNvbHVtbgorICAgICAgIG9mIHRoZSBmb3Jl aWduIHRhYmxlIGlzIHVzZWQuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+Cisg ICAgPC92YXJsaXN0ZW50cnk+CisKKyAgIDwvdmFyaWFibGVsaXN0PgorCisgIDwvc2VjdDM+ CisKKyA8L3NlY3QyPgorCisgPHNlY3QyPgorICA8dGl0bGU+Q29ubmVjdGlvbiBNYW5hZ2Vt ZW50PC90aXRsZT4KKworICA8cGFyYT4KKyAgIFRoZSA8YXBwbGljYXRpb24+cGdzcWxfZmR3 PC9hcHBsaWNhdGlvbj4gZXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIGEKKyAgIGZvcmVp Z24gc2VydmVyIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IHF1ZXJ5IHdoaWNoIHVz ZXMgYSBmb3JlaWduCisgICB0YWJsZSBhc3NvY2lhdGVkIHRvIHRoZSBmb3JlaWduIHNlcnZl ciwgYW5kIHJldXNlcyB0aGUgY29ubmVjdGlvbiBmb2xsb3dpbmcKKyAgIHF1ZXJpZXMgYW5k IGV2ZW4gaW4gZm9sbG93aW5nIGZvcmVpZ24gc2NhbnMgaW4gc2FtZSBxdWVyeS4KKworICAg WW91IGNhbiBzZWUgdGhlIGxpc3Qgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIHZpYQorICAgPHN0 cnVjdG5hbWU+cGdzcWxfZmR3X2Nvbm5lY3Rpb25zPC9zdHJ1Y3RuYW1lPiB2aWV3LiAgSXQg c2hvd3MgcGFpciBvZiBvaWQKKyAgIGFuZCBuYW1lIG9mIHNlcnZlciBhbmQgbG9jYWwgcm9s ZSBmb3IgZWFjaCBhY3RpdmUgY29ubmVjdGlvbnMgZXN0YWJsaXNoZWQgYnkKKyAgIDxhcHBs aWNhdGlvbj5wZ3NxbF9mZHc8L2FwcGxpY2F0aW9uPi4gIEZvciBzZWN1cml0eSByZWFzb24s IG9ubHkgc3VwZXJ1c2VyCisgICBjYW4gc2VlIG90aGVyIHJvbGUncyBjb25uZWN0aW9ucy4K KyAgPC9wYXJhPgorCisgIDxwYXJhPgorICAgRXN0YWJsaXNoZWQgY29ubmVjdGlvbnMgYXJl IGtlcHQgYWxpdmUgdW50aWwgbG9jYWwgcm9sZSBjaGFuZ2VzIG9yIHRoZQorICAgY3VycmVu dCB0cmFuc2FjdGlvbiBhYm9ydHMgb3IgdXNlciByZXF1ZXN0cyBzby4KKyAgPC9wYXJhPgor CisgIDxwYXJhPgorICAgSWYgcm9sZSBoYXMgYmVlbiBjaGFuZ2VkLCBhY3RpdmUgY29ubmVj dGlvbnMgZXN0YWJsaXNoZWQgYXMgb2xkIGxvY2FsIHJvbGUKKyAgIGlzIGtlcHQgYWxpdmUg YnV0IG5ldmVyIGJlIHJldXNlZCB1bnRpbCBsb2NhbCByb2xlIGhhcyByZXN0b3JlZCB0byBv cmlnaW5hbAorICAgcm9sZS4gIFRoaXMga2luZCBvZiBzaXR1YXRpb24gaGFwcGVucyB3aXRo IDxjb21tYW5kPlNFVCBST0xFPC9jb21tYW5kPiBhbmQKKyAgIDxjb21tYW5kPlNFVCBTRVNT SU9OIEFVVEhPUklaQVRJT048L2NvbW1hbmQ+LgorICA8L3BhcmE+CisKKyAgPHBhcmE+Cisg ICBJZiBjdXJyZW50IHRyYW5zYWN0aW9uIGFib3J0cyBieSBlcnJvciBvciB1c2VyIHJlcXVl c3QsIGFsbCBhY3RpdmUKKyAgIGNvbm5lY3Rpb25zIGFyZSBkaXNjb25uZWN0ZWQgYXV0b21h dGljYWxseS4gIFRoaXMgYmVoYXZpb3IgYXZvaWRzIHBvc3NpYmxlCisgICBjb25uZWN0aW9u IGxlYWtzIG9uIGVycm9yLgorICA8L3BhcmE+CisKKyAgPHBhcmE+CisgICBZb3UgY2FuIGRp c2NhcmQgcGVyc2lzdGVudCBjb25uZWN0aW9uIGF0IGFyYml0cmFyeSB0aW1pbmcgd2l0aAor ICAgPGZ1bmN0aW9uPnBnc3FsX2Zkd19kaXNjb25uZWN0KCk8L2Z1bmN0aW9uPi4gIEl0IHRh a2VzIHNlcnZlciBvaWQgYW5kCisgICB1c2VyIG9pZCBhcyBhcmd1bWVudHMuICBUaGlzIGZ1 bmN0aW9uIGNhbiBoYW5kbGUgb25seSBjb25uZWN0aW9ucworICAgZXN0YWJsaXNoZWQgaW4g Y3VycmVudCBzZXNzaW9uOyBjb25uZWN0aW9ucyBlc3RhYmxpc2hlZCBieSBvdGhlciBiYWNr ZW5kcworICAgYXJlIG5vdCByZWFjaGFibGUuCisgIDwvcGFyYT4KKworICA8cGFyYT4KKyAg IFlvdSBjYW4gZGlzY2FyZCBhbGwgYWN0aXZlIGFuZCB2aXNpYmxlIGNvbm5lY3Rpb25zIGlu IGN1cnJlbnQgc2Vzc2lvbiB3aXRoCisgICB1c2luZyA8c3RydWN0bmFtZT5wZ3NxbF9mZHdf Y29ubmVjdGlvbnM8L3N0cnVjdG5hbWU+IGFuZAorICAgPGZ1bmN0aW9uPnBnc3FsX2Zkd19k aXNjb25uZWN0KCk8L2Z1bmN0aW9uPiB0b2dldGhlcjoKKzxzeW5vcHNpcz4KK3Bvc3RncmVz PSMgU0VMRUNUIHBnc3FsX2Zkd19kaXNjb25uZWN0KHNydmlkLCB1c2VzeXNpZCkgRlJPTSBw Z3NxbF9mZHdfY29ubmVjdGlvbnM7CisgcGdzcWxfZmR3X2Rpc2Nvbm5lY3QKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBPSworIE9LCisoMiByb3dzKQorPC9zeW5vcHNpcz4KKyAgPC9w YXJhPgorIDwvc2VjdDI+CisKKyA8c2VjdDI+CisgIDx0aXRsZT5UcmFuc2FjdGlvbiBNYW5h Z2VtZW50PC90aXRsZT4KKyAgPHBhcmE+CisgICBUaGUgPGFwcGxpY2F0aW9uPnBnc3FsX2Zk dzwvYXBwbGljYXRpb24+IGJlZ2lucyByZW1vdGUgdHJhbnNhY3Rpb24gYXQgdGhlCisgICBi ZWdpbm5pbmcgb2YgYSBsb2NhbCBxdWVyeSwgYW5kIHRlcm1pbmF0ZXMgaXQgd2l0aCA8Y29t bWFuZD5BQk9SVDwvY29tbWFuZD4KKyAgIGF0IHRoZSBlbmQgb2YgdGhlIGxvY2FsIHF1ZXJ5 LiAgVGhpcyBtZWFucyB0aGF0IGFsbCBmb3JlaWduIHNjYW5zIG9uIGEKKyAgIGZvcmVpZ24g c2VydmVyIGluIGEgbG9jYWwgcXVlcnkgYXJlIGV4ZWN1dGVkIGluIG9uZSB0cmFuc2FjdGlv bi4KKyAgIElmIGlzb2xhdGlvbiBsZXZlbCBvZiBsb2NhbCB0cmFuc2FjdGlvbiBpcyA8bGl0 ZXJhbD5TRVJJQUxJWkFCTEU8L2xpdGVyYWw+LAorICAgPGxpdGVyYWw+U0VSSUFMSVpBQkxF PC9saXRlcmFsPiBpcyB1c2VkIGZvciByZW1vdGUgdHJhbnNhY3Rpb24uICBPdGhlcndpc2Us CisgICBpZiBpc29sYXRpb24gbGV2ZWwgb2YgbG9jYWwgdHJhbnNhY3Rpb24gaXMgb25lIG9m CisgICA8bGl0ZXJhbD5SRUFEIFVOQ09NTUlUVEVEPC9saXRlcmFsPiwgPGxpdGVyYWw+UkVB RCBDT01NSVRURUQ8L2xpdGVyYWw+IG9yCisgICA8bGl0ZXJhbD5SRVBFQVRBQkxFIFJFQUQ8 L2xpdGVyYWw+LCB0aGVuIDxsaXRlcmFsPlJFUEVBVEFCTEUgUkVBRDwvbGl0ZXJhbD4KKyAg IGlzIHVzZWQgZm9yIHJlbW90ZSB0cmFuc2FjdGlvbi4KKyAgIDxsaXRlcmFsPlJFQUQgVU5D T01NSVRURUQ8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5SRUFEIENPTU1JVFRFRDwvbGl0ZXJh bD4KKyAgIGFyZSBuZXZlciB1c2VkIGZvciByZW1vdGUgdHJhbnNhY3Rpb24sIGJlY2F1c2Ug ZXZlbgorICAgPGxpdGVyYWw+UkVBRCBDT01NSVRURUQ8L2xpdGVyYWw+IHRyYW5zYWN0aW9u IG1pZ2h0IHByb2R1Y2UgaW5jb25zaXN0ZW50CisgICByZXN1bHRzLCBpZiByZW1vdGUgZGF0 YSBoYXZlIGJlZW4gdXBkYXRlZCBiZXR3ZWVuIHR3byByZW1vdGUgcXVlcmllcy4KKyAgPC9w YXJhPgorICA8cGFyYT4KKyAgIE5vdGUgdGhhdCBldmVuIGlmIHRoZSBpc29sYXRpb24gbGV2 ZWwgb2YgbG9jYWwgdHJhbnNhY3Rpb24gd2FzCisgICA8bGl0ZXJhbD5TRVJJQUxJWkFCTEU8 L2xpdGVyYWw+IG9yIDxsaXRlcmFsPlJFUEVBVEFCTEUgUkVBRDwvbGl0ZXJhbD4sCisgICBz ZXJpZXMgb2Ygb25lIHF1ZXJ5IG1pZ2h0IHByb2R1Y2UgZGlmZmVyZW50IHJlc3VsdCwgYmVj YXVzZSBmb3JlaWduIHNjYW5zCisgICBpbiBkaWZmZXJlbnQgbG9jYWwgcXVlcmllcyBhcmUg ZXhlY3V0ZWQgaW4gZGlmZmVyZW50IHJlbW90ZSB0cmFuc2FjdGlvbnMuCisgICBGb3IgaW5z dGFuY2UsIHdoZW4gY2xpZW50IHN0YXJ0ZWQgYSBsb2NhbCB0cmFuc2FjdGlvbgorICAgZXhw bGljaXRseSB3aXRoIGlzb2xhdGlvbiBsZXZlbCA8bGl0ZXJhbD5TRVJJQUxJWkFCTEU8L2xp dGVyYWw+LCBhbmQKKyAgIGV4ZWN1dGVkIHNhbWUgbG9jYWwgcXVlcnkgd2hpY2ggY29udGFp bnMgYSBmb3JlaWduIHRhYmxlIHdoaWNoIHJlZmVyZW5jZXMKKyAgIGZvcmVpZ24gZGF0YSB3 aGljaCBpcyB1cGRhdGVkIGZyZXF1ZW50bHksIGxhdHRlciByZXN1bHQgd291bGQgYmUgZGlm ZmVyZW50CisgICBmcm9tIGZvcm1lciByZXN1bHQuCisgIDwvcGFyYT4KKyAgPHBhcmE+Cisg ICBUaGlzIHJlc3RyaWN0aW9uIG1pZ2h0IGJlIHJlbGF4ZWQgaW4gZnV0dXJlIHJlbGVhc2Uu CisgIDwvcGFyYT4KKyA8L3NlY3QyPgorCisgPHNlY3QyPgorICA8dGl0bGU+RXN0aW1hdGlv biBvZiBDb3N0cyBhbmQgUm93czwvdGl0bGU+CisgIDxwYXJhPgorICAgVGhlIDxhcHBsaWNh dGlvbj5wZ3NxbF9mZHc8L2FwcGxpY2F0aW9uPiBlc3RpbWF0ZXMgdGhlIGNvc3RzIG9mIGEg Zm9yZWlnbgorICAgc2NhbiBieSBhZGRpbmcgdXAgc29tZSBiYXNpYyBjb3N0czogIGNvbm5l Y3Rpb24gY29zdHMsIHJlbW90ZSBxdWVyeSBjb3N0cworICAgYW5kIGRhdGEgdHJhbnNmZXIg Y29zdHMuCisgICBUbyBnZXQgcmVtb3RlIHF1ZXJ5IGNvc3RzLCA8YXBwbGljYXRpb24+cGdz cWxfZmR3PC9hcHBsaWNhdGlvbj4gZXhlY3V0ZXMKKyAgIDxjb21tYW5kPkVYUExBSU48L2Nv bW1hbmQ+IGNvbW1hbmQgb24gcmVtb3RlIHNlcnZlciBmb3IgZWFjaCBmb3JlaWduIHNjYW4u CisgIDwvcGFyYT4KKyAgPHBhcmE+CisgICBPbiB0aGUgb3RoZXIgaGFuZCwgZXN0aW1hdGVk IHJvd3Mgd2hpY2ggd2FzIHJldHVybmVkIGJ5CisgICA8Y29tbWFuZD5FWFBMQUlOPC9jb21t YW5kPiBpcyB1c2VkIGZvciBsb2NhbCBlc3RpbWF0aW9uIGFzLWlzLgorICA8L3BhcmE+Cisg PC9zZWN0Mj4KKworIDxzZWN0Mj4KKyAgPHRpdGxlPkVYUExBSU4gT3V0cHV0PC90aXRsZT4K KyAgPHBhcmE+CisgICBGb3IgYSBmb3JlaWduIHRhYmxlIHVzaW5nIDxsaXRlcmFsPnBnc3Fs X2ZkdzwvPiwgPGNvbW1hbmQ+RVhQTEFJTjwvPiBzaG93cworICAgYSByZW1vdGUgU1FMIHN0 YXRlbWVudCB3aGljaCBpcyBzZW50IHRvIHJlbW90ZQorICAgPHByb2R1Y3RuYW1lPlBvc3Rn cmVTUUw8L3Byb2R1Y3RuYW1lPiBzZXJ2ZXIgZm9yIGEgRm9yZWlnblNjYW4gcGxhbiBub2Rl LgorICAgIEZvciBleGFtcGxlOgorICA8L3BhcmE+Cis8c3lub3BzaXM+Citwb3N0Z3Jlcz0j IEVYUExBSU4gU0VMRUNUIGFpZCBGUk9NIHBnYmVuY2hfYWNjb3VudHMgV0hFUkUgYWJhbGFu Y2UgPCAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZvcmVpZ24gU2NhbiBv biBwZ2JlbmNoX2FjY291bnRzICAoY29zdD0xMDAuMDAuLjgxMDUuMTMgcm93cz0zMDI2MTMg d2lkdGg9OCkKKyAgIEZpbHRlcjogKGFiYWxhbmNlIDwgMCkKKyAgIFJlbW90ZSBTUUw6IFNF TEVDVCBhaWQsIE5VTEwsIGFiYWxhbmNlLCBOVUxMIEZST00gcHVibGljLnBnYmVuY2hfYWNj b3VudHMKKygzIHJvd3MpCis8L3N5bm9wc2lzPgorIDwvc2VjdDI+CisKKyA8c2VjdDI+Cisg IDx0aXRsZT5BdXRob3I8L3RpdGxlPgorICA8cGFyYT4KKyAgIFNoaWdlcnUgSGFuYWRhIDxl bWFpbD5zaGlnZXJ1LmhhbmFkYUBnbWFpbC5jb208L2VtYWlsPgorICA8L3BhcmE+CisgPC9z ZWN0Mj4KKworPC9zZWN0MT4K --------------000707040002070205070603--