From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 23599 invoked from network); 20 Feb 2023 23:55:46 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 20 Feb 2023 23:55:46 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1676937346; b=ToaDMfFbmPkwEfLU3puBF1NzD5E/9WqcXgDJDrwEfmxEQcn0Kud2WNjCu7Tmwafh7tjSbQc9OK u2mxrPpokUUxFY8VHgarUDt3V5cxL3s828G2ezJR9mwsZpxhD0EqMG/pFz22dpBU/Rg1Xth6C0 cDGKI3NIA2A7ia6mDhJeFg0+k9m0S8T725bdsK1Th7chbBynOzPjhAbyBiqNcGR8pAPZTC/pJd XaTgjRNEhTXv/EbfxMMkO1vXFy/ZOi6+E7mL3tZzl5rdh7IRdKWAsngjjDhASBtM+/77tMvnBa 78ie08dJPw/0CrnYUnYPqwkL+5TGBoamo24rbbixjw0Kmw==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-ed1-f41.google.com) smtp.remote-ip=209.85.208.41; dkim=pass header.d=brasslantern-com.20210112.gappssmtp.com header.s=20210112 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1676937346; bh=2E8T0+2km42vQ1xsS9Z1ZS4Dj9Fxl3MHJhYQXtbFHKc=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Type:To:Subject:Message-ID:Date:From:MIME-Version: DKIM-Signature:DKIM-Signature; b=sk2Ol4hcFccp9vSAScd5O6NrvXORkqje6gcCY17Zbkj/S2aImwGhGPYk0AUULWHj2vL7OHskig oEbW20DSNbN4sNAlGI0p+ZJeUQxnWdpAfhcQn7m8kxvfsm54GNrYSeV1VAFVCHRLZbhqjaXhYs JtSPHHJJAOAvcbHMWuI7YWFNCHS+LEALBwisZbt5jlSrvmeRSgd/PwxDN8xKpFngqs23Njaa9s w3fd8F3TYMgH+sWtzwTO7Z817gIBAo9tuef3goSaKDkMTs8z0Vhw1n7OutHuIv8wln5EsZoQhh TGRDNksvprcbN9SIZhzce3baDvfs5PxSynCCyESgOUFUzQ==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20210803; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Content-Type:To:Subject:Message-ID: Date:From:MIME-Version:Reply-To:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References; bh=DhKvHERbQK+/ErRiCEnIocf3mwPfSilnhrqcg6Pza+M=; b=Gw3iVsm9GuHIbW6m3ogXzfg+Pr en0v9NtlwRQKB0YLRJmWhBfAy2RsiC4ER3c2P3EQRQ72deiiS6dny/VqIq3CptbnPs9ZSVnTijzD7 H5ApAjqTSS7S2dS2leeB5ZQmpzDF0pftIkW0TIpP8KrhklqU/OXpbD5TpUZJwVnqOTABHc0g7OlIZ JhezdcIzBQfRmFzmYLhVXQzoUCZbV/fcweLjGY2y62NOeIeNlJSDNTvR8VeG25bZm1NVZ73suOG4T ftlQi2QQ0VBMKfKWNaGkTf+cYCVLjhz/CUFR6ZwzQuSpaJUlaL0NPKzMXIy7dQHOlFNZ2aO7cUnpr JfwiyqFw==; Received: by zero.zsh.org with local id 1pUG0X-000NnT-8j; Mon, 20 Feb 2023 23:55:45 +0000 Authentication-Results: zsh.org; iprev=pass (mail-ed1-f41.google.com) smtp.remote-ip=209.85.208.41; dkim=pass header.d=brasslantern-com.20210112.gappssmtp.com header.s=20210112 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none Received: from mail-ed1-f41.google.com ([209.85.208.41]:44547) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1pUG0A-000NTF-8Q; Mon, 20 Feb 2023 23:55:22 +0000 Received: by mail-ed1-f41.google.com with SMTP id s26so10504748edw.11 for ; Mon, 20 Feb 2023 15:55:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20210112.gappssmtp.com; s=20210112; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=DhKvHERbQK+/ErRiCEnIocf3mwPfSilnhrqcg6Pza+M=; b=0l/g9oUnwX7QIiiXec1Cvpx3uJZPJYfK2zA8OIyRjXPkEMrecFhuMejURFup5ZPsl1 CDrkar28TopWOmQJjVsfYpJjJV/aguV7S8C3tXndPoWaJwIV/pWAtCJXBaP3dCckwx8A yUKqMxRtmLWn+k5LYY1pvP3ykZmBNEACNMp2KW/7fhzLT5d2G0JOKq5plF+ndsLHZtVI d9RrZpgpfdQ4koDN4WCghhYqxzt/2yw5Mde3nRDDkJvfRZ+XNxPW3ZlHanfcwQ7voth2 58Zxj+0gKkz72dsE+VNX5mV2wg6giMGaEuN9o+TQcRJXFnFUDA5bLoCnJ0wslwKHzHHU DYmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=DhKvHERbQK+/ErRiCEnIocf3mwPfSilnhrqcg6Pza+M=; b=Dm7UnBCO9MP2scd0VneI0iEh8Cw7mpukG54tTvjEAjUqT6iwOji2LfvawpaDkv4Ma6 gBeu3MzKY+0/d5umUbDle6iFeTKJVZ6oNg/7oBEqGYSWaABTCo2Q0aPxX4YcLDY1x7NT 2bTYZ8NuNI9kaMSp8HD0tHwNszCkasTyXUkgAbB6JPNlH7V1jj8A7mAez7YAM5o3LykT gs1ffEKvq5DqxTuYMMrFsZTfwdC7M6j8f/16kezKjCicviRaUSWRYS+mrsYIAX0Lj3Y3 aumyUnU1ZMbBJmeMjZdFs86+Vd5Rpd3KOLsZl8gNAHg4IdRrZ2JkuuWSLO+XgQmXYcDp kZcA== X-Gm-Message-State: AO0yUKVtV7cXkCRi2sV9ecPB8Bfh3X9E9AsJuJxRZoUkOzsl4PlUT1mK HNp5BaSpxCCxDuUzpuIBUemttNfGHHh85ZBTtsB45BJsIlQlNDZf X-Google-Smtp-Source: AK7set8klLxOAZGbat8UTSv4I8OGERGCuELeZj8prGEkF9i3S+4K06ZEZfwdrWl79xuTYSI9XMHC/ahOTESFSeNNNBY= X-Received: by 2002:a17:906:f6c2:b0:8b1:2ebf:386b with SMTP id jo2-20020a170906f6c200b008b12ebf386bmr5249765ejb.12.1676937321592; Mon, 20 Feb 2023 15:55:21 -0800 (PST) MIME-Version: 1.0 From: Bart Schaefer Date: Mon, 20 Feb 2023 15:55:10 -0800 Message-ID: Subject: "printdefines" utility To: Zsh hackers list Content-Type: multipart/mixed; boundary="0000000000005d62e905f52a6509" X-Seq: 51464 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: --0000000000005d62e905f52a6509 Content-Type: text/plain; charset="UTF-8" Without objection, I will add this to the Util/ directory in the distribution. It does require the named references patches and the zsh/param/private module. This script takes as arguments a name representing one of the sets of bitflag (or similar) values that are #defined in Src/zsh.h, followed by an integer or a pattern, and prints out the corresponding definition if it can. This has been really helpful for me when using gdb to examine structures that contain bitflags. I extended it beyond the two or three that I regularly found myself using and tried to make the output as useful as possible, i.e., to match the format used in the #define. For flags defined by bit-shifting it also displays the integer value. Example: % Util/printdefines paramflags 50331648 50331648 PM_UNSET|PM_REMOVABLE % Util/printdefines scanparamflags '*MATCH*' SCANPM_MATCHKEY 1<<3 8 SCANPM_MATCHVAL 1<<4 16 SCANPM_MATCHMANY 1<<5 32 SCANPM_KEYMATCH 1<<7 128 If the only argument is a name, all the flags for that name are displayed. % Util/printdefines lexflags LEXFLAGS_ACTIVE 16#01 LEXFLAGS_ZLE 16#02 LEXFLAGS_COMMENTS_KEEP 16#04 LEXFLAGS_COMMENTS_STRIP 16#08 LEXFLAGS_NEWLINE 16#10 If the only argument is a pattern, every set of flags available is searched for a match. % Util/printdefines '(#i)S*G' --- scanparamflags --- SCANPM_ASSIGNING 1<<6 64 SCANPM_CHECKING 1<<10 1024 --- chartokens --- String 85 --- substmodifiers --- SUB_LONG 16#2 (This doesn't work for numbers.) With no arguments, displays a usage message including the names of all the sets of #defines that can be used as the first argument. Although I initially generated the tables mostly programmatically, I haven't come up with any way to keep them up to date if zsh.h changes. Bug reports welcome, I've used it for a while with some of the tables but not all. --0000000000005d62e905f52a6509 Content-Type: application/octet-stream; name=printdefines Content-Disposition: attachment; filename=printdefines Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ledh44j30 IyEvYmluL3pzaCAtZgplbXVsYXRlIC1MIHpzaCAtbyBleHRlbmRlZGdsb2IKCnptb2Rsb2FkIHpz aC9wYXJhbS9wcml2YXRlCgpsb2NhbCAtQUhQcnQgam9ic3RhdHM9KAogbWFwYmFzZSAxNgogJCgo MHgwMDAxKSkgU1RBVF9DSEFOR0VECSMgc3RhdHVzIGNoYW5nZWQgYW5kIG5vdCByZXBvcnRlZAog JCgoMHgwMDAyKSkgU1RBVF9TVE9QUEVECSMgYWxsIHByb2NzIHN0b3BwZWQgb3IgZXhpdGVkCiAk KCgweDAwMDQpKSBTVEFUX1RJTUVECQkjIGpvYiBpcyBiZWluZyB0aW1lZAogJCgoMHgwMDA4KSkg U1RBVF9ET05FCQkjIGpvYiBpcyBkb25lCiAkKCgweDAwMTApKSBTVEFUX0xPQ0tFRAkjIHNoZWxs IGlzIGZpbmlzaGVkIGNyZWF0aW5nIHRoaXMgam9iLAogICAgICAgICAgICAgICAgICAgICAgICAg CSMgICBtYXkgYmUgZGVsZXRlZCBmcm9tIGpvYiB0YWJsZQogJCgoMHgwMDIwKSkgU1RBVF9OT1BS SU5UCSMgam9iIHdhcyBraWxsZWQgaW50ZXJuYWxseSwKICAgICAgICAgICAgICAgICAgICAgICAg IAkjICAgd2UgZG9uJ3Qgd2FudCB0byBzaG93IHRoYXQKICQoKDB4MDA0MCkpIFNUQVRfSU5VU0UJ CSMgdGhpcyBqb2IgZW50cnkgaXMgaW4gdXNlCiAkKCgweDAwODApKSBTVEFUX1NVUEVSSk9CCSMg am9iIGhhcyBhIHN1YmpvYgogJCgoMHgwMTAwKSkgU1RBVF9TVUJKT0IJIyBqb2IgaXMgYSBzdWJq b2IKICQoKDB4MDIwMCkpIFNUQVRfV0FTU1VQRVIJIyB3YXMgYSBzdXBlci1qb2IsIHN1Yi1qb2Ig bmVlZHMgdG8gYmUKCQkJCSMgZGVsZXRlZAogJCgoMHgwNDAwKSkgU1RBVF9DVVJTSAkJIyBsYXN0 IGNvbW1hbmQgaXMgaW4gY3VycmVudCBzaGVsbAogJCgoMHgwODAwKSkgU1RBVF9OT1NUVFkJIyB0 aGUgdHR5IHNldHRpbmdzIGFyZSBub3QgaW5oZXJpdGVkCgkJCQkjIGZyb20gdGhpcyBqb2Igd2hl biBpdCBleGl0cy4KICQoKDB4MTAwMCkpIFNUQVRfQVRUQUNICSMgZGVsYXkgcmVhdHRhY2hpbmcg c2hlbGwgdG8gdHR5CiAkKCgweDIwMDApKSBTVEFUX1NVQkxFQURFUgkjIGlzIHN1cGVyLWpvYiwg YnV0IGxlYWRlciBpcyBzdWItc2hlbGwKCiAkKCgweDQwMDApKSBTVEFUX0JVSUxUSU4JIyBqb2Ig YXQgdGFpbCBvZiBwaXBlbGluZSBpcyBhIGJ1aWx0aW4KICQoKDB4ODAwMCkpIFNUQVRfU1VCSk9C X09SUEhBTkVECiAgICAgICAgICAgICAgICAgICAgICAgIAkjIFNUQVRfU1VCSk9CIHdpdGggU1RB VF9TVVBFUkpPQiBleGl0ZWQKICQoKDB4MTAwMDApKSBTVEFUX0RJU09XTgkjIFNUQVRfU1VQRVJK T0Igd2l0aCBkaXNvd24gcGVuZGluZwoKIy0xIFNQX1JVTk5JTkcJCQkjIGZha2Ugc3RhdHVzIGZv ciBqb2JzIGN1cnJlbnRseSBydW5uaW5nCikKbG9jYWwgLUFIUHJ0IHBhcmFtZmxhZ3M9KAogbWFw YmFzZSAyCiAwCQlQTV9TQ0FMQVIJIyBzY2FsYXIKICQoKDE8PDApKQlQTV9BUlJBWQkjIGFycmF5 CiAkKCgxPDwxKSkJUE1fSU5URUdFUgkjIGludGVnZXIKICQoKDE8PDIpKQlQTV9FRkxPQVQJIyBk b3VibGUgd2l0aCAlZSBvdXRwdXQKICQoKDE8PDMpKQlQTV9GRkxPQVQJIyBkb3VibGUgd2l0aCAl ZiBvdXRwdXQKICQoKDE8PDQpKQlQTV9IQVNIRUQJIyBhc3NvY2lhdGlvbgoKICQoKDE8PDUpKQlQ TV9MRUZUCQkjIGxlZnQganVzdGlmeSwgcmVtb3ZlIGxlYWRpbmcgYmxhbmtzCiAkKCgxPDw2KSkJ UE1fUklHSFRfQgkjIHJpZ2h0IGp1c3RpZnksIGZpbGwgd2l0aCBsZWFkaW5nIGJsYW5rcwogJCgo MTw8NykpCVBNX1JJR0hUX1oJIyByaWdodCBqdXN0aWZ5LCBmaWxsIHdpdGggbGVhZGluZyB6ZXJv cwogJCgoMTw8OCkpCVBNX0xPV0VSCSMgYWxsIGxvd2VyIGNhc2UKCiAkKCgxPDw5KSkJUE1fVVBQ RVIJIyBhbGwgdXBwZXIgY2FzZQojICQoKDE8PDkpKQlQTV9VTkRFRklORUQJIyB1bmRlZmluZWQg KGF1dG9sb2FkZWQpIHNoZWxsIGZ1bmN0aW9uCgogJCgoMTw8MTApKQlQTV9SRUFET05MWQkjIHJl YWRvbmx5CiAkKCgxPDwxMSkpCVBNX1RBR0dFRAkjIHRhZ2dlZAogJCgoMTw8MTIpKQlQTV9FWFBP UlRFRAkjIGV4cG9ydGVkCiMgJCgoMTw8MTIpKQlQTV9BQlNQQVRIX1VTRUQJIyAoZnVuY3Rpb24p OiBsb2FkZWQgdXNpbmcgYWJzb2x1dGUgcGF0aAoKICQoKDE8PDEzKSkJUE1fVU5JUVVFCSMgcmVt b3ZlIGR1cGxpY2F0ZXMKIyAkKCgxPDwxMykpCVBNX1VOQUxJQVNFRAkjIChmdW5jdGlvbikgZG8g bm90IGV4cGFuZCBhbGlhc2VzCgogJCgoMTw8MTQpKQlQTV9ISURFCQkjIFNwZWNpYWwgYmVoYXZp b3VyIGhpZGRlbiBieSBsb2NhbAojICQoKDE8PDE0KSkJUE1fQ1VSX0ZQQVRICSMgKGZ1bmN0aW9u KTogY2FuIHVzZSAkZnBhdGggd2l0aCBmaWxlbmFtZQogJCgoMTw8MTUpKQlQTV9ISURFVkFMCSMg VmFsdWUgbm90IHNob3duIGluIGB0eXBlc2V0JyBjb21tYW5kcwojICQoKDE8PDE1KSkJUE1fV0FS Tk5FU1RFRAkjIChmdW5jdGlvbik6IG5vbi1yZWN1cnNpdmUgV0FSTk5FU1RFRFZBUgogJCgoMTw8 MTYpKQlQTV9USUVECQkjIGFycmF5IHRpZWQgdG8gY29sb24tcGF0aCBvciB2LnYuCiMgJCgoMTw8 MTYpKQlQTV9UQUdHRURfTE9DQUwJIyAoZnVuY3Rpb24pOiBub24tcmVjdXJzaXZlIFBNX1RBR0dF RAoKIyBSZW1haW5pbmcgZmxhZ3MgZG8gbm90IGNvcnJlc3BvbmQgZGlyZWN0bHkgdG8gY29tbWFu ZCBsaW5lIHN3aXRjaGVzCiAkKCgxPDwxNykpCVBNX0RPTlRJTVBPUlRfU1VJRAkjIGRvIG5vdCBp bXBvcnQgaWYgcnVubmluZyBzZXR1aWQKIyAkKCgxPDwxNykpCVBNX0xPQURESVIJIyAoZnVuY3Rp b24pIGZpbGVuYW1lIGdpdmVzIGxvYWQgZGlyZWN0b3J5CiAkKCgxPDwxOCkpCVBNX1NJTkdMRQkj IHNwZWNpYWwgY2FuIG9ubHkgaGF2ZSBhIHNpbmdsZSBpbnN0YW5jZQogJCgoMTw8MTgpKQlQTV9B Tk9OWU1PVVMJIyAoZnVuY3Rpb24pIGFub255bW91cyBmdW5jdGlvbgogJCgoMTw8MTkpKQlQTV9M T0NBTAkjIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgbWFkZSBsb2NhbAojICQoKDE8PDE5KSkJUE1f S1NIU1RPUkVECSMgKGZ1bmN0aW9uKSBzdG9yZWQgaW4ga3NoIGZvcm0KICQoKDE8PDIwKSkJUE1f U1BFQ0lBTAkjIHNwZWNpYWwgYnVpbHRpbiBwYXJhbWV0ZXIKIyAkKCgxPDwyMCkpCVBNX1pTSFNU T1JFRAkjIChmdW5jdGlvbikgc3RvcmVkIGluIHpzaCBmb3JtCiAkKCgxPDwyMSkpCVBNX1JPX0JZ X0RFU0lHTgkjIHNwZWNpYWxzIHRoYXQgY2FuIGJlIG1hZGUgcmVhZC1vbmx5IGJ5IHVzZXIKIyMk KCgoMTw8MjApfCgxPDwxMCl8KDE8PDIxKSkpIFBNX1JFQURPTkxZX1NQRUNJQUwKIyAkKCgxPDwy MikpCVBNX0RPTlRJTVBPUlQJIyBkbyBub3QgaW1wb3J0IHRoaXMgdmFyaWFibGUKICQoKDE8PDIy KSkJUE1fREVDTEFSRUQJIyBleHBsaWNpdGx5IG5hbWVkIHdpdGggdHlwZXNldAogJCgoMTw8MjMp KQlQTV9SRVNUUklDVEVECSMgY2Fubm90IGJlIGNoYW5nZWQgaW4gcmVzdHJpY3RlZCBtb2RlCiAk KCgxPDwyNCkpCVBNX1VOU0VUCSMgaGFzIG51bGwgdmFsdWUKIyMkKCgoMTw8MjIpfCgxPDwyNCkp KSBQTV9ERUZBVUxURUQKICQoKDE8PDI1KSkJUE1fUkVNT1ZBQkxFCSMgc3BlY2lhbCBjYW4gYmUg cmVtb3ZlZCBmcm9tIHBhcmFtdGFiCiAkKCgxPDwyNikpCVBNX0FVVE9MT0FECSMgYXV0b2xvYWRl ZCBmcm9tIG1vZHVsZQogJCgoMTw8MjcpKQlQTV9OT1JFU1RPUkUJIyBkbyBub3QgcmVzdG9yZSB2 YWx1ZSBvZiBsb2NhbCBzcGVjaWFsCiAkKCgxPDwyNykpCVBNX0FVVE9BTEwJIyBhdXRvbG9hZCBh bGwgZmVhdHVyZXMgaW4gbW9kdWxlCiAkKCgxPDwyOCkpCVBNX0hBU0hFTEVNCSMgaXMgYSBoYXNo LWVsZW1lbnQKICQoKDE8PDI5KSkJUE1fTkFNRURESVIJIyBoYXMgYSBjb3JyZXNwb25kaW5nIG5h bWVkZGlydGFiIGVudHJ5CiAkKCgxPDwzMCkpCVBNX05BTUVSRUYJIyBwb2ludGVyIHRvIGEgZGlm ZmVyZW50IHBhcmFtZXRlcgopCmxvY2FsIC1BSFBydCBjaGFydG9rZW5zPSgKIG1hcGJhc2UgaW50 ZWdlcgogJCgoODMpKQlNZXRhCiAkKCg4NCkpCVBvdW5kCiAkKCg4NSkpCVN0cmluZwogJCgoODYp KQlIYXQKICQoKDg3KSkJU3RhcgogJCgoODgpKQlJbnBhcgogJCgoODkpKQlJbnBhcm1hdGgKICQo KDkwKSkJT3V0YnJhY2UKICQoKDkxKSkJSW5icmFjawogJCgoOTIpKQlPdXRicmFjawogJCgoOTMp KQlUaWNrCiAkKCg5NCkpCUluYW5nCiAkKCg5NSkpCU91dGFuZwogJCgoOTYpKQlPdXRhbmdQcm9j CiAkKCg5NykpCVF1ZXN0CiAkKCg5OCkpCVRpbGRlCiAkKCg5OSkpCVF0aWNrCiAkKChhMCkpCUJu dWxsa2VlcAogJCgoYTEpKQlOdWxhcmcKICQoKGEyKSkJTWFya2VyCikKbG9jYWwgLUFIUHJ0IGZk dGFibGV0eXBlPSgKIG1hcGJhc2UgaW50ZWdlcgogJCgoMCkpCQlGRFRfVU5VU0VECiAkKCgxKSkJ CUZEVF9JTlRFUk5BTAogJCgoMikpCQlGRFRfRVhURVJOQUwKICQoKDMpKQkJRkRUX01PRFVMRQog JCgoNCkpCQlGRFRfWFRSQUNFCiAkKCg1KSkJCUZEVF9GTE9DSwogJCgoNikpCQlGRFRfRkxPQ0tf RVhFQwogJCgoNykpCQlGRFRfUFJPQ19TVUJTVAopCmxvY2FsIC1BSFBydCBpbnB1dHN0YXRlcz0o CiBtYXBiYXNlIDIKICQoKDE8PDApKQlJTlBfRlJFRQogJCgoMTw8MSkpCUlOUF9BTElBUwogJCgo MTw8MikpCUlOUF9ISVNUCiAkKCgxPDwzKSkJSU5QX0NPTlQKICQoKDE8PDQpKQlJTlBfQUxDT05U CiAkKCgxPDw1KSkJSU5QX0hJU1RDT05UCikKbG9jYWwgLUFIUHJ0IG1ldGFmeXR5cGVzPSgKIG1h cGJhc2UgaW50ZWdlcgogJCgoMCkpCU1FVEFfUkVBTExPQwogJCgoMSkpCU1FVEFfVVNFSEVBUAog JCgoMikpCU1FVEFfU1RBVElDCiAkKCgzKSkJTUVUQV9EVVAKICQoKDQpKQlNRVRBX0FMTE9DCiAk KCg1KSkJTUVUQV9OT0FMTE9DCiAkKCg2KSkJTUVUQV9IRUFQRFVQCiAkKCg3KSkJTUVUQV9IUkVB TExPQwopCmxvY2FsIC1BSFBydCBqb2J0eXBlcz0oCiBtYXBiYXNlIDIKICQoKDE8PDApKQlaX1RJ TUVECQkjIHBpcGVsaW5lIGlzIGJlaW5nIHRpbWVkCiAkKCgxPDwxKSkJWl9TWU5DCQkjIHJ1biB0 aGlzIHN1Ymxpc3Qgc3luY2hyb25vdXNseSAgICAgICAoOykKICQoKDE8PDIpKQlaX0FTWU5DCQkj IHJ1biB0aGlzIHN1Ymxpc3QgYXN5bmNocm9ub3VzbHkgICAgICAoJikKICQoKDE8PDMpKQlaX0RJ U09XTgkjIHJ1biB0aGlzIHN1Ymxpc3Qgd2l0aG91dCBqb2IgY29udHJvbCAoJnwpCiAkKCgxPDw0 KSkJWl9FTkQKICQoKDE8PDUpKQlaX1NJTVBMRQopCmxvY2FsIC1BSFBydCBjb25kdHlwZXM9KAog bWFwYmFzZSBpbnRlZ2VyCiAkKCgwKSkJCUNPTkRfTk9UCiAkKCgxKSkJCUNPTkRfQU5ECiAkKCgy KSkJCUNPTkRfT1IKICQoKDMpKQkJQ09ORF9TVFJFUQogJCgoNCkpCQlDT05EX1NUUkRFUQogJCgo NSkpCQlDT05EX1NUUk5FUQogJCgoNikpCQlDT05EX1NUUkxUCiAkKCg3KSkJCUNPTkRfU1RSR1RS CiAkKCg4KSkJCUNPTkRfTlQKICQoKDkpKQkJQ09ORF9PVAogJCgoMTApKQlDT05EX0VGCiAkKCgx MSkpCUNPTkRfRVEKICQoKDEyKSkJQ09ORF9ORQogJCgoMTMpKQlDT05EX0xUCiAkKCgxNCkpCUNP TkRfR1QKICQoKDE1KSkJQ09ORF9MRQogJCgoMTYpKQlDT05EX0dFCiAkKCgxNykpCUNPTkRfUkVH RVgKICQoKDE4KSkJQ09ORF9NT0QKICQoKDE5KSkJQ09ORF9NT0RJCikKbG9jYWwgLUFIUHJ0IHdv cmRjb2Rlcz0oCiBtYXBiYXNlIGludGVnZXIKICQoKDEpKQkJV0NfTElTVAogJCgoMikpCQlXQ19T VUJMSVNUCiAkKCgzKSkJCVdDX1BJUEUKICQoKDQpKQkJV0NfUkVESVIKICQoKDUpKQkJV0NfQVNT SUdOCiAkKCg2KSkJCVdDX1NJTVBMRQogJCgoNykpCQlXQ19UWVBFU0VUCiAkKCg4KSkJCVdDX1NV QlNICiAkKCg5KSkJCVdDX0NVUlNICiAkKCgxMCkpCVdDX1RJTUVECiAkKCgxMSkpCVdDX0ZVTkNE RUYKICQoKDEyKSkJV0NfRk9SCiAkKCgxMykpCVdDX1NFTEVDVAogJCgoMTQpKQlXQ19XSElMRQog JCgoMTUpKQlXQ19SRVBFQVQKICQoKDE2KSkJV0NfQ0FTRQogJCgoMTcpKQlXQ19JRgogJCgoMTgp KQlXQ19DT05ECiAkKCgxOSkpCVdDX0FSSVRICiAkKCgyMCkpCVdDX0FVVE9GTgogJCgoMjEpKQlX Q19UUlkKICQoKDIyKSkJV0NfQ09VTlQKKQpsb2NhbCAtQUhQcnQgd2NzdWJsaXN0cz0oCiBtYXBi YXNlIDEwCiAkKCgwKSkJCVdDX1NVQkxJU1RfRU5ECiAkKCgxKSkJCVdDX1NVQkxJU1RfQU5ECiAk KCgyKSkJCVdDX1NVQkxJU1RfT1IKICQoKDQpKQkJV0NfU1VCTElTVF9DT1BST0MKICQoKDgpKQkJ V0NfU1VCTElTVF9OT1QKICQoKDE2KSkJV0NfU1VCTElTVF9TSU1QTEUKKQpsb2NhbCAtQUhQcnQg ZXByb2dzdGF0ZXM9KAogbWFwYmFzZSAxMAogJCgoMSkpCUVGX1JFQUwKICQoKDIpKQlFRl9IRUFQ CiAkKCg0KSkJRUZfTUFQCiAkKCg4KSkJRUZfUlVOCikKbG9jYWwgLUFIUHJ0IGJ1aWx0aW50eXBl cz0oCiBtYXBiYXNlIDIKICQoKDE8PDEpKQlCSU5GX1BMVVNPUFRTCSMgK3h5eiBsZWdhbAogJCgo MTw8MikpCUJJTkZfUFJJTlRPUFRTCiAkKCgxPDwzKSkJQklORl9BRERFRAkjIGlzIGluIHRoZSBi dWlsdGlucyBoYXNoIHRhYmxlCiAkKCgxPDw1KSkJQklORl9QUkVGSVgKICQoKDE8PDYpKQlCSU5G X0RBU0gKICQoKDE8PDcpKQlCSU5GX0JVSUxUSU4KICQoKDE8PDgpKQlCSU5GX0NPTU1BTkQKICQo KDE8PDkpKQlCSU5GX0VYRUMKICQoKDE8PDEwKSkJQklORl9OT0dMT0IKICQoKDE8PDExKSkJQklO Rl9QU1BFQ0lBTAogJCgoMTw8MTIpKQlCSU5GX1NLSVBJTlZBTElECSMgVHJlYXQgaW52YWxpZCBv cHRpb24gYXMgYXJndW1lbnQKICQoKDE8PDEzKSkJQklORl9LRUVQTlVNCSMgYFstK11OVU0nIGNh biBiZSBhbiBvcHRpb24KICQoKDE8PDE0KSkJQklORl9TS0lQREFTSAkjIFRyZWF0IGAtJyBhcyBh cmd1bWVudCAobWF5YmUgYCsnKQogJCgoMTw8MTUpKQlCSU5GX0RBU0hEQVNIVkFMSUQJIyBIYW5k bGUgYC0tJyBldmVuIGlmIFNLSVBJTlZBTEQKICQoKDE8PDE2KSkJQklORl9DTEVBUkVOVgkjIG5l dyBwcm9jZXNzIHN0YXJ0ZWQgd2l0aCBjbGVhcmVkIGVudgogJCgoMTw8MTcpKQlCSU5GX0FVVE9B TEwJIyBhdXRvbG9hZCBhbGwgZmVhdHVyZXMgYXQgb25jZQogJCgoMTw8MTgpKQlCSU5GX0hBTkRM RVNfT1BUUwogJCgoMTw8MTkpKQlCSU5GX0FTU0lHTgopCmxvY2FsIC1BSFBydCBwYXRmbGFncz0o CiBtYXBiYXNlIDE2CiAkKCgweDAwMDApKQlQQVRfSEVBUERVUAkjIER1bW15IGZsYWcgZm9yIGRl ZmF1bHQgYmVoYXZpb3IKICQoKDB4MDAwMSkpCVBBVF9GSUxFCSMgUGF0dGVybiBpcyBhIGZpbGUg bmFtZQogJCgoMHgwMDAyKSkJUEFUX0ZJTEVUCSMgUGF0dGVybiBpcyB0b3AgbGV2ZWwgZmlsZSwg YWZmZWN0cyB+CiAkKCgweDAwMDQpKQlQQVRfQU5ZCSMgTWF0Y2ggYW55dGhpbmcgKGNoZWFwICIq IikKICQoKDB4MDAwOCkpCVBBVF9OT0FOQ0gJIyBOb3QgYW5jaG9yZWQgYXQgZW5kCiAkKCgweDAw MTApKQlQQVRfTk9HTEQJIyBEb24ndCBnbG9iIGRvdHMKICQoKDB4MDAyMCkpCVBBVF9QVVJFUwkj IFBhdHRlcm4gaXMgYSBwdXJlIHN0cmluZzogc2V0IGludGVybmFsbHkKICQoKDB4MDA0MCkpCVBB VF9TVEFUSUMJIyBEb24ndCBjb3B5IHBhdHRlcm4gdG8gaGVhcCBhcyBwZXIgZGVmYXVsdAogJCgo MHgwMDgwKSkJUEFUX1NDQU4JIyBTY2FubmluZywgc28gZG9uJ3QgdHJ5IG11c3QtbWF0Y2ggdGVz dAogJCgoMHgwMjAwKSkJUEFUX05PVFNUQVJUCSMgU3RhcnQgb2Ygc3RyaW5nIGlzIG5vdCByZWFs IHN0YXJ0CiAkKCgweDA0MDApKQlQQVRfTk9URU5ECSMgRW5kIG9mIHN0cmluZyBpcyBub3QgcmVh bCBlbmQKICQoKDB4MDgwMCkpCVBBVF9IQVNfRVhDTFVEUAkjIChpbnRlcm5hbCk6IHRvcC1sZXZl bCBwYXRoMX5wYXRoMi4KKQpsb2NhbCAtQUhQcnQgcGF0Y2xhc3Nlcz0oCiBtYXBiYXNlIGludGVn ZXIKICQoKDEpKQkJUFBfRklSU1QKICQoKDEpKQkJUFBfQUxQSEEKICQoKDIpKQkJUFBfQUxOVU0K ICQoKDMpKQkJUFBfQVNDSUkKICQoKDQpKQkJUFBfQkxBTksKICQoKDUpKQkJUFBfQ05UUkwKICQo KDYpKQkJUFBfRElHSVQKICQoKDcpKQkJUFBfR1JBUEgKICQoKDgpKQkJUFBfTE9XRVIKICQoKDkp KQkJUFBfUFJJTlQKICQoKDEwKSkJUFBfUFVOQ1QKICQoKDExKSkJUFBfU1BBQ0UKICQoKDEyKSkJ UFBfVVBQRVIKICQoKDEzKSkJUFBfWERJR0lUCiAkKCgxNCkpCVBQX0lERU5UCiAkKCgxNSkpCVBQ X0lGUwogJCgoMTYpKQlQUF9JRlNTUEFDRQogJCgoMTcpKQlQUF9XT1JECiAkKCgxOCkpCVBQX0lO Q09NUExFVEUKICQoKDE5KSkJUFBfSU5WQUxJRAogJCgoMTkpKQlQUF9MQVNUCiAkKCgyMCkpCVBQ X1VOS1dOCiAkKCgyMSkpCVBQX1JBTkdFCikKbG9jYWwgLUFIUHJ0IGdsb2Jtb2RpZmllcnM9KAog bWFwYmFzZSAxNgogJCgoMHgwMTAwKSkJR0ZfTENNQVRDSFVDCiAkKCgweDAyMDApKQlHRl9JR05D QVNFCiAkKCgweDA0MDApKQlHRl9CQUNLUkVGCiAkKCgweDA4MDApKQlHRl9NQVRDSFJFRgogJCgo MHgxMDAwKSkJR0ZfTVVMVElCWVRFCSMgVXNlIG11bHRpYnl0ZSBpZiBzdXBwb3J0ZWQgYnkgYnVp bGQKKQpsb2NhbCAtQUhQcnQgc2NhbnBhcmFtZmxhZ3M9KAogbWFwYmFzZSAyCiAkKCgxPDwwKSkJ U0NBTlBNX1dBTlRWQUxTCSMgUmV0dXJuIHZhbHVlIGluY2x1ZGVzIGhhc2ggdmFsdWVzCiAkKCgx PDwxKSkJU0NBTlBNX1dBTlRLRVlTCSMgUmV0dXJuIHZhbHVlIGluY2x1ZGVzIGhhc2gga2V5cwog JCgoMTw8MikpCVNDQU5QTV9XQU5USU5ERVgJIyBSZXR1cm4gdmFsdWUgaW5jbHVkZXMgYXJyYXkg aW5kZXgKICQoKDE8PDMpKQlTQ0FOUE1fTUFUQ0hLRVkJIyBTdWJzY3JpcHQgbWF0Y2hlZCBhZ2Fp bnN0IGtleQogJCgoMTw8NCkpCVNDQU5QTV9NQVRDSFZBTAkjIFN1YnNjcmlwdCBtYXRjaGVkIGFn YWluc3QgdmFsdWUKICQoKDE8PDUpKQlTQ0FOUE1fTUFUQ0hNQU5ZCSMgU3Vic2NyaXB0IG1hdGNo ZWQgcmVwZWF0ZWRseSwgcmV0dXJuIGFsbAogJCgoMTw8NikpCVNDQU5QTV9BU1NJR05JTkcJIyBB c3NpZ25pbmcgd2hvbGUgYXJyYXkvaGFzaAogJCgoMTw8NykpCVNDQU5QTV9LRVlNQVRDSAkjIGtl eXMgb2YgaGFzaCB0cmVhdGVkIGFzIHBhdHRlcm5zCiAkKCgxPDw4KSkJU0NBTlBNX0RRVU9URUQJ IyBzdWJzdGl0dXRpb24gd2FzIGRvdWJsZS1xdW90ZWQKICQoKDE8PDkpKQlTQ0FOUE1fQVJST05M WQkjIHZhbHVlIGlzIGFycmF5IGJ1dCB3ZSBkb24ndAogJCgoMTw8MTApKQlTQ0FOUE1fQ0hFQ0tJ TkcJIyBDaGVjayBpZiBzZXQsIG5vIG5lZWQgdG8gY3JlYXRlCiAkKCgxPDwxMSkpCVNDQU5QTV9O T0VYRUMJIyBObyBjb21tYW5kIHN1YnN0aXR1dGlvbnMsIGV0Yy4KKQpsb2NhbCAtQUhQcnQgc3Vi c3Rtb2RpZmllcnM9KAogbWFwYmFzZSAxNgogJCgoMHgwMDAxKSkJU1VCX0VORAkjIG1hdGNoIGVu ZCBpbnN0ZWFkIG9mIGJlZ2lubmluZywgJSBvciAlJQogJCgoMHgwMDAyKSkJU1VCX0xPTkcJIyAl IG9yICMgZG91YmxlZCwgZ2V0IGxvbmdlc3QgbWF0Y2gKICQoKDB4MDAwNCkpCVNVQl9TVUJTVFIJ IyBtYXRjaCBhIHN1YnN0cmluZwogJCgoMHgwMDA4KSkJU1VCX01BVENICSMgaW5jbHVkZSB0aGUg bWF0Y2hlZCBwb3J0aW9uCiAkKCgweDAwMTApKQlTVUJfUkVTVAkjIGluY2x1ZGUgdGhlIHVubWF0 Y2hlZCBwb3J0aW9uCiAkKCgweDAwMjApKQlTVUJfQklORAkjIGluZGV4IG9mIGJlZ2lubmluZyBv ZiBzdHJpbmcKICQoKDB4MDA0MCkpCVNVQl9FSU5ECSMgaW5kZXggb2YgZW5kIG9mIHN0cmluZwog JCgoMHgwMDgwKSkJU1VCX0xFTgkJIyBsZW5ndGggb2YgbWF0Y2gKICQoKDB4MDEwMCkpCVNVQl9B TEwJCSMgbWF0Y2ggY29tcGxldGUgc3RyaW5nCiAkKCgweDAyMDApKQlTVUJfR0xPQkFMCSMgZ2xv YmFsIHN1YnN0aXR1dGlvbiAkey4uLy9hbGwvdGhlc2V9CiAkKCgweDA0MDApKQlTVUJfRE9TVUJT VAkjIHJlcGxhY2VtZW50IHN0cmluZyBuZWVkcyBzdWJzdGl0dXRpbmcKICQoKDB4NDAwMCkpCVNV Ql9FR0xPQgkjIHVzZSBleHRlbmRlZCBnbG9iYmluZyBpbiBwYXR0ZXJucwopCmxvY2FsIC1BSFBy dCBwcmludG5vZGVmbGFncz0oCiBtYXBiYXNlIDIKICQoKDE8PDApKQlQUklOVF9OQU1FT05MWQog JCgoMTw8MSkpCVBSSU5UX1RZUEUKICQoKDE8PDIpKQlQUklOVF9MSVNUCiAkKCgxPDwzKSkJUFJJ TlRfS1ZfUEFJUgogJCgoMTw8NCkpCVBSSU5UX0lOQ0xVREVWQUxVRQogJCgoMTw8NSkpCVBSSU5U X1RZUEVTRVQKICQoKDE8PDYpKQlQUklOVF9MSU5FCiAkKCgxPDw3KSkJUFJJTlRfUE9TSVhfRVhQ T1JUCiAkKCgxPDw4KSkJUFJJTlRfUE9TSVhfUkVBRE9OTFkKICQoKDE8PDcpKQlQUklOVF9XSEVO Q0VfQ1NICiAkKCgxPDw4KSkJUFJJTlRfV0hFTkNFX1ZFUkJPU0UKICQoKDE8PDkpKQlQUklOVF9X SEVOQ0VfU0lNUExFCiAkKCgxPDwxMCkpCVBSSU5UX1dIRU5DRV9GVU5DREVGCiAkKCgxPDwxMSkp CVBSSU5UX1dIRU5DRV9XT1JECikKbG9jYWwgLUFIUHJ0IHNhdmVoaXN0ZmxhZ3M9KAogbWFwYmFz ZSAxNgogJCgoMHgwMDAwMDAwMSkpCUhJU1RfTUFLRVVOSVFVRQkjIEtpbGwgdGhpcyBuZXcgZW50 cnkgaWYgbm90IHVuaXF1ZQogJCgoMHgwMDAwMDAwMikpCUhJU1RfT0xECSMgQ29tbWFuZCBpcyBh bHJlYWR5IHdyaXR0ZW4gdG8gZGlzawogJCgoMHgwMDAwMDAwNCkpCUhJU1RfUkVBRAkjIENvbW1h bmQgd2FzIHJlYWQgYmFjayBmcm9tIGRpc2sKICQoKDB4MDAwMDAwMDgpKQlISVNUX0RVUAkjIENv bW1hbmQgZHVwbGljYXRlcyBhIGxhdGVyIGxpbmUKICQoKDB4MDAwMDAwMTApKQlISVNUX0ZPUkVJ R04JIyBDb21tYW5kIGNhbWUgZnJvbSBhbm90aGVyIHNoZWxsCiAkKCgweDAwMDAwMDIwKSkJSElT VF9UTVBTVE9SRQkjIEtpbGwgd2hlbiB1c2VyIGVudGVycyBhbm90aGVyIGNtZAogJCgoMHgwMDAw MDA0MCkpCUhJU1RfTk9XUklURQkjIEtlZXAgaW50ZXJuYWxseSBidXQgZG9uJ3Qgd3JpdGUKKQps b2NhbCAtQUhQcnQgaGlzdGZsYWdzPSgKIG1hcGJhc2UgMTAKICQoKDEpKQlISVNURkxBR19ET05F CiAkKCgyKSkJSElTVEZMQUdfTk9FWEVDCiAkKCg0KSkJSElTVEZMQUdfUkVDQUxMCiAkKCg4KSkJ SElTVEZMQUdfU0VUVFkKKQpsb2NhbCAtQUhQcnQgaGlzdGZpbGVmbGFncz0oCiBtYXBiYXNlIDE2 CiAkKCgweDAwMDEpKQlIRklMRV9BUFBFTkQKICQoKDB4MDAwMikpCUhGSUxFX1NLSVBPTEQKICQo KDB4MDAwNCkpCUhGSUxFX1NLSVBEVVBTCiAkKCgweDAwMDgpKQlIRklMRV9TS0lQRk9SRUlHTgog JCgoMHgwMDEwKSkJSEZJTEVfRkFTVAogJCgoMHgwMDIwKSkJSEZJTEVfTk9fUkVXUklURQogJCgo MHg4MDAwKSkJSEZJTEVfVVNFX09QVElPTlMKKQpsb2NhbCAtQUhQcnQgbW9kbG9hZGZsYWdzPSgK IG1hcGJhc2UgMgogJCgoMTw8MCkpCU1PRF9CVVNZCiAkKCgxPDwxKSkJTU9EX1VOTE9BRAogJCgo MTw8MikpCU1PRF9TRVRVUAogJCgoMTw8MykpCU1PRF9MSU5LRUQKICQoKDE8PDQpKQlNT0RfSU5J VF9TCiAkKCgxPDw1KSkJTU9EX0lOSVRfQgogJCgoMTw8NikpCU1PRF9BTElBUwopCmxvY2FsIC1B SFBydCBtb2Rjb25kZmxhZ3M9KAogbWFwYmFzZSAxMAogJCgoMSkpCUNPTkRGX0lORklYCiAkKCgy KSkJQ09OREZfQURERUQKICQoKDQpKQlDT05ERl9BVVRPQUxMCikKbG9jYWwgLUFIUHJ0IG1hdGhm dW5jdHlwZXM9KAogbWFwYmFzZSAxMAogJCgoMSkpCU1GRl9TVFIKICQoKDIpKQlNRkZfQURERUQK ICQoKDQpKQlNRkZfVVNFUkZVTkMKICQoKDgpKQlNRkZfQVVUT0FMTAopCmxvY2FsIC1BSFBydCBs ZXhmbGFncz0oCiBtYXBiYXNlIDE2CiAkKCgweDAwMDEpKQlMRVhGTEFHU19BQ1RJVkUKICQoKDB4 MDAwMikpCUxFWEZMQUdTX1pMRQogJCgoMHgwMDA0KSkJTEVYRkxBR1NfQ09NTUVOVFNfS0VFUAog JCgoMHgwMDA4KSkJTEVYRkxBR1NfQ09NTUVOVFNfU1RSSVAKICQoKDB4MDAxMCkpCUxFWEZMQUdT X05FV0xJTkUKKQpsb2NhbCAtQUhQcnQgbGV4c3RhdGVzPSgKIG1hcGJhc2UgaW50ZWdlcgogJCgo MCkpCUlOX05PVEhJTkcKICQoKDEpKQlJTl9DTUQKICQoKDIpKQlJTl9NQVRICiAkKCgzKSkJSU5f Q09ORAogJCgoNCkpCUlOX0VOVgogJCgoNSkpCUlOX1BBUgopCmxvY2FsIC1BSFBydCBlbXVsYXRp b25zPSgKIG1hcGJhc2UgMgogJCgoMTw8MSkpCUVNVUxBVEVfQ1NICSMgQyBzaGVsbAogJCgoMTw8 MikpCUVNVUxBVEVfS1NICSMgS29ybiBzaGVsbAogJCgoMTw8MykpCUVNVUxBVEVfU0gJIyBCb3Vy bmUgc2hlbGwKICQoKDE8PDQpKQlFTVVMQVRFX1pTSAkjIGBuYXRpdmUnIG1vZGUKKQpsb2NhbCAt QUhQcnQgdGVybWluYWx0eXBlcz0oCiBtYXBiYXNlIDE2CiAkKCgweDAxKSkJVEVSTV9CQUQJIyB0 ZXJtaW5hbCBoYXMgZXh0cmVtZWx5IGJhc2ljIGNhcGFiaWxpdGllcwogJCgoMHgwMikpCVRFUk1f VU5LTk9XTgkjIHVua25vd24gdGVybWluYWwgdHlwZQogJCgoMHgwNCkpCVRFUk1fTk9VUAkjIHRl cm1pbmFsIGhhcyBubyB1cCBjYXBhYmlsaXR5CiAkKCgweDA4KSkJVEVSTV9TSE9SVAkjIHRlcm1p bmFsIGlzIDwgMyBsaW5lcyBoaWdoCiAkKCgweDEwKSkJVEVSTV9OQVJST1cJIyB0ZXJtaW5hbCBp cyA8IDMgY29sdW1ucyB3aWRlCikKbG9jYWwgLUFIUHJ0IHRlcm1jYXBhY3RzPSgKIG1hcGJhc2Ug aW50ZWdlcgogJCgoMCkpCQlUQ0NMRUFSU0NSRUVOCiAkKCgxKSkJCVRDTEVGVAogJCgoMikpCQlU Q01VTFRMRUZUCiAkKCgzKSkJCVRDUklHSFQKICQoKDQpKQkJVENNVUxUUklHSFQKICQoKDUpKQkJ VENVUAogJCgoNikpCQlUQ01VTFRVUAogJCgoNykpCQlUQ0RPV04KICQoKDgpKQkJVENNVUxURE9X TgogJCgoOSkpCQlUQ0RFTAogJCgoMTApKQlUQ01VTFRERUwKICQoKDExKSkJVENJTlMKICQoKDEy KSkJVENNVUxUSU5TCiAkKCgxMykpCVRDQ0xFQVJFT0QKICQoKDE0KSkJVENDTEVBUkVPTAogJCgo MTUpKQlUQ0lOU0xJTkUKICQoKDE2KSkJVENERUxMSU5FCiAkKCgxNykpCVRDTkVYVFRBQgogJCgo MTgpKQlUQ0JPTERGQUNFQkVHCiAkKCgxOSkpCVRDRkFJTlRCRUcKICQoKDIwKSkJVENTVEFORE9V VEJFRwogJCgoMjEpKQlUQ1VOREVSTElORUJFRwogJCgoMjIpKQlUQ0lUQUxJQ1NCRUcKICQoKDIz KSkJVENBTExBVFRSU09GRgogJCgoMjQpKQlUQ1NUQU5ET1VURU5ECiAkKCgyNSkpCVRDVU5ERVJM SU5FRU5ECiAkKCgyNikpCVRDSVRBTElDU0VORAogJCgoMjcpKQlUQ0hPUklaUE9TCiAkKCgyOCkp CVRDVVBDVVJTT1IKICQoKDI5KSkJVENET1dOQ1VSU09SCiAkKCgzMCkpCVRDTEVGVENVUlNPUgog JCgoMzEpKQlUQ1JJR0hUQ1VSU09SCiAkKCgzMikpCVRDU0FWRUNVUlNPUgogJCgoMzMpKQlUQ1JF U1RSQ1VSU09SCiAkKCgzNCkpCVRDQkFDS1NQQUNFCiAkKCgzNSkpCVRDRkdDT0xPVVIKICQoKDM2 KSkJVENCR0NPTE9VUgopCmxvY2FsIC1BSFBydCBjbWRzdGFja3N0YXRlcz0oCiBtYXBiYXNlIGlu dGVnZXIKICQoKDApKQkJQ1NfRk9SCiAkKCgxKSkJCUNTX1dISUxFCiAkKCgyKSkJCUNTX1JFUEVB VAogJCgoMykpCQlDU19TRUxFQ1QKICQoKDQpKQkJQ1NfVU5USUwKICQoKDUpKQkJQ1NfSUYKICQo KDYpKQkJQ1NfSUZUSEVOCiAkKCg3KSkJCUNTX0VMU0UKICQoKDgpKQkJQ1NfRUxJRgogJCgoOSkp CQlDU19NQVRICiAkKCgxMCkpCUNTX0NPTkQKICQoKDExKSkJQ1NfQ01ET1IKICQoKDEyKSkJQ1Nf Q01EQU5ECiAkKCgxMykpCUNTX1BJUEUKICQoKDE0KSkJQ1NfRVJSUElQRQogJCgoMTUpKQlDU19G T1JFQUNICiAkKCgxNikpCUNTX0NBU0UKICQoKDE3KSkJQ1NfRlVOQ0RFRgogJCgoMTgpKQlDU19T VUJTSAogJCgoMTkpKQlDU19DVVJTSAogJCgoMjApKQlDU19BUlJBWQogJCgoMjEpKQlDU19RVU9U RQogJCgoMjIpKQlDU19EUVVPVEUKICQoKDIzKSkJQ1NfQlFVT1RFCiAkKCgyNCkpCUNTX0NNRFNV QlNUCiAkKCgyNSkpCUNTX01BVEhTVUJTVAogJCgoMjYpKQlDU19FTElGVEhFTgogJCgoMjcpKQlD U19IRVJFRE9DCiAkKCgyOCkpCUNTX0hFUkVET0NECiAkKCgyOSkpCUNTX0JSQUNFCiAkKCgzMCkp CUNTX0JSQUNFUEFSCiAkKCgzMSkpCUNTX0FMV0FZUwogJCgoMzIpKQlDU19DT1VOVAopCgp6bW9k bG9hZCB6c2gvcGFyYW1ldGVyCmxvY2FsIHNlZWs9JHtwYXJhbWV0ZXJzW3BhcmFtZmxhZ3NdfQoK aWYgW1sgJDEgPSAofC0pLWgofGVscCkgXV0KdGhlbgogIHByaW50IC11MiBVc2FnZToKICBwcmlu dCAtdTIgIiAgcHJpbnRkZWZpbmVzIFsgY2F0ZWdvcnkgXSBbIG5hbWUgfCB2YWx1ZSBdIgogIHNo aWZ0CmZpCgppZiBbWyAteiAkMSBdXQp0aGVuCiAgcHJpbnQgLXUyICJDaG9vc2UgY2F0ZWdvcnk6 IgogIHByaW50IC11MiAtYUMzIC0tICR7KG9rKXBhcmFtZXRlcnNbKFIpJHNlZWtdfQogIHJldHVy biAxCmZpCgpsb2NhbCAtYSBvdXRmbGFnCgppZiBbWyAteiAkcGFyYW1ldGVyc1skMV0gfHwgJHBh cmFtZXRlcnNbJDFdICE9ICRzZWVrIF1dCnRoZW4KICBsb2NhbCAtbiBzY2FuCiAgZm9yIHNjYW4g aW4gJHsoaylwYXJhbWV0ZXJzWyhSKSRzZWVrXX0KICBkbwogICAgaWYgW1sgLW4gJHtzY2FuWyhS KSQxXX0gXV0KICAgIHRoZW4KICAgICAgbG9jYWwgLWEgaGl0cwogICAgICBzZXQgLUEgaGl0cyAk eyR7KG5rKXNjYW5bKFIpJH4xXX06I21hcGJhc2V9CiAgICAgIGludGVnZXIgLWkgJHtzY2FuW21h cGJhc2VdL2ludGVnZXIvMTB9IHc9JHtoaXRzWy0xXX0KICAgICAgaW50ZWdlciB4PSR7IyR7c2Nh blttYXBiYXNlXS9pbnRlZ2VyL319KzIKICAgICAgd2hpbGUgKCgkI2hpdHMpKQogICAgICBkbwoJ aWYgW1sgJHNjYW5bbWFwYmFzZV0gPSAyIF1dCgl0aGVuCgkgIHc9JHtoaXRzWzFdfQoJICBsb2Nh bCAraSBmbGFnICAKCSAgaWYgKCggdyApKQoJICB0aGVuCgkgICAgcHJpbnRmIC12IGZsYWcgJzE8 PCVkXHQlcycgJCgoJHsjd30gLSB4KSkgICRoaXRzWzFdCgkgIGVsc2UKCSAgICBwcmludGYgLXYg ZmxhZyAnMDw8MFx0JXMnICRoaXRzWzFdCgkgIGZpCgllbHNlCgkgIGludGVnZXIgLWkgJHtzY2Fu W21hcGJhc2VdL2ludGVnZXIvMTB9IC1aICR7I3d9IGZsYWc9JHtoaXRzWzFdfQoJZmkKCW91dGZs YWcrPSgkc2NhblskaGl0c1sxXV0gJGZsYWcgKQogICAgICAgIHNoaWZ0IGhpdHMKICAgICAgZG9u ZQogICAgICBsb2NhbCArbiBzY2FuCSMgJHshc2Nhbn0KICAgICAgcHJpbnQgLWFDMiAtLSAiLS0t ICRzY2FuIiAtLS0gJG91dGZsYWcKICAgICAgbG9jYWwgLW4gc2NhbgogICAgICBvdXRmbGFnPSgp CiAgICBmaQogIGRvbmUKICByZXR1cm4gMApmaQoKbG9jYWwgLW4gcmVmPSQxCgppZiBbWyAkMiA9 IDwtPiBdXQp0aGVuCiAgaW50ZWdlciBpPSQyCiAgaW50ZWdlciBmbGFnCiAgaWYgW1sgJHJlZltt YXBiYXNlXSA9IGludGVnZXIgXV0KICB0aGVuCiAgICBpZiAoKCAoaSAtPSAkeyR7cmVmWyQyXTor JDJ9Oi0wfSkgPT0gMCApKQogICAgdGhlbgogICAgICBvdXRmbGFnPSgkcmVmWyQyXSkKICAgIGZp CiAgZWxzZQogICAgZm9yIGZsYWcgaW4gJHskeyhuaylyZWZ9OiNtYXBiYXNlfQogICAgZG8KICAg ICAgaWYgKCggaSA9PSBmbGFnIHx8IGZsYWcgPiAwICYmIChpICYgZmxhZykgPT0gZmxhZyApKQog ICAgICB0aGVuCiAgICAgICAgIyBwcmludCAkaSAkZmxhZwogICAgICAgIG91dGZsYWcrPSgke3Jl ZlskZmxhZ119KQogICAgICAgICgoIGkgLT0gZmxhZyApKQogICAgICBmaQogICAgZG9uZQogIGZp CiAgcHJpbnQgJDIgJHsoajp8OilvdXRmbGFnfQogIGlmICgoIGkgKSkKICB0aGVuCiAgICBwcmlu dCBVbmtub3duICQxOiAkaQogIGZpCmVsc2UKICBzZXQgLS0gJHskeyhuaylyZWZbKFIpJHt+Mjot Kn1dfTojbWFwYmFzZX0KICBpbnRlZ2VyIC1pICR7cmVmW21hcGJhc2VdL2ludGVnZXIvMTB9IHc9 JHthcmd2Wy0xXX0KICBpbnRlZ2VyIHg9JHsjJHtyZWZbbWFwYmFzZV0vaW50ZWdlci99fSsyCiAg d2hpbGUgKChBUkdDKSkKICBkbwogICAgaWYgW1sgJHJlZlttYXBiYXNlXSA9IDIgXV0KICAgIHRo ZW4KICAgICAgaW50ZWdlciAtaSAyIHc9JDEKICAgICAgbG9jYWwgK2kgZmxhZwogICAgICBpZiAo KCB3ICkpCiAgICAgIHRoZW4KCXByaW50ZiAtdiBmbGFnICcxPDwlZFx0JXMnICQoKCR7I3d9IC0g eCkpICQxCiAgICAgIGVsc2UKCXByaW50ZiAtdiBmbGFnICcwPDwwXHQlcycgJDEKICAgICAgZmkK ICAgIGVsc2UKICAgICAgaW50ZWdlciAtaSAke3JlZlttYXBiYXNlXS9pbnRlZ2VyLzEwfSAtWiAk eyN3fSBmbGFnPSQxCiAgICBmaQogICAgb3V0ZmxhZys9KCRyZWZbJDFdICRmbGFnICkKICAgIHNo aWZ0CiAgZG9uZQogIHByaW50IC1hQzIgLS0gJG91dGZsYWcKZmkK --0000000000005d62e905f52a6509--