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 1vnqZI-00CT9C-2q for pgsql-hackers@arkaria.postgresql.org; Thu, 05 Feb 2026 04:02:13 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vnqZG-00EsU4-2a for pgsql-hackers@arkaria.postgresql.org; Thu, 05 Feb 2026 04:02:10 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vnqZG-00EsTv-0j for pgsql-hackers@lists.postgresql.org; Thu, 05 Feb 2026 04:02:10 +0000 Received: from mail-ed1-x52c.google.com ([2a00:1450:4864:20::52c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vnqZD-00000000cjj-1Fc4 for pgsql-hackers@lists.postgresql.org; Thu, 05 Feb 2026 04:02:09 +0000 Received: by mail-ed1-x52c.google.com with SMTP id 4fb4d7f45d1cf-65941c07e8dso811658a12.1 for ; Wed, 04 Feb 2026 20:02:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770264124; cv=none; d=google.com; s=arc-20240605; b=A/ISoUcfpFxCZiGooVDwIl5Vt1yI6ronZkX1IqSNQEKQ/96qC3ws8Phzx6lp7sjbXO Ogmj70Q6WcvtL6vTYgiE6bOLa9hmzCsgKEQfh+NuAjZxzGycogCriGkmQw5NATKn3MDk KRb+VPZXG2rgMGBEQNXGSDYG9e3JfrO/3qvTeFaE6Gl62q9K/+mt3/AR2mPwPi1MoCzu mRpSvHTEtReqT2rT5QHdSXksQ/pOIgqwvIjP8EsICjMkxqJJUjqpw6O2Iz4JP5je8ypK Ux4iKgJzpVX2gRNKOR1XBgadP0fDWomaV/XnelTpmqAlOK/7nL0APm2hI8Vh/JWe/PtM C/pg== 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=z9AGw8OCsigFKmIWu+Fzifes4OwuZTx0iliw1bG03Hs=; fh=PCElDQIIAdSsae8xvLaGuY4STS5z8jMO38KG/bNjtro=; b=go9AdSuCYiDUsYffA7wgkCaYEV6JexpTO7jqllR7dPKSlWwRor5knNuoEKtGKEfJis XPWohkNq2UpgdMOpb1LfDuuILQZTaguvLAepT64Z3ERuNovo3qPiVz8KpbQA+a22LP7B T6oG6E9D/UmvDJBVOOFZoB/tnJhcGDRKksoMt0kgb89DnJPBkAXS3fPx9O4Scz6g8jZW lpLZukhuV74lkEjpvXdB2ayO3+QoWTiDsgkqVIMjvywNBGsmRX55964fdBU/r//r7KUz tqQcbmqE/tOn3ICmtpUhxTuhyNsquRnzhCtMUTBW1A0E+WzQoJlso+4Qb6OcbYZywtKy 8sxA==; 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=1770264124; x=1770868924; 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=z9AGw8OCsigFKmIWu+Fzifes4OwuZTx0iliw1bG03Hs=; b=mvADMue4CmHbjgFjRghHRqdDPmbACYwlvOWg/kYCPW/M8x76tPGK/KmIikPJYmHtEg vZXX5LwNYLeGt6pc6q68y2ChxmtmbIH2mKm1wAVFMgX4XT1fAn+zQpSMEKsTdka2RxM3 nRcaRZA9Xked0NDFtWwrSftMex+KYqKUZbMEpu/8v7gsT1hp/7JFddsaeEWTRDv1Tn8h V/06lxJEDtlX4DhOB0yDV2EQrR+Cygy9yLwZ4uCORdij20wklRJS2oFtdtZ2j18/2o5V OeyJUKBQBTfi5bzECBc2AxFK8UpsroQ1SwdS2TGSEcmmrNsxLlT9uRg/CFbDeAQ2AT4j nw3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770264124; x=1770868924; 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=z9AGw8OCsigFKmIWu+Fzifes4OwuZTx0iliw1bG03Hs=; b=dzSC0ndFzvll4VG94rZzJc0G+smg9einSloTgVnjKvAmMmau8CJg/dFG0mg6nqxLze E9nrsEt/NpuwodDr0SYuNQPZ1ANNzUW9lFTsw9H10Eqj9AONRNPeYgnS/m805RXsGtpY Km/Bw1GE7LaYFMiOYPyP2G+4Ili4n9GxnYZfW85Z7BtY8Mc3vCQEKN5nmfccFa+KQk1I mUdbma70T2VXfWrsa49O1LsyGKbu/GcgaMJm+SLF+xAyns31YL1af/hbnvVPPIOgBPuE Id7WvWuiMe4iw4OgED2IX7V+VLTva4I9ipXDiNRNLGB5K0S9P7eztpmy9204j+vzj8EX H+ug== X-Gm-Message-State: AOJu0YykH8900BXUT5VIPQRYbEyYsfo7pyukDnNYGO2Xn4l3DlszxXmp tnUM6cWZ8MSg9VZslLRMIgt04ZsgRyjfJQzPSUp+/yC0K7OtsQHW/q/rXS2iNe+cuLG969qyXma FGZQ1KYyTMXEZmhgY2/75TxR2ESuEFGSZ+WsexDJbCQ== X-Gm-Gg: AZuq6aKNrowmTF2zd7DBjcISE9/YIZ3tuuIV1UY3f+2lHgZagJFx8SxjO4wnHM41ziA 5Ztove8Pa4wMl/pmMPFyScyx7Iuv+ojXAGWdrVLbtDTM4rIFCWdLIq2cdlIeDs+CHZKzi02d82y r8nMQniHxTV1qTsr25uKsho6/jzfG4Qlf2CrFuoXCVAdK2SW3iBKIhR0DlokwRiDYKBKcwfT3N8 /rNOzmXw3N7kdUtidDkcZcAQHO2slBsUxl412UVBhvEAOPckiLU/gX75TqP4T4MsJPePVWo5DTd M80QukmA4BWn6U4BFsUDE2W6gh3PufimV74OzCwSB1BaHsrxWX+9jI5J2/bbA52jDvVOlXw= X-Received: by 2002:a05:6402:518a:b0:659:4005:2935 with SMTP id 4fb4d7f45d1cf-65949fd4d01mr3515747a12.16.1770264124231; Wed, 04 Feb 2026 20:02:04 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Xuneng Zhou Date: Thu, 5 Feb 2026 12:01:52 +0800 X-Gm-Features: AZwV_Qgt2FQsh_Gq6z41g_zfq-SqwVoBzkTOo_9fuXZ-peOwCKniDsKU3Z9Cz4s Message-ID: Subject: Re: Streamify more code paths To: Nazir Bilal Yavuz Cc: pgsql-hackers Content-Type: multipart/mixed; boundary="00000000000048c8b1064a0bbcfa" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000048c8b1064a0bbcfa Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, On Tue, Dec 30, 2025 at 10:43=E2=80=AFAM Xuneng Zhou = wrote: > > Hi, > > On Tue, Dec 30, 2025 at 9:51=E2=80=AFAM Xuneng Zhou wrote: > > > > Hi, > > > > Thanks for looking into this. > > > > On Mon, Dec 29, 2025 at 6:58=E2=80=AFPM Nazir Bilal Yavuz wrote: > > > > > > Hi, > > > > > > On Sun, 28 Dec 2025 at 14:46, Xuneng Zhou wrot= e: > > > > > > > > Hi, > > > > > > > > > > Two more to go: > > > > > patch 5: Streamify log_newpage_range() WAL logging path > > > > > patch 6: Streamify hash index VACUUM primary bucket page reads > > > > > > > > > > Benchmarks will be conducted soon. > > > > > > > > > > > > > v6 in the last message has a problem and has not been updated. Atta= ch > > > > the right one again. Sorry for the noise. > > > > > > 0003 and 0006: > > > > > > You need to add 'StatApproxReadStreamPrivate' and > > > 'HashBulkDeleteStreamPrivate' to the typedefs.list. > > > > Done. > > > > > 0005: > > > > > > @@ -1321,8 +1341,10 @@ log_newpage_range(Relation rel, ForkNumber for= knum, > > > nbufs =3D 0; > > > while (nbufs < XLR_MAX_BLOCK_ID && blkno < endblk) > > > { > > > - Buffer buf =3D ReadBufferExtended(rel, forknum, b= lkno, > > > - RBM_NORMAL, NULL); > > > + Buffer buf =3D read_stream_next_buffer(stream, NU= LL); > > > + > > > + if (!BufferIsValid(buf)) > > > + break; > > > > > > We are loosening a check here, there should not be a invalid buffer i= n > > > the stream until the endblk. I think you can remove this > > > BufferIsValid() check, then we can learn if something goes wrong. > > > > My concern before for not adding assert at the end of streaming is the > > potential early break in here: > > > > /* Nothing more to do if all remaining blocks were empty. */ > > if (nbufs =3D=3D 0) > > break; > > > > After looking more closely, it turns out to be a misunderstanding of th= e logic. > > > > > 0006: > > > > > > You can use read_stream_reset() instead of read_stream_end(), then yo= u > > > can use the same stream with different variables, I believe this is > > > the preferred way. > > > > > > Rest LGTM! > > > > > > > Yeah, reset seems a more proper way here. > > > > Run pgindent using the updated typedefs.list. > I've completed benchmarking of the v4 streaming read patches across three I/O methods (io_uring, sync, worker). Tests were run with cold cache on large datasets. --- Settings --- shared_buffers =3D '8GB' effective_io_concurrency =3D 200 io_method =3D $IO_METHOD io_workers =3D $IO_WORKERS io_max_concurrency =3D $IO_MAX_CONCURRENCY track_io_timing =3D on autovacuum =3D off checkpoint_timeout =3D 1h max_wal_size =3D 10GB max_parallel_workers_per_gather =3D 0 --- Machine --- CPU: 48-core RAM: 256 GB DDR5 Disk: 2 x 1.92 TB NVMe SSD --- Executive Summary --- The patches provide significant benefits for I/O-bound sequential operations, with the greatest improvements seen when using asynchronous I/O methods (io_uring and worker). The synchronous I/O mode shows reduced but still meaningful gains. --- Results by I/O Method Best Results: io_method=3Dworker bloom_scan: 4.14x (75.9% faster); 93% fewer reads pgstattuple: 1.59x (37.1% faster); 94% fewer reads hash_vacuum: 1.05x (4.4% faster); 80% fewer reads gin_vacuum: 1.06x (5.6% faster); 15% fewer reads bloom_vacuum: 1.04x (3.9% faster); 76% fewer reads wal_logging: 0.98x (-2.5%, neutral/slightly slower); no change in reads io_method=3Dio_uring bloom_scan: 3.12x (68.0% faster); 93% fewer reads pgstattuple: 1.50x (33.2% faster); 94% fewer reads hash_vacuum: 1.03x (3.3% faster); 80% fewer reads gin_vacuum: 1.02x (2.1% faster); 15% fewer reads bloom_vacuum: 1.03x (3.4% faster); 76% fewer reads wal_logging: 1.00x (-0.5%, neutral); no change in reads io_method=3Dsync (baseline comparison) bloom_scan: 1.20x (16.4% faster); 93% fewer reads pgstattuple: 1.10x (9.0% faster); 94% fewer reads hash_vacuum: 1.01x (0.8% faster); 80% fewer reads gin_vacuum: 1.02x (1.7% faster); 15% fewer reads bloom_vacuum: 1.03x (2.8% faster); 76% fewer reads wal_logging: 0.99x (-0.7%, neutral); no change in reads --- Observations --- Async I/O amplifies streaming benefits: The same patches show 3-4x improvement with worker/io_uring vs 1.2x with sync. I/O operation reduction is consistent: All modes show the same ~93-94% reduction in I/O operations for bloom_scan and pgstattuple. VACUUM operations show modest gains: Despite large I/O reductions (76-80%), wall-clock improvements are smaller (3-15%) since VACUUM has larger CPU overhead (tuple processing, index maintenance, WAL logging). log_newpage_range shows no benefit: The patch provides no improvement (~0.9= 7x). -- Best, Xuneng --00000000000048c8b1064a0bbcfa Content-Type: text/x-sh; charset="UTF-8"; name="run_streaming_benchmark.sh" Content-Disposition: attachment; filename="run_streaming_benchmark.sh" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ml8xicy80 IyEvdXNyL2Jpbi9lbnYgYmFzaApzZXQgLWV1byBwaXBlZmFpbAoKIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIwojIFN0cmVhbWluZyBSZWFkIFBhdGNoZXMgQmVuY2htYXJrCiMKIyBVc2FnZTogLi9ydW5f c3RyZWFtaW5nX2JlbmNoLnNoIFtPUFRJT05TXSA8cGF0Y2g+CiMKIyBPcHRpb25zOgojICAgLS1j bGVhbiAgICAgICAgICAgUmVtb3ZlIGV4aXN0aW5nIGJ1aWxkcyBhbmQgc3RhcnQgZnJlc2gKIyAg IC0tYmFzZWxpbmUgICAgICAgIEFsc28gYnVpbGQgYW5kIHRlc3QgdmFuaWxsYSBQb3N0Z3JlU1FM IGZvciBjb21wYXJpc29uCiMgICAtLXRlc3QgVEVTVCAgICAgICBSdW4gc3BlY2lmaWMgdGVzdCAo Ymxvb21fc2NhbiwgYmxvb21fdmFjdXVtLCBwZ3N0YXR0dXBsZSwKIyAgICAgICAgICAgICAgICAg ICAgIGdpbl92YWN1dW0sIHdhbF9sb2dnaW5nLCBoYXNoX3ZhY3V1bSwgb3IgImFsbCIpCiMgICAt LWlvLW1ldGhvZCBNT0RFICBJL08gbWV0aG9kOiBpb191cmluZywgd29ya2VyLCBvciBzeW5jIChk ZWZhdWx0OiBpb191cmluZykKIyAgIC0taW8td29ya2VycyBOICAgIE51bWJlciBvZiBJL08gd29y a2VycyBmb3Igd29ya2VyIG1vZGUgKGRlZmF1bHQ6IDMpCiMgICAtLWlvLWNvbmN1cnJlbmN5IE4g IE1heCBjb25jdXJyZW50IEkvT3MgcGVyIHByb2Nlc3MgKGRlZmF1bHQ6IDY0KQojCiMgRW52aXJv bm1lbnQ6CiMgICBXT1JLUk9PVCAgICAgQmFzZSBkaXJlY3RvcnkgKGRlZmF1bHQ6ICRIT01FL3Bn X2JlbmNoKQojICAgUkVQUyAgICAgICAgIFJlcGV0aXRpb25zIHBlciB0ZXN0IChkZWZhdWx0OiA1 KQojICAgU0laRVMgICAgICAgIFRhYmxlIHNpemVzIHRvIHRlc3QgKGRlZmF1bHQ6ICJsYXJnZSIp CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmxvZygpIHsgcHJpbnRmICdcMDMzWzE7MzRtPT0+XDAz M1swbSAlc1xuJyAiJCoiOyB9CmRpZSgpIHsgcHJpbnRmICdcMDMzWzE7MzFtRVJST1I6XDAzM1sw bSAlc1xuJyAiJCoiID4mMjsgZXhpdCAxOyB9CgojIC0tLSBDTEkgcGFyc2luZyAtLS0KQ0xFQU49 MApCQVNFTElORT0wClRFU1Q9ImFsbCIKSU9fTUVUSE9EPSIke0lPX01FVEhPRDotaW9fdXJpbmd9 IgpJT19XT1JLRVJTPSIke0lPX1dPUktFUlM6LTN9IgpJT19NQVhfQ09OQ1VSUkVOQ1k9IiR7SU9f TUFYX0NPTkNVUlJFTkNZOi02NH0iClBBVENIPSIiCgp3aGlsZSBbWyAkIyAtZ3QgMCBdXTsgZG8K ICBjYXNlICIkMSIgaW4KICAgIC0tY2xlYW4pICAgICAgICAgIENMRUFOPTEgOzsKICAgIC0tYmFz ZWxpbmUpICAgICAgIEJBU0VMSU5FPTEgOzsKICAgIC0tdGVzdCkgICAgICAgICAgIFRFU1Q9IiQy Ijsgc2hpZnQgOzsKICAgIC0taW8tbWV0aG9kKSAgICAgIElPX01FVEhPRD0iJDIiOyBzaGlmdCA7 OwogICAgLS1pby13b3JrZXJzKSAgICAgSU9fV09SS0VSUz0iJDIiOyBzaGlmdCA7OwogICAgLS1p by1jb25jdXJyZW5jeSkgSU9fTUFYX0NPTkNVUlJFTkNZPSIkMiI7IHNoaWZ0IDs7CiAgICAtaHwt LWhlbHApICAgICAgICBzZWQgLW4gJzMsMThwJyAiJDAiIHwgc2VkICdzL14jIFw/Ly8nOyBleGl0 IDAgOzsKICAgIC0qKSAgICAgICAgICAgICAgIGRpZSAiVW5rbm93biBvcHRpb246ICQxIiA7Owog ICAgKikgICAgICAgICAgICAgICAgUEFUQ0g9IiQxIiA7OwogIGVzYWMKICBzaGlmdApkb25lCgoj IFZhbGlkYXRlIGlvX21ldGhvZApjYXNlICIkSU9fTUVUSE9EIiBpbgogIGlvX3VyaW5nfHdvcmtl cnxzeW5jKSA7OwogICopIGRpZSAiSW52YWxpZCAtLWlvLW1ldGhvZDogJElPX01FVEhPRCAobXVz dCBiZSBpb191cmluZywgd29ya2VyLCBvciBzeW5jKSIgOzsKZXNhYwoKW1sgLXogIiRQQVRDSCIg XV0gJiYgZGllICJVc2FnZTogJDAgWy0tY2xlYW5dIFstLWJhc2VsaW5lXSBbLS10ZXN0IFRFU1Rd IDxwYXRjaD4iCltbICEgLWYgIiRQQVRDSCIgXV0gJiYgZGllICJQYXRjaCBub3QgZm91bmQ6ICRQ QVRDSCIKW1sgIiRQQVRDSCIgIT0gLyogXV0gJiYgUEFUQ0g9IiRQV0QvJFBBVENIIgoKIyAtLS0g Q29uZmlndXJhdGlvbiAtLS0KV09SS1JPT1Q9IiR7V09SS1JPT1Q6LSRIT01FL3BnX2JlbmNofSIK UkVQUz0iJHtSRVBTOi01fSIKU0laRVM9IiR7U0laRVM6LWxhcmdlfSIKClJPT1RfQkFTRT0iJFdP UktST09UL3ZhbmlsbGEiClJPT1RfUEFUQ0g9IiRXT1JLUk9PVC9wYXRjaGVkIgoKIyAtLS0gSGVs cGVycyAtLS0KcGcoKSB7IGVjaG8gIiQxL3BnL2Jpbi8kMiI7IH0KCnBpY2tfcG9ydCgpIHsKICBm b3IgcCBpbiAkKHNlcSAiJHsxOi01NDMyfSIgNjAwMDApOyBkbwogICAgbHNvZiAtaVRDUDoiJHAi IC1zVENQOkxJU1RFTiA+L2Rldi9udWxsIDI+JjEgfHwgeyBlY2hvICIkcCI7IHJldHVybjsgfQog IGRvbmUKICBkaWUgIk5vIGZyZWUgcG9ydCBmb3VuZCIKfQoKIyAtLS0gQnVpbGQgUG9zdGdyZVNR TCAtLS0KYnVpbGRfcGcoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBBVENIX0ZJTEU9IiR7MjotfSIK ICAKICBbWyAkQ0xFQU4gLWVxIDEgXV0gJiYgcm0gLXJmICIkUk9PVCIKICAKICBpZiBbWyAteCAi JChwZyAiJFJPT1QiIGluaXRkYikiIF1dOyB0aGVuCiAgICBsb2cgIlJldXNpbmcgYnVpbGQ6ICRS T09UIgogICAgcmV0dXJuCiAgZmkKICAKICBsb2cgIkJ1aWxkaW5nIFBvc3RncmVTUUw6ICRST09U IgogIG1rZGlyIC1wICIkUk9PVCIKICAKICBnaXQgY2xvbmUgLS1kZXB0aCAxIGh0dHBzOi8vZ2l0 aHViLmNvbS9wb3N0Z3Jlcy9wb3N0Z3JlcyAiJFJPT1Qvc3JjIiAyPi9kZXYvbnVsbAogIGNkICIk Uk9PVC9zcmMiCiAgCiAgW1sgLW4gIiRQQVRDSF9GSUxFIiBdXSAmJiB7IGxvZyAiQXBwbHlpbmcg cGF0Y2giOyBnaXQgYXBwbHkgIiRQQVRDSF9GSUxFIjsgfQogIAogIC4vY29uZmlndXJlIC0tcHJl Zml4PSIkUk9PVC9wZyIgLS13aXRoLWxpYnVyaW5nIFwKICAgIENGTEFHUz0nLU8yIC1nZ2RiMyAt Zm5vLW9taXQtZnJhbWUtcG9pbnRlcicgPi9kZXYvbnVsbCAyPiYxCiAgCiAgbWFrZSAtaiIkKG5w cm9jKSIgaW5zdGFsbCA+L2Rldi9udWxsIDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvYmxvb20gaW5z dGFsbCA+L2Rldi9udWxsIDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvcGdzdGF0dHVwbGUgaW5zdGFs bCA+L2Rldi9udWxsIDI+JjEKfQoKIyAtLS0gQ2x1c3RlciBtYW5hZ2VtZW50IC0tLQppbml0X2Ns dXN0ZXIoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIgogIAogIHJtIC1yZiAiJFJPT1Qv ZGF0YSIKICAiJChwZyAiJFJPT1QiIGluaXRkYikiIC1EICIkUk9PVC9kYXRhIiAtLW5vLWxvY2Fs ZSA+L2Rldi9udWxsIDI+JjEKICAKICBjYXQgPj4gIiRST09UL2RhdGEvcG9zdGdyZXNxbC5jb25m IiA8PEVPRgpwb3J0ID0gJFBPUlQKbGlzdGVuX2FkZHJlc3NlcyA9ICcxMjcuMC4wLjEnCnNoYXJl ZF9idWZmZXJzID0gJzhHQicKZWZmZWN0aXZlX2lvX2NvbmN1cnJlbmN5ID0gMjAwCmlvX21ldGhv ZCA9ICRJT19NRVRIT0QKaW9fd29ya2VycyA9ICRJT19XT1JLRVJTCmlvX21heF9jb25jdXJyZW5j eSA9ICRJT19NQVhfQ09OQ1VSUkVOQ1kKdHJhY2tfaW9fdGltaW5nID0gb24KYXV0b3ZhY3V1bSA9 IG9mZgpjaGVja3BvaW50X3RpbWVvdXQgPSAxaAptYXhfd2FsX3NpemUgPSAxMEdCCm1heF9wYXJh bGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAwCkVPRgogIAogICIkKHBnICIkUk9PVCIgcGdfY3Rs KSIgLUQgIiRST09UL2RhdGEiIC1sICIkUk9PVC9zZXJ2ZXIubG9nIiBzdGFydCAtdyA+L2Rldi9u dWxsCn0KCnN0b3BfY2x1c3RlcigpIHsKICBsb2NhbCBST09UPSIkMSIKICAiJChwZyAiJFJPT1Qi IHBnX2N0bCkiIC1EICIkUk9PVC9kYXRhIiBzdG9wIC1tIGZhc3QgMj4vZGV2L251bGwgfHwgdHJ1 ZQp9Cgpkcm9wX2NhY2hlcygpIHsKICBsb2NhbCBST09UPSIkMSIKICBzdG9wX2NsdXN0ZXIgIiRS T09UIgogIHN5bmMKICBlY2hvIDMgfCBzdWRvIHRlZSAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMg Pi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBzbGVlcCAyCiAgIiQocGcgIiRST09UIiBwZ19jdGwp IiAtRCAiJFJPT1QvZGF0YSIgLWwgIiRST09UL3NlcnZlci5sb2ciIHN0YXJ0IC13ID4vZGV2L251 bGwKfQoKcHNxbF9ydW4oKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIgogIHNoaWZ0IDIK ICAiJChwZyAiJFJPT1QiIHBzcWwpIiAtaCAxMjcuMC4wLjEgLXAgIiRQT1JUIiAtZCBwb3N0Z3Jl cyAtdiBPTl9FUlJPUl9TVE9QPTEgLUF0cSAiJEAiCn0KCiMgLS0tIFRpbWluZyAtLS0KcnVuX3Rp bWVkKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU1FMPSIkMyIKICBsb2NhbCBtcwog ICMgLVg6IGlnbm9yZSAucHNxbHJjLCAtdiBPTl9FUlJPUl9TVE9QPTE6IGZhaWwgb24gU1FMIGVy cm9ycwogICMgUGFyc2UgbGFzdCBUaW1lOiBsaW5lLCBoYW5kbGUgYm90aCAibXMiIGFuZCAicyIg dW5pdHMKICBtcz0kKCIkKHBnICIkUk9PVCIgcHNxbCkiIC1oIDEyNy4wLjAuMSAtcCAiJFBPUlQi IC1kIHBvc3RncmVzIC1YIC12IE9OX0VSUk9SX1NUT1A9MSAtQXQgXAogICAgLWMgJ1x0aW1pbmcg b24nIC1jICIkU1FMIiAyPiYxIHwgXAogICAgYXdrICcKICAgICAgL1RpbWU6LyB7CiAgICAgICAg dmFsPSQyOyB1bml0PSQzOwogICAgICAgIGlmICh1bml0PT0ibXMiKSBtcz12YWw7CiAgICAgICAg ZWxzZSBpZiAodW5pdD09InMiKSBtcz12YWwqMTAwMDsKICAgICAgfQogICAgICBFTkQgeyBpZiAo bXM9PSIiKSBleGl0IDE7IHByaW50ZiAiJS4zZlxuIiwgbXM7IH0KICAgICcpCiAgIyBWYWxpZGF0 ZSBudW1lcmljIG91dHB1dAogIFtbICIkbXMiID1+IF5bMC05XSsoXC5bMC05XSspPyQgXV0gfHwg eyBlY2hvICJFUlJPUjogTm9uLW51bWVyaWMgdGltaW5nOiAkbXMiID4mMjsgcmV0dXJuIDE7IH0K ICBlY2hvICIkbXMiCn0KCiMgLS0tIEkvTyBTdGF0cyAtLS0KIyBSdW4gU1FMIGFuZCBjYXB0dXJl IHRpbWluZyArIEkvTyBzdGF0cyBmcm9tIHBnX3N0YXRfaW8KIyBSZXNldHMgc3RhdHMgYmVmb3Jl IHF1ZXJ5LCB3YWl0cyBmb3IgZmx1c2gsIHRoZW4gcmVhZHMgYWJzb2x1dGUgdmFsdWVzCiMgTm90 ZTogcGdfc3RhdF9pbyBoYXMgUEdTVEFUX01JTl9JTlRFUlZBTD0xMDAwbXMgZmx1c2ggZGVsYXks IHNvIHdlIHdhaXQgMS41cwojICAgICAgIGFmdGVyIHRoZSBxdWVyeSB0byBlbnN1cmUgc3RhdHMg YXJlIGZsdXNoZWQgdG8gc2hhcmVkIG1lbW9yeS4KIyBOb3RlOiBwZ19zdGF0X2lvIGNvdW50cyBJ L08gb3BlcmF0aW9ucywgbm90IHBhZ2VzICh3aXRoIGlvX2NvbWJpbmVfbGltaXQ9MTI4a0IsCiMg ICAgICAgdXAgdG8gMTYgcGFnZXMgcGVyIG9wZXJhdGlvbikuIFRoaXMgaXMgZXhwZWN0ZWQgYmVo YXZpb3IuCiMgUmV0dXJuczogbXMscmVhZHMscmVhZF90aW1lCnJ1bl90aW1lZF93aXRoX2lvKCkg ewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU1FMPSIkMyIKICBsb2NhbCByZXN1bHQKICAK ICAjIFJlc2V0IHN0YXRzLCBydW4gcXVlcnksIHdhaXQgZm9yIGZsdXNoLCByZWFkIGFic29sdXRl IHZhbHVlcwogICMgLSBGaWx0ZXIgYnkgY2xpZW50IGJhY2tlbmQgYW5kIGlvIHdvcmtlciAoZXhj bHVkZXMgYmd3cml0ZXIvY2hlY2twb2ludGVyKQogICMgLSAxLjVzIGRlbGF5IGFsbG93cyBzdGF0 cyB0byBmbHVzaCAoUEdTVEFUX01JTl9JTlRFUlZBTD0xMDAwbXMpCiAgcmVzdWx0PSQoIiQocGcg IiRST09UIiBwc3FsKSIgLWggMTI3LjAuMC4xIC1wICIkUE9SVCIgLWQgcG9zdGdyZXMgLVggLXYg T05fRVJST1JfU1RPUD0xIDw8RU9TUUwKU0VMRUNUIHBnX3N0YXRfcmVzZXRfc2hhcmVkKCdpbycp OwpcXHRpbWluZyBvbgokU1FMClxcdGltaW5nIG9mZgpTRUxFQ1QgcGdfc2xlZXAoMS41KTsKXFx0 IG9uClNFTEVDVCAKICBDT0FMRVNDRShTVU0ocmVhZHMpLDApOjpiaWdpbnQsCiAgQ09BTEVTQ0Uo U1VNKHJlYWRfdGltZSksMCk6Om51bWVyaWMoMTIsMikKRlJPTSBwZ19zdGF0X2lvIApXSEVSRSBv YmplY3QgPSAncmVsYXRpb24nIEFORCBiYWNrZW5kX3R5cGUgSU4gKCdjbGllbnQgYmFja2VuZCcs ICdpbyB3b3JrZXInKTsKRU9TUUwKICAyPiYxKQogIAogICMgUGFyc2UgdGltaW5nIChsYXN0IFRp bWU6IGxpbmUpCiAgbG9jYWwgbXMKICBtcz0kKGVjaG8gIiRyZXN1bHQiIHwgYXdrICcKICAgIC9U aW1lOi8gewogICAgICB2YWw9JDI7IHVuaXQ9JDM7CiAgICAgIGlmICh1bml0PT0ibXMiKSBtcz12 YWw7CiAgICAgIGVsc2UgaWYgKHVuaXQ9PSJzIikgbXM9dmFsKjEwMDA7CiAgICB9CiAgICBFTkQg eyBpZiAobXM9PSIiKSBleGl0IDE7IHByaW50ZiAiJS4zZlxuIiwgbXM7IH0KICAnKQogIAogICMg UGFyc2UgSS9PIHN0YXRzIChsYXN0IG5vbi1lbXB0eSBsaW5lIHdpdGggcGlwZSBzZXBhcmF0b3I6 IHJlYWRzfHJlYWRfdGltZSkKICBsb2NhbCByZWFkcyByZWFkX3RpbWUKICBsb2NhbCBpb19saW5l CiAgaW9fbGluZT0kKGVjaG8gIiRyZXN1bHQiIHwgZ3JlcCAnfCcgfCB0YWlsIC0xKQogIHJlYWRz PSQoZWNobyAiJGlvX2xpbmUiIHwgY3V0IC1kJ3wnIC1mMSB8IHRyIC1kICcgJykKICByZWFkX3Rp bWU9JChlY2hvICIkaW9fbGluZSIgfCBjdXQgLWQnfCcgLWYyIHwgdHIgLWQgJyAnKQogIAogICMg RGVmYXVsdCB0byAwIGlmIG5vdCBmb3VuZAogIFtbICIkcmVhZHMiID1+IF4tP1swLTldKyQgXV0g fHwgcmVhZHM9MAogIFtbICIkcmVhZF90aW1lIiA9fiBeLT9bMC05XSsoXC5bMC05XSspPyQgXV0g fHwgcmVhZF90aW1lPTAKICAKICBlY2hvICIkbXMsJHJlYWRzLCRyZWFkX3RpbWUiCn0KCiMgLS0t IFN0YXRpc3RpY3MgLS0tCmNhbGNfbWVkaWFuKCkgewogIGF3ayAtRiwgJ05SPjF7YVsrK25dPSQy fUVORHsKICAgIGlmKG49PTApe3ByaW50IDA7IGV4aXR9CiAgICBmb3IoaT0xO2k8PW47aSsrKWZv cihqPWkrMTtqPD1uO2orKylpZihhW2ldPmFbal0pe3Q9YVtpXTthW2ldPWFbal07YVtqXT10fQog ICAgcHJpbnQgKG4lMik/YVtpbnQobi8yKSsxXTooYVtuLzJdK2Fbbi8yKzFdKS8yCiAgfScgIiQx Igp9CgpjYWxjX21lZGlhbl9jb2woKSB7CiAgbG9jYWwgZmlsZT0iJDEiIGNvbD0iJDIiCiAgYXdr IC1GLCAtdiBjb2w9IiRjb2wiICdOUj4xe2FbKytuXT0kY29sfUVORHsKICAgIGlmKG49PTApe3By aW50IDA7IGV4aXR9CiAgICBmb3IoaT0xO2k8PW47aSsrKWZvcihqPWkrMTtqPD1uO2orKylpZihh W2ldPmFbal0pe3Q9YVtpXTthW2ldPWFbal07YVtqXT10fQogICAgcHJpbnQgKG4lMik/YVtpbnQo bi8yKSsxXTooYVtuLzJdK2Fbbi8yKzFdKS8yCiAgfScgIiRmaWxlIgp9CgpjYWxjX3N0YXRzKCkg ewogIGxvY2FsIGNzdj0iJDEiCiAgYXdrIC1GLCAnTlI+MXthWysrbl09JDI7cys9JDJ9RU5Eewog ICAgaWYobj09MClleGl0CiAgICBmb3IoaT0xO2k8PW47aSsrKWZvcihqPWkrMTtqPD1uO2orKylp ZihhW2ldPmFbal0pe3Q9YVtpXTthW2ldPWFbal07YVtqXT10fQogICAgbWVkPShuJTIpP2FbaW50 KG4vMikrMV06KGFbbi8yXSthW24vMisxXSkvMgogICAgYXZnPXMvbjsgZm9yKGk9MTtpPD1uO2kr Kylzcys9KGFbaV0tYXZnKV4yOyBzZD1zcXJ0KHNzL24pCiAgICBwcmludGYgIm1lZGlhbj0lLjFm bXMgbWVhbj0lLjFmwrElLjFmbXMgbj0lZCIsIG1lZCwgYXZnLCBzZCwgbgogIH0nICIkY3N2Igp9 CgojIC0tLSBCZW5jaG1hcmsgcnVubmVyIC0tLQpiZW5jaG1hcmsoKSB7CiAgbG9jYWwgUk9PVD0i JDEiIFBPUlQ9IiQyIiBOQU1FPSIkMyIgU1FMPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jlc3Vs dHMvJHtOQU1FfS5jc3YiCiAgCiAgbWtkaXIgLXAgIiRST09UL3Jlc3VsdHMiCiAgZWNobyAicnVu LG1zLHJlYWRzLHJlYWRfdGltZV9tcyIgPiAiJE9VVCIKICAKICBmb3IgaSBpbiAkKHNlcSAxICIk UkVQUyIpOyBkbwogICAgZHJvcF9jYWNoZXMgIiRST09UIgogICAgbG9jYWwgcmVzdWx0IG1zIHJl YWRzIHJlYWRfdGltZQogICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBP UlQiICIkU1FMIikKICAgIElGUz0nLCcgcmVhZCAtciBtcyByZWFkcyByZWFkX3RpbWUgPDw8IiRy ZXN1bHQiCiAgICBlY2hvICIkaSwkbXMsJHJlYWRzLCRyZWFkX3RpbWUiID4+ICIkT1VUIgogICAg bG9nICIkTkFNRSBbJGkvJFJFUFNdOiAke21zfW1zIChyZWFkcz0kcmVhZHMsIGlvX3RpbWU9JHty ZWFkX3RpbWV9bXMpIgogIGRvbmUKfQoKIyAtLS0gRGF0YSBzZXR1cCBmdW5jdGlvbnMgLS0tCnNl dHVwX2Jsb29tKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU0laRT0iJDMiCiAgbG9j YWwgTlJPV1MKICBjYXNlICIkU0laRSIgaW4KICAgIHNtYWxsKSAgTlJPV1M9MTAwMDAwIDs7CiAg ICBtZWRpdW0pIE5ST1dTPTEwMDAwMDAgOzsKICAgIGxhcmdlKSAgTlJPV1M9MTAwMDAwMDAgOzsK ICBlc2FjCiAgCiAgbG9nICJDcmVhdGluZyBCbG9vbSB0ZXN0IGRhdGEgKCRTSVpFOiAkTlJPV1Mg cm93cykiCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIDw8U1FMCkNSRUFURSBFWFRFTlNJT04g SUYgTk9UIEVYSVNUUyBibG9vbTsKRFJPUCBUQUJMRSBJRiBFWElTVFMgYmxvb21fdGVzdDsKQ1JF QVRFIFRBQkxFIGJsb29tX3Rlc3QgKGlkIElOVCwgZGF0YSBURVhULCB2YWwxIElOVCwgdmFsMiBJ TlQpOwpJTlNFUlQgSU5UTyBibG9vbV90ZXN0IFNFTEVDVCBpLCAnZGF0YV8nfHxpLCBpJTEwMDAs IGklMTAwIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsJE5ST1dTKSBpOwpDUkVBVEUgSU5ERVggYmxv b21faWR4IE9OIGJsb29tX3Rlc3QgVVNJTkcgYmxvb20gKHZhbDEsIHZhbDIpOwpWQUNVVU0gQU5B TFlaRSBibG9vbV90ZXN0OwpDSEVDS1BPSU5UOwpTUUwKfQoKc2V0dXBfcGdzdGF0dHVwbGUoKSB7 CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIKICBsb2NhbCBOUk9XUwogIGNh c2UgIiRTSVpFIiBpbgogICAgc21hbGwpICBOUk9XUz0xMDAwMDAgOzsKICAgIG1lZGl1bSkgTlJP V1M9MTAwMDAwMCA7OwogICAgbGFyZ2UpICBOUk9XUz0xMDAwMDAwMCA7OwogIGVzYWMKICAKICBs b2cgIkNyZWF0aW5nIHBnc3RhdHR1cGxlIHRlc3QgZGF0YSAoJFNJWkU6ICROUk9XUyByb3dzKSIK ICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgPDxTUUwKQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1Qg RVhJU1RTIHBnc3RhdHR1cGxlOwpEUk9QIFRBQkxFIElGIEVYSVNUUyBoZWFwX3Rlc3Q7CkNSRUFU RSBUQUJMRSBoZWFwX3Rlc3QgKGlkIFNFUklBTCBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsKSU5T RVJUIElOVE8gaGVhcF90ZXN0IChkYXRhKSBTRUxFQ1QgcmVwZWF0KCd4JywxMDApIEZST00gZ2Vu ZXJhdGVfc2VyaWVzKDEsJE5ST1dTKTsKVkFDVVVNIEFOQUxZWkUgaGVhcF90ZXN0OwpDSEVDS1BP SU5UOwpTUUwKfQoKc2V0dXBfZ2luKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU0la RT0iJDMiCiAgbG9jYWwgTlJPV1MKICBjYXNlICIkU0laRSIgaW4KICAgIHNtYWxsKSAgTlJPV1M9 MTAwMDAwIDs7CiAgICBtZWRpdW0pIE5ST1dTPTEwMDAwMDAgOzsKICAgIGxhcmdlKSAgTlJPV1M9 NTAwMDAwMCA7OwogIGVzYWMKICAKICBsb2cgIkNyZWF0aW5nIEdJTiB0ZXN0IGRhdGEgKCRTSVpF OiAkTlJPV1Mgcm93cykiCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIDw8U1FMCkRST1AgVEFC TEUgSUYgRVhJU1RTIGdpbl90ZXN0OwotLSBObyBQUklNQVJZIEtFWTogaXNvbGF0ZSBHSU4gaW5k ZXggdmFjdXVtIGZyb20gYnRyZWUgb3ZlcmhlYWQKQ1JFQVRFIFRBQkxFIGdpbl90ZXN0IChpZCBJ TlQsIHRhZ3MgVEVYVFtdKTsKSU5TRVJUIElOVE8gZ2luX3Rlc3QgKGlkLCB0YWdzKQpTRUxFQ1Qg aSwgQVJSQVkoU0VMRUNUICd0YWdfJ3x8KHJhbmRvbSgpKjEwMCk6OmludCBGUk9NIGdlbmVyYXRl X3NlcmllcygxLDUpKQpGUk9NIGdlbmVyYXRlX3NlcmllcygxLCROUk9XUykgaTsKQ1JFQVRFIElO REVYIGdpbl9pZHggT04gZ2luX3Rlc3QgVVNJTkcgZ2luICh0YWdzKTsKVkFDVVVNIEFOQUxZWkUg Z2luX3Rlc3Q7CkNIRUNLUE9JTlQ7ClNRTAp9CgpzZXR1cF9oYXNoKCkgewogIGxvY2FsIFJPT1Q9 IiQxIiBQT1JUPSIkMiIgU0laRT0iJDMiCiAgbG9jYWwgTlJPV1MKICBjYXNlICIkU0laRSIgaW4K ICAgIHNtYWxsKSAgTlJPV1M9NTAwMDAwIDs7CiAgICBtZWRpdW0pIE5ST1dTPTUwMDAwMDAgOzsK ICAgIGxhcmdlKSAgTlJPV1M9MjAwMDAwMDAgOzsKICBlc2FjCiAgCiAgbG9nICJDcmVhdGluZyBI YXNoIHRlc3QgZGF0YSAoJFNJWkU6ICROUk9XUyB1bmlxdWUgdmFsdWVzKSIKICBwc3FsX3J1biAi JFJPT1QiICIkUE9SVCIgPDxTUUwKRFJPUCBUQUJMRSBJRiBFWElTVFMgaGFzaF90ZXN0OwotLSBO byBQUklNQVJZIEtFWTogaXNvbGF0ZSBoYXNoIGluZGV4IHZhY3V1bSBmcm9tIGJ0cmVlIG92ZXJo ZWFkCkNSRUFURSBUQUJMRSBoYXNoX3Rlc3QgKGlkIElOVCwgZGF0YSBURVhUKTsKSU5TRVJUIElO VE8gaGFzaF90ZXN0IFNFTEVDVCBpLCAneCcgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwkTlJPV1Mp IGk7CkNSRUFURSBJTkRFWCBoYXNoX2lkeCBPTiBoYXNoX3Rlc3QgVVNJTkcgaGFzaCAoaWQpOwpW QUNVVU0gQU5BTFlaRSBoYXNoX3Rlc3Q7CkNIRUNLUE9JTlQ7ClNRTAp9CgpzZXR1cF93YWwoKSB7 CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIKICBsb2NhbCBOUk9XUwogIGNh c2UgIiRTSVpFIiBpbgogICAgc21hbGwpICBOUk9XUz0xMDAwMDAwIDs7CiAgICBtZWRpdW0pIE5S T1dTPTUwMDAwMDAgOzsKICAgIGxhcmdlKSAgTlJPV1M9MjAwMDAwMDAgOzsKICBlc2FjCiAgCiAg bG9nICJDcmVhdGluZyBVTkxPR0dFRCB0YWJsZSBmb3IgbG9nX25ld3BhZ2VfcmFuZ2UgdGVzdCAo JFNJWkU6ICROUk9XUyByb3dzKSIKICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgPDxTUUwKRFJP UCBUQUJMRSBJRiBFWElTVFMgd2FsX3Rlc3Q7Ci0tIFVOTE9HR0VEIHRhYmxlOiBwYWdlcyB3cml0 dGVuIHRvIGRpc2sgYnV0IE5PIFdBTCBnZW5lcmF0ZWQKLS0gQUxURVIgVEFCTEUgU0VUIExPR0dF RCB3aWxsIGNhbGwgbG9nX25ld3BhZ2VfcmFuZ2UoKSB0byByZWFkIGFsbCBwYWdlcwotLSBhbmQg d3JpdGUgdGhlbSB0byBXQUwgLSB0aGlzIGlzIHdoZXJlIHN0cmVhbWluZyByZWFkIGhlbHBzCkNS RUFURSBVTkxPR0dFRCBUQUJMRSB3YWxfdGVzdCAoaWQgSU5ULCBkYXRhIFRFWFQpOwpJTlNFUlQg SU5UTyB3YWxfdGVzdCBTRUxFQ1QgaSwgcmVwZWF0KCd4JywgMTAwKSBGUk9NIGdlbmVyYXRlX3Nl cmllcygxLCROUk9XUykgaTsKLS0gQ2hlY2twb2ludCBlbnN1cmVzIGFsbCBwYWdlcyBhcmUgb24g ZGlzayBiZWZvcmUgd2UgZHJvcCBjYWNoZXMKQ0hFQ0tQT0lOVDsKU1FMCn0KCiMgLS0tIFRlc3Qg ZnVuY3Rpb25zIC0tLQp0ZXN0X2Jsb29tX3NjYW4oKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9 IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0IgogIHNldHVwX2Jsb29tICIkUk9PVCIgIiRQT1JUIiAi JFNJWkUiCiAgYmVuY2htYXJrICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fYmxvb21fc2Nhbl8k e1NJWkV9IiBcCiAgICAiU0VUIGVuYWJsZV9zZXFzY2FuPW9mZjsgU0VMRUNUIENPVU5UKCopIEZS T00gYmxvb21fdGVzdCBXSEVSRSB2YWwxPTQyIEFORCB2YWwyPTc7Igp9Cgp0ZXN0X2Jsb29tX3Zh Y3V1bSgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIExBQkVMPSIkMyIgU0laRT0iJDQi CiAgbG9jYWwgT1VUPSIkUk9PVC9yZXN1bHRzLyR7TEFCRUx9X2Jsb29tX3ZhY3V1bV8ke1NJWkV9 LmNzdiIKICBta2RpciAtcCAiJFJPT1QvcmVzdWx0cyIKICBlY2hvICJydW4sbXMscmVhZHMscmVh ZF90aW1lX21zIiA+ICIkT1VUIgogIAogIGZvciBpIGluICQoc2VxIDEgIiRSRVBTIik7IGRvCiAg ICAjIEZyZXNoIHRhYmxlIGVhY2ggcnVuIGZvciBjb25zaXN0ZW50IHN0YXRlCiAgICBzZXR1cF9i bG9vbSAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICAgIyBDcmVhdGUgMTAlIGRlYWQgdHVwbGVz CiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIkRFTEVURSBGUk9NIGJsb29tX3Rlc3Qg V0hFUkUgaWQgJSAxMCA9IDA7IgogICAgCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiCiAgICBsb2Nh bCByZXN1bHQgbXMgcmVhZHMgcmVhZF90aW1lCiAgICByZXN1bHQ9JChydW5fdGltZWRfd2l0aF9p byAiJFJPT1QiICIkUE9SVCIgIlZBQ1VVTSBibG9vbV90ZXN0OyIpCiAgICBJRlM9JywnIHJlYWQg LXIgbXMgcmVhZHMgcmVhZF90aW1lIDw8PCIkcmVzdWx0IgogICAgZWNobyAiJGksJG1zLCRyZWFk cywkcmVhZF90aW1lIiA+PiAiJE9VVCIKICAgIGxvZyAiJHtMQUJFTH1fYmxvb21fdmFjdXVtXyR7 U0laRX0gWyRpLyRSRVBTXTogJHttc31tcyAocmVhZHM9JHJlYWRzLCBpb190aW1lPSR7cmVhZF90 aW1lfW1zKSIKICBkb25lCn0KCnRlc3RfcGdzdGF0dHVwbGUoKSB7CiAgbG9jYWwgUk9PVD0iJDEi IFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0IgogIGxvY2FsIE9VVD0iJFJPT1QvcmVzdWx0 cy8ke0xBQkVMfV9wZ3N0YXR0dXBsZV8ke1NJWkV9LmNzdiIKICBta2RpciAtcCAiJFJPT1QvcmVz dWx0cyIKICBlY2hvICJydW4sbXMscmVhZHMscmVhZF90aW1lX21zIiA+ICIkT1VUIgogIAogIGZv ciBpIGluICQoc2VxIDEgIiRSRVBTIik7IGRvCiAgICAjIEZyZXNoIHRhYmxlIGVhY2ggcnVuCiAg ICBzZXR1cF9wZ3N0YXR0dXBsZSAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICAgIyBVUERBVEUg Y2xlYXJzIHRoZSBhbGwtdmlzaWJsZSBiaXQgaW4gdGhlIFZpc2liaWxpdHkgTWFwIGZvciBhZmZl Y3RlZCBwYWdlcy4KICAgICMgcGdzdGF0dHVwbGVfYXBwcm94IHNraXBzIGFsbC12aXNpYmxlIHBh Z2VzIChlc3RpbWF0ZXMgZnJvbSBWTSB3aXRob3V0IHJlYWRpbmcpLgogICAgIyBUaGlzIGVuc3Vy ZXMgdGhlIGZ1bmN0aW9uIG11c3QgYWN0dWFsbHkgcmVhZCBwYWdlcywgZXhlcmNpc2luZyB0aGUg c3RyZWFtaW5nIHBhdGguCiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIlVQREFURSBo ZWFwX3Rlc3QgU0VUIGRhdGEgPSBkYXRhIHx8ICchJyBXSEVSRSBpZCAlIDUgPSAwOyIKICAgIAog ICAgZHJvcF9jYWNoZXMgIiRST09UIgogICAgbG9jYWwgcmVzdWx0IG1zIHJlYWRzIHJlYWRfdGlt ZQogICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBPUlQiICJTRUxFQ1Qg KiBGUk9NIHBnc3RhdHR1cGxlX2FwcHJveCgnaGVhcF90ZXN0Jyk7IikKICAgIElGUz0nLCcgcmVh ZCAtciBtcyByZWFkcyByZWFkX3RpbWUgPDw8IiRyZXN1bHQiCiAgICBlY2hvICIkaSwkbXMsJHJl YWRzLCRyZWFkX3RpbWUiID4+ICIkT1VUIgogICAgbG9nICIke0xBQkVMfV9wZ3N0YXR0dXBsZV8k e1NJWkV9IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgaW9fdGltZT0ke3JlYWRf dGltZX1tcykiCiAgZG9uZQp9Cgp0ZXN0X2dpbl92YWN1dW0oKSB7CiAgbG9jYWwgUk9PVD0iJDEi IFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0IgogIGxvY2FsIE9VVD0iJFJPT1QvcmVzdWx0 cy8ke0xBQkVMfV9naW5fdmFjdXVtXyR7U0laRX0uY3N2IgogIG1rZGlyIC1wICIkUk9PVC9yZXN1 bHRzIgogIGVjaG8gInJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMiID4gIiRPVVQiCiAgCiAgZm9y IGkgaW4gJChzZXEgMSAiJFJFUFMiKTsgZG8KICAgICMgRnJlc2ggdGFibGUgZWFjaCBydW4gZm9y IGNvbnNpc3RlbnQgc3RhdGUKICAgIHNldHVwX2dpbiAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgog ICAgCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiCiAgICBsb2NhbCByZXN1bHQgbXMgcmVhZHMgcmVh ZF90aW1lCiAgICAjIFZBQ1VVTSBBTkFMWVpFIGZvcmNlcyBnaW52YWN1dW1jbGVhbnVwKCkgdG8g cnVuIGFuZCBzY2FuIGFsbCBwYWdlcwogICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRS T09UIiAiJFBPUlQiICJWQUNVVU0gQU5BTFlaRSBnaW5fdGVzdDsiKQogICAgSUZTPScsJyByZWFk IC1yIG1zIHJlYWRzIHJlYWRfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVh ZHMsJHJlYWRfdGltZSIgPj4gIiRPVVQiCiAgICBsb2cgIiR7TEFCRUx9X2dpbl92YWN1dW1fJHtT SVpFfSBbJGkvJFJFUFNdOiAke21zfW1zIChyZWFkcz0kcmVhZHMsIGlvX3RpbWU9JHtyZWFkX3Rp bWV9bXMpIgogIGRvbmUKfQoKdGVzdF9oYXNoX3ZhY3V1bSgpIHsKICBsb2NhbCBST09UPSIkMSIg UE9SVD0iJDIiIExBQkVMPSIkMyIgU0laRT0iJDQiCiAgbG9jYWwgT1VUPSIkUk9PVC9yZXN1bHRz LyR7TEFCRUx9X2hhc2hfdmFjdXVtXyR7U0laRX0uY3N2IgogIG1rZGlyIC1wICIkUk9PVC9yZXN1 bHRzIgogIGVjaG8gInJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMiID4gIiRPVVQiCiAgCiAgZm9y IGkgaW4gJChzZXEgMSAiJFJFUFMiKTsgZG8KICAgICMgRnJlc2ggdGFibGUgZWFjaCBydW4gZm9y IGNvbnNpc3RlbnQgc3RhdGUKICAgIHNldHVwX2hhc2ggIiRST09UIiAiJFBPUlQiICIkU0laRSIK ICAgICMgQ3JlYXRlIDEwJSBkZWFkIHR1cGxlcwogICAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQi IC1jICJERUxFVEUgRlJPTSBoYXNoX3Rlc3QgV0hFUkUgaWQgJSAxMCA9IDA7IgogICAgCiAgICBk cm9wX2NhY2hlcyAiJFJPT1QiCiAgICBsb2NhbCByZXN1bHQgbXMgcmVhZHMgcmVhZF90aW1lCiAg ICByZXN1bHQ9JChydW5fdGltZWRfd2l0aF9pbyAiJFJPT1QiICIkUE9SVCIgIlZBQ1VVTSBoYXNo X3Rlc3Q7IikKICAgIElGUz0nLCcgcmVhZCAtciBtcyByZWFkcyByZWFkX3RpbWUgPDw8IiRyZXN1 bHQiCiAgICBlY2hvICIkaSwkbXMsJHJlYWRzLCRyZWFkX3RpbWUiID4+ICIkT1VUIgogICAgbG9n ICIke0xBQkVMfV9oYXNoX3ZhY3V1bV8ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRz PSRyZWFkcywgaW9fdGltZT0ke3JlYWRfdGltZX1tcykiCiAgZG9uZQp9Cgp0ZXN0X3dhbF9sb2dn aW5nKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIK ICBsb2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMvJHtMQUJFTH1fd2FsX2xvZ2dpbmdfJHtTSVpFfS5j c3YiCiAgbWtkaXIgLXAgIiRST09UL3Jlc3VsdHMiCiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRf dGltZV9tcyIgPiAiJE9VVCIKICAKICBmb3IgaSBpbiAkKHNlcSAxICIkUkVQUyIpOyBkbwogICAg IyBDcmVhdGUgVU5MT0dHRUQgdGFibGUgd2l0aCBkYXRhIChwYWdlcyBvbiBkaXNrLCBubyBXQUwp CiAgICBzZXR1cF93YWwgIiRST09UIiAiJFBPUlQiICIkU0laRSIKICAgIAogICAgIyBEcm9wIE9T IGNhY2hlcyAtIHBhZ2VzIGFyZSBub3cgQ09MRCBvbiBkaXNrCiAgICBkcm9wX2NhY2hlcyAiJFJP T1QiCiAgICAKICAgICMgQUxURVIgVEFCTEUgU0VUIExPR0dFRCBjYWxscyBsb2dfbmV3cGFnZV9y YW5nZSgpIHRvOgogICAgIyAxLiBSZWFkIEFMTCB0YWJsZSBwYWdlcyBmcm9tIGRpc2sgKENPTEQg LSBzdHJlYW1pbmcgaGVscHMgaGVyZSEpCiAgICAjIDIuIFdyaXRlIHRoZW0gdG8gV0FMIGZvciBj cmFzaCByZWNvdmVyeQogICAgIyBUaGlzIGRpcmVjdGx5IGV4ZXJjaXNlcyB0aGUgcGF0Y2hlZCBj b2RlIHBhdGggaW4gbG9nX25ld3BhZ2VfcmFuZ2UoKQogICAgbG9jYWwgcmVzdWx0IG1zIHJlYWRz IHJlYWRfdGltZQogICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBPUlQi ICJBTFRFUiBUQUJMRSB3YWxfdGVzdCBTRVQgTE9HR0VEOyIpCiAgICBJRlM9JywnIHJlYWQgLXIg bXMgcmVhZHMgcmVhZF90aW1lIDw8PCIkcmVzdWx0IgogICAgZWNobyAiJGksJG1zLCRyZWFkcywk cmVhZF90aW1lIiA+PiAiJE9VVCIKICAgIGxvZyAiJHtMQUJFTH1fd2FsX2xvZ2dpbmdfJHtTSVpF fSBbJGkvJFJFUFNdOiAke21zfW1zIChyZWFkcz0kcmVhZHMsIGlvX3RpbWU9JHtyZWFkX3RpbWV9 bXMpIgogIGRvbmUKfQoKIyAtLS0gUnVuIHRlc3RzIGZvciBhIGJ1aWxkIC0tLQpydW5fdGVzdHMo KSB7CiAgbG9jYWwgUk9PVD0iJDEiIExBQkVMPSIkMiIKICBsb2NhbCBQT1JUCiAgUE9SVD0kKHBp Y2tfcG9ydCkKICAKICBsb2cgIlskTEFCRUxdIFN0YXJ0aW5nIGNsdXN0ZXIgb24gcG9ydCAkUE9S VCIKICBpbml0X2NsdXN0ZXIgIiRST09UIiAiJFBPUlQiCiAgCiAgdHJhcCAic3RvcF9jbHVzdGVy ICckUk9PVCciIEVYSVQKICAKICBmb3IgU0laRSBpbiAkU0laRVM7IGRvCiAgICBjYXNlICIkVEVT VCIgaW4KICAgICAgYmxvb21fc2NhbikgICB0ZXN0X2Jsb29tX3NjYW4gIiRST09UIiAiJFBPUlQi ICIkTEFCRUwiICIkU0laRSIgOzsKICAgICAgYmxvb21fdmFjdXVtKSB0ZXN0X2Jsb29tX3ZhY3V1 bSAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIiA7OwogICAgICBwZ3N0YXR0dXBsZSkg IHRlc3RfcGdzdGF0dHVwbGUgIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAg ICAgZ2luX3ZhY3V1bSkgICB0ZXN0X2dpbl92YWN1dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwi ICIkU0laRSIgOzsKICAgICAgaGFzaF92YWN1dW0pICB0ZXN0X2hhc2hfdmFjdXVtICIkUk9PVCIg IiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiIDs7CiAgICAgIHdhbF9sb2dnaW5nKSAgdGVzdF93YWxf bG9nZ2luZyAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIiA7OwogICAgICBhbGwpCiAg ICAgICAgdGVzdF9ibG9vbV9zY2FuICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiCiAg ICAgICAgdGVzdF9ibG9vbV92YWN1dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIK ICAgICAgICB0ZXN0X3Bnc3RhdHR1cGxlICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUi CiAgICAgICAgdGVzdF9naW5fdmFjdXVtICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUi CiAgICAgICAgdGVzdF9oYXNoX3ZhY3V1bSAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpF IgogICAgICAgIHRlc3Rfd2FsX2xvZ2dpbmcgIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0la RSIKICAgICAgICA7OwogICAgICAqKSBkaWUgIlVua25vd24gdGVzdDogJFRFU1QiIDs7CiAgICBl c2FjCiAgZG9uZQogIAogIHN0b3BfY2x1c3RlciAiJFJPT1QiCiAgdHJhcCAtIEVYSVQKfQoKIyAt LS0gQ29tcGFyZSByZXN1bHRzIC0tLQpjb21wYXJlX3Jlc3VsdHMoKSB7CiAgbG9jYWwgYmFzZV9j c3Y9IiQxIiBwYXRjaF9jc3Y9IiQyIiBsYWJlbD0iJDMiCiAgCiAgW1sgISAtZiAiJGJhc2VfY3N2 IiB8fCAhIC1mICIkcGF0Y2hfY3N2IiBdXSAmJiByZXR1cm4KICAKICBsb2NhbCBiYXNlX21lZCBw YXRjaF9tZWQKICBiYXNlX21lZD0kKGNhbGNfbWVkaWFuICIkYmFzZV9jc3YiKQogIHBhdGNoX21l ZD0kKGNhbGNfbWVkaWFuICIkcGF0Y2hfY3N2IikKICAKICAjIEd1YXJkIGFnYWluc3QgZW1wdHkg b3IgemVybyB2YWx1ZXMgdG8gcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvCiAgW1sgLXogIiRiYXNl X21lZCIgfHwgIiRiYXNlX21lZCIgPT0gIjAiIF1dICYmIGJhc2VfbWVkPSIwLjAwMSIKICBbWyAt eiAiJHBhdGNoX21lZCIgfHwgIiRwYXRjaF9tZWQiID09ICIwIiBdXSAmJiBwYXRjaF9tZWQ9IjAu MDAxIgogIAogIGxvY2FsIHNwZWVkdXAgcGN0CiAgc3BlZWR1cD0kKGF3ayAiQkVHSU4geyBwcmlu dGYgXCIlLjJmXCIsICRiYXNlX21lZCAvICRwYXRjaF9tZWQgfSIpCiAgcGN0PSQoYXdrICJCRUdJ TiB7IHByaW50ZiBcIiUuMWZcIiwgKCRiYXNlX21lZCAtICRwYXRjaF9tZWQpIC8gJGJhc2VfbWVk ICogMTAwIH0iKQogIAogICMgQ2hlY2sgSS9PIHN0YXRzIChyZWFkcyBhbmQgcmVhZF90aW1lIGNv bHVtbnMpCiAgbG9jYWwgYmFzZV9yZWFkcyBwYXRjaF9yZWFkcyBiYXNlX2lvIHBhdGNoX2lvIGlv X2luZm89IiIKICBpZiBoZWFkIC0xICIkYmFzZV9jc3YiIHwgZ3JlcCAtcSAicmVhZHMiOyB0aGVu CiAgICBiYXNlX3JlYWRzPSQoY2FsY19tZWRpYW5fY29sICIkYmFzZV9jc3YiIDMpCiAgICBwYXRj aF9yZWFkcz0kKGNhbGNfbWVkaWFuX2NvbCAiJHBhdGNoX2NzdiIgMykKICAgIGJhc2VfaW89JChj YWxjX21lZGlhbl9jb2wgIiRiYXNlX2NzdiIgNCkKICAgIHBhdGNoX2lvPSQoY2FsY19tZWRpYW5f Y29sICIkcGF0Y2hfY3N2IiA0KQogICAgIyBEZWZhdWx0IHRvIDAgaWYgZW1wdHkKICAgIFtbIC16 ICIkYmFzZV9yZWFkcyIgXV0gJiYgYmFzZV9yZWFkcz0wCiAgICBbWyAteiAiJHBhdGNoX3JlYWRz IiBdXSAmJiBwYXRjaF9yZWFkcz0wCiAgICBbWyAteiAiJGJhc2VfaW8iIF1dICYmIGJhc2VfaW89 MAogICAgW1sgLXogIiRwYXRjaF9pbyIgXV0gJiYgcGF0Y2hfaW89MAogICAgaW9faW5mbz0iICAo cmVhZHM9JHtiYXNlX3JlYWRzfeKGkiR7cGF0Y2hfcmVhZHN9LCBpb190aW1lPSR7YmFzZV9pb33i hpIke3BhdGNoX2lvfW1zKSIKICBmaQogIAogIHByaW50ZiAiJS0yNnMgYmFzZT0lOC4xZm1zICBw YXRjaD0lOC4xZm1zICAlNS4yZnggICglNS4xZiUlKSVzXG4iIFwKICAgICIkbGFiZWwiICIkYmFz ZV9tZWQiICIkcGF0Y2hfbWVkIiAiJHNwZWVkdXAiICIkcGN0IiAiJGlvX2luZm8iCn0KCnByaW50 X3N1bW1hcnkoKSB7CiAgZWNobyAiIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICIgICAgICAgICAgICAgICAgICAgICBTVFJFQU1JTkcg UkVBRCBCRU5DSE1BUksgUkVTVUxUUyAgICAgICAgICAgICAgICAgICAiCiAgZWNobyAi4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIiIKICAKICBpZiBb WyAkQkFTRUxJTkUgLWVxIDEgXV07IHRoZW4KICAgIHByaW50ZiAiJS0yNnMgJS0xN3MgJS0xN3Mg JS03cyAlLTdzICVzXG4iICJURVNUIiAiQkFTRUxJTkUiICJQQVRDSEVEIiAiU1BFRURVUCIgIkNI QU5HRSIgIkkvTyBUSU1FIgogICAgZWNobyAi4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIgogICAgCiAgICBmb3IgU0laRSBpbiAk U0laRVM7IGRvCiAgICAgIGZvciB0ZXN0X25hbWUgaW4gYmxvb21fc2NhbiBibG9vbV92YWN1dW0g cGdzdGF0dHVwbGUgZ2luX3ZhY3V1bSBoYXNoX3ZhY3V1bSB3YWxfbG9nZ2luZzsgZG8KICAgICAg ICBbWyAiJFRFU1QiICE9ICJhbGwiICYmICIkVEVTVCIgIT0gIiR0ZXN0X25hbWUiIF1dICYmIGNv bnRpbnVlCiAgICAgICAgY29tcGFyZV9yZXN1bHRzIFwKICAgICAgICAgICIkUk9PVF9CQVNFL3Jl c3VsdHMvYmFzZV8ke3Rlc3RfbmFtZX1fJHtTSVpFfS5jc3YiIFwKICAgICAgICAgICIkUk9PVF9Q QVRDSC9yZXN1bHRzL3BhdGNoZWRfJHt0ZXN0X25hbWV9XyR7U0laRX0uY3N2IiBcCiAgICAgICAg ICAiJHt0ZXN0X25hbWV9XyR7U0laRX0iCiAgICAgIGRvbmUKICAgIGRvbmUKICBlbHNlCiAgICBl Y2hvICJSZXN1bHRzIChwYXRjaGVkIG9ubHkpOiIKICAgIGVjaG8gIiIKICAgIGZvciBmIGluICIk Uk9PVF9QQVRDSC9yZXN1bHRzLyIqLmNzdjsgZG8KICAgICAgW1sgLWYgIiRmIiBdXSB8fCBjb250 aW51ZQogICAgICBwcmludGYgIiUtNDBzICVzXG4iICIkKGJhc2VuYW1lICIkZiIgLmNzdik6IiAi JChjYWxjX3N0YXRzICIkZiIpIgogICAgZG9uZQogIGZpCiAgCiAgZWNobyAiIgogIGVjaG8gIuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICJDU1YgZmls ZXM6ICRST09UX1BBVENIL3Jlc3VsdHMvIgogIFtbICRCQVNFTElORSAtZXEgMSBdXSAmJiBlY2hv ICJCYXNlbGluZTogICRST09UX0JBU0UvcmVzdWx0cy8iCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgp9CgojIC0tLSBNYWluIC0tLQptYWluKCkgewog IGxvZyAiU3RyZWFtaW5nIFJlYWQgQmVuY2htYXJrIgogIGxvZyAiUGF0Y2g6ICRQQVRDSCIKICBs b2cgIlRlc3RzOiAkVEVTVCIKICBsb2cgIlNpemVzOiAkU0laRVMiCiAgbG9nICJSZXBzOiAgJFJF UFMiCiAgbG9nICJJL086ICAgJElPX01FVEhPRCAod29ya2Vycz0kSU9fV09SS0VSUywgY29uY3Vy cmVuY3k9JElPX01BWF9DT05DVVJSRU5DWSkiCiAgCiAgIyBCdWlsZAogIGlmIFtbICRCQVNFTElO RSAtZXEgMSBdXTsgdGhlbgogICAgYnVpbGRfcGcgIiRST09UX0JBU0UiICIiCiAgZmkKICBidWls ZF9wZyAiJFJPT1RfUEFUQ0giICIkUEFUQ0giCiAgCiAgIyBSdW4gdGVzdHMKICBpZiBbWyAkQkFT RUxJTkUgLWVxIDEgXV07IHRoZW4KICAgIGxvZyAiUnVubmluZyBiYXNlbGluZSB0ZXN0cyIKICAg IHJ1bl90ZXN0cyAiJFJPT1RfQkFTRSIgImJhc2UiCiAgZmkKICAKICBsb2cgIlJ1bm5pbmcgcGF0 Y2hlZCB0ZXN0cyIKICBydW5fdGVzdHMgIiRST09UX1BBVENIIiAicGF0Y2hlZCIKICAKICAjIFN1 bW1hcnkKICBwcmludF9zdW1tYXJ5Cn0KCm1haW4K --00000000000048c8b1064a0bbcfa--