From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa2.mentor.iphmx.com (esa2.mentor.iphmx.com [68.232.141.98]) by sourceware.org (Postfix) with ESMTPS id E69E53858D28 for ; Thu, 21 Jul 2022 10:55:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E69E53858D28 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.92,289,1650960000"; d="diff'?scan'208";a="80081956" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa2.mentor.iphmx.com with ESMTP; 21 Jul 2022 02:55:27 -0800 IronPort-SDR: iVJxFqwBANBQwEGN8+d96AxQ8XCAwIrYkpHg5zq1Q6X/GnOs+KPDFNX3DizrhHvJqY0PkM+E/g G0vDc51NcmpHyYEJAFMKjSUvddaVoTjIYdU1yIYc8QFETNgXj3tAisP0nLFRa3zic66ZfhtaC3 yGPscL9IngeZ4lLqbcdnMmvyf0V1hqigDz5yi25ulDOZOB5IY10saMauC2H3NxLZdHmb5otlbJ xRz2pQf0DjZJJ9NIZTmIX7q8iJFkXPhyLVPs7JUQWv/dyUsdRG25YwT8zMyGFofnq4zFVmcYNm PZM= Content-Type: multipart/mixed; boundary="------------VpZ2gUz08Wfd5Q5VltV7TEex" Message-ID: Date: Thu, 21 Jul 2022 12:55:21 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Content-Language: en-US To: gcc-patches , Jakub Jelinek From: Tobias Burnus Subject: [Patch] OpenMP: Support reverse offload (middle end part) X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-11.mgc.mentorg.com (139.181.222.11) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H2, 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Jul 2022 10:55:33 -0000 --------------VpZ2gUz08Wfd5Q5VltV7TEex Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: quoted-printable This patch does three things: (a) It removes a 'sorry' for 'device(ancestor:1)' and passes GOMP_DEVICE_HOST_FALLBACK as device number. This is sufficient for full "reverse" offload support with ENABLE_OFFLOADIN= G being false - and -foffload=3Ddisable. And for simple hello-world cases. On the libgomp side, the 'requires reverse_offload' currently implies that the initial device is the only device. While that's all fine, this change is insufficient if offloading devices are enabled during compilation as: (b.1) The offload-device lto1 should not see the content of the ancestor:1 = target region and all the calls it does. If it does, there will be link errors for functions not available and it also would pointlessly increase the code siz= e. Thus, the second part is to create an empty function for devices and a full version for the host. The general idea is: The device version can be used as lookup pointer in th= e offload_funcs table; thus, we both need a function on the device and a call= to GOMP_target_ext. It turned out to be quite difficult as late in the processing changing a FUNCTION_DECL is not that easy =E2=80=93 nor removing it after all analysis= has been done. I hope the current version is not too hackish =E2=80=93 and maybe som= eone has an idea how to best not to assembly the 'nonhost' version on the host. (Not critical as it is small (having an empty body) - but still it would be nicer not to write it to .s file.) (b.2) The omp-offload.cc assert showed that cloning and inlining happened for the included libgomp example. While inlining should be okay (of 'subroutine m2_tg_fn' (and for C/C++ 'tg_fn')) - cloning will break the offload_func table lookup - and, hence, had to be excluded =E2=86=92 "n= oclone". I think it could also affect non-anchestor:1 code - but did not try to create an example. (c) Prepare for actual reverse offloading While (b) already does some prep work for real offloading, at least one mor= e step is needed: In order to allow that the function pointer can be used for offload_func table lookup, it has to be passed to libgomp. Currently, the 'fn' argument is nullified in on-device calls to GOMP_target= _ext. The third part of this patch nullifies it now only for non-reverse offloads= . OK for mainline? * * * Next steps: Implement reverse offloading for devices. In theory, this only requires libgomp work, but let's see what else will be required. Tobias ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955 --------------VpZ2gUz08Wfd5Q5VltV7TEex Content-Type: text/x-patch; charset="UTF-8"; name="omp-ancestor-ME-v2.diff" Content-Disposition: attachment; filename="omp-ancestor-ME-v2.diff" Content-Transfer-Encoding: base64 T3Blbk1QOiBTdXBwb3J0IHJldmVyc2Ugb2ZmbG9hZCAobWlkZGxlIGVuZCBwYXJ0KQoKZ2Nj L0NoYW5nZUxvZzoKCgkqIGludGVybmFsLWZuLmNjIChleHBhbmRfR09NUF9UQVJHRVRfUkVW KTogTmV3LgoJKiBpbnRlcm5hbC1mbi5kZWYgKEdPTVBfVEFSR0VUX1JFVik6IE5ldy4KCSog bHRvLWNncmFwaC5jYyAobHRvX291dHB1dF9ub2RlLCB2ZXJpZnlfbm9kZV9wYXJ0aXRpb24p OiBNYXJrCgknb21wIHRhcmdldCBkZXZpY2VfYW5jZXN0b3JfaG9zdCcgYXMgaW5fb3RoZXJf cGFydGl0aW9uIGFuZCBkb24ndAoJZXJyb3IgaWYgYWJzZW50LgoJKiBvbXAtbG93LmNjIChj cmVhdGVfb21wX2NoaWxkX2Z1bmN0aW9uKTogTWFyayBhcyAnbm9jbG9uZScuCgkqIG9tcC1l eHBhbmQuY2MgKGV4cGFuZF9vbXBfdGFyZ2V0KTogRm9yIHJldmVyc2Ugb2ZmbG9hZCwgcmVt b3ZlCglzb3JyeSwgdXNlIGRldmljZSA9IEdPTVBfREVWSUNFX0hPU1RfRkFMTEJBQ0sgYW5k IGNyZWF0ZQoJZW1wdHktYm9keSBub2hvc3QgZnVuY3Rpb24uCgkqIG9tcC1vZmZsb2FkLmNj IChleGVjdXRlX29tcF9kZXZpY2VfbG93ZXIpOiBIYW5kbGUKCUlGTl9HT01QX1RBUkdFVF9S RVYuCgkocGFzc19vbXBfdGFyZ2V0X2xpbms6OmV4ZWN1dGUpOiBGb3IgQUNDRUxfQ09NUElM RVIsIGRvbid0CgludWxsaWZ5IGZuIGFyZ3VtZW50IGZvciByZXZlcnNlIG9mZmxvYWQKCmxp YmdvbXAvQ2hhbmdlTG9nOgoKCSogbGliZ29tcC50ZXhpIChPcGVuTVAgNS4wKTogTWFyayAn YW5jZXN0b3InIGFzIGltcGxlbWVudGVkIGJ1dAoJcmVmZXIgdG8gJ3JlcXVpcmVzJy4KCSog dGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL3JldmVyc2Utb2ZmbG9hZC0xLWF1eC5j OiBOZXcgdGVzdC4KCSogdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL3JldmVyc2Ut b2ZmbG9hZC0xLmM6IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3Jl dmVyc2Utb2ZmbG9hZC0xLWF1eC5mOTA6IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvbGliZ29t cC5mb3J0cmFuL3JldmVyc2Utb2ZmbG9hZC0xLmY5MDogTmV3IHRlc3QuCgpnY2MvdGVzdHN1 aXRlL0NoYW5nZUxvZzoKCgkqIGMtYysrLWNvbW1vbi9nb21wL3JldmVyc2Utb2ZmbG9hZC0x LmM6IFJlbW92ZSBkZy1zb3JyeS4KCSogYy1jKystY29tbW9uL2dvbXAvdGFyZ2V0LWRldmlj ZS1hbmNlc3Rvci00LmM6IExpa2V3aXNlLgoJKiBnZm9ydHJhbi5kZy9nb21wL3RhcmdldC1k ZXZpY2UtYW5jZXN0b3ItNC5mOTA6IExpa2V3aXNlLgoJKiBnZm9ydHJhbi5kZy9nb21wL3Rh cmdldC1kZXZpY2UtYW5jZXN0b3ItNS5mOTA6IExpa2V3aXNlLgoKIGdjYy9pbnRlcm5hbC1m bi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4ICsrCiBnY2MvaW50 ZXJuYWwtZm4uZGVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCiBn Y2MvbHRvLWNncmFwaC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAy MCArKystCiBnY2Mvb21wLWV4cGFuZC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDEwNyArKysrKysrKysrKysrKysrKysrLS0KIGdjYy9vbXAtbG93LmNjICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0ICstCiBnY2Mvb21wLW9mZmxv YWQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1MCArKysrKysrKysr CiAuLi4vYy1jKystY29tbW9uL2dvbXAvcmV2ZXJzZS1vZmZsb2FkLTEuYyAgICAgICAgICB8 ICAgMiArLQogLi4uL2MtYysrLWNvbW1vbi9nb21wL3RhcmdldC1kZXZpY2UtYW5jZXN0b3It NC5jICAgfCAgIDIgKy0KIC4uLi9nZm9ydHJhbi5kZy9nb21wL3RhcmdldC1kZXZpY2UtYW5j ZXN0b3ItNC5mOTAgIHwgICAyICstCiAuLi4vZ2ZvcnRyYW4uZGcvZ29tcC90YXJnZXQtZGV2 aWNlLWFuY2VzdG9yLTUuZjkwICB8ICAgMiArLQogbGliZ29tcC9saWJnb21wLnRleGkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIgKy0KIC4uLi9saWJnb21wLmMtYysr LWNvbW1vbi9yZXZlcnNlLW9mZmxvYWQtMS1hdXguYyAgIHwgIDEwICsrCiAuLi4vbGliZ29t cC5jLWMrKy1jb21tb24vcmV2ZXJzZS1vZmZsb2FkLTEuYyAgICAgICB8ICA4MyArKysrKysr KysrKysrKysrCiAuLi4vbGliZ29tcC5mb3J0cmFuL3JldmVyc2Utb2ZmbG9hZC0xLWF1eC5m OTAgICAgICB8ICAxMiArKysKIC4uLi9saWJnb21wLmZvcnRyYW4vcmV2ZXJzZS1vZmZsb2Fk LTEuZjkwICAgICAgICAgIHwgIDg4ICsrKysrKysrKysrKysrKysrCiAxNSBmaWxlcyBjaGFu Z2VkLCAzNzUgaW5zZXJ0aW9ucygrKSwgMTggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv Z2NjL2ludGVybmFsLWZuLmNjIGIvZ2NjL2ludGVybmFsLWZuLmNjCmluZGV4IDI4OTczZDk1 N2ZiLi40NDUzMDE0MjM0MCAxMDA2NDQKLS0tIGEvZ2NjL2ludGVybmFsLWZuLmNjCisrKyBi L2djYy9pbnRlcm5hbC1mbi5jYwpAQCAtMzY4LDYgKzM2OCwxNCBAQCBleHBhbmRfR09NUF9T SU1UX1ZGIChpbnRlcm5hbF9mbiwgZ2NhbGwgKikKICAgZ2NjX3VucmVhY2hhYmxlICgpOwog fQogCisvKiBUaGlzIHNob3VsZCBnZXQgZXhwYW5kZWQgaW4gb21wX2RldmljZV9sb3dlciBw YXNzLiAgKi8KKworc3RhdGljIHZvaWQKK2V4cGFuZF9HT01QX1RBUkdFVF9SRVYgKGludGVy bmFsX2ZuLCBnY2FsbCAqKQoreworICBnY2NfdW5yZWFjaGFibGUgKCk7Cit9CisKIC8qIExh bmUgaW5kZXggb2YgdGhlIGZpcnN0IFNJTVQgbGFuZSB0aGF0IHN1cHBsaWVzIGEgbm9uLXpl cm8gYXJndW1lbnQuCiAgICBUaGlzIGlzIGEgU0lNVCBjb3VudGVycGFydCB0byBHT01QX1NJ TURfTEFTVF9MQU5FLCB1c2VkIHRvIHJlcHJlc2VudCB0aGUKICAgIGxhbmUgdGhhdCBleGVj dXRlZCB0aGUgbGFzdCBpdGVyYXRpb24gZm9yIGhhbmRsaW5nIE9wZW5NUCBsYXN0cHJpdmF0 ZS4gICovCmRpZmYgLS1naXQgYS9nY2MvaW50ZXJuYWwtZm4uZGVmIGIvZ2NjL2ludGVybmFs LWZuLmRlZgppbmRleCA3YzM5OGJhYWRjOC4uODkxYmI4YzM2M2IgMTAwNjQ0Ci0tLSBhL2dj Yy9pbnRlcm5hbC1mbi5kZWYKKysrIGIvZ2NjL2ludGVybmFsLWZuLmRlZgpAQCAtMzM2LDYg KzMzNiw3IEBAIERFRl9JTlRFUk5BTF9JTlRfRk4gKEZGUywgRUNGX0NPTlNUIHwgRUNGX05P VEhST1csIGZmcywgdW5hcnkpCiBERUZfSU5URVJOQUxfSU5UX0ZOIChQQVJJVFksIEVDRl9D T05TVCB8IEVDRl9OT1RIUk9XLCBwYXJpdHksIHVuYXJ5KQogREVGX0lOVEVSTkFMX0lOVF9G TiAoUE9QQ09VTlQsIEVDRl9DT05TVCB8IEVDRl9OT1RIUk9XLCBwb3Bjb3VudCwgdW5hcnkp CiAKK0RFRl9JTlRFUk5BTF9GTiAoR09NUF9UQVJHRVRfUkVWLCBFQ0ZfTk9WT1BTIHwgRUNG X0xFQUYgfCBFQ0ZfTk9USFJPVywgTlVMTCkKIERFRl9JTlRFUk5BTF9GTiAoR09NUF9VU0Vf U0lNVCwgRUNGX05PVk9QUyB8IEVDRl9MRUFGIHwgRUNGX05PVEhST1csIE5VTEwpCiBERUZf SU5URVJOQUxfRk4gKEdPTVBfU0lNVF9FTlRFUiwgRUNGX0xFQUYgfCBFQ0ZfTk9USFJPVywg TlVMTCkKIERFRl9JTlRFUk5BTF9GTiAoR09NUF9TSU1UX0VOVEVSX0FMTE9DLCBFQ0ZfTEVB RiB8IEVDRl9OT1RIUk9XLCBOVUxMKQpkaWZmIC0tZ2l0IGEvZ2NjL2x0by1jZ3JhcGguY2Mg Yi9nY2MvbHRvLWNncmFwaC5jYwppbmRleCA2ZDljMzZlYThiNi4uMDYyNjc3YTMyZWIgMTAw NjQ0Ci0tLSBhL2djYy9sdG8tY2dyYXBoLmNjCisrKyBiL2djYy9sdG8tY2dyYXBoLmNjCkBA IC00MzAsNiArNDMwLDEzIEBAIGx0b19vdXRwdXRfbm9kZSAoc3RydWN0IGx0b19zaW1wbGVf b3V0cHV0X2Jsb2NrICpvYiwgc3RydWN0IGNncmFwaF9ub2RlICpub2RlLAogCSBhZnRlciBy ZWFkaW5nIGJhY2suICAqLwogICAgICAgaW5fb3RoZXJfcGFydGl0aW9uID0gMTsKICAgICB9 CisgIGVsc2UgaWYgKFVOTElLRUxZIChsdG9fc3RyZWFtX29mZmxvYWRfcAorCQkgICAgICYm IGxvb2t1cF9hdHRyaWJ1dGUgKCJvbXAgdGFyZ2V0IGRldmljZV9hbmNlc3Rvcl9ob3N0IiwK KwkJCQkJICBERUNMX0FUVFJJQlVURVMgKG5vZGUtPmRlY2wpKSkpCisgICAgLyogVGhpcyBz eW1ib2wgaXMgb25seSB1c2VkIGFzIGFyZ3VtZW50IHRvIElGTl9HT01QX1RBUkdFVF9SRVY7 IHRoaXMgSUZOCisgICAgICAgaXMgaWdub3JlZCBvbiBBQ0NFTF9DT01QSUxFUi4gIFRodXMs IG1hcmsgaXQgYXMgaW5fb3RoZXJfcGFydGl0aW9uIHRvIHNpbGVuY2UKKyAgICAgICB2ZXJp Znlfbm9kZV9wYXJ0aXRpb24gZGlhZ25vc3RpYy4gICovCisgICAgaW5fb3RoZXJfcGFydGl0 aW9uID0gMTsKIAogICBjbG9uZV9vZiA9IG5vZGUtPmNsb25lX29mOwogICB3aGlsZSAoY2xv bmVfb2YKQEAgLTExNDAsMTAgKzExNDcsMTUgQEAgdmVyaWZ5X25vZGVfcGFydGl0aW9uIChz eW10YWJfbm9kZSAqbm9kZSkKICAgaWYgKG5vZGUtPmluX290aGVyX3BhcnRpdGlvbikKICAg ICB7CiAgICAgICBpZiAoVFJFRV9DT0RFIChub2RlLT5kZWNsKSA9PSBGVU5DVElPTl9ERUNM KQotCWVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ZGVjbCksCi0JCSAg ImZ1bmN0aW9uICVxcyBoYXMgYmVlbiByZWZlcmVuY2VkIGluIG9mZmxvYWRlZCBjb2RlIGJ1 dCIKLQkJICAiIGhhc24lJ3QgYmVlbiBtYXJrZWQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG9m ZmxvYWRlZCBjb2RlIiwKLQkJICBub2RlLT5uYW1lICgpKTsKKwl7CisJICBpZiAobG9va3Vw X2F0dHJpYnV0ZSAoIm9tcCB0YXJnZXQgZGV2aWNlX2FuY2VzdG9yX2hvc3QiLAorCQkJCURF Q0xfQVRUUklCVVRFUyAobm9kZS0+ZGVjbCkpICE9IE5VTEwpCisJICAgIHJldHVybjsKKwkg IGVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ZGVjbCksCisJCSAgICAi ZnVuY3Rpb24gJXFzIGhhcyBiZWVuIHJlZmVyZW5jZWQgaW4gb2ZmbG9hZGVkIGNvZGUgYnV0 IgorCQkgICAgIiBoYXNuJSd0IGJlZW4gbWFya2VkIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBv ZmZsb2FkZWQgY29kZSIsCisJCSAgICBub2RlLT5uYW1lICgpKTsKKwl9CiAgICAgICBlbHNl IGlmIChWQVJfUCAobm9kZS0+ZGVjbCkpCiAJZXJyb3JfYXQgKERFQ0xfU09VUkNFX0xPQ0FU SU9OIChub2RlLT5kZWNsKSwKIAkJICAidmFyaWFibGUgJXFzIGhhcyBiZWVuIHJlZmVyZW5j ZWQgaW4gb2ZmbG9hZGVkIGNvZGUgYnV0IgpkaWZmIC0tZ2l0IGEvZ2NjL29tcC1leHBhbmQu Y2MgYi9nY2Mvb21wLWV4cGFuZC5jYwppbmRleCAxMDIzYzU2ZmMzZC4uNzRiMTU4OGUzNWUg MTAwNjQ0Ci0tLSBhL2djYy9vbXAtZXhwYW5kLmNjCisrKyBiL2djYy9vbXAtZXhwYW5kLmNj CkBAIC05NjUxLDcgKzk2NTEsNyBAQCBleHBhbmRfb21wX3RhcmdldCAoc3RydWN0IG9tcF9y ZWdpb24gKnJlZ2lvbikKIHsKICAgYmFzaWNfYmxvY2sgZW50cnlfYmIsIGV4aXRfYmIsIG5l d19iYjsKICAgc3RydWN0IGZ1bmN0aW9uICpjaGlsZF9jZnVuOwotICB0cmVlIGNoaWxkX2Zu LCBibG9jaywgdDsKKyAgdHJlZSBjaGlsZF9mbiwgY2hpbGRfZm4yLCBibG9jaywgdCwgYzsK ICAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3NpOwogICBnb21wX3RhcmdldCAqZW50cnlfc3Rt dDsKICAgZ2ltcGxlICpzdG10OwpAQCAtOTY4OCwxMCArOTY4OCwxNiBAQCBleHBhbmRfb21w X3RhcmdldCAoc3RydWN0IG9tcF9yZWdpb24gKnJlZ2lvbikKICAgICAgIGdjY191bnJlYWNo YWJsZSAoKTsKICAgICB9CiAKLSAgY2hpbGRfZm4gPSBOVUxMX1RSRUU7CisgIHRyZWUgY2xh dXNlcyA9IGdpbXBsZV9vbXBfdGFyZ2V0X2NsYXVzZXMgKGVudHJ5X3N0bXQpOworCisgIGJv b2wgaXNfYW5jZXN0b3IgPSBmYWxzZTsKKyAgY2hpbGRfZm4gPSBjaGlsZF9mbjIgPSBOVUxM X1RSRUU7CiAgIGNoaWxkX2NmdW4gPSBOVUxMOwogICBpZiAob2ZmbG9hZGVkKQogICAgIHsK KyAgICAgIGMgPSBvbXBfZmluZF9jbGF1c2UgKGNsYXVzZXMsIE9NUF9DTEFVU0VfREVWSUNF KTsKKyAgICAgIGlmIChFTkFCTEVfT0ZGTE9BRElORyAmJiBjKQorCWlzX2FuY2VzdG9yID0g T01QX0NMQVVTRV9ERVZJQ0VfQU5DRVNUT1IgKGMpOwogICAgICAgY2hpbGRfZm4gPSBnaW1w bGVfb21wX3RhcmdldF9jaGlsZF9mbiAoZW50cnlfc3RtdCk7CiAgICAgICBjaGlsZF9jZnVu ID0gREVDTF9TVFJVQ1RfRlVOQ1RJT04gKGNoaWxkX2ZuKTsKICAgICB9CkBAIC05ODc5LDcg Kzk4ODUsOCBAQCBleHBhbmRfb21wX3RhcmdldCAoc3RydWN0IG9tcF9yZWdpb24gKnJlZ2lv bikKIAl7CiAJICBpZiAoaW5fbHRvX3ApCiAJICAgIERFQ0xfUFJFU0VSVkVfUCAoY2hpbGRf Zm4pID0gMTsKLQkgIHZlY19zYWZlX3B1c2ggKG9mZmxvYWRfZnVuY3MsIGNoaWxkX2ZuKTsK KwkgIGlmICghaXNfYW5jZXN0b3IpCisJICAgIHZlY19zYWZlX3B1c2ggKG9mZmxvYWRfZnVu Y3MsIGNoaWxkX2ZuKTsKIAl9CiAKICAgICAgIGJvb2wgbmVlZF9hc20gPSBERUNMX0FTU0VN QkxFUl9OQU1FX1NFVF9QIChjdXJyZW50X2Z1bmN0aW9uX2RlY2wpCkBAIC05OTE4LDExICs5 OTI1LDg4IEBAIGV4cGFuZF9vbXBfdGFyZ2V0IChzdHJ1Y3Qgb21wX3JlZ2lvbiAqcmVnaW9u KQogCX0KIAogICAgICAgYWRqdXN0X2NvbnRleHRfYW5kX3Njb3BlIChyZWdpb24sIGdpbXBs ZV9ibG9jayAoZW50cnlfc3RtdCksIGNoaWxkX2ZuKTsKKworICAgICAgLyogSGFuZGxlIHRo ZSBjYXNlIHRoYXQgYW4gaW5uZXIgYW5jZXN0b3I6MSB0YXJnZXQgaXMgY2FsbGVkIGJ5IGFu IG91dGVyCisJIHRhcmdldCByZWdpb24uICovCisgICAgICBpZiAoIWlzX2FuY2VzdG9yKQor CWNncmFwaF9ub2RlOjpnZXQgKGNoaWxkX2ZuKS0+Y2FsbHNfZGVjbGFyZV92YXJpYW50X2Fs dAorCSAgfD0gY2dyYXBoX25vZGU6OmdldCAoY2Z1bi0+ZGVjbCktPmNhbGxzX2RlY2xhcmVf dmFyaWFudF9hbHQ7CisgICAgICBlbHNlICAvKiBEdXBsaWNhdGUgZnVuY3Rpb24gdG8gY3Jl YXRlIGVtcHR5IG5vbmhvc3QgdmFyaWFudC4gKi8KKwl7CisJICAvKiBFbmFibGUgcGFzc19v bXBfZGV2aWNlX2xvd2VyIHBhc3MuICAqLworCSAgY2dyYXBoX25vZGU6OmdldCAoY2Z1bi0+ ZGVjbCktPmNhbGxzX2RlY2xhcmVfdmFyaWFudF9hbHQgPSAxOworCSAgY2dyYXBoX25vZGUg KmZuMl9ub2RlOworCSAgY2hpbGRfZm4yID0gYnVpbGRfZGVjbCAoREVDTF9TT1VSQ0VfTE9D QVRJT04gKGNoaWxkX2ZuKSwKKwkJCQkgIEZVTkNUSU9OX0RFQ0wsCisJCQkJICBjbG9uZV9m dW5jdGlvbl9uYW1lIChjaGlsZF9mbiwgIm5vaG9zdCIpLAorCQkJCSAgVFJFRV9UWVBFIChj aGlsZF9mbikpOworCSAgaWYgKGluX2x0b19wKQorCSAgICBERUNMX1BSRVNFUlZFX1AgKGNo aWxkX2ZuMikgPSAxOworCSAgVFJFRV9TVEFUSUMgKGNoaWxkX2ZuMikgPSAxOworCSAgREVD TF9BUlRJRklDSUFMIChjaGlsZF9mbjIpID0gMTsKKwkgIERFQ0xfSUdOT1JFRF9QIChjaGls ZF9mbjIpID0gMDsKKwkgIFRSRUVfUFVCTElDIChjaGlsZF9mbjIpID0gMDsKKwkgIERFQ0xf VU5JTkxJTkFCTEUgKGNoaWxkX2ZuMikgPSAxOworCSAgREVDTF9FWFRFUk5BTCAoY2hpbGRf Zm4yKSA9IDA7CisJICBERUNMX0NPTlRFWFQgKGNoaWxkX2ZuMikgPSBOVUxMX1RSRUU7CisJ ICBERUNMX0lOSVRJQUwgKGNoaWxkX2ZuMikgPSBtYWtlX25vZGUgKEJMT0NLKTsKKwkgIEJM T0NLX1NVUEVSQ09OVEVYVCAoREVDTF9JTklUSUFMIChjaGlsZF9mbjIpKSA9IGNoaWxkX2Zu MjsKKwkgIERFQ0xfQVRUUklCVVRFUyAoY2hpbGRfZm4pCisJICAgID0gcmVtb3ZlX2F0dHJp YnV0ZSAoIm9tcCB0YXJnZXQgZW50cnlwb2ludCIsCisJCQkJREVDTF9BVFRSSUJVVEVTIChj aGlsZF9mbikpOworCSAgREVDTF9BVFRSSUJVVEVTIChjaGlsZF9mbjIpCisJICAgID0gdHJl ZV9jb25zIChnZXRfaWRlbnRpZmllciAoIm9tcCB0YXJnZXQgZGV2aWNlX2FuY2VzdG9yX25v aG9zdCIpLAorCQkJIE5VTExfVFJFRSwgY29weV9saXN0IChERUNMX0FUVFJJQlVURVMgKGNo aWxkX2ZuKSkpOworCSAgREVDTF9BVFRSSUJVVEVTIChjaGlsZF9mbikKKwkgICAgPSB0cmVl X2NvbnMgKGdldF9pZGVudGlmaWVyICgib21wIHRhcmdldCBkZXZpY2VfYW5jZXN0b3JfaG9z dCIpLAorCQkJIE5VTExfVFJFRSwgREVDTF9BVFRSSUJVVEVTIChjaGlsZF9mbikpOworCSAg REVDTF9GVU5DVElPTl9TUEVDSUZJQ19PUFRJTUlaQVRJT04gKGNoaWxkX2ZuMikKKwkgICAg PSBERUNMX0ZVTkNUSU9OX1NQRUNJRklDX09QVElNSVpBVElPTiAoY3VycmVudF9mdW5jdGlv bl9kZWNsKTsKKwkgIERFQ0xfRlVOQ1RJT05fU1BFQ0lGSUNfVEFSR0VUIChjaGlsZF9mbjIp CisJICAgID0gREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGN1cnJlbnRfZnVuY3Rp b25fZGVjbCk7CisJICBERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAoY2hpbGRfZm4yKQorCSAg ICA9IERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChjdXJyZW50X2Z1bmN0aW9uX2RlY2wpOwor CisJICBmbjJfbm9kZSA9IGNncmFwaF9ub2RlOjpnZXRfY3JlYXRlIChjaGlsZF9mbjIpOwor CSAgZm4yX25vZGUtPm9mZmxvYWRhYmxlID0gMTsKKwkgIGZuMl9ub2RlLT5mb3JjZV9vdXRw dXQgPSAxOworCSAgbm9kZS0+b2ZmbG9hZGFibGUgPSAwOworCisJICB0ID0gYnVpbGRfZGVj bCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKGNoaWxkX2ZuKSwKKwkJCSAgUkVTVUxUX0RFQ0ws IE5VTExfVFJFRSwgdm9pZF90eXBlX25vZGUpOworCSAgREVDTF9BUlRJRklDSUFMICh0KSA9 IDE7CisJICBERUNMX0lHTk9SRURfUCAodCkgPSAxOworCSAgREVDTF9DT05URVhUICh0KSA9 IGNoaWxkX2ZuMjsKKwkgIERFQ0xfUkVTVUxUIChjaGlsZF9mbjIpID0gdDsKKwkgIERFQ0xf U0FWRURfVFJFRSAoY2hpbGRfZm4yKSA9IGJ1aWxkMSAoUkVUVVJOX0VYUFIsCisJCQkJCQl2 b2lkX3R5cGVfbm9kZSwgTlVMTCk7CisJICB0cmVlIHRtcCA9IERFQ0xfQVJHVU1FTlRTIChj aGlsZF9mbik7CisJICB0ID0gYnVpbGRfZGVjbCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKGNo aWxkX2ZuKSwgUEFSTV9ERUNMLAorCQkJICBERUNMX05BTUUgKHRtcCksIFRSRUVfVFlQRSAo dG1wKSk7CisJICBERUNMX0FSVElGSUNJQUwgKHQpID0gMTsKKwkgIERFQ0xfTkFNRUxFU1Mg KHQpID0gMTsKKwkgIERFQ0xfQVJHX1RZUEUgKHQpID0gcHRyX3R5cGVfbm9kZTsKKwkgIERF Q0xfQ09OVEVYVCAodCkgPSBjdXJyZW50X2Z1bmN0aW9uX2RlY2w7CisJICBUUkVFX1VTRUQg KHQpID0gMTsKKwkgIFRSRUVfUkVBRE9OTFkgKHQpID0gMTsKKwkgIERFQ0xfQVJHVU1FTlRT IChjaGlsZF9mbjIpID0gdDsKKwkgIGdjY19hc3NlcnQgKFRSRUVfQ0hBSU4gKHRtcCkgPT0g TlVMTF9UUkVFKTsKKworCSAgZ2ltcGxpZnlfZnVuY3Rpb25fdHJlZSAoY2hpbGRfZm4yKTsK KwkgIGNncmFwaF9ub2RlOjphZGRfbmV3X2Z1bmN0aW9uIChjaGlsZF9mbjIsIHRydWUpOwor CisJICB2ZWNfc2FmZV9wdXNoIChvZmZsb2FkX2Z1bmNzLCBjaGlsZF9mbjIpOworCSAgaWYg KGR1bXBfZmlsZSAmJiAhZ2ltcGxlX2luX3NzYV9wIChjZnVuKSkKKwkgICAgeworCSAgICAg IGR1bXBfZnVuY3Rpb25faGVhZGVyIChkdW1wX2ZpbGUsIGNoaWxkX2ZuMiwgZHVtcF9mbGFn cyk7CisJICAgICAgZHVtcF9mdW5jdGlvbl90b19maWxlIChjaGlsZF9mbjIsIGR1bXBfZmls ZSwgZHVtcF9mbGFncyk7CisJICAgIH0KKwl9CiAgICAgfQogCiAgIC8qIEVtaXQgYSBsaWJy YXJ5IGNhbGwgdG8gbGF1bmNoIHRoZSBvZmZsb2FkaW5nIHJlZ2lvbiwgb3IgZG8gZGF0YQog ICAgICB0cmFuc2ZlcnMuICAqLwotICB0cmVlIHQxLCB0MiwgdDMsIHQ0LCBkZXBlbmQsIGMs IGNsYXVzZXM7CisgIHRyZWUgdDEsIHQyLCB0MywgdDQsIGRlcGVuZDsKICAgZW51bSBidWls dF9pbl9mdW5jdGlvbiBzdGFydF9peDsKICAgdW5zaWduZWQgaW50IGZsYWdzX2kgPSAwOwog CkBAIC05OTcyLDggKzEwMDU2LDYgQEAgZXhwYW5kX29tcF90YXJnZXQgKHN0cnVjdCBvbXBf cmVnaW9uICpyZWdpb24pCiAgICAgICBnY2NfdW5yZWFjaGFibGUgKCk7CiAgICAgfQogCi0g IGNsYXVzZXMgPSBnaW1wbGVfb21wX3RhcmdldF9jbGF1c2VzIChlbnRyeV9zdG10KTsKLQog ICB0cmVlIGRldmljZSA9IE5VTExfVFJFRTsKICAgbG9jYXRpb25fdCBkZXZpY2VfbG9jID0g VU5LTk9XTl9MT0NBVElPTjsKICAgdHJlZSBnb2FjY19mbGFncyA9IE5VTExfVFJFRTsKQEAg LTEwMDA1LDcgKzEwMDg3LDggQEAgZXhwYW5kX29tcF90YXJnZXQgKHN0cnVjdCBvbXBfcmVn aW9uICpyZWdpb24pCiAJICAgIG5lZWRfZGV2aWNlX2FkanVzdG1lbnQgPSB0cnVlOwogCSAg ZGV2aWNlX2xvYyA9IE9NUF9DTEFVU0VfTE9DQVRJT04gKGMpOwogCSAgaWYgKE9NUF9DTEFV U0VfREVWSUNFX0FOQ0VTVE9SIChjKSkKLQkgICAgc29ycnlfYXQgKGRldmljZV9sb2MsICIl PGFuY2VzdG9yJT4gbm90IHlldCBzdXBwb3J0ZWQiKTsKKwkgICAgZGV2aWNlID0gYnVpbGRf aW50X2NzdCAoaW50ZWdlcl90eXBlX25vZGUsCisJCQkJICAgIEdPTVBfREVWSUNFX0hPU1Rf RkFMTEJBQ0spOwogCX0KICAgICAgIGVsc2UKIAl7CkBAIC0xMDE4Miw3ICsxMDI2NSw3IEBA IGV4cGFuZF9vbXBfdGFyZ2V0IChzdHJ1Y3Qgb21wX3JlZ2lvbiAqcmVnaW9uKQogICBlbHNl CiAgICAgYXJncy5xdWlja19wdXNoIChkZXZpY2UpOwogICBpZiAob2ZmbG9hZGVkKQotICAg IGFyZ3MucXVpY2tfcHVzaCAoYnVpbGRfZm9sZF9hZGRyX2V4cHIgKGNoaWxkX2ZuKSk7Cisg ICAgYXJncy5xdWlja19wdXNoIChidWlsZF9mb2xkX2FkZHJfZXhwciAoY2hpbGRfZm4yID8g Y2hpbGRfZm4yIDogY2hpbGRfZm4pKTsKICAgYXJncy5xdWlja19wdXNoICh0MSk7CiAgIGFy Z3MucXVpY2tfcHVzaCAodDIpOwogICBhcmdzLnF1aWNrX3B1c2ggKHQzKTsKQEAgLTEwMzA0 LDYgKzEwMzg3LDE0IEBAIGV4cGFuZF9vbXBfdGFyZ2V0IChzdHJ1Y3Qgb21wX3JlZ2lvbiAq cmVnaW9uKQogICAgIC8qICBQdXNoIHRlcm1pbmFsIG1hcmtlciAtIHplcm8uICAqLwogICAg IGFyZ3Muc2FmZV9wdXNoIChvYWNjX2xhdW5jaF9wYWNrICgwLCBOVUxMX1RSRUUsIDApKTsK IAorICBpZiAoY2hpbGRfZm4yKQorICAgIHsKKyAgICAgIGcgPSBnaW1wbGVfYnVpbGRfY2Fs bF9pbnRlcm5hbCAoSUZOX0dPTVBfVEFSR0VUX1JFViwgMSwKKwkJCQkgICAgICBidWlsZF9m b2xkX2FkZHJfZXhwciAoY2hpbGRfZm4pKTsKKyAgICAgIGdpbXBsZV9zZXRfbG9jYXRpb24g KGcsIGdpbXBsZV9sb2NhdGlvbiAoZW50cnlfc3RtdCkpOworICAgICAgZ3NpX2luc2VydF9i ZWZvcmUgKCZnc2ksIGcsIEdTSV9TQU1FX1NUTVQpOworICAgIH0KKwogICBnID0gZ2ltcGxl X2J1aWxkX2NhbGxfdmVjIChidWlsdGluX2RlY2xfZXhwbGljaXQgKHN0YXJ0X2l4KSwgYXJn cyk7CiAgIGdpbXBsZV9zZXRfbG9jYXRpb24gKGcsIGdpbXBsZV9sb2NhdGlvbiAoZW50cnlf c3RtdCkpOwogICBnc2lfaW5zZXJ0X2JlZm9yZSAoJmdzaSwgZywgR1NJX1NBTUVfU1RNVCk7 CmRpZmYgLS1naXQgYS9nY2Mvb21wLWxvdy5jYyBiL2djYy9vbXAtbG93LmNjCmluZGV4IGQ3 M2MxNjVmMDI5Li42NGE4YTFhYzA3YiAxMDA2NDQKLS0tIGEvZ2NjL29tcC1sb3cuY2MKKysr IGIvZ2NjL29tcC1sb3cuY2MKQEAgLTIxMDQsNyArMjEwNCw5IEBAIGNyZWF0ZV9vbXBfY2hp bGRfZnVuY3Rpb24gKG9tcF9jb250ZXh0ICpjdHgsIGJvb2wgdGFza19jb3B5KQogICAgICAg aWYgKHRhcmdldF9hdHRyKQogCURFQ0xfQVRUUklCVVRFUyAoZGVjbCkKIAkgID0gdHJlZV9j b25zIChnZXRfaWRlbnRpZmllciAodGFyZ2V0X2F0dHIpLAotCQkgICAgICAgTlVMTF9UUkVF LCBERUNMX0FUVFJJQlVURVMgKGRlY2wpKTsKKwkJICAgICAgIE5VTExfVFJFRSwKKwkJICAg ICAgIHRyZWVfY29ucyAoZ2V0X2lkZW50aWZpZXIgKCJub2Nsb25lIiksIE5VTExfVFJFRSwK KwkJCQkgIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkpKTsKICAgICB9CiAKICAgdCA9IGJ1aWxk X2RlY2wgKERFQ0xfU09VUkNFX0xPQ0FUSU9OIChkZWNsKSwKZGlmZiAtLWdpdCBhL2djYy9v bXAtb2ZmbG9hZC5jYyBiL2djYy9vbXAtb2ZmbG9hZC5jYwppbmRleCAzYTg5MTE5MzcxYy4u NzdiZTA2NjUyNjcgMTAwNjQ0Ci0tLSBhL2djYy9vbXAtb2ZmbG9hZC5jYworKysgYi9nY2Mv b21wLW9mZmxvYWQuY2MKQEAgLTI2MjcsNiArMjYyNyw0NyBAQCBleGVjdXRlX29tcF9kZXZp Y2VfbG93ZXIgKCkKIAl0cmVlIHR5cGUgPSBsaHMgPyBUUkVFX1RZUEUgKGxocykgOiBpbnRl Z2VyX3R5cGVfbm9kZTsKIAlzd2l0Y2ggKGdpbXBsZV9jYWxsX2ludGVybmFsX2ZuIChzdG10 KSkKIAkgIHsKKwkgIGNhc2UgSUZOX0dPTVBfVEFSR0VUX1JFVjoKKwkgICAgeworI2lmbmRl ZiBBQ0NFTF9DT01QSUxFUgorCSAgICAgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaTIgPSBn c2k7CisJICAgICAgZ3NpX25leHQgKCZnc2kyKTsKKwkgICAgICBnY2NfYXNzZXJ0ICghZ3Np X2VuZF9wIChnc2kyKSk7CisJICAgICAgZ2NjX2Fzc2VydCAoZ2ltcGxlX2NhbGxfYnVpbHRp bl9wIChnc2lfc3RtdCAoZ3NpMiksCisJCQkJCQkgQlVJTFRfSU5fR09NUF9UQVJHRVQpKTsK KwkgICAgICB0cmVlIG9sZF9kZWNsCisJCT0gVFJFRV9PUEVSQU5EIChnaW1wbGVfY2FsbF9h cmcgKGdzaV9zdG10IChnc2kyKSwgMSksIDApOworCSAgICAgIHRyZWUgbmV3X2RlY2wgPSBn aW1wbGVfY2FsbF9hcmcgKGdzaV9zdG10IChnc2kpLCAwKTsKKwkgICAgICBnaW1wbGVfY2Fs bF9zZXRfYXJnIChnc2lfc3RtdCAoZ3NpMiksIDEsIG5ld19kZWNsKTsKKwkgICAgICB1cGRh dGVfc3RtdCAoZ3NpX3N0bXQgKGdzaTIpKTsKKwkgICAgICBuZXdfZGVjbCA9IFRSRUVfT1BF UkFORCAobmV3X2RlY2wsIDApOworCSAgICAgIHVuc2lnbmVkIGk7CisJICAgICAgdW5zaWdu ZWQgbnVtX2Z1bmNzID0gdmVjX3NhZmVfbGVuZ3RoIChvZmZsb2FkX2Z1bmNzKTsKKwkgICAg ICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Z1bmNzOyBpKyspCisJCXsKKwkJICBpZiAoKCpvZmZs b2FkX2Z1bmNzKVtpXSA9PSBvbGRfZGVjbCkKKwkJICAgIHsKKwkJICAgICAgKCpvZmZsb2Fk X2Z1bmNzKVtpXSA9IG5ld19kZWNsOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBl bHNlIGlmICgoKm9mZmxvYWRfZnVuY3MpW2ldID09IG5ld19kZWNsKQorCQkgICAgYnJlYWs7 ICAvKiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGlubGluaW5nLiAgKi8KKwkJfQorCSAgICAg IGdjY19hc3NlcnQgKGkgPCBudW1fZnVuY3MpOworI2Vsc2UKKwkgICAgICB0cmVlIG9sZF9k ZWNsID0gVFJFRV9PUEVSQU5EIChnaW1wbGVfY2FsbF9hcmcgKGdzaV9zdG10IChnc2kpLCAw KSwKKwkJCQkJICAgIDApOworI2VuZGlmCisJICAgICAgLyogRklYTUU6IEZpbmQgYSB3YXkg dG8gYWN0dWFsbHkgcHJldmVudCBvdXRwdXR0aW5nIHRoZSBlbXB0eS1ib2R5CisJCSBvbGRf ZGVjbCBhcyBkZWJ1ZyBzeW1ib2wgKyBmdW5jdGlvbiBpbiB0aGUgYXNzZW1ibHkgZmlsZS4g ICovCisJICAgICAgY2dyYXBoX25vZGUgKm5vZGUgPSBjZ3JhcGhfbm9kZTo6Z2V0IChvbGRf ZGVjbCk7CisJICAgICAgbm9kZS0+YWRkcmVzc190YWtlbiA9IGZhbHNlOworCSAgICAgIG5v ZGUtPm5lZWRfbHRvX3N0cmVhbWluZyA9IGZhbHNlOworCSAgICAgIG5vZGUtPm9mZmxvYWRh YmxlID0gZmFsc2U7CisKKwkgICAgICB1bmxpbmtfc3RtdF92ZGVmIChzdG10KTsKKwkgICAg fQorCSAgICBicmVhazsKIAkgIGNhc2UgSUZOX0dPTVBfVVNFX1NJTVQ6CiAJICAgIHJocyA9 IHZmID09IDEgPyBpbnRlZ2VyX3plcm9fbm9kZSA6IGludGVnZXJfb25lX25vZGU7CiAJICAg IGJyZWFrOwpAQCAtMjgwMyw2ICsyODQ0LDE1IEBAIHBhc3Nfb21wX3RhcmdldF9saW5rOjpl eGVjdXRlIChmdW5jdGlvbiAqZnVuKQogCXsKIAkgIGlmIChnaW1wbGVfY2FsbF9idWlsdGlu X3AgKGdzaV9zdG10IChnc2kpLCBCVUlMVF9JTl9HT01QX1RBUkdFVCkpCiAJICAgIHsKKwkg ICAgICB0cmVlIGRldiA9IGdpbXBsZV9jYWxsX2FyZyAoZ3NpX3N0bXQgKGdzaSksIDApOwor CSAgICAgIHRyZWUgZm4gPSBnaW1wbGVfY2FsbF9hcmcgKGdzaV9zdG10IChnc2kpLCAxKTsK KwkgICAgICBpZiAoUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAoZm4pKSkKKwkJZm4gPSBU UkVFX09QRVJBTkQgKGZuLCAwKTsKKwkgICAgICBpZiAoVFJFRV9DT0RFIChkZXYpID09IElO VEVHRVJfQ1NUCisJCSAgJiYgd2k6OnRvX3dpZGUgKGRldikgPT0gR09NUF9ERVZJQ0VfSE9T VF9GQUxMQkFDSworCQkgICYmIGxvb2t1cF9hdHRyaWJ1dGUgKCJvbXAgdGFyZ2V0IGRldmlj ZV9hbmNlc3Rvcl9ub2hvc3QiLAorCQkJCSAgICAgICBERUNMX0FUVFJJQlVURVMgKGZuKSkg IT0gTlVMTF9UUkVFKQorCQljb250aW51ZTsgIC8qIGFuY2VzdG9yOjEgICovCiAJICAgICAg LyogTnVsbGlmeSB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIF9fYnVpbHRpbl9HT01QX3Rhcmdl dF9leHQuICAqLwogCSAgICAgIGdpbXBsZV9jYWxsX3NldF9hcmcgKGdzaV9zdG10IChnc2kp LCAxLCBudWxsX3BvaW50ZXJfbm9kZSk7CiAJICAgICAgdXBkYXRlX3N0bXQgKGdzaV9zdG10 IChnc2kpKTsKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL2dvbXAv cmV2ZXJzZS1vZmZsb2FkLTEuYyBiL2djYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL2dvbXAv cmV2ZXJzZS1vZmZsb2FkLTEuYwppbmRleCAzNDUyMTU2Zjk0OC4uOWEzZmE1MjMwZjggMTAw NjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL2dvbXAvcmV2ZXJzZS1vZmZs b2FkLTEuYworKysgYi9nY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9nb21wL3JldmVyc2Ut b2ZmbG9hZC0xLmMKQEAgLTQzLDcgKzQzLDcgQEAgdGdfZm4gKGludCAqeCwgaW50ICp5KQog ICB4MiA9IHgyICsgMiArIGNhbGxlZF9pbl90YXJnZXQxICgpOwogICB5MiA9IHkyICsgNzsK IAotICAjcHJhZ21hIG9tcCB0YXJnZXQgZGV2aWNlKGFuY2VzdG9yIDogMSkgbWFwKHRvZnJv bTogeDIpICAvKiB7IGRnLW1lc3NhZ2UgInNvcnJ5LCB1bmltcGxlbWVudGVkOiAnYW5jZXN0 b3InIG5vdCB5ZXQgc3VwcG9ydGVkIiB9ICovCisgICNwcmFnbWEgb21wIHRhcmdldCBkZXZp Y2UoYW5jZXN0b3IgOiAxKSBtYXAodG9mcm9tOiB4MikKICAgICBjaGVja19vZmZsb2FkKCZ4 MiwgJnkyKTsKIAogICBpZiAoeDIgIT0gMisyKzMrNDIgfHwgeTIgIT0gMyArIDcpCmRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2MtYysrLWNvbW1vbi9nb21wL3RhcmdldC1kZXZpY2Ut YW5jZXN0b3ItNC5jIGIvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24vZ29tcC90YXJnZXQt ZGV2aWNlLWFuY2VzdG9yLTQuYwppbmRleCAyNDEyMzRmOGRhZi4uODdhYzc1NDhjMjMgMTAw NjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvYy1jKystY29tbW9uL2dvbXAvdGFyZ2V0LWRldmlj ZS1hbmNlc3Rvci00LmMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24vZ29tcC90 YXJnZXQtZGV2aWNlLWFuY2VzdG9yLTQuYwpAQCAtOSw3ICs5LDcgQEAKIHZvaWQKIGZvbyAo dm9pZCkKIHsKLSAgI3ByYWdtYSBvbXAgdGFyZ2V0IGRldmljZSAoYW5jZXN0b3I6IDEpIC8q IHsgZGctbWVzc2FnZSAic29ycnksIHVuaW1wbGVtZW50ZWQ6ICdhbmNlc3Rvcicgbm90IHll dCBzdXBwb3J0ZWQiIH0gKi8KKyAgI3ByYWdtYSBvbXAgdGFyZ2V0IGRldmljZSAoYW5jZXN0 b3I6IDEpCiAgIDsKIAogfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5k Zy9nb21wL3RhcmdldC1kZXZpY2UtYW5jZXN0b3ItNC5mOTAgYi9nY2MvdGVzdHN1aXRlL2dm b3J0cmFuLmRnL2dvbXAvdGFyZ2V0LWRldmljZS1hbmNlc3Rvci00LmY5MAppbmRleCBhYjU2 ZTJkMWQ1Mi4uZDczYWRmMmM1YTcgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2ZvcnRy YW4uZGcvZ29tcC90YXJnZXQtZGV2aWNlLWFuY2VzdG9yLTQuZjkwCisrKyBiL2djYy90ZXN0 c3VpdGUvZ2ZvcnRyYW4uZGcvZ29tcC90YXJnZXQtZGV2aWNlLWFuY2VzdG9yLTQuZjkwCkBA IC02LDcgKzYsNyBAQAogCiAhJG9tcCByZXF1aXJlcyByZXZlcnNlX29mZmxvYWQKIAotISRv bXAgdGFyZ2V0IGRldmljZSAoYW5jZXN0b3IgOiAxKSAgISB7IGRnLW1lc3NhZ2UgInNvcnJ5 LCB1bmltcGxlbWVudGVkOiAnYW5jZXN0b3InIG5vdCB5ZXQgc3VwcG9ydGVkIiB9CishJG9t cCB0YXJnZXQgZGV2aWNlIChhbmNlc3RvciA6IDEpCiAhJG9tcCBlbmQgdGFyZ2V0CiAKIGVu ZApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9nb21wL3RhcmdldC1k ZXZpY2UtYW5jZXN0b3ItNS5mOTAgYi9nY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL2dvbXAv dGFyZ2V0LWRldmljZS1hbmNlc3Rvci01LmY5MAppbmRleCBjYThkNGIyODJhMC4uOTU5NmQ2 MWY2ZmEgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvZ29tcC90YXJn ZXQtZGV2aWNlLWFuY2VzdG9yLTUuZjkwCisrKyBiL2djYy90ZXN0c3VpdGUvZ2ZvcnRyYW4u ZGcvZ29tcC90YXJnZXQtZGV2aWNlLWFuY2VzdG9yLTUuZjkwCkBAIC0xNyw3ICsxNyw3IEBA IGNvbnRhaW5zCiAgICAgYmxvY2sKICAgICAgIGJsb2NrCiAgICAgICAgIGJsb2NrCi0gICAg ICAgICAgISRvbXAgdGFyZ2V0IGRldmljZShhbmNlc3RvcjoxKSAgISB7IGRnLW1lc3NhZ2Ug InNvcnJ5LCB1bmltcGxlbWVudGVkOiAnYW5jZXN0b3InIG5vdCB5ZXQgc3VwcG9ydGVkIiB9 CisgICAgICAgICAgISRvbXAgdGFyZ2V0IGRldmljZShhbmNlc3RvcjoxKQogICAgICAgICAg ICEkb21wIGVuZCB0YXJnZXQKICAgICAgICAgZW5kIGJsb2NrCiAgICAgICBlbmQgYmxvY2sK ZGlmZiAtLWdpdCBhL2xpYmdvbXAvbGliZ29tcC50ZXhpIGIvbGliZ29tcC9saWJnb21wLnRl eGkKaW5kZXggZTg4ZmU4OWE1YjEuLjBmMjk5OGNmOGYxIDEwMDY0NAotLS0gYS9saWJnb21w L2xpYmdvbXAudGV4aQorKysgYi9saWJnb21wL2xpYmdvbXAudGV4aQpAQCAtMjI1LDcgKzIy NSw3IEBAIFRoZSBPcGVuTVAgNC41IHNwZWNpZmljYXRpb24gaXMgZnVsbHkgc3VwcG9ydGVk LgogQGl0ZW0gQGNvZGV7YWxsb2NhdGV9IGNsYXVzZSBAdGFiIFAgQHRhYiBJbml0aWFsIHN1 cHBvcnQKIEBpdGVtIEBjb2Rle3VzZV9kZXZpY2VfYWRkcn0gY2xhdXNlIG9uIEBjb2Rle3Rh cmdldCBkYXRhfSBAdGFiIFkgQHRhYgogQGl0ZW0gQGNvZGV7YW5jZXN0b3J9IG1vZGlmaWVy IG9uIEBjb2Rle2RldmljZX0gY2xhdXNlCi0gICAgICBAdGFiIFAgQHRhYiBSZXZlcnNlIG9m ZmxvYWQgdW5zdXBwb3J0ZWQKKyAgICAgIEB0YWIgWSBAdGFiIFNlZSBjb21tZW50IGZvciBA Y29kZXtyZXF1aXJlc30KIEBpdGVtIEltcGxpY2l0IGRlY2xhcmUgdGFyZ2V0IGRpcmVjdGl2 ZSBAdGFiIFkgQHRhYgogQGl0ZW0gRGlzY29udGlndW91cyBhcnJheSBzZWN0aW9uIHdpdGgg QGNvZGV7dGFyZ2V0IHVwZGF0ZX0gY29uc3RydWN0CiAgICAgICBAdGFiIE4gQHRhYgpkaWZm IC0tZ2l0IGEvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vcmV2ZXJz ZS1vZmZsb2FkLTEtYXV4LmMgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNv bW1vbi9yZXZlcnNlLW9mZmxvYWQtMS1hdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uYjNhMzMxZDEyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnb21w L3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9yZXZlcnNlLW9mZmxvYWQtMS1hdXgu YwpAQCAtMCwwICsxLDEwIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgc2tpcC1h bGwtdGFyZ2V0cyB9IH0gICovCisKKy8qIERlY2xhcmUgdGhlIGZvbGxvd2luZyBmdW5jdGlv biBpbiBhIHNlcGFyYXJlIHRyYW5zbGF0aW9uIHVuaXQKKyAgIHRvIGVuc3VyZSBpdCB3b24n dCBoYXZlIGEgZGV2aWNlIHZlcnNpb24uICAqLworCitpbnQKK2FkZF8zIChpbnQgeCkKK3sK KyAgcmV0dXJuIHggKyAzOworfQpkaWZmIC0tZ2l0IGEvbGliZ29tcC90ZXN0c3VpdGUvbGli Z29tcC5jLWMrKy1jb21tb24vcmV2ZXJzZS1vZmZsb2FkLTEuYyBiL2xpYmdvbXAvdGVzdHN1 aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL3JldmVyc2Utb2ZmbG9hZC0xLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjk3NmUxMjlmNTYwCi0tLSAvZGV2L251 bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vcmV2ZXJz ZS1vZmZsb2FkLTEuYwpAQCAtMCwwICsxLDgzIEBACisvKiB7IGRnLWRvIHJ1biB9ICAqLwor LyogeyBkZy1hZGRpdGlvbmFsLXNvdXJjZXMgcmV2ZXJzZS1vZmZsb2FkLTEtYXV4LmMgfSAq LworCisvKiBDaGVjayB0aGF0IHJldmVyc2Ugb2ZmbG9hZCB3b3JrcyBpbiBwYXJ0aWN1bGFy OgorICAgLSBubyBjb2RlIGlzIGdlbmVyYXRlZCBvbiB0aGUgZGV2aWNlIHNpZGUgKGkuZS4g bm8KKyAgICAgaW1wbGljaXQgZGVjbGFyZSB0YXJnZXQgb2YgY2FsbGVkIGZ1bmN0aW9ucyBh bmQgbm8KKyAgICAgY29kZSBnZW4gZm9yIHRoZSB0YXJnZXQtcmVnaW9uIGJvZHkpCisgICAg IC0+IHdvdWxkIG90aGVyd2lzZSBmYWlsIGR1ZSB0byAnYWRkXzMnIHN5bWJvbAorICAgLSBQ bHVzIHRoZSB1c3VhbCAoY29tcGlsZXMsIHJ1bnMsIHByb2R1Y2VzIGNvcnJlY3QgcmVzdWx0 KQorCisgICBOb3RlOiBSdW5uaW5nIGFsc28gdGhlIG5vbi1yZXZlcnNlLW9mZmxvYWQgdGFy Z2V0IHJlZ2lvbnMKKyAgIG9uIHRoZSBob3N0IChob3N0IGZhbGxiYWNrKSBpcyB2YWxpZCBh bmQgd2lsbCBwYXNzLiAgKi8KKworI3ByYWdtYSBvbXAgcmVxdWlyZXMgcmV2ZXJzZV9vZmZs b2FkCisKK2V4dGVybiBpbnQgYWRkXzMgKGludCk7CisKK3N0YXRpYyBpbnQgZ2xvYmFsX3Zh ciA9IDU7CisKK3ZvaWQKK2NoZWNrX29mZmxvYWQgKGludCAqeCwgaW50ICp5KQoreworICAq eCA9IGFkZF8zICgqeCk7CisgICp5ID0gYWRkXzMgKCp5KTsKK30KKworI3ByYWdtYSBvbXAg ZGVjbGFyZSB0YXJnZXQKK3ZvaWQKK3RnX2ZuIChpbnQgKngsIGludCAqeSkKK3sKKyAgaW50 IHgyID0gKngsIHkyID0gKnk7CisgIGlmICh4MiAhPSAyIHx8IHkyICE9IDMpCisgICAgX19i dWlsdGluX2Fib3J0ICgpOworICB4MiA9IHgyICsgMjsKKyAgeTIgPSB5MiArIDc7CisKKyAg I3ByYWdtYSBvbXAgdGFyZ2V0IGRldmljZShhbmNlc3RvciA6IDEpIG1hcCh0b2Zyb206IHgy KQorICAgIGNoZWNrX29mZmxvYWQoJngyLCAmeTIpOworCisgIGlmICh4MiAhPSAyKzIrMyB8 fCB5MiAhPSAzICsgNykKKyAgICBfX2J1aWx0aW5fYWJvcnQgKCk7CisgICp4ID0geDIsICp5 ID0geTI7Cit9CisjcHJhZ21hIG9tcCBlbmQgZGVjbGFyZSB0YXJnZXQKKwordm9pZAorbXlf ZnVuYyAoaW50ICp4LCBpbnQgKnkpCit7CisgIGlmIChnbG9iYWxfdmFyICE9IDUpCisgICAg X19idWlsdGluX2Fib3J0ICgpOworICBnbG9iYWxfdmFyID0gMjQyOworICAqeCA9IDIqYWRk XzMoKngpOworICAqeSA9IDMqYWRkXzMoKnkpOworfQorCitpbnQKK21haW4gKCkKK3sKKyAg I3ByYWdtYSBvbXAgdGFyZ2V0CisgIHsKKyAgICAgaW50IHggPSAyLCB5ID0gMzsKKyAgICAg dGdfZm4gKCZ4LCAmeSk7CisgIH0KKworICAjcHJhZ21hIG9tcCB0YXJnZXQKKyAgeworICAg ICBpbnQgeCA9IC0yLCB5ID0gLTE7CisgICAgICNwcmFnbWEgb21wIHRhcmdldCBkZXZpY2Ug KCBhbmNlc3RvcjoxICkgZmlyc3Rwcml2YXRlKHkpIG1hcCh0b2Zyb206eCkKKyAgICAgewor ICAgICAgIGlmICh4ICE9IC0yIHx8IHkgIT0gLTEpCisgICAgICAgICBfX2J1aWx0aW5fYWJv cnQgKCk7CisgICAgICAgbXlfZnVuYyAoJngsICZ5KTsKKyAgICAgICBpZiAoeCAhPSAyKigz LTIpIHx8IHkgIT0gMyooMy0xKSkKKyAgICAgICAgIF9fYnVpbHRpbl9hYm9ydCAoKTsKKyAg ICAgfQorICAgICBpZiAoeCAhPSAyKigzLTIpIHx8IHkgIT0gLTEpCisgICAgICAgX19idWls dGluX2Fib3J0ICgpOworICB9CisKKyAgaWYgKGdsb2JhbF92YXIgIT0gMjQyKQorICAgIF9f YnVpbHRpbl9hYm9ydCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJnb21w L3Rlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vcmV2ZXJzZS1vZmZsb2FkLTEtYXV4LmY5MCBi L2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi9yZXZlcnNlLW9mZmxvYWQtMS1h dXguZjkwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4xODA3ZjA2 M2Q1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9y dHJhbi9yZXZlcnNlLW9mZmxvYWQtMS1hdXguZjkwCkBAIC0wLDAgKzEsMTIgQEAKKyEgeyBk Zy1kbyBjb21waWxlIHsgdGFyZ2V0IHNraXAtYWxsLXRhcmdldHMgfSB9CisKKyEgRGVjbGFy ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGluIGEgc2VwYXJhcmUgdHJhbnNsYXRpb24gdW5p dAorISB0byBlbnN1cmUgaXQgd29uJ3QgaGF2ZSBhIGRldmljZSB2ZXJzaW9uLgorCisKK2lu dGVnZXIgZnVuY3Rpb24gYWRkXzMgKHgpCisgIGltcGxpY2l0IG5vbmUKKyAgaW50ZWdlciwg dmFsdWUgOjogeAorCisgIGFkZF8zID0geCArIDMKK2VuZCBmdW5jdGlvbgpkaWZmIC0tZ2l0 IGEvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3JldmVyc2Utb2ZmbG9hZC0x LmY5MCBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi9yZXZlcnNlLW9mZmxv YWQtMS5mOTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjdjZmI4 YjY1NTJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5m b3J0cmFuL3JldmVyc2Utb2ZmbG9hZC0xLmY5MApAQCAtMCwwICsxLDg4IEBACishIHsgZGct ZG8gcnVuIH0KKyEgeyBkZy1hZGRpdGlvbmFsLXNvdXJjZXMgcmV2ZXJzZS1vZmZsb2FkLTEt YXV4LmY5MCB9CisKKyEgQ2hlY2sgdGhhdCByZXZlcnNlIG9mZmxvYWQgd29ya3MgaW4gcGFy dGljdWxhcjoKKyEgLSBubyBjb2RlIGlzIGdlbmVyYXRlZCBvbiB0aGUgZGV2aWNlIHNpZGUg KGkuZS4gbm8KKyEgICBpbXBsaWNpdCBkZWNsYXJlIHRhcmdldCBvZiBjYWxsZWQgZnVuY3Rp b25zIGFuZCBubworISAgIGNvZGUgZ2VuIGZvciB0aGUgdGFyZ2V0LXJlZ2lvbiBib2R5KQor ISAgIC0+IHdvdWxkIG90aGVyd2lzZSBmYWlsIGR1ZSB0byAnYWRkXzMnIHN5bWJvbAorISAt IFBsdXMgdGhlIHVzdWFsIChjb21waWxlcywgcnVucywgcHJvZHVjZXMgY29ycmVjdCByZXN1 bHQpCisKKyEgTm90ZTogUnVubmluZyBhbHNvIHRoZSBub24tcmV2ZXJzZS1vZmZsb2FkIHRh cmdldCByZWdpb25zCishIG9uIHRoZSBob3N0IChob3N0IGZhbGxiYWNrKSBpcyB2YWxpZCBh bmQgd2lsbCBwYXNzLgorCittb2R1bGUgbQorICBpbnRlcmZhY2UKKyAgICBpbnRlZ2VyIGZ1 bmN0aW9uIGFkZF8zICh4KQorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlciwg dmFsdWUgOjogeAorICAgIGVuZCBmdW5jdGlvbgorICBlbmQgaW50ZXJmYWNlCisgIGludGVn ZXIgOjogZ2xvYmFsX3ZhciA9IDUKK2VuZCBtb2R1bGUgbQorCittb2R1bGUgbTIKKyAgdXNl IG0KKyAgISRvbXAgcmVxdWlyZXMgcmV2ZXJzZV9vZmZsb2FkCisgIGltcGxpY2l0IG5vbmUg KHR5cGUsIGV4dGVybmFsKQorY29udGFpbnMKKyAgc3Vicm91dGluZSBjaGVja19vZmZsb2Fk ICh4LCB5KQorICAgIGludGVnZXIgOjogeCwgeQorICAgIHggPSBhZGRfMyh4KQorICAgIHkg PSBhZGRfMyh5KQorICBlbmQgc3Vicm91dGluZSBjaGVja19vZmZsb2FkCisgIHN1YnJvdXRp bmUgbTJfdGdfZm4oeCwgeSkKKyAgICBpbnRlZ2VyIDo6IHgsIHkKKyAgICAhJG9tcCBkZWNs YXJlIHRhcmdldAorICAgIGlmICh4IC89IDIgLm9yLiB5IC89IDMpIHN0b3AgMQorICAgIHgg PSB4ICsgMgorICAgIHkgPSB5ICsgNworICAgICEkb21wIHRhcmdldCBkZXZpY2UoYW5jZXN0 b3IgOiAxKSBtYXAodG9mcm9tOiB4KQorICAgICAgY2FsbCBjaGVja19vZmZsb2FkKHgsIHkp CisgICAgISRvbXAgZW5kIHRhcmdldAorICAgIGlmICh4IC89IDIrMiszIC5vci4geSAvPSAz ICsgNykgc3RvcCAyCisgIGVuZCBzdWJyb3V0aW5lCitlbmQgbW9kdWxlIG0yCisKK3Byb2dy YW0gbWFpbgorICB1c2UgbQorICAhJG9tcCByZXF1aXJlcyByZXZlcnNlX29mZmxvYWQKKyAg aW1wbGljaXQgbm9uZSAodHlwZSwgZXh0ZXJuYWwpCisKKyAgaW50ZWdlciA6OiBwcm9nX3Zh ciA9IDk5CisKKyAgISRvbXAgdGFyZ2V0CisgIGJsb2NrCisgICAgdXNlIG0yCisgICAgaW50 ZWdlciA6OiB4LCB5CisgICAgeCA9IDI7IHkgPSAzCisgICAgY2FsbCBtMl90Z19mbiAoeCwg eSkKKyAgZW5kIGJsb2NrCisKKyAgISRvbXAgdGFyZ2V0CisgIGJsb2NrCisgICAgdXNlIG0y CisgICAgaW50ZWdlciA6OiB4LCB5CisgICAgeCA9IC0yOyB5ID0gLTEKKyAgICAhJG9tcCB0 YXJnZXQgZGV2aWNlICggYW5jZXN0b3I6MSApIGZpcnN0cHJpdmF0ZSh5KSBtYXAodG9mcm9t OngpCisgICAgICBpZiAoeCAvPSAtMiAub3IuIHkgLz0gLTEpIHN0b3AgMworICAgICAgY2Fs bCBteV9mdW5jICh4LCB5KQorICAgICAgaWYgKHggLz0gMiooMy0yKSAub3IuIHkgLz0gMyoo My0xKSkgc3RvcCA1CisgICAgISRvbXAgZW5kIHRhcmdldAorICAgIGlmICh4IC89IDIqKDMt MikgLm9yLiB5IC89IC0xKSBzdG9wIDYKKyAgZW5kIGJsb2NrCisKKyAgaWYgKHByb2dfdmFy IC89IDQxIC5vci4gZ2xvYmFsX3ZhciAvPSAyNDIpIHN0b3AgNworCitjb250YWlucworCisg IHN1YnJvdXRpbmUgbXlfZnVuYyh4LCB5KQorICAgIGludGVnZXIgOjogeCwgeQorICAgIGlm IChwcm9nX3ZhciAvPSA5OSkgc3RvcCA4CisgICAgaWYgKGdsb2JhbF92YXIgLz0gNSkgc3Rv cCA5CisgICAgcHJvZ192YXIgPSA0MQorICAgIGdsb2JhbF92YXIgPSAyNDIKKyAgICB4ID0g MiphZGRfMyh4KQorICAgIHkgPSAzKmFkZF8zKHkpCisgIGVuZCBzdWJyb3V0aW5lIG15X2Z1 bmMKK2VuZAo= --------------VpZ2gUz08Wfd5Q5VltV7TEex--