From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl1-x629.google.com (mail-pl1-x629.google.com [IPv6:2607:f8b0:4864:20::629]) by sourceware.org (Postfix) with ESMTPS id 55D533857354 for ; Wed, 21 Sep 2022 07:46:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 55D533857354 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-pl1-x629.google.com with SMTP id d24so4832861pls.4 for ; Wed, 21 Sep 2022 00:46:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:subject:from:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date; bh=/dF2cCK8oYwosoS8ez5BGx5heXtu9DI/Tkguim+0zLo=; b=BYdmZtOV/rctRa7fxsl1b9cBu1ktV593Xu5X6Xyv3F6cAf5N61N2jqFiL0xC1VevZi sltoCHBOTtqEb0HMzwNkAldrRTCCwrkjrzVJzgN3bquQnXAbjm3ezRXeDHD3i1ecHLbG bb/5kE+Oar6mEXxVSWTdhliSUF+fxND82vktEThznh0i+zOjBA+ld7EPFy8BNkDNwapA ZO30rtvwHHBSyaJtv8Dnc47k4y4rlj5aEnUUK2QeGIDQhAdvfDBMbz12rqoHQWl0ZbIC +mKkOwjxsUpyVAIRoxjVhRmjwY0/xF0DJE1NFCe0azyYi84FgAvVbmow4QrDAMc+laVX w6qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:from:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date; bh=/dF2cCK8oYwosoS8ez5BGx5heXtu9DI/Tkguim+0zLo=; b=iZ2qD5UVK6dSYq08qrosJS8cSIxwVUlVmULxIPM+HJB8E4OI6AjdgkwWeFvbj4wCHz bIiWelsj5ANlFCyp6zuJivbB3pzNu/Bnp6NgroAw3dgfEyKm8c223nLNsw0wv64N+kiR uIpSoKZPFkbKwyNqMuIEfwfGVjMdAkDt63gsc8nVEOG2I1AuetYEfBcNK6MPnUURHMz6 W7qDBcG5C7CvZSvHcuWWo5KjnlLtmaIBPmTeIkRp5xGCTkOvWd5eRZ6qYhJ8leZRnxyw /jJVJ+InAeb9EcVOxUK1flen0rrV4b03vcp66dAMkmudDnYf4xgqfDQZCWIl2tvs6ovb nrTw== X-Gm-Message-State: ACrzQf2HitBbAzoMrlXZncNgZJo7EXbZ7d58xYl81VqeVR6/bT2tGH+4 g/diEdIi816tUmzRZ00B8vwpQ5SZ+aEf/A== X-Google-Smtp-Source: AMsMyM6sXnBIiKxy8zjR27rHs4N2GDxhY+a9WE12HPtSBznp7ZdUgn+s0bE1bTRHBnEgDtZOfGCFQA== X-Received: by 2002:a17:90b:3809:b0:202:b482:b7d6 with SMTP id mq9-20020a17090b380900b00202b482b7d6mr7959021pjb.209.1663746358922; Wed, 21 Sep 2022 00:45:58 -0700 (PDT) Received: from [192.168.50.11] (112-104-15-252.adsl.dynamic.seed.net.tw. [112.104.15.252]) by smtp.gmail.com with ESMTPSA id c190-20020a624ec7000000b00540f3ac5fb8sm1360573pfb.69.2022.09.21.00.45.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 21 Sep 2022 00:45:57 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------UythbqvxWA9TX48rw7hhYH0K" Message-ID: <16675a67-3dd2-fc62-fd38-6eaa24da66f7@gmail.com> Date: Wed, 21 Sep 2022 15:45:54 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:91.0) Gecko/20100101 Thunderbird/91.13.0 Content-Language: en-US From: Chung-Lin Tang Subject: [PATCH, nvptx, 2/2] Reimplement libgomp barriers for nvptx: bar.red instruction support in GCC To: gcc-patches , Tom de Vries , Catherine Moore X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_BARRACUDACENTRAL,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,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: This is a multi-part message in MIME format. --------------UythbqvxWA9TX48rw7hhYH0K Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Tom, following the first patch. This new barrier implementation I posted in the first patch uses the 'bar.red' instruction. Usually this could've been easily done with a single line of inline assembly. However I quickly realized that because the NVPTX GCC port is implemented with all virtual general registers, we don't have a register constraint usable to select "predicate registers". Since bar.red uses predicate typed values, I can't create it directly using inline asm. So it appears that the most simple way of accessing it is with a target builtin. The attached patch adds bar.red instructions to the nvptx port, and __builtin_nvptx_bar_red_* builtins to use it. The code should support all variations of bar.red (and, or, and popc operations). (This support was used to implement the first libgomp barrier patch, so must be approved together) Thanks, Chung-Lin 2022-09-21 Chung-Lin Tang gcc/ChangeLog: * config/nvptx/nvptx.cc (nvptx_print_operand): Add 'p' case, adjust comments. (enum nvptx_builtins): Add NVPTX_BUILTIN_BAR_RED_AND, NVPTX_BUILTIN_BAR_RED_OR, and NVPTX_BUILTIN_BAR_RED_POPC. (nvptx_expand_bar_red): New function. (nvptx_init_builtins): Add DEFs of __builtin_nvptx_bar_red_[and/or/popc]. (nvptx_expand_builtin): Use nvptx_expand_bar_red to expand NVPTX_BUILTIN_BAR_RED_[AND/OR/POPC] cases. * config/nvptx/nvptx.md (define_c_enum "unspecv"): Add UNSPECV_BARRED_AND, UNSPECV_BARRED_OR, and UNSPECV_BARRED_POPC. (BARRED): New int iterator. (barred_op,barred_mode,barred_ptxtype): New int attrs. (nvptx_barred_): New define_insn. --------------UythbqvxWA9TX48rw7hhYH0K Content-Type: text/plain; charset=UTF-8; name="nvptx-gcc-bar_red.patch" Content-Disposition: attachment; filename="nvptx-gcc-bar_red.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvbnZwdHgvbnZwdHguY2MgYi9nY2MvY29uZmlnL252 cHR4L252cHR4LmNjCmluZGV4IDQ5Y2M2ODEuLmFmYzNhODkwIDEwMDY0NAotLS0gYS9nY2Mv Y29uZmlnL252cHR4L252cHR4LmNjCisrKyBiL2djYy9jb25maWcvbnZwdHgvbnZwdHguY2MK QEAgLTI4NzksNiArMjg3OSw3IEBAIG52cHR4X21lbV9tYXliZV9zaGFyZWRfcCAoY29uc3Rf cnR4IHgpCiAgICB0IC0tIHByaW50IGEgdHlwZSBvcGNvZGUgc3VmZml4LCBwcm9tb3Rpbmcg UUltb2RlIHRvIDMyIGJpdHMKICAgIFQgLS0gcHJpbnQgYSB0eXBlIHNpemUgaW4gYml0cwog ICAgdSAtLSBwcmludCBhIHR5cGUgb3Bjb2RlIHN1ZmZpeCB3aXRob3V0IHByb21vdGlvbnMu CisgICBwIC0tIHByaW50IGEgJyEnIGZvciBjb25zdGFudCAwLgogICAgeCAtLSBwcmludCBh IGRlc3RpbmF0aW9uIG9wZXJhbmQgdGhhdCBtYXkgYWxzbyBiZSBhIGJpdCBidWNrZXQuICAq LwogCiBzdGF0aWMgdm9pZApAQCAtMzAxMiw2ICszMDEzLDExIEBAIG52cHR4X3ByaW50X29w ZXJhbmQgKEZJTEUgKmZpbGUsIHJ0eCB4LCBpbnQgY29kZSkKICAgICAgIGZwcmludGYgKGZp bGUsICJAISIpOwogICAgICAgZ290byBjb21tb247CiAKKyAgICBjYXNlICdwJzoKKyAgICAg IGlmIChJTlRWQUwgKHgpID09IDApCisJZnByaW50ZiAoZmlsZSwgIiEiKTsKKyAgICAgIGJy ZWFrOworCiAgICAgY2FzZSAnYyc6CiAgICAgICBtb2RlID0gR0VUX01PREUgKFhFWFAgKHgs IDApKTsKICAgICAgIHN3aXRjaCAoeF9jb2RlKQpAQCAtNjE1MSw5ICs2MTU3LDkwIEBAIGVu dW0gbnZwdHhfYnVpbHRpbnMKICAgTlZQVFhfQlVJTFRJTl9DTVBfU1dBUExMLAogICBOVlBU WF9CVUlMVElOX01FTUJBUl9HTCwKICAgTlZQVFhfQlVJTFRJTl9NRU1CQVJfQ1RBLAorICBO VlBUWF9CVUlMVElOX0JBUl9SRURfQU5ELAorICBOVlBUWF9CVUlMVElOX0JBUl9SRURfT1Is CisgIE5WUFRYX0JVSUxUSU5fQkFSX1JFRF9QT1BDLAogICBOVlBUWF9CVUlMVElOX01BWAog fTsKIAorLyogRXhwYW5kZXIgZm9yICdiYXIucmVkJyBpbnN0cnVjdGlvbiBidWlsdGlucy4g ICovCisKK3N0YXRpYyBydHgKK252cHR4X2V4cGFuZF9iYXJfcmVkICh0cmVlIGV4cCwgcnR4 IHRhcmdldCwKKwkJICAgICAgbWFjaGluZV9tb2RlIEFSR19VTlVTRUQgKG0pLCBpbnQgQVJH X1VOVVNFRCAoaWdub3JlKSkKK3sKKyAgaW50IGNvZGUgPSBERUNMX01EX0ZVTkNUSU9OX0NP REUgKFRSRUVfT1BFUkFORCAoQ0FMTF9FWFBSX0ZOIChleHApLCAwKSk7CisgIG1hY2hpbmVf bW9kZSBtb2RlID0gVFlQRV9NT0RFIChUUkVFX1RZUEUgKGV4cCkpOworCisgIGlmICghdGFy Z2V0KQorICAgIHRhcmdldCA9IGdlbl9yZWdfcnR4IChtb2RlKTsKKworICBydHggcHJlZCwg ZHN0OworICBydHggYmFyID0gZXhwYW5kX2V4cHIgKENBTExfRVhQUl9BUkcgKGV4cCwgMCks CisJCQkgTlVMTF9SVFgsIFNJbW9kZSwgRVhQQU5EX05PUk1BTCk7CisgIHJ0eCBudGhyID0g ZXhwYW5kX2V4cHIgKENBTExfRVhQUl9BUkcgKGV4cCwgMSksCisJCQkgIE5VTExfUlRYLCBT SW1vZGUsIEVYUEFORF9OT1JNQUwpOworICBydHggY3BsID0gZXhwYW5kX2V4cHIgKENBTExf RVhQUl9BUkcgKGV4cCwgMiksCisJCQkgTlVMTF9SVFgsIFNJbW9kZSwgRVhQQU5EX05PUk1B TCk7CisgIHJ0eCByZWRvcCA9IGV4cGFuZF9leHByIChDQUxMX0VYUFJfQVJHIChleHAsIDMp LAorCQkJICAgTlVMTF9SVFgsIFNJbW9kZSwgRVhQQU5EX05PUk1BTCk7CisgIGlmIChDT05T VF9JTlRfUCAoYmFyKSkKKyAgICB7CisgICAgICBpZiAoSU5UVkFMIChiYXIpIDwgMCB8fCBJ TlRWQUwgKGJhcikgPiAxNSkKKwl7CisJICBlcnJvcl9hdCAoRVhQUl9MT0NBVElPTiAoZXhw KSwKKwkJICAgICJiYXJyaWVyIHZhbHVlIG11c3QgYmUgd2l0aGluIFswLDE1XSIpOworCSAg cmV0dXJuIGNvbnN0MF9ydHg7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoIVJFR19QIChiYXIp KQorICAgIGJhciA9IGNvcHlfdG9fbW9kZV9yZWcgKFNJbW9kZSwgYmFyKTsKKworICBpZiAo IUNPTlNUX0lOVF9QIChudGhyKSAmJiAhUkVHX1AgKG50aHIpKQorICAgIG50aHIgPSBjb3B5 X3RvX21vZGVfcmVnIChTSW1vZGUsIG50aHIpOworCisgIGlmICghQ09OU1RfSU5UX1AgKGNw bCkpCisgICAgeworICAgICAgZXJyb3JfYXQgKEVYUFJfTE9DQVRJT04gKGV4cCksCisJCSJj b21wbGVtZW50IGFyZ3VtZW50IG11c3QgYmUgY29uc3RhbnQiKTsKKyAgICAgIHJldHVybiBj b25zdDBfcnR4OworICAgIH0KKworICBwcmVkID0gZ2VuX3JlZ19ydHggKEJJbW9kZSk7Cisg IGlmICghUkVHX1AgKHJlZG9wKSkKKyAgICByZWRvcCA9IGNvcHlfdG9fbW9kZV9yZWcgKFNJ bW9kZSwgcmVkb3ApOworICBlbWl0X2luc24gKGdlbl9ydHhfU0VUIChwcmVkLCBnZW5fcnR4 X05FIChCSW1vZGUsIHJlZG9wLCBHRU5fSU5UICgwKSkpKTsKKyAgcmVkb3AgPSBwcmVkOwor CisgIHJ0eCBwYXQ7CisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBOVlBUWF9C VUlMVElOX0JBUl9SRURfQU5EOgorICAgICAgZHN0ID0gZ2VuX3JlZ19ydHggKEJJbW9kZSk7 CisgICAgICBwYXQgPSBnZW5fbnZwdHhfYmFycmVkX2FuZCAoZHN0LCBiYXIsIG50aHIsIGNw bCwgcmVkb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOVlBUWF9CVUlMVElOX0JBUl9S RURfT1I6CisgICAgICBkc3QgPSBnZW5fcmVnX3J0eCAoQkltb2RlKTsKKyAgICAgIHBhdCA9 IGdlbl9udnB0eF9iYXJyZWRfb3IgKGRzdCwgYmFyLCBudGhyLCBjcGwsIHJlZG9wKTsKKyAg ICAgIGJyZWFrOworICAgIGNhc2UgTlZQVFhfQlVJTFRJTl9CQVJfUkVEX1BPUEM6CisgICAg ICBkc3QgPSBnZW5fcmVnX3J0eCAoU0ltb2RlKTsKKyAgICAgIHBhdCA9IGdlbl9udnB0eF9i YXJyZWRfcG9wYyAoZHN0LCBiYXIsIG50aHIsIGNwbCwgcmVkb3ApOworICAgICAgYnJlYWs7 CisgICAgZGVmYXVsdDoKKyAgICAgIGdjY191bnJlYWNoYWJsZSAoKTsKKyAgICB9CisgIGVt aXRfaW5zbiAocGF0KTsKKyAgaWYgKEdFVF9NT0RFIChkc3QpID09IEJJbW9kZSkKKyAgICB7 CisgICAgICBydHggdG1wID0gZ2VuX3JlZ19ydHggKG1vZGUpOworICAgICAgZW1pdF9pbnNu IChnZW5fcnR4X1NFVCAodG1wLCBnZW5fcnR4X05FIChtb2RlLCBkc3QsIEdFTl9JTlQgKDAp KSkpOworICAgICAgZHN0ID0gdG1wOworICAgIH0KKyAgZW1pdF9tb3ZlX2luc24gKHRhcmdl dCwgZHN0KTsKKyAgcmV0dXJuIHRhcmdldDsKK30KKwogc3RhdGljIEdUWSgoKSkgdHJlZSBu dnB0eF9idWlsdGluX2RlY2xzW05WUFRYX0JVSUxUSU5fTUFYXTsKIAogLyogUmV0dXJuIHRo ZSBOVlBUWCBidWlsdGluIGZvciBDT0RFLiAgKi8KQEAgLTYxOTQsNiArNjI4MSwxMyBAQCBu dnB0eF9pbml0X2J1aWx0aW5zICh2b2lkKQogICBERUYgKE1FTUJBUl9HTCwgIm1lbWJhcl9n bCIsIChWT0lELCBWT0lELCBOVUxMX1RSRUUpKTsKICAgREVGIChNRU1CQVJfQ1RBLCAibWVt YmFyX2N0YSIsIChWT0lELCBWT0lELCBOVUxMX1RSRUUpKTsKIAorICBERUYgKEJBUl9SRURf QU5ELCAiYmFyX3JlZF9hbmQiLAorICAgICAgIChVSU5ULCBVSU5ULCBVSU5ULCBVSU5ULCBV SU5ULCBOVUxMX1RSRUUpKTsKKyAgREVGIChCQVJfUkVEX09SLCAiYmFyX3JlZF9vciIsCisg ICAgICAgKFVJTlQsIFVJTlQsIFVJTlQsIFVJTlQsIFVJTlQsIE5VTExfVFJFRSkpOworICBE RUYgKEJBUl9SRURfUE9QQywgImJhcl9yZWRfcG9wYyIsCisgICAgICAgKFVJTlQsIFVJTlQs IFVJTlQsIFVJTlQsIFVJTlQsIE5VTExfVFJFRSkpOworCiAjdW5kZWYgREVGCiAjdW5kZWYg U1QKICN1bmRlZiBVSU5UCkBAIC02MjM2LDYgKzYzMzAsMTEgQEAgbnZwdHhfZXhwYW5kX2J1 aWx0aW4gKHRyZWUgZXhwLCBydHggdGFyZ2V0LCBydHggQVJHX1VOVVNFRCAoc3VidGFyZ2V0 KSwKICAgICAgIGVtaXRfaW5zbiAoZ2VuX252cHR4X21lbWJhcl9jdGEgKCkpOwogICAgICAg cmV0dXJuIE5VTExfUlRYOwogCisgICAgY2FzZSBOVlBUWF9CVUlMVElOX0JBUl9SRURfQU5E OgorICAgIGNhc2UgTlZQVFhfQlVJTFRJTl9CQVJfUkVEX09SOgorICAgIGNhc2UgTlZQVFhf QlVJTFRJTl9CQVJfUkVEX1BPUEM6CisgICAgICByZXR1cm4gbnZwdHhfZXhwYW5kX2Jhcl9y ZWQgKGV4cCwgdGFyZ2V0LCBtb2RlLCBpZ25vcmUpOworCiAgICAgZGVmYXVsdDogZ2NjX3Vu cmVhY2hhYmxlICgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2djYy9jb25maWcvbnZwdHgv bnZwdHgubWQgYi9nY2MvY29uZmlnL252cHR4L252cHR4Lm1kCmluZGV4IDhlZDY4NTAuLjc0 MGM0ZGUgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvbnZwdHgvbnZwdHgubWQKKysrIGIvZ2Nj L2NvbmZpZy9udnB0eC9udnB0eC5tZApAQCAtNTgsNiArNTgsOSBAQAogICAgVU5TUEVDVl9D QVNfTE9DQUwKICAgIFVOU1BFQ1ZfWENIRwogICAgVU5TUEVDVl9TVAorICAgVU5TUEVDVl9C QVJSRURfQU5ECisgICBVTlNQRUNWX0JBUlJFRF9PUgorICAgVU5TUEVDVl9CQVJSRURfUE9Q QwogICAgVU5TUEVDVl9CQVJTWU5DCiAgICBVTlNQRUNWX1dBUlBTWU5DCiAgICBVTlNQRUNW X1VOSUZPUk1fV0FSUF9DSEVDSwpAQCAtMjI3NCw2ICsyMjc3LDM1IEBACiAgICJUQVJHRVRf UFRYXzZfMCIKICAgIiUuXFx0YmFyLndhcnAuc3luY1xcdDB4ZmZmZmZmZmY7IikKIAorKGRl ZmluZV9pbnRfaXRlcmF0b3IgQkFSUkVECisgIFtVTlNQRUNWX0JBUlJFRF9BTkQKKyAgIFVO U1BFQ1ZfQkFSUkVEX09SCisgICBVTlNQRUNWX0JBUlJFRF9QT1BDXSkKKyhkZWZpbmVfaW50 X2F0dHIgYmFycmVkX29wCisgIFsoVU5TUEVDVl9CQVJSRURfQU5EICAgICAgImFuZCIpCisg ICAoVU5TUEVDVl9CQVJSRURfT1IgICAgICAgIm9yIikKKyAgIChVTlNQRUNWX0JBUlJFRF9Q T1BDICAgICAicG9wYyIpXSkKKyhkZWZpbmVfaW50X2F0dHIgYmFycmVkX21vZGUKKyAgWyhV TlNQRUNWX0JBUlJFRF9BTkQgICAgICAiQkkiKQorICAgKFVOU1BFQ1ZfQkFSUkVEX09SICAg ICAgICJCSSIpCisgICAoVU5TUEVDVl9CQVJSRURfUE9QQyAgICAgIlNJIildKQorKGRlZmlu ZV9pbnRfYXR0ciBiYXJyZWRfcHR4dHlwZQorICBbKFVOU1BFQ1ZfQkFSUkVEX0FORCAgICAg ICJwcmVkIikKKyAgIChVTlNQRUNWX0JBUlJFRF9PUiAgICAgICAicHJlZCIpCisgICAoVU5T UEVDVl9CQVJSRURfUE9QQyAgICAgInUzMiIpXSkKKworKGRlZmluZV9pbnNuICJudnB0eF9i YXJyZWRfPGJhcnJlZF9vcD4iCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOjxiYXJyZWRfbW9k ZT4gMCAibnZwdHhfcmVnaXN0ZXJfb3BlcmFuZCIgIj1SIikKKyAgICAgICAgKHVuc3BlY192 b2xhdGlsZQorCSAgWyhtYXRjaF9vcGVyYW5kOlNJIDEgIm52cHR4X25vbm1lbW9yeV9vcGVy YW5kIiAiUmkiKQorICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAyICJudnB0eF9ub25t ZW1vcnlfb3BlcmFuZCIgIlJpIikKKwkgICAobWF0Y2hfb3BlcmFuZDpTSSAzICJjb25zdF9p bnRfb3BlcmFuZCIgImkiKQorICAgICAgICAgICAobWF0Y2hfb3BlcmFuZDpCSSA0ICJudnB0 eF9yZWdpc3Rlcl9vcGVyYW5kIiAiUiIpXQorICAgICAgICAgIEJBUlJFRCkpXQorICAiIgor ICAiXFx0YmFyLnJlZC48YmFycmVkX29wPi48YmFycmVkX3B0eHR5cGU+IFxcdCUwLCAlMSwg JTIsICVwMyU0OyI7IgorICBbKHNldF9hdHRyICJwcmVkaWNhYmxlIiAibm8iKV0pCisKIChk ZWZpbmVfaW5zbiAibnZwdHhfdW5pZm9ybV93YXJwX2NoZWNrIgogICBbKHVuc3BlY192b2xh dGlsZSBbKGNvbnN0X2ludCAwKV0gVU5TUEVDVl9VTklGT1JNX1dBUlBfQ0hFQ0spXQogICAi Igo= --------------UythbqvxWA9TX48rw7hhYH0K--