From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D5C18C43387 for ; Mon, 14 Jan 2019 05:30:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 91F3E20660 for ; Mon, 14 Jan 2019 05:30:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726496AbfANFao (ORCPT ); Mon, 14 Jan 2019 00:30:44 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55522 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725910AbfANFan (ORCPT ); Mon, 14 Jan 2019 00:30:43 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D3B89C0467DF; Mon, 14 Jan 2019 05:30:42 +0000 (UTC) Received: from localhost.localdomain (ovpn-12-115.pek2.redhat.com [10.72.12.115]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4BEC7BA79; Mon, 14 Jan 2019 05:30:32 +0000 (UTC) Subject: Re: [PATCH 1/2 v6] kdump: add the vmcoreinfo documentation To: Borislav Petkov Cc: linux-kernel@vger.kernel.org, kexec@lists.infradead.org, tglx@linutronix.de, mingo@redhat.com, x86@kernel.org, akpm@linux-foundation.org, bhe@redhat.com, dyoung@redhat.com, k-hagio@ab.jp.nec.com, anderson@redhat.com, linux-doc@vger.kernel.org References: <20190110121944.6050-1-lijiang@redhat.com> <20190110121944.6050-2-lijiang@redhat.com> <20190111145650.GG4729@zn.tnic> From: lijiang Message-ID: Date: Mon, 14 Jan 2019 13:30:30 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20190111145650.GG4729@zn.tnic> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 14 Jan 2019 05:30:43 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 在 2019年01月11日 22:56, Borislav Petkov 写道: > On Thu, Jan 10, 2019 at 08:19:43PM +0800, Lianbo Jiang wrote: >> This document lists some variables that export to vmcoreinfo, and briefly >> describles what these variables indicate. It should be instructive for >> many people who do not know the vmcoreinfo. >> >> Suggested-by: Borislav Petkov >> Signed-off-by: Lianbo Jiang >> --- >> Documentation/kdump/vmcoreinfo.txt | 500 +++++++++++++++++++++++++++++ >> 1 file changed, 500 insertions(+) >> create mode 100644 Documentation/kdump/vmcoreinfo.txt > > Ok, below is what I'm going to commit if no one complains. I hope you'd > find some time to work on adding the checkpatch check for patches which > add vmcoreinfo members but do not document them I noticed that the checkpatch was coded in Perl. But i am not familiar with the Perl program language, that would be beyond my ability to do this, i have to learn the Perl program language step by step. :-) > and also remove those vmcoreinfo members which are unused. > Do you mean this one 'KERNEL_IMAGE_SIZE'? Currently unused by Makedumpfile, but used to compute the module virtual address by Crash. I have corrected this issue in VMCOREINFO doc. Thanks. Lianbo > Which should be easy because we don't have to be backwards-compatible > with makedumpfile as this is not an ABI. > > Thx. > > --- > From: Lianbo Jiang > Date: Thu, 10 Jan 2019 20:19:43 +0800 > Subject: [PATCH] kdump: Document kernel data exported in the vmcoreinfo note > > Document data exported in vmcoreinfo and briefly describe its use by > userspace tools.a > > [ bp: heavily massage and redact the text. ] > > Suggested-by: Borislav Petkov > Signed-off-by: Lianbo Jiang > Signed-off-by: Borislav Petkov > Cc: Andrew Morton > Cc: Baoquan He > Cc: Dave Young > Cc: Jonathan Corbet > Cc: Thomas Gleixner > Cc: Vivek Goyal > Cc: anderson@redhat.com > Cc: k-hagio@ab.jp.nec.com > Cc: kexec@lists.infradead.org > Cc: linux-doc@vger.kernel.org > Cc: mingo@redhat.com > Cc: x86-ml > Link: https://lkml.kernel.org/r/20190110121944.6050-2-lijiang@redhat.com > --- > Documentation/kdump/vmcoreinfo.txt | 494 +++++++++++++++++++++++++++++ > 1 file changed, 494 insertions(+) > create mode 100644 Documentation/kdump/vmcoreinfo.txt > > diff --git a/Documentation/kdump/vmcoreinfo.txt b/Documentation/kdump/vmcoreinfo.txt > new file mode 100644 > index 000000000000..2dc3797940a3 > --- /dev/null > +++ b/Documentation/kdump/vmcoreinfo.txt > @@ -0,0 +1,494 @@ > +================================================================ > + VMCOREINFO > +================================================================ > + > +=========== > +What is it? > +=========== > + > +VMCOREINFO is a special ELF note section. It contains various > +information from the kernel like structure size, page size, symbol > +values, field offsets, etc. These data are packed into an ELF note > +section and used by user-space tools like crash and makedumpfile to > +analyze a kernel's memory layout. > + > +================ > +Common variables > +================ > + > +init_uts_ns.name.release > +------------------------ > + > +The version of the Linux kernel. Used to find the corresponding source > +code from which the kernel has been built. > + > +PAGE_SIZE > +--------- > + > +The size of a page. It is the smallest unit of data used by the memory > +management facilities. It is usually 4096 bytes of size and a page is > +aligned on 4096 bytes. Used for computing page addresses. > + > +init_uts_ns > +----------- > + > +The UTS namespace which is used to isolate two specific elements of the > +system that relate to the uname(2) system call. It is named after the > +data structure used to store information returned by the uname(2) system > +call. > + > +User-space tools can get the kernel name, host name, kernel release > +number, kernel version, architecture name and OS type from it. > + > +node_online_map > +--------------- > + > +An array node_states[N_ONLINE] which represents the set of online nodes > +in a system, one bit position per node number. Used to keep track of > +which nodes are in the system and online. > + > +swapper_pg_dir > +------------- > + > +The global page directory pointer of the kernel. Used to translate > +virtual to physical addresses. > + > +_stext > +------ > + > +Defines the beginning of the text section. In general, _stext indicates > +the kernel start address. Used to convert a virtual address from the > +direct kernel map to a physical address. > + > +vmap_area_list > +-------------- > + > +Stores the virtual area list. makedumpfile gets the vmalloc start value > +from this variable and its value is necessary for vmalloc translation. > + > +mem_map > +------- > + > +Physical addresses are translated to struct pages by treating them as > +an index into the mem_map array. Right-shifting a physical address > +PAGE_SHIFT bits converts it into a page frame number which is an index > +into that mem_map array. > + > +Used to map an address to the corresponding struct page. > + > +contig_page_data > +---------------- > + > +Makedumpfile gets the pglist_data structure from this symbol, which is > +used to describe the memory layout. > + > +User-space tools use this to exclude free pages when dumping memory. > + > +mem_section|(mem_section, NR_SECTION_ROOTS)|(mem_section, section_mem_map) > +-------------------------------------------------------------------------- > + > +The address of the mem_section array, its length, structure size, and > +the section_mem_map offset. > + > +It exists in the sparse memory mapping model, and it is also somewhat > +similar to the mem_map variable, both of them are used to translate an > +address. > + > +page > +---- > + > +The size of a page structure. struct page is an important data structure > +and it is widely used to compute contiguous memory. > + > +pglist_data > +----------- > + > +The size of a pglist_data structure. This value is used to check if the > +pglist_data structure is valid. It is also used for checking the memory > +type. > + > +zone > +---- > + > +The size of a zone structure. This value is used to check if the zone > +structure has been found. It is also used for excluding free pages. > + > +free_area > +--------- > + > +The size of a free_area structure. It indicates whether the free_area > +structure is valid or not. Useful when excluding free pages. > + > +list_head > +--------- > + > +The size of a list_head structure. Used when iterating lists in a > +post-mortem analysis session. > + > +nodemask_t > +---------- > + > +The size of a nodemask_t type. Used to compute the number of online > +nodes. > + > +(page, flags|_refcount|mapping|lru|_mapcount|private|compound_dtor| > + compound_order|compound_head) > +------------------------------------------------------------------- > + > +User-space tools compute their values based on the offset of these > +variables. The variables are used when excluding unnecessary pages. > + > +(pglist_data, node_zones|nr_zones|node_mem_map|node_start_pfn|node_ > + spanned_pages|node_id) > +------------------------------------------------------------------- > + > +On NUMA machines, each NUMA node has a pg_data_t to describe its memory > +layout. On UMA machines there is a single pglist_data which describes the > +whole memory. > + > +These values are used to check the memory type and to compute the > +virtual address for memory map. > + > +(zone, free_area|vm_stat|spanned_pages) > +--------------------------------------- > + > +Each node is divided into a number of blocks called zones which > +represent ranges within memory. A zone is described by a structure zone. > + > +User-space tools compute required values based on the offset of these > +variables. > + > +(free_area, free_list) > +---------------------- > + > +Offset of the free_list's member. This value is used to compute the number > +of free pages. > + > +Each zone has a free_area structure array called free_area[MAX_ORDER]. > +The free_list represents a linked list of free page blocks. > + > +(list_head, next|prev) > +---------------------- > + > +Offsets of the list_head's members. list_head is used to define a > +circular linked list. User-space tools need these in order to traverse > +lists. > + > +(vmap_area, va_start|list) > +-------------------------- > + > +Offsets of the vmap_area's members. They carry vmalloc-specific > +information. Makedumpfile gets the start address of the vmalloc region > +from this. > + > +(zone.free_area, MAX_ORDER) > +--------------------------- > + > +Free areas descriptor. User-space tools use this value to iterate the > +free_area ranges. MAX_ORDER is used by the zone buddy allocator. > + > +log_first_idx > +------------- > + > +Index of the first record stored in the buffer log_buf. Used by > +user-space tools to read the strings in the log_buf. > + > +log_buf > +------- > + > +Console output is written to the ring buffer log_buf at index > +log_first_idx. Used to get the kernel log. > + > +log_buf_len > +----------- > + > +log_buf's length. > + > +clear_idx > +--------- > + > +The index that the next printk() record to read after the last clear > +command. It indicates the first record after the last SYSLOG_ACTION > +_CLEAR, like issued by 'dmesg -c'. Used by user-space tools to dump > +the dmesg log. > + > +log_next_idx > +------------ > + > +The index of the next record to store in the buffer log_buf. Used to > +compute the index of the current buffer position. > + > +printk_log > +---------- > + > +The size of a structure printk_log. Used to compute the size of > +messages, and extract dmesg log. It encapsulates header information for > +log_buf, such as timestamp, syslog level, etc. > + > +(printk_log, ts_nsec|len|text_len|dict_len) > +------------------------------------------- > + > +It represents field offsets in struct printk_log. User space tools > +parse it and check whether the values of printk_log's members have been > +changed. > + > +(free_area.free_list, MIGRATE_TYPES) > +------------------------------------ > + > +The number of migrate types for pages. The free_list is described by the > +array. Used by tools to compute the number of free pages. > + > +NR_FREE_PAGES > +------------- > + > +On linux-2.6.21 or later, the number of free pages is in > +vm_stat[NR_FREE_PAGES]. Used to get the number of free pages. > + > +PG_lru|PG_private|PG_swapcache|PG_swapbacked|PG_slab|PG_hwpoision > +|PG_head_mask|PAGE_BUDDY_MAPCOUNT_VALUE(~PG_buddy) > +|PAGE_OFFLINE_MAPCOUNT_VALUE(~PG_offline) > +----------------------------------------------------------------- > + > +Page attributes. These flags are used to filter various unnecessary for > +dumping pages. > + > +HUGETLB_PAGE_DTOR > +----------------- > + > +The HUGETLB_PAGE_DTOR flag denotes hugetlbfs pages. Makedumpfile > +excludes these pages. > + > +====== > +x86_64 > +====== > + > +phys_base > +--------- > + > +Used to convert the virtual address of an exported kernel symbol to its > +corresponding physical address. > + > +init_top_pgt > +------------ > + > +Used to walk through the whole page table and convert virtual addresses > +to physical addresses. The init_top_pgt is somewhat similar to > +swapper_pg_dir, but it is only used in x86_64. > + > +pgtable_l5_enabled > +------------------ > + > +User-space tools need to know whether the crash kernel was in 5-level > +paging mode. > + > +node_data > +--------- > + > +This is a struct pglist_data array and stores all NUMA nodes > +information. Makedumpfile gets the pglist_data structure from it. > + > +(node_data, MAX_NUMNODES) > +------------------------- > + > +The maximum number of nodes in system. > + > +KERNELOFFSET > +------------ > + > +The kernel randomization offset. Used to compute the page offset. If > +KASLR is disabled, this value is zero. > + > +KERNEL_IMAGE_SIZE > +----------------- > + > +Currently unused by Makedumpfile. Used to compute the module virtual > +address by Crash. > + > +sme_mask > +-------- > + > +AMD-specific with SME support: it indicates the secure memory encryption > +mask. Makedumpfile tools need to know whether the crash kernel was > +encrypted. If SME is enabled in the first kernel, the crash kernel's > +page table entries (pgd/pud/pmd/pte) contain the memory encryption > +mask. This is used to remove the SME mask and obtain the true physical > +address. > + > +Currently, sme_mask stores the value of the C-bit position. If needed, > +additional SME-relevant info can be placed in that variable. > + > +For example: > +[ misc ][ enc bit ][ other misc SME info ] > +0000_0000_0000_0000_1000_0000_0000_0000_0000_0000_..._0000 > +63 59 55 51 47 43 39 35 31 27 ... 3 > + > +====== > +x86_32 > +====== > + > +X86_PAE > +------- > + > +Denotes whether physical address extensions are enabled. It has the cost > +of a higher page table lookup overhead, and also consumes more page > +table space per process. Used to check whether PAE was enabled in the > +crash kernel when converting virtual addresses to physical addresses. > + > +==== > +ia64 > +==== > + > +pgdat_list|(pgdat_list, MAX_NUMNODES) > +------------------------------------- > + > +pg_data_t array storing all NUMA nodes information. MAX_NUMNODES > +indicates the number of the nodes. > + > +node_memblk|(node_memblk, NR_NODE_MEMBLKS) > +------------------------------------------ > + > +List of node memory chunks. Filled when parsing the SRAT table to obtain > +information about memory nodes. NR_NODE_MEMBLKS indicates the number of > +node memory chunks. > + > +These values are used to compute the number of nodes the crashed kernel used. > + > +node_memblk_s|(node_memblk_s, start_paddr)|(node_memblk_s, size) > +---------------------------------------------------------------- > + > +The size of a struct node_memblk_s and the offsets of the > +node_memblk_s's members. Used to compute the number of nodes. > + > +PGTABLE_3|PGTABLE_4 > +------------------- > + > +User-space tools need to know whether the crash kernel was in 3-level or > +4-level paging mode. Used to distinguish the page table. > + > +===== > +ARM64 > +===== > + > +VA_BITS > +------- > + > +The maximum number of bits for virtual addresses. Used to compute the > +virtual memory ranges. > + > +kimage_voffset > +-------------- > + > +The offset between the kernel virtual and physical mappings. Used to > +translate virtual to physical addresses. > + > +PHYS_OFFSET > +----------- > + > +Indicates the physical address of the start of memory. Similar to > +kimage_voffset, which is used to translate virtual to physical > +addresses. > + > +KERNELOFFSET > +------------ > + > +The kernel randomization offset. Used to compute the page offset. If > +KASLR is disabled, this value is zero. > + > +==== > +arm > +==== > + > +ARM_LPAE > +-------- > + > +It indicates whether the crash kernel supports large physical address > +extensions. Used to translate virtual to physical addresses. > + > +==== > +s390 > +==== > + > +lowcore_ptr > +---------- > + > +An array with a pointer to the lowcore of every CPU. Used to print the > +psw and all registers information. > + > +high_memory > +----------- > + > +Used to get the vmalloc_start address from the high_memory symbol. > + > +(lowcore_ptr, NR_CPUS) > +---------------------- > + > +The maximum number of CPUs. > + > +======= > +powerpc > +======= > + > + > +node_data|(node_data, MAX_NUMNODES) > +----------------------------------- > + > +See above. > + > +contig_page_data > +---------------- > + > +See above. > + > +vmemmap_list > +------------ > + > +The vmemmap_list maintains the entire vmemmap physical mapping. Used > +to get vmemmap list count and populated vmemmap regions info. If the > +vmemmap address translation information is stored in the crash kernel, > +it is used to translate vmemmap kernel virtual addresses. > + > +mmu_vmemmap_psize > +----------------- > + > +The size of a page. Used to translate virtual to physical addresses. > + > +mmu_psize_defs > +-------------- > + > +Page size definitions, i.e. 4k, 64k, or 16M. > + > +Used to make vtop translations. > + > +vmemmap_backing|(vmemmap_backing, list)|(vmemmap_backing, phys)| > +(vmemmap_backing, virt_addr) > +---------------------------------------------------------------- > + > +The vmemmap virtual address space management does not have a traditional > +page table to track which virtual struct pages are backed by a physical > +mapping. The virtual to physical mappings are tracked in a simple linked > +list format. > + > +User-space tools need to know the offset of list, phys and virt_addr > +when computing the count of vmemmap regions. > + > +mmu_psize_def|(mmu_psize_def, shift) > +------------------------------------ > + > +The size of a struct mmu_psize_def and the offset of mmu_psize_def's > +member. > + > +Used in vtop translations. > + > +== > +sh > +== > + > +node_data|(node_data, MAX_NUMNODES) > +----------------------------------- > + > +See above. > + > +X2TLB > +----- > + > +Indicates whether the crashed kernel enabled SH extended mode. > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mx1.redhat.com ([209.132.183.28]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1giupg-0001hb-7x for kexec@lists.infradead.org; Mon, 14 Jan 2019 05:30:46 +0000 Subject: Re: [PATCH 1/2 v6] kdump: add the vmcoreinfo documentation References: <20190110121944.6050-1-lijiang@redhat.com> <20190110121944.6050-2-lijiang@redhat.com> <20190111145650.GG4729@zn.tnic> From: lijiang Message-ID: Date: Mon, 14 Jan 2019 13:30:30 +0800 MIME-Version: 1.0 In-Reply-To: <20190111145650.GG4729@zn.tnic> Content-Language: en-US List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: Borislav Petkov Cc: k-hagio@ab.jp.nec.com, bhe@redhat.com, linux-doc@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, mingo@redhat.com, anderson@redhat.com, tglx@linutronix.de, dyoung@redhat.com, akpm@linux-foundation.org 5ZyoIDIwMTnlubQwMeaciDEx5pelIDIyOjU2LCBCb3Jpc2xhdiBQZXRrb3Yg5YaZ6YGTOgo+IE9u IFRodSwgSmFuIDEwLCAyMDE5IGF0IDA4OjE5OjQzUE0gKzA4MDAsIExpYW5ibyBKaWFuZyB3cm90 ZToKPj4gVGhpcyBkb2N1bWVudCBsaXN0cyBzb21lIHZhcmlhYmxlcyB0aGF0IGV4cG9ydCB0byB2 bWNvcmVpbmZvLCBhbmQgYnJpZWZseQo+PiBkZXNjcmlibGVzIHdoYXQgdGhlc2UgdmFyaWFibGVz IGluZGljYXRlLiBJdCBzaG91bGQgYmUgaW5zdHJ1Y3RpdmUgZm9yCj4+IG1hbnkgcGVvcGxlIHdo byBkbyBub3Qga25vdyB0aGUgdm1jb3JlaW5mby4KPj4KPj4gU3VnZ2VzdGVkLWJ5OiBCb3Jpc2xh diBQZXRrb3YgPGJwQHN1c2UuZGU+Cj4+IFNpZ25lZC1vZmYtYnk6IExpYW5ibyBKaWFuZyA8bGlq aWFuZ0ByZWRoYXQuY29tPgo+PiAtLS0KPj4gIERvY3VtZW50YXRpb24va2R1bXAvdm1jb3JlaW5m by50eHQgfCA1MDAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPj4gIDEgZmlsZSBjaGFu Z2VkLCA1MDAgaW5zZXJ0aW9ucygrKQo+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRp b24va2R1bXAvdm1jb3JlaW5mby50eHQKPiAKPiBPaywgYmVsb3cgaXMgd2hhdCBJJ20gZ29pbmcg dG8gY29tbWl0IGlmIG5vIG9uZSBjb21wbGFpbnMuIEkgaG9wZSB5b3UnZAo+IGZpbmQgc29tZSB0 aW1lIHRvIHdvcmsgb24gYWRkaW5nIHRoZSBjaGVja3BhdGNoIGNoZWNrIGZvciBwYXRjaGVzIHdo aWNoCj4gYWRkIHZtY29yZWluZm8gbWVtYmVycyBidXQgZG8gbm90IGRvY3VtZW50IHRoZW0KCkkg bm90aWNlZCB0aGF0IHRoZSBjaGVja3BhdGNoIHdhcyBjb2RlZCBpbiBQZXJsLiBCdXQgaSBhbSBu b3QgZmFtaWxpYXIgd2l0aAp0aGUgUGVybCBwcm9ncmFtIGxhbmd1YWdlLCB0aGF0IHdvdWxkIGJl IGJleW9uZCBteSBhYmlsaXR5IHRvIGRvIHRoaXMsIGkgaGF2ZQp0byBsZWFybiB0aGUgUGVybCBw cm9ncmFtIGxhbmd1YWdlIHN0ZXAgYnkgc3RlcC4gOi0pCgo+IGFuZCBhbHNvIHJlbW92ZSB0aG9z ZSB2bWNvcmVpbmZvIG1lbWJlcnMgd2hpY2ggYXJlIHVudXNlZC4KPiAKCkRvIHlvdSBtZWFuIHRo aXMgb25lICdLRVJORUxfSU1BR0VfU0laRSc/CgpDdXJyZW50bHkgdW51c2VkIGJ5IE1ha2VkdW1w ZmlsZSwgYnV0IHVzZWQgdG8gY29tcHV0ZSB0aGUgbW9kdWxlIHZpcnR1YWwKYWRkcmVzcyBieSBD cmFzaC4KCkkgaGF2ZSBjb3JyZWN0ZWQgdGhpcyBpc3N1ZSBpbiBWTUNPUkVJTkZPIGRvYy4KClRo YW5rcy4KTGlhbmJvCgo+IFdoaWNoIHNob3VsZCBiZSBlYXN5IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2 ZSB0byBiZSBiYWNrd2FyZHMtY29tcGF0aWJsZQo+IHdpdGggbWFrZWR1bXBmaWxlIGFzIHRoaXMg aXMgbm90IGFuIEFCSS4KPiAKPiBUaHguCj4gCj4gLS0tCj4gRnJvbTogTGlhbmJvIEppYW5nIDxs aWppYW5nQHJlZGhhdC5jb20+Cj4gRGF0ZTogVGh1LCAxMCBKYW4gMjAxOSAyMDoxOTo0MyArMDgw MAo+IFN1YmplY3Q6IFtQQVRDSF0ga2R1bXA6IERvY3VtZW50IGtlcm5lbCBkYXRhIGV4cG9ydGVk IGluIHRoZSB2bWNvcmVpbmZvIG5vdGUKPiAKPiBEb2N1bWVudCBkYXRhIGV4cG9ydGVkIGluIHZt Y29yZWluZm8gYW5kIGJyaWVmbHkgZGVzY3JpYmUgaXRzIHVzZSBieQo+IHVzZXJzcGFjZSB0b29s cy5hCj4gCj4gIFsgYnA6IGhlYXZpbHkgbWFzc2FnZSBhbmQgcmVkYWN0IHRoZSB0ZXh0LiBdCj4g Cj4gU3VnZ2VzdGVkLWJ5OiBCb3Jpc2xhdiBQZXRrb3YgPGJwQHN1c2UuZGU+Cj4gU2lnbmVkLW9m Zi1ieTogTGlhbmJvIEppYW5nIDxsaWppYW5nQHJlZGhhdC5jb20+Cj4gU2lnbmVkLW9mZi1ieTog Qm9yaXNsYXYgUGV0a292IDxicEBzdXNlLmRlPgo+IENjOiBBbmRyZXcgTW9ydG9uIDxha3BtQGxp bnV4LWZvdW5kYXRpb24ub3JnPgo+IENjOiBCYW9xdWFuIEhlIDxiaGVAcmVkaGF0LmNvbT4KPiBD YzogRGF2ZSBZb3VuZyA8ZHlvdW5nQHJlZGhhdC5jb20+Cj4gQ2M6IEpvbmF0aGFuIENvcmJldCA8 Y29yYmV0QGx3bi5uZXQ+Cj4gQ2M6IFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRl Pgo+IENjOiBWaXZlayBHb3lhbCA8dmdveWFsQHJlZGhhdC5jb20+Cj4gQ2M6IGFuZGVyc29uQHJl ZGhhdC5jb20KPiBDYzogay1oYWdpb0BhYi5qcC5uZWMuY29tCj4gQ2M6IGtleGVjQGxpc3RzLmlu ZnJhZGVhZC5vcmcKPiBDYzogbGludXgtZG9jQHZnZXIua2VybmVsLm9yZwo+IENjOiBtaW5nb0By ZWRoYXQuY29tCj4gQ2M6IHg4Ni1tbCA8eDg2QGtlcm5lbC5vcmc+Cj4gTGluazogaHR0cHM6Ly9s a21sLmtlcm5lbC5vcmcvci8yMDE5MDExMDEyMTk0NC42MDUwLTItbGlqaWFuZ0ByZWRoYXQuY29t Cj4gLS0tCj4gIERvY3VtZW50YXRpb24va2R1bXAvdm1jb3JlaW5mby50eHQgfCA0OTQgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKPiAgMSBmaWxlIGNoYW5nZWQsIDQ5NCBpbnNlcnRpb25z KCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2tkdW1wL3ZtY29yZWluZm8u dHh0Cj4gCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2R1bXAvdm1jb3JlaW5mby50eHQg Yi9Eb2N1bWVudGF0aW9uL2tkdW1wL3ZtY29yZWluZm8udHh0Cj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjJkYzM3OTc5NDBhMwo+IC0tLSAvZGV2L251bGwKPiAr KysgYi9Eb2N1bWVudGF0aW9uL2tkdW1wL3ZtY29yZWluZm8udHh0Cj4gQEAgLTAsMCArMSw0OTQg QEAKPiArPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQo+ICsJCQlWTUNPUkVJTkZPCj4gKz09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KPiArCj4gKz09PT09PT09 PT09Cj4gK1doYXQgaXMgaXQ/Cj4gKz09PT09PT09PT09Cj4gKwo+ICtWTUNPUkVJTkZPIGlzIGEg c3BlY2lhbCBFTEYgbm90ZSBzZWN0aW9uLiBJdCBjb250YWlucyB2YXJpb3VzCj4gK2luZm9ybWF0 aW9uIGZyb20gdGhlIGtlcm5lbCBsaWtlIHN0cnVjdHVyZSBzaXplLCBwYWdlIHNpemUsIHN5bWJv bAo+ICt2YWx1ZXMsIGZpZWxkIG9mZnNldHMsIGV0Yy4gVGhlc2UgZGF0YSBhcmUgcGFja2VkIGlu dG8gYW4gRUxGIG5vdGUKPiArc2VjdGlvbiBhbmQgdXNlZCBieSB1c2VyLXNwYWNlIHRvb2xzIGxp a2UgY3Jhc2ggYW5kIG1ha2VkdW1wZmlsZSB0bwo+ICthbmFseXplIGEga2VybmVsJ3MgbWVtb3J5 IGxheW91dC4KPiArCj4gKz09PT09PT09PT09PT09PT0KPiArQ29tbW9uIHZhcmlhYmxlcwo+ICs9 PT09PT09PT09PT09PT09Cj4gKwo+ICtpbml0X3V0c19ucy5uYW1lLnJlbGVhc2UKPiArLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICtUaGUgdmVyc2lvbiBvZiB0aGUgTGludXgga2VybmVs LiBVc2VkIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlCj4gK2NvZGUgZnJvbSB3aGlj aCB0aGUga2VybmVsIGhhcyBiZWVuIGJ1aWx0Lgo+ICsKPiArUEFHRV9TSVpFCj4gKy0tLS0tLS0t LQo+ICsKPiArVGhlIHNpemUgb2YgYSBwYWdlLiBJdCBpcyB0aGUgc21hbGxlc3QgdW5pdCBvZiBk YXRhIHVzZWQgYnkgdGhlIG1lbW9yeQo+ICttYW5hZ2VtZW50IGZhY2lsaXRpZXMuIEl0IGlzIHVz dWFsbHkgNDA5NiBieXRlcyBvZiBzaXplIGFuZCBhIHBhZ2UgaXMKPiArYWxpZ25lZCBvbiA0MDk2 IGJ5dGVzLiBVc2VkIGZvciBjb21wdXRpbmcgcGFnZSBhZGRyZXNzZXMuCj4gKwo+ICtpbml0X3V0 c19ucwo+ICstLS0tLS0tLS0tLQo+ICsKPiArVGhlIFVUUyBuYW1lc3BhY2Ugd2hpY2ggaXMgdXNl ZCB0byBpc29sYXRlIHR3byBzcGVjaWZpYyBlbGVtZW50cyBvZiB0aGUKPiArc3lzdGVtIHRoYXQg cmVsYXRlIHRvIHRoZSB1bmFtZSgyKSBzeXN0ZW0gY2FsbC4gSXQgaXMgbmFtZWQgYWZ0ZXIgdGhl Cj4gK2RhdGEgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkg dGhlIHVuYW1lKDIpIHN5c3RlbQo+ICtjYWxsLgo+ICsKPiArVXNlci1zcGFjZSB0b29scyBjYW4g Z2V0IHRoZSBrZXJuZWwgbmFtZSwgaG9zdCBuYW1lLCBrZXJuZWwgcmVsZWFzZQo+ICtudW1iZXIs IGtlcm5lbCB2ZXJzaW9uLCBhcmNoaXRlY3R1cmUgbmFtZSBhbmQgT1MgdHlwZSBmcm9tIGl0Lgo+ ICsKPiArbm9kZV9vbmxpbmVfbWFwCj4gKy0tLS0tLS0tLS0tLS0tLQo+ICsKPiArQW4gYXJyYXkg bm9kZV9zdGF0ZXNbTl9PTkxJTkVdIHdoaWNoIHJlcHJlc2VudHMgdGhlIHNldCBvZiBvbmxpbmUg bm9kZXMKPiAraW4gYSBzeXN0ZW0sIG9uZSBiaXQgcG9zaXRpb24gcGVyIG5vZGUgbnVtYmVyLiBV c2VkIHRvIGtlZXAgdHJhY2sgb2YKPiArd2hpY2ggbm9kZXMgYXJlIGluIHRoZSBzeXN0ZW0gYW5k IG9ubGluZS4KPiArCj4gK3N3YXBwZXJfcGdfZGlyCj4gKy0tLS0tLS0tLS0tLS0KPiArCj4gK1Ro ZSBnbG9iYWwgcGFnZSBkaXJlY3RvcnkgcG9pbnRlciBvZiB0aGUga2VybmVsLiBVc2VkIHRvIHRy YW5zbGF0ZQo+ICt2aXJ0dWFsIHRvIHBoeXNpY2FsIGFkZHJlc3Nlcy4KPiArCj4gK19zdGV4dAo+ ICstLS0tLS0KPiArCj4gK0RlZmluZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dCBzZWN0aW9u LiBJbiBnZW5lcmFsLCBfc3RleHQgaW5kaWNhdGVzCj4gK3RoZSBrZXJuZWwgc3RhcnQgYWRkcmVz cy4gVXNlZCB0byBjb252ZXJ0IGEgdmlydHVhbCBhZGRyZXNzIGZyb20gdGhlCj4gK2RpcmVjdCBr ZXJuZWwgbWFwIHRvIGEgcGh5c2ljYWwgYWRkcmVzcy4KPiArCj4gK3ZtYXBfYXJlYV9saXN0Cj4g Ky0tLS0tLS0tLS0tLS0tCj4gKwo+ICtTdG9yZXMgdGhlIHZpcnR1YWwgYXJlYSBsaXN0LiBtYWtl ZHVtcGZpbGUgZ2V0cyB0aGUgdm1hbGxvYyBzdGFydCB2YWx1ZQo+ICtmcm9tIHRoaXMgdmFyaWFi bGUgYW5kIGl0cyB2YWx1ZSBpcyBuZWNlc3NhcnkgZm9yIHZtYWxsb2MgdHJhbnNsYXRpb24uCj4g Kwo+ICttZW1fbWFwCj4gKy0tLS0tLS0KPiArCj4gK1BoeXNpY2FsIGFkZHJlc3NlcyBhcmUgdHJh bnNsYXRlZCB0byBzdHJ1Y3QgcGFnZXMgYnkgdHJlYXRpbmcgdGhlbSBhcwo+ICthbiBpbmRleCBp bnRvIHRoZSBtZW1fbWFwIGFycmF5LiBSaWdodC1zaGlmdGluZyBhIHBoeXNpY2FsIGFkZHJlc3MK PiArUEFHRV9TSElGVCBiaXRzIGNvbnZlcnRzIGl0IGludG8gYSBwYWdlIGZyYW1lIG51bWJlciB3 aGljaCBpcyBhbiBpbmRleAo+ICtpbnRvIHRoYXQgbWVtX21hcCBhcnJheS4KPiArCj4gK1VzZWQg dG8gbWFwIGFuIGFkZHJlc3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0IHBhZ2UuCj4gKwo+ ICtjb250aWdfcGFnZV9kYXRhCj4gKy0tLS0tLS0tLS0tLS0tLS0KPiArCj4gK01ha2VkdW1wZmls ZSBnZXRzIHRoZSBwZ2xpc3RfZGF0YSBzdHJ1Y3R1cmUgZnJvbSB0aGlzIHN5bWJvbCwgd2hpY2gg aXMKPiArdXNlZCB0byBkZXNjcmliZSB0aGUgbWVtb3J5IGxheW91dC4KPiArCj4gK1VzZXItc3Bh Y2UgdG9vbHMgdXNlIHRoaXMgdG8gZXhjbHVkZSBmcmVlIHBhZ2VzIHdoZW4gZHVtcGluZyBtZW1v cnkuCj4gKwo+ICttZW1fc2VjdGlvbnwobWVtX3NlY3Rpb24sIE5SX1NFQ1RJT05fUk9PVFMpfCht ZW1fc2VjdGlvbiwgc2VjdGlvbl9tZW1fbWFwKQo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiAr VGhlIGFkZHJlc3Mgb2YgdGhlIG1lbV9zZWN0aW9uIGFycmF5LCBpdHMgbGVuZ3RoLCBzdHJ1Y3R1 cmUgc2l6ZSwgYW5kCj4gK3RoZSBzZWN0aW9uX21lbV9tYXAgb2Zmc2V0Lgo+ICsKPiArSXQgZXhp c3RzIGluIHRoZSBzcGFyc2UgbWVtb3J5IG1hcHBpbmcgbW9kZWwsIGFuZCBpdCBpcyBhbHNvIHNv bWV3aGF0Cj4gK3NpbWlsYXIgdG8gdGhlIG1lbV9tYXAgdmFyaWFibGUsIGJvdGggb2YgdGhlbSBh cmUgdXNlZCB0byB0cmFuc2xhdGUgYW4KPiArYWRkcmVzcy4KPiArCj4gK3BhZ2UKPiArLS0tLQo+ ICsKPiArVGhlIHNpemUgb2YgYSBwYWdlIHN0cnVjdHVyZS4gc3RydWN0IHBhZ2UgaXMgYW4gaW1w b3J0YW50IGRhdGEgc3RydWN0dXJlCj4gK2FuZCBpdCBpcyB3aWRlbHkgdXNlZCB0byBjb21wdXRl IGNvbnRpZ3VvdXMgbWVtb3J5Lgo+ICsKPiArcGdsaXN0X2RhdGEKPiArLS0tLS0tLS0tLS0KPiAr Cj4gK1RoZSBzaXplIG9mIGEgcGdsaXN0X2RhdGEgc3RydWN0dXJlLiBUaGlzIHZhbHVlIGlzIHVz ZWQgdG8gY2hlY2sgaWYgdGhlCj4gK3BnbGlzdF9kYXRhIHN0cnVjdHVyZSBpcyB2YWxpZC4gSXQg aXMgYWxzbyB1c2VkIGZvciBjaGVja2luZyB0aGUgbWVtb3J5Cj4gK3R5cGUuCj4gKwo+ICt6b25l Cj4gKy0tLS0KPiArCj4gK1RoZSBzaXplIG9mIGEgem9uZSBzdHJ1Y3R1cmUuIFRoaXMgdmFsdWUg aXMgdXNlZCB0byBjaGVjayBpZiB0aGUgem9uZQo+ICtzdHJ1Y3R1cmUgaGFzIGJlZW4gZm91bmQu IEl0IGlzIGFsc28gdXNlZCBmb3IgZXhjbHVkaW5nIGZyZWUgcGFnZXMuCj4gKwo+ICtmcmVlX2Fy ZWEKPiArLS0tLS0tLS0tCj4gKwo+ICtUaGUgc2l6ZSBvZiBhIGZyZWVfYXJlYSBzdHJ1Y3R1cmUu IEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmcmVlX2FyZWEKPiArc3RydWN0dXJlIGlzIHZhbGlk IG9yIG5vdC4gVXNlZnVsIHdoZW4gZXhjbHVkaW5nIGZyZWUgcGFnZXMuCj4gKwo+ICtsaXN0X2hl YWQKPiArLS0tLS0tLS0tCj4gKwo+ICtUaGUgc2l6ZSBvZiBhIGxpc3RfaGVhZCBzdHJ1Y3R1cmUu IFVzZWQgd2hlbiBpdGVyYXRpbmcgbGlzdHMgaW4gYQo+ICtwb3N0LW1vcnRlbSBhbmFseXNpcyBz ZXNzaW9uLgo+ICsKPiArbm9kZW1hc2tfdAo+ICstLS0tLS0tLS0tCj4gKwo+ICtUaGUgc2l6ZSBv ZiBhIG5vZGVtYXNrX3QgdHlwZS4gVXNlZCB0byBjb21wdXRlIHRoZSBudW1iZXIgb2Ygb25saW5l Cj4gK25vZGVzLgo+ICsKPiArKHBhZ2UsIGZsYWdzfF9yZWZjb3VudHxtYXBwaW5nfGxydXxfbWFw Y291bnR8cHJpdmF0ZXxjb21wb3VuZF9kdG9yfAo+ICsgICAgICAgY29tcG91bmRfb3JkZXJ8Y29t cG91bmRfaGVhZCkKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiArVXNlci1zcGFjZSB0b29scyBjb21wdXRl IHRoZWlyIHZhbHVlcyBiYXNlZCBvbiB0aGUgb2Zmc2V0IG9mIHRoZXNlCj4gK3ZhcmlhYmxlcy4g VGhlIHZhcmlhYmxlcyBhcmUgdXNlZCB3aGVuIGV4Y2x1ZGluZyB1bm5lY2Vzc2FyeSBwYWdlcy4K PiArCj4gKyhwZ2xpc3RfZGF0YSwgbm9kZV96b25lc3xucl96b25lc3xub2RlX21lbV9tYXB8bm9k ZV9zdGFydF9wZm58bm9kZV8KPiArICAgICAgICAgICAgICBzcGFubmVkX3BhZ2VzfG5vZGVfaWQp Cj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KPiArCj4gK09uIE5VTUEgbWFjaGluZXMsIGVhY2ggTlVNQSBub2RlIGhh cyBhIHBnX2RhdGFfdCB0byBkZXNjcmliZSBpdHMgbWVtb3J5Cj4gK2xheW91dC4gT24gVU1BIG1h Y2hpbmVzIHRoZXJlIGlzIGEgc2luZ2xlIHBnbGlzdF9kYXRhIHdoaWNoIGRlc2NyaWJlcyB0aGUK PiArd2hvbGUgbWVtb3J5Lgo+ICsKPiArVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGNoZWNrIHRo ZSBtZW1vcnkgdHlwZSBhbmQgdG8gY29tcHV0ZSB0aGUKPiArdmlydHVhbCBhZGRyZXNzIGZvciBt ZW1vcnkgbWFwLgo+ICsKPiArKHpvbmUsIGZyZWVfYXJlYXx2bV9zdGF0fHNwYW5uZWRfcGFnZXMp Cj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiArRWFjaCBu b2RlIGlzIGRpdmlkZWQgaW50byBhIG51bWJlciBvZiBibG9ja3MgY2FsbGVkIHpvbmVzIHdoaWNo Cj4gK3JlcHJlc2VudCByYW5nZXMgd2l0aGluIG1lbW9yeS4gQSB6b25lIGlzIGRlc2NyaWJlZCBi eSBhIHN0cnVjdHVyZSB6b25lLgo+ICsKPiArVXNlci1zcGFjZSB0b29scyBjb21wdXRlIHJlcXVp cmVkIHZhbHVlcyBiYXNlZCBvbiB0aGUgb2Zmc2V0IG9mIHRoZXNlCj4gK3ZhcmlhYmxlcy4KPiAr Cj4gKyhmcmVlX2FyZWEsIGZyZWVfbGlzdCkKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsK PiArT2Zmc2V0IG9mIHRoZSBmcmVlX2xpc3QncyBtZW1iZXIuIFRoaXMgdmFsdWUgaXMgdXNlZCB0 byBjb21wdXRlIHRoZSBudW1iZXIKPiArb2YgZnJlZSBwYWdlcy4KPiArCj4gK0VhY2ggem9uZSBo YXMgYSBmcmVlX2FyZWEgc3RydWN0dXJlIGFycmF5IGNhbGxlZCBmcmVlX2FyZWFbTUFYX09SREVS XS4KPiArVGhlIGZyZWVfbGlzdCByZXByZXNlbnRzIGEgbGlua2VkIGxpc3Qgb2YgZnJlZSBwYWdl IGJsb2Nrcy4KPiArCj4gKyhsaXN0X2hlYWQsIG5leHR8cHJldikKPiArLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQo+ICsKPiArT2Zmc2V0cyBvZiB0aGUgbGlzdF9oZWFkJ3MgbWVtYmVycy4gbGlzdF9o ZWFkIGlzIHVzZWQgdG8gZGVmaW5lIGEKPiArY2lyY3VsYXIgbGlua2VkIGxpc3QuIFVzZXItc3Bh Y2UgdG9vbHMgbmVlZCB0aGVzZSBpbiBvcmRlciB0byB0cmF2ZXJzZQo+ICtsaXN0cy4KPiArCj4g Kyh2bWFwX2FyZWEsIHZhX3N0YXJ0fGxpc3QpCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Cj4gKwo+ICtPZmZzZXRzIG9mIHRoZSB2bWFwX2FyZWEncyBtZW1iZXJzLiBUaGV5IGNhcnJ5IHZt YWxsb2Mtc3BlY2lmaWMKPiAraW5mb3JtYXRpb24uIE1ha2VkdW1wZmlsZSBnZXRzIHRoZSBzdGFy dCBhZGRyZXNzIG9mIHRoZSB2bWFsbG9jIHJlZ2lvbgo+ICtmcm9tIHRoaXMuCj4gKwo+ICsoem9u ZS5mcmVlX2FyZWEsIE1BWF9PUkRFUikKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4g Kwo+ICtGcmVlIGFyZWFzIGRlc2NyaXB0b3IuIFVzZXItc3BhY2UgdG9vbHMgdXNlIHRoaXMgdmFs dWUgdG8gaXRlcmF0ZSB0aGUKPiArZnJlZV9hcmVhIHJhbmdlcy4gTUFYX09SREVSIGlzIHVzZWQg YnkgdGhlIHpvbmUgYnVkZHkgYWxsb2NhdG9yLgo+ICsKPiArbG9nX2ZpcnN0X2lkeAo+ICstLS0t LS0tLS0tLS0tCj4gKwo+ICtJbmRleCBvZiB0aGUgZmlyc3QgcmVjb3JkIHN0b3JlZCBpbiB0aGUg YnVmZmVyIGxvZ19idWYuIFVzZWQgYnkKPiArdXNlci1zcGFjZSB0b29scyB0byByZWFkIHRoZSBz dHJpbmdzIGluIHRoZSBsb2dfYnVmLgo+ICsKPiArbG9nX2J1Zgo+ICstLS0tLS0tCj4gKwo+ICtD b25zb2xlIG91dHB1dCBpcyB3cml0dGVuIHRvIHRoZSByaW5nIGJ1ZmZlciBsb2dfYnVmIGF0IGlu ZGV4Cj4gK2xvZ19maXJzdF9pZHguIFVzZWQgdG8gZ2V0IHRoZSBrZXJuZWwgbG9nLgo+ICsKPiAr bG9nX2J1Zl9sZW4KPiArLS0tLS0tLS0tLS0KPiArCj4gK2xvZ19idWYncyBsZW5ndGguCj4gKwo+ ICtjbGVhcl9pZHgKPiArLS0tLS0tLS0tCj4gKwo+ICtUaGUgaW5kZXggdGhhdCB0aGUgbmV4dCBw cmludGsoKSByZWNvcmQgdG8gcmVhZCBhZnRlciB0aGUgbGFzdCBjbGVhcgo+ICtjb21tYW5kLiBJ dCBpbmRpY2F0ZXMgdGhlIGZpcnN0IHJlY29yZCBhZnRlciB0aGUgbGFzdCBTWVNMT0dfQUNUSU9O Cj4gK19DTEVBUiwgbGlrZSBpc3N1ZWQgYnkgJ2RtZXNnIC1jJy4gVXNlZCBieSB1c2VyLXNwYWNl IHRvb2xzIHRvIGR1bXAKPiArdGhlIGRtZXNnIGxvZy4KPiArCj4gK2xvZ19uZXh0X2lkeAo+ICst LS0tLS0tLS0tLS0KPiArCj4gK1RoZSBpbmRleCBvZiB0aGUgbmV4dCByZWNvcmQgdG8gc3RvcmUg aW4gdGhlIGJ1ZmZlciBsb2dfYnVmLiBVc2VkIHRvCj4gK2NvbXB1dGUgdGhlIGluZGV4IG9mIHRo ZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbi4KPiArCj4gK3ByaW50a19sb2cKPiArLS0tLS0tLS0t LQo+ICsKPiArVGhlIHNpemUgb2YgYSBzdHJ1Y3R1cmUgcHJpbnRrX2xvZy4gVXNlZCB0byBjb21w dXRlIHRoZSBzaXplIG9mCj4gK21lc3NhZ2VzLCBhbmQgZXh0cmFjdCBkbWVzZyBsb2cuIEl0IGVu Y2Fwc3VsYXRlcyBoZWFkZXIgaW5mb3JtYXRpb24gZm9yCj4gK2xvZ19idWYsIHN1Y2ggYXMgdGlt ZXN0YW1wLCBzeXNsb2cgbGV2ZWwsIGV0Yy4KPiArCj4gKyhwcmludGtfbG9nLCB0c19uc2VjfGxl bnx0ZXh0X2xlbnxkaWN0X2xlbikKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo+ICsKPiArSXQgcmVwcmVzZW50cyBmaWVsZCBvZmZzZXRzIGluIHN0cnVjdCBw cmludGtfbG9nLiBVc2VyIHNwYWNlIHRvb2xzCj4gK3BhcnNlIGl0IGFuZCBjaGVjayB3aGV0aGVy IHRoZSB2YWx1ZXMgb2YgcHJpbnRrX2xvZydzIG1lbWJlcnMgaGF2ZSBiZWVuCj4gK2NoYW5nZWQu Cj4gKwo+ICsoZnJlZV9hcmVhLmZyZWVfbGlzdCwgTUlHUkFURV9UWVBFUykKPiArLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICtUaGUgbnVtYmVyIG9mIG1pZ3JhdGUg dHlwZXMgZm9yIHBhZ2VzLiBUaGUgZnJlZV9saXN0IGlzIGRlc2NyaWJlZCBieSB0aGUKPiArYXJy YXkuIFVzZWQgYnkgdG9vbHMgdG8gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGZyZWUgcGFnZXMuCj4g Kwo+ICtOUl9GUkVFX1BBR0VTCj4gKy0tLS0tLS0tLS0tLS0KPiArCj4gK09uIGxpbnV4LTIuNi4y MSBvciBsYXRlciwgdGhlIG51bWJlciBvZiBmcmVlIHBhZ2VzIGlzIGluCj4gK3ZtX3N0YXRbTlJf RlJFRV9QQUdFU10uIFVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgZnJlZSBwYWdlcy4KPiArCj4g K1BHX2xydXxQR19wcml2YXRlfFBHX3N3YXBjYWNoZXxQR19zd2FwYmFja2VkfFBHX3NsYWJ8UEdf aHdwb2lzaW9uCj4gK3xQR19oZWFkX21hc2t8UEFHRV9CVUREWV9NQVBDT1VOVF9WQUxVRSh+UEdf YnVkZHkpCj4gK3xQQUdFX09GRkxJTkVfTUFQQ09VTlRfVkFMVUUoflBHX29mZmxpbmUpCj4gKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCj4gKwo+ICtQYWdlIGF0dHJpYnV0ZXMuIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHRvIGZp bHRlciB2YXJpb3VzIHVubmVjZXNzYXJ5IGZvcgo+ICtkdW1waW5nIHBhZ2VzLgo+ICsKPiArSFVH RVRMQl9QQUdFX0RUT1IKPiArLS0tLS0tLS0tLS0tLS0tLS0KPiArCj4gK1RoZSBIVUdFVExCX1BB R0VfRFRPUiBmbGFnIGRlbm90ZXMgaHVnZXRsYmZzIHBhZ2VzLiBNYWtlZHVtcGZpbGUKPiArZXhj bHVkZXMgdGhlc2UgcGFnZXMuCj4gKwo+ICs9PT09PT0KPiAreDg2XzY0Cj4gKz09PT09PQo+ICsK PiArcGh5c19iYXNlCj4gKy0tLS0tLS0tLQo+ICsKPiArVXNlZCB0byBjb252ZXJ0IHRoZSB2aXJ0 dWFsIGFkZHJlc3Mgb2YgYW4gZXhwb3J0ZWQga2VybmVsIHN5bWJvbCB0byBpdHMKPiArY29ycmVz cG9uZGluZyBwaHlzaWNhbCBhZGRyZXNzLgo+ICsKPiAraW5pdF90b3BfcGd0Cj4gKy0tLS0tLS0t LS0tLQo+ICsKPiArVXNlZCB0byB3YWxrIHRocm91Z2ggdGhlIHdob2xlIHBhZ2UgdGFibGUgYW5k IGNvbnZlcnQgdmlydHVhbCBhZGRyZXNzZXMKPiArdG8gcGh5c2ljYWwgYWRkcmVzc2VzLiBUaGUg aW5pdF90b3BfcGd0IGlzIHNvbWV3aGF0IHNpbWlsYXIgdG8KPiArc3dhcHBlcl9wZ19kaXIsIGJ1 dCBpdCBpcyBvbmx5IHVzZWQgaW4geDg2XzY0Lgo+ICsKPiArcGd0YWJsZV9sNV9lbmFibGVkCj4g Ky0tLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiArVXNlci1zcGFjZSB0b29scyBuZWVkIHRvIGtub3cg d2hldGhlciB0aGUgY3Jhc2gga2VybmVsIHdhcyBpbiA1LWxldmVsCj4gK3BhZ2luZyBtb2RlLgo+ ICsKPiArbm9kZV9kYXRhCj4gKy0tLS0tLS0tLQo+ICsKPiArVGhpcyBpcyBhIHN0cnVjdCBwZ2xp c3RfZGF0YSBhcnJheSBhbmQgc3RvcmVzIGFsbCBOVU1BIG5vZGVzCj4gK2luZm9ybWF0aW9uLiBN YWtlZHVtcGZpbGUgZ2V0cyB0aGUgcGdsaXN0X2RhdGEgc3RydWN0dXJlIGZyb20gaXQuCj4gKwo+ ICsobm9kZV9kYXRhLCBNQVhfTlVNTk9ERVMpCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K PiArCj4gK1RoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcyBpbiBzeXN0ZW0uCj4gKwo+ICtLRVJO RUxPRkZTRVQKPiArLS0tLS0tLS0tLS0tCj4gKwo+ICtUaGUga2VybmVsIHJhbmRvbWl6YXRpb24g b2Zmc2V0LiBVc2VkIHRvIGNvbXB1dGUgdGhlIHBhZ2Ugb2Zmc2V0LiBJZgo+ICtLQVNMUiBpcyBk aXNhYmxlZCwgdGhpcyB2YWx1ZSBpcyB6ZXJvLgo+ICsKPiArS0VSTkVMX0lNQUdFX1NJWkUKPiAr LS0tLS0tLS0tLS0tLS0tLS0KPiArCj4gK0N1cnJlbnRseSB1bnVzZWQgYnkgTWFrZWR1bXBmaWxl LiBVc2VkIHRvIGNvbXB1dGUgdGhlIG1vZHVsZSB2aXJ0dWFsCj4gK2FkZHJlc3MgYnkgQ3Jhc2gu Cj4gKwo+ICtzbWVfbWFzawo+ICstLS0tLS0tLQo+ICsKPiArQU1ELXNwZWNpZmljIHdpdGggU01F IHN1cHBvcnQ6IGl0IGluZGljYXRlcyB0aGUgc2VjdXJlIG1lbW9yeSBlbmNyeXB0aW9uCj4gK21h c2suIE1ha2VkdW1wZmlsZSB0b29scyBuZWVkIHRvIGtub3cgd2hldGhlciB0aGUgY3Jhc2gga2Vy bmVsIHdhcwo+ICtlbmNyeXB0ZWQuIElmIFNNRSBpcyBlbmFibGVkIGluIHRoZSBmaXJzdCBrZXJu ZWwsIHRoZSBjcmFzaCBrZXJuZWwncwo+ICtwYWdlIHRhYmxlIGVudHJpZXMgKHBnZC9wdWQvcG1k L3B0ZSkgY29udGFpbiB0aGUgbWVtb3J5IGVuY3J5cHRpb24KPiArbWFzay4gVGhpcyBpcyB1c2Vk IHRvIHJlbW92ZSB0aGUgU01FIG1hc2sgYW5kIG9idGFpbiB0aGUgdHJ1ZSBwaHlzaWNhbAo+ICth ZGRyZXNzLgo+ICsKPiArQ3VycmVudGx5LCBzbWVfbWFzayBzdG9yZXMgdGhlIHZhbHVlIG9mIHRo ZSBDLWJpdCBwb3NpdGlvbi4gSWYgbmVlZGVkLAo+ICthZGRpdGlvbmFsIFNNRS1yZWxldmFudCBp bmZvIGNhbiBiZSBwbGFjZWQgaW4gdGhhdCB2YXJpYWJsZS4KPiArCj4gK0ZvciBleGFtcGxlOgo+ ICtbIG1pc2MJICAgICAgICBdWyBlbmMgYml0ICBdWyBvdGhlciBtaXNjIFNNRSBpbmZvICAgICAg IF0KPiArMDAwMF8wMDAwXzAwMDBfMDAwMF8xMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8u Li5fMDAwMAo+ICs2MyAgIDU5ICAgNTUgICA1MSAgIDQ3ICAgNDMgICAzOSAgIDM1ICAgMzEgICAy NyAgIC4uLiAzCj4gKwo+ICs9PT09PT0KPiAreDg2XzMyCj4gKz09PT09PQo+ICsKPiArWDg2X1BB RQo+ICstLS0tLS0tCj4gKwo+ICtEZW5vdGVzIHdoZXRoZXIgcGh5c2ljYWwgYWRkcmVzcyBleHRl bnNpb25zIGFyZSBlbmFibGVkLiBJdCBoYXMgdGhlIGNvc3QKPiArb2YgYSBoaWdoZXIgcGFnZSB0 YWJsZSBsb29rdXAgb3ZlcmhlYWQsIGFuZCBhbHNvIGNvbnN1bWVzIG1vcmUgcGFnZQo+ICt0YWJs ZSBzcGFjZSBwZXIgcHJvY2Vzcy4gVXNlZCB0byBjaGVjayB3aGV0aGVyIFBBRSB3YXMgZW5hYmxl ZCBpbiB0aGUKPiArY3Jhc2gga2VybmVsIHdoZW4gY29udmVydGluZyB2aXJ0dWFsIGFkZHJlc3Nl cyB0byBwaHlzaWNhbCBhZGRyZXNzZXMuCj4gKwo+ICs9PT09Cj4gK2lhNjQKPiArPT09PQo+ICsK PiArcGdkYXRfbGlzdHwocGdkYXRfbGlzdCwgTUFYX05VTU5PREVTKQo+ICstLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICtwZ19kYXRhX3QgYXJyYXkgc3RvcmluZyBh bGwgTlVNQSBub2RlcyBpbmZvcm1hdGlvbi4gTUFYX05VTU5PREVTCj4gK2luZGljYXRlcyB0aGUg bnVtYmVyIG9mIHRoZSBub2Rlcy4KPiArCj4gK25vZGVfbWVtYmxrfChub2RlX21lbWJsaywgTlJf Tk9ERV9NRU1CTEtTKQo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KPiArCj4gK0xpc3Qgb2Ygbm9kZSBtZW1vcnkgY2h1bmtzLiBGaWxsZWQgd2hlbiBwYXJzaW5n IHRoZSBTUkFUIHRhYmxlIHRvIG9idGFpbgo+ICtpbmZvcm1hdGlvbiBhYm91dCBtZW1vcnkgbm9k ZXMuIE5SX05PREVfTUVNQkxLUyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZgo+ICtub2RlIG1lbW9y eSBjaHVua3MuCj4gKwo+ICtUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbnVt YmVyIG9mIG5vZGVzIHRoZSBjcmFzaGVkIGtlcm5lbCB1c2VkLgo+ICsKPiArbm9kZV9tZW1ibGtf c3wobm9kZV9tZW1ibGtfcywgc3RhcnRfcGFkZHIpfChub2RlX21lbWJsa19zLCBzaXplKQo+ICst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCj4gKwo+ICtUaGUgc2l6ZSBvZiBhIHN0cnVjdCBub2RlX21lbWJsa19zIGFuZCB0aGUg b2Zmc2V0cyBvZiB0aGUKPiArbm9kZV9tZW1ibGtfcydzIG1lbWJlcnMuIFVzZWQgdG8gY29tcHV0 ZSB0aGUgbnVtYmVyIG9mIG5vZGVzLgo+ICsKPiArUEdUQUJMRV8zfFBHVEFCTEVfNAo+ICstLS0t LS0tLS0tLS0tLS0tLS0tCj4gKwo+ICtVc2VyLXNwYWNlIHRvb2xzIG5lZWQgdG8ga25vdyB3aGV0 aGVyIHRoZSBjcmFzaCBrZXJuZWwgd2FzIGluIDMtbGV2ZWwgb3IKPiArNC1sZXZlbCBwYWdpbmcg bW9kZS4gVXNlZCB0byBkaXN0aW5ndWlzaCB0aGUgcGFnZSB0YWJsZS4KPiArCj4gKz09PT09Cj4g K0FSTTY0Cj4gKz09PT09Cj4gKwo+ICtWQV9CSVRTCj4gKy0tLS0tLS0KPiArCj4gK1RoZSBtYXhp bXVtIG51bWJlciBvZiBiaXRzIGZvciB2aXJ0dWFsIGFkZHJlc3Nlcy4gVXNlZCB0byBjb21wdXRl IHRoZQo+ICt2aXJ0dWFsIG1lbW9yeSByYW5nZXMuCj4gKwo+ICtraW1hZ2Vfdm9mZnNldAo+ICst LS0tLS0tLS0tLS0tLQo+ICsKPiArVGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBrZXJuZWwgdmlydHVh bCBhbmQgcGh5c2ljYWwgbWFwcGluZ3MuIFVzZWQgdG8KPiArdHJhbnNsYXRlIHZpcnR1YWwgdG8g cGh5c2ljYWwgYWRkcmVzc2VzLgo+ICsKPiArUEhZU19PRkZTRVQKPiArLS0tLS0tLS0tLS0KPiAr Cj4gK0luZGljYXRlcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgbWVtb3J5 LiBTaW1pbGFyIHRvCj4gK2tpbWFnZV92b2Zmc2V0LCB3aGljaCBpcyB1c2VkIHRvIHRyYW5zbGF0 ZSB2aXJ0dWFsIHRvIHBoeXNpY2FsCj4gK2FkZHJlc3Nlcy4KPiArCj4gK0tFUk5FTE9GRlNFVAo+ ICstLS0tLS0tLS0tLS0KPiArCj4gK1RoZSBrZXJuZWwgcmFuZG9taXphdGlvbiBvZmZzZXQuIFVz ZWQgdG8gY29tcHV0ZSB0aGUgcGFnZSBvZmZzZXQuIElmCj4gK0tBU0xSIGlzIGRpc2FibGVkLCB0 aGlzIHZhbHVlIGlzIHplcm8uCj4gKwo+ICs9PT09Cj4gK2FybQo+ICs9PT09Cj4gKwo+ICtBUk1f TFBBRQo+ICstLS0tLS0tLQo+ICsKPiArSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNyYXNoIGtl cm5lbCBzdXBwb3J0cyBsYXJnZSBwaHlzaWNhbCBhZGRyZXNzCj4gK2V4dGVuc2lvbnMuIFVzZWQg dG8gdHJhbnNsYXRlIHZpcnR1YWwgdG8gcGh5c2ljYWwgYWRkcmVzc2VzLgo+ICsKPiArPT09PQo+ ICtzMzkwCj4gKz09PT0KPiArCj4gK2xvd2NvcmVfcHRyCj4gKy0tLS0tLS0tLS0KPiArCj4gK0Fu IGFycmF5IHdpdGggYSBwb2ludGVyIHRvIHRoZSBsb3djb3JlIG9mIGV2ZXJ5IENQVS4gVXNlZCB0 byBwcmludCB0aGUKPiArcHN3IGFuZCBhbGwgcmVnaXN0ZXJzIGluZm9ybWF0aW9uLgo+ICsKPiAr aGlnaF9tZW1vcnkKPiArLS0tLS0tLS0tLS0KPiArCj4gK1VzZWQgdG8gZ2V0IHRoZSB2bWFsbG9j X3N0YXJ0IGFkZHJlc3MgZnJvbSB0aGUgaGlnaF9tZW1vcnkgc3ltYm9sLgo+ICsKPiArKGxvd2Nv cmVfcHRyLCBOUl9DUFVTKQo+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICtUaGUgbWF4 aW11bSBudW1iZXIgb2YgQ1BVcy4KPiArCj4gKz09PT09PT0KPiArcG93ZXJwYwo+ICs9PT09PT09 Cj4gKwo+ICsKPiArbm9kZV9kYXRhfChub2RlX2RhdGEsIE1BWF9OVU1OT0RFUykKPiArLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArCj4gK1NlZSBhYm92ZS4KPiArCj4gK2Nv bnRpZ19wYWdlX2RhdGEKPiArLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiArU2VlIGFib3ZlLgo+ICsK PiArdm1lbW1hcF9saXN0Cj4gKy0tLS0tLS0tLS0tLQo+ICsKPiArVGhlIHZtZW1tYXBfbGlzdCBt YWludGFpbnMgdGhlIGVudGlyZSB2bWVtbWFwIHBoeXNpY2FsIG1hcHBpbmcuIFVzZWQKPiArdG8g Z2V0IHZtZW1tYXAgbGlzdCBjb3VudCBhbmQgcG9wdWxhdGVkIHZtZW1tYXAgcmVnaW9ucyBpbmZv LiBJZiB0aGUKPiArdm1lbW1hcCBhZGRyZXNzIHRyYW5zbGF0aW9uIGluZm9ybWF0aW9uIGlzIHN0 b3JlZCBpbiB0aGUgY3Jhc2gga2VybmVsLAo+ICtpdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSB2bWVt bWFwIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Nlcy4KPiArCj4gK21tdV92bWVtbWFwX3BzaXplCj4g Ky0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICtUaGUgc2l6ZSBvZiBhIHBhZ2UuIFVzZWQgdG8gdHJh bnNsYXRlIHZpcnR1YWwgdG8gcGh5c2ljYWwgYWRkcmVzc2VzLgo+ICsKPiArbW11X3BzaXplX2Rl ZnMKPiArLS0tLS0tLS0tLS0tLS0KPiArCj4gK1BhZ2Ugc2l6ZSBkZWZpbml0aW9ucywgaS5lLiA0 aywgNjRrLCBvciAxNk0uCj4gKwo+ICtVc2VkIHRvIG1ha2UgdnRvcCB0cmFuc2xhdGlvbnMuCj4g Kwo+ICt2bWVtbWFwX2JhY2tpbmd8KHZtZW1tYXBfYmFja2luZywgbGlzdCl8KHZtZW1tYXBfYmFj a2luZywgcGh5cyl8Cj4gKyh2bWVtbWFwX2JhY2tpbmcsIHZpcnRfYWRkcikKPiArLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ ICsKPiArVGhlIHZtZW1tYXAgdmlydHVhbCBhZGRyZXNzIHNwYWNlIG1hbmFnZW1lbnQgZG9lcyBu b3QgaGF2ZSBhIHRyYWRpdGlvbmFsCj4gK3BhZ2UgdGFibGUgdG8gdHJhY2sgd2hpY2ggdmlydHVh bCBzdHJ1Y3QgcGFnZXMgYXJlIGJhY2tlZCBieSBhIHBoeXNpY2FsCj4gK21hcHBpbmcuIFRoZSB2 aXJ0dWFsIHRvIHBoeXNpY2FsIG1hcHBpbmdzIGFyZSB0cmFja2VkIGluIGEgc2ltcGxlIGxpbmtl ZAo+ICtsaXN0IGZvcm1hdC4KPiArCj4gK1VzZXItc3BhY2UgdG9vbHMgbmVlZCB0byBrbm93IHRo ZSBvZmZzZXQgb2YgbGlzdCwgcGh5cyBhbmQgdmlydF9hZGRyCj4gK3doZW4gY29tcHV0aW5nIHRo ZSBjb3VudCBvZiB2bWVtbWFwIHJlZ2lvbnMuCj4gKwo+ICttbXVfcHNpemVfZGVmfChtbXVfcHNp emVfZGVmLCBzaGlmdCkKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4g Kwo+ICtUaGUgc2l6ZSBvZiBhIHN0cnVjdCBtbXVfcHNpemVfZGVmIGFuZCB0aGUgb2Zmc2V0IG9m IG1tdV9wc2l6ZV9kZWYncwo+ICttZW1iZXIuCj4gKwo+ICtVc2VkIGluIHZ0b3AgdHJhbnNsYXRp b25zLgo+ICsKPiArPT0KPiArc2gKPiArPT0KPiArCj4gK25vZGVfZGF0YXwobm9kZV9kYXRhLCBN QVhfTlVNTk9ERVMpCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKwo+ ICtTZWUgYWJvdmUuCj4gKwo+ICtYMlRMQgo+ICstLS0tLQo+ICsKPiArSW5kaWNhdGVzIHdoZXRo ZXIgdGhlIGNyYXNoZWQga2VybmVsIGVuYWJsZWQgU0ggZXh0ZW5kZWQgbW9kZS4KPiAKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmtleGVjIG1haWxpbmcg bGlzdAprZXhlY0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8va2V4ZWMK