From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 82743 invoked by alias); 30 Mar 2019 11:24:22 -0000 Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org Received: (qmail 82533 invoked by uid 89); 30 Mar 2019 11:24:12 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.6 required=5.0 tests=BAYES_00,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham version=3.3.1 spammy=About, Did, college, H*RU:209.85.208.65 X-HELO: mail-ed1-f65.google.com Received: from mail-ed1-f65.google.com (HELO mail-ed1-f65.google.com) (209.85.208.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 30 Mar 2019 11:24:09 +0000 Received: by mail-ed1-f65.google.com with SMTP id v21so4202466edq.4 for ; Sat, 30 Mar 2019 04:24:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=u1a7DERGtwJDBmEj6eTqh0Y9VyhZvx8900xUa0xIDck=; b=L8avVovYkcMD3nK/wT3V6LVsPHUh+B/t7ti23lQFDHiLhwSuS/9vM1wUQdrxfjlsXs l3nczKZxTE/2fxKYDcN+JolLS/O7fcBP7T3Bq62vN/M+mH5Ds87ltzIUso/VHgMh8XwP pUwwhLCnBJa58SsGnIkgqJdR2cJNykIPB+WUwVP05snilcUWMEaoJH+22SATmxE86VOa 2lisO1FrH34wSJIt/Oy5j0QMs4FhVMX6hihfBBzw8uPYL54afYNhTX5Yc9yBeAii3zt7 ABvRBorHteCyEeG4WmYdo0e76I5TZ+19Lf9tEHa2+b4DCE/fqWGFQdfNRa839Uy3T71F BvHg== MIME-Version: 1.0 References: In-Reply-To: From: Tejas Joshi Date: Sat, 30 Mar 2019 11:24:00 -0000 Message-ID: Subject: Re: About GSOC. To: gcc@gcc.gnu.org Content-Type: multipart/mixed; boundary="0000000000008adca405854e066c" X-IsSubscribed: yes X-SW-Source: 2019-03/txt/msg00263.txt.bz2 --0000000000008adca405854e066c Content-Type: text/plain; charset="UTF-8" Content-length: 7124 Hello. I have developed a fairly working patch for roundeven, attaching herewith. The testcase function as follows : double f() { double x = 4.5; double ret = __builtin_roundeven (x); return ret; } We can inspect the file foo.c.028t.ccp1, where we can see f() returns value 4.0e+0. I am also writing the proposal and make draft ready in couple of days for community review. Do roundeven have to be added in internals-fn.def to be called internal? Thanks, -Tejas On Sun, 24 Feb 2019 at 17:39, Tejas Joshi wrote: > > Hello. > I had a little pause on roundeven due to seminars in my college. I've > tried to implement roundeven but can not figure out what are just > minimal needs to roundeven be called for a test program like > __builtin_roundeven(); > Also, build exited returning status as: > > DEF_INTERNAL_FLT_FN (ROUNDEVEN) has no associated built-in functions > > Here is the .diff flie. > > Thanks, > -Tejas > > On Mon, 4 Feb 2019 at 22:55, Tejas Joshi wrote: > > > > Hi. > > Although now, I am unable to build the compiler. > > The build exited returning status as: > > > > DEF_INTERNAL_FLT_FN (ROUNDEVEN) has no associated built-in functions > > > > I have added the entry in fold_const_call_ss() and do not find any > > other place to add the case. > > Here is the latest patch. > > > > On Mon, 4 Feb 2019 at 22:14, Prathamesh Kulkarni > > wrote: > > > > > > On Mon, 4 Feb 2019 at 21:27, Tejas Joshi wrote: > > > > > > > > Thanks. > > > > > Did you add an entry for roundeven in builtins.def ? > > > > Yes, I did. > > > > > > > > Find here the attached patch.diff for which I did the changes to > > > > implement roundeven. There might be some unnecessary changes and some > > > > necessary changes which have not been made. > > > You haven't called roundeven() in the patch. You'll need to add an > > > entry in fold_const_call_ss() > > > similar to real_ceil, and probably in other places too. > > > > > > Thanks, > > > Prathamesh > > > > > > > > Regards, > > > > -Tejas > > > > > > > > On Mon, 4 Feb 2019 at 20:36, Prathamesh Kulkarni > > > > wrote: > > > > > > > > > > On Mon, 4 Feb 2019 at 20:10, Tejas Joshi wrote: > > > > > > > > > > > > Hello. > > > > > > I have implemented roundeven function in real.c as follows: (and > > > > > > respective changes in real.h) > > > > > It's a better idea to include all changes in patch instead of copy-pasting. > > > > > Use the command: > > > > > git diff > patch.diff > > > > > which will create a file called "patch.diff" containing the changes > > > > > and send it as an attachment. > > > > > > > > > > > > /* Round X to nearest even integer towards zero. */ > > > > > > > > > > > > void > > > > > > real_roundeven (REAL_VALUE_TYPE *r, format_helper fmt, > > > > > > const REAL_VALUE_TYPE *x) > > > > > > { > > > > > > REAL_VALUE_TYPE t; > > > > > > > > > > > > do_fix_trunc (&t, x); > > > > > > HOST_WIDE_INT i = real_to_integer (&t); > > > > > > if(i % 2) > > > > > > do_add (r, &t, &dconstm1, 0); > > > > > > else > > > > > > *r = t; > > > > > > } > > > > > > > > > > > > Although I cant get it to test like > > > > > > > > > > > > int foo() > > > > > > { > > > > > > double x = __builtin_roundeven (3.5); > > > > > > printf("%f",x); > > > > > > return (int) x; > > > > > > } > > > > > > Because I do not know its dependencies through other files. I tried to > > > > > > track them down by inspecting real_ceil function, but it also includes > > > > > > other optimization procedures like folding. How do I know enough > > > > > > declarations to be made in respective files? > > > > > Did you add an entry for roundeven in builtins.def ? > > > > > > > > > > Thanks, > > > > > Prathamesh > > > > > > > > > > > > Thanks. > > > > > > -Tejas > > > > > > > > > > > > On Mon, 28 Jan 2019 at 22:33, Tejas Joshi wrote: > > > > > > > > > > > > > > Hello. > > > > > > > Representations of real numbers in real.c are a little complex to > > > > > > > understand right now for me. I am still trying to understand them and > > > > > > > figure them out using gdb and cscope. Though conventions are given in > > > > > > > comments in real.c, I will still be trying to figure it out. The > > > > > > > equation and its bitwise representation is not pretty elaborated in > > > > > > > any documentation I could find. > > > > > > > > > > > > > > x = s * b^e * \sum_{k=1}^p f_k * b^{-k} > > > > > > > > > > > > > > where > > > > > > > s = sign (+- 1) > > > > > > > b = base or radix, here always 2 > > > > > > > e = exponent > > > > > > > p = precision (the number of base-b digits in the significand) > > > > > > > f_k = the digits of the significand. > > > > > > > > > > > > > > In mean time, I've tried real_round function to work like roundeven. I > > > > > > > will try to submit a clean patch along with roundeven implemented > > > > > > > separately with changes like in builtins.def, adding cases, etc. > > > > > > > > > > > > > > void > > > > > > > real_round (REAL_VALUE_TYPE *r, format_helper fmt, > > > > > > > const REAL_VALUE_TYPE *x) > > > > > > > { > > > > > > > #if 0 > > > > > > > do_add (r, x, &dconsthalf, x->sign); > > > > > > > do_fix_trunc (r, r); > > > > > > > if (fmt) > > > > > > > real_convert (r, fmt, r); > > > > > > > #endif > > > > > > > fprintf (stderr, "\nhere\n"); > > > > > > > real_value z; > > > > > > > do_fix_trunc (&z, x); > > > > > > > HOST_WIDE_INT i = real_to_integer (&z); > > > > > > > fprintf (stderr, "\n i = %ld\n", i); > > > > > > > if (i % 2) > > > > > > > do_add (r, &z, &dconstm1, 0); > > > > > > > else > > > > > > > *r = z; > > > > > > > } > > > > > > > > > > > > > > Thanks. > > > > > > > -Tejas > > > > > > > > > > > > > > On Sat, 26 Jan 2019 at 03:02, Joseph Myers wrote: > > > > > > > > > > > > > > > > On Sat, 26 Jan 2019, Tejas Joshi wrote: > > > > > > > > > > > > > > > > > function with byte-byte comparison which also include mpfr. (Correct > > > > > > > > > me if I am wrong.) What is the significance of mpfr related to these > > > > > > > > > internal representations? > > > > > > > > > > > > > > > > real.c provides a fixed-size representation of floating-point numbers that > > > > > > > > allows for various non-IEEE formats supported by GCC, and also allows > > > > > > > > functions from dfp.c to be used for decimal floating-point formats. > > > > > > > > > > > > > > > > MPFR is used in GCC to provide operations that are nontrivial to > > > > > > > > implement, especially those that are nontrivial to implement in such a > > > > > > > > fixed-size context. real.c operations wrap around MPFR ones where > > > > > > > > appropriate, doing whatever's needed in cases where there are non-IEEE > > > > > > > > semantics or sets of values. > > > > > > > > > > > > > > > > -- > > > > > > > > Joseph S. Myers > > > > > > > > joseph@codesourcery.com --0000000000008adca405854e066c Content-Type: text/x-patch; charset="US-ASCII"; name="roundeven.patch" Content-Disposition: attachment; filename="roundeven.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jtverz630 Content-length: 5861 ZGlmZiAtLWdpdCBhL2djYy9idWlsdGlucy5jIGIvZ2NjL2J1aWx0aW5zLmMK aW5kZXggMjVlMDFlNDA5MmIuLjBiMmQ2YmY4MmY5IDEwMDY0NAotLS0gYS9n Y2MvYnVpbHRpbnMuYworKysgYi9nY2MvYnVpbHRpbnMuYwpAQCAtMjA2Nyw2 ICsyMDY3LDcgQEAgbWF0aGZuX2J1aWx0X2luXzIgKHRyZWUgdHlwZSwgY29t YmluZWRfZm4gZm4pCiAgICAgQ0FTRV9NQVRIRk4gKFJFTVFVTykKICAgICBD QVNFX01BVEhGTl9GTE9BVE4gKFJJTlQpCiAgICAgQ0FTRV9NQVRIRk5fRkxP QVROIChST1VORCkKKyAgICBDQVNFX01BVEhGTiAoUk9VTkRFVkVOKQogICAg IENBU0VfTUFUSEZOIChTQ0FMQikKICAgICBDQVNFX01BVEhGTiAoU0NBTEJM TikKICAgICBDQVNFX01BVEhGTiAoU0NBTEJOKQpkaWZmIC0tZ2l0IGEvZ2Nj L2J1aWx0aW5zLmRlZiBiL2djYy9idWlsdGlucy5kZWYKaW5kZXggZWY4OTcy OWZkMGMuLmUxZDU5M2E4NzY1IDEwMDY0NAotLS0gYS9nY2MvYnVpbHRpbnMu ZGVmCisrKyBiL2djYy9idWlsdGlucy5kZWYKQEAgLTU0Miw2ICs1NDIsOSBA QCBERUZfQzk5X0JVSUxUSU4gICAgICAgIChCVUlMVF9JTl9SSU5UTCwgInJp bnRsIiwgQlRfRk5fTE9OR0RPVUJMRV9MT05HRE9VQkxFLCBBVAogI2RlZmlu ZSBSSU5UX1RZUEUoRikgQlRfRk5fIyNGIyNfIyNGCiBERUZfRVhUX0xJQl9G TE9BVE5fTlhfQlVJTFRJTlMgKEJVSUxUX0lOX1JJTlQsICJyaW50IiwgUklO VF9UWVBFLCBBVFRSX0NPTlNUX05PVEhST1dfTEVBRl9MSVNUKQogI3VuZGVm IFJJTlRfVFlQRQorREVGX0VYVF9MSUJfQlVJTFRJTiAgICAoQlVJTFRfSU5f Uk9VTkRFVkVOLCAicm91bmRldmVuIiwgQlRfRk5fRE9VQkxFX0RPVUJMRSwg QVRUUl9DT05TVF9OT1RIUk9XX0xFQUZfTElTVCkKK0RFRl9FWFRfTElCX0JV SUxUSU4gICAgKEJVSUxUX0lOX1JPVU5ERVZFTkYsICJyb3VuZGV2ZW5mIiwg QlRfRk5fRkxPQVRfRkxPQVQsIEFUVFJfQ09OU1RfTk9USFJPV19MRUFGX0xJ U1QpCitERUZfRVhUX0xJQl9CVUlMVElOICAgIChCVUlMVF9JTl9ST1VOREVW RU5MLCAicm91bmRldmVubCIsIEJUX0ZOX0xPTkdET1VCTEVfTE9OR0RPVUJM RSwgQVRUUl9DT05TVF9OT1RIUk9XX0xFQUZfTElTVCkKIERFRl9DOTlfQlVJ TFRJTiAgICAgICAgKEJVSUxUX0lOX1JPVU5ELCAicm91bmQiLCBCVF9GTl9E T1VCTEVfRE9VQkxFLCBBVFRSX0NPTlNUX05PVEhST1dfTEVBRl9MSVNUKQog REVGX0M5OV9CVUlMVElOICAgICAgICAoQlVJTFRfSU5fUk9VTkRGLCAicm91 bmRmIiwgQlRfRk5fRkxPQVRfRkxPQVQsIEFUVFJfQ09OU1RfTk9USFJPV19M RUFGX0xJU1QpCiBERUZfQzk5X0JVSUxUSU4gICAgICAgIChCVUlMVF9JTl9S T1VOREwsICJyb3VuZGwiLCBCVF9GTl9MT05HRE9VQkxFX0xPTkdET1VCTEUs IEFUVFJfQ09OU1RfTk9USFJPV19MRUFGX0xJU1QpCmRpZmYgLS1naXQgYS9n Y2MvZm9sZC1jb25zdC1jYWxsLmMgYi9nY2MvZm9sZC1jb25zdC1jYWxsLmMK aW5kZXggMDZhNDIwNjAxYzAuLjdlYWZkOTFlOWEyIDEwMDY0NAotLS0gYS9n Y2MvZm9sZC1jb25zdC1jYWxsLmMKKysrIGIvZ2NjL2ZvbGQtY29uc3QtY2Fs bC5jCkBAIC03OTIsNiArNzkyLDE0IEBAIGZvbGRfY29uc3RfY2FsbF9zcyAo cmVhbF92YWx1ZSAqcmVzdWx0LCBjb21iaW5lZF9mbiBmbiwKIAl9CiAgICAg ICByZXR1cm4gZmFsc2U7CiAKKyAgICBjYXNlIENGTl9CVUlMVF9JTl9ST1VO REVWRU46CisgICAgICBpZiAoIVJFQUxfVkFMVUVfSVNOQU4gKCphcmcpIHx8 ICFmbGFnX2Vycm5vX21hdGgpCisgIHsKKyAgICByZWFsX3JvdW5kZXZlbiAo cmVzdWx0LCBmb3JtYXQsIGFyZyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0K KyAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIENBU0VfQ0ZOX0xPR0I6CiAg ICAgICByZXR1cm4gZm9sZF9jb25zdF9sb2diIChyZXN1bHQsIGFyZywgZm9y bWF0KTsKIApAQCAtODU0LDYgKzg2Miw5IEBAIGZvbGRfY29uc3RfY2FsbF9z cyAod2lkZV9pbnQgKnJlc3VsdCwgY29tYmluZWRfZm4gZm4sCiAgICAgICBy ZXR1cm4gZm9sZF9jb25zdF9jb252ZXJzaW9uIChyZXN1bHQsIHJlYWxfcm91 bmQsIGFyZywKIAkJCQkgICAgcHJlY2lzaW9uLCBmb3JtYXQpOwogCisgICAg Y2FzZSBDRk5fQlVJTFRfSU5fUk9VTkRFVkVOOgorICAgICAgcmV0dXJuIGZv bGRfY29uc3RfY29udmVyc2lvbiAocmVzdWx0LCByZWFsX3JvdW5kZXZlbiwg YXJnLCBwcmVjaXNpb24sIGZvcm1hdCk7CisKICAgICBDQVNFX0NGTl9JUklO VDoKICAgICBDQVNFX0NGTl9MUklOVDoKICAgICBDQVNFX0NGTl9MTFJJTlQ6 CmRpZmYgLS1naXQgYS9nY2MvZm9sZC1jb25zdC5jIGIvZ2NjL2ZvbGQtY29u c3QuYwppbmRleCA1OWNlZGVhZmQ3MS4uMzBjNDA5ZTk1YmYgMTAwNjQ0Ci0t LSBhL2djYy9mb2xkLWNvbnN0LmMKKysrIGIvZ2NjL2ZvbGQtY29uc3QuYwpA QCAtMzI5LDYgKzMyOSw3IEBAIG5lZ2F0ZV9tYXRoZm5fcCAoY29tYmluZWRf Zm4gZm4pCiAgICAgQ0FTRV9DRk5fTExST1VORDoKICAgICBDQVNFX0NGTl9M Uk9VTkQ6CiAgICAgQ0FTRV9DRk5fUk9VTkQ6CisgICAgQ0FTRV9DRk5fUk9V TkRFVkVOOgogICAgIENBU0VfQ0ZOX1NJTjoKICAgICBDQVNFX0NGTl9TSU5I OgogICAgIENBU0VfQ0ZOX1RBTjoKQEAgLTEzMDYwLDYgKzEzMDYxLDggQEAg dHJlZV9jYWxsX25vbm5lZ2F0aXZlX3dhcm52X3AgKHRyZWUgdHlwZSwgY29t YmluZWRfZm4gZm4sIHRyZWUgYXJnMCwgdHJlZSBhcmcxLAogICAgIENBU0Vf Q0ZOX1JJTlRfRk46CiAgICAgQ0FTRV9DRk5fUk9VTkQ6CiAgICAgQ0FTRV9D Rk5fUk9VTkRfRk46CisgICAgQ0FTRV9DRk5fUk9VTkRFVkVOOgorICAgIENB U0VfQ0ZOX1JPVU5ERVZFTl9GTjoKICAgICBDQVNFX0NGTl9TQ0FMQjoKICAg ICBDQVNFX0NGTl9TQ0FMQkxOOgogICAgIENBU0VfQ0ZOX1NDQUxCTjoKQEAg LTEzNTgzLDYgKzEzNTg2LDggQEAgaW50ZWdlcl92YWx1ZWRfcmVhbF9jYWxs X3AgKGNvbWJpbmVkX2ZuIGZuLCB0cmVlIGFyZzAsIHRyZWUgYXJnMSwgaW50 IGRlcHRoKQogICAgIENBU0VfQ0ZOX1JJTlRfRk46CiAgICAgQ0FTRV9DRk5f Uk9VTkQ6CiAgICAgQ0FTRV9DRk5fUk9VTkRfRk46CisgICAgQ0FTRV9DRk5f Uk9VTkRFVkVOOgorICAgIENBU0VfQ0ZOX1JPVU5ERVZFTl9GTjoKICAgICBD QVNFX0NGTl9UUlVOQzoKICAgICBDQVNFX0NGTl9UUlVOQ19GTjoKICAgICAg IHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvZ2NjL3JlYWwuYyBiL2djYy9y ZWFsLmMKaW5kZXggZjgyMmFlODJkNjEuLjA4NzQ3ODg0MWU1IDEwMDY0NAot LS0gYS9nY2MvcmVhbC5jCisrKyBiL2djYy9yZWFsLmMKQEAgLTUwMTAsNiAr NTAxMCwyMiBAQCByZWFsX3JvdW5kIChSRUFMX1ZBTFVFX1RZUEUgKnIsIGZv cm1hdF9oZWxwZXIgZm10LAogICAgIHJlYWxfY29udmVydCAociwgZm10LCBy KTsKIH0KIAorLyogUm91bmQgWCB0byBuZWFyZXN0IGV2ZW4gaW50ZWdlciB0 b3dhcmRzIHplcm8uICovCisKK3ZvaWQKK3JlYWxfcm91bmRldmVuIChSRUFM X1ZBTFVFX1RZUEUgKnIsIGZvcm1hdF9oZWxwZXIgZm10LAorCQljb25zdCBS RUFMX1ZBTFVFX1RZUEUgKngpCit7CisgIFJFQUxfVkFMVUVfVFlQRSB0Owor CisgIGRvX2ZpeF90cnVuYyAoJnQsIHgpOworICBIT1NUX1dJREVfSU5UIGkg PSByZWFsX3RvX2ludGVnZXIgKCZ0KTsKKyAgaWYoaSAlIDIpCisgICAgZG9f YWRkIChyLCAmdCwgJmRjb25zdG0xLCAwKTsKKyAgZWxzZQorICAgICpyID0g dDsKK30KKwogLyogU2V0IHRoZSBzaWduIG9mIFIgdG8gdGhlIHNpZ24gb2Yg WC4gICovCiAKIHZvaWQKZGlmZiAtLWdpdCBhL2djYy9yZWFsLmggYi9nY2Mv cmVhbC5oCmluZGV4IDBjZTQyNTY1NzA4Li4xMDg5OGVhZTc5ZSAxMDA2NDQK LS0tIGEvZ2NjL3JlYWwuaAorKysgYi9nY2MvcmVhbC5oCkBAIC00OTksNiAr NDk5LDggQEAgZXh0ZXJuIHZvaWQgcmVhbF9jZWlsIChSRUFMX1ZBTFVFX1RZ UEUgKiwgZm9ybWF0X2hlbHBlciwKIAkJICAgICAgIGNvbnN0IFJFQUxfVkFM VUVfVFlQRSAqKTsKIGV4dGVybiB2b2lkIHJlYWxfcm91bmQgKFJFQUxfVkFM VUVfVFlQRSAqLCBmb3JtYXRfaGVscGVyLAogCQkJY29uc3QgUkVBTF9WQUxV RV9UWVBFICopOworZXh0ZXJuIHZvaWQgcmVhbF9yb3VuZGV2ZW4gKFJFQUxf VkFMVUVfVFlQRSAqLCBmb3JtYXRfaGVscGVyLAorICAgICAgY29uc3QgUkVB TF9WQUxVRV9UWVBFICopOwogCiAvKiBTZXQgdGhlIHNpZ24gb2YgUiB0byB0 aGUgc2lnbiBvZiBYLiAgKi8KIGV4dGVybiB2b2lkIHJlYWxfY29weXNpZ24g KFJFQUxfVkFMVUVfVFlQRSAqLCBjb25zdCBSRUFMX1ZBTFVFX1RZUEUgKik7 Cg== --0000000000008adca405854e066c Content-Type: application/octet-stream; name="foo.c.028t.ccp1" Content-Disposition: attachment; filename="foo.c.028t.ccp1" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jtvesvxx1 Content-length: 1558 Cjs7IEZ1bmN0aW9uIGYgKGYsIGZ1bmNkZWZfbm89MCwgZGVjbF91aWQ9MTkw NywgY2dyYXBoX3VpZD0xLCBzeW1ib2xfb3JkZXI9MCkKCkFkZGluZyBkZXN0 aW5hdGlvbiBvZiBlZGdlICgwIC0+IDIpIHRvIHdvcmtsaXN0CgpTaW11bGF0 aW5nIGJsb2NrIDIKClZpc2l0aW5nIHN0YXRlbWVudDoKeF8xID0gNC41ZSsw Owp3aGljaCBpcyBsaWtlbHkgQ09OU1RBTlQKTGF0dGljZSB2YWx1ZSBjaGFu Z2VkIHRvIENPTlNUQU5UIDQuNWUrMC4gIEFkZGluZyBTU0EgZWRnZXMgdG8g d29ya2xpc3QuCm1hcmtpbmcgc3RtdCB0byBiZSBub3Qgc2ltdWxhdGVkIGFn YWluCgpWaXNpdGluZyBzdGF0ZW1lbnQ6CnJldF8yID0gX19idWlsdGluX3Jv dW5kZXZlbiAoeF8xKTsKd2hpY2ggaXMgbGlrZWx5IENPTlNUQU5UCk1hdGNo LWFuZC1zaW1wbGlmaWVkIF9fYnVpbHRpbl9yb3VuZGV2ZW4gKHhfMSkgdG8g NC4wZSswCkxhdHRpY2UgdmFsdWUgY2hhbmdlZCB0byBDT05TVEFOVCA0LjBl KzAuICBBZGRpbmcgU1NBIGVkZ2VzIHRvIHdvcmtsaXN0LgptYXJraW5nIHN0 bXQgdG8gYmUgbm90IHNpbXVsYXRlZCBhZ2FpbgoKVmlzaXRpbmcgc3RhdGVt ZW50OgpfMyA9IHJldF8yOwp3aGljaCBpcyBsaWtlbHkgQ09OU1RBTlQKTWF0 Y2gtYW5kLXNpbXBsaWZpZWQgcmV0XzIgdG8gNC4wZSswCkxhdHRpY2UgdmFs dWUgY2hhbmdlZCB0byBDT05TVEFOVCA0LjBlKzAuICBBZGRpbmcgU1NBIGVk Z2VzIHRvIHdvcmtsaXN0LgptYXJraW5nIHN0bXQgdG8gYmUgbm90IHNpbXVs YXRlZCBhZ2FpbgoKVmlzaXRpbmcgc3RhdGVtZW50OgpyZXR1cm4gXzM7Ck5v IGludGVyZXN0aW5nIHZhbHVlcyBwcm9kdWNlZC4gIE1hcmtlZCBWQVJZSU5H LgoKU3Vic3RpdHV0aW5nIHZhbHVlcyBhbmQgZm9sZGluZyBzdGF0ZW1lbnRz CgpGb2xkaW5nIHN0YXRlbWVudDogcmV0dXJuIF8zOwpGb2xkZWQgaW50bzog cmV0dXJuIDQuMGUrMDsKClJlbW92aW5nIGRlYWQgc3RtdCBfMyA9IHJldF8y OwoKUmVtb3ZpbmcgZGVhZCBzdG10IHJldF8yID0gX19idWlsdGluX3JvdW5k ZXZlbiAoeF8xKTsKClJlbW92aW5nIGRlYWQgc3RtdCB4XzEgPSA0LjVlKzA7 CgpmICgpCnsKICBkb3VibGUgcmV0OwogIGRvdWJsZSB4OwoKICA8YmIgMj4g OgogIHJldHVybiA0LjBlKzA7Cgp9CgoK --0000000000008adca405854e066c--