From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id 875143858D26; Thu, 3 Nov 2022 13:35:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 875143858D26 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.96,235,1665475200"; d="diff'?scan'208";a="86003411" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa4.mentor.iphmx.com with ESMTP; 03 Nov 2022 05:35:14 -0800 IronPort-SDR: UV5Tb4aXr0Y/EfbfiFtHrd2arI0tzZjkSZgbGlv9q43b2r9UYW6rJ/RtIw5WIhXLCTkE5loLpQ EfLWVphVerJSpHpiUt9RRXrEp81i7ojwkpDsyLEIW0k68YL0ldddDaajqcCA89L8i07quVeIgm PnFnRYu27ZrpxaBKG3ekoO6w4JS8Yb95n14Uj2TZn+6fKxNnJyZA3Rn+8L0OoZEuBOEG1RSdaq 6kgcKlZRFwrKLUFvE0pAEKOiTYEXhBhc9N3+msuRIcRcZ+iaCCEN2W27mrVDsP2tRHSuBWLLBL ngg= Content-Type: multipart/mixed; boundary="------------f55BJjaUZPnZj3YyQ62GmIkz" Message-ID: <23585d74-e7dc-10ca-97ac-124a3a513151@codesourcery.com> Date: Thu, 3 Nov 2022 14:35:03 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: [Patch] OpenMP/Fortran: 'target update' with DT components (was: [Patch] OpenMP/Fortran: 'target update' with strides + DT components) Content-Language: en-US To: Jakub Jelinek , Tobias Burnus CC: gcc-patches , fortran References: <51e764f7-635f-9754-dc4b-d2cd2b58435d@codesourcery.com> From: Tobias Burnus In-Reply-To: X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-09.mgc.mentorg.com (139.181.222.9) 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,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: --------------f55BJjaUZPnZj3YyQ62GmIkz Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: quoted-printable On 03.11.22 13:44, Jakub Jelinek wrote: > [...] > Otherwise LGTM, assuming it actually works correctly. > > I don't remember support for non-contiguous copying to/from devices > being actually added, [...] And I think it is not ok to copy bytes > that aren't requested to be copied. I have now removed that stride support and only kept the bug fix and the DT component parts of the patch. The only code change is to remove the stride check disabling in openmp.cc and in one testcase, to remove the stride part. I will commit it as attached, unless there are further comments (or the just started reg testing shows that something does not work). Tobias PS: For strides, I now filed: PR middle-end/107517 "[OpenMP][5.0] 'target update' with strides =E2=80=94 for C/C++ and Fortran" https://gcc.gnu.org/PR107517 ----------------- 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 --------------f55BJjaUZPnZj3YyQ62GmIkz Content-Type: text/x-patch; charset="UTF-8"; name="omp-target-update-v2.diff" Content-Disposition: attachment; filename="omp-target-update-v2.diff" Content-Transfer-Encoding: base64 T3Blbk1QL0ZvcnRyYW46ICd0YXJnZXQgdXBkYXRlJyB3aXRoIERUIGNvbXBvbmVudHMKCk9w ZW5NUCA1LjAgcGVybWl0cyB0byB1c2UgYXJyYXlzIHdpdGggZGVyaXZlZCB0eXBlIGNvbXBv bmVudHMgZm9yIHRoZSBsaXN0Cml0ZW1zIHRvIHRoZSAnZnJvbScvJ3RvJyBjbGF1c2VzIG9m IHRoZSAndGFyZ2V0IHVwZGF0ZScgZGlyZWN0aXZlLgoKZ2NjL2ZvcnRyYW4vQ2hhbmdlTG9n OgoKCSogb3Blbm1wLmNjIChnZmNfbWF0Y2hfb21wX2NsYXVzZXMpOiBQZXJtaXQgZGVyaXZl ZCB0eXBlcyBmb3IKCXRoZSAndG8nIGFuZCAnZnJvbScgY2xhdXNlcyBvZiAndGFyZ2V0IHVw ZGF0ZScuCgkqIHRyYW5zLW9wZW5tcC5jYyAoZ2ZjX3RyYW5zX29tcF9jbGF1c2VzKTogRml4 ZXMgZm9yCglkZXJpdmVkLXR5cGUgY2hhbmdlczsgZml4IHNpemUgZm9yIHNjYWxhcnMuCgps aWJnb21wL0NoYW5nZUxvZzoKCgkqIHRlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vdGFyZ2V0 LTExLmY5MDogTmV3IHRlc3QuCgkqIHRlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vdGFyZ2V0 LTEzLmY5MDogTmV3IHRlc3QuCgogZ2NjL2ZvcnRyYW4vb3Blbm1wLmNjICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgMTAgKy0KIGdjYy9mb3J0cmFuL3RyYW5zLW9wZW5tcC5jYyAg ICAgICAgICAgICAgICAgICAgIHwgICA5ICstCiBsaWJnb21wL3Rlc3RzdWl0ZS9saWJnb21w LmZvcnRyYW4vdGFyZ2V0LTExLmY5MCB8ICA3NSArKysrKysrKysrKwogbGliZ29tcC90ZXN0 c3VpdGUvbGliZ29tcC5mb3J0cmFuL3RhcmdldC0xMy5mOTAgfCAxNTkgKysrKysrKysrKysr KysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDI0NiBpbnNlcnRpb25zKCspLCA3IGRl bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2djYy9mb3J0cmFuL29wZW5tcC5jYyBiL2djYy9m b3J0cmFuL29wZW5tcC5jYwppbmRleCA2NTNjNDNmNzlmZi4uZTBlM2I1MmFkNTcgMTAwNjQ0 Ci0tLSBhL2djYy9mb3J0cmFuL29wZW5tcC5jYworKysgYi9nY2MvZm9ydHJhbi9vcGVubXAu Y2MKQEAgLTI0OTksOSArMjQ5OSwxMCBAQCBnZmNfbWF0Y2hfb21wX2NsYXVzZXMgKGdmY19v bXBfY2xhdXNlcyAqKmNwLCBjb25zdCBvbXBfbWFzayBtYXNrLAogCQkJCQkgICAgICB0cnVl KSA9PSBNQVRDSF9ZRVMpCiAJICAgIGNvbnRpbnVlOwogCSAgaWYgKChtYXNrICYgT01QX0NM QVVTRV9GUk9NKQotCSAgICAgICYmIGdmY19tYXRjaF9vbXBfdmFyaWFibGVfbGlzdCAoImZy b20gKCIsCisJICAgICAgJiYgKGdmY19tYXRjaF9vbXBfdmFyaWFibGVfbGlzdCAoImZyb20g KCIsCiAJCQkJCSAgICAgICZjLT5saXN0c1tPTVBfTElTVF9GUk9NXSwgZmFsc2UsCi0JCQkJ CSAgICAgIE5VTEwsICZoZWFkLCB0cnVlKSA9PSBNQVRDSF9ZRVMpCisJCQkJCSAgICAgIE5V TEwsICZoZWFkLCB0cnVlLCB0cnVlKQorCQkgID09IE1BVENIX1lFUykpCiAJICAgIGNvbnRp bnVlOwogCSAgYnJlYWs7CiAJY2FzZSAnZyc6CkBAIC0zNDM2LDkgKzM0MzcsMTAgQEAgZ2Zj X21hdGNoX29tcF9jbGF1c2VzIChnZmNfb21wX2NsYXVzZXMgKipjcCwgY29uc3Qgb21wX21h c2sgbWFzaywKIAkJY29udGludWU7CiAJICAgIH0KIAkgIGVsc2UgaWYgKChtYXNrICYgT01Q X0NMQVVTRV9UTykKLQkgICAgICAmJiBnZmNfbWF0Y2hfb21wX3ZhcmlhYmxlX2xpc3QgKCJ0 byAoIiwKKwkgICAgICAmJiAoZ2ZjX21hdGNoX29tcF92YXJpYWJsZV9saXN0ICgidG8gKCIs CiAJCQkJCSAgICAgICZjLT5saXN0c1tPTVBfTElTVF9UT10sIGZhbHNlLAotCQkJCQkgICAg ICBOVUxMLCAmaGVhZCwgdHJ1ZSkgPT0gTUFUQ0hfWUVTKQorCQkJCQkgICAgICBOVUxMLCAm aGVhZCwgdHJ1ZSwgdHJ1ZSkKKwkJICA9PSBNQVRDSF9ZRVMpKQogCSAgICBjb250aW51ZTsK IAkgIGJyZWFrOwogCWNhc2UgJ3UnOgpkaWZmIC0tZ2l0IGEvZ2NjL2ZvcnRyYW4vdHJhbnMt b3Blbm1wLmNjIGIvZ2NjL2ZvcnRyYW4vdHJhbnMtb3Blbm1wLmNjCmluZGV4IDliZDRlNmM3 ZTFiLi40YmZkZjg1Y2Q5YiAxMDA2NDQKLS0tIGEvZ2NjL2ZvcnRyYW4vdHJhbnMtb3Blbm1w LmNjCisrKyBiL2djYy9mb3J0cmFuL3RyYW5zLW9wZW5tcC5jYwpAQCAtMzYyNiw3ICszNjI2 LDEwIEBAIGdmY190cmFuc19vbXBfY2xhdXNlcyAoc3RtdGJsb2NrX3QgKmJsb2NrLCBnZmNf b21wX2NsYXVzZXMgKmNsYXVzZXMsCiAJCSAgZ2NjX3VucmVhY2hhYmxlICgpOwogCQl9CiAJ ICAgICAgdHJlZSBub2RlID0gYnVpbGRfb21wX2NsYXVzZSAoaW5wdXRfbG9jYXRpb24sIGNs YXVzZV9jb2RlKTsKLQkgICAgICBpZiAobi0+ZXhwciA9PSBOVUxMIHx8IG4tPmV4cHItPnJl Zi0+dS5hci50eXBlID09IEFSX0ZVTEwpCisJICAgICAgaWYgKG4tPmV4cHIgPT0gTlVMTAor CQkgIHx8IChuLT5leHByLT5yZWYtPnR5cGUgPT0gUkVGX0FSUkFZCisJCSAgICAgICYmIG4t PmV4cHItPnJlZi0+dS5hci50eXBlID09IEFSX0ZVTEwKKwkJICAgICAgJiYgbi0+ZXhwci0+ cmVmLT5uZXh0ID09IE5VTEwpKQogCQl7CiAJCSAgdHJlZSBkZWNsID0gZ2ZjX3RyYW5zX29t cF92YXJpYWJsZSAobi0+c3ltLCBmYWxzZSk7CiAJCSAgaWYgKGdmY19vbXBfcHJpdmF0aXpl X2J5X3JlZmVyZW5jZSAoZGVjbCkpCkBAIC0zNjY2LDEzICszNjY5LDEzIEBAIGdmY190cmFu c19vbXBfY2xhdXNlcyAoc3RtdGJsb2NrX3QgKmJsb2NrLCBnZmNfb21wX2NsYXVzZXMgKmNs YXVzZXMsCiAJCXsKIAkJICB0cmVlIHB0cjsKIAkJICBnZmNfaW5pdF9zZSAoJnNlLCBOVUxM KTsKLQkJICBpZiAobi0+ZXhwci0+cmVmLT51LmFyLnR5cGUgPT0gQVJfRUxFTUVOVCkKKwkJ ICBpZiAobi0+ZXhwci0+cmFuayA9PSAwKQogCQkgICAgewogCQkgICAgICBnZmNfY29udl9l eHByX3JlZmVyZW5jZSAoJnNlLCBuLT5leHByKTsKIAkJICAgICAgcHRyID0gc2UuZXhwcjsK IAkJICAgICAgZ2ZjX2FkZF9ibG9ja190b19ibG9jayAoYmxvY2ssICZzZS5wcmUpOwogCQkg ICAgICBPTVBfQ0xBVVNFX1NJWkUgKG5vZGUpCi0JCQk9IFRZUEVfU0laRV9VTklUIChUUkVF X1RZUEUgKHB0cikpOworCQkJPSBUWVBFX1NJWkVfVU5JVCAoVFJFRV9UWVBFIChUUkVFX1RZ UEUgKHB0cikpKTsKIAkJICAgIH0KIAkJICBlbHNlCiAJCSAgICB7CmRpZmYgLS1naXQgYS9s aWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vdGFyZ2V0LTExLmY5MCBiL2xpYmdv bXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi90YXJnZXQtMTEuZjkwCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5iMGZhYTJlNjIwZAotLS0gL2Rldi9udWxs CisrKyBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi90YXJnZXQtMTEuZjkw CkBAIC0wLDAgKzEsNzUgQEAKKyEgQmFzZWQgb24gbGliZ29tcC5jL3RhcmdldC0yMy5jCisK KyEgeyBkZy1hZGRpdGlvbmFsLW9wdGlvbnMgIi1mZHVtcC10cmVlLW9yaWdpbmFsIiB9Cish IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAib21wIHRhcmdldCB1cGRhdGUgdG9cXCh4 eHNcXFxbM1xcXF0gXFxcW2xlbjogMlxcXF1cXCkiICJvcmlnaW5hbCIgfSB9CishIHsgZGct ZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAib21wIHRhcmdldCB1cGRhdGUgdG9cXChzXFwucyBc XFxbbGVuOiA0XFxcXVxcKSIgIm9yaWdpbmFsIiB9IH0KKyEgeyBkZy1maW5hbCB7IHNjYW4t dHJlZS1kdW1wICJvbXAgdGFyZ2V0IHVwZGF0ZSBmcm9tXFwoc1xcLnMgXFxcW2xlbjogNFxc XF1cXCkiICJvcmlnaW5hbCIgfSB9CisKK21vZHVsZSBtCisgIGltcGxpY2l0IG5vbmUKKyAg dHlwZSBTX3R5cGUKKyAgICBpbnRlZ2VyIHMKKyAgICBpbnRlZ2VyLCBwb2ludGVyIDo6IHUo OikgPT4gbnVsbCgpCisgICAgaW50ZWdlciA6OiB2KDA6NCkKKyAgZW5kIHR5cGUgU190eXBl CisgIGludGVnZXIsIHZvbGF0aWxlIDo6IHoKK2VuZCBtb2R1bGUgbQorCitwcm9ncmFtIG1h aW4KKyAgdXNlIG0KKyAgaW1wbGljaXQgbm9uZQorICBpbnRlZ2VyLCB0YXJnZXQgOjogdSgw OjkpID0gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisgIGxvZ2ljYWwgOjogZXJy CisgIHR5cGUgKFNfdHlwZSkgOjogcworICBpbnRlZ2VyLCBwb2ludGVyIDo6IHYoOikKKyAg aW50ZWdlcihraW5kPTIpIDo6IHh4cyg1KQorICBlcnIgPSAuZmFsc2UuCisgIHMgPSBTX3R5 cGUoOSwgdj1bMTAsIDExLCAxMiwgMTMsIDE0XSkKKyAgcyV1KDA6KSA9PiB1KDM6KQorICB2 KC00KzM6KSA9PiB1KDM6KQorICB4eHMgPSBbLTEsLTIsLTMsLTQsLTVdCisgICEkb21wIHRh cmdldCBlbnRlciBkYXRhIG1hcCAodG86IHMlcywgcyV1LCBzJXUoMDo1KSkgbWFwIChhbGxv YzogcyV2KDE6NCksIHh4cygzOjUpKQorICBzJXMgPSBzJXMgKyAxCisgIHUoMykgPSB1KDMp ICsgMQorICBzJXYoMSkgPSBzJXYoMSkgKyAxCisgIHh4cygzKSA9IC0zMworICB4eHMoNCkg PSAtNDQKKyAgeHhzKDUpID0gLTU1CisgICEkb21wIHRhcmdldCB1cGRhdGUgdG8gKHh4cyg0 KSkKKyAgISRvbXAgdGFyZ2V0IHVwZGF0ZSB0byAocyVzKSB0byAocyV1KDA6MiksIHMldigx OjQpKQorCisgICEkb21wIHRhcmdldCBtYXAgKGFsbG9jOiBzJXMsIHMldigxOjQpKSBtYXAg KGZyb206IGVycikKKyAgICBlcnIgPSAuZmFsc2UuCisgICAgaWYgKHMlcyAvPSAxMCAub3Iu IHMldigxKSAvPSAxMiAub3IuIHMldigyKSAvPSAxMiAub3IuIHMldigzKSAvPSAxMykgJgor ICAgICAgZXJyID0gLnRydWUuCisgICAgaWYgKHYoLTEpIC89IDQgLm9yLiB2KDApIC89IDQg Lm9yLiB2KDEpIC89IDUgLm9yLiB2KDIpIC89IDYgLm9yLiB2KDMpIC89IDcpICYKKyAgICAg IGVyciA9IC50cnVlLgorICAgIGlmICh4eHMoNCkgLz0gLTQ0KSAmCisgICAgICBlcnIgPSAu dHJ1ZS4KKyAgICBzJXMgPSBzJXMgKyAxCisgICAgcyV2KDIpID0gcyV2KDIpICsgMgorICAg IHYoLTEpID0gNQorICAgIHYoMykgPSA5CisgICEkb21wIGVuZCB0YXJnZXQKKworICBpZiAo ZXJyKSAmCisgICAgZXJyb3Igc3RvcAorCisgICEkb21wIHRhcmdldCBtYXAgKGFsbG9jOiBz JXUoMDo1KSkKKyAgICBlcnIgPSAuZmFsc2UuCisgICAgaWYgKHMldSgwKSAvPSA1IC5vci4g cyV1KDEpIC89IDQgLm9yLiBzJXUoMikgLz0gNSAub3IuIHMldSgzKSAvPSA2IC5vci4gcyV1 KDQpIC89IDkpICYKKyAgICAgIGVyciA9IC50cnVlLgorICAgIHMldSgxKSA9IDEyCisgICEk b21wIGVuZCB0YXJnZXQKKworICAhJG9tcCB0YXJnZXQgdXBkYXRlIGZyb20gKHMlcywgcyV1 KDA6NSkpIGZyb20gKHMldigxOjQpKQorICBpZiAoZXJyIC5vci4gcyVzIC89IDExIC5vci4g dSgwKSAvPSAwIC5vci4gdSgxKSAvPSAxIC5vci4gdSgyKSAvPSAyIC5vci4gdSgzKSAvPSA1 ICYKKyAgICAgIC5vci4gdSg0KSAvPSAxMiAub3IuIHUoNSkgLz0gNSAub3IuIHUoNikgLz0g NiAub3IuIHUoNykgLz0gOSAub3IuIHUoOCkgLz0gOCAgICAmCisgICAgICAub3IuIHUoOSkg Lz0gOSAub3IuIHMldigwKSAvPSAxMCAub3IuIHMldigxKSAvPSAxMiAub3IuIHMldigyKSAv PSAxNCAgICAgICAgICAgJgorICAgICAgLm9yLiBzJXYoMykgLz0gMTMgLm9yLiBzJXYoNCkg Lz0gMTQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAg ICBlcnJvciBzdG9wCisgICEgISRvbXAgdGFyZ2V0IGV4aXQgZGF0YSBtYXAgKHJlbGVhc2U6 IHMlcykKKyAgISAhJG9tcCB0YXJnZXQgZXhpdCBkYXRhIG1hcCAocmVsZWFzZTogcyV1KDA6 NSkpCisgICEgISRvbXAgdGFyZ2V0IGV4aXQgZGF0YSBtYXAgKGRlbGV0ZTogcyV2KDE6NCkp CisgICEgISRvbXAgdGFyZ2V0IGV4aXQgZGF0YSBtYXAgKHJlbGVhc2U6IHMlcykKK2VuZApk aWZmIC0tZ2l0IGEvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3RhcmdldC0x My5mOTAgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vdGFyZ2V0LTEzLmY5 MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNmFhY2M3Nzg0NDkK LS0tIC9kZXYvbnVsbAorKysgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4v dGFyZ2V0LTEzLmY5MApAQCAtMCwwICsxLDE1OSBAQAorbW9kdWxlIG0KKyAgaW1wbGljaXQg bm9uZQorICB0eXBlIHQKKyAgICBpbnRlZ2VyIDo6IHMsIGEoNSkKKyAgZW5kIHR5cGUgdAor CisgIHR5cGUgdDIKKyAgICBpbnRlZ2VyIDo6IHMsIGEoNSkKKyAgICB0eXBlKHQpIDo6IHN0 LCBhdCgyOjMpCisgIGVuZCB0eXBlIHQyCisKKyAgaW50ZXJmYWNlIG9wZXJhdG9yKC89KQor ICAgIHByb2NlZHVyZSBuZV9jb21wYXJlX3QKKyAgICBwcm9jZWR1cmUgbmVfY29tcGFyZV90 MgorICBlbmQgaW50ZXJmYWNlCisKK2NvbnRhaW5zCisKKyAgbG9naWNhbCBwdXJlIGVsZW1l bnRhbCBmdW5jdGlvbiBuZV9jb21wYXJlX3QgKGEsIGIpIHJlc3VsdChyZXMpCisgICAgdHlw ZSh0KSwgaW50ZW50KGluKSA6OiBhLCBiCisgICAgcmVzID0gKGElcyAvPSBiJXMpIC5vci4g YW55KGElYSAvPSBiJWEpCisgIGVuZCBmdW5jdGlvbgorCisgIGxvZ2ljYWwgcHVyZSBlbGVt ZW50YWwgZnVuY3Rpb24gbmVfY29tcGFyZV90MiAoYSwgYikgcmVzdWx0KHJlcykKKyAgICB0 eXBlKHQyKSwgaW50ZW50KGluKSA6OiBhLCBiCisgICAgcmVzID0gKGElcyAvPSBiJXMpIC5v ci4gYW55KGElYSAvPSBiJWEpICAgICAmCisgICAgICAgICAgLm9yLiAoYSVzdCAvPSBiJXN0 KSAub3IuIGFueShhJWF0IC89IGIlYXQpCisgIGVuZCBmdW5jdGlvbgorZW5kIG1vZHVsZSBt CisKK3Byb2dyYW0gcAordXNlIG0KK2ltcGxpY2l0IG5vbmUKKwordHlwZSh0MikgOjogdmFy MSwgdmFyMig1KSwgdmFyMyg6KQordHlwZSh0MikgOjogdmFyMWEsIHZhcjJhKDUpLCB2YXIz YSg6KQorYWxsb2NhdGFibGUgOjogdmFyMywgdmFyM2EKK2xvZ2ljYWwgOjogc2hhcmVkX21l bW9yeSA9IC5mYWxzZS4KKworISRvbXAgdGFyZ2V0IG1hcCh0bzogc2hhcmVkX21lbW9yeSkK KyAgc2hhcmVkX21lbW9yeSA9IC50cnVlLgorISRvbXAgZW5kIHRhcmdldAorCit2YXIxID0g VDIoMSwgWzEsMiwzLDQsNV0sIFQoMTEsIFsxMSwyMiwzMyw0NCw1NV0pLCAmCisgICAgICAg ICAgW1QoLTExLCBbLTExLC0yMiwtMzMsLTQ0LC01NV0pLCBUKDExLCBbMTEsMjIsMzMsNDQs NTVdKV0pCisKK3ZhcjIgPSBbVDIoMTAxLCBbMjAxLDIwMiwyMDMsMjA0LDIwNV0sIFQoMjAx MSwgWzIwMTEsMjAyMiwyMDMzLDIwNDQsMjA1NV0pLCAmCisgICAgICAgICAgIFtUKC0xMSwg Wy0xMSwtMjIsLTMzLC00NCwtNTVdKSwgVCgxMSwgWzExLDIyLDMzLDQ0LDU1XSldKSwgICAg ICAgJgorICAgICAgICBUMigxMTEsIFsyMTEsMjEyLDIxMywyMTQsMjE1XSwgVCgyMTExLCBb MjExMSwyMTIyLDIxMzMsMjE0NCwyMTU1XSksICYKKyAgICAgICAgICAgW1QoLTExLCBbLTEx LC0yMiwtMzMsLTQ0LC01NV0pLCBUKDExLCBbMTEsMjIsMzMsNDQsNTVdKV0pLCAgICAgICAm CisgICAgICAgIFQyKDEyMSwgWzIyMSwyMjIsMjIzLDIyNCwyMjVdLCBUKDIyMTEsIFsyMjEx LDIyMjIsMjIzMywyMjQ0LDIyNTVdKSwgJgorICAgICAgICAgICBbVCgtMTEsIFstMTEsLTIy LC0zMywtNDQsLTU1XSksIFQoMTEsIFsxMSwyMiwzMyw0NCw1NV0pXSksICAgICAgICYKKyAg ICAgICAgVDIoMTMxLCBbMjMxLDIzMiwyMzMsMjM0LDIzNV0sIFQoMjMxMSwgWzIzMTEsMjMy MiwyMzMzLDIzNDQsMjM1NV0pLCAmCisgICAgICAgICAgIFtUKC0xMSwgWy0xMSwtMjIsLTMz LC00NCwtNTVdKSwgVCgxMSwgWzExLDIyLDMzLDQ0LDU1XSldKSwgICAgICAgJgorICAgICAg ICBUMigxNDEsIFsyNDEsMjQyLDI0MywyNDQsMjQ1XSwgVCgyNDExLCBbMjQxMSwyNDIyLDI0 MzMsMjQ0NCwyNDU1XSksICYKKyAgICAgICAgICAgW1QoLTExLCBbLTExLC0yMiwtMzMsLTQ0 LC01NV0pLCBUKDExLCBbMTEsMjIsMzMsNDQsNTVdKV0pXQorCit2YXIzID0gW1QyKDMwMSwg WzQwMSw0MDIsNDAzLDQwNCw0MDVdLCBUKDQwMTEsIFs0MDExLDQwMjIsNDAzMyw0MDQ0LDQw NTVdKSwgJgorICAgICAgICAgICBbVCgtMTEsIFstMTEsLTIyLC0zMywtNDQsLTU1XSksIFQo MTEsIFsxMSwyMiwzMyw0NCw1NV0pXSksICAgICAgICYKKyAgICAgICAgVDIoMzExLCBbNDEx LDQxMiw0MTMsNDE0LDQxNV0sIFQoNDExMSwgWzQxMTEsNDEyMiw0MTMzLDQxNDQsNDE1NV0p LCAmCisgICAgICAgICAgIFtUKC0xMSwgWy0xMSwtMjIsLTMzLC00NCwtNTVdKSwgVCgxMSwg WzExLDIyLDMzLDQ0LDU1XSldKSwgICAgICAgJgorICAgICAgICBUMigzMjEsIFs0MjEsNDIy LDQyMyw0MjQsNDI1XSwgVCg0MjExLCBbNDIxMSw0MjIyLDQyMzMsNDI0NCw0MjU1XSksICYK KyAgICAgICAgICAgW1QoLTExLCBbLTExLC0yMiwtMzMsLTQ0LC01NV0pLCBUKDExLCBbMTEs MjIsMzMsNDQsNTVdKV0pLCAgICAgICAmCisgICAgICAgIFQyKDMzMSwgWzQzMSw0MzIsNDMz LDQzNCw0MzVdLCBUKDQzMTEsIFs0MzExLDQzMjIsNDMzMyw0MzQ0LDQzNTVdKSwgJgorICAg ICAgICAgICBbVCgtMTEsIFstMTEsLTIyLC0zMywtNDQsLTU1XSksIFQoMTEsIFsxMSwyMiwz Myw0NCw1NV0pXSksICAgICAgICYKKyAgICAgICAgVDIoMzQxLCBbNDQxLDQ0Miw0NDMsNDQ0 LDQ0NV0sIFQoNDQxMSwgWzQ0MTEsNDQyMiw0NDMzLDQ0NDQsNDQ1NV0pLCAmCisgICAgICAg ICAgIFtUKC0xMSwgWy0xMSwtMjIsLTMzLC00NCwtNTVdKSwgVCgxMSwgWzExLDIyLDMzLDQ0 LDU1XSldKV0KKwordmFyMWEgPSB2YXIxCit2YXIyYSA9IHZhcjIKK3ZhcjNhID0gdmFyMwor CishJG9tcCB0YXJnZXQgZW50ZXIgZGF0YSBtYXAodG86dmFyMSkKKyEkb21wIHRhcmdldCBl bnRlciBkYXRhIG1hcCh0bzp2YXIyKQorISRvbXAgdGFyZ2V0IGVudGVyIGRhdGEgbWFwKHRv OnZhcjMpCisKKyEgLS0tLS0tLS0tLS0tLS0tCisKKyEkb21wIHRhcmdldCB1cGRhdGUgZnJv bSh2YXIxJWF0KDI6MykpCisKK2lmICh2YXIxYSAvPSB2YXIxKSBlcnJvciBzdG9wCitpZiAo YW55ICh2YXIyYSAvPSB2YXIyKSkgZXJyb3Igc3RvcAoraWYgKGFueSAodmFyM2EgLz0gdmFy MykpIGVycm9yIHN0b3AKKworISAtLS0tLS0tLS0tLS0tLS0KKworISRvbXAgdGFyZ2V0Cisg IHZhcjElc3QlcyA9IDEyNDMKKyAgdmFyMigzKSVhdCgyKSA9IFQoMTIzLCBbMzQ1LDY0LDM1 NiwzOSwxM10pCisgIHZhcjIoMyklYXQoMykgPSBUKDQ4LCBbNzQsMTYyLDU3MiwzNTcsM10p CishJG9tcCBlbmQgdGFyZ2V0CisKK2lmICgubm90LiBzaGFyZWRfbWVtb3J5KSB0aGVuCisg IGlmICh2YXIxIC89IHZhcjEpIGVycm9yIHN0b3AKKyAgaWYgKGFueSAodmFyMmEgLz0gdmFy MikpIGVycm9yIHN0b3AKKyAgaWYgKGFueSAodmFyM2EgLz0gdmFyMykpIGVycm9yIHN0b3AK K2VuZGlmCisKKyEkb21wIHRhcmdldCB1cGRhdGUgZnJvbSh2YXIxJXN0KSBmcm9tKHZhcjIo MyklYXQoMjozKSkKKwordmFyMWElc3QlcyA9IDEyNDMKK3ZhcjJhKDMpJWF0KDIpID0gVCgx MjMsIFszNDUsNjQsMzU2LDM5LDEzXSkKK3ZhcjJhKDMpJWF0KDMpID0gVCg0OCwgWzc0LDE2 Miw1NzIsMzU3LDNdKQoraWYgKHZhcjEgLz0gdmFyMSkgZXJyb3Igc3RvcAoraWYgKGFueSAo dmFyMmEgLz0gdmFyMikpIGVycm9yIHN0b3AKK2lmIChhbnkgKHZhcjNhIC89IHZhcjMpKSBl cnJvciBzdG9wCisKKyEgLS0tLS0tLS0tLS0tLS0tCisKK3ZhcjMoMSkgPSB2YXIyKDEpCit2 YXIxJWF0KDIpJWEgPSB2YXIyKDEpJWEKK3ZhcjElYXQoMyklYSA9IHZhcjIoMiklYQorCit2 YXIxYSA9IHZhcjEKK3ZhcjJhID0gdmFyMgordmFyM2EgPSB2YXIzCisKKyEkb21wIHRhcmdl dCB1cGRhdGUgdG8odmFyMykgdG8odmFyMSVhdCgyOjMpKQorCishJG9tcCB0YXJnZXQKKyAg dmFyMygxKSVzID0gdmFyMygxKSVzICsgMTIzCisgIHZhcjElYXQoMiklYSA9IHZhcjElYXQo MiklYSAqIDcKKyAgdmFyMSVhdCgzKSVzID0gdmFyMSVhdCgzKSVzICogKC0zKQorISRvbXAg ZW5kIHRhcmdldAorCitpZiAoLm5vdC4gc2hhcmVkX21lbW9yeSkgdGhlbgorICBpZiAodmFy MSAvPSB2YXIxKSBlcnJvciBzdG9wCisgIGlmIChhbnkgKHZhcjJhIC89IHZhcjIpKSBlcnJv ciBzdG9wCisgIGlmIChhbnkgKHZhcjNhIC89IHZhcjMpKSBlcnJvciBzdG9wCitlbmRpZgor Cit2YXIzYSgxKSVzID0gdmFyM2EoMSklcyArIDEyMwordmFyMWElYXQoMiklYSA9IHZhcjFh JWF0KDIpJWEgKiA3Cit2YXIxYSVhdCgzKSVzID0gdmFyMWElYXQoMyklcyAqICgtMykKKwor YmxvY2sKKyAgaW50ZWdlciwgdm9sYXRpbGUgOjogaTEsaTIsaTMsaTQKKyAgaTEgPSAxCisg IGkyID0gMgorICBpMyA9IDEKKyAgaTQgPSAyCisgICEkb21wIHRhcmdldCB1cGRhdGUgZnJv bSh2YXIzKGkxOmkyKSkgZnJvbSh2YXIxJWF0KGkzOmk0KSkKKyAgaTEgPSAzCisgIGkyID0g MworICBpMyA9IDEKKyAgaTQgPSA1CisgICEkb21wIHRhcmdldCB1cGRhdGUgZnJvbSh2YXIx JWF0KGkxKSVzKSBmcm9tKHZhcjElYXQoaTIpJWEoaTM6aTQpKQorZW5kIGJsb2NrCisKK2lm ICh2YXIxIC89IHZhcjEpIGVycm9yIHN0b3AKK2lmIChhbnkgKHZhcjJhIC89IHZhcjIpKSBl cnJvciBzdG9wCitpZiAoYW55ICh2YXIzYSAvPSB2YXIzKSkgZXJyb3Igc3RvcAorCishIC0t LS0tLS0tLS0tLS0tLQorCishJG9tcCB0YXJnZXQgZXhpdCBkYXRhIG1hcChmcm9tOnZhcjEp CishJG9tcCB0YXJnZXQgZXhpdCBkYXRhIG1hcChmcm9tOnZhcjIpCishJG9tcCB0YXJnZXQg ZXhpdCBkYXRhIG1hcChmcm9tOnZhcjMpCitlbmQK --------------f55BJjaUZPnZj3YyQ62GmIkz--