From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa3.mentor.iphmx.com (esa3.mentor.iphmx.com [68.232.137.180]) by sourceware.org (Postfix) with ESMTPS id 593323858C5F for ; Thu, 9 Feb 2023 20:13:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 593323858C5F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.97,284,1669104000"; d="scan'208";a="96245387" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 09 Feb 2023 12:13:54 -0800 IronPort-SDR: eiyqkaiNbiDcf2rrBjW2ZXq6/hwlG3YNWRDy1XnNoaCSnLK3E/SYYSoyYcOoeX1+zcFXpemrHx 53q7gd+8RbW2/a+kRdMUTdWtwgo9BKWfXJ/Wy5hBygZJrpotK3FWHbUAMkfTE3jNGD1gnN4ZFU DMcM9lUS/FZ2j39qG9yYse23XfuSpCj8WmxNam5EtZmKv1TTuQYfJRvS4440RiRLpGHogint6/ hrSE50CRzCJXaaascrVKEQL12bBcTcwquYj5TcgOuFvqDWSADJTM+qNpfd19yaEBK0j6Wt8OMo 2Pc= Content-Type: multipart/mixed; boundary="------------D8YZw8y3JQezB3wYX07OCBpP" Message-ID: Date: Thu, 9 Feb 2023 20:13:43 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Content-Language: en-US To: GCC Patches From: Andrew Jenner Subject: [PATCH] amdgcn: Add instruction patterns for vector operations on complex numbers X-ClientProxiedBy: SVR-ORW-MBX-09.mgc.mentorg.com (147.34.90.209) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,KAM_SHORT,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------D8YZw8y3JQezB3wYX07OCBpP Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit This patch introduces instruction patterns for complex number operations in the GCN machine description. These patterns are cmul, cmul_conj, vec_addsub, vec_fmaddsub, vec_fmsubadd, cadd90, cadd270, cmla and cmls (cmla_conj and cmls_conj were not found to be favorable to implement). As a side effect of adding cmls, I also added fms patterns corresponding to the existing fma patterns. Tested on CDNA2 GFX90a. OK to commit? gcc/ChangeLog: * config/gcn/gcn-protos.h (gcn_expand_dpp_swap_pairs_insn) (gcn_expand_dpp_distribute_even_insn) (gcn_expand_dpp_distribute_odd_insn): Declare. * config/gcn/gcn-valu.md (@dpp_swap_pairs) (@dpp_distribute_even, @dpp_distribute_odd) (cmul3, cml4, vec_addsub3) (cadd3, vec_fmaddsub4, vec_fmsubadd4) (fms4, fms4_negop2, fms4) (fms4_negop2): New patterns. * config/gcn/gcn.cc (gcn_expand_dpp_swap_pairs_insn) (gcn_expand_dpp_distribute_even_insn) (gcn_expand_dpp_distribute_odd_insn): New functions. * config/gcn/gcn.md: Add entries to unspec enum. gcc/testsuite/ChangeLog: * gcc.target/gcn/complex.c: New test. --------------D8YZw8y3JQezB3wYX07OCBpP Content-Type: text/plain; charset="UTF-8"; name="complex.patch" Content-Disposition: attachment; filename="complex.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvZ2NuL2djbi1wcm90b3MuaCBiL2djYy9jb25maWcv Z2NuL2djbi1wcm90b3MuaAppbmRleCA4NjEwNDRlNzdmMC4uZDc4NjJiMjFhMmEgMTAwNjQ0 Ci0tLSBhL2djYy9jb25maWcvZ2NuL2djbi1wcm90b3MuaAorKysgYi9nY2MvY29uZmlnL2dj bi9nY24tcHJvdG9zLmgKQEAgLTI3LDYgKzI3LDExIEBAIGV4dGVybiB1bnNpZ25lZCBpbnQg Z2NuX2R3YXJmX3JlZ2lzdGVyX251bWJlciAodW5zaWduZWQgaW50IHJlZ25vKTsKIGV4dGVy biBydHggZ2V0X2V4ZWMgKGludDY0X3QpOwogZXh0ZXJuIHJ0eCBnZXRfZXhlYyAobWFjaGlu ZV9tb2RlIG1vZGUpOwogZXh0ZXJuIGNoYXIgKiBnY25fZXhwYW5kX2RwcF9zaHJfaW5zbiAo bWFjaGluZV9tb2RlLCBjb25zdCBjaGFyICosIGludCwgaW50KTsKK2V4dGVybiBjaGFyICog Z2NuX2V4cGFuZF9kcHBfc3dhcF9wYWlyc19pbnNuIChtYWNoaW5lX21vZGUsIGNvbnN0IGNo YXIgKiwgaW50KTsKK2V4dGVybiBjaGFyICogZ2NuX2V4cGFuZF9kcHBfZGlzdHJpYnV0ZV9l dmVuX2luc24gKG1hY2hpbmVfbW9kZSwgY29uc3QgY2hhciAqLAorCQkJCQkJICAgaW50IHVu c3BlYyk7CitleHRlcm4gY2hhciAqIGdjbl9leHBhbmRfZHBwX2Rpc3RyaWJ1dGVfb2RkX2lu c24gKG1hY2hpbmVfbW9kZSwgY29uc3QgY2hhciAqLAorCQkJCQkJICBpbnQgdW5zcGVjKTsK IGV4dGVybiB2b2lkIGdjbl9leHBhbmRfZXBpbG9ndWUgKCk7CiBleHRlcm4gcnR4IGdjbl9l eHBhbmRfc2NhbGVkX29mZnNldHMgKGFkZHJfc3BhY2VfdCBhcywgcnR4IGJhc2UsIHJ0eCBv ZmZzZXRzLAogCQkJCSAgICAgIHJ0eCBzY2FsZSwgYm9vbCB1bnNpZ25lZF9wLCBydHggZXhl Yyk7CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2djbi9nY24tdmFsdS5tZCBiL2djYy9jb25m aWcvZ2NuL2djbi12YWx1Lm1kCmluZGV4IDQ3ZDlkODdkNThhLi5jYjY1MGJjYTNmZiAxMDA2 NDQKLS0tIGEvZ2NjL2NvbmZpZy9nY24vZ2NuLXZhbHUubWQKKysrIGIvZ2NjL2NvbmZpZy9n Y24vZ2NuLXZhbHUubWQKQEAgLTEyMjQsNiArMTIyNCw0NSBAQAogICBbKHNldF9hdHRyICJ0 eXBlIiAidm9wX2RwcCIpCiAgICAoc2V0X2F0dHIgImxlbmd0aCIgIjE2IildKQogCisoZGVm aW5lX2luc24gIkBkcHBfc3dhcF9wYWlyczxtb2RlPiIKKyAgWyhzZXQgKG1hdGNoX29wZXJh bmQ6Vl9ub0hJIDAgInJlZ2lzdGVyX29wZXJhbmQiICAgICI9diIpCisJKHVuc3BlYzpWX25v SEkKKwkgIFsobWF0Y2hfb3BlcmFuZDpWX25vSEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiB2 IildCisJICBVTlNQRUNfTU9WX0RQUF9TV0FQX1BBSVJTKSldCisgICIiCisgIHsKKyAgICBy ZXR1cm4gZ2NuX2V4cGFuZF9kcHBfc3dhcF9wYWlyc19pbnNuICg8TU9ERT5tb2RlLCAidl9t b3ZfYjMyIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOU1BFQ19N T1ZfRFBQX1NXQVBfUEFJUlMpOworICB9CisgIFsoc2V0X2F0dHIgInR5cGUiICJ2b3BfZHBw IikKKyAgIChzZXRfYXR0ciAibGVuZ3RoIiAiMTYiKV0pCisKKyhkZWZpbmVfaW5zbiAiQGRw cF9kaXN0cmlidXRlX2V2ZW48bW9kZT4iCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZfbm9I SSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAgICAiPXYiKQorCSh1bnNwZWM6Vl9ub0hJCisJICBb KG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDEgInJlZ2lzdGVyX29wZXJhbmQiICIgdiIpXQorCSAg VU5TUEVDX01PVl9EUFBfRElTVFJJQlVURV9FVkVOKSldCisgICIiCisgIHsKKyAgICByZXR1 cm4gZ2NuX2V4cGFuZF9kcHBfZGlzdHJpYnV0ZV9ldmVuX2luc24gKDxNT0RFPm1vZGUsICJ2 X21vdl9iMzIiLAorCQkJCQkJVU5TUEVDX01PVl9EUFBfRElTVFJJQlVURV9FVkVOKTsKKyAg fQorICBbKHNldF9hdHRyICJ0eXBlIiAidm9wX2RwcCIpCisgICAoc2V0X2F0dHIgImxlbmd0 aCIgIjE2IildKQorCisoZGVmaW5lX2luc24gIkBkcHBfZGlzdHJpYnV0ZV9vZGQ8bW9kZT4i CisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZfbm9ISSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAg ICAiPXYiKQorCSh1bnNwZWM6Vl9ub0hJCisJICBbKG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDEg InJlZ2lzdGVyX29wZXJhbmQiICIgdiIpXQorCSAgVU5TUEVDX01PVl9EUFBfRElTVFJJQlVU RV9FVkVOKSldCisgICIiCisgIHsKKyAgICByZXR1cm4gZ2NuX2V4cGFuZF9kcHBfZGlzdHJp YnV0ZV9vZGRfaW5zbiAoPE1PREU+bW9kZSwgInZfbW92X2IzMiIsCisJCQkJCSAgICAgICBV TlNQRUNfTU9WX0RQUF9ESVNUUklCVVRFX09ERCk7CisgIH0KKyAgWyhzZXRfYXR0ciAidHlw ZSIgInZvcF9kcHAiKQorICAgKHNldF9hdHRyICJsZW5ndGgiICIxNiIpXSkKKwogOzsgfX19 CiA7OyB7e3sgQUxVIHNwZWNpYWwgY2FzZTogYWRkL3N1YgogCkBAIC0yMTg1LDYgKzIyMjQs MTk0IEBACiAgICAgRE9ORTsKICAgfSkKIAorKGRlZmluZV9pbnRfaXRlcmF0b3IgVU5TUEVD X0NNVUxfT1AgW1VOU1BFQ19DTVVMIFVOU1BFQ19DTVVMX0NPTkpdKQorKGRlZmluZV9pbnRf YXR0ciBjb25qX29wIFsoVU5TUEVDX0NNVUwgIiIpIChVTlNQRUNfQ01VTF9DT05KICJfY29u aiIpXSkKKyhkZWZpbmVfaW50X2F0dHIgY211bF9zdWJhZGQgWyhVTlNQRUNfQ01VTCAic3Vi IikgKFVOU1BFQ19DTVVMX0NPTkogImFkZCIpXSkKKyhkZWZpbmVfaW50X2F0dHIgY211bF9h ZGRzdWIgWyhVTlNQRUNfQ01VTCAiYWRkIikgKFVOU1BFQ19DTVVMX0NPTkogInN1YiIpXSkK KworKGRlZmluZV9leHBhbmQgImNtdWw8Y29ual9vcD48bW9kZT4zIgorICBbKHNldCAobWF0 Y2hfb3BlcmFuZDpWX25vSEkgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj0gJnYiKQorICAgICAg ICAodW5zcGVjOlZfbm9ISQorCSAgWyhtYXRjaF9vcGVyYW5kOlZfbm9ISSAxICJyZWdpc3Rl cl9vcGVyYW5kIiAidiIpCisJICAgKG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDIgInJlZ2lzdGVy X29wZXJhbmQiICJ2IildCisJICBVTlNQRUNfQ01VTF9PUCkpXQorICAiIgorICB7CisgICAg Ly8gb3BlcmFuZHNbMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGEgICBiCisgICAgLy8gb3BlcmFuZHNbMl0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgICBkCisgICAgcnR4IHQxID0gZ2Vu X3JlZ19ydHggKDxNT0RFPm1vZGUpOworICAgIGVtaXRfaW5zbiAoZ2VuX211bDxtb2RlPjMg KHQxLCBvcGVyYW5kc1sxXSwgb3BlcmFuZHNbMl0pKTsgICAvLyBhKmMgYipkCisKKyAgICBy dHggczJfcGVybSA9IGdlbl9yZWdfcnR4ICg8TU9ERT5tb2RlKTsKKyAgICBlbWl0X2luc24g KGdlbl9kcHBfc3dhcF9wYWlyczxtb2RlPiAoczJfcGVybSwgb3BlcmFuZHNbMl0pKTsgLy8g ZCAgIGMKKworICAgIHJ0eCB0MiA9IGdlbl9yZWdfcnR4ICg8TU9ERT5tb2RlKTsKKyAgICBl bWl0X2luc24gKGdlbl9tdWw8bW9kZT4zICh0Miwgb3BlcmFuZHNbMV0sIHMyX3Blcm0pKTsg ICAgICAgLy8gYSpkIGIqYworCisgICAgcnR4IHQxX3Blcm0gPSBnZW5fcmVnX3J0eCAoPE1P REU+bW9kZSk7CisgICAgZW1pdF9pbnNuIChnZW5fZHBwX3N3YXBfcGFpcnM8bW9kZT4gKHQx X3Blcm0sIHQxKSk7ICAgICAgICAgIC8vIGIqZCBhKmMKKworICAgIHJ0eCBldmVuID0gZ2Vu X3J0eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcpOworICAgIGVtaXRfbW92ZV9pbnNuIChldmVu LCBnZXRfZXhlYyAoMHg1NTU1NTU1NTU1NTU1NTU1VUwpKTsKKyAgICBydHggZGVzdCA9IG9w ZXJhbmRzWzBdOworICAgIGVtaXRfaW5zbiAoZ2VuXzxjbXVsX3N1YmFkZD48bW9kZT4zX2V4 ZWMgKGRlc3QsIHQxLCB0MV9wZXJtLCBkZXN0LCBldmVuKSk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSpjLWIq ZCAwCisKKyAgICBydHggdDJfcGVybSA9IGdlbl9yZWdfcnR4ICg8TU9ERT5tb2RlKTsKKyAg ICBlbWl0X2luc24gKGdlbl9kcHBfc3dhcF9wYWlyczxtb2RlPiAodDJfcGVybSwgdDIpKTsg ICAgICAgICAgLy8gYipjIGEqZAorCisgICAgcnR4IG9kZCA9IGdlbl9ydHhfUkVHIChESW1v ZGUsIEVYRUNfUkVHKTsKKyAgICBlbWl0X21vdmVfaW5zbiAob2RkLCBnZXRfZXhlYyAoMHhh YWFhYWFhYWFhYWFhYWFhVUwpKTsKKyAgICBlbWl0X2luc24gKGdlbl88Y211bF9hZGRzdWI+ PG1vZGU+M19leGVjIChkZXN0LCB0MiwgdDJfcGVybSwgZGVzdCwgb2RkKSk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLy8gMCBhKmQrYipjCisgICAgRE9ORTsKKyAgfSkKKworKGRlZmluZV9jb2RlX2l0 ZXJhdG9yIGFkZHN1YiBbcGx1cyBtaW51c10pCisoZGVmaW5lX2NvZGVfYXR0ciBhZGRzdWJf YXMgWyhwbHVzICJhIikgKG1pbnVzICJzIildKQorCisoZGVmaW5lX2V4cGFuZCAiY21sPGFk ZHN1Yl9hcz48bW9kZT40IgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWX0ZQIDAgInJlZ2lz dGVyX29wZXJhbmQiICI9ICZ2IikKKwkoYWRkc3ViOlZfRlAKKwkgICh1bnNwZWM6Vl9GUAor CSAgICBbKG1hdGNoX29wZXJhbmQ6Vl9GUCAxICJyZWdpc3Rlcl9vcGVyYW5kIiAidiIpCisJ ICAgICAobWF0Y2hfb3BlcmFuZDpWX0ZQIDIgInJlZ2lzdGVyX29wZXJhbmQiICJ2IildCisJ ICAgIFVOU1BFQ19DTVVMKQorCSAgKG1hdGNoX29wZXJhbmQ6Vl9GUCAzICJyZWdpc3Rlcl9v cGVyYW5kIiAidiIpKSldCisgICIiCisgIHsKKyAgICBydHggYSA9IGdlbl9yZWdfcnR4ICg8 TU9ERT5tb2RlKTsKKyAgICBlbWl0X2luc24gKGdlbl9kcHBfZGlzdHJpYnV0ZV9ldmVuPG1v ZGU+IChhLCBvcGVyYW5kc1sxXSkpOyAgICAvLyBhICAgYQorCisgICAgcnR4IHQxID0gZ2Vu X3JlZ19ydHggKDxNT0RFPm1vZGUpOworICAgIGVtaXRfaW5zbiAoZ2VuX2ZtPGFkZHN1Yl9h cz48bW9kZT40ICh0MSwgYSwgb3BlcmFuZHNbMl0sIG9wZXJhbmRzWzNdKSk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLy8gYSpjIGEqZAorCisgICAgcnR4IGIgPSBnZW5fcmVnX3J0eCAoPE1PREU+bW9k ZSk7CisgICAgZW1pdF9pbnNuIChnZW5fZHBwX2Rpc3RyaWJ1dGVfb2RkPG1vZGU+IChiLCBv cGVyYW5kc1sxXSkpOyAgICAgLy8gYiAgIGIKKworICAgIHJ0eCB0MiA9IGdlbl9yZWdfcnR4 ICg8TU9ERT5tb2RlKTsKKyAgICBlbWl0X2luc24gKGdlbl9tdWw8bW9kZT4zICh0MiwgYiwg b3BlcmFuZHNbMl0pKTsgICAgICAgICAgICAgICAvLyBiKmMgYipkCisKKyAgICBydHggdDJf cGVybSA9IGdlbl9yZWdfcnR4ICg8TU9ERT5tb2RlKTsKKyAgICBlbWl0X2luc24gKGdlbl9k cHBfc3dhcF9wYWlyczxtb2RlPiAodDJfcGVybSwgdDIpKTsgICAgICAgICAgICAvLyBiKmQg YipjCisKKyAgICBydHggZXZlbiA9IGdlbl9ydHhfUkVHIChESW1vZGUsIEVYRUNfUkVHKTsK KyAgICBlbWl0X21vdmVfaW5zbiAoZXZlbiwgZ2V0X2V4ZWMgKDB4NTU1NTU1NTU1NTU1NTU1 NVVMKSk7CisgICAgcnR4IGRlc3QgPSBvcGVyYW5kc1swXTsKKyAgICBlbWl0X2luc24gKGdl bl9zdWI8bW9kZT4zX2V4ZWMgKGRlc3QsIHQxLCB0Ml9wZXJtLCBkZXN0LCBldmVuKSk7CisK KyAgICBydHggb2RkID0gZ2VuX3J0eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcpOworICAgIGVt aXRfbW92ZV9pbnNuIChvZGQsIGdldF9leGVjICgweGFhYWFhYWFhYWFhYWFhYWFVTCkpOwor ICAgIGVtaXRfaW5zbiAoZ2VuX2FkZDxtb2RlPjNfZXhlYyAoZGVzdCwgdDEsIHQyX3Blcm0s IGRlc3QsIG9kZCkpOworCisgICAgRE9ORTsKKyAgfSkKKworKGRlZmluZV9leHBhbmQgInZl Y19hZGRzdWI8bW9kZT4zIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWX25vSEkgMCAicmVn aXN0ZXJfb3BlcmFuZCIgIj0gJnYiKQorICAgICAgICAodmVjX21lcmdlOlZfbm9ISQorICAg ICAgICAgIChtaW51czpWX25vSEkKKyAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlZfbm9I SSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAidiIpCisgICAgICAgICAgICAobWF0Y2hfb3BlcmFu ZDpWX25vSEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInYiKSkKKyAgICAgICAgICAocGx1czpW X25vSEkgKG1hdGNoX2R1cCAxKSAobWF0Y2hfZHVwIDIpKQorICAgICAgICAgIChjb25zdF9p bnQgNjE0ODkxNDY5MTIzNjUxNzIwNSkpKV0KKyAgIiIKKyAgeworICAgIHJ0eCBldmVuID0g Z2VuX3J0eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcpOworICAgIGVtaXRfbW92ZV9pbnNuIChl dmVuLCBnZXRfZXhlYyAoMHg1NTU1NTU1NTU1NTU1NTU1VUwpKTsKKyAgICBydHggZGVzdCA9 IG9wZXJhbmRzWzBdOworICAgIHJ0eCB4ID0gb3BlcmFuZHNbMV07CisgICAgcnR4IHkgPSBv cGVyYW5kc1syXTsKKyAgICBlbWl0X2luc24gKGdlbl9zdWI8bW9kZT4zX2V4ZWMgKGRlc3Qs IHgsIHksIGRlc3QsIGV2ZW4pKTsKKyAgICBydHggb2RkID0gZ2VuX3J0eF9SRUcgKERJbW9k ZSwgRVhFQ19SRUcpOworICAgIGVtaXRfbW92ZV9pbnNuIChvZGQsIGdldF9leGVjICgweGFh YWFhYWFhYWFhYWFhYWFVTCkpOworICAgIGVtaXRfaW5zbiAoZ2VuX2FkZDxtb2RlPjNfZXhl YyAoZGVzdCwgeCwgeSwgZGVzdCwgb2RkKSk7CisKKyAgICBET05FOworICB9KQorCisoZGVm aW5lX2ludF9pdGVyYXRvciBDQUREIFtVTlNQRUNfQ0FERDkwIFVOU1BFQ19DQUREMjcwXSkK KyhkZWZpbmVfaW50X2F0dHIgcm90IFsoVU5TUEVDX0NBREQ5MCAiOTAiKSAoVU5TUEVDX0NB REQyNzAgIjI3MCIpXSkKKyhkZWZpbmVfaW50X2F0dHIgY2FkZF9zdWJhZGQgWyhVTlNQRUNf Q0FERDkwICJzdWIiKSAoVU5TUEVDX0NBREQyNzAgImFkZCIpXSkKKyhkZWZpbmVfaW50X2F0 dHIgY2FkZF9hZGRzdWIgWyhVTlNQRUNfQ0FERDkwICJhZGQiKSAoVU5TUEVDX0NBREQyNzAg InN1YiIpXSkKKworKGRlZmluZV9leHBhbmQgImNhZGQ8cm90Pjxtb2RlPjMiCisgIFsoc2V0 IChtYXRjaF9vcGVyYW5kOlZfbm9ISSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPSZ2IikKKyAg ICAgICAgKHVuc3BlYzpWX25vSEkgWyhtYXRjaF9vcGVyYW5kOlZfbm9ISSAxICJyZWdpc3Rl cl9vcGVyYW5kIiAidiIpCisgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hfb3BlcmFu ZDpWX25vSEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInYiKV0KKyAgICAgICAgICAgICAgICAg ICAgICAgIENBREQpKV0KKyAgIiIKKyAgeworICAgIHJ0eCBkZXN0ID0gb3BlcmFuZHNbMF07 CisgICAgcnR4IHggPSBvcGVyYW5kc1sxXTsKKyAgICBydHggeSA9IGdlbl9yZWdfcnR4ICg8 TU9ERT5tb2RlKTsKKyAgICBlbWl0X2luc24gKGdlbl9kcHBfc3dhcF9wYWlyczxtb2RlPiAo eSwgb3BlcmFuZHNbMl0pKTsKKworICAgIHJ0eCBldmVuID0gZ2VuX3J0eF9SRUcgKERJbW9k ZSwgRVhFQ19SRUcpOworICAgIGVtaXRfbW92ZV9pbnNuIChldmVuLCBnZXRfZXhlYyAoMHg1 NTU1NTU1NTU1NTU1NTU1VUwpKTsKKyAgICBlbWl0X2luc24gKGdlbl88Y2FkZF9zdWJhZGQ+ PG1vZGU+M19leGVjIChkZXN0LCB4LCB5LCBkZXN0LCBldmVuKSk7CisgICAgcnR4IG9kZCA9 IGdlbl9ydHhfUkVHIChESW1vZGUsIEVYRUNfUkVHKTsKKyAgICBlbWl0X21vdmVfaW5zbiAo b2RkLCBnZXRfZXhlYyAoMHhhYWFhYWFhYWFhYWFhYWFhVUwpKTsKKyAgICBlbWl0X2luc24g KGdlbl88Y2FkZF9hZGRzdWI+PG1vZGU+M19leGVjIChkZXN0LCB4LCB5LCBkZXN0LCBvZGQp KTsKKworICAgIERPTkU7CisgIH0pCisKKzs7IEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHJl cHJlc2VudCB0aGVzZSB3aXRob3V0IHRoZSBVTlNQRUMgYXMKKzs7Cis7OyAodmVjX21lcmdl Cis7OyAgIChmbWEgb3AxIG9wMiBvcDMpCis7OyAgIChmbWEgb3AxIG9wMiAobmVnIG9wMykp Cis7OyAgIChtZXJnZS1jb25zdCkpCis7OworOzsgQnV0IHRoaXMgZG9lc24ndCBzZWVtIHVz ZWZ1bCBpbiBwcmFjdGljZS4KKworKGRlZmluZV9leHBhbmQgInZlY19mbWFkZHN1Yjxtb2Rl PjQiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZfbm9ISSAwICJyZWdpc3Rlcl9vcGVyYW5k IiAiPSZ2IikKKyAgICAgICAgKHVuc3BlYzpWX25vSEkKKyAgICAgICAgICBbKG1hdGNoX29w ZXJhbmQ6Vl9ub0hJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJ2IikKKyAgICAgICAgICAgKG1h dGNoX29wZXJhbmQ6Vl9ub0hJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJ2IikKKyAgICAgICAg ICAgKG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDMgInJlZ2lzdGVyX29wZXJhbmQiICJ2IildCisg ICAgICAgICAgVU5TUEVDX0ZNQUREU1VCKSldCisgICIiCisgIHsKKyAgICBydHggdDEgPSBn ZW5fcmVnX3J0eCAoPE1PREU+bW9kZSk7CisgICAgZW1pdF9pbnNuIChnZW5fbXVsPG1vZGU+ MyAodDEsIG9wZXJhbmRzWzFdLCBvcGVyYW5kc1syXSkpOworICAgIHJ0eCBldmVuID0gZ2Vu X3J0eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcpOworICAgIGVtaXRfbW92ZV9pbnNuIChldmVu LCBnZXRfZXhlYyAoMHg1NTU1NTU1NTU1NTU1NTU1VUwpKTsKKyAgICBydHggZGVzdCA9IG9w ZXJhbmRzWzBdOworICAgIGVtaXRfaW5zbiAoZ2VuX3N1Yjxtb2RlPjNfZXhlYyAoZGVzdCwg dDEsIG9wZXJhbmRzWzNdLCBkZXN0LCBldmVuKSk7CisgICAgcnR4IG9kZCA9IGdlbl9ydHhf UkVHIChESW1vZGUsIEVYRUNfUkVHKTsKKyAgICBlbWl0X21vdmVfaW5zbiAob2RkLCBnZXRf ZXhlYyAoMHhhYWFhYWFhYWFhYWFhYWFhVUwpKTsKKyAgICBlbWl0X2luc24gKGdlbl9hZGQ8 bW9kZT4zX2V4ZWMgKGRlc3QsIHQxLCBvcGVyYW5kc1szXSwgZGVzdCwgb2RkKSk7CisKKyAg ICBET05FOworICB9KQorCisoZGVmaW5lX2V4cGFuZCAidmVjX2Ztc3ViYWRkPG1vZGU+NCIK KyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6Vl9ub0hJIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9 JnYiKQorICAgICAgICAodW5zcGVjOlZfbm9ISQorICAgICAgICAgIFsobWF0Y2hfb3BlcmFu ZDpWX25vSEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInYiKQorICAgICAgICAgICAobWF0Y2hf b3BlcmFuZDpWX25vSEkgMiAicmVnaXN0ZXJfb3BlcmFuZCIgInYiKQorICAgICAgICAgICAo bmVnOlZfbm9ISQorICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlZfbm9ISSAzICJyZWdp c3Rlcl9vcGVyYW5kIiAidiIpKV0KKyAgICAgICAgICBVTlNQRUNfRk1BRERTVUIpKV0KKyAg IiIKKyAgeworICAgIHJ0eCB0MSA9IGdlbl9yZWdfcnR4ICg8TU9ERT5tb2RlKTsKKyAgICBl bWl0X2luc24gKGdlbl9tdWw8bW9kZT4zICh0MSwgb3BlcmFuZHNbMV0sIG9wZXJhbmRzWzJd KSk7CisgICAgcnR4IGV2ZW4gPSBnZW5fcnR4X1JFRyAoREltb2RlLCBFWEVDX1JFRyk7Cisg ICAgZW1pdF9tb3ZlX2luc24gKGV2ZW4sIGdldF9leGVjICgweDU1NTU1NTU1NTU1NTU1NTVV TCkpOworICAgIHJ0eCBkZXN0ID0gb3BlcmFuZHNbMF07CisgICAgZW1pdF9pbnNuIChnZW5f YWRkPG1vZGU+M19leGVjIChkZXN0LCB0MSwgb3BlcmFuZHNbM10sIGRlc3QsIGV2ZW4pKTsK KyAgICBydHggb2RkID0gZ2VuX3J0eF9SRUcgKERJbW9kZSwgRVhFQ19SRUcpOworICAgIGVt aXRfbW92ZV9pbnNuIChvZGQsIGdldF9leGVjICgweGFhYWFhYWFhYWFhYWFhYWFVTCkpOwor ICAgIGVtaXRfaW5zbiAoZ2VuX2FkZDxtb2RlPjNfZXhlYyAoZGVzdCwgdDEsIG9wZXJhbmRz WzNdLCBkZXN0LCBvZGQpKTsKKworICAgIERPTkU7CisgIH0pCisKIDs7IH19fQogOzsge3t7 IEFMVSBnZW5lcmljIGNhc2UKIApAQCAtMjc2OCw2ICsyOTk1LDU2IEBACiAgIFsoc2V0X2F0 dHIgInR5cGUiICJ2b3AzYSIpCiAgICAoc2V0X2F0dHIgImxlbmd0aCIgIjgiKV0pCiAKKyhk ZWZpbmVfaW5zbiAiZm1zPG1vZGU+NDxleGVjPiIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6 Vl9GUCAwICJyZWdpc3Rlcl9vcGVyYW5kIiAgIj0gIHYsICAgdiIpCisJKGZtYTpWX0ZQCisJ ICAobWF0Y2hfb3BlcmFuZDpWX0ZQIDEgImdjbl9hbHVfb3BlcmFuZCIgIiUgdkEsICB2QSIp CisJKG1hdGNoX29wZXJhbmQ6Vl9GUCAyICJnY25fYWx1X29wZXJhbmQiICIgIHZBLHZTdkEi KQorCShuZWc6Vl9GUAorCSAgKG1hdGNoX29wZXJhbmQ6Vl9GUCAzICJnY25fYWx1X29wZXJh bmQiICJ2U3ZBLCAgdkEiKSkpKV0KKyAgIiIKKyAgInZfZm1hJWkwXHQlMCwgJTEsICUyLCAt JTMiCisgIFsoc2V0X2F0dHIgInR5cGUiICJ2b3AzYSIpCisgICAoc2V0X2F0dHIgImxlbmd0 aCIgIjgiKV0pCisKKyhkZWZpbmVfaW5zbiAiZm1zPG1vZGU+NF9uZWdvcDI8ZXhlYz4iCisg IFsoc2V0IChtYXRjaF9vcGVyYW5kOlZfRlAgMCAicmVnaXN0ZXJfb3BlcmFuZCIgICAgIj0g IHYsICAgdiwgICB2IikKKwkoZm1hOlZfRlAKKwkgIChtYXRjaF9vcGVyYW5kOlZfRlAgMSAi Z2NuX2FsdV9vcGVyYW5kIiAgICIgIHZBLCAgdkEsdlN2QSIpCisJICAobmVnOlZfRlAKKwkg ICAgKG1hdGNoX29wZXJhbmQ6Vl9GUCAyICJnY25fYWx1X29wZXJhbmQiICIgIHZBLHZTdkEs ICB2QSIpKQorCSAgKG5lZzpWX0ZQCisJICAgIChtYXRjaF9vcGVyYW5kOlZfRlAgMyAiZ2Nu X2FsdV9vcGVyYW5kIiAgICJ2U3ZBLCAgdkEsICB2QSIpKSkpXQorICAiIgorICAidl9mbWEl aTBcdCUwLCAlMSwgLSUyLCAtJTMiCisgIFsoc2V0X2F0dHIgInR5cGUiICJ2b3AzYSIpCisg ICAoc2V0X2F0dHIgImxlbmd0aCIgIjgiKV0pCisKKyhkZWZpbmVfaW5zbiAiZm1zPG1vZGU+ NCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6RlAgMCAicmVnaXN0ZXJfb3BlcmFuZCIgICI9 ICB2LCAgIHYiKQorCShmbWE6RlAKKwkgIChtYXRjaF9vcGVyYW5kOkZQIDEgImdjbl9hbHVf b3BlcmFuZCIgIiUgdkEsICB2QSIpCisJICAobWF0Y2hfb3BlcmFuZDpGUCAyICJnY25fYWx1 X29wZXJhbmQiICIgIHZBLHZTdkEiKQorCSAgKG5lZzpGUAorCSAgICAobWF0Y2hfb3BlcmFu ZDpGUCAzICJnY25fYWx1X29wZXJhbmQiICJ2U3ZBLCAgdkEiKSkpKV0KKyAgIiIKKyAgInZf Zm1hJWkwXHQlMCwgJTEsICUyLCAtJTMiCisgIFsoc2V0X2F0dHIgInR5cGUiICJ2b3AzYSIp CisgICAoc2V0X2F0dHIgImxlbmd0aCIgIjgiKV0pCisKKyhkZWZpbmVfaW5zbiAiZm1zPG1v ZGU+NF9uZWdvcDIiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkZQIDAgInJlZ2lzdGVyX29w ZXJhbmQiICAgICI9ICB2LCAgIHYsICAgdiIpCisJKGZtYTpGUAorCSAgKG1hdGNoX29wZXJh bmQ6RlAgMSAiZ2NuX2FsdV9vcGVyYW5kIiAgICIgIHZBLCAgdkEsdlN2QSIpCisJICAobmVn OkZQCisJICAgIChtYXRjaF9vcGVyYW5kOkZQIDIgImdjbl9hbHVfb3BlcmFuZCIgIiAgdkEs dlN2QSwgIHZBIikpCisJICAobmVnOkZQCisJICAgIChtYXRjaF9vcGVyYW5kOkZQIDMgImdj bl9hbHVfb3BlcmFuZCIgICAidlN2QSwgIHZBLCAgdkEiKSkpKV0KKyAgIiIKKyAgInZfZm1h JWkwXHQlMCwgJTEsIC0lMiwgLSUzIgorICBbKHNldF9hdHRyICJ0eXBlIiAidm9wM2EiKQor ICAgKHNldF9hdHRyICJsZW5ndGgiICI4IildKQorCiA7OyB9fX0KIDs7IHt7eyBGUCBkaXZp c2lvbgogCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2djbi9nY24uY2MgYi9nY2MvY29uZmln L2djbi9nY24uY2MKaW5kZXggMjNhYjAxZTc1ZDguLmMwNGZhZTI2NTBmIDEwMDY0NAotLS0g YS9nY2MvY29uZmlnL2djbi9nY24uY2MKKysrIGIvZ2NjL2NvbmZpZy9nY24vZ2NuLmNjCkBA IC01MDEyLDYgKzUwMTIsNzIgQEAgZ2NuX3ZlY3Rvcl9hbGlnbm1lbnRfcmVhY2hhYmxlIChj b25zdF90cmVlIEFSR19VTlVTRUQgKHR5cGUpLCBib29sIGlzX3BhY2tlZCkKICAgcmV0dXJu ICFpc19wYWNrZWQ7CiB9CiAKKy8qIEdlbmVyYXRlIERQUCBwYWlyd2lzZSBzd2FwIGluc3Ry dWN0aW9uLgorICAgVGhlIG9wY29kZSBpcyBnaXZlbiBieSBJTlNOLiAgKi8KKworY2hhciAq CitnY25fZXhwYW5kX2RwcF9zd2FwX3BhaXJzX2luc24gKG1hY2hpbmVfbW9kZSBtb2RlLCBj b25zdCBjaGFyICppbnNuLAorCQkJCWludCBBUkdfVU5VU0VEICh1bnNwZWMpKQoreworICBz dGF0aWMgY2hhciBidWZbMTI4XTsKKyAgY29uc3QgY2hhciAqZHBwOworCisgIC8qIEFkZCB0 aGUgRFBQIG1vZGlmaWVycy4gICovCisgIGRwcCA9ICJxdWFkX3Blcm06WzEsMCwzLDJdIjsK KworICBpZiAodmdwcl8ycmVnX21vZGVfcCAobW9kZSkpCisgICAgc3ByaW50ZiAoYnVmLCAi JXNcdCUlTDAsICUlTDEgJXNcblx0JXNcdCUlSDAsICUlSDEgJXMiLAorCSAgICAgaW5zbiwg ZHBwLCBpbnNuLCBkcHApOworICBlbHNlCisgICAgc3ByaW50ZiAoYnVmLCAiJXNcdCUlMCwg JSUxICVzIiwgaW5zbiwgZHBwKTsKKworICByZXR1cm4gYnVmOworfQorCisvKiBHZW5lcmF0 ZSBEUFAgZGlzdHJpYnV0ZSBldmVuIGluc3RydWN0aW9uLgorICAgVGhlIG9wY29kZSBpcyBn aXZlbiBieSBJTlNOLiAgKi8KKworY2hhciAqCitnY25fZXhwYW5kX2RwcF9kaXN0cmlidXRl X2V2ZW5faW5zbiAobWFjaGluZV9tb2RlIG1vZGUsIGNvbnN0IGNoYXIgKmluc24sCisJCQkJ ICAgICBpbnQgQVJHX1VOVVNFRCAodW5zcGVjKSkKK3sKKyAgc3RhdGljIGNoYXIgYnVmWzEy OF07CisgIGNvbnN0IGNoYXIgKmRwcDsKKworICAvKiBBZGQgdGhlIERQUCBtb2RpZmllcnMu ICAqLworICBkcHAgPSAicXVhZF9wZXJtOlswLDAsMiwyXSI7CisKKyAgaWYgKHZncHJfMnJl Z19tb2RlX3AgKG1vZGUpKQorICAgIHNwcmludGYgKGJ1ZiwgIiVzXHQlJUwwLCAlJUwxICVz XG5cdCVzXHQlJUgwLCAlJUgxICVzIiwKKwkgICAgIGluc24sIGRwcCwgaW5zbiwgZHBwKTsK KyAgZWxzZQorICAgIHNwcmludGYgKGJ1ZiwgIiVzXHQlJTAsICUlMSAlcyIsIGluc24sIGRw cCk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogR2VuZXJhdGUgRFBQIGRpc3RyaWJ1dGUg b2RkIGluc3RydWN0aW9uLgorICAgVGhlIG9wY29kZSBpcyBnaXZlbiBieSBJTlNOLiAgKi8K KworY2hhciAqCitnY25fZXhwYW5kX2RwcF9kaXN0cmlidXRlX29kZF9pbnNuIChtYWNoaW5l X21vZGUgbW9kZSwgY29uc3QgY2hhciAqaW5zbiwKKwkJCQkgICAgaW50IEFSR19VTlVTRUQg KHVuc3BlYykpCit7CisgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworICBjb25zdCBjaGFyICpk cHA7CisKKyAgLyogQWRkIHRoZSBEUFAgbW9kaWZpZXJzLiAgKi8KKyAgZHBwID0gInF1YWRf cGVybTpbMSwxLDMsM10iOworCisgIGlmICh2Z3ByXzJyZWdfbW9kZV9wIChtb2RlKSkKKyAg ICBzcHJpbnRmIChidWYsICIlc1x0JSVMMCwgJSVMMSAlc1xuXHQlc1x0JSVIMCwgJSVIMSAl cyIsCisJICAgICBpbnNuLCBkcHAsIGluc24sIGRwcCk7CisgIGVsc2UKKyAgICBzcHJpbnRm IChidWYsICIlc1x0JSUwLCAlJTEgJXMiLCBpbnNuLCBkcHApOworCisgIHJldHVybiBidWY7 Cit9CisKIC8qIEdlbmVyYXRlIERQUCBpbnN0cnVjdGlvbnMgdXNlZCBmb3IgdmVjdG9yIHJl ZHVjdGlvbnMuCiAKICAgIFRoZSBvcGNvZGUgaXMgZ2l2ZW4gYnkgSU5TTi4KZGlmZiAtLWdp dCBhL2djYy9jb25maWcvZ2NuL2djbi5tZCBiL2djYy9jb25maWcvZ2NuL2djbi5tZAppbmRl eCAxMGQyYjg3NGNjZS4uZGMxNGRhNmEwNTggMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvZ2Nu L2djbi5tZAorKysgYi9nY2MvY29uZmlnL2djbi9nY24ubWQKQEAgLTc4LDYgKzc4LDE0IEBA CiAgIFVOU1BFQ19QTFVTX0NBUlJZX0RQUF9TSFIgVU5TUEVDX1BMVVNfQ0FSUllfSU5fRFBQ X1NIUgogICBVTlNQRUNfQU5EX0RQUF9TSFIgVU5TUEVDX0lPUl9EUFBfU0hSIFVOU1BFQ19Y T1JfRFBQX1NIUgogICBVTlNQRUNfTU9WX0RQUF9TSFIKKyAgVU5TUEVDX01PVl9EUFBfU1dB UF9QQUlSUworICBVTlNQRUNfTU9WX0RQUF9ESVNUUklCVVRFX0VWRU4KKyAgVU5TUEVDX01P Vl9EUFBfRElTVFJJQlVURV9PREQKKyAgVU5TUEVDX0NNVUwgVU5TUEVDX0NNVUxfQ09OSgor ICBVTlNQRUNfQ01VTF9BREQgVU5TUEVDX0NNVUxfU1VCCisgIFVOU1BFQ19GTUFERFNVQgor ICBVTlNQRUNfQ0FERDkwCisgIFVOU1BFQ19DQUREMjcwCiAgIFVOU1BFQ19HQVRIRVIKICAg VU5TUEVDX1NDQVRURVIKICAgVU5TUEVDX1JDUApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2djbi9jb21wbGV4LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv Z2NuL2NvbXBsZXguYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwMDAwMC4u M2I4YTZjYzg1NGMKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvZ2NuL2NvbXBsZXguYwpAQCAtMCwwICsxLDY0MCBAQAorLy8geyBkZy1kbyBydW4gfQor Ly8geyBkZy1vcHRpb25zICItTyAtZm9wZW5tcC1zaW1kIC1mdHJlZS1sb29wLWlmLWNvbnZl cnQgLWZuby1zc2EtcGhpb3B0IiB9CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRl IDxvbXAuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgQ09VTlQgMTAwMAor I2RlZmluZSBNQVggMTAwMAorI2RlZmluZSBBTElHTk1FTlQgKDIqMTAyNCoxMDI0KSAvLyAy TUIKKworX0NvbXBsZXggZG91YmxlIGNvbmooX0NvbXBsZXggZG91YmxlKTsKK19Db21wbGV4 IGZsb2F0IGNvbmpmKF9Db21wbGV4IGZsb2F0KTsKKwordW5zaWduZWQgaW50IGRldmljZSA9 IDA7CisKKy8vIGNtdWwKKwordm9pZCBjbXVsRihmbG9hdCAqdGQsIGZsb2F0ICp0ZSwgZmxv YXQgKnRmLCBmbG9hdCAqdGcsIGludCB0YXMpCit7CisgIHR5cGVkZWYgX0NvbXBsZXggZmxv YXQgY29tcGxleFQ7CisgIGludCBhcnJheV9zaXplID0gdGFzLzI7CisgIGNvbXBsZXhUICpk ID0gKGNvbXBsZXhUKikodGQpOworICBjb21wbGV4VCAqZSA9IChjb21wbGV4VCopKHRlKTsK KyAgY29tcGxleFQgKmYgPSAoY29tcGxleFQqKSh0Zik7CisjcHJhZ21hIG9tcCB0YXJnZXQg dGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZAorICBmb3IgKGludCBpID0gMDsg aSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7CisgICAgICBkW2ldID0gZVtpXSAqIGZbaV07 CisgICAgfQorfQorCitib29sIGNtdWxGY2hlY2soZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZs b2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQgdGFzKQoreworICBmb3IgKGludCBpID0gMDsgaSA8 IHRhcy8yOyArK2kpCisgICAgeworICAgICAgZmxvYXQgYSA9IHRlW2kqMl07CisgICAgICBm bG9hdCBiID0gdGVbaSoyKzFdOworICAgICAgZmxvYXQgYyA9IHRmW2kqMl07CisgICAgICBm bG9hdCBkID0gdGZbaSoyKzFdOworICAgICAgaWYgKHRkW2kqMl0gIT0gYSpjLWIqZCB8fCB0 ZFtpKjIrMV0gIT0gYSpkK2IqYykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAg cmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgY211bEQoZG91YmxlICp0ZCwgZG91YmxlICp0ZSwg ZG91YmxlICp0ZiwgZG91YmxlICp0ZywgaW50IHRhcykKK3sKKyAgdHlwZWRlZiBfQ29tcGxl eCBkb3VibGUgY29tcGxleFQ7CisgIGludCBhcnJheV9zaXplID0gdGFzLzI7CisgIGNvbXBs ZXhUICpkID0gKGNvbXBsZXhUKikodGQpOworICBjb21wbGV4VCAqZSA9IChjb21wbGV4VCop KHRlKTsKKyAgY29tcGxleFQgKmYgPSAoY29tcGxleFQqKSh0Zik7CisjcHJhZ21hIG9tcCB0 YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZAorICBmb3IgKGludCBp ID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7CisgICAgICBkW2ldID0gZVtpXSAq IGZbaV07CisgICAgfQorfQorCitib29sIGNtdWxEY2hlY2soZG91YmxlICp0ZCwgZG91Ymxl ICp0ZSwgZG91YmxlICp0ZiwgZG91YmxlICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQg aSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGRvdWJsZSBhID0gdGVbaSoy XTsKKyAgICAgIGRvdWJsZSBiID0gdGVbaSoyKzFdOworICAgICAgZG91YmxlIGMgPSB0Zltp KjJdOworICAgICAgZG91YmxlIGQgPSB0ZltpKjIrMV07CisgICAgICBpZiAodGRbaSoyXSAh PSBhKmMtYipkIHx8IHRkW2kqMisxXSAhPSBhKmQrYipjKQorICAgICAgICByZXR1cm4gZmFs c2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCisvLyBjbXVsX2NvbmoKKwordm9p ZCBjbXVsX2NvbmpGKGZsb2F0ICp0ZCwgZmxvYXQgKnRlLCBmbG9hdCAqdGYsIGZsb2F0ICp0 ZywgaW50IHRhcykKK3sKKyAgdHlwZWRlZiBfQ29tcGxleCBmbG9hdCBjb21wbGV4VDsKKyAg aW50IGFycmF5X3NpemUgPSB0YXMvMjsKKyAgY29tcGxleFQgKmQgPSAoY29tcGxleFQqKSh0 ZCk7CisgIGNvbXBsZXhUICplID0gKGNvbXBsZXhUKikodGUpOworICBjb21wbGV4VCAqZiA9 IChjb21wbGV4VCopKHRmKTsKKyNwcmFnbWEgb21wIHRhcmdldCB0ZWFtcyBkaXN0cmlidXRl IHBhcmFsbGVsIGZvciBzaW1kCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlfc2l6ZTsg aSsrKQorICAgIHsKKyAgICAgIGRbaV0gPSBlW2ldICogY29uaihmW2ldKTsKKyAgICB9Cit9 CisKK2Jvb2wgY211bF9jb25qRmNoZWNrKGZsb2F0ICp0ZCwgZmxvYXQgKnRlLCBmbG9hdCAq dGYsIGZsb2F0ICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXMv MjsgKytpKQorICAgIHsKKyAgICAgIGZsb2F0IGEgPSB0ZVtpKjJdOworICAgICAgZmxvYXQg YiA9IHRlW2kqMisxXTsKKyAgICAgIGZsb2F0IGMgPSB0ZltpKjJdOworICAgICAgZmxvYXQg ZCA9IHRmW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9IGEqYytiKmQgfHwgdGRbaSoy KzFdICE9IGIqYy1hKmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVy biB0cnVlOworfQorCit2b2lkIGNtdWxfY29uakQoZG91YmxlICp0ZCwgZG91YmxlICp0ZSwg ZG91YmxlICp0ZiwgZG91YmxlICp0ZywgaW50IHRhcykKK3sKKyAgdHlwZWRlZiBfQ29tcGxl eCBkb3VibGUgY29tcGxleFQ7CisgIGludCBhcnJheV9zaXplID0gdGFzLzI7CisgIGNvbXBs ZXhUICpkID0gKGNvbXBsZXhUKikodGQpOworICBjb21wbGV4VCAqZSA9IChjb21wbGV4VCop KHRlKTsKKyAgY29tcGxleFQgKmYgPSAoY29tcGxleFQqKSh0Zik7CisjcHJhZ21hIG9tcCB0 YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZAorICBmb3IgKGludCBp ID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7CisgICAgICBkW2ldID0gZVtpXSAq IGNvbmooZltpXSk7CisgICAgfQorfQorCitib29sIGNtdWxfY29uakRjaGVjayhkb3VibGUg KnRkLCBkb3VibGUgKnRlLCBkb3VibGUgKnRmLCBkb3VibGUgKnRnLCBpbnQgdGFzKQorewor ICBmb3IgKGludCBpID0gMDsgaSA8IHRhcy8yOyArK2kpCisgICAgeworICAgICAgZG91Ymxl IGEgPSB0ZVtpKjJdOworICAgICAgZG91YmxlIGIgPSB0ZVtpKjIrMV07CisgICAgICBkb3Vi bGUgYyA9IHRmW2kqMl07CisgICAgICBkb3VibGUgZCA9IHRmW2kqMisxXTsKKyAgICAgIGlm ICh0ZFtpKjJdICE9IGEqYytiKmQgfHwgdGRbaSoyKzFdICE9IGIqYy1hKmQpCisgICAgICAg IHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisKKy8vIGFkZHN1 YgorCit2b2lkIGFkZHN1YkYoZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0ZiwgZmxv YXQgKnRnLCBpbnQgdGFzKQoreworICB0eXBlZGVmIF9Db21wbGV4IGZsb2F0IGNvbXBsZXhU OworICBpbnQgYXJyYXlfc2l6ZSA9IHRhcy8yOworICBjb21wbGV4VCAqZCA9IChjb21wbGV4 VCopKHRkKTsKKyAgY29tcGxleFQgKmUgPSAoY29tcGxleFQqKSh0ZSk7CisgIGNvbXBsZXhU ICpmID0gKGNvbXBsZXhUKikodGYpOworI3ByYWdtYSBvbXAgdGFyZ2V0IHRlYW1zIGRpc3Ry aWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheV9z aXplOyBpKyspCisgICAgeworICAgICAgZFtpXSA9IGVbaV0gLSBjb25qZihmW2ldKTsKKyAg ICB9Cit9CisKK2Jvb2wgYWRkc3ViRmNoZWNrKGZsb2F0ICp0ZCwgZmxvYXQgKnRlLCBmbG9h dCAqdGYsIGZsb2F0ICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0 YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGZsb2F0IGEgPSB0ZVtpKjJdOworICAgICAgZmxv YXQgYiA9IHRlW2kqMisxXTsKKyAgICAgIGZsb2F0IGMgPSB0ZltpKjJdOworICAgICAgZmxv YXQgZCA9IHRmW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9IGEtYyB8fCB0ZFtpKjIr MV0gIT0gYitkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1 ZTsKK30KKwordm9pZCBhZGRzdWJEKGRvdWJsZSAqdGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAq dGYsIGRvdWJsZSAqdGcsIGludCB0YXMpCit7CisgIHR5cGVkZWYgX0NvbXBsZXggZG91Ymxl IGNvbXBsZXhUOworICBpbnQgYXJyYXlfc2l6ZSA9IHRhcy8yOworICBjb21wbGV4VCAqZCA9 IChjb21wbGV4VCopKHRkKTsKKyAgY29tcGxleFQgKmUgPSAoY29tcGxleFQqKSh0ZSk7Cisg IGNvbXBsZXhUICpmID0gKGNvbXBsZXhUKikodGYpOworI3ByYWdtYSBvbXAgdGFyZ2V0IHRl YW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQKKyAgZm9yIChpbnQgaSA9IDA7IGkg PCBhcnJheV9zaXplOyBpKyspCisgICAgeworICAgICAgZFtpXSA9IGVbaV0gLSBjb25qKGZb aV0pOworICAgIH0KK30KKworYm9vbCBhZGRzdWJEY2hlY2soZG91YmxlICp0ZCwgZG91Ymxl ICp0ZSwgZG91YmxlICp0ZiwgZG91YmxlICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQg aSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGRvdWJsZSBhID0gdGVbaSoy XTsKKyAgICAgIGRvdWJsZSBiID0gdGVbaSoyKzFdOworICAgICAgZG91YmxlIGMgPSB0Zltp KjJdOworICAgICAgZG91YmxlIGQgPSB0ZltpKjIrMV07CisgICAgICBpZiAodGRbaSoyXSAh PSBhLWMgfHwgdGRbaSoyKzFdICE9IGIrZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg IH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gZm1hZGRzdWIKKwordm9pZCBmbWFkZHN1 YkYoZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQgdGFz KQoreworICBpbnQgYXJyYXlfc2l6ZSA9IHRhcy8yOworI3ByYWdtYSBvbXAgdGFyZ2V0IHRl YW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQKKyAgZm9yIChpbnQgaSA9IDA7IGkg PCBhcnJheV9zaXplOyBpKyspCisgICAgeworICAgICAgdGRbaSoyXSA9IHRlW2kqMl0qdGZb aSoyXS10Z1tpKjJdOworICAgICAgdGRbaSoyKzFdID0gdGVbaSoyKzFdKnRmW2kqMisxXSt0 Z1tpKjIrMV07CisgICAgfQorfQorCitib29sIGZtYWRkc3ViRmNoZWNrKGZsb2F0ICp0ZCwg ZmxvYXQgKnRlLCBmbG9hdCAqdGYsIGZsb2F0ICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChp bnQgaSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGZsb2F0IGEgPSB0ZVtp KjJdOworICAgICAgZmxvYXQgYiA9IHRlW2kqMisxXTsKKyAgICAgIGZsb2F0IGMgPSB0Zltp KjJdOworICAgICAgZmxvYXQgZCA9IHRmW2kqMisxXTsKKyAgICAgIGZsb2F0IGUgPSB0Z1tp KjJdOworICAgICAgZmxvYXQgZiA9IHRnW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9 IGEqYy1lIHx8IHRkW2kqMisxXSAhPSBiKmQrZikKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor ICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZm1hZGRzdWJEKGRvdWJsZSAqdGQs IGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcsIGludCB0YXMpCit7CisgIGlu dCBhcnJheV9zaXplID0gdGFzLzI7CisjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJp YnV0ZSBwYXJhbGxlbCBmb3Igc2ltZAorICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3Np emU7IGkrKykKKyAgICB7CisgICAgICB0ZFtpKjJdID0gdGVbaSoyXSp0ZltpKjJdLXRnW2kq Ml07CisgICAgICB0ZFtpKjIrMV0gPSB0ZVtpKjIrMV0qdGZbaSoyKzFdK3RnW2kqMisxXTsK KyAgICB9Cit9CisKK2Jvb2wgZm1hZGRzdWJEY2hlY2soZG91YmxlICp0ZCwgZG91YmxlICp0 ZSwgZG91YmxlICp0ZiwgZG91YmxlICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQgaSA9 IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGRvdWJsZSBhID0gdGVbaSoyXTsK KyAgICAgIGRvdWJsZSBiID0gdGVbaSoyKzFdOworICAgICAgZG91YmxlIGMgPSB0ZltpKjJd OworICAgICAgZG91YmxlIGQgPSB0ZltpKjIrMV07CisgICAgICBkb3VibGUgZSA9IHRnW2kq Ml07CisgICAgICBkb3VibGUgZiA9IHRnW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9 IGEqYy1lIHx8IHRkW2kqMisxXSAhPSBiKmQrZikKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor ICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gZm1zdWJhZGQKKwordm9pZCBmbXN1 YmFkZEYoZmxvYXQgKnRkLCBmbG9hdCAqdGUsIGZsb2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQg dGFzKQoreworICBpbnQgYXJyYXlfc2l6ZSA9IHRhcy8yOworI3ByYWdtYSBvbXAgdGFyZ2V0 IHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNpbWQKKyAgZm9yIChpbnQgaSA9IDA7 IGkgPCBhcnJheV9zaXplOyBpKyspCisgICAgeworICAgICAgdGRbaSoyXSA9IHRlW2kqMl0q dGZbaSoyXSt0Z1tpKjJdOworICAgICAgdGRbaSoyKzFdID0gdGVbaSoyKzFdKnRmW2kqMisx XS10Z1tpKjIrMV07CisgICAgfQorfQorCitib29sIGZtc3ViYWRkRmNoZWNrKGZsb2F0ICp0 ZCwgZmxvYXQgKnRlLCBmbG9hdCAqdGYsIGZsb2F0ICp0ZywgaW50IHRhcykKK3sKKyAgZm9y IChpbnQgaSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGZsb2F0IGEgPSB0 ZVtpKjJdOworICAgICAgZmxvYXQgYiA9IHRlW2kqMisxXTsKKyAgICAgIGZsb2F0IGMgPSB0 ZltpKjJdOworICAgICAgZmxvYXQgZCA9IHRmW2kqMisxXTsKKyAgICAgIGZsb2F0IGUgPSB0 Z1tpKjJdOworICAgICAgZmxvYXQgZiA9IHRnW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJd ICE9IGEqYytlIHx8IHRkW2kqMisxXSAhPSBiKmQtZikKKyAgICAgICAgcmV0dXJuIGZhbHNl OworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZm1zdWJhZGREKGRvdWJsZSAq dGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcsIGludCB0YXMpCit7Cisg IGludCBhcnJheV9zaXplID0gdGFzLzI7CisjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlz dHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZAorICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5 X3NpemU7IGkrKykKKyAgICB7CisgICAgICB0ZFtpKjJdID0gdGVbaSoyXSp0ZltpKjJdK3Rn W2kqMl07CisgICAgICB0ZFtpKjIrMV0gPSB0ZVtpKjIrMV0qdGZbaSoyKzFdLXRnW2kqMisx XTsKKyAgICB9Cit9CisKK2Jvb2wgZm1zdWJhZGREY2hlY2soZG91YmxlICp0ZCwgZG91Ymxl ICp0ZSwgZG91YmxlICp0ZiwgZG91YmxlICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQg aSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGRvdWJsZSBhID0gdGVbaSoy XTsKKyAgICAgIGRvdWJsZSBiID0gdGVbaSoyKzFdOworICAgICAgZG91YmxlIGMgPSB0Zltp KjJdOworICAgICAgZG91YmxlIGQgPSB0ZltpKjIrMV07CisgICAgICBkb3VibGUgZSA9IHRn W2kqMl07CisgICAgICBkb3VibGUgZiA9IHRnW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJd ICE9IGEqYytlIHx8IHRkW2kqMisxXSAhPSBiKmQtZikKKyAgICAgICAgcmV0dXJuIGZhbHNl OworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gY2FkZDkwCisKK3ZvaWQgY2Fk ZDkwRihmbG9hdCAqdGQsIGZsb2F0ICp0ZSwgZmxvYXQgKnRmLCBmbG9hdCAqdGcsIGludCB0 YXMpCit7CisgIGludCBhcnJheV9zaXplID0gdGFzLzI7CisjcHJhZ21hIG9tcCB0YXJnZXQg dGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZAorICBmb3IgKGludCBpID0gMDsg aSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7CisgICAgICB0ZFtpKjJdID0gdGVbaSoyXSAt IHRmW2kqMisxXTsKKyAgICAgIHRkW2kqMisxXSA9IHRlW2kqMisxXSArIHRmW2kqMl07Cisg ICAgfQorfQorCitib29sIGNhZGQ5MEZjaGVjayhmbG9hdCAqdGQsIGZsb2F0ICp0ZSwgZmxv YXQgKnRmLCBmbG9hdCAqdGcsIGludCB0YXMpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwg dGFzLzI7ICsraSkKKyAgICB7CisgICAgICBmbG9hdCBhID0gdGVbaSoyXTsKKyAgICAgIGZs b2F0IGIgPSB0ZVtpKjIrMV07CisgICAgICBmbG9hdCBjID0gdGZbaSoyXTsKKyAgICAgIGZs b2F0IGQgPSB0ZltpKjIrMV07CisgICAgICBpZiAodGRbaSoyXSAhPSBhLWQgfHwgdGRbaSoy KzFdICE9IGIrYykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRy dWU7Cit9CisKK3ZvaWQgY2FkZDkwRChkb3VibGUgKnRkLCBkb3VibGUgKnRlLCBkb3VibGUg KnRmLCBkb3VibGUgKnRnLCBpbnQgdGFzKQoreworICBpbnQgYXJyYXlfc2l6ZSA9IHRhcy8y OworI3ByYWdtYSBvbXAgdGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUgcGFyYWxsZWwgZm9yIHNp bWQKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheV9zaXplOyBpKyspCisgICAgeworICAg ICAgdGRbaSoyXSA9IHRlW2kqMl0gLSB0ZltpKjIrMV07CisgICAgICB0ZFtpKjIrMV0gPSB0 ZVtpKjIrMV0gKyB0ZltpKjJdOworICAgIH0KK30KKworYm9vbCBjYWRkOTBEY2hlY2soZG91 YmxlICp0ZCwgZG91YmxlICp0ZSwgZG91YmxlICp0ZiwgZG91YmxlICp0ZywgaW50IHRhcykK K3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsKKyAgICAgIGRv dWJsZSBhID0gdGVbaSoyXTsKKyAgICAgIGRvdWJsZSBiID0gdGVbaSoyKzFdOworICAgICAg ZG91YmxlIGMgPSB0ZltpKjJdOworICAgICAgZG91YmxlIGQgPSB0ZltpKjIrMV07CisgICAg ICBpZiAodGRbaSoyXSAhPSBhLWQgfHwgdGRbaSoyKzFdICE9IGIrYykKKyAgICAgICAgcmV0 dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIGNhZGQyNzAKKwor dm9pZCBjYWRkMjcwRihmbG9hdCAqdGQsIGZsb2F0ICp0ZSwgZmxvYXQgKnRmLCBmbG9hdCAq dGcsIGludCB0YXMpCit7CisgIGludCBhcnJheV9zaXplID0gdGFzLzI7CisjcHJhZ21hIG9t cCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Igc2ltZAorICBmb3IgKGlu dCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7CisgICAgICB0ZFtpKjJdID0g dGVbaSoyXSArIHRmW2kqMisxXTsKKyAgICAgIHRkW2kqMisxXSA9IHRlW2kqMisxXSAtIHRm W2kqMl07CisgICAgfQorfQorCitib29sIGNhZGQyNzBGY2hlY2soZmxvYXQgKnRkLCBmbG9h dCAqdGUsIGZsb2F0ICp0ZiwgZmxvYXQgKnRnLCBpbnQgdGFzKQoreworICBmb3IgKGludCBp ID0gMDsgaSA8IHRhcy8yOyArK2kpCisgICAgeworICAgICAgZmxvYXQgYSA9IHRlW2kqMl07 CisgICAgICBmbG9hdCBiID0gdGVbaSoyKzFdOworICAgICAgZmxvYXQgYyA9IHRmW2kqMl07 CisgICAgICBmbG9hdCBkID0gdGZbaSoyKzFdOworICAgICAgaWYgKHRkW2kqMl0gIT0gYStk IHx8IHRkW2kqMisxXSAhPSBiLWMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cisg IHJldHVybiB0cnVlOworfQorCit2b2lkIGNhZGQyNzBEKGRvdWJsZSAqdGQsIGRvdWJsZSAq dGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcsIGludCB0YXMpCit7CisgIGludCBhcnJheV9z aXplID0gdGFzLzI7CisjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJh bGxlbCBmb3Igc2ltZAorICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykK KyAgICB7CisgICAgICB0ZFtpKjJdID0gdGVbaSoyXSArIHRmW2kqMisxXTsKKyAgICAgIHRk W2kqMisxXSA9IHRlW2kqMisxXSAtIHRmW2kqMl07CisgICAgfQorfQorCitib29sIGNhZGQy NzBEY2hlY2soZG91YmxlICp0ZCwgZG91YmxlICp0ZSwgZG91YmxlICp0ZiwgZG91YmxlICp0 ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAg IHsKKyAgICAgIGRvdWJsZSBhID0gdGVbaSoyXTsKKyAgICAgIGRvdWJsZSBiID0gdGVbaSoy KzFdOworICAgICAgZG91YmxlIGMgPSB0ZltpKjJdOworICAgICAgZG91YmxlIGQgPSB0Zltp KjIrMV07CisgICAgICBpZiAodGRbaSoyXSAhPSBhK2QgfHwgdGRbaSoyKzFdICE9IGItYykK KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKwor Ly8gY21sYQorCit2b2lkIGNtbGFGKGZsb2F0ICp0ZCwgZmxvYXQgKnRlLCBmbG9hdCAqdGYs IGZsb2F0ICp0ZywgaW50IHRhcykKK3sKKyAgdHlwZWRlZiBfQ29tcGxleCBmbG9hdCBjb21w bGV4VDsKKyAgaW50IGFycmF5X3NpemUgPSB0YXMvMjsKKyAgY29tcGxleFQgKmQgPSAoY29t cGxleFQqKSh0ZCk7CisgIGNvbXBsZXhUICplID0gKGNvbXBsZXhUKikodGUpOworICBjb21w bGV4VCAqZiA9IChjb21wbGV4VCopKHRmKTsKKyAgY29tcGxleFQgKmcgPSAoY29tcGxleFQq KSh0Zyk7CisjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBm b3Igc2ltZAorICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7 CisgICAgICBkW2ldID0gZVtpXSAqIGZbaV0gKyBnW2ldOworICAgIH0KK30KKworYm9vbCBj bWxhRmNoZWNrKGZsb2F0ICp0ZCwgZmxvYXQgKnRlLCBmbG9hdCAqdGYsIGZsb2F0ICp0Zywg aW50IHRhcykKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXMvMjsgKytpKQorICAgIHsK KyAgICAgIGZsb2F0IGEgPSB0ZVtpKjJdOworICAgICAgZmxvYXQgYiA9IHRlW2kqMisxXTsK KyAgICAgIGZsb2F0IGMgPSB0ZltpKjJdOworICAgICAgZmxvYXQgZCA9IHRmW2kqMisxXTsK KyAgICAgIGZsb2F0IGUgPSB0Z1tpKjJdOworICAgICAgZmxvYXQgZiA9IHRnW2kqMisxXTsK KyAgICAgIGlmICh0ZFtpKjJdICE9IGEqYy1iKmQrZSB8fCB0ZFtpKjIrMV0gIT0gYSpkK2Iq YytmKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30K Kwordm9pZCBjbWxhRChkb3VibGUgKnRkLCBkb3VibGUgKnRlLCBkb3VibGUgKnRmLCBkb3Vi bGUgKnRnLCBpbnQgdGFzKQoreworICB0eXBlZGVmIF9Db21wbGV4IGRvdWJsZSBjb21wbGV4 VDsKKyAgaW50IGFycmF5X3NpemUgPSB0YXMvMjsKKyAgY29tcGxleFQgKmQgPSAoY29tcGxl eFQqKSh0ZCk7CisgIGNvbXBsZXhUICplID0gKGNvbXBsZXhUKikodGUpOworICBjb21wbGV4 VCAqZiA9IChjb21wbGV4VCopKHRmKTsKKyAgY29tcGxleFQgKmcgPSAoY29tcGxleFQqKSh0 Zyk7CisjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3Ig c2ltZAorICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykKKyAgICB7Cisg ICAgICBkW2ldID0gZVtpXSAqIGZbaV0gKyBnW2ldOworICAgIH0KK30KKworYm9vbCBjbWxh RGNoZWNrKGRvdWJsZSAqdGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcs IGludCB0YXMpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFzLzI7ICsraSkKKyAgICB7 CisgICAgICBkb3VibGUgYSA9IHRlW2kqMl07CisgICAgICBkb3VibGUgYiA9IHRlW2kqMisx XTsKKyAgICAgIGRvdWJsZSBjID0gdGZbaSoyXTsKKyAgICAgIGRvdWJsZSBkID0gdGZbaSoy KzFdOworICAgICAgZG91YmxlIGUgPSB0Z1tpKjJdOworICAgICAgZG91YmxlIGYgPSB0Z1tp KjIrMV07CisgICAgICBpZiAodGRbaSoyXSAhPSBhKmMtYipkK2UgfHwgdGRbaSoyKzFdICE9 IGEqZCtiKmMrZikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRy dWU7Cit9CisKKworLy8gY21scworCit2b2lkIGNtbHNGKGZsb2F0ICp0ZCwgZmxvYXQgKnRl LCBmbG9hdCAqdGYsIGZsb2F0ICp0ZywgaW50IHRhcykKK3sKKyAgdHlwZWRlZiBfQ29tcGxl eCBmbG9hdCBjb21wbGV4VDsKKyAgaW50IGFycmF5X3NpemUgPSB0YXMvMjsKKyAgY29tcGxl eFQgKmQgPSAoY29tcGxleFQqKSh0ZCk7CisgIGNvbXBsZXhUICplID0gKGNvbXBsZXhUKiko dGUpOworICBjb21wbGV4VCAqZiA9IChjb21wbGV4VCopKHRmKTsKKyAgY29tcGxleFQgKmcg PSAoY29tcGxleFQqKSh0Zyk7CisjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0 ZSBwYXJhbGxlbCBmb3Igc2ltZAorICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7 IGkrKykKKyAgICB7CisgICAgICBkW2ldID0gZVtpXSAqIGZbaV0gLSBnW2ldOworICAgIH0K K30KKworYm9vbCBjbWxzRmNoZWNrKGZsb2F0ICp0ZCwgZmxvYXQgKnRlLCBmbG9hdCAqdGYs IGZsb2F0ICp0ZywgaW50IHRhcykKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXMvMjsg KytpKQorICAgIHsKKyAgICAgIGZsb2F0IGEgPSB0ZVtpKjJdOworICAgICAgZmxvYXQgYiA9 IHRlW2kqMisxXTsKKyAgICAgIGZsb2F0IGMgPSB0ZltpKjJdOworICAgICAgZmxvYXQgZCA9 IHRmW2kqMisxXTsKKyAgICAgIGZsb2F0IGUgPSB0Z1tpKjJdOworICAgICAgZmxvYXQgZiA9 IHRnW2kqMisxXTsKKyAgICAgIGlmICh0ZFtpKjJdICE9IGEqYy1iKmQtZSB8fCB0ZFtpKjIr MV0gIT0gYSpkK2IqYy1mKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1 cm4gdHJ1ZTsKK30KKwordm9pZCBjbWxzRChkb3VibGUgKnRkLCBkb3VibGUgKnRlLCBkb3Vi bGUgKnRmLCBkb3VibGUgKnRnLCBpbnQgdGFzKQoreworICB0eXBlZGVmIF9Db21wbGV4IGRv dWJsZSBjb21wbGV4VDsKKyAgaW50IGFycmF5X3NpemUgPSB0YXMvMjsKKyAgY29tcGxleFQg KmQgPSAoY29tcGxleFQqKSh0ZCk7CisgIGNvbXBsZXhUICplID0gKGNvbXBsZXhUKikodGUp OworICBjb21wbGV4VCAqZiA9IChjb21wbGV4VCopKHRmKTsKKyAgY29tcGxleFQgKmcgPSAo Y29tcGxleFQqKSh0Zyk7CisjcHJhZ21hIG9tcCB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBw YXJhbGxlbCBmb3Igc2ltZAorICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU7IGkr KykKKyAgICB7CisgICAgICBkW2ldID0gZVtpXSAqIGZbaV0gLSBnW2ldOworICAgIH0KK30K KworYm9vbCBjbWxzRGNoZWNrKGRvdWJsZSAqdGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYs IGRvdWJsZSAqdGcsIGludCB0YXMpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFzLzI7 ICsraSkKKyAgICB7CisgICAgICBkb3VibGUgYSA9IHRlW2kqMl07CisgICAgICBkb3VibGUg YiA9IHRlW2kqMisxXTsKKyAgICAgIGRvdWJsZSBjID0gdGZbaSoyXTsKKyAgICAgIGRvdWJs ZSBkID0gdGZbaSoyKzFdOworICAgICAgZG91YmxlIGUgPSB0Z1tpKjJdOworICAgICAgZG91 YmxlIGYgPSB0Z1tpKjIrMV07CisgICAgICBpZiAodGRbaSoyXSAhPSBhKmMtYipkLWUgfHwg dGRbaSoyKzFdICE9IGEqZCtiKmMtZikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K KyAgcmV0dXJuIHRydWU7Cit9CisKKwordHlwZWRlZiB2b2lkKCpydW5GKShmbG9hdCAqdGQs IGZsb2F0ICp0ZSwgZmxvYXQgKnRmLCBmbG9hdCAqdGcsIGludCB0YXMpOwordHlwZWRlZiB2 b2lkKCpydW5EKShkb3VibGUgKnRkLCBkb3VibGUgKnRlLCBkb3VibGUgKnRmLCBkb3VibGUg KnRnLCBpbnQgdGFzKTsKK3R5cGVkZWYgYm9vbCgqY2hlY2tGKShmbG9hdCAqdGQsIGZsb2F0 ICp0ZSwgZmxvYXQgKnRmLCBmbG9hdCAqdGcsIGludCB0YXMpOwordHlwZWRlZiBib29sKCpj aGVja0QpKGRvdWJsZSAqdGQsIGRvdWJsZSAqdGUsIGRvdWJsZSAqdGYsIGRvdWJsZSAqdGcs IGludCB0YXMpOworCit0eXBlZGVmIHN0cnVjdAoreworICBydW5GIHJGOworICBydW5EIHJE OworICBjaGVja0YgY0Y7CisgIGNoZWNrRCBjRDsKK30gb3BlcmF0aW9uOworCitvcGVyYXRp b24gb3BzW10gPSB7CisgIHtjbXVsRiwgY211bEQsIGNtdWxGY2hlY2ssIGNtdWxEY2hlY2t9 LAorICB7Y211bF9jb25qRiwgY211bF9jb25qRCwgY211bF9jb25qRmNoZWNrLCBjbXVsX2Nv bmpEY2hlY2t9LAorICB7YWRkc3ViRiwgYWRkc3ViRCwgYWRkc3ViRmNoZWNrLCBhZGRzdWJE Y2hlY2t9LAorICB7Zm1hZGRzdWJGLCBmbWFkZHN1YkQsIGZtYWRkc3ViRmNoZWNrLCBmbWFk ZHN1YkRjaGVja30sCisgIHtmbXN1YmFkZEYsIGZtc3ViYWRkRCwgZm1zdWJhZGRGY2hlY2ss IGZtc3ViYWRkRGNoZWNrfSwKKyAge2NhZGQ5MEYsIGNhZGQ5MEQsIGNhZGQ5MEZjaGVjaywg Y2FkZDkwRGNoZWNrfSwKKyAge2NhZGQyNzBGLCBjYWRkMjcwRCwgY2FkZDI3MEZjaGVjaywg Y2FkZDI3MERjaGVja30sCisgIHtjbWxhRiwgY21sYUQsIGNtbGFGY2hlY2ssIGNtbGFEY2hl Y2t9LAorICB7Y21sc0YsIGNtbHNELCBjbWxzRmNoZWNrLCBjbWxzRGNoZWNrfQorfTsKKwor dm9pZCB0ZXN0RihvcGVyYXRpb24qIG9wKQoreworICBmbG9hdCogdGQ7CisgIGZsb2F0KiB0 ZTsKKyAgZmxvYXQqIHRmOworICBmbG9hdCogdGc7CisgIGludCBhcnJheV9zaXplID0gQ09V TlQ7CisgIHRkID0gKGZsb2F0KilvbXBfYWxpZ25lZF9hbGxvYyhBTElHTk1FTlQsIHNpemVv ZihmbG9hdCkqYXJyYXlfc2l6ZSwgb21wX2RlZmF1bHRfbWVtX2FsbG9jKTsKKyAgdGUgPSAo ZmxvYXQqKW9tcF9hbGlnbmVkX2FsbG9jKEFMSUdOTUVOVCwgc2l6ZW9mKGZsb2F0KSphcnJh eV9zaXplLCBvbXBfZGVmYXVsdF9tZW1fYWxsb2MpOworICB0ZiA9IChmbG9hdCopb21wX2Fs aWduZWRfYWxsb2MoQUxJR05NRU5ULCBzaXplb2YoZmxvYXQpKmFycmF5X3NpemUsIG9tcF9k ZWZhdWx0X21lbV9hbGxvYyk7CisgIHRnID0gKGZsb2F0KilvbXBfYWxpZ25lZF9hbGxvYyhB TElHTk1FTlQsIHNpemVvZihmbG9hdCkqYXJyYXlfc2l6ZSwgb21wX2RlZmF1bHRfbWVtX2Fs bG9jKTsKKyAgb21wX3NldF9kZWZhdWx0X2RldmljZShkZXZpY2UpOworICBmbG9hdCogZGQg PSB0ZDsKKyAgZmxvYXQqIGVlID0gdGU7CisgIGZsb2F0KiBmZiA9IHRmOworICBmbG9hdCog Z2cgPSB0ZzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBDT1VOVDsgKytpKQorICAgIHsKKyAg ICAgIHRlW2ldID0gKGZsb2F0KShyYW5kKCkgJSBNQVgpOworICAgICAgdGZbaV0gPSAoZmxv YXQpKHJhbmQoKSAlIE1BWCk7CisgICAgICB0Z1tpXSA9IChmbG9hdCkocmFuZCgpICUgTUFY KTsKKyAgICB9CisgIC8vIFNldCB1cCBkYXRhIHJlZ2lvbiBvbiBkZXZpY2UKKyNwcmFnbWEg b21wIHRhcmdldCBlbnRlciBkYXRhIG1hcCh0bzogZGRbMDphcnJheV9zaXplXSwgZWVbMDph cnJheV9zaXplXSwgZmZbMDphcnJheV9zaXplXSwgZ2dbMDphcnJheV9zaXplXSkKKyAge30K KyAgb3AtPnJGKHRkLCB0ZSwgdGYsIHRnLCBDT1VOVCk7CisjcHJhZ21hIG9tcCB0YXJnZXQg ZXhpdCBkYXRhIG1hcChmcm9tOiBkZFswOmFycmF5X3NpemVdLCBlZVswOmFycmF5X3NpemVd LCBmZlswOmFycmF5X3NpemVdLCBnZ1swOmFycmF5X3NpemVdKQorICB7fQorICBpZiAoIW9w LT5jRih0ZCwgdGUsIHRmLCB0ZywgQ09VTlQpKQorICAgIGFib3J0KCk7Cit9CisKK3ZvaWQg dGVzdEQob3BlcmF0aW9uKiBvcCkKK3sKKyAgZG91YmxlKiB0ZDsKKyAgZG91YmxlKiB0ZTsK KyAgZG91YmxlKiB0ZjsKKyAgZG91YmxlKiB0ZzsKKyAgaW50IGFycmF5X3NpemUgPSBDT1VO VDsKKyAgdGQgPSAoZG91YmxlKilvbXBfYWxpZ25lZF9hbGxvYyhBTElHTk1FTlQsIHNpemVv Zihkb3VibGUpKmFycmF5X3NpemUsIG9tcF9kZWZhdWx0X21lbV9hbGxvYyk7CisgIHRlID0g KGRvdWJsZSopb21wX2FsaWduZWRfYWxsb2MoQUxJR05NRU5ULCBzaXplb2YoZG91YmxlKSph cnJheV9zaXplLCBvbXBfZGVmYXVsdF9tZW1fYWxsb2MpOworICB0ZiA9IChkb3VibGUqKW9t cF9hbGlnbmVkX2FsbG9jKEFMSUdOTUVOVCwgc2l6ZW9mKGRvdWJsZSkqYXJyYXlfc2l6ZSwg b21wX2RlZmF1bHRfbWVtX2FsbG9jKTsKKyAgdGcgPSAoZG91YmxlKilvbXBfYWxpZ25lZF9h bGxvYyhBTElHTk1FTlQsIHNpemVvZihkb3VibGUpKmFycmF5X3NpemUsIG9tcF9kZWZhdWx0 X21lbV9hbGxvYyk7CisgIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlKTsKKyAgZG91 YmxlKiBkZCA9IHRkOworICBkb3VibGUqIGVlID0gdGU7CisgIGRvdWJsZSogZmYgPSB0ZjsK KyAgZG91YmxlKiBnZyA9IHRnOworICBmb3IgKGludCBpID0gMDsgaSA8IENPVU5UOyArK2kp CisgICAgeworICAgICAgdGVbaV0gPSAoZG91YmxlKShyYW5kKCkgJSBNQVgpOworICAgICAg dGZbaV0gPSAoZG91YmxlKShyYW5kKCkgJSBNQVgpOworICAgICAgdGdbaV0gPSAoZG91Ymxl KShyYW5kKCkgJSBNQVgpOworICAgIH0KKyAgLy8gU2V0IHVwIGRhdGEgcmVnaW9uIG9uIGRl dmljZQorI3ByYWdtYSBvbXAgdGFyZ2V0IGVudGVyIGRhdGEgbWFwKHRvOiBkZFswOmFycmF5 X3NpemVdLCBlZVswOmFycmF5X3NpemVdLCBmZlswOmFycmF5X3NpemVdLCBnZ1swOmFycmF5 X3NpemVdKQorICB7fQorICBvcC0+ckQodGQsIHRlLCB0ZiwgdGcsIENPVU5UKTsKKyNwcmFn bWEgb21wIHRhcmdldCBleGl0IGRhdGEgbWFwKGZyb206IGRkWzA6YXJyYXlfc2l6ZV0sIGVl WzA6YXJyYXlfc2l6ZV0sIGZmWzA6YXJyYXlfc2l6ZV0sIGdnWzA6YXJyYXlfc2l6ZV0pCisg IHt9CisgIGlmICghb3AtPmNEKHRkLCB0ZSwgdGYsIHRnLCBDT1VOVCkpCisgICAgYWJvcnQo KTsKK30KKworaW50IG1haW4oKQoreworICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OyArK2kp CisgICAgeworICAgICAgdGVzdEYoJm9wc1tpXSk7CisgICAgICB0ZXN0RCgmb3BzW2ldKTsK KyAgICB9Cit9CisK --------------D8YZw8y3JQezB3wYX07OCBpP--