Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vzx3q-001TRG-0s for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Mar 2026 13:23:46 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vzx3o-003Pqo-1u for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Mar 2026 13:23:45 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vzx3o-003Pqg-0c for pgsql-hackers@lists.postgresql.org; Tue, 10 Mar 2026 13:23:44 +0000 Received: from mail-ej1-x636.google.com ([2a00:1450:4864:20::636]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vzx3l-00000001yOO-3eDr for pgsql-hackers@lists.postgresql.org; Tue, 10 Mar 2026 13:23:44 +0000 Received: by mail-ej1-x636.google.com with SMTP id a640c23a62f3a-b942424d231so573070166b.0 for ; Tue, 10 Mar 2026 06:23:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773149019; cv=none; d=google.com; s=arc-20240605; b=Nc2vAQs05tqOFuiLXTfAgbudnSzap5ydVngdMDF7jUvYG8Rl/eU/0d1FFgIGidglQr Vjh2lRexuNpBScIWZ/TVSTHxNaypmcY7sQXK/hCd1SlqPHOt/hr1iQfEKET1RBfejAp4 LyOj4De3kxKNojSglhFjhS2IHVg6Y5woUBCG/5knqHD62b37o8y7HQBgMOtxNa+f32QZ YP/9gkRD2JO93Ar5YLxl/sLfNSKFHPXVIGlnrZezfN7GMMM6rs/ALPiDDWVS4ABtyYZ8 zxy9k4zRg9HAX1Gemtp+NLsyq8MEmN8nPMw2ZG05i5XQtTVdPZewYZo0YOg09Q8FnfK+ il9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=C3AsgqADaOKaaTM0gCc39nUBJHmcBOR2Iljgzv0YcIQ=; fh=GcfpsUsDrK0OYu4lgRn54WrZlxt3uUVGk+2ap6tiFPw=; b=T7meCDVXNYHAIwxqoyacZkkD2zHmjGZJIeKzVkqvVqAZ8mDn9xvi1ttA1/ApJPJqY8 o4Wm0LU8s5i2tsI5LhwVxdFjNDB4WM1XSMYaN3+OhXCJCOzAAwiM98d/WOceGKtykRwv fjbQYU0mhpKrf8xd/7ul7E581a6P2fTPWK2p7eTx83FDX1l9fWaYVR1ETyb2jAPn3bSL rJYyx3xZrmGbLnEPnpIMLCUu0/02OKsT1lNr4ci6t5DaEUqmNhHShR1c65mhy7GB87ku MS+9KK0OMudnoKWvEvp3RIynhinGpx6UOWNKWjc95wQKbu4F1ii8yzdHJMbL6T94rsli RZaQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773149019; x=1773753819; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=C3AsgqADaOKaaTM0gCc39nUBJHmcBOR2Iljgzv0YcIQ=; b=lv42kNNZ/ywqM1jdzEVjTrAA7xTmnAflU0coHrEqnNV2ys6/F9fcILtfa4O2d8Us4B IP2Y0k8SjLGCa+UnOOrnAU97t95XE3ygBJPWxTo9SAg6a3jBmGOKoEtF50ouWHf6VY0W JFS4TgOQDeLyf3VlJ6agaObv5vsMCDPaV/zPgpuM8Hp6VNFLnT2Mvi43lxkDKmnpApf4 YDOtlRRVEN5/nBrm9BZ3jjRKRW8TQ3/W/VCb90qrAB+B/EvuDj3bK3snrpc6SRvILpyI p1kNKKDLmHCw5W0iknbRcPVBEnbtG5TxyUYUD8X0pUvsdslRI+H4ii2yugLd7sZeVpX+ szPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773149019; x=1773753819; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=C3AsgqADaOKaaTM0gCc39nUBJHmcBOR2Iljgzv0YcIQ=; b=IAhcSSo+xTrOF8JNYSsoJenfuGOvtwoFhe9BdIsIaAGCUEv7GcqeAoH9TLa/1WE49W Uw8R+WXMDSZGFszUMAAuWJinlvX+Ca9CRF1gj9AL5ZAnSIsxhSgR6AMLr6f0tYIFoDwf ezUYJj0woBzMqgd8HsKdaxXt+b5WQldGJcXOsd7ze3Y1+H79wiGJ5ODmGj1VTmIahej9 Pv0SNBKNvT2VA3cPXmoIzmfYvpIjPxggQ1p+5YLm3IIEzYlLk3nTrUF43UigWoPZyYo3 pfmshqQsKas/Ow7T0fUyH8ke2j38OlPuz/ggs5hK915NmL1JQfUgmjO5YLKXqHtWTVjn e2yg== X-Gm-Message-State: AOJu0YzfDvIjrwhtWec65XTcr+Xw/vXSzGgoihlVdYiA8EyTDZnk7MHb HzdvHHCEr4MwUI5fT0Y7wjy4yi7OeBi7QaxHnMtrepEDmYq0itLKNQsZb6q7dYpuGI+34Vw7MJq T4l8sbBMUJd3GKRi3Ntvxn2WwfY/Uv2w= X-Gm-Gg: ATEYQzzlxXxfRE2N1YDfwhQ0GnMWBPOQL4l8khArZ1EKYuNxTdIkgclNWs66IiN/YGq 6qGItdQOCBhiqnDrQPk0QA57ZOX3+WP3oXeSiIso0sm+wYJ5a2yq8h5RX/unbAQLs8deYiIaZ0p 8QCR1FBy3XEq/ODXsOMkcZg13sdPDmd85Ty3S0sJKftDnmsdBN+aKH2/6UUPtfGmJVjeRL35OxE oaM0xYgOjge5mVyWsabY+/cm/49hiwjLw67gpJrU2t5GQ9oa7zZMGL73qfN6ph58t7xm3de8PFM upD2c9i1Y4cG/FOUNfTLP8Lr/qfGVzGn6Qel2x5kR5C4hIZ8ue1mTCSc8RZXQZ3SsRn41QqtuiH vKkPNLY7B X-Received: by 2002:a17:907:70b:b0:b87:2780:1b29 with SMTP id a640c23a62f3a-b942dfabc75mr731285866b.37.1773149018812; Tue, 10 Mar 2026 06:23:38 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Xuneng Zhou Date: Tue, 10 Mar 2026 21:23:26 +0800 X-Gm-Features: AaiRm50U_BtxBQDywit4ZTUhRpotJbAdeSP1yIw6y89hWpGJG_4Vv_FJ4Knk5T8 Message-ID: Subject: Re: Streamify more code paths To: Michael Paquier Cc: pgsql-hackers , Nazir Bilal Yavuz Content-Type: multipart/mixed; boundary="00000000000066bb91064cab6d50" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000066bb91064cab6d50 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Michael, On Tue, Mar 10, 2026 at 6:28=E2=80=AFPM Michael Paquier wrote: > > On Tue, Mar 10, 2026 at 02:06:12PM +0800, Xuneng Zhou wrote: > > Here=E2=80=99s v5 of the patchset. The wal_logging_large patch has been > > removed, as no performance gains were observed in the benchmark runs. > > Looking at the numbers you are posting, it is harder to get excited > about the hash, gin, bloom_vacuum and wal_logging. The worker method > seems more efficient, may show that we are out of noise level. > The results associated to pgstattuple and the bloom scans are on a > different level for the three methods. > > Saying that, it is really nice that you have sent the benchmark. The > measurement method looks in line with the goal here after review (IO > stats, calculations), and I have taken some time to run it to get an > idea of the difference for these five code paths, as of (slightly > edited the script for my own environment, result is the same): > ./run_streaming_benchmark --baseline --io-method=3Dio_uring/worker > > I am not much interested in the sync case, so I have tested the two > other methods: > > 1) method=3DIO-uring > bloom_scan_large base=3D 725.3ms patch=3D 99.9ms 7.26x > ( 86.2%) (reads=3D19676->1294, io_time=3D688.36->33.69ms) > bloom_vacuum_large base=3D 7414.9ms patch=3D 7455.2ms 0.99x > ( -0.5%) (reads=3D48361->11597, io_time=3D459.02->257.51ms) > pgstattuple_large base=3D 12642.9ms patch=3D 11873.5ms 1.06x > ( 6.1%) (reads=3D206945->12983, io_time=3D6516.70->143.46ms) > gin_vacuum_large base=3D 3546.8ms patch=3D 2317.9ms 1.53x > ( 34.6%) (reads=3D20734->17735, io_time=3D3244.40->2021.53ms) > hash_vacuum_large base=3D 12268.5ms patch=3D 11751.1ms 1.04x > ( 4.2%) (reads=3D76677->15606, io_time=3D1483.10->315.03ms) > wal_logging_large base=3D 33713.0ms patch=3D 32773.9ms 1.03x > ( 2.8%) (reads=3D21641->21641, io_time=3D81.18->77.25ms) > > 2) method=3Dworker io-workers=3D3 > bloom_scan_large base=3D 725.0ms patch=3D 465.7ms 1.56x > ( 35.8%) (reads=3D19676->1294, io_time=3D688.70->52.20ms) > bloom_vacuum_large base=3D 7138.3ms patch=3D 7156.0ms 1.00x > ( -0.2%) (reads=3D48361->11597, io_time=3D284.56->64.37ms) > pgstattuple_large base=3D 12429.3ms patch=3D 11916.8ms 1.04x > ( 4.1%) (reads=3D206945->12983, io_time=3D6501.91->32.24ms) > gin_vacuum_large base=3D 3769.4ms patch=3D 3716.7ms 1.01x > ( 1.4%) (reads=3D20775->17684, io_time=3D3562.21->3528.14ms) > hash_vacuum_large base=3D 11750.1ms patch=3D 11289.0ms 1.04x > ( 3.9%) (reads=3D76677->15606, io_time=3D1296.03->98.72ms) > wal_logging_large base=3D 32862.3ms patch=3D 33179.7ms 0.99x > ( -1.0%) (reads=3D21641->21641, io_time=3D91.42->90.59ms) > > The bloom scan case is a winner in runtime for both cases, and in > terms of stats we get much better numbers for all of them. These feel > rather in line with what you have, except for pgstattuple's runtime, > still its IO numbers feel good. Thanks for running the benchmarks! The performance gains for hash, gin, bloom_vacuum, and wal_logging is insignificant, likely because these workloads are not I/O-bound. The default number of I/O workers is three, which is fairly conservative. When I ran the benchmark script with a higher number of I/O workers, some runs showed improved performance. > pgstattuple_large base=3D 12429.3ms patch=3D 11916.8ms 1.04x > ( 4.1%) (reads=3D206945->12983, io_time=3D6501.91->32.24ms) > pgstattuple_large base=3D 12642.9ms patch=3D 11873.5ms 1.06x > ( 6.1%) (reads=3D206945->12983, io_time=3D6516.70->143.46ms) Yeah, this looks somewhat strange. The io_time has been reduced significantly, which should also lead to a substantial reduction in runtime. method=3Dio_uring pgstattuple_large base=3D 5551.5ms patch=3D 3498.2ms 1.59x ( 37.0%) (reads=3D206945=E2=86=9212983, io_time=3D2323.49=E2=86=92207.14ms= ) I ran the benchmark for this test again with io_uring, and the result is consistent with previous runs. I=E2=80=99m not sure what might be contributing to this behavior. Another code path that showed significant performance improvement is pgstatindex [1]. I've incorporated the test into the script too. Here are the results from my testing: method=3Dworker io-workers=3D12 pgstatindex_large base=3D 233.8ms patch=3D 54.1ms 4.32x ( 76.8%) (reads=3D27460=E2=86=921757, io_time=3D213.94=E2=86=926.31ms) method=3Dio_uring pgstatindex_large base=3D 224.2ms patch=3D 56.4ms 3.98x ( 74.9%) (reads=3D27460=E2=86=921757, io_time=3D204.41=E2=86=924.88ms) >That's just to say that I'll review > them and try to do something about at least some of the pieces for > this release. Thanks for that. [1] https://www.postgresql.org/message-id/flat/CABPTF7UeN2o-trr9r7K76rZExnO= 2M4SLfvTfbUY2CwQjCekgnQ%40mail.gmail.com -- Best, Xuneng --00000000000066bb91064cab6d50 Content-Type: application/x-patch; name="v6-0001-Use-streaming-read-in-pgstatindex-functions.patch" Content-Disposition: attachment; filename="v6-0001-Use-streaming-read-in-pgstatindex-functions.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmklohxi0 RnJvbSAyZTkyNWYzMmFhZGE1YjVhYWQ0YjdhODJmZTZkNzZjOGRiOWZiMDc1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBhbHRlcmVnbzY1NSA8ODI0NjYyNTI2QHFxLmNvbT4KRGF0ZTog VHVlLCAxMCBNYXIgMjAyNiAyMDoyODoxNiArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjZdIFVzZSBz dHJlYW1pbmcgcmVhZCBBUEkgaW4gcGdzdGF0aW5kZXggZnVuY3Rpb25zCk1JTUUtVmVyc2lvbjog MS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5z ZmVyLUVuY29kaW5nOiA4Yml0CgpSZXBsYWNlIHN5bmNocm9ub3VzIFJlYWRCdWZmZXJFeHRlbmRl ZCgpIGxvb3BzIHdpdGggdGhlIHN0cmVhbWluZyByZWFkCkFQSSBpbiBwZ3N0YXRpbmRleF9pbXBs KCkgYW5kIHBnc3RhdGhhc2hpbmRleCgpLgoKQXV0aG9yOiBYdW5lbmcgWmhvdSA8eHVuZW5nemhv dUBnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21h aWwuY29tPgpSZXZpZXdlZC1ieTogd2VuaHVpIHFpdSA8cWl1d2VuaHVpZnhAZ21haWwuY29tPgpS ZXZpZXdlZC1ieTogU2hpbnlhIEthdG/CoDxzaGlueWExMS5rYXRvQGdtYWlsLmNvbT4KLS0tCiBj b250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGluZGV4LmMgfCA1NyArKysrKysrKysrKysrKysrKysr KysrKysrKy0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgNDggaW5zZXJ0aW9ucygrKSwgOSBkZWxldGlv bnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGluZGV4LmMgYi9j b250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGluZGV4LmMKaW5kZXggZWY3MjNhZjFmMTkuLjQxY2Fm ZTg1NTlhIDEwMDY0NAotLS0gYS9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGluZGV4LmMKKysr IGIvY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXRpbmRleC5jCkBAIC0zNyw2ICszNyw3IEBACiAj aW5jbHVkZSAiZnVuY2FwaS5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1ZGUgInN0 b3JhZ2UvYnVmbWdyLmgiCisjaW5jbHVkZSAic3RvcmFnZS9yZWFkX3N0cmVhbS5oIgogI2luY2x1 ZGUgInV0aWxzL3JlbC5oIgogI2luY2x1ZGUgInV0aWxzL3ZhcmxlbmEuaCIKIApAQCAtMjE3LDYg KzIxOCw4IEBAIHBnc3RhdGluZGV4X2ltcGwoUmVsYXRpb24gcmVsLCBGdW5jdGlvbkNhbGxJbmZv IGZjaW5mbykKIAlCbG9ja051bWJlciBibGtubzsKIAlCVEluZGV4U3RhdCBpbmRleFN0YXQ7CiAJ QnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0cmF0ZWd5ID0gR2V0QWNjZXNzU3RyYXRlZ3koQkFTX0JV TEtSRUFEKTsKKwlCbG9ja1JhbmdlUmVhZFN0cmVhbVByaXZhdGUgcDsKKwlSZWFkU3RyZWFtICpz dHJlYW07CiAKIAlpZiAoIUlTX0lOREVYKHJlbCkgfHwgIUlTX0JUUkVFKHJlbCkpCiAJCWVyZXBv cnQoRVJST1IsCkBAIC0yNzMsMTAgKzI3NiwyNiBAQCBwZ3N0YXRpbmRleF9pbXBsKFJlbGF0aW9u IHJlbCwgRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8pCiAJaW5kZXhTdGF0LmZyYWdtZW50cyA9IDA7 CiAKIAkvKgotCSAqIFNjYW4gYWxsIGJsb2NrcyBleGNlcHQgdGhlIG1ldGFwYWdlCisJICogU2Nh biBhbGwgYmxvY2tzIGV4Y2VwdCB0aGUgbWV0YXBhZ2UgKDB0aCBwYWdlKSB1c2luZyBzdHJlYW1p bmcgcmVhZHMKIAkgKi8KIAluYmxvY2tzID0gUmVsYXRpb25HZXROdW1iZXJPZkJsb2NrcyhyZWwp OwogCisJcC5jdXJyZW50X2Jsb2NrbnVtID0gQlRSRUVfTUVUQVBBR0UgKyAxOworCXAubGFzdF9l eGNsdXNpdmUgPSBuYmxvY2tzOworCisJLyoKKwkgKiBJdCBpcyBzYWZlIHRvIHVzZSBiYXRjaG1v ZGUgYXMgYmxvY2tfcmFuZ2VfcmVhZF9zdHJlYW1fY2IgdGFrZXMgbm8KKwkgKiBsb2Nrcy4KKwkg Ki8KKwlzdHJlYW0gPSByZWFkX3N0cmVhbV9iZWdpbl9yZWxhdGlvbihSRUFEX1NUUkVBTV9GVUxM IHwKKwkJCQkJCQkJCQlSRUFEX1NUUkVBTV9VU0VfQkFUQ0hJTkcsCisJCQkJCQkJCQkJYnN0cmF0 ZWd5LAorCQkJCQkJCQkJCXJlbCwKKwkJCQkJCQkJCQlNQUlOX0ZPUktOVU0sCisJCQkJCQkJCQkJ YmxvY2tfcmFuZ2VfcmVhZF9zdHJlYW1fY2IsCisJCQkJCQkJCQkJJnAsCisJCQkJCQkJCQkJMCk7 CisKIAlmb3IgKGJsa25vID0gMTsgYmxrbm8gPCBuYmxvY2tzOyBibGtubysrKQogCXsKIAkJQnVm ZmVyCQlidWZmZXI7CkBAIC0yODUsOCArMzA0LDcgQEAgcGdzdGF0aW5kZXhfaW1wbChSZWxhdGlv biByZWwsIEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvKQogCiAJCUNIRUNLX0ZPUl9JTlRFUlJVUFRT KCk7CiAKLQkJLyogUmVhZCBhbmQgbG9jayBidWZmZXIgKi8KLQkJYnVmZmVyID0gUmVhZEJ1ZmZl ckV4dGVuZGVkKHJlbCwgTUFJTl9GT1JLTlVNLCBibGtubywgUkJNX05PUk1BTCwgYnN0cmF0ZWd5 KTsKKwkJYnVmZmVyID0gcmVhZF9zdHJlYW1fbmV4dF9idWZmZXIoc3RyZWFtLCBOVUxMKTsKIAkJ TG9ja0J1ZmZlcihidWZmZXIsIEJVRkZFUl9MT0NLX1NIQVJFKTsKIAogCQlwYWdlID0gQnVmZmVy R2V0UGFnZShidWZmZXIpOwpAQCAtMzIyLDExICszNDAsMTIgQEAgcGdzdGF0aW5kZXhfaW1wbChS ZWxhdGlvbiByZWwsIEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvKQogCQllbHNlCiAJCQlpbmRleFN0 YXQuaW50ZXJuYWxfcGFnZXMrKzsKIAotCQkvKiBVbmxvY2sgYW5kIHJlbGVhc2UgYnVmZmVyICov Ci0JCUxvY2tCdWZmZXIoYnVmZmVyLCBCVUZGRVJfTE9DS19VTkxPQ0spOwotCQlSZWxlYXNlQnVm ZmVyKGJ1ZmZlcik7CisJCVVubG9ja1JlbGVhc2VCdWZmZXIoYnVmZmVyKTsKIAl9CiAKKwlBc3Nl cnQocmVhZF9zdHJlYW1fbmV4dF9idWZmZXIoc3RyZWFtLCBOVUxMKSA9PSBJbnZhbGlkQnVmZmVy KTsKKwlyZWFkX3N0cmVhbV9lbmQoc3RyZWFtKTsKKwogCXJlbGF0aW9uX2Nsb3NlKHJlbCwgQWNj ZXNzU2hhcmVMb2NrKTsKIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjAw LDYgKzYxOSw4IEBAIHBnc3RhdGhhc2hpbmRleChQR19GVU5DVElPTl9BUkdTKQogCUhhc2hNZXRh UGFnZSBtZXRhcDsKIAlmbG9hdDgJCWZyZWVfcGVyY2VudDsKIAl1aW50NjQJCXRvdGFsX3NwYWNl OworCUJsb2NrUmFuZ2VSZWFkU3RyZWFtUHJpdmF0ZSBwOworCVJlYWRTdHJlYW0gKnN0cmVhbTsK IAogCS8qCiAJICogVGhpcyB1c2VzIHJlbGF0aW9uX29wZW4oKSBhbmQgbm90IGluZGV4X29wZW4o KS4gIFRoZSBsYXR0ZXIgYWxsb3dzCkBAIC02NDQsNyArNjY1LDIzIEBAIHBnc3RhdGhhc2hpbmRl eChQR19GVU5DVElPTl9BUkdTKQogCS8qIHByZXBhcmUgYWNjZXNzIHN0cmF0ZWd5IGZvciB0aGlz IGluZGV4ICovCiAJYnN0cmF0ZWd5ID0gR2V0QWNjZXNzU3RyYXRlZ3koQkFTX0JVTEtSRUFEKTsK IAotCS8qIFN0YXJ0IGZyb20gYmxrbm8gMSBhcyAwdGggYmxvY2sgaXMgbWV0YXBhZ2UgKi8KKwkv KiBTY2FuIGFsbCBibG9ja3MgZXhjZXB0IHRoZSBtZXRhcGFnZSAoMHRoIHBhZ2UpIHVzaW5nIHN0 cmVhbWluZyByZWFkcyAqLworCXAuY3VycmVudF9ibG9ja251bSA9IEhBU0hfTUVUQVBBR0UgKyAx OworCXAubGFzdF9leGNsdXNpdmUgPSBuYmxvY2tzOworCisJLyoKKwkgKiBJdCBpcyBzYWZlIHRv IHVzZSBiYXRjaG1vZGUgYXMgYmxvY2tfcmFuZ2VfcmVhZF9zdHJlYW1fY2IgdGFrZXMgbm8KKwkg KiBsb2Nrcy4KKwkgKi8KKwlzdHJlYW0gPSByZWFkX3N0cmVhbV9iZWdpbl9yZWxhdGlvbihSRUFE X1NUUkVBTV9GVUxMIHwKKwkJCQkJCQkJCQlSRUFEX1NUUkVBTV9VU0VfQkFUQ0hJTkcsCisJCQkJ CQkJCQkJYnN0cmF0ZWd5LAorCQkJCQkJCQkJCXJlbCwKKwkJCQkJCQkJCQlNQUlOX0ZPUktOVU0s CisJCQkJCQkJCQkJYmxvY2tfcmFuZ2VfcmVhZF9zdHJlYW1fY2IsCisJCQkJCQkJCQkJJnAsCisJ CQkJCQkJCQkJMCk7CisKIAlmb3IgKGJsa25vID0gMTsgYmxrbm8gPCBuYmxvY2tzOyBibGtubysr KQogCXsKIAkJQnVmZmVyCQlidWY7CkBAIC02NTIsOCArNjg5LDcgQEAgcGdzdGF0aGFzaGluZGV4 KFBHX0ZVTkNUSU9OX0FSR1MpCiAKIAkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKIAotCQlidWYg PSBSZWFkQnVmZmVyRXh0ZW5kZWQocmVsLCBNQUlOX0ZPUktOVU0sIGJsa25vLCBSQk1fTk9STUFM LAotCQkJCQkJCQkgYnN0cmF0ZWd5KTsKKwkJYnVmID0gcmVhZF9zdHJlYW1fbmV4dF9idWZmZXIo c3RyZWFtLCBOVUxMKTsKIAkJTG9ja0J1ZmZlcihidWYsIEJVRkZFUl9MT0NLX1NIQVJFKTsKIAkJ cGFnZSA9IEJ1ZmZlckdldFBhZ2UoYnVmKTsKIApAQCAtNjk4LDYgKzczNCw5IEBAIHBnc3RhdGhh c2hpbmRleChQR19GVU5DVElPTl9BUkdTKQogCQlVbmxvY2tSZWxlYXNlQnVmZmVyKGJ1Zik7CiAJ fQogCisJQXNzZXJ0KHJlYWRfc3RyZWFtX25leHRfYnVmZmVyKHN0cmVhbSwgTlVMTCkgPT0gSW52 YWxpZEJ1ZmZlcik7CisJcmVhZF9zdHJlYW1fZW5kKHN0cmVhbSk7CisKIAkvKiBEb25lIGFjY2Vz c2luZyB0aGUgaW5kZXggKi8KIAlyZWxhdGlvbl9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7 CiAKLS0gCjIuNTEuMAoK --00000000000066bb91064cab6d50 Content-Type: application/x-sh; name="run_streaming_benchmark.sh" Content-Disposition: attachment; filename="run_streaming_benchmark.sh" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmklqxyf1 IyEvdXNyL2Jpbi9lbnYgYmFzaApzZXQgLWV1byBwaXBlZmFpbAoKIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIwojIFN0cmVhbWluZyBSZWFkIFBhdGNoZXMgQmVuY2htYXJrCiMKIyBVc2FnZTogLi9ydW5f c3RyZWFtaW5nX2JlbmNoLnNoIFtPUFRJT05TXSA8cGF0Y2g+CiMKIyBPcHRpb25zOgojICAgLS1j bGVhbiAgICAgICAgICAgUmVtb3ZlIGV4aXN0aW5nIGJ1aWxkcyBhbmQgc3RhcnQgZnJlc2gKIyAg IC0tYmFzZWxpbmUgICAgICAgIEFsc28gYnVpbGQgYW5kIHRlc3QgdmFuaWxsYSBQb3N0Z3JlU1FM IGZvciBjb21wYXJpc29uCiMgICAtLXRlc3QgVEVTVCAgICAgICBSdW4gc3BlY2lmaWMgdGVzdCAo Ymxvb21fc2NhbiwgYmxvb21fdmFjdXVtLCBwZ3N0YXR0dXBsZSwKIyAgICAgICAgICAgICAgICAg ICAgIHBnc3RhdGluZGV4LCBnaW5fdmFjdXVtLCB3YWxfbG9nZ2luZywgaGFzaF92YWN1dW0sIG9y ICJhbGwiKQojICAgLS1pby1tZXRob2QgTU9ERSAgSS9PIG1ldGhvZDogaW9fdXJpbmcsIHdvcmtl ciwgb3Igc3luYyAoZGVmYXVsdDogaW9fdXJpbmcpCiMgICAtLWlvLXdvcmtlcnMgTiAgICBOdW1i ZXIgb2YgSS9PIHdvcmtlcnMgZm9yIHdvcmtlciBtb2RlIChkZWZhdWx0OiAzKQojICAgLS1pby1j b25jdXJyZW5jeSBOICBNYXggY29uY3VycmVudCBJL09zIHBlciBwcm9jZXNzIChkZWZhdWx0OiA2 NCkKIyAgIC0tcHJvZmlsZSAgICAgICAgICAgRW5hYmxlIHBlcmYgcHJvZmlsaW5nIGFuZCBmbGFt ZWdyYXBoIGdlbmVyYXRpb24KIwojIEVudmlyb25tZW50OgojICAgV09SS1JPT1QgICAgIEJhc2Ug ZGlyZWN0b3J5IChkZWZhdWx0OiAkSE9NRS9wZ19iZW5jaCkKIyAgIFJFUFMgICAgICAgICBSZXBl dGl0aW9ucyBwZXIgdGVzdCAoZGVmYXVsdDogNSkKIyAgIFNJWkVTICAgICAgICBUYWJsZSBzaXpl cyB0byB0ZXN0IChkZWZhdWx0OiAibGFyZ2UiKQojICAgRkxBTUVHUkFQSF9ESVIgIFBhdGggdG8g RmxhbWVHcmFwaCB0b29scyAoZGVmYXVsdDogJEhPTUUvRmxhbWVHcmFwaCkKIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIwoKbG9nKCkgeyBwcmludGYgJ1wwMzNbMTszNG09PT5cMDMzWzBtICVzXG4nICIk KiI7IH0KZGllKCkgeyBwcmludGYgJ1wwMzNbMTszMW1FUlJPUjpcMDMzWzBtICVzXG4nICIkKiIg PiYyOyBleGl0IDE7IH0KCiMgLS0tIENMSSBwYXJzaW5nIC0tLQpDTEVBTj0wCkJBU0VMSU5FPTAK RE9fUFJPRklMRT0wClRFU1Q9ImFsbCIKSU9fTUVUSE9EPSIke0lPX01FVEhPRDotaW9fdXJpbmd9 IgpJT19XT1JLRVJTPSIke0lPX1dPUktFUlM6LTN9IgpJT19NQVhfQ09OQ1VSUkVOQ1k9IiR7SU9f TUFYX0NPTkNVUlJFTkNZOi02NH0iClBBVENIPSIiCgp3aGlsZSBbWyAkIyAtZ3QgMCBdXTsgZG8K ICBjYXNlICIkMSIgaW4KICAgIC0tY2xlYW4pICAgICAgICAgIENMRUFOPTEgOzsKICAgIC0tYmFz ZWxpbmUpICAgICAgIEJBU0VMSU5FPTEgOzsKICAgIC0tcHJvZmlsZSkgICAgICAgIERPX1BST0ZJ TEU9MSA7OwogICAgLS10ZXN0KSAgICAgICAgICAgVEVTVD0iJDIiOyBzaGlmdCA7OwogICAgLS1p by1tZXRob2QpICAgICAgSU9fTUVUSE9EPSIkMiI7IHNoaWZ0IDs7CiAgICAtLWlvLXdvcmtlcnMp ICAgICBJT19XT1JLRVJTPSIkMiI7IHNoaWZ0IDs7CiAgICAtLWlvLWNvbmN1cnJlbmN5KSBJT19N QVhfQ09OQ1VSUkVOQ1k9IiQyIjsgc2hpZnQgOzsKICAgIC1ofC0taGVscCkgICAgICAgIHNlZCAt biAnMywxOXAnICIkMCIgfCBzZWQgJ3MvXiMgXD8vLyc7IGV4aXQgMCA7OwogICAgLSopICAgICAg ICAgICAgICAgZGllICJVbmtub3duIG9wdGlvbjogJDEiIDs7CiAgICAqKSAgICAgICAgICAgICAg ICBQQVRDSD0iJDEiIDs7CiAgZXNhYwogIHNoaWZ0CmRvbmUKCiMgVmFsaWRhdGUgaW9fbWV0aG9k CmNhc2UgIiRJT19NRVRIT0QiIGluCiAgaW9fdXJpbmd8d29ya2VyfHN5bmMpIDs7CiAgKikgZGll ICJJbnZhbGlkIC0taW8tbWV0aG9kOiAkSU9fTUVUSE9EIChtdXN0IGJlIGlvX3VyaW5nLCB3b3Jr ZXIsIG9yIHN5bmMpIiA7Owplc2FjCgpbWyAteiAiJFBBVENIIiBdXSAmJiBkaWUgIlVzYWdlOiAk MCBbLS1jbGVhbl0gWy0tYmFzZWxpbmVdIFstLXRlc3QgVEVTVF0gPHBhdGNoPiIKW1sgISAtZiAi JFBBVENIIiBdXSAmJiBkaWUgIlBhdGNoIG5vdCBmb3VuZDogJFBBVENIIgpbWyAiJFBBVENIIiAh PSAvKiBdXSAmJiBQQVRDSD0iJFBXRC8kUEFUQ0giCgojIC0tLSBQcm9maWxpbmcgdmFsaWRhdGlv biAtLS0KRkxBTUVHUkFQSF9ESVI9IiR7RkxBTUVHUkFQSF9ESVI6LSRIT01FL0ZsYW1lR3JhcGh9 IgpQRVJGX1NVRE89IiR7UEVSRl9TVURPOi1zdWRvfSIKUEVSRl9FVkVOVD0iJHtQRVJGX0VWRU5U Oi1jeWNsZXN9IiAgIyBjeWNsZXMgPSB1c2VyK2tlcm5lbDsgY3ljbGVzOnUgPSB1c2VyLW9ubHkK aWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07IHRoZW4KICBjb21tYW5kIC12IHBlcmYgPi9kZXYv bnVsbCAyPiYxIHx8IGRpZSAiTmVlZCBwZXJmIChzdWRvIGFwdCBpbnN0YWxsIGxpbnV4LXRvb2xz LSQodW5hbWUgLXIpKSIKICBbWyAteCAiJEZMQU1FR1JBUEhfRElSL3N0YWNrY29sbGFwc2UtcGVy Zi5wbCIgXV0gfHwgZGllICJNaXNzaW5nICRGTEFNRUdSQVBIX0RJUi9zdGFja2NvbGxhcHNlLXBl cmYucGwgKGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYnJlbmRhbmdyZWdnL0ZsYW1lR3Jh cGgpIgogIFtbIC14ICIkRkxBTUVHUkFQSF9ESVIvZmxhbWVncmFwaC5wbCIgXV0gfHwgZGllICJN aXNzaW5nICRGTEFNRUdSQVBIX0RJUi9mbGFtZWdyYXBoLnBsIgpmaQoKIyAtLS0gQ29uZmlndXJh dGlvbiAtLS0KV09SS1JPT1Q9IiR7V09SS1JPT1Q6LSRIT01FL3BnX2JlbmNofSIKUkVQUz0iJHtS RVBTOi01fSIKU0laRVM9IiR7U0laRVM6LWxhcmdlfSIKClJPT1RfQkFTRT0iJFdPUktST09UL3Zh bmlsbGEiClJPT1RfUEFUQ0g9IiRXT1JLUk9PVC9wYXRjaGVkIgoKIyAtLS0gSGVscGVycyAtLS0K cGcoKSB7IGVjaG8gIiQxL3BnL2Jpbi8kMiI7IH0KCnBpY2tfcG9ydCgpIHsKICBmb3IgcCBpbiAk KHNlcSAiJHsxOi01NDMyfSIgNjAwMDApOyBkbwogICAgbHNvZiAtaVRDUDoiJHAiIC1zVENQOkxJ U1RFTiA+L2Rldi9udWxsIDI+JjEgfHwgeyBlY2hvICIkcCI7IHJldHVybjsgfQogIGRvbmUKICBk aWUgIk5vIGZyZWUgcG9ydCBmb3VuZCIKfQoKIyAtLS0gQnVpbGQgUG9zdGdyZVNRTCAtLS0KYnVp bGRfcGcoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBBVENIX0ZJTEU9IiR7MjotfSIKICAKICBbWyAk Q0xFQU4gLWVxIDEgXV0gJiYgcm0gLXJmICIkUk9PVCIKICAKICBpZiBbWyAteCAiJChwZyAiJFJP T1QiIGluaXRkYikiIF1dOyB0aGVuCiAgICBsb2cgIlJldXNpbmcgYnVpbGQ6ICRST09UIgogICAg cmV0dXJuCiAgZmkKICAKICBsb2cgIkJ1aWxkaW5nIFBvc3RncmVTUUw6ICRST09UIgogIG1rZGly IC1wICIkUk9PVCIKICAKICBnaXQgY2xvbmUgLS1kZXB0aCAxIGh0dHBzOi8vZ2l0aHViLmNvbS9w b3N0Z3Jlcy9wb3N0Z3JlcyAiJFJPT1Qvc3JjIiAyPi9kZXYvbnVsbAogIGNkICIkUk9PVC9zcmMi CiAgCiAgW1sgLW4gIiRQQVRDSF9GSUxFIiBdXSAmJiB7IGxvZyAiQXBwbHlpbmcgcGF0Y2giOyBn aXQgYXBwbHkgIiRQQVRDSF9GSUxFIjsgfQogIAogIC4vY29uZmlndXJlIC0tcHJlZml4PSIkUk9P VC9wZyIgLS13aXRoLWxpYnVyaW5nIFwKICAgIENGTEFHUz0nLU8yIC1nZ2RiMyAtZm5vLW9taXQt ZnJhbWUtcG9pbnRlcicgPi9kZXYvbnVsbCAyPiYxCiAgCiAgbWFrZSAtaiIkKG5wcm9jKSIgaW5z dGFsbCA+L2Rldi9udWxsIDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvYmxvb20gaW5zdGFsbCA+L2Rl di9udWxsIDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvcGdzdGF0dHVwbGUgaW5zdGFsbCA+L2Rldi9u dWxsIDI+JjEKfQoKIyAtLS0gQ2x1c3RlciBtYW5hZ2VtZW50IC0tLQppbml0X2NsdXN0ZXIoKSB7 CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIgogIAogIHJtIC1yZiAiJFJPT1QvZGF0YSIKICAi JChwZyAiJFJPT1QiIGluaXRkYikiIC1EICIkUk9PVC9kYXRhIiAtLW5vLWxvY2FsZSA+L2Rldi9u dWxsIDI+JjEKICAKICBjYXQgPj4gIiRST09UL2RhdGEvcG9zdGdyZXNxbC5jb25mIiA8PEVPRgpw b3J0ID0gJFBPUlQKbGlzdGVuX2FkZHJlc3NlcyA9ICcxMjcuMC4wLjEnCnNoYXJlZF9idWZmZXJz ID0gJzhHQicKZWZmZWN0aXZlX2lvX2NvbmN1cnJlbmN5ID0gMjAwCmlvX21ldGhvZCA9ICRJT19N RVRIT0QKaW9fd29ya2VycyA9ICRJT19XT1JLRVJTCmlvX21heF9jb25jdXJyZW5jeSA9ICRJT19N QVhfQ09OQ1VSUkVOQ1kKdHJhY2tfaW9fdGltaW5nID0gb24KdHJhY2tfd2FsX2lvX3RpbWluZyA9 IG9uCnN5bmNocm9ub3VzX2NvbW1pdCA9IG9uCmF1dG92YWN1dW0gPSBvZmYKY2hlY2twb2ludF90 aW1lb3V0ID0gMWgKbWF4X3dhbF9zaXplID0gMTBHQgptYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJf Z2F0aGVyID0gMApFT0YKICAKICAiJChwZyAiJFJPT1QiIHBnX2N0bCkiIC1EICIkUk9PVC9kYXRh IiAtbCAiJFJPT1Qvc2VydmVyLmxvZyIgc3RhcnQgLXcgPi9kZXYvbnVsbAp9CgpzdG9wX2NsdXN0 ZXIoKSB7CiAgbG9jYWwgUk9PVD0iJDEiCiAgIiQocGcgIiRST09UIiBwZ19jdGwpIiAtRCAiJFJP T1QvZGF0YSIgc3RvcCAtbSBmYXN0IDI+L2Rldi9udWxsIHx8IHRydWUKfQoKZHJvcF9jYWNoZXMo KSB7CiAgbG9jYWwgUk9PVD0iJDEiCiAgc3RvcF9jbHVzdGVyICIkUk9PVCIKICBzeW5jCiAgZWNo byAzIHwgc3VkbyB0ZWUgL3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVzID4vZGV2L251bGwgMj4mMSB8 fCB0cnVlCiAgc2xlZXAgMgogICIkKHBnICIkUk9PVCIgcGdfY3RsKSIgLUQgIiRST09UL2RhdGEi IC1sICIkUk9PVC9zZXJ2ZXIubG9nIiBzdGFydCAtdyA+L2Rldi9udWxsCn0KCnBzcWxfcnVuKCkg ewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIKICBzaGlmdCAyCiAgIiQocGcgIiRST09UIiBw c3FsKSIgLWggMTI3LjAuMC4xIC1wICIkUE9SVCIgLWQgcG9zdGdyZXMgLXYgT05fRVJST1JfU1RP UD0xIC1BdHEgIiRAIgp9CgojIC0tLSBUaW1pbmcgLS0tCnJ1bl90aW1lZCgpIHsKICBsb2NhbCBS T09UPSIkMSIgUE9SVD0iJDIiIFNRTD0iJDMiCiAgbG9jYWwgbXMKICAjIC1YOiBpZ25vcmUgLnBz cWxyYywgLXYgT05fRVJST1JfU1RPUD0xOiBmYWlsIG9uIFNRTCBlcnJvcnMKICAjIFBhcnNlIGxh c3QgVGltZTogbGluZSwgaGFuZGxlIGJvdGggIm1zIiBhbmQgInMiIHVuaXRzCiAgbXM9JCgiJChw ZyAiJFJPT1QiIHBzcWwpIiAtaCAxMjcuMC4wLjEgLXAgIiRQT1JUIiAtZCBwb3N0Z3JlcyAtWCAt diBPTl9FUlJPUl9TVE9QPTEgLUF0IFwKICAgIC1jICdcdGltaW5nIG9uJyAtYyAiJFNRTCIgMj4m MSB8IFwKICAgIGF3ayAnCiAgICAgIC9UaW1lOi8gewogICAgICAgIHZhbD0kMjsgdW5pdD0kMzsK ICAgICAgICBpZiAodW5pdD09Im1zIikgbXM9dmFsOwogICAgICAgIGVsc2UgaWYgKHVuaXQ9PSJz IikgbXM9dmFsKjEwMDA7CiAgICAgIH0KICAgICAgRU5EIHsgaWYgKG1zPT0iIikgZXhpdCAxOyBw cmludGYgIiUuM2ZcbiIsIG1zOyB9CiAgICAnKQogICMgVmFsaWRhdGUgbnVtZXJpYyBvdXRwdXQK ICBbWyAiJG1zIiA9fiBeWzAtOV0rKFwuWzAtOV0rKT8kIF1dIHx8IHsgZWNobyAiRVJST1I6IE5v bi1udW1lcmljIHRpbWluZzogJG1zIiA+JjI7IHJldHVybiAxOyB9CiAgZWNobyAiJG1zIgp9Cgoj IC0tLSBJL08gU3RhdHMgLS0tCiMgUnVuIFNRTCBhbmQgY2FwdHVyZSB0aW1pbmcgKyBJL08gc3Rh dHMgZnJvbSBwZ19zdGF0X2lvCiMgUmVzZXRzIHN0YXRzIGJlZm9yZSBxdWVyeSwgd2FpdHMgZm9y IGZsdXNoLCB0aGVuIHJlYWRzIGFic29sdXRlIHZhbHVlcwojIE5vdGU6IHBnX3N0YXRfaW8gaGFz IFBHU1RBVF9NSU5fSU5URVJWQUw9MTAwMG1zIGZsdXNoIGRlbGF5LCBzbyB3ZSB3YWl0IDEuNXMK IyAgICAgICBhZnRlciB0aGUgcXVlcnkgdG8gZW5zdXJlIHN0YXRzIGFyZSBmbHVzaGVkIHRvIHNo YXJlZCBtZW1vcnkuCiMgTm90ZTogcGdfc3RhdF9pbyBjb3VudHMgSS9PIG9wZXJhdGlvbnMsIG5v dCBwYWdlcyAod2l0aCBpb19jb21iaW5lX2xpbWl0PTEyOGtCLAojICAgICAgIHVwIHRvIDE2IHBh Z2VzIHBlciBvcGVyYXRpb24pLiBUaGlzIGlzIGV4cGVjdGVkIGJlaGF2aW9yLgojIFJldHVybnM6 IG1zLHJlYWRzLHJlYWRfdGltZQpydW5fdGltZWRfd2l0aF9pbygpIHsKICBsb2NhbCBST09UPSIk MSIgUE9SVD0iJDIiIFNRTD0iJDMiCiAgbG9jYWwgcmVzdWx0CiAgCiAgIyBSZXNldCBzdGF0cywg cnVuIHF1ZXJ5LCB3YWl0IGZvciBmbHVzaCwgcmVhZCBhYnNvbHV0ZSB2YWx1ZXMKICAjIC0gRmls dGVyIGJ5IGNsaWVudCBiYWNrZW5kIGFuZCBpbyB3b3JrZXIgKGV4Y2x1ZGVzIGJnd3JpdGVyL2No ZWNrcG9pbnRlcikKICAjIC0gMS41cyBkZWxheSBhbGxvd3Mgc3RhdHMgdG8gZmx1c2ggKFBHU1RB VF9NSU5fSU5URVJWQUw9MTAwMG1zKQogIHJlc3VsdD0kKCIkKHBnICIkUk9PVCIgcHNxbCkiIC1o IDEyNy4wLjAuMSAtcCAiJFBPUlQiIC1kIHBvc3RncmVzIC1YIC12IE9OX0VSUk9SX1NUT1A9MSA8 PEVPU1FMClNFTEVDVCBwZ19zdGF0X3Jlc2V0X3NoYXJlZCgnaW8nKTsKXFx0aW1pbmcgb24KJFNR TApcXHRpbWluZyBvZmYKU0VMRUNUIHBnX3NsZWVwKDEuNSk7ClxcdCBvbgpTRUxFQ1QgCiAgQ09B TEVTQ0UoU1VNKHJlYWRzKSwwKTo6YmlnaW50LAogIENPQUxFU0NFKFNVTShyZWFkX3RpbWUpLDAp OjpudW1lcmljKDEyLDIpCkZST00gcGdfc3RhdF9pbyAKV0hFUkUgb2JqZWN0ID0gJ3JlbGF0aW9u JyBBTkQgYmFja2VuZF90eXBlIElOICgnY2xpZW50IGJhY2tlbmQnLCAnaW8gd29ya2VyJyk7CkVP U1FMCiAgMj4mMSkKICAKICAjIFBhcnNlIHRpbWluZyAobGFzdCBUaW1lOiBsaW5lKQogIGxvY2Fs IG1zCiAgbXM9JChlY2hvICIkcmVzdWx0IiB8IGF3ayAnCiAgICAvVGltZTovIHsKICAgICAgdmFs PSQyOyB1bml0PSQzOwogICAgICBpZiAodW5pdD09Im1zIikgbXM9dmFsOwogICAgICBlbHNlIGlm ICh1bml0PT0icyIpIG1zPXZhbCoxMDAwOwogICAgfQogICAgRU5EIHsgaWYgKG1zPT0iIikgZXhp dCAxOyBwcmludGYgIiUuM2ZcbiIsIG1zOyB9CiAgJykKICAKICAjIFBhcnNlIEkvTyBzdGF0cyAo bGFzdCBub24tZW1wdHkgbGluZSB3aXRoIHBpcGUgc2VwYXJhdG9yOiByZWFkc3xyZWFkX3RpbWUp CiAgbG9jYWwgcmVhZHMgcmVhZF90aW1lCiAgbG9jYWwgaW9fbGluZQogIGlvX2xpbmU9JChlY2hv ICIkcmVzdWx0IiB8IGdyZXAgJ3wnIHwgdGFpbCAtMSkKICByZWFkcz0kKGVjaG8gIiRpb19saW5l IiB8IGN1dCAtZCd8JyAtZjEgfCB0ciAtZCAnICcpCiAgcmVhZF90aW1lPSQoZWNobyAiJGlvX2xp bmUiIHwgY3V0IC1kJ3wnIC1mMiB8IHRyIC1kICcgJykKICAKICAjIERlZmF1bHQgdG8gMCBpZiBu b3QgZm91bmQKICBbWyAiJHJlYWRzIiA9fiBeLT9bMC05XSskIF1dIHx8IHJlYWRzPTAKICBbWyAi JHJlYWRfdGltZSIgPX4gXi0/WzAtOV0rKFwuWzAtOV0rKT8kIF1dIHx8IHJlYWRfdGltZT0wCiAg CiAgZWNobyAiJG1zLCRyZWFkcywkcmVhZF90aW1lIgp9CgojIC0tLSBTdGF0aXN0aWNzIC0tLQpj YWxjX21lZGlhbigpIHsKICBhd2sgLUYsICdOUj4xe2FbKytuXT0kMn1FTkR7CiAgICBpZihuPT0w KXtwcmludCAwOyBleGl0fQogICAgZm9yKGk9MTtpPD1uO2krKylmb3Ioaj1pKzE7ajw9bjtqKysp aWYoYVtpXT5hW2pdKXt0PWFbaV07YVtpXT1hW2pdO2Fbal09dH0KICAgIHByaW50IChuJTIpP2Fb aW50KG4vMikrMV06KGFbbi8yXSthW24vMisxXSkvMgogIH0nICIkMSIKfQoKY2FsY19tZWRpYW5f Y29sKCkgewogIGxvY2FsIGZpbGU9IiQxIiBjb2w9IiQyIgogIGF3ayAtRiwgLXYgY29sPSIkY29s IiAnTlI+MXthWysrbl09JGNvbH1FTkR7CiAgICBpZihuPT0wKXtwcmludCAwOyBleGl0fQogICAg Zm9yKGk9MTtpPD1uO2krKylmb3Ioaj1pKzE7ajw9bjtqKyspaWYoYVtpXT5hW2pdKXt0PWFbaV07 YVtpXT1hW2pdO2Fbal09dH0KICAgIHByaW50IChuJTIpP2FbaW50KG4vMikrMV06KGFbbi8yXSth W24vMisxXSkvMgogIH0nICIkZmlsZSIKfQoKY2FsY19zdGF0cygpIHsKICBsb2NhbCBjc3Y9IiQx IgogIGF3ayAtRiwgJ05SPjF7YVsrK25dPSQyO3MrPSQyfUVORHsKICAgIGlmKG49PTApZXhpdAog ICAgZm9yKGk9MTtpPD1uO2krKylmb3Ioaj1pKzE7ajw9bjtqKyspaWYoYVtpXT5hW2pdKXt0PWFb aV07YVtpXT1hW2pdO2Fbal09dH0KICAgIG1lZD0obiUyKT9hW2ludChuLzIpKzFdOihhW24vMl0r YVtuLzIrMV0pLzIKICAgIGF2Zz1zL247IGZvcihpPTE7aTw9bjtpKyspc3MrPShhW2ldLWF2Zyle Mjsgc2Q9c3FydChzcy9uKQogICAgcHJpbnRmICJtZWRpYW49JS4xZm1zIG1lYW49JS4xZsKxJS4x Zm1zIG49JWQiLCBtZWQsIGF2Zywgc2QsIG4KICB9JyAiJGNzdiIKfQoKIyAtLS0gUHJvZmlsaW5n IC0tLQojIFJ1biBhIFNRTCBjb21tYW5kIHVuZGVyIHBlcmYsIGF0dGFjaGluZyB0byB0aGUgYmFj a2VuZCBQSUQuCiMgR2VuZXJhdGVzIHBlcmYuZGF0YSBhbmQgZmxhbWVncmFwaCBTVkcuCiMgICBw cm9maWxlX3NxbCBST09UIFBPUlQgTEFCRUwgU1FMCnByb2ZpbGVfc3FsKCkgewogIFtbICRET19Q Uk9GSUxFIC1uZSAxIF1dICYmIHJldHVybgogIAogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIg TEFCRUw9IiQzIiBTUUw9IiQ0IgogIGxvY2FsIFBST0ZfRElSPSIkUk9PVC9wcm9maWxlIgogIG1r ZGlyIC1wICIkUFJPRl9ESVIiCiAgCiAgbG9jYWwgUEVSRl9EQVRBPSIkUFJPRl9ESVIvJHtMQUJF TH0ucGVyZi5kYXRhIgogIGxvY2FsIFNWRz0iJFBST0ZfRElSLyR7TEFCRUx9LnN2ZyIKICBsb2Nh bCBwc3FsX2JpbgogIHBzcWxfYmluPSIkKHBnICIkUk9PVCIgcHNxbCkiCiAgCiAgIyBVc2UgYSB1 bmlxdWUgYXBwbGljYXRpb25fbmFtZSB0byBmaW5kIHRoZSBiYWNrZW5kIFBJRAogIGxvY2FsIEFQ UD0icHJvZl8ke0xBQkVMfV8kJCIKICAKICAjIExhdW5jaCBhIHBzcWwgc2Vzc2lvbiB0aGF0IHdp bGwgZmlyc3QgaWRlbnRpZnkgaXRzZWxmLCB0aGVuIHJ1biB0aGUgU1FMCiAgIyBUaGUgcGdfc2xl ZXAoKSBnaXZlcyB1cyB0aW1lIHRvIGZpbmQgdGhlIGJhY2tlbmQgUElEIGFuZCBhdHRhY2ggcGVy ZgogIFBHQVBQTkFNRT0iJEFQUCIgIiRwc3FsX2JpbiIgLWggMTI3LjAuMC4xIC1wICIkUE9SVCIg LWQgcG9zdGdyZXMgXAogICAgLVggLXYgT05fRVJST1JfU1RPUD0xIDw8RU9TUUwgPi9kZXYvbnVs bCAyPiYxICYKU0VMRUNUIHBnX3NsZWVwKDIpOwokU1FMCkVPU1FMCiAgbG9jYWwgUVVFUllfU0hF TExfUElEPSQhCiAgCiAgIyBGaW5kIHRoZSBiYWNrZW5kIFBJRCB2aWEgcGdfc3RhdF9hY3Rpdml0 eQogIGxvY2FsIEJBQ0tFTkRfUElEPSIiCiAgZm9yICgobj0wOyBuPDEwMDsgbisrKSk7IGRvCiAg ICBCQUNLRU5EX1BJRD0kKCIkcHNxbF9iaW4iIC1oIDEyNy4wLjAuMSAtcCAiJFBPUlQiIC1kIHBv c3RncmVzIC1BdHEgXAogICAgICAtYyAiU0VMRUNUIHBpZCBGUk9NIHBnX3N0YXRfYWN0aXZpdHkg V0hFUkUgYXBwbGljYXRpb25fbmFtZT0nJHtBUFB9JyBPUkRFUiBCWSBiYWNrZW5kX3N0YXJ0IERF U0MgTElNSVQgMTsiIDI+L2Rldi9udWxsKQogICAgW1sgLW4gIiRCQUNLRU5EX1BJRCIgJiYgLWQg Ii9wcm9jLyRCQUNLRU5EX1BJRCIgXV0gJiYgYnJlYWsKICAgIHNsZWVwIDAuMDUKICBkb25lCiAg CiAgaWYgW1sgLXogIiRCQUNLRU5EX1BJRCIgfHwgISAtZCAiL3Byb2MvJEJBQ0tFTkRfUElEIiBd XTsgdGhlbgogICAgbG9nICJXQVJOSU5HOiBDb3VsZCBub3QgZmluZCBiYWNrZW5kIFBJRCBmb3Ig cHJvZmlsaW5nLCBza2lwcGluZyIKICAgIHdhaXQgIiRRVUVSWV9TSEVMTF9QSUQiIDI+L2Rldi9u dWxsIHx8IHRydWUKICAgIHJldHVybgogIGZpCiAgCiAgbG9nICJQcm9maWxpbmcgYmFja2VuZCBQ SUQgJEJBQ0tFTkRfUElEIOKGkiAkUEVSRl9EQVRBIgogIAogICMgQXR0YWNoIHBlcmYgdG8gdGhl IGJhY2tlbmQ7IHdlIGV4cGxpY2l0bHkga2lsbCAtSU5UIGl0IGFmdGVyIHRoZSBxdWVyeSBmaW5p c2hlcwogICRQRVJGX1NVRE8gcGVyZiByZWNvcmQgLWcgLS1jYWxsLWdyYXBoIGR3YXJmIFwKICAg IC1wICIkQkFDS0VORF9QSUQiIC1vICIkUEVSRl9EQVRBIiBcCiAgICAtLWV2ZW50PSIkUEVSRl9F VkVOVCIgMj4vZGV2L251bGwgJgogIGxvY2FsIFBFUkZfUElEPSQhCiAgc2xlZXAgMC4xCiAgCiAg IyBWZXJpZnkgcGVyZiBhY3R1YWxseSBzdGFydGVkIChwZXJtaXNzaW9ucywgdmFsaWQgUElELCBl dGMuKQogIGlmICEga2lsbCAtMCAiJFBFUkZfUElEIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgbG9n ICJXQVJOSU5HOiBwZXJmIHJlY29yZCBmYWlsZWQgdG8gc3RhcnQgKHBlcm1pc3Npb25zL2NvbmZp Zz8pLCBza2lwcGluZyBmbGFtZWdyYXBoIgogICAgd2FpdCAiJFFVRVJZX1NIRUxMX1BJRCIgMj4v ZGV2L251bGwgfHwgdHJ1ZQogICAgcmV0dXJuCiAgZmkKICAKICAjIFdhaXQgZm9yIHRoZSBxdWVy eSB0byBmaW5pc2gKICB3YWl0ICIkUVVFUllfU0hFTExfUElEIiAyPi9kZXYvbnVsbCB8fCB0cnVl CiAgCiAgIyBHaXZlIHBlcmYgYSBtb21lbnQgdG8gZmx1c2gsIHRoZW4gc3RvcCBpdAogIHNsZWVw IDAuNQogICRQRVJGX1NVRE8ga2lsbCAtSU5UICIkUEVSRl9QSUQiIDI+L2Rldi9udWxsIHx8IHRy dWU7IHdhaXQgIiRQRVJGX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIAogICMgR2VuZXJhdGUg ZmxhbWVncmFwaAogIGdlbmVyYXRlX2ZsYW1lZ3JhcGggIiRQRVJGX0RBVEEiICIkU1ZHIiAiJExB QkVMIgp9CgojIENvbnZlcnQgcGVyZi5kYXRhIOKGkiBmbGFtZWdyYXBoIFNWRwojICAgZ2VuZXJh dGVfZmxhbWVncmFwaCBQRVJGX0RBVEEgU1ZHX1BBVEggVElUTEUKZ2VuZXJhdGVfZmxhbWVncmFw aCgpIHsKICBsb2NhbCBQRVJGX0RBVEE9IiQxIiBTVkc9IiQyIiBUSVRMRT0iJDMiCiAgCiAgW1sg LWYgIiRQRVJGX0RBVEEiIF1dIHx8IHJldHVybgogIAogIGxvY2FsIEZPTERFRD0iJHtQRVJGX0RB VEElLnBlcmYuZGF0YX0uZm9sZGVkIgogIGlmICRQRVJGX1NVRE8gcGVyZiBzY3JpcHQgLWkgIiRQ RVJGX0RBVEEiIDI+L2Rldi9udWxsIFwKICAgICAgfCAiJEZMQU1FR1JBUEhfRElSL3N0YWNrY29s bGFwc2UtcGVyZi5wbCIgPiAiJEZPTERFRCIgMj4vZGV2L251bGwgXAogICAgICAmJiBbWyAtcyAi JEZPTERFRCIgXV07IHRoZW4KICAgICIkRkxBTUVHUkFQSF9ESVIvZmxhbWVncmFwaC5wbCIgLS10 aXRsZSAiJFRJVExFIiAtLWNvdW50bmFtZSBzYW1wbGVzIFwKICAgICAgIiRGT0xERUQiID4gIiRT VkciIDI+L2Rldi9udWxsCiAgICBsb2cgIkZsYW1lZ3JhcGg6ICRTVkciCiAgICBybSAtZiAiJEZP TERFRCIKICBlbHNlCiAgICBsb2cgIldBUk5JTkc6IEZhaWxlZCB0byBnZW5lcmF0ZSBmbGFtZWdy YXBoIGZvciAkVElUTEUiCiAgICBybSAtZiAiJEZPTERFRCIKICBmaQp9CgojIC0tLSBCZW5jaG1h cmsgcnVubmVyIC0tLQpiZW5jaG1hcmsoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBO QU1FPSIkMyIgU1FMPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMvJHtOQU1FfS5jc3Yi CiAgCiAgbWtkaXIgLXAgIiRST09UL3Jlc3VsdHMiCiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRf dGltZV9tcyIgPiAiJE9VVCIKICAKICBmb3IgKChpPTE7IGk8PVJFUFM7IGkrKykpOyBkbwogICAg ZHJvcF9jYWNoZXMgIiRST09UIgogICAgbG9jYWwgcmVzdWx0IG1zIHJlYWRzIHJlYWRfdGltZQog ICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBPUlQiICIkU1FMIikKICAg IElGUz0nLCcgcmVhZCAtciBtcyByZWFkcyByZWFkX3RpbWUgPDw8IiRyZXN1bHQiCiAgICBlY2hv ICIkaSwkbXMsJHJlYWRzLCRyZWFkX3RpbWUiID4+ICIkT1VUIgogICAgbG9nICIkTkFNRSBbJGkv JFJFUFNdOiAke21zfW1zIChyZWFkcz0kcmVhZHMsIGlvX3RpbWU9JHtyZWFkX3RpbWV9bXMpIgog IGRvbmUKfQoKIyAtLS0gRGF0YSBzZXR1cCBmdW5jdGlvbnMgLS0tCnNldHVwX2Jsb29tKCkgewog IGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU0laRT0iJDMiCiAgbG9jYWwgTlJPV1MKICBjYXNl ICIkU0laRSIgaW4KICAgIHNtYWxsKSAgTlJPV1M9MTAwMDAwIDs7CiAgICBtZWRpdW0pIE5ST1dT PTEwMDAwMDAgOzsKICAgIGxhcmdlKSAgTlJPV1M9MTAwMDAwMDAgOzsKICBlc2FjCiAgCiAgbG9n ICJDcmVhdGluZyBCbG9vbSB0ZXN0IGRhdGEgKCRTSVpFOiAkTlJPV1Mgcm93cykiCiAgcHNxbF9y dW4gIiRST09UIiAiJFBPUlQiIDw8U1FMCkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBi bG9vbTsKRFJPUCBUQUJMRSBJRiBFWElTVFMgYmxvb21fdGVzdDsKQ1JFQVRFIFRBQkxFIGJsb29t X3Rlc3QgKGlkIElOVCwgZGF0YSBURVhULCB2YWwxIElOVCwgdmFsMiBJTlQpOwpJTlNFUlQgSU5U TyBibG9vbV90ZXN0IFNFTEVDVCBpLCAnZGF0YV8nfHxpLCBpJTEwMDAsIGklMTAwIEZST00gZ2Vu ZXJhdGVfc2VyaWVzKDEsJE5ST1dTKSBpOwpDUkVBVEUgSU5ERVggYmxvb21faWR4IE9OIGJsb29t X3Rlc3QgVVNJTkcgYmxvb20gKHZhbDEsIHZhbDIpOwpWQUNVVU0gQU5BTFlaRSBibG9vbV90ZXN0 OwpDSEVDS1BPSU5UOwpTUUwKfQoKc2V0dXBfcGdzdGF0dHVwbGUoKSB7CiAgbG9jYWwgUk9PVD0i JDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIKICBsb2NhbCBOUk9XUwogIGNhc2UgIiRTSVpFIiBpbgog ICAgc21hbGwpICBOUk9XUz0xMDAwMDAgOzsKICAgIG1lZGl1bSkgTlJPV1M9MTAwMDAwMCA7Owog ICAgbGFyZ2UpICBOUk9XUz0xMDAwMDAwMCA7OwogIGVzYWMKICAKICBsb2cgIkNyZWF0aW5nIHBn c3RhdHR1cGxlIHRlc3QgZGF0YSAoJFNJWkU6ICROUk9XUyByb3dzKSIKICBwc3FsX3J1biAiJFJP T1QiICIkUE9SVCIgPDxTUUwKQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHBnc3RhdHR1 cGxlOwpEUk9QIFRBQkxFIElGIEVYSVNUUyBoZWFwX3Rlc3Q7CkNSRUFURSBUQUJMRSBoZWFwX3Rl c3QgKGlkIFNFUklBTCBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsKSU5TRVJUIElOVE8gaGVhcF90 ZXN0IChkYXRhKSBTRUxFQ1QgcmVwZWF0KCd4JywxMDApIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEs JE5ST1dTKTsKVkFDVVVNIEFOQUxZWkUgaGVhcF90ZXN0OwpDSEVDS1BPSU5UOwpTUUwKfQoKc2V0 dXBfcGdzdGF0aW5kZXgoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIK ICBsb2NhbCBOUk9XUwogIGNhc2UgIiRTSVpFIiBpbgogICAgc21hbGwpICBOUk9XUz0xMDAwMDAg OzsKICAgIG1lZGl1bSkgTlJPV1M9MTAwMDAwMCA7OwogICAgbGFyZ2UpICBOUk9XUz0xMDAwMDAw MCA7OwogIGVzYWMKICAKICBsb2cgIkNyZWF0aW5nIHBnc3RhdGluZGV4IHRlc3QgZGF0YSAoJFNJ WkU6ICROUk9XUyByb3dzKSIKICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgPDxTUUwKQ1JFQVRF IEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHBnc3RhdHR1cGxlOwpEUk9QIFRBQkxFIElGIEVYSVNU UyBpZHhfdGVzdDsKQ1JFQVRFIFRBQkxFIGlkeF90ZXN0IChpZCBTRVJJQUwgUFJJTUFSWSBLRVks IGRhdGEgVEVYVCk7CklOU0VSVCBJTlRPIGlkeF90ZXN0IChkYXRhKSBTRUxFQ1QgJ2RhdGFfcm93 XycgfHwgaSB8fCAnXycgfHwgcmVwZWF0KCd4Jyw1MCkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwk TlJPV1MpIGk7ClZBQ1VVTSBBTkFMWVpFIGlkeF90ZXN0OwpDSEVDS1BPSU5UOwpTUUwKfQoKc2V0 dXBfZ2luKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU0laRT0iJDMiCiAgbG9jYWwg TlJPV1MKICBjYXNlICIkU0laRSIgaW4KICAgIHNtYWxsKSAgTlJPV1M9MTAwMDAwIDs7CiAgICBt ZWRpdW0pIE5ST1dTPTEwMDAwMDAgOzsKICAgIGxhcmdlKSAgTlJPV1M9NTAwMDAwMCA7OwogIGVz YWMKICAKICBsb2cgIkNyZWF0aW5nIEdJTiB0ZXN0IGRhdGEgKCRTSVpFOiAkTlJPV1Mgcm93cyki CiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIDw8U1FMCkRST1AgVEFCTEUgSUYgRVhJU1RTIGdp bl90ZXN0OwotLSBObyBQUklNQVJZIEtFWTogaXNvbGF0ZSBHSU4gaW5kZXggdmFjdXVtIGZyb20g YnRyZWUgb3ZlcmhlYWQKQ1JFQVRFIFRBQkxFIGdpbl90ZXN0IChpZCBJTlQsIHRhZ3MgVEVYVFtd KTsKSU5TRVJUIElOVE8gZ2luX3Rlc3QgKGlkLCB0YWdzKQpTRUxFQ1QgaSwgQVJSQVkoU0VMRUNU ICd0YWdfJ3x8KHJhbmRvbSgpKjEwMCk6OmludCBGUk9NIGdlbmVyYXRlX3NlcmllcygxLDUpKQpG Uk9NIGdlbmVyYXRlX3NlcmllcygxLCROUk9XUykgaTsKQ1JFQVRFIElOREVYIGdpbl9pZHggT04g Z2luX3Rlc3QgVVNJTkcgZ2luICh0YWdzKTsKVkFDVVVNIEFOQUxZWkUgZ2luX3Rlc3Q7CkNIRUNL UE9JTlQ7ClNRTAp9CgpzZXR1cF9oYXNoKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIg U0laRT0iJDMiCiAgbG9jYWwgTlJPV1MKICBjYXNlICIkU0laRSIgaW4KICAgIHNtYWxsKSAgTlJP V1M9NTAwMDAwIDs7CiAgICBtZWRpdW0pIE5ST1dTPTUwMDAwMDAgOzsKICAgIGxhcmdlKSAgTlJP V1M9MjAwMDAwMDAgOzsKICBlc2FjCiAgCiAgbG9nICJDcmVhdGluZyBIYXNoIHRlc3QgZGF0YSAo JFNJWkU6ICROUk9XUyB1bmlxdWUgdmFsdWVzKSIKICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIg PDxTUUwKRFJPUCBUQUJMRSBJRiBFWElTVFMgaGFzaF90ZXN0OwotLSBObyBQUklNQVJZIEtFWTog aXNvbGF0ZSBoYXNoIGluZGV4IHZhY3V1bSBmcm9tIGJ0cmVlIG92ZXJoZWFkCkNSRUFURSBUQUJM RSBoYXNoX3Rlc3QgKGlkIElOVCwgZGF0YSBURVhUKTsKSU5TRVJUIElOVE8gaGFzaF90ZXN0IFNF TEVDVCBpLCAneCcgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwkTlJPV1MpIGk7CkNSRUFURSBJTkRF WCBoYXNoX2lkeCBPTiBoYXNoX3Rlc3QgVVNJTkcgaGFzaCAoaWQpOwpWQUNVVU0gQU5BTFlaRSBo YXNoX3Rlc3Q7CkNIRUNLUE9JTlQ7ClNRTAp9CgpzZXR1cF93YWwoKSB7CiAgbG9jYWwgUk9PVD0i JDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIKICBsb2NhbCBOUk9XUwogIGNhc2UgIiRTSVpFIiBpbgog ICAgc21hbGwpICBOUk9XUz0xMDAwMDAwIDs7CiAgICBtZWRpdW0pIE5ST1dTPTUwMDAwMDAgOzsK ICAgIGxhcmdlKSAgTlJPV1M9MjAwMDAwMDAgOzsKICBlc2FjCiAgCiAgbG9nICJDcmVhdGluZyB0 YWJsZSBmb3IgR0lOIGluZGV4IGJ1aWxkIC8gbG9nX25ld3BhZ2VfcmFuZ2UgdGVzdCAoJFNJWkU6 ICROUk9XUyByb3dzKSIKICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgPDxTUUwKRFJPUCBUQUJM RSBJRiBFWElTVFMgd2FsX3Rlc3Q7Ci0tIFRhYmxlIHdpdGggdHN2ZWN0b3IgY29sdW1uIGZvciBH SU4gaW5kZXhpbmcgKGZ1bGwtdGV4dCBzZWFyY2gpCi0tIEdJTiBpbmRleCBidWlsZHMgYWx3YXlz IGNhbGwgbG9nX25ld3BhZ2VfcmFuZ2UoKSBhdCB0aGUgZW5kIG9mCi0tIGdpbmJ1aWxkKCkgKGdp bmluc2VydC5jKSB0byBXQUwtbG9nIGFsbCBpbmRleCBwYWdlcy4gCkNSRUFURSBUQUJMRSB3YWxf dGVzdCAoaWQgSU5ULCBkb2MgVEVYVCwgZG9jX3RzdiBUU1ZFQ1RPUik7CklOU0VSVCBJTlRPIHdh bF90ZXN0CiAgU0VMRUNUIGksCiAgICAgICAgICd3b3JkJyB8fCAocmFuZG9tKCkqMTAwMDApOjpp bnQgfHwgJyB0ZXJtJyB8fCAocmFuZG9tKCkqMTAwMDApOjppbnQKICAgICAgICAgICB8fCAnIHRv a2VuJyB8fCAocmFuZG9tKCkqNTAwMCk6OmludCB8fCAnIHBocmFzZScgfHwgKHJhbmRvbSgpKjgw MDApOjppbnQsCiAgICAgICAgIHRvX3RzdmVjdG9yKCdzaW1wbGUnLAogICAgICAgICAgICd3b3Jk JyB8fCAocmFuZG9tKCkqMTAwMDApOjppbnQgfHwgJyB0ZXJtJyB8fCAocmFuZG9tKCkqMTAwMDAp OjppbnQKICAgICAgICAgICB8fCAnIHRva2VuJyB8fCAocmFuZG9tKCkqNTAwMCk6OmludCB8fCAn IHBocmFzZScgfHwgKHJhbmRvbSgpKjgwMDApOjppbnQpCiAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwkTlJPV1MpIGk7ClZBQ1VVTSBBTkFMWVpFIHdhbF90ZXN0OwpDSEVDS1BPSU5UOwpTUUwKfQoK IyAtLS0gVGVzdCBmdW5jdGlvbnMgLS0tCnRlc3RfYmxvb21fc2NhbigpIHsKICBsb2NhbCBST09U PSIkMSIgUE9SVD0iJDIiIExBQkVMPSIkMyIgU0laRT0iJDQiCiAgc2V0dXBfYmxvb20gIiRST09U IiAiJFBPUlQiICIkU0laRSIKICBwcm9maWxlX3NxbCAiJFJPT1QiICIkUE9SVCIgIiR7TEFCRUx9 X2Jsb29tX3NjYW5fJHtTSVpFfSIgXAogICAgIlNFVCBlbmFibGVfc2Vxc2Nhbj1vZmY7IFNFTEVD VCBDT1VOVCgqKSBGUk9NIGJsb29tX3Rlc3QgV0hFUkUgdmFsMT00MiBBTkQgdmFsMj03OyIKICBi ZW5jaG1hcmsgIiRST09UIiAiJFBPUlQiICIke0xBQkVMfV9ibG9vbV9zY2FuXyR7U0laRX0iIFwK ICAgICJTRVQgZW5hYmxlX3NlcXNjYW49b2ZmOyBTRUxFQ1QgQ09VTlQoKikgRlJPTSBibG9vbV90 ZXN0IFdIRVJFIHZhbDE9NDIgQU5EIHZhbDI9NzsiCn0KCnRlc3RfYmxvb21fdmFjdXVtKCkgewog IGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBsb2NhbCBP VVQ9IiRST09UL3Jlc3VsdHMvJHtMQUJFTH1fYmxvb21fdmFjdXVtXyR7U0laRX0uY3N2IgogIG1r ZGlyIC1wICIkUk9PVC9yZXN1bHRzIgogIGVjaG8gInJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMi ID4gIiRPVVQiCiAgCiAgIyBQcm9maWxpbmcgcnVuIChzZXBhcmF0ZSBmcm9tIG1lYXN1cmVtZW50 KQogIGlmIFtbICRET19QUk9GSUxFIC1lcSAxIF1dOyB0aGVuCiAgICBzZXR1cF9ibG9vbSAiJFJP T1QiICIkUE9SVCIgIiRTSVpFIgogICAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJERUxF VEUgRlJPTSBibG9vbV90ZXN0IFdIRVJFIGlkICUgMTAgPSAwOyIKICAgIHByb2ZpbGVfc3FsICIk Uk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fYmxvb21fdmFjdXVtXyR7U0laRX0iICJWQUNVVU0gYmxv b21fdGVzdDsiCiAgZmkKICAKICBmb3IgKChpPTE7IGk8PVJFUFM7IGkrKykpOyBkbwogICAgIyBG cmVzaCB0YWJsZSBlYWNoIHJ1biBmb3IgY29uc2lzdGVudCBzdGF0ZQogICAgc2V0dXBfYmxvb20g IiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgICMgQ3JlYXRlIDEwJSBkZWFkIHR1cGxlcwogICAg cHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJERUxFVEUgRlJPTSBibG9vbV90ZXN0IFdIRVJF IGlkICUgMTAgPSAwOyIKICAgIAogICAgZHJvcF9jYWNoZXMgIiRST09UIgogICAgbG9jYWwgcmVz dWx0IG1zIHJlYWRzIHJlYWRfdGltZQogICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRS T09UIiAiJFBPUlQiICJWQUNVVU0gYmxvb21fdGVzdDsiKQogICAgSUZTPScsJyByZWFkIC1yIG1z IHJlYWRzIHJlYWRfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVhZHMsJHJl YWRfdGltZSIgPj4gIiRPVVQiCiAgICBsb2cgIiR7TEFCRUx9X2Jsb29tX3ZhY3V1bV8ke1NJWkV9 IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgaW9fdGltZT0ke3JlYWRfdGltZX1t cykiCiAgZG9uZQp9Cgp0ZXN0X3Bnc3RhdHR1cGxlKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JU PSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMvJHtM QUJFTH1fcGdzdGF0dHVwbGVfJHtTSVpFfS5jc3YiCiAgbWtkaXIgLXAgIiRST09UL3Jlc3VsdHMi CiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRfdGltZV9tcyIgPiAiJE9VVCIKICAKICAjIFByb2Zp bGluZyBydW4gKHNlcGFyYXRlIGZyb20gbWVhc3VyZW1lbnQg4oCUIHBnc3RhdHR1cGxlX2FwcHJv eCBpcyByZWFkLW9ubHksIHNhZmUgdG8gcHJvZmlsZSBpbmxpbmUpCiAgaWYgW1sgJERPX1BST0ZJ TEUgLWVxIDEgXV07IHRoZW4KICAgIHNldHVwX3Bnc3RhdHR1cGxlICIkUk9PVCIgIiRQT1JUIiAi JFNJWkUiCiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIlVQREFURSBoZWFwX3Rlc3Qg U0VUIGRhdGEgPSBkYXRhIHx8ICchJyBXSEVSRSBpZCAlIDUgPSAwOyIKICAgIHByb2ZpbGVfc3Fs ICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fcGdzdGF0dHVwbGVfJHtTSVpFfSIgXAogICAgICAi U0VMRUNUICogRlJPTSBwZ3N0YXR0dXBsZV9hcHByb3goJ2hlYXBfdGVzdCcpOyIKICBmaQogIAog IGZvciAoKGk9MTsgaTw9UkVQUzsgaSsrKSk7IGRvCiAgICAjIEZyZXNoIHRhYmxlIGVhY2ggcnVu CiAgICBzZXR1cF9wZ3N0YXR0dXBsZSAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICAgIyBVUERB VEUgY2xlYXJzIHRoZSBhbGwtdmlzaWJsZSBiaXQgaW4gdGhlIFZpc2liaWxpdHkgTWFwIGZvciBh ZmZlY3RlZCBwYWdlcy4KICAgICMgcGdzdGF0dHVwbGVfYXBwcm94IHNraXBzIGFsbC12aXNpYmxl IHBhZ2VzIChlc3RpbWF0ZXMgZnJvbSBWTSB3aXRob3V0IHJlYWRpbmcpLgogICAgIyBUaGlzIGVu c3VyZXMgdGhlIGZ1bmN0aW9uIG11c3QgYWN0dWFsbHkgcmVhZCBwYWdlcywgZXhlcmNpc2luZyB0 aGUgc3RyZWFtaW5nIHBhdGguCiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIlVQREFU RSBoZWFwX3Rlc3QgU0VUIGRhdGEgPSBkYXRhIHx8ICchJyBXSEVSRSBpZCAlIDUgPSAwOyIKICAg IAogICAgZHJvcF9jYWNoZXMgIiRST09UIgogICAgbG9jYWwgcmVzdWx0IG1zIHJlYWRzIHJlYWRf dGltZQogICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBPUlQiICJTRUxF Q1QgKiBGUk9NIHBnc3RhdHR1cGxlX2FwcHJveCgnaGVhcF90ZXN0Jyk7IikKICAgIElGUz0nLCcg cmVhZCAtciBtcyByZWFkcyByZWFkX3RpbWUgPDw8IiRyZXN1bHQiCiAgICBlY2hvICIkaSwkbXMs JHJlYWRzLCRyZWFkX3RpbWUiID4+ICIkT1VUIgogICAgbG9nICIke0xBQkVMfV9wZ3N0YXR0dXBs ZV8ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgaW9fdGltZT0ke3Jl YWRfdGltZX1tcykiCiAgZG9uZQp9Cgp0ZXN0X3Bnc3RhdGluZGV4KCkgewogIGxvY2FsIFJPT1Q9 IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBzZXR1cF9wZ3N0YXRpbmRleCAi JFJPT1QiICIkUE9SVCIgIiRTSVpFIgogIHByb2ZpbGVfc3FsICIkUk9PVCIgIiRQT1JUIiAiJHtM QUJFTH1fcGdzdGF0aW5kZXhfJHtTSVpFfSIgXAogICAgIlNFTEVDVCAqIEZST00gcGdzdGF0aW5k ZXgoJ2lkeF90ZXN0X3BrZXknKTsiCiAgYmVuY2htYXJrICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJF TH1fcGdzdGF0aW5kZXhfJHtTSVpFfSIgXAogICAgIlNFTEVDVCAqIEZST00gcGdzdGF0aW5kZXgo J2lkeF90ZXN0X3BrZXknKTsiCn0KCnRlc3RfZ2luX3ZhY3V1bSgpIHsKICBsb2NhbCBST09UPSIk MSIgUE9SVD0iJDIiIExBQkVMPSIkMyIgU0laRT0iJDQiCiAgbG9jYWwgT1VUPSIkUk9PVC9yZXN1 bHRzLyR7TEFCRUx9X2dpbl92YWN1dW1fJHtTSVpFfS5jc3YiCiAgbWtkaXIgLXAgIiRST09UL3Jl c3VsdHMiCiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRfdGltZV9tcyIgPiAiJE9VVCIKICAKICAj IFByb2ZpbGluZyBydW4gKHNlcGFyYXRlIGZyb20gbWVhc3VyZW1lbnQpCiAgaWYgW1sgJERPX1BS T0ZJTEUgLWVxIDEgXV07IHRoZW4KICAgIHNldHVwX2dpbiAiJFJPT1QiICIkUE9SVCIgIiRTSVpF IgogICAgcHJvZmlsZV9zcWwgIiRST09UIiAiJFBPUlQiICIke0xBQkVMfV9naW5fdmFjdXVtXyR7 U0laRX0iICJWQUNVVU0gQU5BTFlaRSBnaW5fdGVzdDsiCiAgZmkKICAKICBmb3IgKChpPTE7IGk8 PVJFUFM7IGkrKykpOyBkbwogICAgIyBGcmVzaCB0YWJsZSBlYWNoIHJ1biBmb3IgY29uc2lzdGVu dCBzdGF0ZQogICAgc2V0dXBfZ2luICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgICAKICAgIGRy b3BfY2FjaGVzICIkUk9PVCIKICAgIGxvY2FsIHJlc3VsdCBtcyByZWFkcyByZWFkX3RpbWUKICAg ICMgVkFDVVVNIEFOQUxZWkUgZm9yY2VzIGdpbnZhY3V1bWNsZWFudXAoKSB0byBydW4gYW5kIHNj YW4gYWxsIHBhZ2VzCiAgICByZXN1bHQ9JChydW5fdGltZWRfd2l0aF9pbyAiJFJPT1QiICIkUE9S VCIgIlZBQ1VVTSBBTkFMWVpFIGdpbl90ZXN0OyIpCiAgICBJRlM9JywnIHJlYWQgLXIgbXMgcmVh ZHMgcmVhZF90aW1lIDw8PCIkcmVzdWx0IgogICAgZWNobyAiJGksJG1zLCRyZWFkcywkcmVhZF90 aW1lIiA+PiAiJE9VVCIKICAgIGxvZyAiJHtMQUJFTH1fZ2luX3ZhY3V1bV8ke1NJWkV9IFskaS8k UkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgaW9fdGltZT0ke3JlYWRfdGltZX1tcykiCiAg ZG9uZQp9Cgp0ZXN0X2hhc2hfdmFjdXVtKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIg TEFCRUw9IiQzIiBTSVpFPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMvJHtMQUJFTH1f aGFzaF92YWN1dW1fJHtTSVpFfS5jc3YiCiAgbWtkaXIgLXAgIiRST09UL3Jlc3VsdHMiCiAgZWNo byAicnVuLG1zLHJlYWRzLHJlYWRfdGltZV9tcyIgPiAiJE9VVCIKICAKICAjIFByb2ZpbGluZyBy dW4gKHNlcGFyYXRlIGZyb20gbWVhc3VyZW1lbnQpCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEg XV07IHRoZW4KICAgIHNldHVwX2hhc2ggIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgIHBzcWxf cnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiREVMRVRFIEZST00gaGFzaF90ZXN0IFdIRVJFIGlkICUg MTAgPSAwOyIKICAgIHByb2ZpbGVfc3FsICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1faGFzaF92 YWN1dW1fJHtTSVpFfSIgIlZBQ1VVTSBoYXNoX3Rlc3Q7IgogIGZpCiAgCiAgZm9yICgoaT0xOyBp PD1SRVBTOyBpKyspKTsgZG8KICAgICMgRnJlc2ggdGFibGUgZWFjaCBydW4gZm9yIGNvbnNpc3Rl bnQgc3RhdGUKICAgIHNldHVwX2hhc2ggIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgICMgQ3Jl YXRlIDEwJSBkZWFkIHR1cGxlcwogICAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJERUxF VEUgRlJPTSBoYXNoX3Rlc3QgV0hFUkUgaWQgJSAxMCA9IDA7IgogICAgCiAgICBkcm9wX2NhY2hl cyAiJFJPT1QiCiAgICBsb2NhbCByZXN1bHQgbXMgcmVhZHMgcmVhZF90aW1lCiAgICByZXN1bHQ9 JChydW5fdGltZWRfd2l0aF9pbyAiJFJPT1QiICIkUE9SVCIgIlZBQ1VVTSBoYXNoX3Rlc3Q7IikK ICAgIElGUz0nLCcgcmVhZCAtciBtcyByZWFkcyByZWFkX3RpbWUgPDw8IiRyZXN1bHQiCiAgICBl Y2hvICIkaSwkbXMsJHJlYWRzLCRyZWFkX3RpbWUiID4+ICIkT1VUIgogICAgbG9nICIke0xBQkVM fV9oYXNoX3ZhY3V1bV8ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywg aW9fdGltZT0ke3JlYWRfdGltZX1tcykiCiAgZG9uZQp9Cgp0ZXN0X3dhbF9sb2dnaW5nKCkgewog IGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBsb2NhbCBP VVQ9IiRST09UL3Jlc3VsdHMvJHtMQUJFTH1fd2FsX2xvZ2dpbmdfJHtTSVpFfS5jc3YiCiAgbWtk aXIgLXAgIiRST09UL3Jlc3VsdHMiCiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRfdGltZV9tcyIg PiAiJE9VVCIKICAKICAjIEJ1aWxkIHRhYmxlIG9uY2UgLSBvbmx5IHJlYnVpbGQgaW5kZXggZWFj aCByZXAKICBzZXR1cF93YWwgIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAKICBsb2NhbCBXQUxf U1FMPSJDUkVBVEUgSU5ERVggd2FsX3Rlc3RfZ2luX2lkeCBPTiB3YWxfdGVzdCBVU0lORyBnaW4g KGRvY190c3YpOyIKICAKICBmb3IgKChpPTE7IGk8PVJFUFM7IGkrKykpOyBkbwogICAgIyBEcm9w IGluZGV4IGZyb20gcHJldmlvdXMgaXRlcmF0aW9uCiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9S VCIgLWMgIkRST1AgSU5ERVggSUYgRVhJU1RTIHdhbF90ZXN0X2dpbl9pZHg7IgogICAgCiAgICAj IFByb2ZpbGUgb24gZmlyc3QgcmVwIG9ubHkKICAgIFtbICIkaSIgLWVxIDEgXV0gJiYgcHJvZmls ZV9zcWwgIiRST09UIiAiJFBPUlQiICIke0xBQkVMfV93YWxfbG9nZ2luZ18ke1NJWkV9IiAiJFdB TF9TUUwiCiAgICAjIFJlLWRyb3AgYWZ0ZXIgcHJvZmlsaW5nIHJ1biBjcmVhdGVkIGl0CiAgICBb WyAiJGkiIC1lcSAxICYmICRET19QUk9GSUxFIC1lcSAxIF1dICYmIHBzcWxfcnVuICIkUk9PVCIg IiRQT1JUIiAtYyAiRFJPUCBJTkRFWCBJRiBFWElTVFMgd2FsX3Rlc3RfZ2luX2lkeDsiCiAgICAK ICAgICMgRHJvcCBPUyBjYWNoZXMgLSBpbmRleCBwYWdlcyBhcmUgQ09MRCBvbiBkaXNrCiAgICBk cm9wX2NhY2hlcyAiJFJPT1QiCiAgICAKICAgICMgQ1JFQVRFIElOREVYIG9uIEdJTiAodHN2ZWN0 b3Jfb3BzKToKICAgICMgLSBHSU4gYWx3YXlzIHVzZXMgdGhlIHNhbWUgYnVpbGQgcGF0aDogZ2lu YnVpbGQoKSBwb3B1bGF0ZXMgdGhlCiAgICAjICAgaW5kZXggaW4gbWVtb3J5LCBmbHVzaGVzIHRv IGRpc2ssIHRoZW4gY2FsbHMgbG9nX25ld3BhZ2VfcmFuZ2UoKQogICAgIyAgIHRvIHJlYWQgQUxM IGluZGV4IHBhZ2VzIGFuZCB3cml0ZSB0aGVtIHRvIFdBTCAoZ2luaW5zZXJ0LmM6Nzg1LTc5MCkK ICAgIGxvY2FsIHJlc3VsdCBtcyByZWFkcyByZWFkX3RpbWUKICAgIHJlc3VsdD0kKHJ1bl90aW1l ZF93aXRoX2lvICIkUk9PVCIgIiRQT1JUIiAiJFdBTF9TUUwiKQogICAgSUZTPScsJyByZWFkIC1y IG1zIHJlYWRzIHJlYWRfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVhZHMs JHJlYWRfdGltZSIgPj4gIiRPVVQiCiAgICBsb2cgIiR7TEFCRUx9X3dhbF9sb2dnaW5nXyR7U0la RX0gWyRpLyRSRVBTXTogJHttc31tcyAocmVhZHM9JHJlYWRzLCBpb190aW1lPSR7cmVhZF90aW1l fW1zKSIKICBkb25lCn0KCiMgLS0tIFJ1biB0ZXN0cyBmb3IgYSBidWlsZCAtLS0KcnVuX3Rlc3Rz KCkgewogIGxvY2FsIFJPT1Q9IiQxIiBMQUJFTD0iJDIiCiAgbG9jYWwgUE9SVAogIFBPUlQ9JChw aWNrX3BvcnQpCiAgCiAgbG9nICJbJExBQkVMXSBTdGFydGluZyBjbHVzdGVyIG9uIHBvcnQgJFBP UlQiCiAgaW5pdF9jbHVzdGVyICIkUk9PVCIgIiRQT1JUIgogIAogIHRyYXAgInN0b3BfY2x1c3Rl ciAnJFJPT1QnIiBFWElUCiAgCiAgZm9yIFNJWkUgaW4gJFNJWkVTOyBkbwogICAgY2FzZSAiJFRF U1QiIGluCiAgICAgIGJsb29tX3NjYW4pICAgdGVzdF9ibG9vbV9zY2FuICIkUk9PVCIgIiRQT1JU IiAiJExBQkVMIiAiJFNJWkUiIDs7CiAgICAgIGJsb29tX3ZhY3V1bSkgdGVzdF9ibG9vbV92YWN1 dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAgICAgcGdzdGF0dHVwbGUp ICB0ZXN0X3Bnc3RhdHR1cGxlICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiIDs7CiAg ICAgIHBnc3RhdGluZGV4KSAgdGVzdF9wZ3N0YXRpbmRleCAiJFJPT1QiICIkUE9SVCIgIiRMQUJF TCIgIiRTSVpFIiA7OwogICAgICBnaW5fdmFjdXVtKSAgIHRlc3RfZ2luX3ZhY3V1bSAiJFJPT1Qi ICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIiA7OwogICAgICBoYXNoX3ZhY3V1bSkgIHRlc3RfaGFz aF92YWN1dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAgICAgd2FsX2xv Z2dpbmcpICB0ZXN0X3dhbF9sb2dnaW5nICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUi IDs7CiAgICAgIGFsbCkKICAgICAgICB0ZXN0X2Jsb29tX3NjYW4gIiRST09UIiAiJFBPUlQiICIk TEFCRUwiICIkU0laRSIKICAgICAgICB0ZXN0X2Jsb29tX3ZhY3V1bSAiJFJPT1QiICIkUE9SVCIg IiRMQUJFTCIgIiRTSVpFIgogICAgICAgIHRlc3RfcGdzdGF0dHVwbGUgIiRST09UIiAiJFBPUlQi ICIkTEFCRUwiICIkU0laRSIKICAgICAgICB0ZXN0X3Bnc3RhdGluZGV4ICIkUk9PVCIgIiRQT1JU IiAiJExBQkVMIiAiJFNJWkUiCiAgICAgICAgdGVzdF9naW5fdmFjdXVtICIkUk9PVCIgIiRQT1JU IiAiJExBQkVMIiAiJFNJWkUiCiAgICAgICAgdGVzdF9oYXNoX3ZhY3V1bSAiJFJPT1QiICIkUE9S VCIgIiRMQUJFTCIgIiRTSVpFIgogICAgICAgIHRlc3Rfd2FsX2xvZ2dpbmcgIiRST09UIiAiJFBP UlQiICIkTEFCRUwiICIkU0laRSIKICAgICAgICA7OwogICAgICAqKSBkaWUgIlVua25vd24gdGVz dDogJFRFU1QiIDs7CiAgICBlc2FjCiAgZG9uZQogIAogIHN0b3BfY2x1c3RlciAiJFJPT1QiCiAg dHJhcCAtIEVYSVQKfQoKIyAtLS0gQ29tcGFyZSByZXN1bHRzIC0tLQpjb21wYXJlX3Jlc3VsdHMo KSB7CiAgbG9jYWwgYmFzZV9jc3Y9IiQxIiBwYXRjaF9jc3Y9IiQyIiBsYWJlbD0iJDMiCiAgCiAg W1sgISAtZiAiJGJhc2VfY3N2IiB8fCAhIC1mICIkcGF0Y2hfY3N2IiBdXSAmJiByZXR1cm4KICAK ICBsb2NhbCBiYXNlX21lZCBwYXRjaF9tZWQKICBiYXNlX21lZD0kKGNhbGNfbWVkaWFuICIkYmFz ZV9jc3YiKQogIHBhdGNoX21lZD0kKGNhbGNfbWVkaWFuICIkcGF0Y2hfY3N2IikKICAKICAjIEd1 YXJkIGFnYWluc3QgZW1wdHkgb3IgemVybyB2YWx1ZXMgdG8gcHJldmVudCBkaXZpc2lvbiBieSB6 ZXJvCiAgW1sgLXogIiRiYXNlX21lZCIgfHwgIiRiYXNlX21lZCIgPT0gIjAiIF1dICYmIGJhc2Vf bWVkPSIwLjAwMSIKICBbWyAteiAiJHBhdGNoX21lZCIgfHwgIiRwYXRjaF9tZWQiID09ICIwIiBd XSAmJiBwYXRjaF9tZWQ9IjAuMDAxIgogIAogIGxvY2FsIHNwZWVkdXAgcGN0CiAgc3BlZWR1cD0k KGF3ayAiQkVHSU4geyBwcmludGYgXCIlLjJmXCIsICRiYXNlX21lZCAvICRwYXRjaF9tZWQgfSIp CiAgcGN0PSQoYXdrICJCRUdJTiB7IHByaW50ZiBcIiUuMWZcIiwgKCRiYXNlX21lZCAtICRwYXRj aF9tZWQpIC8gJGJhc2VfbWVkICogMTAwIH0iKQogIAogIGxvY2FsIGlvX2luZm89IiIKICBpZiBo ZWFkIC0xICIkYmFzZV9jc3YiIHwgZ3JlcCAtcSAicmVhZHMiOyB0aGVuCiAgICAjIFN0YW5kYXJk IHRlc3Q6IGNvbHVtbnMgYXJlIHJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMKICAgIGxvY2FsIGJh c2VfcmVhZHMgcGF0Y2hfcmVhZHMgYmFzZV9pbyBwYXRjaF9pbwogICAgYmFzZV9yZWFkcz0kKGNh bGNfbWVkaWFuX2NvbCAiJGJhc2VfY3N2IiAzKQogICAgcGF0Y2hfcmVhZHM9JChjYWxjX21lZGlh bl9jb2wgIiRwYXRjaF9jc3YiIDMpCiAgICBiYXNlX2lvPSQoY2FsY19tZWRpYW5fY29sICIkYmFz ZV9jc3YiIDQpCiAgICBwYXRjaF9pbz0kKGNhbGNfbWVkaWFuX2NvbCAiJHBhdGNoX2NzdiIgNCkK ICAgICMgRGVmYXVsdCB0byAwIGlmIGVtcHR5CiAgICBbWyAteiAiJGJhc2VfcmVhZHMiIF1dICYm IGJhc2VfcmVhZHM9MAogICAgW1sgLXogIiRwYXRjaF9yZWFkcyIgXV0gJiYgcGF0Y2hfcmVhZHM9 MAogICAgW1sgLXogIiRiYXNlX2lvIiBdXSAmJiBiYXNlX2lvPTAKICAgIFtbIC16ICIkcGF0Y2hf aW8iIF1dICYmIHBhdGNoX2lvPTAKICAgIGlvX2luZm89IiAgKHJlYWRzPSR7YmFzZV9yZWFkc33i hpIke3BhdGNoX3JlYWRzfSwgaW9fdGltZT0ke2Jhc2VfaW994oaSJHtwYXRjaF9pb31tcykiCiAg ZmkKICAKICBwcmludGYgIiUtMjZzIGJhc2U9JTguMWZtcyAgcGF0Y2g9JTguMWZtcyAgJTUuMmZ4 ICAoJTUuMWYlJSklc1xuIiBcCiAgICAiJGxhYmVsIiAiJGJhc2VfbWVkIiAiJHBhdGNoX21lZCIg IiRzcGVlZHVwIiAiJHBjdCIgIiRpb19pbmZvIgp9CgpwcmludF9zdW1tYXJ5KCkgewogIGVjaG8g IiIKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAg ZWNobyAiICAgICAgICAgICAgICAgICAgICAgU1RSRUFNSU5HIFJFQUQgQkVOQ0hNQVJLIFJFU1VM VFMgICAgICAgICAgICAgICAgICAgIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICIiCiAgCiAgaWYgW1sgJEJBU0VMSU5FIC1lcSAxIF1d OyB0aGVuCiAgICBwcmludGYgIiUtMjZzICUtMTdzICUtMTdzICUtN3MgJS03cyAlc1xuIiAiVEVT VCIgIkJBU0VMSU5FIiAiUEFUQ0hFRCIgIlNQRUVEVVAiICJDSEFOR0UiICJJL08gVElNRSIKICAg IGVjaG8gIuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgCIKICAgIAogICAgZm9yIFNJWkUgaW4gJFNJWkVTOyBkbwogICAgICBmb3Ig dGVzdF9uYW1lIGluIGJsb29tX3NjYW4gYmxvb21fdmFjdXVtIHBnc3RhdHR1cGxlIHBnc3RhdGlu ZGV4IGdpbl92YWN1dW0gaGFzaF92YWN1dW0gd2FsX2xvZ2dpbmc7IGRvCiAgICAgICAgW1sgIiRU RVNUIiAhPSAiYWxsIiAmJiAiJFRFU1QiICE9ICIkdGVzdF9uYW1lIiBdXSAmJiBjb250aW51ZQog ICAgICAgIGNvbXBhcmVfcmVzdWx0cyBcCiAgICAgICAgICAiJFJPT1RfQkFTRS9yZXN1bHRzL2Jh c2VfJHt0ZXN0X25hbWV9XyR7U0laRX0uY3N2IiBcCiAgICAgICAgICAiJFJPT1RfUEFUQ0gvcmVz dWx0cy9wYXRjaGVkXyR7dGVzdF9uYW1lfV8ke1NJWkV9LmNzdiIgXAogICAgICAgICAgIiR7dGVz dF9uYW1lfV8ke1NJWkV9IgogICAgICBkb25lCiAgICBkb25lCiAgZWxzZQogICAgZWNobyAiUmVz dWx0cyAocGF0Y2hlZCBvbmx5KToiCiAgICBlY2hvICIiCiAgICBmb3IgZiBpbiAiJFJPT1RfUEFU Q0gvcmVzdWx0cy8iKi5jc3Y7IGRvCiAgICAgIFtbIC1mICIkZiIgXV0gfHwgY29udGludWUKICAg ICAgcHJpbnRmICIlLTQwcyAlc1xuIiAiJChiYXNlbmFtZSAiJGYiIC5jc3YpOiIgIiQoY2FsY19z dGF0cyAiJGYiKSIKICAgIGRvbmUKICBmaQogIAogIGVjaG8gIiIKICBlY2hvICLilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAiQ1NWIGZpbGVzOiAkUk9P VF9QQVRDSC9yZXN1bHRzLyIKICBbWyAkQkFTRUxJTkUgLWVxIDEgXV0gJiYgZWNobyAiQmFzZWxp bmU6ICAkUk9PVF9CQVNFL3Jlc3VsdHMvIgogIAogICMgTGlzdCBnZW5lcmF0ZWQgZmxhbWVncmFw aHMKICBpZiBbWyAkRE9fUFJPRklMRSAtZXEgMSBdXTsgdGhlbgogICAgbG9jYWwgc3Zncz0oKQog ICAgZm9yIGRpciBpbiAiJFJPT1RfQkFTRS9wcm9maWxlIiAiJFJPT1RfUEFUQ0gvcHJvZmlsZSI7 IGRvCiAgICAgIFtbIC1kICIkZGlyIiBdXSB8fCBjb250aW51ZQogICAgICBmb3Igc3ZnIGluICIk ZGlyIi8qLnN2ZzsgZG8KICAgICAgICBbWyAtZiAiJHN2ZyIgXV0gJiYgc3Zncys9KCIkc3ZnIikK ICAgICAgZG9uZQogICAgZG9uZQogICAgaWYgW1sgJHsjc3Znc1tAXX0gLWd0IDAgXV07IHRoZW4K ICAgICAgZWNobyAiIgogICAgICBlY2hvICJGbGFtZWdyYXBoczoiCiAgICAgIGZvciBzdmcgaW4g IiR7c3Znc1tAXX0iOyBkbyBlY2hvICIgICRzdmciOyBkb25lCiAgICBmaQogIGZpCiAgCiAgZWNo byAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgp9CgojIC0tLSBN YWluIC0tLQptYWluKCkgewogIGxvZyAiU3RyZWFtaW5nIFJlYWQgQmVuY2htYXJrIgogIGxvZyAi UGF0Y2g6ICRQQVRDSCIKICBsb2cgIlRlc3RzOiAkVEVTVCIKICBsb2cgIlNpemVzOiAkU0laRVMi CiAgbG9nICJSZXBzOiAgJFJFUFMiCiAgbG9nICJJL086ICAgJElPX01FVEhPRCAod29ya2Vycz0k SU9fV09SS0VSUywgY29uY3VycmVuY3k9JElPX01BWF9DT05DVVJSRU5DWSkiCiAgW1sgJERPX1BS T0ZJTEUgLWVxIDEgXV0gJiYgbG9nICJQcm9maWxlOiBlbmFibGVkIChmbGFtZWdyYXBocyDihpIg PHJvb3Q+L3Byb2ZpbGUvKSIKICAKICAjIEJ1aWxkCiAgaWYgW1sgJEJBU0VMSU5FIC1lcSAxIF1d OyB0aGVuCiAgICBidWlsZF9wZyAiJFJPT1RfQkFTRSIgIiIKICBmaQogIGJ1aWxkX3BnICIkUk9P VF9QQVRDSCIgIiRQQVRDSCIKICAKICAjIFJ1biB0ZXN0cwogIGlmIFtbICRCQVNFTElORSAtZXEg MSBdXTsgdGhlbgogICAgbG9nICJSdW5uaW5nIGJhc2VsaW5lIHRlc3RzIgogICAgcnVuX3Rlc3Rz ICIkUk9PVF9CQVNFIiAiYmFzZSIKICBmaQogIAogIGxvZyAiUnVubmluZyBwYXRjaGVkIHRlc3Rz IgogIHJ1bl90ZXN0cyAiJFJPT1RfUEFUQ0giICJwYXRjaGVkIgogIAogICMgU3VtbWFyeQogIHBy aW50X3N1bW1hcnkKfQoKbWFpbgo= --00000000000066bb91064cab6d50--