From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x102c.google.com (mail-pj1-x102c.google.com [IPv6:2607:f8b0:4864:20::102c]) by sourceware.org (Postfix) with ESMTPS id 718F33858C2C for ; Mon, 28 Mar 2022 14:41:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 718F33858C2C Received: by mail-pj1-x102c.google.com with SMTP id c15-20020a17090a8d0f00b001c9c81d9648so1153354pjo.2 for ; Mon, 28 Mar 2022 07:41:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:from:to:references:in-reply-to; bh=Cg2F7UDHJZ7sgM8LcivxwofxwwMGZJhbdHIMJRH+cMY=; b=FeJahqXNPaNGuuWUXogp2innXYMFe3M9+o/+78+bMUJwD3GuV816IHfJg2RaYROSkK 0pa52/fGzJ+9kS6Vcju3PG8IwVCXi+7fQJlEbY4OYN+0GeyceHRiCoSOR3hfAhWnIMOn L2I1friEkDut51Z7iEmsUXn3RnHEGnjrTr3SHQpZcFbGAjI65jAcIkzS42I/CAsNZhJk n/+QVaE+MXnm+FOu0zQd2voakGZuYROvpJIB/IL+HfkVOdQWcAkgzWd0h3DMq0qwRfv7 OPGJxdhdEy4qasJSNnQDcb0tNqe1c4NZD/sCdTV39kldk+1QL9aExtSLy4kImZC4HNcU wIbQ== X-Gm-Message-State: AOAM530d0K82jfdvdwn4fJ7RK5tsBUL8H+rF0hOrlUsGTS2sVTsL+z/p Y4kOm+PbfG5lzrUPBd9GA2OG2t3jqJj+PZgv0HiCRHXB18bfeSLO0Si6OBSWymJeQeixTygCZYB 9n6091JX+gXKYDWwDC0f0oa3aoMkHx7eMDlXT9/dc9sdKpGVOwHV+7ud190b6ZABF6VNYG1S3+N szs+HDpJQRJB++94Ld3kI= X-Google-Smtp-Source: ABdhPJzj3HMmbnsoiZPL8wlSCuG9PIBPjgbMUU4oszOJTXD0t30VRn03Mhf7drzIMI3JPx2Ttqmnpw== X-Received: by 2002:a17:902:e892:b0:153:db4c:8ccf with SMTP id w18-20020a170902e89200b00153db4c8ccfmr26004644plg.17.1648478461010; Mon, 28 Mar 2022 07:41:01 -0700 (PDT) Received: from [172.16.185.109] ([103.175.111.222]) by smtp.gmail.com with ESMTPSA id k187-20020a636fc4000000b003983a01b896sm4641980pgc.90.2022.03.28.07.40.58 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 28 Mar 2022 07:41:00 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------W8tOTd8uHMg0zhwCz7q3OxxO" Message-ID: <8ea26b0e-40e2-9e7c-4470-5add7a02a074@woven-planet.global> Date: Mon, 28 Mar 2022 16:40:52 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.7.0 Subject: [PATCH] Add condition coverage profiling Content-Language: en-US From: =?UTF-8?Q?J=c3=b8rgen_Kvalsvik?= To: gcc-patches@gcc.gnu.org References: <8041d06d-219d-c83a-ff8f-9c75227cb072@woven-planet.global> In-Reply-To: <8041d06d-219d-c83a-ff8f-9c75227cb072@woven-planet.global> X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, WEIRD_PORT autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Mar 2022 14:41:11 -0000 This is a multi-part message in MIME format. --------------W8tOTd8uHMg0zhwCz7q3OxxO Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 28/03/2022 15:52, Jørgen Kvalsvik wrote: > Hello, > > I have made some changes based on the review feedback, please have a look. In > summary: > > * Support for -profile=atomic > * gcc -fprofile-conditions does not ICE without -fprofile-arcs > * Indentation and formatting complies with contrib/GNU_style_check > * Some small adjustment to documentation, phrasing > > As mentioned in the previous message, I think it should only be necessary to do > atomic fetch/store on the global accumulators, not the locals (as they are > specific to the activation record). If is wrong then I have no problems > extending the atomics to the function-local accumulators too, please let me > know. I added a simple test case for -profile=update, gcov-20.c. > > I've added checks for profile_condition_flag everywhere the profile_arc_flag is > checked, as they share the same code paths and infrastructure. I also made it so > that -fprofile-conditions is sufficient for linking gcov. > > gcc will no longer crash on -fprofile-conditions -fprofile-generate by > explicitly checking coverage_begin_*. I'm not too happy with how it turned out, > but the condition coverage needs a lot more analysis before it can write out its > gcov structure, which doesn't fit with the flow of branch_prob (). > > Thanks, > Jørgen > > On 25/03/2022 20:44, Jørgen Kvalsvik wrote: >> Hello, and thanks for the review! >> >>> 1) Do I correctly understand that __conditions_accu_true/false track >>> every short-circuit sub-expression of a condition and record >>> if a given sub-expr is seen to be true or false? >> >> Sort-of. It is not really aware of sub-expressions at all, but tracks every >> boolean condition/term in the full expression, mapped to a bitvector. I usually >> find it easier to understand visually: >> >> if (a || (b && c) || d) >> >> terms | a b c d >> ------|-------- >> true | 0 0 0 0 >> false | 0 0 0 0 >> >> Whenever a = true, true becomes 1000 and false remains 0000. a = true would >> short-circuit, (implemented as a normal edge to the "exit" node of the >> expression) leaving bcd unevaluated. Coverage is then determined as the number >> of unset bits in this vector. The accumulators are zero'd on every function >> entry, and |= into the global "counter" on function exit. >> >>> 2) As mentioned these are bit sets, can you please explain why you (& >>> -value) from these sets? >> >> Yes, excellent question. This should answer 3) too, and is the most surprsing >> thing when unfamiliar with MC/DC. >> >> For modified condition/decision coverage we need to prove that a condition's >> value independently affects the outcome/decision. In other words, would >> flipping a condition change the outcome? >> >> Let's take your if (a || b) check, which says that 1/4 conditions are covered >> on (0, 1). If a = 1, the expression is always true, and b is never evaluated. >> In fact, the value of b does not change the outcome at all, so intuitively only >> 1/4 of the conditions are covered. >> >> On (0, 1) b gets evaluated, so in a way we know that a = 0. However, the value >> of a will no longer affect the outcome because (* || 1) is always true. In a >> way, you can think of it as reverse short-circuiting, the same thing would >> happen on (* && 0). This is what Wahlen, Heimdahl, and De Silva calls masking. >> What I do is figure out when masking must happen by analyzing the CFG and zero >> out the bits that are masked (i.e. no longer affect the outcome). This is in >> practice what happens to the bits when regular short circuiting happen. >> >> So while (0, 1) "sees" the condition a = false, it cannot prove that it >> mattered based on your inputs. In general, you need N+1 test cases to cover N >> conditionals with MC/DC. As a consequence, the only way of covering a = false >> is (0, 0), which alone would be 2/4 cases covered. >> >> I hope this made it clearer, if not I can write a more elaborate explanation >> with more examples. >> >>> 4) I noticed various CFG patterns in tree-profile.cc which are handled. Can >>> you please explain how the algorithm works even without knowing the original >>> paper? >> >> My paper is not written yet, but I will describe the high-level algorithm (+ >> extracts from source comments) at the end of this email, as it is a bit long. >> >>> 5) I noticed the following ICE: >> Yes, this is an unfortunate flaw - I piggyback on the setup done by branch >> coverage, which means I silently assume --coverage is used. I was unsure what >> to do (and meant to ask, sorry!) as it is a larger decision - should >> condition-coverage also imply branch coverage? Should condition coverage work >> on its own? Other options? >> >> I'm happy to implement either strategy - please advise on what you would >> prefer. >> >> >>> 6) Please follow the GNU coding style, most notable we replace 8 spaces with >>> a tab. And we break line before {, (, ... Remove noexcept specifiers for >>> functions and I think most of the newly added functions can be static. And >>> each newly added function should have a comment. >> >> Sure thing, I'll add some tabs. All the helper functions are already static (in >> an unnamed namespace), but I can remove the namespace and/or add static. >> >>> 7) Please consider supporting of -profile-update=atomic where you'll need to >>> utilize an atomic builts (see how other instrumentation looks like with >>> it). >> Will do! I always intended to support the atomics, not having them there is an >> oversight. To confirm, I will only need to use atomics for the global counters, >> right? The per-call accumulators are local to each activation record and should >> not need the atomics, or am I missing something? >> >> ALGORITHM >> >> Phase 1: expression isolation from CFG analysis >> >> Break the CFG into smaller pieces ("sections") by splitting it on dominators. >> No expression can cross a dominator, so becomes a natural way of terminating >> expression searches. >> >> For each section, do a BFS from the root node and collect all reachable nodes >> following edges that point to "conditional" nodes, i.e. nodes with outgoing >> true&false edges. Series of single-parent single-exit nodes are contracted. >> This gives a good estimate for an expression, but might include conditions in >> the if/else blocks. >> >> The algorithm then collects the immediate neighborhood, i.e. all nodes adjacent >> to the collected set, dropping everything in the set itself. Then, a new BFS is >> performed, but now "upwards" (i.e. following predecessors), skipping any >> neighbor not dominated by the root (this eliminates loops and other expressions >> with the same "exit" block, see BFS-up). The intersection of all the paths >> found with this BFS is the isolated expression. >> >> If the root is not a conditional, it is skipped and it's successor >> becomes the new root. If an expression is found it has a pair of "expression >> sucessors", and the algorithm recurses into both, evaluating this sub-section >> in isolation, i.e. >> >> if (a || b) { >> root: >> if (c && d) { >> ... >> } >> ... >> sink: >> } >> >> The sections between the root and sink labels are evaulated as if the outer >> expression did not exist. >> >> From the comments: >> >> 1. Collect all nodes reachable from the root node through (contracted) paths >> of true/false edges. >> 2. Collect the neighbors of the reachable node (set). >> 3. From every node in the neighborhood, walk the up the CFG and mark every >> reachable node. Only the nodes reachable from *every* node in the >> neighborhood are a part of the first expression. >> 4. Record the expression plus the two successors of the last (highest-index) >> node in the expression, i.e. the last term. >> 5. Repeat using the two successors as new root nodes. >> >> It is not guaranteed to find nodes in the order of the expression, i.e. it >> might find (a || b) && c as [a c b], so the output is sorted by >> basic_block->index. >> >> Steps 2 and 3 are necessary to distinguish chained conditionals from >> multi-term conditionals, e.g. to separate >> >> if (a) >> { >> if (b) >> work (); >> } >> if (a && b) >> work (); >> >> >> On BFS-up: >> >> Either block of a conditional could have more decisions and loops, so >> isolate the first decision by set-intersecting all paths from the >> post-dominator to the entry block. >> >> The function returns the number of blocks from n that make up the leading >> expression in prefix order (i.e. the order expected by the instrumenting >> code). When this function returns 0 there are no decisions between pre and >> post, and this segment of the CFG can safely be skipped. >> >> The post nodes can have predecessors that do not belong to this subgraph, >> which are skipped. This is expected, for example when there is a >> conditional in the else-block of a larger expression: >> >> if (A) >> { >> if (B) {} >> } else { >> if (C) {} else {} >> } >> >> A >> t / \ f >> / \ >> B C >> /\ / \ >> / \ T F >> T \ \ / >> \ | o >> \ | / >> \ | / >> \|/ >> E >> >> Processing [B, E) which looks like: >> >> B >> /| >> / | >> T | >> \ / >> E ----> o // predecessor outside [B, e) >> >> >> Phase 2: Masking vector and instrumentation >> >> The input to this phase is the basic blocks that make up every expression, plus >> its two exit nodes, i.e. the 3-term expression (a || b || c) yields the input >> [a b c T F] to phase 2. >> >> For every expression, allocate two local accumulators (bit-vectors), one for >> the true-vector, one for the false-vector. These are zero'd on function entry >> and flushed on function exit. >> >> For each "conditional" block (a b c), unconditionally set the corresponding bit >> when an edge in the CFG is taken. Rough pseudo-gimple illustration: >> >> if (a) { >> accu_true |= 1 << 0 >> goto done; >> } else { >> accu_false |= 1 << 0 >> if (b) { >> accu_true |= 1 << 1; >> goto done; >> } else { >> accu_false |= 1 << 1; >> ... >> } >> } >> >> global_true[expr_n] |= accu_true >> global_false[expr_n] |= accu_false >> >> This alone would more-or-less be branch coverage, but would not prove that >> terms would independently decide the outcome. To find masking, the expression >> is walked in search of triangles. A || B as a decision diagram becomes >> >> A >> t|\f >> | \ >> | B >> |t/ \f >> |/ \ >> T F >> >> and we search for triangles like ATB, that is nodes with 2 predecessors with >> the same boolean value, where the two predecessors are connected with the >> opposite value. This marks a candidate for masking, and the terms masked are >> determined by chasing predecessors starting at the top of the triangle for as >> long as the chain of predecessors have the same truth value as the "exit" >> edges. This set is often empty. >> >> The edge that triggers masking is then instrumented with a accu &= mask which >> wipes out anything that does not independently affect the outcome. Note that >> nothing is ever wiped from the global accumulator, only the local. The (a || b) >> example had a false vector of [1, 0] at some point, but it was wiped by the >> masking operation (b = 1 is the only masking value for a || b). >> >> From the comments: >> >> Scan the blocks that make up an expression and look for conditions that >> would mask other conditions. For a deeper discussion on masking, see >> Whalen, Heimdahl, De Silva "Efficient Test Coverage Measurement for MC/DC". >> Masking is best illustrated with an example: >> >> A || B. If B is true then A will does not independently affect the >> decision. In a way, this is "reverse" short circuiting, and always work on >> the right-hand side of expressions. * || true is always true and * && >> false is always false - the left-hand-side does not affect the outcome, and >> their values should not contribute to modified condition/decision coverage. >> >> A || B interpreted as a decision diagram becomes: >> >> A >> t|\f >> | \ >> | B >> |t/ \f >> |/ \ >> T F >> >> The algorithm looks for triangles like ATB. Masking right-hand sides happen >> when a block has a pair of incoming edges of the same boolean value, and >> there is an edge connecting the two predecessors with the *opposite* boolean >> value. The masking block is B, and the masked block is A. In this >> particular example: >> >> Masking can affect "outside" its own subexpression; in A || (B && C) if C is >> false, B is masked. However, if (B && C) is true, A gets masked. B && C >> can be determined from evaluating C since !B would short-circuit, so a true >> C would mask A. >> >> A >> t|\f >> | \ >> | \ >> | \ >> | B >> | t/ \f >> | C | >> |t/ \f | >> |/ \ | >> T F >> >> Notice how BFC forms a triangle. Expressions masked by an edge are >> determined by: >> * Go to the predecessor with truth value b (if it exists). >> * Follow the path of ancestors with taking only !b edges, recording every >> node from here on. >> >> For the case where C can mask A, the path goes C [true]-> B -> [false] A, so >> C [true] masks A. >> >> The mask is output as a bit-set stored in a gcov_type_unsigned. The >> bit-sets are output in pairs, one for each decision (the outcome of the >> boolean expression, or which arc to take in the CFG). >> >> Phase 3: reading the report >> >> This is pretty standard gcov stuff, except the "counters" are interpreted as >> bitsets, and the number of terms in the expressions is stored. Coverage then >> becomes popcount / expected. >> >> Final remarks: >> >> Granted, this is a bit dense, but I think the overall approach is easy to grasp >> when supported by a lot of example graphs and stepping. I will try to type up a >> bunch with the paper and publish, but for now all I have is the code (which I >> hope for the most part is easy to follow). I'll update this with style updates >> and atomics support, but I would prefer a maintainer to make the call if this >> condition coverage should imply branch coverage, or if it should work without it. >> >> Thanks, >> Jørgen >> >> On 24/03/2022 17:08, Martin Liška via Gcc-patches wrote: >>> On 3/21/22 12:55, Jørgen Kvalsvik via Gcc-patches wrote: >>> >>> Hello. >>> >>> Thanks for very interesting extension of the existing GCOV profiling. >>> >>> I briefly read the patch and investigated what happens and I've got various >>> questions/comments about it: >>> >>> 1) Do I correctly understand that __conditions_accu_true/false track >>> every short-circuit sub-expression of a condition and record >>> if a given sub-expr is seen to be true or false? >>> >>> 2) As mentioned these are bit sets, can you please explain why you (& -value) >>> from these sets? >>> >>> 3) I noticed a false report for a simple test-case: >>> >>> $ cat cond.c >>> int x; >>> >>> void foo (int a, int b) >>> { >>> if (a || b) >>> x = 1; >>> else >>> x = 2; >>> } >>> >>> int main() >>> { >>> foo (0, 1); >>> return 0; >>> } >>> >>> $ rm *gcda ; gcc --coverage cond.c -fprofile-conditions && ./a.out && gcov -g -t a-cond.c >>> -: 0:Source:cond.c >>> -: 0:Graph:a-cond.gcno >>> -: 0:Data:a-cond.gcda >>> -: 0:Runs:1 >>> -: 1:int x; >>> -: 2: >>> 1: 3:void foo (int a, int b) >>> -: 4:{ >>> 1: 5: if (a || b) >>> conditions covered 1/4 >>> condition 0 not covered (true) >>> condition 0 not covered (false) <-- this was executed if I'm correct >>> condition 1 not covered (false) >>> 1: 6: x = 1; >>> -: 7: else >>> #####: 8: x = 2; >>> 1: 9:} >>> -: 10: >>> 1: 11:int main() >>> -: 12:{ >>> 1: 13: foo (0, 1); >>> 1: 14: return 0; >>> -: 15:} >>> >>> 4) I noticed various CFG patterns in tree-profile.cc which are handled. Can you please >>> explain how the algorithm works even without knowing the original paper? >>> >>> 5) I noticed the following ICE: >>> >>> $ gcc cond.c -fprofile-conditions -fprofile-generate >>> during IPA pass: profile >>> cond.c: In function ?foo?: >>> cond.c:15:1: internal compiler error: Segmentation fault >>> 15 | } >>> | ^ >>> 0xf4d64a crash_signal >>> /home/marxin/Programming/gcc/gcc/toplev.cc:322 >>> 0x7ffff78b93cf ??? >>> /usr/src/debug/glibc-2.35-2.1.x86_64/signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0 >>> 0x7ffff78f29ed __GI__IO_ftell >>> /usr/src/debug/glibc-2.35-2.1.x86_64/libio/ioftell.c:37 >>> 0xa9dfda gcov_position >>> /home/marxin/Programming/gcc/gcc/gcov-io.cc:48 >>> 0xa9dfda gcov_write_tag(unsigned int) >>> /home/marxin/Programming/gcc/gcc/gcov-io.cc:321 >>> 0xe9734a branch_prob(bool) >>> /home/marxin/Programming/gcc/gcc/profile.cc:1542 >>> 0x1032e08 tree_profiling >>> /home/marxin/Programming/gcc/gcc/tree-profile.cc:1620 >>> 0x1032e08 execute >>> /home/marxin/Programming/gcc/gcc/tree-profile.cc:1726 >>> Please submit a full bug report, with preprocessed source (by using -freport-bug). >>> Please include the complete backtrace with any bug report. >>> See for instructions. >>> >>> 6) Please follow the GNU coding style, most notable we replace 8 spaces with a tab. >>> And we break line before {, (, ... Remove noexcept specifiers for functions and I think >>> most of the newly added functions can be static. And each newly added function should >>> have a comment. >>> >>> 7) Please consider supporting of -profile-update=atomic where you'll need to utilize >>> an atomic builts (see how other instrumentation looks like with it). >>> >>> That's the very first round of the review. Hope it's helpful. >>> >>> Cheers, >>> Martin >>> >>>> This patch adds support in gcc+gcov for modified condition/decision >>>> coverage (MC/DC) with the -fprofile-conditions flag. MC/DC is a type of >>>> test/code coverage, and it is particularly important in the avation and >>>> automotive industries for safety-critical applications. In particular, >>>> it is required or recommended by: >>>> >>>> * DO-178C for the most critical software (Level A) in avionics >>>> * IEC 61508 for SIL 4 >>>> * ISO 26262-6 for ASIL D >>>> >>>> From the SQLite webpage: >>>> >>>> Two methods of measuring test coverage were described above: >>>> "statement" and "branch" coverage. There are many other test >>>> coverage metrics besides these two. Another popular metric is >>>> "Modified Condition/Decision Coverage" or MC/DC. Wikipedia defines >>>> MC/DC as follows: >>>> >>>> * Each decision tries every possible outcome. >>>> * Each condition in a decision takes on every possible outcome. >>>> * Each entry and exit point is invoked. >>>> * Each condition in a decision is shown to independently affect >>>> the outcome of the decision. >>>> >>>> In the C programming language where && and || are "short-circuit" >>>> operators, MC/DC and branch coverage are very nearly the same thing. >>>> The primary difference is in boolean vector tests. One can test for >>>> any of several bits in bit-vector and still obtain 100% branch test >>>> coverage even though the second element of MC/DC - the requirement >>>> that each condition in a decision take on every possible outcome - >>>> might not be satisfied. >>>> >>>> https://sqlite.org/testing.html#mcdc >>>> >>>> Wahlen, Heimdahl, and De Silva "Efficient Test Coverage Measurement for >>>> MC/DC" describes an algorithm for adding instrumentation by carrying >>>> over information from the AST, but my algorithm does analysis on the >>>> control flow graph. This should make it work for any language gcc >>>> supports, although I have only tested it on constructs in C and C++, see >>>> testsuite/gcc.misc-tests and testsuite/g++.dg. >>>> >>>> Like Wahlen et al this implementation uses bitsets to store conditions, >>>> which gcov later interprets. This is very fast, but introduces an max >>>> limit for the number of terms in a single boolean expression. This limit >>>> is the number of bits in a gcov_unsigned_type (which is typedef'd to >>>> uint64_t), so for most practical purposes this would be acceptable. >>>> limitation can be relaxed with a more sophisticated way of storing and >>>> updating bitsets (for example length-encoding). >>>> >>>> In action it looks pretty similar to the branch coverage. The -g short >>>> opt carries no significance, but was chosen because it was an available >>>> option with the upper-case free too. >>>> >>>> gcov --conditions: >>>> >>>> 3: 17:void fn (int a, int b, int c, int d) { >>>> 3: 18: if ((a && (b || c)) && d) >>>> conditions covered 5/8 >>>> condition 1 not covered (false) >>>> condition 2 not covered (true) >>>> condition 2 not covered (false) >>>> 1: 19: x = 1; >>>> -: 20: else >>>> 2: 21: x = 2; >>>> 3: 22:} >>>> >>>> gcov --conditions --json-format: >>>> >>>> "conditions": [ >>>> { >>>> "not_covered_false": [ >>>> 1, >>>> 2 >>>> ], >>>> "count": 8, >>>> "covered": 5, >>>> "not_covered_true": [ >>>> 2 >>>> ] >>>> } >>>> ], >>>> >>>> C++ destructors will add extra conditionals that are not explicitly >>>> present in source code. These are present in the CFG, which means the >>>> condition coverage will show them. >>>> >>>> gcov --conditions >>>> >>>> -: 5:struct A { >>>> 1: 6: explicit A (int x) : v (x) {} >>>> 1: 7: operator bool () const { return bool(v); } >>>> 1: 8: ~A() {} >>>> -: 9: >>>> -: 10: int v; >>>> -: 11:}; >>>> -: 12: >>>> 2: 13:void fn (int a, int b) { >>>> 2*: 14: x = a && A(b); >>>> conditions covered 2/4 >>>> condition 0 not covered (true) >>>> condition 1 not covered (true) >>>> conditions covered 2/2 >>>> >>>> They are also reported by the branch coverage. >>>> >>>> gcov -bc >>>> >>>> 2*: 14: x = a && A(b); >>>> branch 0 taken 1 (fallthrough) >>>> branch 1 taken 1 >>>> call 2 returned 1 >>>> call 3 returned 1 >>>> branch 4 taken 0 (fallthrough) >>>> branch 5 taken 1 >>>> branch 6 taken 1 (fallthrough) >>>> branch 7 taken 1 >>>> >>>> The algorithm struggles in a particular case where gcc would generate >>>> identical CFGs for different expressions: >>>> >>>> and.c: >>>> >>>> if (a && b && c) >>>> x = 1; >>>> >>>> ifs.c: >>>> >>>> if (a) >>>> if (b) >>>> if (c) >>>> x = 1; >>>> >>>> if (a && b && c) >>>> x = 1; >>>> >>>> and.c.gcov: >>>> >>>> #####: 2: if (a && b && c) >>>> conditions covered 2/2 >>>> conditions covered 2/2 >>>> conditions covered 2/2 >>>> #####: 3: x = 1; >>>> >>>> ifs.c.gcov: >>>> #####: 2: if (a) >>>> conditions covered 2/2 >>>> #####: 3: 2 if (b) >>>> conditions covered 2/2 >>>> #####: 4: 2 if (c) >>>> conditions covered 2/2 >>>> #####: 5: x = 1; >>>> >>>> These programs are semantically equivalent, and are interpreted as 3 >>>> separate conditional expressions. It does not matter w.r.t. coverage, >>>> but is not ideal. Adding an else to and.c fixes the issue: >>>> >>>> #####: 2: if (a && b && c) >>>> conditions covered 6/6 >>>> #####: 3: x = 1; >>>> #####: 4: else x = x; >>>> >>>> In the (a && b && c) case the else block must be shared between all >>>> three conditionals, and for if (a) if (b) if (c) there would be three >>>> *separate* else blocks. >>>> >>>> Since the algorithm works on CFGs, it cannot detect conditionals (from >>>> ternaries) that don't get an entry in the cfg. For example, >>>> int x = a ? 0 : 1 in gimple becomes _x = (_a == 0). From source you >>>> would expect coverage, but it gets neither branch nor condition >>>> coverage. For completeness, it could be achieved by scanning all gimple >>>> statements for comparisons, and insert an extra instruction for >>>> recording the outcome. >>>> >>>> The test suite consists of all different CFG kinds and control flow >>>> structures I could find, but there is certainly room for many more. >>>> >>>> Alternative email: Jørgen Kvalsvik >>>> >>>> -- >>>> >>>> Some final remarks (not a part of the commit message), this is written in a C++ style that I felt meshed well with what was already there, but if the maintainers would prefer a different approach then I'm happy to to make adjustments. I plan to write a more thorough description of the algorithm, as well as adding the same feature to clang as it is very useful for us at Woven Planet. >>>> >>>> I tried to pick flag names and options that were comfortable and descriptive, but if you have better names or different ideas for flags then I am happy to change them. The --coverage flag was not changed to imply -fprofile-conditions, but it is possibly something to consider. >>>> >>>> gcc/ChangeLog: >>>> >>>> * common.opt: Add new options -fprofile-conditions and >>>> -Wcoverage-too-many-conditions. >>>> * doc/gcov.texi: Add --conditions documentation. >>>> * doc/invoke.texi: Add -fprofile-conditions documentation. >>>> * gcov-counter.def (GCOV_COUNTER_CONDS): New. >>>> * gcov-io.h (GCOV_TAG_CONDS): New. >>>> (GCOV_TAG_CONDS_LENGTH): Likewise. >>>> (GCOV_TAG_CONDS_NUM): Likewise. >>>> * gcov.cc (class condition_info): New. >>>> (condition_info::condition_info): New. >>>> (condition_info::popcount): New. >>>> (struct coverage_info): New. >>>> (add_condition_counts): New. >>>> (output_conditions): New. >>>> (print_usage): Add -g, --conditions. >>>> (process_args): Likewise. >>>> (output_intermediate_json_line): Output conditions. >>>> (read_graph_file): Read conditions counters. >>>> (read_count_file): Read conditions counters. >>>> (file_summary): Print conditions. >>>> (accumulate_line_info): Accumulate conditions. >>>> (output_line_details): Print conditions. >>>> * profile.cc (find_conditions): New declaration. >>>> (instrument_decisions): New declaration. >>>> (branch_prob): Call find_conditions, instrument_decisions. >>>> (init_branch_prob): Add total_num_conds. >>>> (end_branch_prob): Likewise. >>>> * tree-profile.cc (INCLUDE_ALGORITHM): Define. >>>> (struct conds_ctx): New. >>>> (CONDITIONS_MAX_TERMS): New. >>>> (index_of): New. >>>> (index_lt): New. >>>> (single): New. >>>> (single_edge): New. >>>> (contract_edge): New. >>>> (contract_edge_up): New. >>>> (is_conditional_p): New. >>>> (collect_neighbors): New. >>>> (find_first_conditional): New. >>>> (emit_bitwise_op): New. >>>> (collect_conditions): New. >>>> (find_conditions): New. >>>> (instrument_decisions): New. >>>> >>>> gcc/testsuite/ChangeLog: >>>> >>>> * lib/gcov.exp: >>>> * g++.dg/gcov/gcov-18.C: New test. >>>> * gcc.misc-tests/gcov-19.c: New test. >>>> --- >>>> gcc/common.opt | 8 + >>>> gcc/doc/gcov.texi | 36 ++ >>>> gcc/doc/invoke.texi | 19 + >>>> gcc/gcov-counter.def | 3 + >>>> gcc/gcov-io.h | 3 + >>>> gcc/gcov.cc | 177 +++++- >>>> gcc/profile.cc | 51 +- >>>> gcc/testsuite/g++.dg/gcov/gcov-18.C | 209 ++++++ >>>> gcc/testsuite/gcc.misc-tests/gcov-19.c | 726 +++++++++++++++++++++ >>>> gcc/testsuite/lib/gcov.exp | 187 +++++- >>>> gcc/tree-profile.cc | 838 +++++++++++++++++++++++++ >>>> 11 files changed, 2248 insertions(+), 9 deletions(-) >>>> create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-18.C >>>> create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-19.c >> ... And with another tiny change that fixes Martin's while (1); case. --------------W8tOTd8uHMg0zhwCz7q3OxxO Content-Type: text/plain; charset=UTF-8; name="0001-Add-condition-coverage-profiling.patch" Content-Disposition: attachment; filename="0001-Add-condition-coverage-profiling.patch" Content-Transfer-Encoding: base64 RnJvbSA2ZDg3YjFiZWRlNjdlZjE5NzNmZDY1ZjM1N2UyNDQ0MjliZDFhMzhhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/Sj1DMz1COHJnZW49MjBLdmFsc3Zp az89CiA8am9yZ2VuLmt2YWxzdmlrQHdvdmVuLXBsYW5ldC5nbG9iYWw+CkRhdGU6IE1vbiwg MzEgSmFuIDIwMjIgMTI6NDk6MzcgKzAxMDAKU3ViamVjdDogW1BBVENIXSBBZGQgY29uZGl0 aW9uIGNvdmVyYWdlIHByb2ZpbGluZwpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6 IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog OGJpdAoKVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgaW4gZ2NjK2djb3YgZm9yIG1vZGlmaWVk IGNvbmRpdGlvbi9kZWNpc2lvbgpjb3ZlcmFnZSAoTUMvREMpIHdpdGggdGhlIC1mcHJvZmls ZS1jb25kaXRpb25zIGZsYWcuIE1DL0RDIGlzIGEgdHlwZSBvZgp0ZXN0L2NvZGUgY292ZXJh Z2UsIGFuZCBpdCBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGluIHRoZSBhdmF0aW9uIGFu ZAphdXRvbW90aXZlIGluZHVzdHJpZXMgZm9yIHNhZmV0eS1jcml0aWNhbCBhcHBsaWNhdGlv bnMuIEluIHBhcnRpY3VsYXIsCml0IGlzIHJlcXVpcmVkIG9yIHJlY29tbWVuZGVkIGJ5OgoK ICAgICogRE8tMTc4QyBmb3IgdGhlIG1vc3QgY3JpdGljYWwgc29mdHdhcmUgKExldmVsIEEp IGluIGF2aW9uaWNzCiAgICAqIElFQyA2MTUwOCBmb3IgU0lMIDQKICAgICogSVNPIDI2MjYy LTYgZm9yIEFTSUwgRAoKRnJvbSB0aGUgU1FMaXRlIHdlYnBhZ2U6CgogICAgVHdvIG1ldGhv ZHMgb2YgbWVhc3VyaW5nIHRlc3QgY292ZXJhZ2Ugd2VyZSBkZXNjcmliZWQgYWJvdmU6CiAg ICAic3RhdGVtZW50IiBhbmQgImJyYW5jaCIgY292ZXJhZ2UuIFRoZXJlIGFyZSBtYW55IG90 aGVyIHRlc3QKICAgIGNvdmVyYWdlIG1ldHJpY3MgYmVzaWRlcyB0aGVzZSB0d28uIEFub3Ro ZXIgcG9wdWxhciBtZXRyaWMgaXMKICAgICJNb2RpZmllZCBDb25kaXRpb24vRGVjaXNpb24g Q292ZXJhZ2UiIG9yIE1DL0RDLiBXaWtpcGVkaWEgZGVmaW5lcwogICAgTUMvREMgYXMgZm9s bG93czoKCiAgICAgICAgKiBFYWNoIGRlY2lzaW9uIHRyaWVzIGV2ZXJ5IHBvc3NpYmxlIG91 dGNvbWUuCiAgICAgICAgKiBFYWNoIGNvbmRpdGlvbiBpbiBhIGRlY2lzaW9uIHRha2VzIG9u IGV2ZXJ5IHBvc3NpYmxlIG91dGNvbWUuCiAgICAgICAgKiBFYWNoIGVudHJ5IGFuZCBleGl0 IHBvaW50IGlzIGludm9rZWQuCiAgICAgICAgKiBFYWNoIGNvbmRpdGlvbiBpbiBhIGRlY2lz aW9uIGlzIHNob3duIHRvIGluZGVwZW5kZW50bHkgYWZmZWN0CiAgICAgICAgICB0aGUgb3V0 Y29tZSBvZiB0aGUgZGVjaXNpb24uCgogICAgSW4gdGhlIEMgcHJvZ3JhbW1pbmcgbGFuZ3Vh Z2Ugd2hlcmUgJiYgYW5kIHx8IGFyZSAic2hvcnQtY2lyY3VpdCIKICAgIG9wZXJhdG9ycywg TUMvREMgYW5kIGJyYW5jaCBjb3ZlcmFnZSBhcmUgdmVyeSBuZWFybHkgdGhlIHNhbWUgdGhp bmcuCiAgICBUaGUgcHJpbWFyeSBkaWZmZXJlbmNlIGlzIGluIGJvb2xlYW4gdmVjdG9yIHRl c3RzLiBPbmUgY2FuIHRlc3QgZm9yCiAgICBhbnkgb2Ygc2V2ZXJhbCBiaXRzIGluIGJpdC12 ZWN0b3IgYW5kIHN0aWxsIG9idGFpbiAxMDAlIGJyYW5jaCB0ZXN0CiAgICBjb3ZlcmFnZSBl dmVuIHRob3VnaCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgTUMvREMgLSB0aGUgcmVxdWlyZW1l bnQKICAgIHRoYXQgZWFjaCBjb25kaXRpb24gaW4gYSBkZWNpc2lvbiB0YWtlIG9uIGV2ZXJ5 IHBvc3NpYmxlIG91dGNvbWUgLQogICAgbWlnaHQgbm90IGJlIHNhdGlzZmllZC4KCiAgICBo dHRwczovL3NxbGl0ZS5vcmcvdGVzdGluZy5odG1sI21jZGMKCldhaGxlbiwgSGVpbWRhaGws IGFuZCBEZSBTaWx2YSAiRWZmaWNpZW50IFRlc3QgQ292ZXJhZ2UgTWVhc3VyZW1lbnQgZm9y Ck1DL0RDIiBkZXNjcmliZXMgYW4gYWxnb3JpdGhtIGZvciBhZGRpbmcgaW5zdHJ1bWVudGF0 aW9uIGJ5IGNhcnJ5aW5nCm92ZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgQVNULCBidXQgbXkg YWxnb3JpdGhtIGRvZXMgYW5hbHlzaXMgb24gdGhlCmNvbnRyb2wgZmxvdyBncmFwaC4gVGhp cyBzaG91bGQgbWFrZSBpdCB3b3JrIGZvciBhbnkgbGFuZ3VhZ2UgZ2NjCnN1cHBvcnRzLCBh bHRob3VnaCBJIGhhdmUgb25seSB0ZXN0ZWQgaXQgb24gY29uc3RydWN0cyBpbiBDIGFuZCBD KyssIHNlZQp0ZXN0c3VpdGUvZ2NjLm1pc2MtdGVzdHMgYW5kIHRlc3RzdWl0ZS9nKysuZGcu CgpMaWtlIFdhaGxlbiBldCBhbCB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYml0c2V0cyB0 byBzdG9yZSBjb25kaXRpb25zLAp3aGljaCBnY292IGxhdGVyIGludGVycHJldHMuIFRoaXMg aXMgdmVyeSBmYXN0LCBidXQgaW50cm9kdWNlcyBhbiBtYXgKbGltaXQgZm9yIHRoZSBudW1i ZXIgb2YgdGVybXMgaW4gYSBzaW5nbGUgYm9vbGVhbiBleHByZXNzaW9uLiBUaGlzIGxpbWl0 CmlzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIGdjb3ZfdW5zaWduZWRfdHlwZSAod2hpY2gg aXMgdHlwZWRlZidkIHRvCnVpbnQ2NF90KSwgc28gZm9yIG1vc3QgcHJhY3RpY2FsIHB1cnBv c2VzIHRoaXMgd291bGQgYmUgYWNjZXB0YWJsZS4KbGltaXRhdGlvbiBjYW4gYmUgcmVsYXhl ZCB3aXRoIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHdheSBvZiBzdG9yaW5nIGFuZAp1cGRhdGlu ZyBiaXRzZXRzIChmb3IgZXhhbXBsZSBsZW5ndGgtZW5jb2RpbmcpLgoKSW4gYWN0aW9uIGl0 IGxvb2tzIHByZXR0eSBzaW1pbGFyIHRvIHRoZSBicmFuY2ggY292ZXJhZ2UuIFRoZSAtZyBz aG9ydApvcHQgY2FycmllcyBubyBzaWduaWZpY2FuY2UsIGJ1dCB3YXMgY2hvc2VuIGJlY2F1 c2UgaXQgd2FzIGFuIGF2YWlsYWJsZQpvcHRpb24gd2l0aCB0aGUgdXBwZXItY2FzZSBmcmVl IHRvby4KCmdjb3YgLS1jb25kaXRpb25zOgoKICAgICAgICAzOiAgIDE3OnZvaWQgZm4gKGlu dCBhLCBpbnQgYiwgaW50IGMsIGludCBkKSB7CiAgICAgICAgMzogICAxODogICAgaWYgKChh ICYmIChiIHx8IGMpKSAmJiBkKQpjb25kaXRpb25zIGNvdmVyZWQgNS84CmNvbmRpdGlvbiAg MSBub3QgY292ZXJlZCAoZmFsc2UpCmNvbmRpdGlvbiAgMiBub3QgY292ZXJlZCAodHJ1ZSkK Y29uZGl0aW9uICAyIG5vdCBjb3ZlcmVkIChmYWxzZSkKICAgICAgICAxOiAgIDE5OiAgICAg ICAgeCA9IDE7CiAgICAgICAgLTogICAyMDogICAgZWxzZQogICAgICAgIDI6ICAgMjE6ICAg ICAgICB4ID0gMjsKICAgICAgICAzOiAgIDIyOn0KCmdjb3YgLS1jb25kaXRpb25zIC0tanNv bi1mb3JtYXQ6CgogICAgImNvbmRpdGlvbnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAi bm90X2NvdmVyZWRfZmFsc2UiOiBbCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAg ICAgMgogICAgICAgICAgICBdLAogICAgICAgICAgICAiY291bnQiOiA4LAogICAgICAgICAg ICAiY292ZXJlZCI6IDUsCiAgICAgICAgICAgICJub3RfY292ZXJlZF90cnVlIjogWwogICAg ICAgICAgICAgICAgMgogICAgICAgICAgICBdCiAgICAgICAgfQogICAgXSwKCkMrKyBkZXN0 cnVjdG9ycyB3aWxsIGFkZCBleHRyYSBjb25kaXRpb25hbHMgdGhhdCBhcmUgbm90IGV4cGxp Y2l0bHkKcHJlc2VudCBpbiBzb3VyY2UgY29kZS4gVGhlc2UgYXJlIHByZXNlbnQgaW4gdGhl IENGRywgd2hpY2ggbWVhbnMgdGhlCmNvbmRpdGlvbiBjb3ZlcmFnZSB3aWxsIHNob3cgdGhl bS4KCmdjb3YgLS1jb25kaXRpb25zCgogICAgICAgIC06ICAgIDU6c3RydWN0IEEgewogICAg ICAgIDE6ICAgIDY6ICAgIGV4cGxpY2l0IEEgKGludCB4KSA6IHYgKHgpIHt9CiAgICAgICAg MTogICAgNzogICAgb3BlcmF0b3IgYm9vbCAoKSBjb25zdCB7IHJldHVybiBib29sKHYpOyB9 CiAgICAgICAgMTogICAgODogICAgfkEoKSB7fQogICAgICAgIC06ICAgIDk6CiAgICAgICAg LTogICAxMDogICAgaW50IHY7CiAgICAgICAgLTogICAxMTp9OwogICAgICAgIC06ICAgMTI6 CiAgICAgICAgMjogICAxMzp2b2lkIGZuIChpbnQgYSwgaW50IGIpIHsKICAgICAgIDIqOiAg IDE0OiAgICB4ID0gYSAmJiBBKGIpOwpjb25kaXRpb25zIGNvdmVyZWQgMi80CmNvbmRpdGlv biAgMCBub3QgY292ZXJlZCAodHJ1ZSkKY29uZGl0aW9uICAxIG5vdCBjb3ZlcmVkICh0cnVl KQpjb25kaXRpb25zIGNvdmVyZWQgMi8yCgpUaGV5IGFyZSBhbHNvIHJlcG9ydGVkIGJ5IHRo ZSBicmFuY2ggY292ZXJhZ2UuCgpnY292IC1iYwoKICAgICAgIDIqOiAgIDE0OiAgICB4ID0g YSAmJiBBKGIpOwpicmFuY2ggIDAgdGFrZW4gMSAoZmFsbHRocm91Z2gpCmJyYW5jaCAgMSB0 YWtlbiAxCmNhbGwgICAgMiByZXR1cm5lZCAxCmNhbGwgICAgMyByZXR1cm5lZCAxCmJyYW5j aCAgNCB0YWtlbiAwIChmYWxsdGhyb3VnaCkKYnJhbmNoICA1IHRha2VuIDEKYnJhbmNoICA2 IHRha2VuIDEgKGZhbGx0aHJvdWdoKQpicmFuY2ggIDcgdGFrZW4gMQoKVGhlIGFsZ29yaXRo bSBzdHJ1Z2dsZXMgaW4gYSBwYXJ0aWN1bGFyIGNhc2Ugd2hlcmUgZ2NjIHdvdWxkIGdlbmVy YXRlCmlkZW50aWNhbCBDRkdzIGZvciBkaWZmZXJlbnQgZXhwcmVzc2lvbnM6CgphbmQuYzoK CiAgICBpZiAoYSAmJiBiICYmIGMpCiAgICAgICAgeCA9IDE7CgppZnMuYzoKCiAgICBpZiAo YSkKICAgICAgICBpZiAoYikKICAgICAgICAgICAgaWYgKGMpCiAgICAgICAgICAgICAgICB4 ID0gMTsKCiAgICBpZiAoYSAmJiBiICYmIGMpCiAgICAgICAgeCA9IDE7CgphbmQuYy5nY292 OgoKICAgICAgICAgICAgIyMjIyM6ICAgIDI6ICAgIGlmIChhICYmIGIgJiYgYykKY29uZGl0 aW9ucyBjb3ZlcmVkIDIvMgpjb25kaXRpb25zIGNvdmVyZWQgMi8yCmNvbmRpdGlvbnMgY292 ZXJlZCAyLzIKICAgICMjIyMjOiAgICAzOiAgICAgICAgeCA9IDE7CgppZnMuYy5nY292Ogog ICAgIyMjIyM6ICAgIDI6ICAgIGlmIChhKQpjb25kaXRpb25zIGNvdmVyZWQgMi8yCiAgICAj IyMjIzogICAgMzogICAyICAgIGlmIChiKQpjb25kaXRpb25zIGNvdmVyZWQgMi8yCiAgICAj IyMjIzogICAgNDogICAyICAgICAgICBpZiAoYykKY29uZGl0aW9ucyBjb3ZlcmVkIDIvMgog ICAgIyMjIyM6ICAgIDU6ICAgICAgICAgICAgICAgIHggPSAxOwoKVGhlc2UgcHJvZ3JhbXMg YXJlIHNlbWFudGljYWxseSBlcXVpdmFsZW50LCBhbmQgYXJlIGludGVycHJldGVkIGFzIDMK c2VwYXJhdGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMuIEl0IGRvZXMgbm90IG1hdHRlciB3 LnIudC4gY292ZXJhZ2UsCmJ1dCBpcyBub3QgaWRlYWwuIEFkZGluZyBhbiBlbHNlIHRvIGFu ZC5jIGZpeGVzIHRoZSBpc3N1ZToKCiAgICAjIyMjIzogICAgMjogICAgaWYgKGEgJiYgYiAm JiBjKQpjb25kaXRpb25zIGNvdmVyZWQgNi82CiAgICAjIyMjIzogICAgMzogICAgICAgIHgg PSAxOwogICAgIyMjIyM6ICAgIDQ6ICAgIGVsc2UgeCA9IHg7CgpJbiB0aGUgKGEgJiYgYiAm JiBjKSBjYXNlIHRoZSBlbHNlIGJsb2NrIG11c3QgYmUgc2hhcmVkIGJldHdlZW4gYWxsCnRo cmVlIGNvbmRpdGlvbmFscywgYW5kIGZvciBpZiAoYSkgaWYgKGIpIGlmIChjKSB0aGVyZSB3 b3VsZCBiZSB0aHJlZQoqc2VwYXJhdGUqIGVsc2UgYmxvY2tzLgoKU2luY2UgdGhlIGFsZ29y aXRobSB3b3JrcyBvbiBDRkdzLCBpdCBjYW5ub3QgZGV0ZWN0IGNvbmRpdGlvbmFscyAoZnJv bQp0ZXJuYXJpZXMpIHRoYXQgZG9uJ3QgZ2V0IGFuIGVudHJ5IGluIHRoZSBjZmcuIEZvciBl eGFtcGxlLAppbnQgeCA9IGEgPyAwIDogMSBpbiBnaW1wbGUgYmVjb21lcyBfeCA9IChfYSA9 PSAwKS4gRnJvbSBzb3VyY2UgeW91CndvdWxkIGV4cGVjdCBjb3ZlcmFnZSwgYnV0IGl0IGdl dHMgbmVpdGhlciBicmFuY2ggbm9yIGNvbmRpdGlvbgpjb3ZlcmFnZS4gRm9yIGNvbXBsZXRl bmVzcywgaXQgY291bGQgYmUgYWNoaWV2ZWQgYnkgc2Nhbm5pbmcgYWxsIGdpbXBsZQpzdGF0 ZW1lbnRzIGZvciBjb21wYXJpc29ucywgYW5kIGluc2VydCBhbiBleHRyYSBpbnN0cnVjdGlv biBmb3IKcmVjb3JkaW5nIHRoZSBvdXRjb21lLgoKVGhlIHRlc3Qgc3VpdGUgY29uc2lzdHMg b2YgYWxsIGRpZmZlcmVudCBDRkcga2luZHMgYW5kIGNvbnRyb2wgZmxvdwpzdHJ1Y3R1cmVz IEkgY291bGQgZmluZCwgYnV0IHRoZXJlIGlzIGNlcnRhaW5seSByb29tIGZvciBtYW55IG1v cmUuCgpBbHRlcm5hdGl2ZSBlbWFpbDogSsO4cmdlbiBLdmFsc3ZpayA8akBsYW1iZGEuaXM+ CgpnY2MvQ2hhbmdlTG9nOgoKCSogYnVpbHRpbnMuY2MgKGV4cGFuZF9idWlsdGluX2Zvcmtf b3JfZXhlYyk6IENoZWNrCglwcm9maWxlX2NvbmRpdGlvbl9mbGFnLgoJKiBjb21tb24ub3B0 OiBBZGQgbmV3IG9wdGlvbnMgLWZwcm9maWxlLWNvbmRpdGlvbnMgYW5kCgktV2NvdmVyYWdl LXRvby1tYW55LWNvbmRpdGlvbnMuCgkqIGRvYy9nY292LnRleGk6IEFkZCAtLWNvbmRpdGlv bnMgZG9jdW1lbnRhdGlvbi4KCSogZG9jL2ludm9rZS50ZXhpOiBBZGQgLWZwcm9maWxlLWNv bmRpdGlvbnMgZG9jdW1lbnRhdGlvbi4KCSogZ2NjLmNjOiBMaW5rIGdjb3Ygb24gLWZwcm9m aWxlLWNvbmRpdGlvbnMuCgkqIGdjb3YtY291bnRlci5kZWYgKEdDT1ZfQ09VTlRFUl9DT05E Uyk6IE5ldy4KCSogZ2Nvdi1pby5oIChHQ09WX1RBR19DT05EUyk6IE5ldy4KCShHQ09WX1RB R19DT05EU19MRU5HVEgpOiBMaWtld2lzZS4KCShHQ09WX1RBR19DT05EU19OVU0pOiBMaWtl d2lzZS4KCSogZ2Nvdi5jYyAoY2xhc3MgY29uZGl0aW9uX2luZm8pOiBOZXcuCgkoY29uZGl0 aW9uX2luZm86OmNvbmRpdGlvbl9pbmZvKTogTmV3LgoJKGNvbmRpdGlvbl9pbmZvOjpwb3Bj b3VudCk6IE5ldy4KCShzdHJ1Y3QgY292ZXJhZ2VfaW5mbyk6IE5ldy4KCShhZGRfY29uZGl0 aW9uX2NvdW50cyk6IE5ldy4KCShvdXRwdXRfY29uZGl0aW9ucyk6IE5ldy4KCShwcmludF91 c2FnZSk6IEFkZCAtZywgLS1jb25kaXRpb25zLgoJKHByb2Nlc3NfYXJncyk6IExpa2V3aXNl LgoJKG91dHB1dF9pbnRlcm1lZGlhdGVfanNvbl9saW5lKTogT3V0cHV0IGNvbmRpdGlvbnMu CgkocmVhZF9ncmFwaF9maWxlKTogUmVhZCBjb25kaXRpb25zIGNvdW50ZXJzLgoJKHJlYWRf Y291bnRfZmlsZSk6IFJlYWQgY29uZGl0aW9ucyBjb3VudGVycy4KCShmaWxlX3N1bW1hcnkp OiBQcmludCBjb25kaXRpb25zLgoJKGFjY3VtdWxhdGVfbGluZV9pbmZvKTogQWNjdW11bGF0 ZSBjb25kaXRpb25zLgoJKG91dHB1dF9saW5lX2RldGFpbHMpOiBQcmludCBjb25kaXRpb25z LgoJKiBpcGEtaW5saW5lLmNjIChjYW5fZWFybHlfaW5saW5lX2VkZ2VfcCk6IENoZWNrCglw cm9maWxlX2NvbmRpdGlvbl9mbGFnLgoJKiBpcGEtc3BsaXQuY2MgKHBhc3Nfc3BsaXRfZnVu Y3Rpb25zOjpnYXRlKTogTGlrZXdpc2UuCgkqIHBhc3Nlcy5jYyAoZmluaXNoX29wdGltaXph dGlvbl9wYXNzZXMpOiBMaWtld2lzZS4KCSogcHJvZmlsZS5jYyAoZmluZF9jb25kaXRpb25z KTogTmV3IGRlY2xhcmF0aW9uLgoJKGluc3RydW1lbnRfZGVjaXNpb25zKTogTmV3IGRlY2xh cmF0aW9uLgoJKGJyYW5jaF9wcm9iKTogQ2FsbCBmaW5kX2NvbmRpdGlvbnMsIGluc3RydW1l bnRfZGVjaXNpb25zLgoJKGluaXRfYnJhbmNoX3Byb2IpOiBBZGQgdG90YWxfbnVtX2NvbmRz LgoJKGVuZF9icmFuY2hfcHJvYik6IExpa2V3aXNlLgoJKiB0cmVlLXByb2ZpbGUuY2MgKElO Q0xVREVfQUxHT1JJVEhNKTogRGVmaW5lLgoJKHN0cnVjdCBjb25kc19jdHgpOiBOZXcuCgko Q09ORElUSU9OU19NQVhfVEVSTVMpOiBOZXcuCgkoaW5kZXhfb2YpOiBOZXcuCgkoaW5kZXhf bHQpOiBOZXcuCgkoc2luZ2xlKTogTmV3LgoJKHNpbmdsZV9lZGdlKTogTmV3LgoJKGNvbnRy YWN0X2VkZ2UpOiBOZXcuCgkoY29udHJhY3RfZWRnZV91cCk6IE5ldy4KCShpc19jb25kaXRp b25hbF9wKTogTmV3LgoJKGNvbGxlY3RfbmVpZ2hib3JzKTogTmV3LgoJKGZpbmRfZmlyc3Rf Y29uZGl0aW9uYWwpOiBOZXcuCgkoZW1pdF9iaXR3aXNlX29wKTogTmV3LgoJKGNvbGxlY3Rf Y29uZGl0aW9ucyk6IE5ldy4KCShmaW5kX2NvbmRpdGlvbnMpOiBOZXcuCgkoaW5zdHJ1bWVu dF9kZWNpc2lvbnMpOiBOZXcuCgkocGFzc19pcGFfdHJlZV9wcm9maWxlOjpnYXRlKTogQ2hl Y2sgcHJvZmlsZV9jb25kaXRpb25fZmxhZy4KCmdjYy90ZXN0c3VpdGUvQ2hhbmdlTG9nOgoK CSogbGliL2djb3YuZXhwOiBBZGQgY29uZGl0aW9uIGNvdmVyYWdlIHRlc3QgZnVuY3Rpb24u CgkqIGcrKy5kZy9nY292L2djb3YtMTguQzogTmV3IHRlc3QuCgkqIGdjYy5taXNjLXRlc3Rz L2djb3YtMTkuYzogTmV3IHRlc3QuCgkqIGdjYy5taXNjLXRlc3RzL2djb3YtMjAuYzogTmV3 IHRlc3QuCi0tLQogZ2NjL2J1aWx0aW5zLmNjICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDIgKy0KIGdjYy9jb21tb24ub3B0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4ICsK IGdjYy9kb2MvZ2Nvdi50ZXhpICAgICAgICAgICAgICAgICAgICAgIHwgIDM2ICsKIGdjYy9k b2MvaW52b2tlLnRleGkgICAgICAgICAgICAgICAgICAgIHwgIDE5ICsKIGdjYy9nY2MuY2Mg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyICstCiBnY2MvZ2Nvdi1jb3VudGVy LmRlZiAgICAgICAgICAgICAgICAgICB8ICAgMyArCiBnY2MvZ2Nvdi1pby5oICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgMyArCiBnY2MvZ2Nvdi5jYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDE5MyArKysrKy0KIGdjYy9pcGEtaW5saW5lLmNjICAgICAgICAgICAg ICAgICAgICAgIHwgICAyICstCiBnY2MvaXBhLXNwbGl0LmNjICAgICAgICAgICAgICAgICAg ICAgICB8ICAgMyArLQogZ2NjL3Bhc3Nlcy5jYyAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDMgKy0KIGdjYy9wcm9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcy ICstCiBnY2MvdGVzdHN1aXRlL2crKy5kZy9nY292L2djb3YtMTguQyAgICB8IDIyNyArKysr KysrCiBnY2MvdGVzdHN1aXRlL2djYy5taXNjLXRlc3RzL2djb3YtMTkuYyB8IDczNSArKysr KysrKysrKysrKysrKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLm1pc2MtdGVzdHMvZ2Nvdi0y MC5jIHwgIDIxICsKIGdjYy90ZXN0c3VpdGUvbGliL2djb3YuZXhwICAgICAgICAgICAgIHwg MTg3ICsrKysrLQogZ2NjL3RyZWUtcHJvZmlsZS5jYyAgICAgICAgICAgICAgICAgICAgfCA4 ODIgKysrKysrKysrKysrKysrKysrKysrKysrLQogMTcgZmlsZXMgY2hhbmdlZCwgMjM3MyBp bnNlcnRpb25zKCspLCAyNSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2Mv dGVzdHN1aXRlL2crKy5kZy9nY292L2djb3YtMTguQwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdj Yy90ZXN0c3VpdGUvZ2NjLm1pc2MtdGVzdHMvZ2Nvdi0xOS5jCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MubWlzYy10ZXN0cy9nY292LTIwLmMKCmRpZmYgLS1naXQg YS9nY2MvYnVpbHRpbnMuY2MgYi9nY2MvYnVpbHRpbnMuY2MKaW5kZXggNGM2YzI5MzkwNTMu LjY2OTkzNmVmN2I2IDEwMDY0NAotLS0gYS9nY2MvYnVpbHRpbnMuY2MKKysrIGIvZ2NjL2J1 aWx0aW5zLmNjCkBAIC01NTY5LDcgKzU1NjksNyBAQCBleHBhbmRfYnVpbHRpbl9mb3JrX29y X2V4ZWMgKHRyZWUgZm4sIHRyZWUgZXhwLCBydHggdGFyZ2V0LCBpbnQgaWdub3JlKQogICB0 cmVlIGNhbGw7CiAKICAgLyogSWYgd2UgYXJlIG5vdCBwcm9maWxpbmcsIGp1c3QgY2FsbCB0 aGUgZnVuY3Rpb24uICAqLwotICBpZiAoIXByb2ZpbGVfYXJjX2ZsYWcpCisgIGlmICghcHJv ZmlsZV9hcmNfZmxhZyAmJiAhcHJvZmlsZV9jb25kaXRpb25fZmxhZykKICAgICByZXR1cm4g TlVMTF9SVFg7CiAKICAgLyogT3RoZXJ3aXNlIGNhbGwgdGhlIHdyYXBwZXIuICBUaGlzIHNo b3VsZCBiZSBlcXVpdmFsZW50IGZvciB0aGUgcmVzdCBvZgpkaWZmIC0tZ2l0IGEvZ2NjL2Nv bW1vbi5vcHQgYi9nY2MvY29tbW9uLm9wdAppbmRleCA4YjY1MTNkZTQ3Yy4uMmFmZTQzODRk OWQgMTAwNjQ0Ci0tLSBhL2djYy9jb21tb24ub3B0CisrKyBiL2djYy9jb21tb24ub3B0CkBA IC04NjEsNiArODYxLDEwIEBAIFdjb3ZlcmFnZS1pbnZhbGlkLWxpbmUtbnVtYmVyCiBDb21t b24gVmFyKHdhcm5fY292ZXJhZ2VfaW52YWxpZF9saW5lbnVtKSBJbml0KDEpIFdhcm5pbmcK IFdhcm4gaW4gY2FzZSBhIGZ1bmN0aW9uIGVuZHMgZWFybGllciB0aGFuIGl0IGJlZ2lucyBk dWUgdG8gYW4gaW52YWxpZCBsaW5lbnVtIG1hY3Jvcy4KIAorV2NvdmVyYWdlLXRvby1tYW55 LWNvbmRpdGlvbnMKK0NvbW1vbiBWYXIod2Fybl90b29fbWFueV9jb25kaXRpb25zKSBJbml0 KDEpIFdhcm5pbmcKK1dhcm4gd2hlbiBhIGNvbmRpdGlvbmFsIGhhcyB0b28gbWFueSB0ZXJt cyBhbmQgY292ZXJhZ2UgZ2l2ZXMgdXAuCisKIFdtaXNzaW5nLXByb2ZpbGUKIENvbW1vbiBW YXIod2Fybl9taXNzaW5nX3Byb2ZpbGUpIEluaXQoMSkgV2FybmluZwogV2FybiBpbiBjYXNl IHByb2ZpbGVzIGluIC1mcHJvZmlsZS11c2UgZG8gbm90IGV4aXN0LgpAQCAtMjI5MCw2ICsy Mjk0LDEwIEBAIGZwcm9maWxlLWFyY3MKIENvbW1vbiBWYXIocHJvZmlsZV9hcmNfZmxhZykK IEluc2VydCBhcmMtYmFzZWQgcHJvZ3JhbSBwcm9maWxpbmcgY29kZS4KIAorZnByb2ZpbGUt Y29uZGl0aW9ucworQ29tbW9uIFZhcihwcm9maWxlX2NvbmRpdGlvbl9mbGFnKQorSW5zZXJ0 IGNvbmRpdGlvbiBjb3ZlcmFnZSBwcm9maWxpbmcgY29kZS4KKwogZnByb2ZpbGUtZGlyPQog Q29tbW9uIEpvaW5lZCBSZWplY3ROZWdhdGl2ZSBWYXIocHJvZmlsZV9kYXRhX3ByZWZpeCkK IFNldCB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBmb3Igc3RvcmluZyB0aGUgcHJvZmlsZSBk YXRhLgpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy9nY292LnRleGkgYi9nY2MvZG9jL2djb3YudGV4 aQppbmRleCBmYzM5ZGEwZjAyZC4uYTg1YjdmMDk3NjkgMTAwNjQ0Ci0tLSBhL2djYy9kb2Mv Z2Nvdi50ZXhpCisrKyBiL2djYy9kb2MvZ2Nvdi50ZXhpCkBAIC0xMjIsNiArMTIyLDcgQEAg Z2NvdiBbQG9wdGlvbnstdn18QG9wdGlvbnstLXZlcnNpb259XSBbQG9wdGlvbnstaH18QG9w dGlvbnstLWhlbHB9XQogICAgICBbQG9wdGlvbnstYX18QG9wdGlvbnstLWFsbC1ibG9ja3N9 XQogICAgICBbQG9wdGlvbnstYn18QG9wdGlvbnstLWJyYW5jaC1wcm9iYWJpbGl0aWVzfV0K ICAgICAgW0BvcHRpb257LWN9fEBvcHRpb257LS1icmFuY2gtY291bnRzfV0KKyAgICAgW0Bv cHRpb257LWd9fEBvcHRpb257LS1jb25kaXRpb25zfV0KICAgICAgW0BvcHRpb257LWR9fEBv cHRpb257LS1kaXNwbGF5LXByb2dyZXNzfV0KICAgICAgW0BvcHRpb257LWZ9fEBvcHRpb257 LS1mdW5jdGlvbi1zdW1tYXJpZXN9XQogICAgICBbQG9wdGlvbnstan18QG9wdGlvbnstLWpz b24tZm9ybWF0fV0KQEAgLTE2Nyw2ICsxNjgsMTMgQEAgYmUgc2hvd24sIHVubGVzcyB0aGUg QG9wdGlvbnstdX0gb3B0aW9uIGlzIGdpdmVuLgogV3JpdGUgYnJhbmNoIGZyZXF1ZW5jaWVz IGFzIHRoZSBudW1iZXIgb2YgYnJhbmNoZXMgdGFrZW4sIHJhdGhlciB0aGFuCiB0aGUgcGVy Y2VudGFnZSBvZiBicmFuY2hlcyB0YWtlbi4KIAorQGl0ZW0gLWcKK0BpdGVteCAtLWNvbmRp dGlvbnMKK1dyaXRlIGNvbmRpdGlvbiBjb3ZlcmFnZSB0byB0aGUgb3V0cHV0IGZpbGUsIGFu ZCB3cml0ZSBjb25kaXRpb24gc3VtbWFyeSBpbmZvCit0byB0aGUgc3RhbmRhcmQgb3V0cHV0 LiAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBzZWUgaWYgdGhlIGNvbmRpdGlvbnMgaW4K K3lvdXIgcHJvZ3JhbSBhdCBsZWFzdCBvbmNlIGhhZCBhbiBpbmRlcGVuZGVudCBlZmZlY3Qg b24gdGhlIG91dGNvbWUgb2YgdGhlCitib29sZWFuIGV4cHJlc3Npb24gKG1vZGlmaWVkIGNv bmRpdGlvbi9kZWNpc2lvbiBjb3ZlcmFnZSkuCisKIEBpdGVtIC1kCiBAaXRlbXggLS1kaXNw bGF5LXByb2dyZXNzCiBEaXNwbGF5IHRoZSBwcm9ncmVzcyBvbiB0aGUgc3RhbmRhcmQgb3V0 cHV0LgpAQCAtMjkxLDYgKzI5OSw3IEBAIEVhY2ggQHZhcntsaW5lfSBoYXMgdGhlIGZvbGxv d2luZyBmb3JtOgogQHsKICAgImJyYW5jaGVzIjogWyIkYnJhbmNoIl0sCiAgICJjb3VudCI6 IDIsCisgICJjb25kaXRpb25zIjogWyIkY29uZGl0aW9uIl0sCiAgICJsaW5lX251bWJlciI6 IDE1LAogICAidW5leGVjdXRlZF9ibG9jayI6IGZhbHNlLAogICAiZnVuY3Rpb25fbmFtZSI6 ICJmb28iLApAQCAtMzM5LDYgKzM0OCwzMyBAQCBGaWVsZHMgb2YgdGhlIEB2YXJ7YnJhbmNo fSBlbGVtZW50IGhhdmUgZm9sbG93aW5nIHNlbWFudGljczoKIEB2YXJ7dGhyb3d9OiB0cnVl IHdoZW4gdGhlIGJyYW5jaCBpcyBhbiBleGNlcHRpb25hbCBicmFuY2gKIEBlbmQgaXRlbWl6 ZQogCitFYWNoIEB2YXJ7Y29uZGl0aW9ufSBlbGVtZW50IGhhdmUgdGhlIGZvbGxvd2luZyBz ZW1hbnRpY3M6CisKK0BzbWFsbGV4YW1wbGUKK0B7CisgICJjb3VudCI6IDQsCisgICJjb3Zl cmVkIjogMiwKKyAgIm5vdF9jb3ZlcmVkX2ZhbHNlIjogW10sCisgICJub3RfY292ZXJlZF90 cnVlIjogWzAsIDFdLAorQH0KK0BlbmQgc21hbGxleGFtcGxlCisKK0ZpZWxkcyBvZiB0aGUg QHZhcntjb25kaXRpb259IGVsZW1lbnQgaGF2ZSBmb2xsb3dpbmcgc2VtYW50aWNzOgorCitA aXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorQHZhcntjb3VudH06IG51bWJlciBvZiBjb25kaXRp b25zIGluIHRoaXMgZXhwcmVzc2lvbgorCitAaXRlbQorQHZhcntjb3ZlcmVkfTogbnVtYmVy IG9mIGNvdmVyZWQgY29uZGl0aW9ucyBpbiB0aGlzIGV4cHJlc3Npb24KKworQGl0ZW0KK0B2 YXJ7bm90X2NvdmVyZWRfdHJ1ZX06IHRlcm1zLCBieSBpbmRleCwgbm90IHNlZW4gYXMgdHJ1 ZSBpbiB0aGlzIGV4cHJlc3Npb24KKworQGl0ZW0KK0B2YXJ7bm90X2NvdmVyZWRfZmFsc2V9 OiB0ZXJtcywgYnkgaW5kZXgsIG5vdCBzZWVuIGFzIGZhbHNlIGluIHRoaXMgZXhwcmVzc2lv bgorQGVuZCBpdGVtaXplCisKIEBpdGVtIC1ICiBAaXRlbXggLS1odW1hbi1yZWFkYWJsZQog V3JpdGUgY291bnRzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCAobGlrZSAyNC42aykuCmRp ZmYgLS1naXQgYS9nY2MvZG9jL2ludm9rZS50ZXhpIGIvZ2NjL2RvYy9pbnZva2UudGV4aQpp bmRleCBlM2YyZTgyY2RlNS4uMGUyNGU0M2NhNDIgMTAwNjQ0Ci0tLSBhL2djYy9kb2MvaW52 b2tlLnRleGkKKysrIGIvZ2NjL2RvYy9pbnZva2UudGV4aQpAQCAtNTk0LDYgKzU5NCw3IEBA IE9iamVjdGl2ZS1DIGFuZCBPYmplY3RpdmUtQysrIERpYWxlY3RzfS4KIEBpdGVtIFByb2dy YW0gSW5zdHJ1bWVudGF0aW9uIE9wdGlvbnMKIEB4cmVme0luc3RydW1lbnRhdGlvbiBPcHRp b25zLCxQcm9ncmFtIEluc3RydW1lbnRhdGlvbiBPcHRpb25zfS4KIEBnY2NvcHRsaXN0ey1w ICAtcGcgIC1mcHJvZmlsZS1hcmNzICAtLWNvdmVyYWdlICAtZnRlc3QtY292ZXJhZ2UgQGdv bAorLWZwcm9maWxlLWNvbmRpdGlvbnMgQGdvbAogLWZwcm9maWxlLWFicy1wYXRoIEBnb2wK IC1mcHJvZmlsZS1kaXI9QHZhcntwYXRofSAgLWZwcm9maWxlLWdlbmVyYXRlICAtZnByb2Zp bGUtZ2VuZXJhdGU9QHZhcntwYXRofSBAZ29sCiAtZnByb2ZpbGUtaW5mby1zZWN0aW9uICAt ZnByb2ZpbGUtaW5mby1zZWN0aW9uPUB2YXJ7bmFtZX0gQGdvbApAQCAtNjAyMCw2ICs2MDIx LDEzIEBAIGVycm9yLiAgQG9wdGlvbnstV25vLWNvdmVyYWdlLWludmFsaWQtbGluZS1udW1i ZXJ9IGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhlCiB3YXJuaW5nIG9yIEBvcHRpb257LVdu by1lcnJvcj1jb3ZlcmFnZS1pbnZhbGlkLWxpbmUtbnVtYmVyfSBjYW4gYmUgdXNlZCB0bwog ZGlzYWJsZSB0aGUgZXJyb3IuCiAKK0BpdGVtIC1Xbm8tY292ZXJhZ2UtdG9vLW1hbnktY29u ZGl0aW9ucworQG9waW5kZXggV25vLWNvdmVyYWdlLXRvby1tYW55LWNvbmRpdGlvbnMKK0Bv cGluZGV4IFdjb3ZlcmFnZS10b28tbWFueS1jb25kaXRpb25zCitXYXJuIGluIGNhc2UgYSBj b25kaXRpb24gaGF2ZSB0b28gbWFueSB0ZXJtcyBhbmQgR0NDIGdpdmVzIHVwIGNvdmVyYWdl LgorQ292ZXJhZ2UgaXMgZ2l2ZW4gdXAgd2hlbiB0aGVyZSBhcmUgbW9yZSB0ZXJtcyBpbiB0 aGUgY29uZGl0aW9uYWwgdGhhbiB0aGVyZQorYXJlIGJpdHMgaW4gYSBAY29kZXtnY292X3R5 cGVfdW5zaWduZWR9LiAgVGhpcyB3YXJuaW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKwog QGl0ZW0gLVduby1jcHAgQHJ7KEMsIE9iamVjdGl2ZS1DLCBDKyssIE9iamVjdGl2ZS1DKysg YW5kIEZvcnRyYW4gb25seSl9CiBAb3BpbmRleCBXbm8tY3BwCiBAb3BpbmRleCBXY3BwCkBA IC0xNTI3MSw2ICsxNTI3OSwxMyBAQCBFLmcuIEBjb2Rle2djYyBhLmMgYi5jIC1vIGJpbmFy eX0gd291bGQgZ2VuZXJhdGUgQGZpbGV7YmluYXJ5LWEuZ2NkYX0gYW5kCiAKIEB4cmVme0Ny b3NzLXByb2ZpbGluZ30uCiAKK0BpdGVtIC1mcHJvZmlsZS1jb25kaXRpb25zCitAb3BpbmRl eCBmcHJvZmlsZS1jb25kaXRpb25zCitBZGQgY29kZSBzbyB0aGF0IHByb2dyYW0gY29uZGl0 aW9ucyBhcmUgaW5zdHJ1bWVudGVkLiAgRHVyaW5nIGV4ZWN1dGlvbiB0aGUKK3Byb2dyYW0g cmVjb3JkcyB3aGF0IHRlcm1zIGluIGEgY29uZGl0aW9uYWwgY29udHJpYnV0ZXMgdG8gYSBk ZWNpc2lvbi4gIFRoZQorZGF0YSBtYXkgYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhbGwgdGVy bXMgaW4gYSBib29sZWFucyBhcmUgdGVzdGVkIGFuZCBoYXZlIGFuCitlZmZlY3Qgb24gdGhl IG91dGNvbWUgb2YgYSBjb25kaXRpb24uCisKIEBjaW5kZXggQGNvbW1hbmR7Z2Nvdn0KIEBp dGVtIC0tY292ZXJhZ2UKIEBvcGluZGV4IGNvdmVyYWdlCkBAIC0xNTMzMSw2ICsxNTM0Niwx MCBAQCBleGVjdXRlZC4gIFdoZW4gYW4gYXJjIGlzIHRoZSBvbmx5IGV4aXQgb3Igb25seSBl bnRyYW5jZSB0byBhIGJsb2NrLCB0aGUKIGluc3RydW1lbnRhdGlvbiBjb2RlIGNhbiBiZSBh ZGRlZCB0byB0aGUgYmxvY2s7IG90aGVyd2lzZSwgYSBuZXcgYmFzaWMKIGJsb2NrIG11c3Qg YmUgY3JlYXRlZCB0byBob2xkIHRoZSBpbnN0cnVtZW50YXRpb24gY29kZS4KIAorV2l0aCBA b3B0aW9uey1mcHJvZmlsZS1jb25kaXRpb25zfSwgZm9yIGVhY2ggY29uZGl0aW9uYWwgaW4g eW91ciBwcm9ncmFtIEdDQworY3JlYXRlcyBhIGJpdHNldCBhbmQgcmVjb3JkcyB0aGUgYm9v bGVhbiB2YWx1ZXMgdGhhdCBoYXZlIGFuIGluZGVwZW5kZW50IGVmZmVjdAorb24gdGhlIG91 dGNvbWUgb2YgdGhhdCBleHByZXNzaW9uLgorCiBAbmVlZCAyMDAwCiBAaXRlbSAtZnRlc3Qt Y292ZXJhZ2UKIEBvcGluZGV4IGZ0ZXN0LWNvdmVyYWdlCmRpZmYgLS1naXQgYS9nY2MvZ2Nj LmNjIGIvZ2NjL2djYy5jYwppbmRleCBhNGQ4NjNjYTQ1Ny4uNWEyNWE0N2I3ZDAgMTAwNjQ0 Ci0tLSBhL2djYy9nY2MuY2MKKysrIGIvZ2NjL2djYy5jYwpAQCAtMTE2NSw3ICsxMTY1LDcg QEAgcHJvcGVyIHBvc2l0aW9uIGFtb25nIHRoZSBvdGhlciBvdXRwdXQgZmlsZXMuICAqLwog CSU6aW5jbHVkZShsaWJnb21wLnNwZWMpJShsaW5rX2dvbXApfVwKICAgICAle2ZnbnUtdG06 JTppbmNsdWRlKGxpYml0bS5zcGVjKSUobGlua19pdG0pfVwKICAgICAlKG1mbGliKSAiIFNU QUNLX1NQTElUX1NQRUMgIlwKLSAgICAle2Zwcm9maWxlLWFyY3N8ZnByb2ZpbGUtZ2VuZXJh dGUqfGNvdmVyYWdlOi1sZ2Nvdn0gIiBTQU5JVElaRVJfU1BFQyAiIFwKKyAgICAle2Zwcm9m aWxlLWFyY3N8ZnByb2ZpbGUtY29uZGl0aW9uc3xmcHJvZmlsZS1nZW5lcmF0ZSp8Y292ZXJh Z2U6LWxnY292fSAiIFNBTklUSVpFUl9TUEVDICIgXAogICAgICV7IW5vc3RkbGliOiV7IXI6 JXshbm9kZWZhdWx0bGliczolKGxpbmtfc3NwKSAlKGxpbmtfZ2NjX2Nfc2VxdWVuY2UpfX19 XAogICAgICV7IW5vc3RkbGliOiV7IXI6JXshbm9zdGFydGZpbGVzOiVFfX19ICV7VCp9ICBc biUocG9zdF9saW5rKSB9fX19fX0iCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2djYy9nY292LWNv dW50ZXIuZGVmIGIvZ2NjL2djb3YtY291bnRlci5kZWYKaW5kZXggNmQyMTgyYmQzZGIuLjk2 NTYzYTU5YTQ1IDEwMDY0NAotLS0gYS9nY2MvZ2Nvdi1jb3VudGVyLmRlZgorKysgYi9nY2Mv Z2Nvdi1jb3VudGVyLmRlZgpAQCAtNDksMyArNDksNiBAQCBERUZfR0NPVl9DT1VOVEVSKEdD T1ZfQ09VTlRFUl9JT1IsICJpb3IiLCBfaW9yKQogCiAvKiBUaW1lIHByb2ZpbGUgY29sbGVj dGluZyBmaXJzdCBydW4gb2YgYSBmdW5jdGlvbiAqLwogREVGX0dDT1ZfQ09VTlRFUihHQ09W X1RJTUVfUFJPRklMRVIsICJ0aW1lX3Byb2ZpbGVyIiwgX3RpbWVfcHJvZmlsZSkKKworLyog Q29uZGl0aW9ucy4gIFRoZSBjb3VudGVyIGlzIGludGVycHJldGVkIGFzIGEgYml0LXNldC4g ICovCitERUZfR0NPVl9DT1VOVEVSKEdDT1ZfQ09VTlRFUl9DT05EUywgImNvbmRpdGlvbnMi LCBfaW9yKQpkaWZmIC0tZ2l0IGEvZ2NjL2djb3YtaW8uaCBiL2djYy9nY292LWlvLmgKaW5k ZXggOTljZTdkYmNjYzguLmM4NGY1OGI5OWFjIDEwMDY0NAotLS0gYS9nY2MvZ2Nvdi1pby5o CisrKyBiL2djYy9nY292LWlvLmgKQEAgLTI1Myw2ICsyNTMsOSBAQCB0eXBlZGVmIHVpbnQ2 NF90IGdjb3ZfdHlwZV91bnNpZ25lZDsKICNkZWZpbmUgR0NPVl9UQUdfQVJDUwkJICgoZ2Nv dl91bnNpZ25lZF90KTB4MDE0MzAwMDApCiAjZGVmaW5lIEdDT1ZfVEFHX0FSQ1NfTEVOR1RI KE5VTSkgICgxICsgKE5VTSkgKiAyICogR0NPVl9XT1JEX1NJWkUpCiAjZGVmaW5lIEdDT1Zf VEFHX0FSQ1NfTlVNKExFTkdUSCkgICgoKExFTkdUSCAvIEdDT1ZfV09SRF9TSVpFKSAtIDEp IC8gMikKKyNkZWZpbmUgR0NPVl9UQUdfQ09ORFMgICAgICAgICAgICAgKChnY292X3Vuc2ln bmVkX3QpMHgwMTQ3MDAwMCkKKyNkZWZpbmUgR0NPVl9UQUdfQ09ORFNfTEVOR1RIKE5VTSkg KChOVU0pICogMiAqIEdDT1ZfV09SRF9TSVpFKQorI2RlZmluZSBHQ09WX1RBR19DT05EU19O VU0oTEVOR1RIKSAoKChMRU5HVEgpIC8gR0NPVl9XT1JEX1NJWkUpIC8gMikKICNkZWZpbmUg R0NPVl9UQUdfTElORVMJCSAoKGdjb3ZfdW5zaWduZWRfdCkweDAxNDUwMDAwKQogI2RlZmlu ZSBHQ09WX1RBR19DT1VOVEVSX0JBU0UgCSAoKGdjb3ZfdW5zaWduZWRfdCkweDAxYTEwMDAw KQogI2RlZmluZSBHQ09WX1RBR19DT1VOVEVSX0xFTkdUSChOVU0pICgoTlVNKSAqIDIgKiBH Q09WX1dPUkRfU0laRSkKZGlmZiAtLWdpdCBhL2djYy9nY292LmNjIGIvZ2NjL2djb3YuY2MK aW5kZXggMjdiZTVmZjA5MTEuLjRkYjQwYzE4YWU3IDEwMDY0NAotLS0gYS9nY2MvZ2Nvdi5j YworKysgYi9nY2MvZ2Nvdi5jYwpAQCAtNzksNiArNzksNyBAQCB1c2luZyBuYW1lc3BhY2Ug c3RkOwogY2xhc3MgZnVuY3Rpb25faW5mbzsKIGNsYXNzIGJsb2NrX2luZm87CiBjbGFzcyBz b3VyY2VfaW5mbzsKK2NsYXNzIGNvbmRpdGlvbl9pbmZvOwogCiAvKiBEZXNjcmliZXMgYW4g YXJjIGJldHdlZW4gdHdvIGJhc2ljIGJsb2Nrcy4gICovCiAKQEAgLTEzMiw2ICsxMzMsMjgg QEAgcHVibGljOgogICB2ZWN0b3I8dW5zaWduZWQ+IGxpbmVzOwogfTsKIAorY2xhc3MgY29u ZGl0aW9uX2luZm8KK3sKK3B1YmxpYzoKKyAgY29uZGl0aW9uX2luZm8gKCk7CisKKyAgaW50 IHBvcGNvdW50ICgpIGNvbnN0OworCisgIGdjb3ZfdHlwZV91bnNpZ25lZCB0cnVldjsKKyAg Z2Nvdl90eXBlX3Vuc2lnbmVkIGZhbHNldjsKKworICB1bnNpZ25lZCBuX3Rlcm1zOworfTsK KworY29uZGl0aW9uX2luZm86OmNvbmRpdGlvbl9pbmZvICgpOiB0cnVldiAoMCksIGZhbHNl diAoMCksIG5fdGVybXMgKDApCit7Cit9CisKK2ludCBjb25kaXRpb25faW5mbzo6cG9wY291 bnQgKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50bGwgKHRydWV2 KSArIF9fYnVpbHRpbl9wb3Bjb3VudGxsIChmYWxzZXYpOworfQorCiAvKiBEZXNjcmliZXMg YSBiYXNpYyBibG9jay4gQ29udGFpbnMgbGlzdHMgb2YgYXJjcyB0byBzdWNjZXNzb3IgYW5k CiAgICBwcmVkZWNlc3NvciBibG9ja3MuICAqLwogCkBAIC0xNjUsNiArMTg4LDggQEAgcHVi bGljOgogICAvKiBCbG9jayBpcyBhIGxhbmRpbmcgcGFkIGZvciBsb25nam1wIG9yIHRocm93 LiAgKi8KICAgdW5zaWduZWQgaXNfbm9ubG9jYWxfcmV0dXJuIDogMTsKIAorICBjb25kaXRp b25faW5mbyBjb25kaXRpb25zOworCiAgIHZlY3RvcjxibG9ja19sb2NhdGlvbl9pbmZvPiBs b2NhdGlvbnM7CiAKICAgc3RydWN0CkBAIC0yNzUsNiArMzAwLDggQEAgcHVibGljOgogICB2 ZWN0b3I8YmxvY2tfaW5mbz4gYmxvY2tzOwogICB1bnNpZ25lZCBibG9ja3NfZXhlY3V0ZWQ7 CiAKKyAgdmVjdG9yPGNvbmRpdGlvbl9pbmZvKj4gY29uZGl0aW9uczsKKwogICAvKiBSYXcg YXJjIGNvdmVyYWdlIGNvdW50cy4gICovCiAgIHZlY3RvcjxnY292X3R5cGU+IGNvdW50czsK IApAQCAtMzUxLDYgKzM3OCw5IEBAIHN0cnVjdCBjb3ZlcmFnZV9pbmZvCiAgIGludCBicmFu Y2hlc19leGVjdXRlZDsKICAgaW50IGJyYW5jaGVzX3Rha2VuOwogCisgIGludCBjb25kaXRp b25zOworICBpbnQgY29uZGl0aW9uc19jb3ZlcmVkOworCiAgIGludCBjYWxsczsKICAgaW50 IGNhbGxzX2V4ZWN1dGVkOwogCkBAIC01NTAsNiArNTgwLDEwIEBAIHN0YXRpYyBpbnQgbXVs dGlwbGVfZmlsZXMgPSAwOwogCiBzdGF0aWMgaW50IGZsYWdfYnJhbmNoZXMgPSAwOwogCisv KiBPdXRwdXQgY29uZGl0aW9ucyAobW9kaWZpZWQgY29uZGl0aW9uL2RlY2lzaW9uIGNvdmVy YWdlKSAqLworCitzdGF0aWMgaW50IGZsYWdfY29uZGl0aW9ucyA9IDA7CisKIC8qIFNob3cg dW5jb25kaXRpb25hbCBicmFuY2hlcyB0b28uICAqLwogc3RhdGljIGludCBmbGFnX3VuY29u ZGl0aW9uYWwgPSAwOwogCkBAIC02NTYsNiArNjkwLDcgQEAgc3RhdGljIGludCByZWFkX2Nv dW50X2ZpbGUgKHZvaWQpOwogc3RhdGljIHZvaWQgc29sdmVfZmxvd19ncmFwaCAoZnVuY3Rp b25faW5mbyAqKTsKIHN0YXRpYyB2b2lkIGZpbmRfZXhjZXB0aW9uX2Jsb2NrcyAoZnVuY3Rp b25faW5mbyAqKTsKIHN0YXRpYyB2b2lkIGFkZF9icmFuY2hfY291bnRzIChjb3ZlcmFnZV9p bmZvICosIGNvbnN0IGFyY19pbmZvICopOworc3RhdGljIHZvaWQgYWRkX2NvbmRpdGlvbl9j b3VudHMgKGNvdmVyYWdlX2luZm8gKiwgY29uc3QgYmxvY2tfaW5mbyAqKTsKIHN0YXRpYyB2 b2lkIGFkZF9saW5lX2NvdW50cyAoY292ZXJhZ2VfaW5mbyAqLCBmdW5jdGlvbl9pbmZvICop Owogc3RhdGljIHZvaWQgZXhlY3V0ZWRfc3VtbWFyeSAodW5zaWduZWQsIHVuc2lnbmVkKTsK IHN0YXRpYyB2b2lkIGZ1bmN0aW9uX3N1bW1hcnkgKGNvbnN0IGNvdmVyYWdlX2luZm8gKik7 CkBAIC02NjQsNiArNjk5LDcgQEAgc3RhdGljIGNvbnN0IGNoYXIgKmZvcm1hdF9nY292IChn Y292X3R5cGUsIGdjb3ZfdHlwZSwgaW50KTsKIHN0YXRpYyB2b2lkIGFjY3VtdWxhdGVfbGlu ZV9jb3VudHMgKHNvdXJjZV9pbmZvICopOwogc3RhdGljIHZvaWQgb3V0cHV0X2djb3ZfZmls ZSAoY29uc3QgY2hhciAqLCBzb3VyY2VfaW5mbyAqKTsKIHN0YXRpYyBpbnQgb3V0cHV0X2Jy YW5jaF9jb3VudCAoRklMRSAqLCBpbnQsIGNvbnN0IGFyY19pbmZvICopOworc3RhdGljIHZv aWQgb3V0cHV0X2NvbmRpdGlvbnMgKEZJTEUgKiwgY29uc3QgYmxvY2tfaW5mbyAqKTsKIHN0 YXRpYyB2b2lkIG91dHB1dF9saW5lcyAoRklMRSAqLCBjb25zdCBzb3VyY2VfaW5mbyAqKTsK IHN0YXRpYyBzdHJpbmcgbWFrZV9nY292X2ZpbGVfbmFtZSAoY29uc3QgY2hhciAqLCBjb25z dCBjaGFyICopOwogc3RhdGljIGNoYXIgKm1hbmdsZV9uYW1lIChjb25zdCBjaGFyICopOwpA QCAtOTI4LDYgKzk2NCw3IEBAIHByaW50X3VzYWdlIChpbnQgZXJyb3JfcCkKICAgZm5vdGlj ZSAoZmlsZSwgIiAgLWIsIC0tYnJhbmNoLXByb2JhYmlsaXRpZXMgICAgICBJbmNsdWRlIGJy YW5jaCBwcm9iYWJpbGl0aWVzIGluIG91dHB1dFxuIik7CiAgIGZub3RpY2UgKGZpbGUsICIg IC1jLCAtLWJyYW5jaC1jb3VudHMgICAgICAgICAgICAgT3V0cHV0IGNvdW50cyBvZiBicmFu Y2hlcyB0YWtlblxuXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0 aGVyIHRoYW4gcGVyY2VudGFnZXNcbiIpOworICBmbm90aWNlIChmaWxlLCAiICAtZywgLS1j b25kaXRpb25zICAgICAgICAgICAgICAgIEluY2x1ZGUgY29uZGl0aW9uIGNvdmVyYWdlIGlu IG91dHB1dCAoTUMvREMpXG4iKTsKICAgZm5vdGljZSAoZmlsZSwgIiAgLWQsIC0tZGlzcGxh eS1wcm9ncmVzcyAgICAgICAgICBEaXNwbGF5IHByb2dyZXNzIGluZm9ybWF0aW9uXG4iKTsK ICAgZm5vdGljZSAoZmlsZSwgIiAgLUQsIC0tZGVidWcJCQkgICAgRGlzcGxheSBkZWJ1Z2dp bmcgZHVtcHNcbiIpOwogICBmbm90aWNlIChmaWxlLCAiICAtZiwgLS1mdW5jdGlvbi1zdW1t YXJpZXMgICAgICAgIE91dHB1dCBzdW1tYXJpZXMgZm9yIGVhY2ggZnVuY3Rpb25cbiIpOwpA QCAtOTgwLDYgKzEwMTcsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRpb25z W10gPQogICB7ICJhbGwtYmxvY2tzIiwgICAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICBO VUxMLCAnYScgfSwKICAgeyAiYnJhbmNoLXByb2JhYmlsaXRpZXMiLCBub19hcmd1bWVudCwg ICAgICAgTlVMTCwgJ2InIH0sCiAgIHsgImJyYW5jaC1jb3VudHMiLCAgICAgICAgbm9fYXJn dW1lbnQsICAgICAgIE5VTEwsICdjJyB9LAorICB7ICJjb25kaXRpb25zIiwgICAgICAgICAg IG5vX2FyZ3VtZW50LCAgICAgICBOVUxMLCAnZycgfSwKICAgeyAianNvbi1mb3JtYXQiLAkg ICAgbm9fYXJndW1lbnQsICAgICAgIE5VTEwsICdqJyB9LAogICB7ICJodW1hbi1yZWFkYWJs ZSIsCSAgICBub19hcmd1bWVudCwgICAgICAgTlVMTCwgJ0gnIH0sCiAgIHsgIm5vLW91dHB1 dCIsICAgICAgICAgICAgbm9fYXJndW1lbnQsICAgICAgIE5VTEwsICduJyB9LApAQCAtMTAw OCw3ICsxMDQ2LDcgQEAgcHJvY2Vzc19hcmdzIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7 CiAgIGludCBvcHQ7CiAKLSAgY29uc3QgY2hhciAqb3B0cyA9ICJhYmNkRGZoSGlqa2xtbm86 cHFyczp0dXZ3eCI7CisgIGNvbnN0IGNoYXIgKm9wdHMgPSAiYWJjZERmZ2hIaWprbG1ubzpw cXJzOnR1dnd4IjsKICAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwg b3B0cywgb3B0aW9ucywgTlVMTCkpICE9IC0xKQogICAgIHsKICAgICAgIHN3aXRjaCAob3B0 KQpAQCAtMTAyNSw2ICsxMDYzLDkgQEAgcHJvY2Vzc19hcmdzIChpbnQgYXJnYywgY2hhciAq KmFyZ3YpCiAJY2FzZSAnZic6CiAJICBmbGFnX2Z1bmN0aW9uX3N1bW1hcnkgPSAxOwogCSAg YnJlYWs7CisJY2FzZSAnZyc6CisJICBmbGFnX2NvbmRpdGlvbnMgPSAxOworCSAgYnJlYWs7 CiAJY2FzZSAnaCc6CiAJICBwcmludF91c2FnZSAoZmFsc2UpOwogCSAgLyogcHJpbnRfdXNh Z2Ugd2lsbCBleGl0LiAgKi8KQEAgLTExMzIsNiArMTE3Myw0NSBAQCBvdXRwdXRfaW50ZXJt ZWRpYXRlX2pzb25fbGluZSAoanNvbjo6YXJyYXkgKm9iamVjdCwKIAkgIH0KICAgICAgIH0K IAorICBqc29uOjphcnJheSAqY29uZGl0aW9ucyA9IG5ldyBqc29uOjphcnJheSAoKTsKKyAg bGluZW8tPnNldCAoImNvbmRpdGlvbnMiLCBjb25kaXRpb25zKTsKKyAgaWYgKGZsYWdfY29u ZGl0aW9ucykKKyAgeworICAgIHZlY3RvcjxibG9ja19pbmZvICo+Ojpjb25zdF9pdGVyYXRv ciBpdDsKKyAgICBmb3IgKGl0ID0gbGluZS0+YmxvY2tzLmJlZ2luICgpOyBpdCAhPSBsaW5l LT5ibG9ja3MuZW5kICgpOyBpdCsrKQorICAgICAgeworCWNvbnN0IGNvbmRpdGlvbl9pbmZv JiBpbmZvID0gKCppdCktPmNvbmRpdGlvbnM7CisJaWYgKGluZm8ubl90ZXJtcyA9PSAwKQor CSAgICBjb250aW51ZTsKKworCWNvbnN0IGludCBjb3VudCA9IDIgKiBpbmZvLm5fdGVybXM7 CisJY29uc3QgaW50IGNvdmVyZWQgPSBpbmZvLnBvcGNvdW50ICgpOworCisJanNvbjo6b2Jq ZWN0ICpjb25kID0gbmV3IGpzb246Om9iamVjdCAoKTsKKwljb25kLT5zZXQgKCJjb3VudCIs ICAgbmV3IGpzb246OmludGVnZXJfbnVtYmVyIChjb3VudCkpOworCWNvbmQtPnNldCAoImNv dmVyZWQiLCBuZXcganNvbjo6aW50ZWdlcl9udW1iZXIgKGNvdmVyZWQpKTsKKworCWpzb246 OmFycmF5ICptdHJ1ZSA9IG5ldyBqc29uOjphcnJheSAoKTsKKwlqc29uOjphcnJheSAqbWZh bHNlID0gbmV3IGpzb246OmFycmF5ICgpOworCWNvbmQtPnNldCAoIm5vdF9jb3ZlcmVkX3Ry dWUiLCAgbXRydWUpOworCWNvbmQtPnNldCAoIm5vdF9jb3ZlcmVkX2ZhbHNlIiwgbWZhbHNl KTsKKworCWlmIChjb3VudCAhPSBjb3ZlcmVkKQorCSAgeworCSAgICBmb3IgKHVuc2lnbmVk IGkgPSAwOyBpIDwgaW5mby5uX3Rlcm1zOyBpKyspCisJICAgICAgeworCQlnY292X3R5cGVf dW5zaWduZWQgaW5kZXggPSAxOworCQlpbmRleCA8PD0gaTsKKwkJaWYgKCEoaW5kZXggJiBp bmZvLnRydWV2KSkKKwkJICAgIG10cnVlLT5hcHBlbmQgKG5ldyBqc29uOjppbnRlZ2VyX251 bWJlciAoaSkpOworCQlpZiAoIShpbmRleCAmIGluZm8uZmFsc2V2KSkKKwkJICAgIG1mYWxz ZS0+YXBwZW5kIChuZXcganNvbjo6aW50ZWdlcl9udW1iZXIgKGkpKTsKKwkgICAgICB9CisJ ICB9CisJY29uZGl0aW9ucy0+YXBwZW5kIChjb25kKTsKKyAgICAgIH0KKyAgfQorCiAgIG9i amVjdC0+YXBwZW5kIChsaW5lbyk7CiB9CiAKQEAgLTE5NTYsNiArMjAzNiwyOCBAQCByZWFk X2dyYXBoX2ZpbGUgKHZvaWQpCiAJCSAgfQogCSAgICB9CiAJfQorICAgICAgZWxzZSBpZiAo Zm4gJiYgdGFnID09IEdDT1ZfVEFHX0NPTkRTKQorCXsKKwkgIHVuc2lnbmVkIG51bV9kZXN0 cyA9IEdDT1ZfVEFHX0NPTkRTX05VTSAobGVuZ3RoKTsKKworCSAgaWYgKCFmbi0+Y29uZGl0 aW9ucy5lbXB0eSAoKSkKKwkgICAgZm5vdGljZSAoc3RkZXJyLCAiJXM6YWxyZWFkeSBzZWVu IGNvbmRpdGlvbnMgZm9yICclcydcbiIsCisJCSAgICAgYmJnX2ZpbGVfbmFtZSwgZm4tPmdl dF9uYW1lICgpKTsKKwkgIGVsc2UKKwkgICAgZm4tPmNvbmRpdGlvbnMucmVzaXplIChudW1f ZGVzdHMpOworCisJICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX2Rlc3RzOyArK2kp CisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBpZHggPSBnY292X3JlYWRfdW5zaWduZWQgKCk7 CisKKwkgICAgICBpZiAoaWR4ID49IGZuLT5ibG9ja3Muc2l6ZSAoKSkKKwkJZ290byBjb3Jy dXB0OworCisJICAgICAgY29uZGl0aW9uX2luZm8gKmluZm8gPSAmZm4tPmJsb2Nrc1tpZHhd LmNvbmRpdGlvbnM7CisJICAgICAgaW5mby0+bl90ZXJtcyA9IGdjb3ZfcmVhZF91bnNpZ25l ZCAoKTsKKwkgICAgICBmbi0+Y29uZGl0aW9uc1tpXSA9IGluZm87CisJICAgIH0KKwl9CiAg ICAgICBlbHNlIGlmIChmbiAmJiB0YWcgPT0gR0NPVl9UQUdfTElORVMpCiAJewogCSAgdW5z aWduZWQgYmxvY2tubyA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKQEAgLTIwODYsMTEgKzIx ODgsMjYgQEAgcmVhZF9jb3VudF9maWxlICh2b2lkKQogCSAgICAgIGdvdG8gY2xlYW51cDsK IAkgICAgfQogCX0KLSAgICAgIGVsc2UgaWYgKHRhZyA9PSBHQ09WX1RBR19GT1JfQ09VTlRF UiAoR0NPVl9DT1VOVEVSX0FSQ1MpICYmIGZuKQorICAgICAgZWxzZSBpZiAodGFnID09IEdD T1ZfVEFHX0ZPUl9DT1VOVEVSIChHQ09WX0NPVU5URVJfQ09ORFMpICYmIGZuKQogCXsKKwkg IGxlbmd0aCA9IGFicyAocmVhZF9sZW5ndGgpOworCSAgICBpZiAobGVuZ3RoICE9IEdDT1Zf VEFHX0NPVU5URVJfTEVOR1RIICgyICogZm4tPmNvbmRpdGlvbnMuc2l6ZSAoKSkpCisJCWdv dG8gbWlzbWF0Y2g7CisKKwkgICAgaWYgKHJlYWRfbGVuZ3RoID4gMCkKKwkgICAgICB7CisJ CWZvciAoaXggPSAwOyBpeCAhPSBmbi0+Y29uZGl0aW9ucy5zaXplICgpOyBpeCsrKQorCQl7 CisJCSAgICBmbi0+Y29uZGl0aW9uc1tpeF0tPnRydWV2ICB8PSBnY292X3JlYWRfY291bnRl ciAoKTsKKwkJICAgIGZuLT5jb25kaXRpb25zW2l4XS0+ZmFsc2V2IHw9IGdjb3ZfcmVhZF9j b3VudGVyICgpOworCQl9CisJICAgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHRhZyA9PSBH Q09WX1RBR19GT1JfQ09VTlRFUiAoR0NPVl9DT1VOVEVSX0FSQ1MpICYmIGZuKQorICAgICAg ewogCSAgbGVuZ3RoID0gYWJzIChyZWFkX2xlbmd0aCk7CiAJICBpZiAobGVuZ3RoICE9IEdD T1ZfVEFHX0NPVU5URVJfTEVOR1RIIChmbi0+Y291bnRzLnNpemUgKCkpKQotCSAgICBnb3Rv IG1pc21hdGNoOworCSAgICAgIGdvdG8gbWlzbWF0Y2g7CiAKIAkgIGlmIChyZWFkX2xlbmd0 aCA+IDApCiAJICAgIGZvciAoaXggPSAwOyBpeCAhPSBmbi0+Y291bnRzLnNpemUgKCk7IGl4 KyspCkBAIC0yNDMwLDYgKzI1NDcsMTMgQEAgYWRkX2JyYW5jaF9jb3VudHMgKGNvdmVyYWdl X2luZm8gKmNvdmVyYWdlLCBjb25zdCBhcmNfaW5mbyAqYXJjKQogICAgIH0KIH0KIAorc3Rh dGljIHZvaWQKK2FkZF9jb25kaXRpb25fY291bnRzIChjb3ZlcmFnZV9pbmZvICpjb3ZlcmFn ZSwgY29uc3QgYmxvY2tfaW5mbyAqYmxvY2spCit7CisgIGNvdmVyYWdlLT5jb25kaXRpb25z ICs9IDIgKiBibG9jay0+Y29uZGl0aW9ucy5uX3Rlcm1zOworICBjb3ZlcmFnZS0+Y29uZGl0 aW9uc19jb3ZlcmVkICs9IGJsb2NrLT5jb25kaXRpb25zLnBvcGNvdW50ICgpOworfQorCiAv KiBGb3JtYXQgQ09VTlQsIGlmIGZsYWdfaHVtYW5fcmVhZGFibGVfbnVtYmVycyBpcyBzZXQs IHJldHVybiBpdCBodW1hbgogICAgcmVhZGFibGUgZm9ybWF0LiAgKi8KIApAQCAtMjUzMyw3 ICsyNjU3LDE0IEBAIGZpbGVfc3VtbWFyeSAoY29uc3QgY292ZXJhZ2VfaW5mbyAqY292ZXJh Z2UpCiAJCSBjb3ZlcmFnZS0+Y2FsbHMpOwogICAgICAgZWxzZQogCWZub3RpY2UgKHN0ZG91 dCwgIk5vIGNhbGxzXG4iKTsKKwogICAgIH0KKworICBpZiAoZmxhZ19jb25kaXRpb25zKQor ICAgICAgZm5vdGljZSAoc3Rkb3V0LCAiQ29uZGl0aW9ucyBjb3ZlcmVkOiVzIG9mICVkXG4i LAorCSAgICAgICBmb3JtYXRfZ2NvdiAoY292ZXJhZ2UtPmNvbmRpdGlvbnNfY292ZXJlZCwK KwkJCSAgICBjb3ZlcmFnZS0+Y29uZGl0aW9ucywgMiksCisJICAgICAgIGNvdmVyYWdlLT5j b25kaXRpb25zKTsKIH0KIAogLyogQ2Fub25pY2FsaXplIHRoZSBmaWxlbmFtZSBOQU1FIGJ5 IGNhbm9uaWNhbGl6aW5nIGRpcmVjdG9yeQpAQCAtMjc2MCw2ICsyODkxLDEyIEBAIHN0YXRp YyB2b2lkIGFjY3VtdWxhdGVfbGluZV9pbmZvIChsaW5lX2luZm8gKmxpbmUsIHNvdXJjZV9p bmZvICpzcmMsCiAJIGl0ICE9IGxpbmUtPmJyYW5jaGVzLmVuZCAoKTsgaXQrKykKICAgICAg IGFkZF9icmFuY2hfY291bnRzICgmc3JjLT5jb3ZlcmFnZSwgKml0KTsKIAorICBpZiAoYWRk X2NvdmVyYWdlKQorICAgIGZvciAodmVjdG9yPGJsb2NrX2luZm8gKj46Oml0ZXJhdG9yIGl0 ID0gbGluZS0+YmxvY2tzLmJlZ2luICgpOworCSBpdCAhPSBsaW5lLT5ibG9ja3MuZW5kICgp OyBpdCsrKQorICAgICAgYWRkX2NvbmRpdGlvbl9jb3VudHMgKCZzcmMtPmNvdmVyYWdlLCAq aXQpOworCisKICAgaWYgKCFsaW5lLT5ibG9ja3MuZW1wdHkgKCkpCiAgICAgewogICAgICAg LyogVGhlIHVzZXIgZXhwZWN0cyB0aGUgbGluZSBjb3VudCB0byBiZSB0aGUgbnVtYmVyIG9m IHRpbWVzCkBAIC0yODYxLDYgKzI5OTgsMzEgQEAgYWNjdW11bGF0ZV9saW5lX2NvdW50cyAo c291cmNlX2luZm8gKnNyYykKICAgICAgIH0KIH0KIAorc3RhdGljIHZvaWQKK291dHB1dF9j b25kaXRpb25zIChGSUxFICpnY292X2ZpbGUsIGNvbnN0IGJsb2NrX2luZm8gKmJpbmZvKQor eworICAgIGNvbnN0IGNvbmRpdGlvbl9pbmZvJiBpbmZvID0gYmluZm8tPmNvbmRpdGlvbnM7 CisgICAgaWYgKGluZm8ubl90ZXJtcyA9PSAwKQorCXJldHVybjsKKworICAgIGNvbnN0IGlu dCBleHBlY3RlZCA9IDIgKiBpbmZvLm5fdGVybXM7CisgICAgY29uc3QgaW50IGdvdCA9IGlu Zm8ucG9wY291bnQgKCk7CisKKyAgICBmbm90aWNlIChnY292X2ZpbGUsICJjb25kaXRpb25z IGNvdmVyZWQgJWQvJWRcbiIsIGdvdCwgZXhwZWN0ZWQpOworICAgIGlmIChleHBlY3RlZCA9 PSBnb3QpCisJcmV0dXJuOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGluZm8u bl90ZXJtczsgaSsrKQorICAgIHsKKwlnY292X3R5cGVfdW5zaWduZWQgaW5kZXggPSAxOwor CWluZGV4IDw8PSBpOworCWlmICghKGluZGV4ICYgaW5mby50cnVldikpCisJICAgIGZub3Rp Y2UgKGdjb3ZfZmlsZSwgImNvbmRpdGlvbiAlMnUgbm90IGNvdmVyZWQgKHRydWUpXG4iLCBp KTsKKwlpZiAoIShpbmRleCAmIGluZm8uZmFsc2V2KSkKKwkgICAgZm5vdGljZSAoZ2Nvdl9m aWxlLCAiY29uZGl0aW9uICUydSBub3QgY292ZXJlZCAoZmFsc2UpXG4iLCBpKTsKKyAgICB9 Cit9CisKIC8qIE91dHB1dCBpbmZvcm1hdGlvbiBhYm91dCBBUkMgbnVtYmVyIElYLiAgUmV0 dXJucyBub256ZXJvIGlmCiAgICBhbnl0aGluZyBpcyBvdXRwdXQuICAqLwogCkBAIC0zMDcx LDE2ICszMjMzLDI5IEBAIG91dHB1dF9saW5lX2RldGFpbHMgKEZJTEUgKmYsIGNvbnN0IGxp bmVfaW5mbyAqbGluZSwgdW5zaWduZWQgbGluZV9udW0pCiAJICBpZiAoZmxhZ19icmFuY2hl cykKIAkgICAgZm9yIChhcmMgPSAoKml0KS0+c3VjYzsgYXJjOyBhcmMgPSBhcmMtPnN1Y2Nf bmV4dCkKIAkgICAgICBqeCArPSBvdXRwdXRfYnJhbmNoX2NvdW50IChmLCBqeCwgYXJjKTsK KworCSAgaWYgKGZsYWdfY29uZGl0aW9ucykKKwkgICAgICBvdXRwdXRfY29uZGl0aW9ucyAo ZiwgKml0KTsKIAl9CiAgICAgfQotICBlbHNlIGlmIChmbGFnX2JyYW5jaGVzKQorICBlbHNl CiAgICAgewotICAgICAgaW50IGl4OworICAgICAgaWYgKGZsYWdfYnJhbmNoZXMpCisJewor CSAgaW50IGl4OworCisJICBpeCA9IDA7CisJICBmb3IgKHZlY3RvcjxhcmNfaW5mbyAqPjo6 Y29uc3RfaXRlcmF0b3IgaXQgPSBsaW5lLT5icmFuY2hlcy5iZWdpbiAoKTsKKwkJICBpdCAh PSBsaW5lLT5icmFuY2hlcy5lbmQgKCk7IGl0KyspCisJICAgICAgaXggKz0gb3V0cHV0X2Jy YW5jaF9jb3VudCAoZiwgaXgsICgqaXQpKTsKKwl9CiAKLSAgICAgIGl4ID0gMDsKLSAgICAg IGZvciAodmVjdG9yPGFyY19pbmZvICo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGxpbmUtPmJy YW5jaGVzLmJlZ2luICgpOwotCSAgIGl0ICE9IGxpbmUtPmJyYW5jaGVzLmVuZCAoKTsgaXQr KykKLQlpeCArPSBvdXRwdXRfYnJhbmNoX2NvdW50IChmLCBpeCwgKCppdCkpOworICAgICAg aWYgKGZsYWdfY29uZGl0aW9ucykKKwl7CisJICBmb3IgKHZlY3RvcjxibG9ja19pbmZvICo+ Ojpjb25zdF9pdGVyYXRvciBpdCA9IGxpbmUtPmJsb2Nrcy5iZWdpbiAoKTsKKwkgICAgICAg aXQgIT0gbGluZS0+YmxvY2tzLmVuZCAoKTsgaXQrKykKKwkgICAgICBvdXRwdXRfY29uZGl0 aW9ucyAoZiwgKml0KTsKKwl9CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9nY2MvaXBhLWlu bGluZS5jYyBiL2djYy9pcGEtaW5saW5lLmNjCmluZGV4IGY4YmIwNzJjNDIyLi5iODI2ZGNk NTgwYyAxMDA2NDQKLS0tIGEvZ2NjL2lwYS1pbmxpbmUuY2MKKysrIGIvZ2NjL2lwYS1pbmxp bmUuY2MKQEAgLTY0Niw3ICs2NDYsNyBAQCBjYW5fZWFybHlfaW5saW5lX2VkZ2VfcCAoc3Ry dWN0IGNncmFwaF9lZGdlICplKQogCQkJICIgIGVkZ2Ugbm90IGlubGluYWJsZTogbm90IGlu IFNTQSBmb3JtXG4iKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gIGVsc2UgaWYg KHByb2ZpbGVfYXJjX2ZsYWcKKyAgZWxzZSBpZiAoKHByb2ZpbGVfYXJjX2ZsYWcgfHwgcHJv ZmlsZV9jb25kaXRpb25fZmxhZykKIAkgICAmJiAoKGxvb2t1cF9hdHRyaWJ1dGUgKCJub19w cm9maWxlX2luc3RydW1lbnRfZnVuY3Rpb24iLAogCQkJCSBERUNMX0FUVFJJQlVURVMgKGNh bGxlci0+ZGVjbCkpID09IE5VTExfVFJFRSkKIAkgICAgICAgIT0gKGxvb2t1cF9hdHRyaWJ1 dGUgKCJub19wcm9maWxlX2luc3RydW1lbnRfZnVuY3Rpb24iLApkaWZmIC0tZ2l0IGEvZ2Nj L2lwYS1zcGxpdC5jYyBiL2djYy9pcGEtc3BsaXQuY2MKaW5kZXggNjAwMjFiYWQxM2MuLjk4 OTA1MThlMTFmIDEwMDY0NAotLS0gYS9nY2MvaXBhLXNwbGl0LmNjCisrKyBiL2djYy9pcGEt c3BsaXQuY2MKQEAgLTE5MjksNyArMTkyOSw4IEBAIHBhc3Nfc3BsaXRfZnVuY3Rpb25zOjpn YXRlIChmdW5jdGlvbiAqKQogICAvKiBXaGVuIGRvaW5nIHByb2ZpbGUgZmVlZGJhY2ssIHdl IHdhbnQgdG8gZXhlY3V0ZSB0aGUgcGFzcyBhZnRlciBwcm9maWxpbmcKICAgICAgaXMgcmVh ZC4gIFNvIGRpc2FibGUgb25lIGluIGVhcmx5IG9wdGltaXphdGlvbi4gICovCiAgIHJldHVy biAoZmxhZ19wYXJ0aWFsX2lubGluaW5nCi0JICAmJiAhcHJvZmlsZV9hcmNfZmxhZyAmJiAh ZmxhZ19icmFuY2hfcHJvYmFiaWxpdGllcyk7CisgICAgICAmJiAhcHJvZmlsZV9hcmNfZmxh ZyAmJiAhZmxhZ19icmFuY2hfcHJvYmFiaWxpdGllcworICAgICAgJiYgIXByb2ZpbGVfY29u ZGl0aW9uX2ZsYWcpOwogfQogCiB9IC8vIGFub24gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9n Y2MvcGFzc2VzLmNjIGIvZ2NjL3Bhc3Nlcy5jYwppbmRleCAzNmU1YjRhYzQ1Zi4uZWUwOTkx ODg4NDQgMTAwNjQ0Ci0tLSBhL2djYy9wYXNzZXMuY2MKKysrIGIvZ2NjL3Bhc3Nlcy5jYwpA QCAtMzUyLDcgKzM1Miw4IEBAIGZpbmlzaF9vcHRpbWl6YXRpb25fcGFzc2VzICh2b2lkKQog ICBnY2M6OmR1bXBfbWFuYWdlciAqZHVtcHMgPSBtX2N0eHQtPmdldF9kdW1wcyAoKTsKIAog ICB0aW1ldmFyX3B1c2ggKFRWX0RVTVApOwotICBpZiAocHJvZmlsZV9hcmNfZmxhZyB8fCBm bGFnX3Rlc3RfY292ZXJhZ2UgfHwgZmxhZ19icmFuY2hfcHJvYmFiaWxpdGllcykKKyAgaWYg KHByb2ZpbGVfYXJjX2ZsYWcgfHwgcHJvZmlsZV9jb25kaXRpb25fZmxhZyB8fCBmbGFnX3Rl c3RfY292ZXJhZ2UKKyAgICAgICAgICB8fCBmbGFnX2JyYW5jaF9wcm9iYWJpbGl0aWVzKQog ICAgIHsKICAgICAgIGR1bXBzLT5kdW1wX3N0YXJ0IChwYXNzX3Byb2ZpbGVfMS0+c3RhdGlj X3Bhc3NfbnVtYmVyLCBOVUxMKTsKICAgICAgIGVuZF9icmFuY2hfcHJvYiAoKTsKZGlmZiAt LWdpdCBhL2djYy9wcm9maWxlLmNjIGIvZ2NjL3Byb2ZpbGUuY2MKaW5kZXggYTY3Y2NlNWIx OTkuLmI1MWZhYmJiNTliIDEwMDY0NAotLS0gYS9nY2MvcHJvZmlsZS5jYworKysgYi9nY2Mv cHJvZmlsZS5jYwpAQCAtNjksNiArNjksOSBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBm aWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogCiAjaW5jbHVkZSAicHJvZmlsZS5oIgogCitp bnQgZmluZF9jb25kaXRpb25zIChiYXNpY19ibG9jaywgYmFzaWNfYmxvY2ssIGJhc2ljX2Js b2NrKiwgaW50KiwgaW50KTsKK2ludCBpbnN0cnVtZW50X2RlY2lzaW9ucyAoYmFzaWNfYmxv Y2sqLCBpbnQsIGludCk7CisKIC8qIE1hcCBmcm9tIEJCcy9lZGdlcyB0byBnY292IGNvdW50 ZXJzLiAgKi8KIHZlYzxnY292X3R5cGU+IGJiX2djb3ZfY291bnRzOwogaGFzaF9tYXA8ZWRn ZSxnY292X3R5cGU+ICplZGdlX2djb3ZfY291bnRzOwpAQCAtMTAwLDYgKzEwMyw3IEBAIHN0 YXRpYyBpbnQgdG90YWxfbnVtX3Bhc3NlczsKIHN0YXRpYyBpbnQgdG90YWxfbnVtX3RpbWVz X2NhbGxlZDsKIHN0YXRpYyBpbnQgdG90YWxfaGlzdF9icl9wcm9iWzIwXTsKIHN0YXRpYyBp bnQgdG90YWxfbnVtX2JyYW5jaGVzOworc3RhdGljIGludCB0b3RhbF9udW1fY29uZHM7CiAK IC8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAgKi8KIHN0YXRpYyB2b2lkIGZpbmRfc3Bhbm5p bmdfdHJlZSAoc3RydWN0IGVkZ2VfbGlzdCAqKTsKQEAgLTExNTUsNiArMTE1OSwxMiBAQCBy ZWFkX3RodW5rX3Byb2ZpbGUgKHN0cnVjdCBjZ3JhcGhfbm9kZSAqbm9kZSkKICAgIHRoZSBm bG93IGdyYXBoIHRoYXQgYXJlIG5lZWRlZCB0byByZWNvbnN0cnVjdCB0aGUgZHluYW1pYyBi ZWhhdmlvciBvZiB0aGUKICAgIGZsb3cgZ3JhcGguICBUaGlzIGRhdGEgaXMgd3JpdHRlbiB0 byB0aGUgZ2NubyBmaWxlIGZvciBnY292LgogCisgICBXaGVuIEZMQUdfUFJPRklMRV9DT05E SVRJT05TIGlzIG5vbnplcm8sIHRoaXMgZnVuY3Rpb25zIGluc3RydW1lbnRzIHRoZQorICAg ZWRnZXMgaW4gdGhlIGNvbnRyb2wgZmxvdyBncmFwaCB0byB0cmFjayB3aGF0IGNvbmRpdGlv bnMgYXJlIGV2YWx1YXRlZCB0byBpbgorICAgb3JkZXIgdG8gZGV0ZXJtaW5lIHdoYXQgY29u ZGl0aW9ucyBhcmUgY292ZXJlZCBhbmQgaGF2ZSBhbiBpbmRlcGVuZGVudAorICAgZWZmZWN0 IG9uIHRoZSBvdXRjb21lIChtb2RpZmllZCBjb25kaXRpb24vZGVjaXNpb24gY292ZXJhZ2Up LiAgVGhpcyBkYXRhIGlzCisgICB3cml0dGVuIHRvIHRoZSBnY25vIGZpbGUgZm9yIGdjb3Yu CisKICAgIFdoZW4gRkxBR19CUkFOQ0hfUFJPQkFCSUxJVElFUyBpcyBub256ZXJvLCB0aGlz IGZ1bmN0aW9uIHJlYWRzIGF1eGlsaWFyeQogICAgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2Nk YSBmaWxlIGNvbnRhaW5pbmcgZWRnZSBjb3VudCBpbmZvcm1hdGlvbiBmcm9tCiAgICBwcmV2 aW91cyBleGVjdXRpb25zIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjb21waWxlZC4gIEluIHRo aXMgY2FzZSwgdGhlCkBAIC0xMTczLDYgKzExODMsNyBAQCBicmFuY2hfcHJvYiAoYm9vbCB0 aHVuaykKICAgc3RydWN0IGVkZ2VfbGlzdCAqZWw7CiAgIGhpc3RvZ3JhbV92YWx1ZXMgdmFs dWVzID0gaGlzdG9ncmFtX3ZhbHVlcyAoKTsKICAgdW5zaWduZWQgY2ZnX2NoZWNrc3VtLCBs aW5lbm9fY2hlY2tzdW07CisgIGJvb2wgb3V0cHV0X3RvX2ZpbGU7CiAKICAgdG90YWxfbnVt X3RpbWVzX2NhbGxlZCsrOwogCkBAIC0xMzgxLDcgKzEzOTIsNyBAQCBicmFuY2hfcHJvYiAo Ym9vbCB0aHVuaykKIAogICAvKiBDb21wdXRlIHR3byBkaWZmZXJlbnQgY2hlY2tzdW1zLiBO b3RlIHRoYXQgd2Ugd2FudCB0byBjb21wdXRlCiAgICAgIHRoZSBjaGVja3N1bSBpbiBvbmx5 IG9uY2UgcGxhY2UsIHNpbmNlIGl0IGRlcGVuZHMgb24gdGhlIHNoYXBlCi0gICAgIG9mIHRo ZSBjb250cm9sIGZsb3cgd2hpY2ggY2FuIGNoYW5nZSBkdXJpbmcgCisgICAgIG9mIHRoZSBj b250cm9sIGZsb3cgd2hpY2ggY2FuIGNoYW5nZSBkdXJpbmcKICAgICAgdmFyaW91cyB0cmFu c2Zvcm1hdGlvbnMuICAqLwogICBpZiAodGh1bmspCiAgICAgewpAQCAtMTM5NywxMCArMTQw OCwxOCBAQCBicmFuY2hfcHJvYiAoYm9vbCB0aHVuaykKIAogICAvKiBXcml0ZSB0aGUgZGF0 YSBmcm9tIHdoaWNoIGdjb3YgY2FuIHJlY29uc3RydWN0IHRoZSBiYXNpYyBibG9jawogICAg ICBncmFwaCBhbmQgZnVuY3Rpb24gbGluZSBudW1iZXJzICh0aGUgZ2NubyBmaWxlKS4gICov CisgIG91dHB1dF90b19maWxlID0gZmFsc2U7CiAgIGlmIChjb3ZlcmFnZV9iZWdpbl9mdW5j dGlvbiAobGluZW5vX2NoZWNrc3VtLCBjZmdfY2hlY2tzdW0pKQogICAgIHsKICAgICAgIGdj b3ZfcG9zaXRpb25fdCBvZmZzZXQ7CiAKKyAgICAgIC8qIFRoZSBjb25kaXRpb24gY292ZXJh Z2UgbmVlZHMgYSBkZWVwZXIgYW5hbHlzaXMgdG8gaWRlbnRpZnkgZXhwcmVzc2lvbnMKKyAg ICAgICAqIG9mIGNvbmRpdGlvbnMsIHdoaWNoIG1lYW5zIGl0IGlzIG5vdCB5ZXQgcmVhZHkg dG8gd3JpdGUgdG8gdGhlIGdjbm8KKyAgICAgICAqIGZpbGUuICBJdCB3aWxsIHdyaXRlIGl0 cyBlbnRyaWVzIGxhdGVyLCBidXQgbmVlZHMgdG8ga25vdyBpZiBpdCBkbyBpdAorICAgICAg ICogaW4gdGhlIGZpcnN0IHBsYWNlLCB3aGljaCBpcyBjb250cm9sbGVkIGJ5IHRoZSByZXR1 cm4gdmFsdWUgb2YKKyAgICAgICAqIGNvdmVyYWdlX2JlZ2luX2Z1bmN0aW9uLiAqLworICAg ICAgb3V0cHV0X3RvX2ZpbGUgPSB0cnVlOworCiAgICAgICAvKiBCYXNpYyBibG9jayBmbGFn cyAqLwogICAgICAgb2Zmc2V0ID0gZ2Nvdl93cml0ZV90YWcgKEdDT1ZfVEFHX0JMT0NLUyk7 CiAgICAgICBnY292X3dyaXRlX3Vuc2lnbmVkIChuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKGNm dW4pKTsKQEAgLTE1MTIsMjkgKzE1MzEsNjcgQEAgYnJhbmNoX3Byb2IgKGJvb2wgdGh1bmsp CiAKICAgcmVtb3ZlX2Zha2VfZWRnZXMgKCk7CiAKKyAgaWYgKHByb2ZpbGVfY29uZGl0aW9u X2ZsYWcgfHwgcHJvZmlsZV9hcmNfZmxhZykKKyAgICAgIGdpbXBsZV9pbml0X2djb3ZfcHJv ZmlsZXIgKCk7CisKKyAgaWYgKHByb2ZpbGVfY29uZGl0aW9uX2ZsYWcpCisgICAgeworICAg ICAgYmFzaWNfYmxvY2sgZW50cnkgPSBFTlRSWV9CTE9DS19QVFJfRk9SX0ZOIChjZnVuKS0+ bmV4dF9iYjsKKyAgICAgIGJhc2ljX2Jsb2NrIGV4aXQgID0gRVhJVF9CTE9DS19QVFJfRk9S X0ZOIChjZnVuKTsKKworICAgICAgLy8gZmluZF9jb25kaXRpb25zICgpIGV4cGVjdCBtZW1v cnkgdXAgZnJvbnQsIHNlZSB0aGF0IGZ1bmN0aW9uIGZvcgorICAgICAgLy8gZGV0YWlscwor ICAgICAgY29uc3QgaW50IG1heF9ibG9ja3MgPSA1ICogbl9iYXNpY19ibG9ja3NfZm9yX2Zu IChjZnVuKTsKKyAgICAgIGF1dG9fdmVjPGJhc2ljX2Jsb2NrPiBibG9ja3MgKG1heF9ibG9j a3MpOworICAgICAgYmxvY2tzLnF1aWNrX2dyb3cgKG1heF9ibG9ja3MpOworCisgICAgICBj b25zdCBpbnQgbWF4X3NpemVzID0gbl9iYXNpY19ibG9ja3NfZm9yX2ZuIChjZnVuKSArIDE7 CisgICAgICBhdXRvX3ZlYzxpbnQ+IHNpemVzIChtYXhfc2l6ZXMpOworICAgICAgc2l6ZXMu cXVpY2tfZ3JvdyAobWF4X3NpemVzKTsKKworICAgICAgaW50IG5jb25kcyA9IGZpbmRfY29u ZGl0aW9ucworCSAgKGVudHJ5LCBleGl0LCBibG9ja3MuYWRkcmVzcyAoKSwgc2l6ZXMuYWRk cmVzcyAoKSwgbWF4X2Jsb2Nrcyk7CisgICAgICB0b3RhbF9udW1fY29uZHMgKz0gbmNvbmRz OworCisgICAgICBpZiAobmNvbmRzID4gMAorCSAgJiYgY292ZXJhZ2VfY291bnRlcl9hbGxv YyAoR0NPVl9DT1VOVEVSX0NPTkRTLCAyICogbmNvbmRzKQorCSAgJiYgb3V0cHV0X3RvX2Zp bGUpCisJeworCSAgZ2Nvdl9wb3NpdGlvbl90IG9mZnNldCA9IGdjb3Zfd3JpdGVfdGFnIChH Q09WX1RBR19DT05EUyk7CisJICBmb3IgKGludCBpID0gMDsgaSA8IG5jb25kczsgKytpKQor CSAgICB7CisJICAgICAgaW50IGlkeCA9IHNpemVzW2ldOworCSAgICAgIGludCBsZW4gPSBz aXplc1tpICsgMV0gLSBpZHg7CisJICAgICAgYmFzaWNfYmxvY2sgKml0ciA9IGJsb2Nrcy5h ZGRyZXNzICgpICsgaWR4OworCSAgICAgIGludCB0ZXJtcyA9IGluc3RydW1lbnRfZGVjaXNp b25zIChpdHIsIGxlbiwgaSk7CisJICAgICAgZ2Nvdl93cml0ZV91bnNpZ25lZCAoYmxvY2tz W2lkeF0tPmluZGV4KTsKKwkgICAgICBnY292X3dyaXRlX3Vuc2lnbmVkICh0ZXJtcyk7CisJ ICAgIH0KKwkgIGdjb3Zfd3JpdGVfbGVuZ3RoIChvZmZzZXQpOworCX0KKyAgICB9CisKICAg LyogRm9yIGVhY2ggZWRnZSBub3Qgb24gdGhlIHNwYW5uaW5nIHRyZWUsIGFkZCBjb3VudGlu ZyBjb2RlLiAgKi8KICAgaWYgKHByb2ZpbGVfYXJjX2ZsYWcKICAgICAgICYmIGNvdmVyYWdl X2NvdW50ZXJfYWxsb2MgKEdDT1ZfQ09VTlRFUl9BUkNTLCBudW1faW5zdHJ1bWVudGVkKSkK ICAgICB7CiAgICAgICB1bnNpZ25lZCBuX2luc3RydW1lbnRlZDsKIAotICAgICAgZ2ltcGxl X2luaXRfZ2Nvdl9wcm9maWxlciAoKTsKLQogICAgICAgbl9pbnN0cnVtZW50ZWQgPSBpbnN0 cnVtZW50X2VkZ2VzIChlbCk7CiAKICAgICAgIGdjY19hc3NlcnQgKG5faW5zdHJ1bWVudGVk ID09IG51bV9pbnN0cnVtZW50ZWQpOwogCiAgICAgICBpZiAoZmxhZ19wcm9maWxlX3ZhbHVl cykKIAlpbnN0cnVtZW50X3ZhbHVlcyAodmFsdWVzKTsKLQotICAgICAgLyogQ29tbWl0IGNo YW5nZXMgZG9uZSBieSBpbnN0cnVtZW50YXRpb24uICAqLwotICAgICAgZ3NpX2NvbW1pdF9l ZGdlX2luc2VydHMgKCk7CiAgICAgfQogCiAgIGZyZWVfYXV4X2Zvcl9lZGdlcyAoKTsKIAog ICB2YWx1ZXMucmVsZWFzZSAoKTsKICAgZnJlZV9lZGdlX2xpc3QgKGVsKTsKKyAgLyogQ29t bWl0IGNoYW5nZXMgZG9uZSBieSBpbnN0cnVtZW50YXRpb24uICAqLworICBnc2lfY29tbWl0 X2VkZ2VfaW5zZXJ0cyAoKTsKKwogICBjb3ZlcmFnZV9lbmRfZnVuY3Rpb24gKGxpbmVub19j aGVja3N1bSwgY2ZnX2NoZWNrc3VtKTsKICAgaWYgKGZsYWdfYnJhbmNoX3Byb2JhYmlsaXRp ZXMKICAgICAgICYmIChwcm9maWxlX3N0YXR1c19mb3JfZm4gKGNmdW4pID09IFBST0ZJTEVf UkVBRCkpCkBAIC0xNjY0LDYgKzE3MjEsNyBAQCBpbml0X2JyYW5jaF9wcm9iICh2b2lkKQog ICB0b3RhbF9udW1fcGFzc2VzID0gMDsKICAgdG90YWxfbnVtX3RpbWVzX2NhbGxlZCA9IDA7 CiAgIHRvdGFsX251bV9icmFuY2hlcyA9IDA7CisgIHRvdGFsX251bV9jb25kcyA9IDA7CiAg IGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQogICAgIHRvdGFsX2hpc3RfYnJfcHJvYltpXSA9 IDA7CiB9CkBAIC0xNzAzLDUgKzE3NjEsNyBAQCBlbmRfYnJhbmNoX3Byb2IgKHZvaWQpCiAJ CSAgICAgKHRvdGFsX2hpc3RfYnJfcHJvYltpXSArIHRvdGFsX2hpc3RfYnJfcHJvYlsxOS1p XSkgKiAxMDAKIAkJICAgICAvIHRvdGFsX251bV9icmFuY2hlcywgNSppLCA1KmkrNSk7CiAJ fQorICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiVG90YWwgbnVtYmVyIG9mIGNvbmRpdGlv bnM6ICVkXG4iLAorCSAgICAgICB0b3RhbF9udW1fY29uZHMpOwogICAgIH0KIH0KZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvZysrLmRnL2djb3YvZ2Nvdi0xOC5DIGIvZ2NjL3Rlc3Rz dWl0ZS9nKysuZGcvZ2Nvdi9nY292LTE4LkMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAuLjlhYzE0ZGZlZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3Rz dWl0ZS9nKysuZGcvZ2Nvdi9nY292LTE4LkMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIHsgZGct b3B0aW9ucyAiLS1jb3ZlcmFnZSAtZnByb2ZpbGUtY29uZGl0aW9ucyAtc3RkPWMrKzExIiB9 ICovCisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCBuYXRpdmUgfSB9ICovCisKKyNpbmNsdWRl IDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCitjbGFzcyBub250cml2aWFsX2Rl c3RydWN0b3IKK3sKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBub250cml2aWFsX2Rlc3RydWN0 b3IgKGludCB2KSA6IHZhbCAodikge30KKyAgICB+bm9udHJpdmlhbF9kZXN0cnVjdG9yICgp IHt9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYm9v bCh2YWwpOyB9CisKKyAgICBpbnQgdmFsOworfTsKKworaW50IGlkZW50aXR5IChpbnQgeCkg eyByZXR1cm4geDsgfQoraW50IHRocm93cyAoaW50KSB7IHRocm93IHN0ZDo6cnVudGltZV9l cnJvcigiZXhjZXB0aW9uIik7IH0KKworaW50IHRocm93X2lmIChpbnQgeCkKK3sKKyAgICBp ZiAoeCkgLyogY29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKyAgICAgICAgdGhyb3cgc3Rk OjpydW50aW1lX2Vycm9yKCJleGNlcHRpb24iKTsKKyAgICByZXR1cm4geDsKK30KKworLyog dXNlZCBmb3Igc2lkZSBlZmZlY3RzIHRvIGluc2VydCBub2RlcyBpbiBjb25kaXRpb25hbCBi b2RpZXMgZXRjLiAqLworaW50IHggPSAwOworCisvKiBjb25kaXRpb25hbHMgd29yayBpbiB0 aGUgcHJlc2VuY2Ugb2Ygbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvcnMgKi8KK3ZvaWQgbWNkYzAw MWEgKGludCBhKQoreworICAgIG5vbnRyaXZpYWxfZGVzdHJ1Y3RvciB2IChhKTsKKworICAg IGlmICh2LnZhbCA+IDApIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgICB4ID0gdi52 YWw7CisgICAgZWxzZQorICAgICAgICB4ID0gLXYudmFsOworfQorCisvKiBub24tdHJpdmlh bCBkZXN0cnVjdG9yIGluLWxvb3AgdGVtcG9yYXJ5ICovCitub250cml2aWFsX2Rlc3RydWN0 b3IKK21jZGMwMDJhIChpbnQgYSwgaW50IGIpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkg PCBhOyBpKyspIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKyAgICAgICAgbm9udHJp dmlhbF9kZXN0cnVjdG9yIHRtcCAoYSk7CisgICAgICAgIGlmICh0bXAudmFsICUgYikgLyog Y29uZGl0aW9ucygyLzIpICovCisgICAgICAgICAgICByZXR1cm4gbm9udHJpdmlhbF9kZXN0 cnVjdG9yICgwKTsKKyAgICAgICAgeCArPSBpOworICAgIH0gLyogY29uZGl0aW9ucyhzdXBw cmVzcykgKi8KKyAgICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCisgICAgcmV0dXJuIG5v bnRyaXZpYWxfZGVzdHJ1Y3RvciAoYSAqIGIpOworfQorCisvKiBjb25kaXRpb25hbCBpbiBj b25zdHJ1Y3RvciAqLwordm9pZCBtY2RjMDAzYSAoaW50IGEpCit7CisgICAgY2xhc3MgQwor ICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEMgKGludCBlKSA6IHYgKGUp IHsKKyAgICAgICAgICAgIGlmIChlKSAvKiBjb25kaXRpb25zKDEvMikgZmFsc2UoMCkgKi8K KyAgICAgICAgICAgICAgICB2ID0geCAtIGU7CisgICAgICAgIH0KKyAgICAgICAgaW50IHY7 CisgICAgfTsKKworICAgIEMgYyAoYSk7CisgICAgaWYgKGMudiA+IDIpIC8qIGNvbmRpdGlv bnMoMS8yKSB0cnVlKDApICovCisgICAgICAgIHggPSBjLnYgKyBhOworfQorCisvKiBjb25k aXRpb25hbCBpbiBkZXN0cnVjdG9yICovCit2b2lkIG1jZGMwMDRhIChpbnQgYSkKK3sKKyAg ICBjbGFzcyBDCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQyAoaW50 IGUpIDogdiAoZSkge30KKyAgICAgICAgfkMgKCkgeworICAgICAgICAgICAgaWYgKHYpIC8q IGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgICAgICAgICAgIHggPSAyICogdjsKKyAgICAg ICAgfQorICAgICAgICBpbnQgdjsKKyAgICB9OworCisgICAgQyBjIChhKTsKKyAgICB4ID0g MTsgLy8gYXJiaXRyYXJ5IGFjdGlvbiBiZXR3ZWVuIGN0b3IrZHRvcgorfQorCisvKiBjb25k aXRpb25hbCBpbiB0cnkgKi8KK3ZvaWQgbWNkYzAwNWEgKGludCBhKQoreworICAgIHRyeQor ICAgIHsKKyAgICAgICAgaWYgKGEpIC8qIGNvbmRpdGlvbnMoMS8yKSB0cnVlKDApICovCisg ICAgICAgICAgICB4ID0gMiAqIGlkZW50aXR5IChhKTsKKyAgICAgICAgZWxzZQorICAgICAg ICAgICAgeCA9IDE7CisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICB4 ID0gMDsKKyAgICB9Cit9CisKKy8qIGNvbmRpdGlvbmFsIGluIGNhdGNoICovCit2b2lkIG1j ZGMwMDZhIChpbnQgYSkgeworICAgIHRyeQorICAgIHsKKyAgICAgICAgdGhyb3dzIChhKTsK KyAgICB9CisgICAgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJikKKyAgICB7CisgICAgICAgIGlm IChhKSAvKiBjb25kaXRpb25zKDEvMikgZmFsc2UoMCkgKi8KKyAgICAgICAgICAgIHggPSBp ZGVudGl0eSAoYSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHggPSAwOworICAgIH0K K30KKwordm9pZCBtY2RjMDA2YiAoaW50IGEpCit7CisgICAgaWYgKGEpIC8qIGNvbmRpdGlv bnMoMS8yKSB0cnVlKDApICovCisgICAgICAgIHRocm93cyAoYSk7CisgICAgZWxzZQorICAg ICAgICB4ID0gMTsKK30KKwordm9pZCBtY2RjMDA2YyAoaW50IGEpIHRyeQoreworICAgIHRo cm93cyAoYSk7Cit9CitjYXRjaCAoLi4uKSB7CisgICAgaWYgKGEpIC8qIGNvbmRpdGlvbnMo Mi8yKSAqLworICAgICAgICB4ID0gNTsKK30KKworLyogdGVtcG9yYXJ5IHdpdGggZGVzdHJ1 Y3RvciBhcyB0ZXJtICovCit2b2lkIG1jZGMwMDdhIChpbnQgYSwgaW50IGIpCit7CisgICAg eCA9IGEgJiYgbm9udHJpdmlhbF9kZXN0cnVjdG9yIChiKTsgLyogY29uZGl0aW9ucygzLzQp IGZhbHNlKDEpIGRlc3RydWN0b3IoKSAqLworfQorCit2b2lkIG1jZGMwMDdiIChpbnQgYSwg aW50IGIpCit7CisgICAgaWYgKGEgfHwgdGhyb3dfaWYgKGIpKSAvKiBjb25kaXRpb25zKDMv NCkgdHJ1ZSgxKSBkZXN0cnVjdG9yKCkgKi8KKyAgICAgICAgeCA9IC0xOworICAgIGVsc2UK KyAgICAgICAgeCA9IDE7Cit9CisKK3ZvaWQgbWNkYzAwN2MgKGludCBhLCBpbnQgYikKK3sK KyAgICBpZiAodGhyb3dfaWYgKGEpIHx8IHRocm93X2lmIChiKSkgLyogY29uZGl0aW9ucygy LzQpIHRydWUoMCAxKSBkZXN0cnVjdG9yKCkgKi8KKyAgICAgICAgeCA9IC0xOworICAgIGVs c2UKKyAgICAgICAgeCA9IDE7Cit9CisKKy8qIGRlc3RydWN0b3Igd2l0aCBkZWxldGUgKi8K K3ZvaWQgbWNkYzAwOGEgKGludCBhKQoreworICAgIGNsYXNzIEMKKyAgICB7CisgICAgcHVi bGljOgorICAgICAgICBpbnQgc2l6ZSA9IDU7CisgICAgICAgIGludCogcHRyID0gbnVsbHB0 cjsKKworICAgICAgICBleHBsaWNpdCBDIChpbnQgdikgOiBzaXplKHYgKyA1KSwgcHRyIChu ZXcgaW50W3NpemVdKSAvKiBjb25kaXRpb25zKHN1cHByZXNzKSAqLworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBj b25kaXRpb25zKGVuZCkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9 IDA7IGkgPCBzaXplOyBpKyspIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgICAgICAgICAg ICAgIHB0cltpXSA9IGkgKyAxOworICAgICAgICB9CisgICAgICAgIH5DKCkKKyAgICAgICAg eworICAgICAgICAgICAgaWYgKHB0cikgLyogY29uZGl0aW9ucygxLzIpIGZhbHNlKDApICov CisgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsgLyogY29uZGl0aW9ucyhzdXBwcmVzcykg Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8K KyAgICAgICAgfQorICAgIH07CisKKyAgICBDIGMgKGEpOworICAgIGlmIChjLnB0clthICsg MV0pIC8qIGNvbmRpdGlvbnMoMS8yKSBmYWxzZSgwKSAqLworICAgICAgICB4ID0gYTsKK30K KworaW50CittYWluICh2b2lkKQoreworICAgIG1jZGMwMDFhICgwKTsKKyAgICBtY2RjMDAx YSAoMSk7CisKKyAgICBtY2RjMDAyYSAoMSwgMSk7CisgICAgbWNkYzAwMmEgKDEsIDIpOwor CisgICAgbWNkYzAwM2EgKDEpOworCisgICAgbWNkYzAwNGEgKDApOworICAgIG1jZGMwMDRh ICgxKTsKKworICAgIG1jZGMwMDVhICgwKTsKKworICAgIG1jZGMwMDZhICgxKTsKKworICAg IG1jZGMwMDZiICgwKTsKKworICAgIG1jZGMwMDZjICgwKTsKKyAgICBtY2RjMDA2YyAoMSk7 CisKKyAgICBtY2RjMDA3YSAoMCwgMCk7CisgICAgbWNkYzAwN2EgKDEsIDEpOworCisgICAg bWNkYzAwN2IgKDAsIDApOworICAgIG1jZGMwMDdiICgxLCAwKTsKKworICAgIG1jZGMwMDdj ICgwLCAwKTsKKworICAgIG1jZGMwMDhhICgxKTsKKworfQorCisvKiB7IGRnLWZpbmFsIHsg cnVuLWdjb3YgY29uZGl0aW9ucyB7IC0tY29uZGl0aW9ucyBnY292LTE4LkMgfSB9IH0gKi8K ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLm1pc2MtdGVzdHMvZ2Nvdi0xOS5jIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MubWlzYy10ZXN0cy9nY292LTE5LmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmMxZWE4YWNlZTdkCi0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MubWlzYy10ZXN0cy9nY292LTE5LmMKQEAgLTAsMCArMSw3 MzUgQEAKKy8qIHsgZGctb3B0aW9ucyAiLWZwcm9maWxlLWNvbmRpdGlvbnMgLWZ0ZXN0LWNv dmVyYWdlIiB9ICovCisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCBuYXRpdmUgfSB9ICovCisK Ky8qIHNvbWUgc2lkZSBlZmZlY3QgdG8gc3RvcCBicmFuY2hlcyBmcm9tIGJlaW5nIHBydW5l ZCAqLworaW50IHggPSAwOworCisvKiB8fCB3b3JrcyAqLwordm9pZCBtY2RjMDAxYSAoaW50 IGEsIGludCBiKQoreworICAgIGlmIChhIHx8IGIpIC8qIGNvbmRpdGlvbnMoMS80KSB0cnVl KDApIGZhbHNlKDAgMSkgKi8KKwkJLyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7Cisg ICAgZWxzZQorCXggPSAyOworfQorCit2b2lkIG1jZGMwMDFiIChpbnQgYSwgaW50IGIpCit7 CisgICAgaWYgKGEgfHwgYikgLyogY29uZGl0aW9ucygzLzQpIHRydWUoMCkgZmFsc2UoKSAq LworCQkvKiBjb25kaXRpb25zKGVuZCkgKi8KKwl4ID0gMTsKKyAgICBlbHNlCisJeCA9IDI7 Cit9CisKK3ZvaWQgbWNkYzAwMWMgKGludCBhLCBpbnQgYikKK3sKKyAgICBpZiAoYSB8fCBi KSAvKiBjb25kaXRpb25zKDQvNCkgKi8KKwl4ID0gMTsKKyAgICBlbHNlCisJeCA9IDI7Cit9 CisKK3ZvaWQgbWNkYzAwMWQgKGludCBhLCBpbnQgYiwgaW50IGMpCit7CisgICAgaWYgKGEg fHwgYiB8fCBjKSAvKiBjb25kaXRpb25zKDMvNikgZmFsc2UoMSAyKSB0cnVlKDIpICovCisJ CSAgICAgLyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7Cit9CisKKy8qICYmIHdvcmtz ICovCit2b2lkIG1jZGMwMDJhIChpbnQgYSwgaW50IGIpCit7CisgICAgaWYgKGEgJiYgYikg LyogY29uZGl0aW9ucygxLzQpIHRydWUoMCAxKSBmYWxzZSgwKSAqLworCQkvKiBjb25kaXRp b25zKGVuZCkgKi8KKwl4ID0gMTsKKyAgICBlbHNlCisJeCA9IDI7Cit9CisKK3ZvaWQgbWNk YzAwMmIgKGludCBhLCBpbnQgYikKK3sKKyAgICBpZiAoYSAmJiBiKSAvKiBjb25kaXRpb25z KDMvNCkgZmFsc2UoMCkgKi8KKwkJLyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7Cisg ICAgZWxzZQorCXggPSAyOworfQorCit2b2lkIG1jZGMwMDJjIChpbnQgYSwgaW50IGIpCit7 CisgICAgaWYgKGEgJiYgYikgLyogY29uZGl0aW9ucyg0LzQpICovCisJeCA9IDE7CisgICAg ZWxzZQorCXggPSAyOworfQorCit2b2lkIG1jZGMwMDJkIChpbnQgYSwgaW50IGIsIGludCBj KQoreworICAgIC8qCisgICAgICogVGhpcyBpcyBhbiBvZGQgY2FzZSwgYW5kIGZhbGxzIHZp Y3RpbSB0byB0cnlpbmcgdG8gZGV0ZWN0IG5lc3RlZCBpZnMuCisgICAgICoKKyAgICAgKiBp ZiAoYSkgaWYgKGIpIGlmIChjKSB3aXRoIG5vIGVsc2UgaXMgZXF1aXZhbGVudCB0byBpZiAo YSAmJiBiICYmIGMpIGFuZAorICAgICAqIHRoZSBDRkdzIGFyZSBpZGVudGljYWwgKnVubGVz cyogdGhlIGVsc2Ugbm9kZXMgYXJlIGdlbmVyYXRlZCB0b28uIEluIHRoZQorICAgICAqICYm IGV4cHJlc3Npb24sIGFsbCBmYWxzZSBlZGdlcyBzaG91bGQgZ28gdG8gdGhlIHNhbWUgZWxz ZSwgYnV0IGluIHRoZQorICAgICAqIG5lc3RlZC1pZiBjYXNlIHRoZXkgZ28gdG8gZGlmZmVy ZW50IGVsc2VzLgorICAgICAqCisgICAgICogVGhpcyBjYW4gYmUgc3VycHJpc2luZywgYW5k IGJhZCBmb3IgTUMvREMgYmVjYXVzZSBub24taW5kZXBlbmRlbnQKKyAgICAgKiBjb25kaXRp b25hbHMgbWFza2VkIGJ5IHRlcm1zIGZ1cnRoZXItcmlnaHQgY2FuIG5vdCBiZSBkZXRlY3Rl ZC4gSWYgYW4KKyAgICAgKiBlbHNlIG5vZGUgaXMgZ2VuZXJhdGVkLCB0aGlzIGV4cHJlc3Np b24gYmVjb21lcyBhIDMtdGVybSBkZWNpc2lvbiBhZ2Fpbi4KKyAgICAgKi8KKyAgICBpZiAo YSAmJiBiICYmIGMpIC8qIGNvbmRpdGlvbnMoc3VwcHJlc3MpIGNvbmRpdGlvbnMoNC82KSBm YWxzZSgwIDIpICovCisJLyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7Cit9CisKKy8q IG5lZ2F0aW9uIHdvcmtzICovCit2b2lkIG1jZGMwMDNhIChpbnQgYSwgaW50IGIpCit7Cisg ICAgaWYgKCFhIHx8ICFiKSAvKiBjb25kaXRpb25zKDIvNCkgZmFsc2UoMCAxKSAqLworCQkg IC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCXggPSAxOworICAgIGVsc2UKKwl4ID0gMjsKK30K KworLyogc2luZ2xlIGNvbmRpdGlvbmFscyB3aXRoIGFuZCB3aXRob3V0IGVsc2UgKi8KK3Zv aWQgbWNkYzAwNGEgKGludCBhKQoreworICAgIGlmIChhKSAvKiBjb25kaXRpb25zKDEvMikg dHJ1ZSgwKSAqLworCSAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCXggPSAxOworICAgIGVs c2UKKwl4ID0gMjsKK30KKwordm9pZCBtY2RjMDA0YiAoaW50IGEpCit7CisgICAgaWYgKGEp IC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCXggPSAxOworICAgIGVsc2UKKwl4ID0gMjsKK30K Kwordm9pZCBtY2RjMDA0YyAoaW50IGEpCit7CisgICAgaWYgKGEpIC8qIGNvbmRpdGlvbnMo MS8yKSBmYWxzZSgwKSAqLworCSAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCXggPSAxOwor fQorCit2b2lkIG1jZGMwMDRkIChpbnQgYSwgaW50IGIsIGludCBjKSB7CisgICAgaWYgKGEp ICAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAgICB7CisJaWYgKGIgfHwgYykgLyogY29uZGl0 aW9ucygxLzQpIHRydWUoMSkgZmFsc2UoMCAxKSAqLworCSAgICB4ID0gYSArIGIgKyBjOwor ICAgIH0KK30KKworLyogbWl4aW5nICYmIGFuZCB8fCB3b3JrcyAqLwordm9pZCBtY2RjMDA1 YSAoaW50IGEsIGludCBiLCBpbnQgYykKK3sKKyAgICBpZiAoKGEgJiYgYikgfHwgYykgLyog Y29uZGl0aW9ucygxLzYpIHRydWUoMCAxKSBmYWxzZSgwIDEgMikgKi8KKwkJICAgICAgIC8q IGNvbmRpdGlvbnMoZW5kKSAqLworCXggPSAxOworICAgIGVsc2UKKwl4ID0gMjsKK30KKwor dm9pZCBtY2RjMDA1YiAoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpCit7CisgICAgaWYg KChhICYmIChiIHx8IGMpKSAmJiBkKSAvKiBjb25kaXRpb25zKDQvOCkgdHJ1ZSgxIDIgMykg ZmFsc2UoMCkgKi8KKwkJCSAgICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCXggPSAxOwor ICAgIGVsc2UKKwl4ID0gMjsKK30KKworLyogbmVzdGVkIGNvbmRpdGlvbmFscyAqLwordm9p ZCBtY2RjMDA2YSAoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlKQoreworICAg IGlmIChhKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAgICB7CisJaWYgKGIgJiYgYykgLyog Y29uZGl0aW9ucygzLzQpIGZhbHNlKDEpICovCisJCSAgICAvKiBjb25kaXRpb25zKGVuZCkg Ki8KKwkgICAgeCA9IDE7CisJZWxzZQorCSAgICB4ID0gMjsKKyAgICB9CisgICAgZWxzZQor ICAgIHsKKwlpZiAoYyB8fCBkKSAvKiBjb25kaXRpb25zKDIvNCkgdHJ1ZSgwIDEpICovCisJ CSAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KKwkgICAgeCA9IDM7CisJZWxzZQorCSAgICB4 ID0gNDsKKyAgICB9Cit9CisKK3ZvaWQgbWNkYzAwNmIgKGludCBhLCBpbnQgYiwgaW50IGMp Cit7CisgICAgaWYgKGEpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKwlpZiAoYikg Lypjb25kaXRpb25zKDIvMikgKi8KKwl7CisJICAgIGlmIChjKSAvKiBjb25kaXRpb25zKDIv MikgKi8KKwkgICAgeworCQl4ID0gYSArIGIgKyBjOworCSAgICB9CisJfQorICAgIH0KK30K KworLyogZWxzZS9pZiAqLwordm9pZCBtY2RjMDA3YSAoaW50IGEsIGludCBiLCBpbnQgYywg aW50IGQpCit7CisgICAgaWYgKGEpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKwlp ZiAoYikgLyogY29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKwkgICAgICAgLyogY29uZGl0 aW9ucyhlbmQpICovCisJICAgIHggPSAxOworCWVsc2UKKwkgICAgeCA9IDI7CisgICAgfQor ICAgIGVsc2UgaWYgKGMpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKwlpZiAoZCkg LyogY29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKwkgICAgICAgLyogY29uZGl0aW9ucyhl bmQpICovCisJICAgIHggPSAzOworICAgIH0KK30KKwordm9pZCBtY2RjMDA3YiAoaW50IGEs IGludCBiLCBpbnQgYykKK3sKKyAgICAvKiBzaW1pbGFyIHRvIGlmIChhIHx8IGIgfHwgYykg eCA9IDEgKi8KKyAgICBpZiAoYSkgLyogY29uZGl0aW9ucygyLzIpICovCisJZ290byB0aGVu OworICAgIGVsc2UgaWYgKGIpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCWdvdG8gdGhlbjsK KyAgICBlbHNlIGlmIChjKSAvKiBjb25kaXRpb25zKDEvMikgdHJ1ZSgwKSAqLworCS8qIGNv bmRpdGlvbnMoZW5kKSAqLworCWdvdG8gdGhlbjsKKworICAgIHJldHVybjsKKwordGhlbjoK KyAgICB4ID0gMTsKK30KKworLyogd2hpbGUgbG9vcCAqLwordm9pZCBtY2RjMDA4YSAoaW50 IGEpCit7CisgICAgd2hpbGUgKGEgPCAxMCkgLyogY29uZGl0aW9ucygyLzIpICovCisJeCA9 IGErKzsKK30KKwordm9pZCBtY2RjMDA4YiAoaW50IGEpCit7CisgICAgd2hpbGUgKGEgPiAx MCkgLyogY29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKwkJICAgLyogY29uZGl0aW9ucyhl bmQpICovCisJeCA9IGEtLTsKK30KKwordm9pZCBtY2RjMDA4YyAoaW50IGEpCit7CisgICAg Ly8gc2hvdWxkIHdvcmssIGV2ZW4gd2l0aCBubyBib2R5CisgICAgd2hpbGUgKGEpIC8qIGNv bmRpdGlvbnMoMi8yKcKgKi8KKwlicmVhazsKK30KKwordm9pZCBtY2RjMDA4ZCAoaW50IGEs IGludCBiLCBpbnQgYywgaW50IGQpCit7CisgICAgLyogbXVsdGktdGVybSBsb29wIGNvbmRp dGlvbmFsICovCisgICAgd2hpbGUgKChhICYmIChiIHx8IGMpKSAmJiBkKSAvKiBjb25kaXRp b25zKDgvOCkgKi8KKwlhID0gYiA9IGMgPSBkID0gMDsKK30KKwordm9pZCBtY2RjMDA5YSAo aW50IGEsIGludCBiKQoreworICAgIHdoaWxlIChhID4gMCAmJiBiID4gMCkgLyogY29uZGl0 aW9ucygzLzQpIGZhbHNlKDEpICovCisJCQkgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KKwl4 ID0gYS0tOworfQorCisvKiBmb3IgbG9vcCAqLwordm9pZCBtY2RjMDEwYShpbnQgYSwgaW50 IGIpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiOyBpKyspIC8qIGNvbmRpdGlvbnMo Mi8yKSAqLworICAgIHsKKwlpZiAoYSA8IGIpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCSAg ICB4ID0gMTsKKwllbHNlCisJICAgIHggPSBhICs9IDI7CisgICAgfQorfQorCitpbnQgYWx3 YXlzIChpbnQpIHsgcmV0dXJuIDE7IH0KKworLyogbm8tY29uZGl0aW9uIGluZmluaXRlIGxv b3BzICovCit2b2lkIG1jZGMwMTBiIChpbnQgYSkKK3sKKyAgICBmb3IgKDs7KQorICAgIHsK KwlpZiAoYWx3YXlzKGEpKSAvKiBjb25kaXRpb25zKDEvMikgZmFsc2UoMCkgKi8KKwkJICAg ICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCXsKKwkgICAgeCA9IGE7CisJICAgIGJyZWFr OworCX0KKwl4ICs9IGEgKyAxOworICAgIH0KK30KKworLyogY29uZGl0aW9uYWxzIHdpdGhv dXQgY29udHJvbCBmbG93IGNvbnN0cnVjdHMgd29yayAqLwordm9pZCBtY2RjMDExYSAoaW50 IGEsIGludCBiLCBpbnQgYykKK3sKKyAgICB4ID0gKGEgJiYgYikgfHwgYzsgLyogY29uZGl0 aW9ucyg1LzYpIGZhbHNlKDEpICovCisJCSAgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8K K30KKworLyogc2VxdWVudGlhbCBleHByZXNzaW9ucyBhcmUgaGFuZGxlZCBpbmRlcGVuZGVu dGx5ICovCit2b2lkIG1jZGMwMTJhIChpbnQgYSwgaW50IGIsIGludCBjKSB7CisgICAgaWYg KGEgfHwgYikgLyogY29uZGl0aW9ucygzLzQpIHRydWUoMCkgKi8KKwkvKiBjb25kaXRpb25z KGVuZCkgKi8KKwl4ID0gMTsKKyAgICBlbHNlCisJeCA9IDI7CisKKyAgICBpZiAoYykgLyog Y29uZGl0aW9ucygyLzIpICovCisJeCA9IDE7Cit9CisKKy8qCisgKiBjYW5ub3QgZXZlciBz YXRpc2Z5IE1DL0RDLCBldmVuIHdpdGggYWxsIGlucHV0IGNvbWJpbmF0aW9ucywgYmVjYXVz ZSBub3QgYWxsCisgKiB2YXJpYWJsZXMgaW5kZXBlbmRlbnRseSBhZmZlY3QgdGhlIGRlY2lz aW9uCisgKi8KK3ZvaWQgbWNkYzAxM2EgKGludCBhLCBpbnQgLyogYiAqLywgaW50IGMpCit7 CisgICAgLyoKKyAgICAgKiBTcGVjaWZpY2F0aW9uOiAoYSAmJiBiKSB8fCBjCisgICAgICoK KyAgICAgKiBCdXQgdGhlIGV4cHJlc3Npb24gd2FzIGltcGxlbWVudGVkIHdyb25nLiBUaGlz IGhhcyBicmFuY2ggY292ZXJhZ2UsIGJ1dAorICAgICAqIG5vdCBNQy9EQworICAgICAqLwor ICAgIGlmICgoYSAmJiAhYykgfHwgYykgLyogY29uZGl0aW9ucyg1LzYpIGZhbHNlKDEpICov CisJLyogY29uZGl0aW9ucyhlbmQpICovCisJeCA9IDE7CisgICAgZWxzZQorCXggPSAyOwor fQorCit2b2lkIG1jZGMwMTRhICgpCit7CisgICAgaW50IGNvbmRzWzY0XSA9IHsgMCB9Owor ICAgIC8qIGNvbmRpdGlvbnMoNjQvMTI4KSB0cnVlKDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAg MTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjgg MjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYg NDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMpICov CisgICAgeCA9IGNvbmRzWyAwXSB8fCBjb25kc1sgMV0gfHwgY29uZHNbIDJdIHx8IGNvbmRz WyAzXSB8fCBjb25kc1sgNF0gfHwKKwljb25kc1sgNV0gfHwgY29uZHNbIDZdIHx8IGNvbmRz WyA3XSB8fCBjb25kc1sgOF0gfHwgY29uZHNbIDldIHx8CisJY29uZHNbMTBdIHx8IGNvbmRz WzExXSB8fCBjb25kc1sxMl0gfHwgY29uZHNbMTNdIHx8IGNvbmRzWzE0XSB8fAorCWNvbmRz WzE1XSB8fCBjb25kc1sxNl0gfHwgY29uZHNbMTddIHx8IGNvbmRzWzE4XSB8fCBjb25kc1sx OV0gfHwKKwljb25kc1syMF0gfHwgY29uZHNbMjFdIHx8IGNvbmRzWzIyXSB8fCBjb25kc1sy M10gfHwgY29uZHNbMjRdIHx8CisJY29uZHNbMjVdIHx8IGNvbmRzWzI2XSB8fCBjb25kc1sy N10gfHwgY29uZHNbMjhdIHx8IGNvbmRzWzI5XSB8fAorCWNvbmRzWzMwXSB8fCBjb25kc1sz MV0gfHwgY29uZHNbMzJdIHx8IGNvbmRzWzMzXSB8fCBjb25kc1szNF0gfHwKKwljb25kc1sz NV0gfHwgY29uZHNbMzZdIHx8IGNvbmRzWzM3XSB8fCBjb25kc1szOF0gfHwgY29uZHNbMzld IHx8CisJY29uZHNbNDBdIHx8IGNvbmRzWzQxXSB8fCBjb25kc1s0Ml0gfHwgY29uZHNbNDNd IHx8IGNvbmRzWzQ0XSB8fAorCWNvbmRzWzQ1XSB8fCBjb25kc1s0Nl0gfHwgY29uZHNbNDdd IHx8IGNvbmRzWzQ4XSB8fCBjb25kc1s0OV0gfHwKKwljb25kc1s1MF0gfHwgY29uZHNbNTFd IHx8IGNvbmRzWzUyXSB8fCBjb25kc1s1M10gfHwgY29uZHNbNTRdIHx8CisJY29uZHNbNTVd IHx8IGNvbmRzWzU2XSB8fCBjb25kc1s1N10gfHwgY29uZHNbNThdIHx8IGNvbmRzWzU5XSB8 fAorCWNvbmRzWzYwXSB8fCBjb25kc1s2MV0gfHwgY29uZHNbNjJdIHx8IGNvbmRzWzYzXQor CTsgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworfQorCisvKiBlYXJseSByZXR1cm5zICovCit2 b2lkIG1jZGMwMTVhIChpbnQgYSwgaW50IGIpCit7CisgICAgaWYgKGEpIC8qIGNvbmRpdGlv bnMoMi8yKSAqLworCXJldHVybjsKKworICAgIGlmIChiKSAvKiBjb25kaXRpb25zKDEvMikg dHJ1ZSgwKSAqLworCSAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCXggPSAxOworfQorCit2 b2lkIG1jZGMwMTViIChpbnQgYSwgaW50IGIpCit7CisgICAgZm9yIChpbnQgaSA9IDU7IGkg PiBhOyBpLS0pIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKwlpZiAoaSA9PSBiKSAv KiBjb25kaXRpb25zKDIvMikgKi8KKwkgICAgcmV0dXJuOworCXggPSBpOworICAgIH0KK30K Kwordm9pZCBtY2RjMDE1YyAoaW50IGEsIGludCBiKQoreworICAgIGZvciAoaW50IGkgPSA1 OyBpID4gYTsgaS0tKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKyAgICB7CisJaWYgKGkgPT0g YikgLyogY29uZGl0aW9ucygyLzIpICovCisJeworCSAgICB4ID0gMDsKKwkgICAgcmV0dXJu OworCX0KKwllbHNlCisJeworCSAgICB4ID0gMTsKKwkgICAgcmV0dXJuOworCX0KKworCXgg PSBpOworICAgIH0KK30KKworCisvKiBjaGVjayBuZXN0ZWQgbG9vcHMgKi8KK3ZvaWQgbWNk YzAxNmEgKGludCBhLCBpbnQgYikKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGE7IGkr KykgLyogY29uZGl0aW9ucygyLzIpICovCisJZm9yIChpbnQgayA9IDA7IGsgPCBiOyBrKysp IC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCSAgICB4ID0gaSArIGs7Cit9CisKK3ZvaWQgbWNk YzAxNmIgKGludCBhLCBpbnQgYikKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGE7IGkr KykgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworCWlmIChhID4gNSkgLyogY29uZGl0 aW9ucygyLzIpICovCisJICAgIGJyZWFrOworCisJZm9yIChpbnQgayA9IDA7IGsgPCBiOyBr KyspIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCSAgICB4ID0gaSArIGs7CisgICAgfQorfQor Cit2b2lkIG1jZGMwMTZjIChpbnQgYSwgaW50IGIpCit7CisgICAgZm9yIChpbnQgaSA9IDA7 IGkgPCBhOyBpKyspIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworICAgIHsKKwlpZiAoYSA+IDUp IC8qIGNvbmRpdGlvbnMoMS8yKSB0cnVlKDApICovCisJCSAgIC8qIGNvbmRpdGlvbnMoZW5k KSAqLworCSAgICByZXR1cm47CisKKwlmb3IgKGludCBrID0gMDsgayA8IGI7IGsrKykgLyog Y29uZGl0aW9ucygyLzIpICovCisJICAgIHggPSBpICsgazsKKyAgICB9Cit9CisKK3ZvaWQg bWNkYzAxNmQgKGludCBhLCBpbnQgYikKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGE7 IGkrKykgLyogY29uZGl0aW9ucygyLzIpICovCisgICAgeworCWZvciAoaW50IGsgPSAwOyBr IDwgNTsgaysrKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKwl7CisJICAgIGlmIChiID4gNSkg LyogY29uZGl0aW9ucygxLzIpIHRydWUoMCkgKi8KKwkJICAgICAgIC8qIGNvbmRpdGlvbnMo ZW5kKSAqLworCQlyZXR1cm47CisJICAgIHggPSBpICsgazsKKwl9CisKKyAgICB9Cit9CisK Ky8qIGRvLXdoaWxlIGxvb3BzICovCit2b2lkIG1jZGMwMTdhIChpbnQgYSkKK3sKKyAgICBk byB7CisJYS0tOworICAgIH0gd2hpbGUgKGEgPiAwKTsgLyogY29uZGl0aW9ucygyLzIpICov Cit9CisKK3ZvaWQgbm9vcCAoKSB7fQorCit2b2lkIG1jZGMwMTdiIChpbnQgYSwgaW50IGIp Cit7CisgICAgZG8geworCS8qCisJICogVGhpcyBjYWxsIGlzIGltcG9ydGFudDsgaXQgY2Fu IGFkZCBtb3JlIG5vZGVzIHRvIHRoZSBib2R5IGluIHRoZQorCSAqIENGRywgd2hpY2ggaGFz IGNoYW5nZXMgaG93IGNsb3NlIGV4aXRzIGFuZCBicmVha3MgYXJlIHRvIHRoZSBsb29wCisJ ICogY29uZGl0aW9uYWwuCisJICovCisJbm9vcCAoKTsKKwlhLS07CisJaWYgKGIpIC8qIGNv bmRpdGlvbnMoMi8yKSAqLworCSAgICBicmVhazsKKworICAgIH0gd2hpbGUgKGEgPiAwKTsg LyogY29uZGl0aW9ucygyLzIpICovCit9CisKK3ZvaWQgbWNkYzAxN2MgKGludCBhLCBpbnQg YikKK3sKKyAgICBpbnQgbGVmdCA9IDA7CisgICAgaW50IHJpZ2h0ID0gMDsKKyAgICBpbnQg biA9IGEgKyBiOworICAgIGRvIHsKKwlpZiAoYSkgLyogY29uZGl0aW9ucygxLzIpIGZhbHNl KDApICovCisJICAgICAgIC8qIGNvbmRpdGlvbnMoZW5kKSAqLworCXsKKwkgICAgbGVmdCA9 IGEgPiBsZWZ0ID8gYiA6IGxlZnQ7IC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCX0KKwlpZiAo YikgLyogY29uZGl0aW9ucygxLzIpIGZhbHNlKDApICovCisJeworCSAgICByaWdodCA9IGIg PiByaWdodCA/IGEgOiByaWdodDsgLyogY29uZGl0aW9ucygyLzIpICovCisJfQorICAgIH0g d2hpbGUgKG4tLSA+IDApOyAvKiBjb25kaXRpb25zKDIvMikgKi8KK30KKworaW50IGlkICAo aW50IHgpIHsgcmV0dXJuICB4OyB9CitpbnQgaW52IChpbnQgeCkgeyByZXR1cm4gIXg7IH0K KworLyogY29sbGVjdGlvbiBvZiBvZGQgY2FzZXMgbGlmdGVkLWFuZC1hZGFwdGVkIGZyb20g cmVhbC13b3JsZCBjb2RlICovCitpbnQgbWNkYzAxOGEgKGludCBhLCBpbnQgYiwgaW50IGMs IGludCBkLCBpbnQgZSwgaW50IGYsIGludCBnLCBpbnQgbGVuKQoreworICAgIGludCBuOwor ICAgIC8qIGFkYXB0ZWQgZnJvbSB6bGliL2d6X3JlYWQgKi8KKyAgICBkbworICAgIHsKKwlu ID0gLTE7CisJaWYgKG4gPiBsZW4pIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCSAgICBuID0g bGVuOworCisJaWYgKGIpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCXsKKwkgICAgaWYgKGIg PCA1KSAvKiBjb25kaXRpb25zKDIvMikgKi8KKwkJeCA9IDE7CisJICAgIG5vb3AoKTsKKwl9 CisJZWxzZSBpZiAoYyAmJiBkKSAvKiBjb25kaXRpb25zKDMvNCkgZmFsc2UoMSkgKi8KKwl7 CisJICAgIHggPSAyOworCSAgICBicmVhazsKKwl9CisJZWxzZSBpZiAoZSB8fCBmKSAvKiBj b25kaXRpb25zKDIvNCkgZmFsc2UoMCAxKSAqLworCQkJIC8qIGNvbmRpdGlvbnMoZW5kKSAq LworCXsKKwkgICAgaWYgKGlkKGcpKSAvKiBjb25kaXRpb25zKDIvMikgKi8KKwkJcmV0dXJu IDA7CisJICAgIGNvbnRpbnVlOworCX0KKyAgICB9IHdoaWxlIChhLS0gPiAwKTsgLyogY29u ZGl0aW9ucygyLzIpICovCisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBtY2RjMDE4YiAo aW50IGEsIGludCBiLCBpbnQgYykgeworICAgIGludCBuOworICAgIHdoaWxlIChhKSAvKiBj b25kaXRpb25zKDIvMikgKi8KKyAgICB7CisJLyoKKwkgKiBlbHNlIGJsb2NrIGRvZXMgbm90 IG1ha2UgYSBkaWZmZXJlbmNlIGZvciB0aGUgcHJvYmxlbSwgYnV0IGVuc3VyZXMKKwkgKiBs b29wIHRlcm1pbmF0aW9uCisJICovCisJaWYgKGIpIC8qIGNvbmRpdGlvbnMoMi8yKSAqLwor CSAgICBuID0gYyA/IDAgOiAwOyAvLyBkb2VzIG5vdCBzaG93IHVwIGluIENGRyAoZW1iZWRk ZWQgaW4gdGhlIGJsb2NrKQorCWVsc2UKKwkgICAgbiA9IDA7CisJYSA9IG47CisgICAgfQor fQorCisvKiB0b28gbWFueSBjb25kaXRpb25zLCBjb3ZlcmFnZSBnaXZlcyB1cCAqLwordm9p ZCBtY2RjMDE5YSAoKQoreworICAgIGludCBjb25kc1s2NV0gPSB7IDAgfTsKKyAgICAjcHJh Z21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGln bm9yZWQgIi1XY292ZXJhZ2UtdG9vLW1hbnktY29uZGl0aW9ucyIKKyAgICB4ID0gY29uZHNb IDBdIHx8IGNvbmRzWyAxXSB8fCBjb25kc1sgMl0gfHwgY29uZHNbIDNdIHx8IGNvbmRzWyA0 XSB8fAorCWNvbmRzWyA1XSB8fCBjb25kc1sgNl0gfHwgY29uZHNbIDddIHx8IGNvbmRzWyA4 XSB8fCBjb25kc1sgOV0gfHwKKwljb25kc1sxMF0gfHwgY29uZHNbMTFdIHx8IGNvbmRzWzEy XSB8fCBjb25kc1sxM10gfHwgY29uZHNbMTRdIHx8CisJY29uZHNbMTVdIHx8IGNvbmRzWzE2 XSB8fCBjb25kc1sxN10gfHwgY29uZHNbMThdIHx8IGNvbmRzWzE5XSB8fAorCWNvbmRzWzIw XSB8fCBjb25kc1syMV0gfHwgY29uZHNbMjJdIHx8IGNvbmRzWzIzXSB8fCBjb25kc1syNF0g fHwKKwljb25kc1syNV0gfHwgY29uZHNbMjZdIHx8IGNvbmRzWzI3XSB8fCBjb25kc1syOF0g fHwgY29uZHNbMjldIHx8CisJY29uZHNbMzBdIHx8IGNvbmRzWzMxXSB8fCBjb25kc1szMl0g fHwgY29uZHNbMzNdIHx8IGNvbmRzWzM0XSB8fAorCWNvbmRzWzM1XSB8fCBjb25kc1szNl0g fHwgY29uZHNbMzddIHx8IGNvbmRzWzM4XSB8fCBjb25kc1szOV0gfHwKKwljb25kc1s0MF0g fHwgY29uZHNbNDFdIHx8IGNvbmRzWzQyXSB8fCBjb25kc1s0M10gfHwgY29uZHNbNDRdIHx8 CisJY29uZHNbNDVdIHx8IGNvbmRzWzQ2XSB8fCBjb25kc1s0N10gfHwgY29uZHNbNDhdIHx8 IGNvbmRzWzQ5XSB8fAorCWNvbmRzWzUwXSB8fCBjb25kc1s1MV0gfHwgY29uZHNbNTJdIHx8 IGNvbmRzWzUzXSB8fCBjb25kc1s1NF0gfHwKKwljb25kc1s1NV0gfHwgY29uZHNbNTZdIHx8 IGNvbmRzWzU3XSB8fCBjb25kc1s1OF0gfHwgY29uZHNbNTldIHx8CisJY29uZHNbNjBdIHx8 IGNvbmRzWzYxXSB8fCBjb25kc1s2Ml0gfHwgY29uZHNbNjNdIHx8IGNvbmRzWzY0XQorCTsK KyAgICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorfQorCisvKiB0ZXJuYXJ5ICovCit2 b2lkIG1jZGMwMjBhIChpbnQgYSkKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UsIHRoaXMgY2Fu IGJlIHJlZHVjZWQgdG86CisgICAgLy8gXzEgPSBhcmdjICE9IDA7CisgICAgLy8gZSA9IChp bnQpIF8xOworICAgIHggPSBhID8gMSA6IDA7CisKKyAgICAvLyBjaGFuZ2luZyB0byBkaWZm ZXJlbnQgaW50IG1ha2VzIGJyYW5jaAorICAgIHggPSBhID8gMiA6IDE7IC8qIGNvbmRpdGlv bnMoMi8yKSAqLworfQorCit2b2lkIG1jZGMwMjBiIChpbnQgYSwgaW50IGIpCit7CisgICAg eCA9IChhIHx8IGIpID8gMSA6IDA7IC8qIGNvbmRpdGlvbnMoMy80KSB0cnVlKDEpICovCit9 CisKK3ZvaWQgbWNkYzAyMGMgKGludCBhLCBpbnQgYikKK3sKKyAgICB4ID0gYSA/IDAKKwk6 IGIgPyAxIC8qIGNvbmRpdGlvbnMoMi8yKSAqLworCTogMjsgICAgLyogY29uZGl0aW9ucygx LzIpIGZhbHNlKDApICovCisJCS8qIGNvbmRpdGlvbnMoZW5kKSAqLworfQorCisvKiBpbmZp bml0ZSBsb29wIChubyBleGl0LWVkZ2UpLCB0aGlzIHNob3VsZCBub3QgYmUgY2FsbGVkLCBi dXQgaXQgc2hvdWxkCisgICBjb21waWxlIGZpbmUgKi8KK3ZvaWQgbWNkYzAyMWEgKCkKK3sK KyAgICB3aGlsZSAoMSkKKwk7Cit9CisKKy8qIHRlc3Qgd2l0aCBmdW5jdGlvbnMgYXMgY29u ZGl0aW9uYWxzICovCisKK2ludCBtYWluICgpCit7CisgICAgbWNkYzAwMWEgKDAsIDEpOwor CisgICAgbWNkYzAwMWIgKDAsIDEpOworICAgIG1jZGMwMDFiICgwLCAwKTsKKworICAgIG1j ZGMwMDFjICgwLCAxKTsKKyAgICBtY2RjMDAxYyAoMCwgMCk7CisgICAgbWNkYzAwMWMgKDEs IDEpOworCisgICAgbWNkYzAwMWQgKDEsIDEsIDEpOworICAgIG1jZGMwMDFkICgwLCAxLCAw KTsKKworICAgIG1jZGMwMDJhICgxLCAwKTsKKworICAgIG1jZGMwMDJiICgxLCAwKTsKKyAg ICBtY2RjMDAyYiAoMSwgMSk7CisKKyAgICBtY2RjMDAyYyAoMCwgMCk7CisgICAgbWNkYzAw MmMgKDEsIDEpOworICAgIG1jZGMwMDJjICgxLCAwKTsKKworICAgIG1jZGMwMDJkICgxLCAx LCAxKTsKKyAgICBtY2RjMDAyZCAoMSwgMCwgMCk7CisKKyAgICBtY2RjMDAzYSAoMCwgMCk7 CisgICAgbWNkYzAwM2EgKDEsIDApOworCisgICAgbWNkYzAwNGEgKDApOworICAgIG1jZGMw MDRiICgwKTsKKyAgICBtY2RjMDA0YiAoMSk7CisgICAgbWNkYzAwNGMgKDEpOworCisgICAg bWNkYzAwNGQgKDAsIDAsIDApOworICAgIG1jZGMwMDRkICgxLCAxLCAxKTsKKworICAgIG1j ZGMwMDVhICgxLCAwLCAxKTsKKworICAgIG1jZGMwMDViICgxLCAxLCAwLCAwKTsKKyAgICBt Y2RjMDA1YiAoMSwgMCwgMCwgMCk7CisKKyAgICBtY2RjMDA2YSAoMCwgMCwgMCwgMCwgMCk7 CisgICAgbWNkYzAwNmEgKDEsIDAsIDAsIDAsIDApOworICAgIG1jZGMwMDZhICgxLCAxLCAx LCAwLCAwKTsKKworICAgIG1jZGMwMDZiICgwLCAwLCAwKTsKKyAgICBtY2RjMDA2YiAoMSwg MCwgMCk7CisgICAgbWNkYzAwNmIgKDEsIDEsIDApOworICAgIG1jZGMwMDZiICgxLCAxLCAx KTsKKworICAgIG1jZGMwMDdhICgwLCAwLCAwLCAwKTsKKyAgICBtY2RjMDA3YSAoMSwgMCwg MCwgMCk7CisgICAgbWNkYzAwN2EgKDAsIDAsIDEsIDApOworCisgICAgbWNkYzAwN2IgKDAs IDAsIDApOworICAgIG1jZGMwMDdiICgwLCAxLCAxKTsKKyAgICBtY2RjMDA3YiAoMSwgMCwg MSk7CisKKyAgICBtY2RjMDA4YSAoMCk7CisKKyAgICBtY2RjMDA4YiAoMCk7CisKKyAgICBt Y2RjMDA4YyAoMCk7CisgICAgbWNkYzAwOGMgKDEpOworCisgICAgbWNkYzAwOGQgKDAsIDAs IDAsIDApOworICAgIG1jZGMwMDhkICgxLCAwLCAwLCAwKTsKKyAgICBtY2RjMDA4ZCAoMSwg MCwgMSwgMCk7CisgICAgbWNkYzAwOGQgKDEsIDAsIDEsIDEpOworICAgIG1jZGMwMDhkICgx LCAxLCAxLCAxKTsKKworICAgIG1jZGMwMDlhICgwLCAwKTsKKyAgICBtY2RjMDA5YSAoMSwg MSk7CisKKyAgICBtY2RjMDEwYSAoMCwgMCk7CisgICAgbWNkYzAxMGEgKDAsIDkpOworICAg IG1jZGMwMTBhICgyLCAxKTsKKworICAgIG1jZGMwMTBiICgxKTsKKworICAgIG1jZGMwMTFh ICgwLCAwLCAwKTsKKyAgICBtY2RjMDExYSAoMSwgMSwgMCk7CisgICAgbWNkYzAxMWEgKDEs IDAsIDEpOworCisgICAgbWNkYzAxMmEgKDAsIDAsIDApOworICAgIG1jZGMwMTJhICgwLCAx LCAxKTsKKworICAgIG1jZGMwMTNhICgwLCAwLCAwKTsKKyAgICBtY2RjMDEzYSAoMCwgMCwg MSk7CisgICAgbWNkYzAxM2EgKDAsIDEsIDApOworICAgIG1jZGMwMTNhICgwLCAxLCAxKTsK KyAgICBtY2RjMDEzYSAoMSwgMCwgMCk7CisgICAgbWNkYzAxM2EgKDEsIDAsIDEpOworICAg IG1jZGMwMTNhICgxLCAxLCAwKTsKKyAgICBtY2RjMDEzYSAoMSwgMSwgMSk7CisKKyAgICBt Y2RjMDE0YSAoKTsKKworICAgIG1jZGMwMTVhICgwLCAwKTsKKyAgICBtY2RjMDE1YSAoMSwg MCk7CisKKyAgICBtY2RjMDE1YiAoMCwgMCk7CisgICAgbWNkYzAxNWIgKDAsIDEpOworICAg IG1jZGMwMTViICg2LCAxKTsKKworICAgIG1jZGMwMTVjICgwLCAwKTsKKyAgICBtY2RjMDE1 YyAoMCwgNSk7CisgICAgbWNkYzAxNWMgKDYsIDEpOworCisgICAgbWNkYzAxNmEgKDUsIDUp OworCisgICAgbWNkYzAxNmIgKDUsIDUpOworICAgIG1jZGMwMTZiICg2LCA1KTsKKworICAg IG1jZGMwMTZjICg1LCA1KTsKKworICAgIG1jZGMwMTZkICgxLCAwKTsKKworICAgIG1jZGMw MTdhICgwKTsKKyAgICBtY2RjMDE3YSAoMik7CisKKyAgICBtY2RjMDE3YiAoMiwgMCk7Cisg ICAgbWNkYzAxN2IgKDAsIDEpOworCisgICAgbWNkYzAxN2MgKDEsIDEpOworCisgICAgbWNk YzAxOGEgKDAsIDAsIDEsIDEsIDAsIDAsIDAsIDApOworICAgIG1jZGMwMThhICgwLCAxLCAw LCAwLCAwLCAwLCAxLCAtMik7CisgICAgbWNkYzAxOGEgKDAsIDYsIDAsIDAsIDAsIDAsIDEs IC0yKTsKKyAgICBtY2RjMDE4YSAoMCwgNiwgMCwgMCwgMCwgMCwgMSwgLTIpOworICAgIG1j ZGMwMThhICgwLCAwLCAwLCAxLCAwLCAxLCAxLCAwKTsKKyAgICBtY2RjMDE4YSAoMSwgMCwg MCwgMCwgMSwgMSwgMCwgMCk7CisKKyAgICBtY2RjMDE4YiAoMSwgMCwgMCk7CisgICAgbWNk YzAxOGIgKDEsIDEsIDApOworCisgICAgbWNkYzAxOWEgKCk7CisKKyAgICBtY2RjMDIwYSAo MCk7CisgICAgbWNkYzAyMGEgKDEpOworCisgICAgbWNkYzAyMGIgKDAsIDApOworICAgIG1j ZGMwMjBiICgxLCAwKTsKKworICAgIG1jZGMwMjBjICgwLCAxKTsKKyAgICBtY2RjMDIwYyAo MSwgMSk7Cit9CisKKy8qIHsgZGctZmluYWwgeyBydW4tZ2NvdiBjb25kaXRpb25zIHsgLS1j b25kaXRpb25zIGdjb3YtMTkuYyB9IH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0 ZS9nY2MubWlzYy10ZXN0cy9nY292LTIwLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5taXNjLXRl c3RzL2djb3YtMjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u NTZkZDZjZjg5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5taXNj LXRlc3RzL2djb3YtMjAuYwpAQCAtMCwwICsxLDIxIEBACisvKiB7IGRnLW9wdGlvbnMgIi1m cHJvZmlsZS1jb25kaXRpb25zIC1mdGVzdC1jb3ZlcmFnZSAtZnByb2ZpbGUtdXBkYXRlPWF0 b21pYyIgfSAqLworLyogeyBkZy1kbyBydW4geyB0YXJnZXQgbmF0aXZlIH0gfSAqLworCisv KiBzb21lIHNpZGUgZWZmZWN0IHRvIHN0b3AgYnJhbmNoZXMgZnJvbSBiZWluZyBwcnVuZWQg Ki8KK2ludCB4ID0gMDsKKwordm9pZCBjb25kaXRpb25zX2F0b21pYzAwMShpbnQgYSwgaW50 IGIpCit7CisgIGlmIChhIHx8IGIpIC8qIGNvbmRpdGlvbnMoMS80KSB0cnVlKDApIGZhbHNl KDAgMSkgKi8KKwkgICAgICAvKiBjb25kaXRpb25zKGVuZCkgKi8KKyAgICAgIHggPSAxOwor ICBlbHNlCisgICAgICB4ID0gMjsKK30KKworaW50IG1haW4gKCkKK3sKKyAgICBjb25kaXRp b25zX2F0b21pYzAwMSAoMCwgMSk7Cit9CisKKy8qIHsgZGctZmluYWwgeyBydW4tZ2NvdiBj b25kaXRpb25zIHsgLS1jb25kaXRpb25zIGdjb3YtMjAuYyB9IH0gfSAqLwpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9saWIvZ2Nvdi5leHAgYi9nY2MvdGVzdHN1aXRlL2xpYi9nY292 LmV4cAppbmRleCA5ZDViMmNkYjg2Yi4uODhmMjhkMjZiYjYgMTAwNjQ0Ci0tLSBhL2djYy90 ZXN0c3VpdGUvbGliL2djb3YuZXhwCisrKyBiL2djYy90ZXN0c3VpdGUvbGliL2djb3YuZXhw CkBAIC0xNzQsNiArMTc0LDE4MCBAQCBwcm9jIHZlcmlmeS1icmFuY2hlcyB7IHRlc3RuYW1l IHRlc3RjYXNlIGZpbGUgfSB7CiAgICAgcmV0dXJuICRmYWlsZWQKIH0KIAorIworIyB2ZXJp ZnktY29uZGl0aW9ucyAtLSBjaGVjayB0aGF0IGNvbmRpdGlvbnMgYXJlIGNoZWNrZWQgYXMg ZXhwZWN0ZWQKKyMKKyMgVEVTVE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QsIGluY2x1 ZGluZyB1bmlxdWUgZmxhZ3MuCisjIFRFU1RDQVNFIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0 IGZpbGUuCisjIEZJTEUgaXMgdGhlIG5hbWUgb2YgdGhlIGdjb3Ygb3V0cHV0IGZpbGUuCisj CisjIENoZWNrcyBhcmUgYmFzZWQgb24gY29tbWVudHMgaW4gdGhlIHNvdXJjZSBmaWxlLiBD b25kaXRpb24gY292ZXJhZ2UgY29tZXMKKyMgd2l0aCB3aXRoIHR3byB0eXBlcyBvZiBvdXRw dXQsIGEgc3VtbWFyeSBhbmQgYSBsaXN0IG9mIHRoZSB1bmNvdmVyZWQKKyMgY29uZGl0aW9u cy4gQm90aCBtdXN0IGJlIGNoZWNrZWQgdG8gcGFzcyB0aGUgdGVzdAorIworIyBUbyBjaGVj ayBmb3IgY29uZGl0aW9ucywgYWRkIGEgY29tbWVudCB0aGUgbGluZSBvZiBhIGNvbmRpdGlv bmFsOgorIyAvKiBjb25kaXRpb25zKG4vbSkgdHJ1ZSgwIDEpIGZhbHNlKDEpICovCisjCisj IHdoZXJlIG4vbSBhcmUgdGhlIGNvdmVyZWQgYW5kIHRvdGFsIGNvbmRpdGlvbnMgaW4gdGhl IGV4cHJlc3Npb24uIFRoZSB0cnVlKCkKKyMgYW5kIGZhbHNlKCkgdGFrZSB0aGUgaW5kaWNl cyBleHBlY3RlZCAqbm90KiBjb3ZlcmVkLgorIworIyBUaGlzIG1lYW5zIHRoYXQgYWxsIGNv dmVyYWdlIHN0YXRlbWVudHMgc2hvdWxkIGhhdmUgYmVlbiBzZWVuOgorIyAvKiBjb25kaXRp b25zKGVuZCkgKi8KKyMKKyMgSWYgYWxsIGNvbmRpdGlvbnMgYXJlIGNvdmVyZWQgaS5lLiBu ID09IG0sIHRoZW4gY29uZGl0aW9ucyhlbmQpIGNhbiBiZQorIyBvbWl0dGVkLiBJZiBlaXRo ZXIgdHJ1ZSgpIG9yIGZhbHNlKCkgYXJlIGVtcHR5IHRoZXkgY2FuIGJlIG9taXR0ZWQgdG9v LgorIworIyBDKysgY2FuIGluc2VydCBjb25kaXRpb25hbHMgaW4gdGhlIENGRyB0aGF0IGFy ZSBub3QgcHJlc2VudCBpbiBzb3VyY2UgY29kZS4KKyMgVGhlc2UgbXVzdCBiZSBtYW51YWxs eSBzdXBwcmVzc2VkIHNpbmNlIHVuZXhwZWN0ZWQgYW5kIHVuaGFuZGxlZCBjb25kaXRpb25z CisjIGFyZSBhbiBlcnJvciAodG8gaGVscCBjb21iYXQgcmVncmVzc2lvbnMpLiBPdXRwdXQg Y2FuIGJlIHN1cHByZXNzZWQgd2l0aAorIyBjb25kaXRpb25zKHN1cHByZXNzKSBhbmQgY29u ZGl0aW9ucyhlbmQpLiBzdXBwcmVzcyBzaG91bGQgdXN1YWxseSBiZSBvbiBhCisjIGNsb3Np bmcgYnJhY2UuCisjCisjIFNvbWUgZXhwcmVzc2lvbnMsIHdoZW4gdXNpbmcgdW5uYW1lZCB0 ZW1wb3JhcmllcyBhcyBvcGVyYW5kcywgd2lsbCBoYXZlCisjIGRlc3RydWN0b3JzIGluIGV4 cHJlc3Npb25zLiBUaGUgY292ZXJhZ2Ugb2YgdGhlIGRlc3RydWN0b3Igd2lsbCBiZSByZXBv cnRlZAorIyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBleHByZXNzaW9uIGl0c2VsZiwgYnV0 IHN1cHByZXNzKCkgd291bGQgYWxzbyBzd2FsbG93CisjIHRoZSBleHBlY3RlZCB0ZXN0ZWQt Zm9yIG1lc3NhZ2VzLiBUbyBoYW5kbGUgdGhlc2UsIHVzZSB0aGUgZGVzdHJ1Y3RvcigpIFsx XQorIyB3aGljaCB3aWxsIHN1cHByZXNzIGV2ZXJ5dGhpbmcgZnJvbSBhbmQgaW5jbHVkaW5n IHRoZSBzZWNvbmQgImNvbmRpdGlvbnMKKyMgY292ZXJlZCIuCisjCisjIFsxXSBpdCBpcyBp bXBvcnRhbnQgdGhhdCB0aGUgZGVzdHJ1Y3RvcigpIGlzICpvbiB0aGUgc2FtZSBsaW5lKiBh cyB0aGUKKyMgICAgIGNvbmRpdGlvbnMobS9uKQorcHJvYyB2ZXJpZnktY29uZGl0aW9ucyB7 IHRlc3RuYW1lIHRlc3RjYXNlIGZpbGUgfSB7CisgICAgc2V0IGZhaWxlZCAwCisgICAgc2V0 IHN1cHByZXNzIDAKKyAgICBzZXQgZGVzdHJ1Y3RvciAwCisgICAgc2V0IHNob3VsZHQgIiIK KyAgICBzZXQgc2hvdWxkZiAiIgorICAgIHNldCBzaG91bGRhbGwgIiIKKyAgICBzZXQgZmQg W29wZW4gJGZpbGUgcl0KKyAgICBzZXQgbiAwCisgICAgc2V0IGtleXdvcmRzIHsiZW5kIiAi c3VwcHJlc3MifQorICAgIHdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0geworICAgICAg ICByZWdleHAgIl5cW146XF0rOiAqKFxbMC05XF0rKToiICIkbGluZSIgYWxsIG4KKyAgICAg ICAgc2V0IHByZWZpeCAiJHRlc3RuYW1lIGxpbmUgJG4iCisKKyAgICAgICAgaWYgeyFbcmVn ZXhwICJjb25kaXRpb24iICRsaW5lXX0geworICAgICAgICAgICAgY29udGludWUKKyAgICAg ICAgfQorCisgICAgICAgICMgTWlzc2luZyBjb3ZlcmFnZSBmb3IgYm90aCB0cnVlIGFuZCBm YWxzZSB3aWxsIGNhdXNlIGEgZmFpbHVyZSwgYnV0CisgICAgICAgICMgb25seSBjb3VudCBp dCBvbmNlIGZvciB0aGUgcmVwb3J0LgorICAgICAgICBzZXQgb2sgMQorICAgICAgICBpZiBb cmVnZXhwIHtjb25kaXRpb25zICpcKChbMC05YS16L10rKVwpfSAiJGxpbmUiIGFsbCBlXSB7 CisgICAgICAgICAgICAjICpWZXJ5KiBjb2Fyc2Ugc2FuaXR5IGNoZWNrOiBjb25kaXRpb25z KCkgc2hvdWxkIGVpdGhlciBiZSBhCisgICAgICAgICAgICAjIGtleXdvcmQgb3Igbi9tLCBh bnl0aGluZyBlbHNlIG1lYW5zIGEgYnVnZ3kgdGVzdCBjYXNlLiBlbmQgaXMKKyAgICAgICAg ICAgICMgb3B0aW9uYWwgZm9yIGNhc2VzIHdoZXJlIGFsbCBjb25kaXRpb25zIGFyZSBjb3Zl cmVkLCBzaW5jZSBpdAorICAgICAgICAgICAgIyBvbmx5IGV4cGVjdHMgYSBzaW5nbGUgbGlu ZSBvZiBvdXRwdXQuCisgICAgICAgICAgICBpZiB7KFtsc2VhcmNoIC1leGFjdCAka2V5d29y ZHMgJGVdID49IDAgfHwgW3JlZ2V4cCB7XGQrL1xkK30gIiRlIl0pID09IDB9IHsKKyAgICAg ICAgICAgICAgICBmYWlsICIkcHJlZml4OiBleHBlY3RlZCBjb25kaXRpb25zIChuL20pLCAo c3VwcHJlc3MpIG9yIChlbmQpOyB3YXMgKCRlKSIKKyAgICAgICAgICAgICAgICBpbmNyIGZh aWxlZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB9CisKKyAgICAg ICAgICAgICMgQW55IGtleXdvcmQgbWVhbnMgYSBuZXcgY29udGV4dC4gU2V0IHRoZSBlcnJv ciBmbGFnIGlmIG5vdCBhbGwKKyAgICAgICAgICAgICMgZXhwZWN0ZWQgb3V0cHV0IGhhcyBi ZWVuIHNlZW4sIGFuZCByZXNldCB0aGUgc3RhdGUuCisKKyAgICAgICAgICAgIGlmIHtbbGxl bmd0aCAkc2hvdWxkdF0gIT0gMH0geworICAgICAgICAgICAgICAgIGZhaWwgIiRwcmVmaXg6 IGV4cGVjdGVkIHVuY292ZXJlZCAodHJ1ZSkgZm9yIHRlcm1zICRzaG91bGR0IgorICAgICAg ICAgICAgICAgIHNldCBvayAwCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIHtb bGxlbmd0aCAkc2hvdWxkZl0gIT0gMH0geworICAgICAgICAgICAgICAgIGZhaWwgIiRwcmVm aXg6IGV4cGVjdGVkIHVuY292ZXJlZCAoZmFsc2UpIGZvciB0ZXJtcyAkc2hvdWxkZiIKKyAg ICAgICAgICAgICAgICBzZXQgb2sgMAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBp ZiB7JHNob3VsZGFsbCBuZSAiIn0geworICAgICAgICAgICAgICAgIGZhaWwgIiRwcmVmaXg6 IGNvdmVyYWdlIHN1bW1hcnkgbm90IGZvdW5kOyBleHBlY3RlZCAkc2hvdWxkYWxsIgorICAg ICAgICAgICAgICAgIHNldCBvayAwCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNl dCBzdXBwcmVzcyAwCisgICAgICAgICAgICBzZXQgZGVzdHJ1Y3RvciAwCisgICAgICAgICAg ICBzZXQgc2hvdWxkdCAiIgorICAgICAgICAgICAgc2V0IHNob3VsZGYgIiIKKyAgICAgICAg ICAgIHNldCBzaG91bGRhbGwgIiIKKyAgICAgICAgICAgIHNldCBuZXd0ICIiCisgICAgICAg ICAgICBzZXQgbmV3ZiAiIgorCisgICAgICAgICAgICBpZiBbcmVnZXhwIHtkZXN0cnVjdG9y XChcKX0gIiRsaW5lIl0geworICAgICAgICAgICAgICAgIHNldCBkZXN0cnVjdG9yIDEKKyAg ICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgW3JlZ2V4cCB7KFxkKykvKFxkKyl9ICIk ZSIgYWxsIGkga10geworICAgICAgICAgICAgICAgIHJlZ2V4cCB7dHJ1ZVwoKFswLTkgXSsp XCl9ICAiJGxpbmUiIGFsbCBuZXd0CisgICAgICAgICAgICAgICAgcmVnZXhwIHtmYWxzZVwo KFswLTkgXSspXCl9ICIkbGluZSIgYWxsIG5ld2YKKworICAgICAgICAgICAgICAgICMgU2Fu aXR5IGNoZWNrIC0gaWYgdGhlIHRydWUoKSBhbmQgZmFsc2UoKSB2ZWN0b3JzIHNob3VsZCBo YXZlCisgICAgICAgICAgICAgICAgIyBtLW4gZWxlbWVudHMgdG8gY292ZXIgYWxsIHVuY292 ZXJlZCBjb25kaXRpb25zLiBCZWNhdXNlIG9mCisgICAgICAgICAgICAgICAgIyBtYXNraW5n IGl0IGNhbiBzb21ldGltZXMgYmUgc3VycHJpc2luZyB3aGF0IHRlcm1zIGFyZQorICAgICAg ICAgICAgICAgICMgaW5kZXBlbmRlbnQsIHNvIHRoaXMgbWFrZXMgZm9yIG1vcmUgcm9idXN0 IHRlc3QgYXQgdGhlIGNvc3QKKyAgICAgICAgICAgICAgICAjIG9mIGJlaW5nIHNsaWdodGx5 IG1vcmUgYW5ub3lpbmcgdG8gd3JpdGUuCisgICAgICAgICAgICAgICAgc2V0IG50ZXJtcyBb ZXhwciBbbGxlbmd0aCAkbmV3dF0gKyBbbGxlbmd0aCAkbmV3Zl1dCisgICAgICAgICAgICAg ICAgc2V0IG5leHBlY3RlZCBbZXhwciB7JGsgLSAkaX1dCisgICAgICAgICAgICAgICAgaWYg eyRudGVybXMgIT0gJG5leHBlY3RlZH0geworICAgICAgICAgICAgICAgICAgICBmYWlsICIk cHJlZml4OiBleHBlY3RlZCAkbmV4cGVjdGVkIHVuY292ZXJlZCB0ZXJtczsgZ290ICRudGVy bXMiCisgICAgICAgICAgICAgICAgICAgIHNldCBvayAwCisgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgICAgIHNldCBzaG91bGRhbGwgJGUKKyAgICAgICAgICAgICAgICBzZXQg c2hvdWxkdCAkbmV3dAorICAgICAgICAgICAgICAgIHNldCBzaG91bGRmICRuZXdmCisgICAg ICAgICAgICB9IGVsc2VpZiB7JGUgPT0gImVuZCJ9IHsKKyAgICAgICAgICAgICAgICAjIG5v LW9wIC0gc3RhdGUgaGFzIGFscmVhZHkgYmVlbiByZXNldCwgYW5kIGVycm9ycyBmbGFnZ2Vk CisgICAgICAgICAgICB9IGVsc2VpZiB7JGUgPT0gInN1cHByZXNzIn0geworICAgICAgICAg ICAgICAgIHNldCBzdXBwcmVzcyAxCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg ICAgICAgICMgdGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGUsIAorICAgICAgICAgICAgICAg IGZhaWwgIiRwcmVmaXg6IHVuaGFuZGxlZCBjb250cm9sICgkZSksIHNob3VsZCBiZSB1bnJl YWNoYWJsZSIKKyAgICAgICAgICAgICAgICBzZXQgb2sgMAorICAgICAgICAgICAgfQorICAg ICAgICB9IGVsc2VpZiB7JHN1cHByZXNzID09IDF9IHsKKyAgICAgICAgICAgICMgaWdub3Jl IGV2ZXJ5dGhpbmcgaW4gYSBzdXBwcmVzcyBibG9jay4gQysrIGVzcGVjaWFsbHkgY2FuIGlu c2VydAorICAgICAgICAgICAgIyBjb25kaXRpb25hbHMgaW4gZXhjZXB0aW9ucyBhbmQgZGVz dHJ1Y3RvcnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlCisgICAgICAgICAgICAjIGJlIGNvbnNp ZGVyZWQgdW5oYW5kbGVkLgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgfSBlbHNl aWYgW3JlZ2V4cCB7Y29uZGl0aW9uICsoXGQrKSBub3QgY292ZXJlZCBcKHRydWVcKX0gIiRs aW5lIiBhbGwgY29uZF0geworICAgICAgICAgICAgc2V0IGkgW2xzZWFyY2ggJHNob3VsZHQg JGNvbmRdCisgICAgICAgICAgICBpZiB7JGkgIT0gLTF9IHsKKyAgICAgICAgICAgICAgICBz ZXQgc2hvdWxkdCBbbHJlcGxhY2UgJHNob3VsZHQgJGkgJGldCisgICAgICAgICAgICB9IGVs c2UgeworICAgICAgICAgICAgICAgIGZhaWwgIiR0ZXN0bmFtZSBsaW5lICRuOiB1bmV4cGVj dGVkIHVuY292ZXJlZCB0ZXJtICRjb25kICh0cnVlKSIKKyAgICAgICAgICAgICAgICBzZXQg b2sgMAorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2VpZiBbcmVnZXhwIHtjb25kaXRp b24gKyhcZCspIG5vdCBjb3ZlcmVkIFwoZmFsc2VcKX0gIiRsaW5lIiBhbGwgY29uZF0gewor ICAgICAgICAgICAgc2V0IGkgW2xzZWFyY2ggJHNob3VsZGYgJGNvbmRdCisgICAgICAgICAg ICBpZiB7JGkgIT0gLTF9IHsKKyAgICAgICAgICAgICAgICBzZXQgc2hvdWxkZiBbbHJlcGxh Y2UgJHNob3VsZGYgJGkgJGldCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg ICAgIGZhaWwgIiR0ZXN0bmFtZSBsaW5lICRuOiB1bmV4cGVjdGVkIHVuY292ZXJlZCB0ZXJt ICRjb25kIChmYWxzZSkiCisgICAgICAgICAgICAgICAgc2V0IG9rIDAKKyAgICAgICAgICAg IH0KKyAgICAgICAgfSBlbHNlaWYgW3JlZ2V4cCB7Y29uZGl0aW9ucyBjb3ZlcmVkIChcZCsv XGQrKX0gIiRsaW5lIiBhbGwgY29uZF0geworICAgICAgICAgICAgIyB0aGUgZGVzdHJ1Y3Rv ci1nZW5lcmF0ZWQgImNvbmRpdGlvbnMgY292ZXJlZCIgbGluZXMgd2lsbCBiZQorICAgICAg ICAgICAgIyB3cml0dGVuIGFmdGVyIGFsbCBleHByZXNzaW9uLXJlbGF0ZWQgb3V0cHV0LiBI YW5kbGUgdGhlc2UgYnkKKyAgICAgICAgICAgICMgdHVybmluZyBvbiBzdXBwcmVzc2lvbiBp ZiB0aGUgZGVzdHJ1Y3Rvci1zdXBwcmVzc2lvbiBpcworICAgICAgICAgICAgIyByZXF1ZXN0 ZWQuCisgICAgICAgICAgICBpZiB7JHNob3VsZGFsbCA9PSAiIiAmJiAkZGVzdHJ1Y3RvciA9 PSAxfSB7CisgICAgICAgICAgICAgICAgc2V0IHN1cHByZXNzIDEKKyAgICAgICAgICAgICAg ICBjb250aW51ZQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiB7JGNvbmQgPT0g JHNob3VsZGFsbH0geworICAgICAgICAgICAgICAgIHNldCBzaG91bGRhbGwgIiIKKyAgICAg ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmFpbCAiJHRlc3RuYW1lIGxpbmUg JG46IHVuZXhwZWN0ZWQgc3VtbWFyeSAkY29uZCIKKyAgICAgICAgICAgICAgICBzZXQgb2sg MAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgeyRvayAhPSAxfSB7 CisgICAgICAgICAgICBpbmNyIGZhaWxlZAorICAgICAgICB9CisgICAgfQorICAgIGNsb3Nl ICRmZAorICAgIHJldHVybiAkZmFpbGVkCit9CisKICMKICMgdmVyaWZ5LWNhbGxzIC0tIGNo ZWNrIHRoYXQgY2FsbCByZXR1cm4gcGVyY2VudGFnZXMgYXJlIGFzIGV4cGVjdGVkCiAjCkBA IC0zMjEsNiArNDk1LDcgQEAgcHJvYyBydW4tZ2NvdiB7IGFyZ3MgfSB7CiAgICAgc2V0IGdj b3ZfYXJncyAiIgogICAgIHNldCBnY292X3ZlcmlmeV9jYWxscyAwCiAgICAgc2V0IGdjb3Zf dmVyaWZ5X2JyYW5jaGVzIDAKKyAgICBzZXQgZ2Nvdl92ZXJpZnlfY29uZGl0aW9ucyAwCiAg ICAgc2V0IGdjb3ZfdmVyaWZ5X2xpbmVzIDEKICAgICBzZXQgZ2Nvdl92ZXJpZnlfaW50ZXJt ZWRpYXRlIDAKICAgICBzZXQgZ2Nvdl9yZW1vdmVfZ2NkYSAwCkBAIC0zMzEsMTAgKzUwNiwx MyBAQCBwcm9jIHJ1bi1nY292IHsgYXJncyB9IHsKIAkgIHNldCBnY292X3ZlcmlmeV9jYWxs cyAxCiAJfSBlbHNlaWYgeyAkYSA9PSAiYnJhbmNoZXMiIH0gewogCSAgc2V0IGdjb3ZfdmVy aWZ5X2JyYW5jaGVzIDEKKwl9IGVsc2VpZiB7ICRhID09ICJjb25kaXRpb25zIiB9IHsKKwkg IHNldCBnY292X3ZlcmlmeV9jb25kaXRpb25zIDEKIAl9IGVsc2VpZiB7ICRhID09ICJpbnRl cm1lZGlhdGUiIH0gewogCSAgc2V0IGdjb3ZfdmVyaWZ5X2ludGVybWVkaWF0ZSAxCiAJICBz ZXQgZ2Nvdl92ZXJpZnlfY2FsbHMgMAogCSAgc2V0IGdjb3ZfdmVyaWZ5X2JyYW5jaGVzIDAK KwkgIHNldCBnY292X3ZlcmlmeV9jb25kaXRpb25zIDAKIAkgIHNldCBnY292X3ZlcmlmeV9s aW5lcyAwCiAJfSBlbHNlaWYgeyAkYSA9PSAicmVtb3ZlLWdjZGEiIH0gewogCSAgc2V0IGdj b3ZfcmVtb3ZlX2djZGEgMQpAQCAtNDA0LDYgKzU4MiwxMSBAQCBwcm9jIHJ1bi1nY292IHsg YXJncyB9IHsKICAgICB9IGVsc2UgewogCXNldCBiZmFpbGVkIDAKICAgICB9CisgICAgaWYg eyAkZ2Nvdl92ZXJpZnlfY29uZGl0aW9ucyB9IHsKKwlzZXQgY2RmYWlsZWQgW3ZlcmlmeS1j b25kaXRpb25zICR0ZXN0bmFtZSAkdGVzdGNhc2UgJHRlc3RjYXNlLmdjb3ZdCisgICAgfSBl bHNlIHsKKwlzZXQgY2RmYWlsZWQgMAorICAgIH0KICAgICBpZiB7ICRnY292X3ZlcmlmeV9j YWxscyB9IHsKIAlzZXQgY2ZhaWxlZCBbdmVyaWZ5LWNhbGxzICR0ZXN0bmFtZSAkdGVzdGNh c2UgJHRlc3RjYXNlLmdjb3ZdCiAgICAgfSBlbHNlIHsKQEAgLTQxOCwxMiArNjAxLDEyIEBA IHByb2MgcnVuLWdjb3YgeyBhcmdzIH0gewogCiAgICAgIyBSZXBvcnQgd2hldGhlciB0aGUg Z2NvdiB0ZXN0IHBhc3NlZCBvciBmYWlsZWQuICBJZiB0aGVyZSB3ZXJlCiAgICAgIyBtdWx0 aXBsZSBmYWlsdXJlcyB0aGVuIHRoZSBtZXNzYWdlIGlzIGEgc3VtbWFyeS4KLSAgICBzZXQg dGZhaWxlZCBbZXhwciAkbGZhaWxlZCArICRiZmFpbGVkICsgJGNmYWlsZWQgKyAkaWZhaWxl ZF0KKyAgICBzZXQgdGZhaWxlZCBbZXhwciAkbGZhaWxlZCArICRiZmFpbGVkICsgJGNkZmFp bGVkICsgJGNmYWlsZWQgKyAkaWZhaWxlZF0KICAgICBpZiB7ICR4ZmFpbGVkIH0gewogCXNl dHVwX3hmYWlsICIqLSotKiIKICAgICB9CiAgICAgaWYgeyAkdGZhaWxlZCA+IDAgfSB7Ci0J ZmFpbCAiJHRlc3RuYW1lIGdjb3Y6ICRsZmFpbGVkIGZhaWx1cmVzIGluIGxpbmUgY291bnRz LCAkYmZhaWxlZCBpbiBicmFuY2ggcGVyY2VudGFnZXMsICRjZmFpbGVkIGluIHJldHVybiBw ZXJjZW50YWdlcywgJGlmYWlsZWQgaW4gaW50ZXJtZWRpYXRlIGZvcm1hdCIKKwlmYWlsICIk dGVzdG5hbWUgZ2NvdjogJGxmYWlsZWQgZmFpbHVyZXMgaW4gbGluZSBjb3VudHMsICRiZmFp bGVkIGluIGJyYW5jaCBwZXJjZW50YWdlcywgJGNkZmFpbGVkIGluIGNvbmRpdGlvbi9kZWNp c2lvbiwgJGNmYWlsZWQgaW4gcmV0dXJuIHBlcmNlbnRhZ2VzLCAkaWZhaWxlZCBpbiBpbnRl cm1lZGlhdGUgZm9ybWF0IgogCWlmIHsgJHhmYWlsZWQgfSB7CiAJICAgIGNsZWFuLWdjb3Yg JHRlc3RjYXNlCiAJfQpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtcHJvZmlsZS5jYyBiL2djYy90 cmVlLXByb2ZpbGUuY2MKaW5kZXggNmQ0MDQwMWY4NmYuLmQ3MzdlNDVjZDYyIDEwMDY0NAot LS0gYS9nY2MvdHJlZS1wcm9maWxlLmNjCisrKyBiL2djYy90cmVlLXByb2ZpbGUuY2MKQEAg LTI0LDYgKzI0LDcgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4g IElmIG5vdCBzZWUKIC8qIEdlbmVyYXRlIGJhc2ljIGJsb2NrIHByb2ZpbGUgaW5zdHJ1bWVu dGF0aW9uIGFuZCBhdXhpbGlhcnkgZmlsZXMuCiAgICBUcmVlLWJhc2VkIHZlcnNpb24uICBT ZWUgcHJvZmlsZS5jYyBmb3Igb3ZlcnZpZXcuICAqLwogCisjZGVmaW5lIElOQ0xVREVfQUxH T1JJVEhNCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAic3lzdGVtLmgiCiAjaW5j bHVkZSAiY29yZXR5cGVzLmgiCkBAIC01OCw2ICs1OSw4IEBAIGFsb25nIHdpdGggR0NDOyBz ZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAiYWxsb2MtcG9v bC5oIgogI2luY2x1ZGUgInN5bWJvbC1zdW1tYXJ5LmgiCiAjaW5jbHVkZSAic3ltdGFiLXRo dW5rcy5oIgorI2luY2x1ZGUgImNmZ2FuYWwuaCIKKyNpbmNsdWRlICJjZmdsb29wLmgiCiAK IHN0YXRpYyBHVFkoKCkpIHRyZWUgZ2Nvdl90eXBlX25vZGU7CiBzdGF0aWMgR1RZKCgpKSB0 cmVlIHRyZWVfaW50ZXJ2YWxfcHJvZmlsZXJfZm47CkBAIC03Myw2ICs3Niw4NzkgQEAgc3Rh dGljIEdUWSgoKSkgdHJlZSBpY190dXBsZV92YXI7CiBzdGF0aWMgR1RZKCgpKSB0cmVlIGlj X3R1cGxlX2NvdW50ZXJzX2ZpZWxkOwogc3RhdGljIEdUWSgoKSkgdHJlZSBpY190dXBsZV9j YWxsZWVfZmllbGQ7CiAKK25hbWVzcGFjZQoreworCitzdHJ1Y3QgY29uZHNfY3R4Cit7Cisg ICAgLyogT3V0cHV0IGFycmF5cyBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4gICovCisgICAg YmFzaWNfYmxvY2sgKmJsb2NrczsKKyAgICBpbnQgKnNpemVzOworCisgICAgLyogVGhlIHNp emUgb2YgdGhlIGJsb2NrcyBidWZmZXIuICBUaGlzIGlzIGp1c3QgYnVnIHByb3RlY3Rpb24s CisgICAgICAgdGhlIGNhbGxlciBzaG91bGQgaGF2ZSBhbGxvY2F0ZWQgZW5vdWdoIG1lbW9y eSBmb3IgYmxvY2tzIHRvIG5ldmVyIGdldAorICAgICAgIHRoaXMgbWFueSBlbGVtZW50cy4K KyAgICAgICAqLworICAgIGludCBtYXhzaXplOworCisgICAgLyogTnVtYmVyIG9mIGV4cHJl c3Npb25zIGZvdW5kIC0gdGhpcyB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4g dGhlCisgICAgICAgZ2NvdiBvdXRwdXQgYW5kIHRoZSBwYXJhbWV0ZXIgdG8gZ2Nvdl9jb3Vu dGVyX2FsbG9jICgpLgorICAgICAgICovCisgICAgaW50IGV4cHJzOworCisgICAgLyogQml0 bWFwIG9mIHRoZSBwcm9jZXNzZWQgYmxvY2tzIC0gYml0IG4gc2V0IG1lYW5zIGJhc2ljX2Js b2NrLT5pbmRleCBoYXMKKyAgICAgICBiZWVuIHByb2Nlc3NlZCBhcyBhIGZpcnN0LWluLWV4 cHJlc3Npb24gYmxvY2suICBUaGlzIGVmZmVjdGl2ZWx5IHN0b3BzCisgICAgICAgbG9vcCBl ZGdlcyBmcm9tIGJlaW5nIHRha2VuIGFuZCBzdWJncmFwaHMgcmUtcHJvY2Vzc2VkLgorICAg ICAgICovCisgICAgYXV0b19zYml0bWFwIHNlZW47CisKKyAgICAvKiBQcmUtYWxsb2NhdGUg Yml0bWFwcyBmb3IgcGVyLWZ1bmN0aW9uIGJvb2sga2VlcGluZy4gIFRoaXMgaXMgcHVyZQor ICAgICAgIGluc3RhbmNlIHJldXNlIGFuZCB0aGUgYml0bWFwcyBjYXJyaWVzIG5vIGRhdGEg YmV0d2VlbiBmdW5jdGlvbiBjYWxscy4KKyAgICAgICAqLworICAgIGF1dG9fc2JpdG1hcCBl eHByOworICAgIGF1dG9fc2JpdG1hcCByZWFjaGFibGU7CisKKyAgICBleHBsaWNpdCBjb25k c19jdHggKHVuc2lnbmVkIHNpemUpIG5vZXhjZXB0ICh0cnVlKSA6IG1heHNpemUgKDApLCBl eHBycyAoMCksCisgICAgc2VlbiAoc2l6ZSksIGV4cHIgKHNpemUpLCByZWFjaGFibGUgKHNp emUpCisgICAgeworCWJpdG1hcF9jbGVhciAoc2Vlbik7CisgICAgfQorCisgICAgdm9pZCBj b21taXQgKGJhc2ljX2Jsb2NrIHRvcCwgaW50IG5ibG9ja3MpIG5vZXhjZXB0ICh0cnVlKQor ICAgIHsKKwlibG9ja3MgICs9IG5ibG9ja3M7CisJKnNpemVzICArPSBuYmxvY2tzOworCW1h eHNpemUgLT0gbmJsb2NrczsKKworCWV4cHJzKys7CisJc2l6ZXMrKzsKKwkqc2l6ZXMgPSAw OworCisJYml0bWFwX3NldF9iaXQgKHNlZW4sIHRvcC0+aW5kZXgpOworICAgIH0KK307CisK Ky8qIE9ubHkgaW5zdHJ1bWVudCB0ZXJtcyB3aXRoIGZld2VyIHRoYW4gbnVtYmVyIG9mIGJp dHMgaW4gYSAod2lkZSkgZ2NvdgorICAgaW50ZWdlciwgd2hpY2ggaXMgcHJvYmFibHkgNjQu ICBUaGUgYWxnb3JpdGhtIGl0c2VsZiBkb2VzIG5vdCBpbXBvc2UgdGhpcworICAgbGltaXRh dGlvbiwgYnV0IGl0IG1ha2VzIGZvciBhIHNpbXBsZXIgaW1wbGVtZW50YXRpb24uCisKKyAg ICogQWxsb2NhdGluZyB0aGUgb3V0cHV0IGRhdGEgc3RydWN0dXJlIChjb3ZlcmFnZV9jb3Vu dGVyX2FsbG9jICgpKSBjYW4KKyAgICAgYXNzdW1lIHBhaXJzIG9mIGdjb3ZfdHlwZV91bnNp Z25lZCBhbmQgbm90IHVzZSBhIHNlcGFyYXRlIGxlbmd0aCBmaWVsZC4KKyAgICogQSBwYWly IGdjb3ZfdHlwZV91bnNpZ25lZCBjYW4gYmUgdXNlZCBhcyBhY2N1bXVsYXRvcnMuCisgICAq IFVwZGF0aW5nIGFjY3VtdWxhdG9ycyBpcyBjYW4gdXNlIHRoZSBiaXR3aXNlIG9wZXJhdGlv bnMgfD0sICY9IGFuZCBub3QKKyAgICAgY3VzdG9tIG9wZXJhdG9ycyB0aGF0IHdvcmsgZm9y IGFyYml0cmFyeS1zaXplZCBiaXQtc2V0cy4KKworICAgTW9zdCByZWFsLXdvcmxkIGNvZGUg c2hvdWxkIGJlIHVuYWZmZWN0ZWQgYnkgdGhpcywgYnV0IGl0IGlzIHBvc3NpYmxlCisgICAo ZXNwZWNpYWxseSBmb3IgZ2VuZXJhdGVkIGNvZGUpIHRvIGV4Y2VlZCB0aGlzIGxpbWl0Lgor ICovCisjZGVmaW5lIENPTkRJVElPTlNfTUFYX1RFUk1TIChzaXplb2YgKGdjb3ZfdHlwZV91 bnNpZ25lZCkgKiBCSVRTX1BFUl9VTklUKQorCitpbnQKK2luZGV4X29mIChjb25zdF9iYXNp Y19ibG9jayBuZWVkbGUsIGNvbnN0IGNvbnN0X2Jhc2ljX2Jsb2NrICpibG9ja3MsIGludCBz aXplKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKwlp ZiAoYmxvY2tzW2ldID09IG5lZWRsZSkKKwkgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJl dHVybiAtMTsKK30KKworYm9vbAoraW5kZXhfbHQgKGNvbnN0IGJhc2ljX2Jsb2NrIHgsIGNv bnN0IGJhc2ljX2Jsb2NrIHkpCit7CisgICAgcmV0dXJuIHgtPmluZGV4IDwgeS0+aW5kZXg7 Cit9CisKKy8qIFNwZWNpYWwgY2FzZXMgb2YgdGhlIHNpbmdsZV8qX3AgYW5kIHNpbmdsZV8q X2VkZ2UgZnVuY3Rpb25zIGluIGJhc2ljLWJsb2NrLmgKKyAgIHRoYXQgZG9uJ3QgY29uc2lk ZXIgZXhjZXB0aW9uIGhhbmRsaW5nIG9yIG90aGVyIGNvbXBsZXggZWRnZXMuICBUaGlzIGhl bHBzCisgICBjcmVhdGUgYSB2aWV3IG9mIHRoZSBDRkcgd2l0aCBvbmx5IG5vcm1hbCBlZGdl cyAtIGlmIGEgYmFzaWMgYmxvY2sgaGFzIGJvdGgKKyAgIGFuIG91dGdvaW5nIGZhbGx0aHJv dWdoIGFuZCBleGNlcHRpb25hbCBlZGdlIFsxXSwgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQg YQorICAgc2luZ2xlLXN1Y2Nlc3Nvci4KKworICAgWzFdIGlmIHRoaXMgaXMgbm90IHBvc3Np YmxlLCB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIHJlbW92ZWQgYW5kIHJlcGxhY2VkIGJ5Cisg ICAgICAgdGhlaXIgYmFzaWMtYmxvY2suaCBjb3VzaW5zLgorICovCitib29sCitzaW5nbGUg KGNvbnN0IHZlYzxlZGdlLCB2YV9nYz4gKmVkZ2VzKQoreworICAgIGludCBuID0gRURHRV9D T1VOVCAoZWRnZXMpOworICAgIGlmIChuID09IDApCisJcmV0dXJuIGZhbHNlOworCisgICAg Zm9yIChlZGdlIGUgOiBlZGdlcykKKwlpZiAoZS0+ZmxhZ3MgJiBFREdFX0NPTVBMRVgpCisJ ICAgIG4gLT0gMTsKKworICAgIHJldHVybiBuID09IDE7Cit9CisKK2VkZ2UKK3NpbmdsZV9l ZGdlIChjb25zdCB2ZWM8ZWRnZSwgdmFfZ2M+ICplZGdlcykKK3sKKyAgICBmb3IgKGVkZ2Ug ZSA6IGVkZ2VzKQorICAgIHsKKwlpZiAoZS0+ZmxhZ3MgJiBFREdFX0NPTVBMRVgpCisJICAg IGNvbnRpbnVlOworCXJldHVybiBlOworICAgIH0KKyAgICBnY2NfdW5yZWFjaGFibGUgKCk7 Cit9CisKKy8qIFNvbWV0aW1lcywgZm9yIGV4YW1wbGUgd2l0aCBmdW5jdGlvbiBjYWxscyBh bmQgQysrIGRlc3RydWN0b3JzIHRoZSBDRkcgZ2V0cworICAgZXh0cmEgbm9kZXMgdGhhdCBh cmUgZXNzZW50aWFsbHkgc2luZ2xlLWVudHJ5LXNpbmdsZS1leGl0IGluIHRoZSBtaWRkbGUg b2YKKyAgIGJvb2xlYW4gZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKKworICAgICAgeCB8 fCBjYW5fdGhyb3cgKHkpCisKKyAgICAgICAgICAgICAgIEEKKyAgICAgICAgICAgICAgL3wK KyAgICAgICAgICAgICAvIHwKKyAgICAgICAgICAgIEIgIHwKKyAgICAgICAgICAgIHwgIHwK KyAgICAgICAgICAgIEMgIHwKKyAgICAgICAgICAgLyBcIHwKKyAgICAgICAgICAvICAgXHwK KyAgICAgICAgIEYgICAgIFQKKworICAgV2l0aG91dCB0aGUgZXh0cmEgbm9kZSBpbnNlcnRl ZCBieSB0aGUgZnVuY3Rpb24gKyBleGNlcHRpb24gaXQgYmVjb21lcyBhCisgICBwcm9wZXIg Mi10ZXJtIGdyYXBoLCBub3QgMiBzaW5nbGUtdGVybSBncmFwaHMuCisKKyAgICAgICAgICAg ICAgIEEKKyAgICAgICAgICAgICAgL3wKKyAgICAgICAgICAgICBDIHwKKyAgICAgICAgICAg IC8gXHwKKyAgICAgICAgICAgRiAgIFQKKworICAgY29udHJhY3RfZWRnZSBpZ25vcmVzIHRo ZSBzZXJpZXMgb2YgaW50ZXJtZWRpYXRlIG5vZGVzIGFuZCBtYWtlcyBhIHZpcnR1YWwKKyAg IGVkZ2UgQSAtPiBDLCB3aXRob3V0IGhhdmluZyB0byBjb25zdHJ1Y3QgYSBuZXcgc2ltcGxp ZmllZCBDRkcgZXhwbGljaXRseS4KKworICAgU3VjaCBhbiBleHByZXNzaW9uIGNhbm5vdCBj b3JyZWN0bHkgYmUgcmVwcmV0ZWQgYXMgdHdvIDEtdGVybSBleHByZXNzaW9ucywKKyAgIGFz IGl0IHdvdWxkIGJyZWFrIHRoZSBjb25kaXRpb24gbWFza2luZy4KKyAqLworZWRnZQorY29u dHJhY3RfZWRnZSAoZWRnZSBlLCBzYml0bWFwIGV4cHIpCit7CisgICAgd2hpbGUgKHRydWUp CisgICAgeworCWJhc2ljX2Jsb2NrIHNyYyAgPSBlLT5zcmM7CisJYmFzaWNfYmxvY2sgZGVz dCA9IGUtPmRlc3Q7CisKKwlpZiAoIXNpbmdsZSAoZGVzdC0+c3VjY3MpKQorCSAgICByZXR1 cm4gZTsKKwlpZiAoIXNpbmdsZSAoZGVzdC0+cHJlZHMpKQorCSAgICByZXR1cm4gZTsKKwlp ZiAoIXNpbmdsZSAoc3JjLT5wcmVkcykpCisJICAgIHJldHVybiBlOworCisJZWRnZSBzdWNj ZSA9IHNpbmdsZV9lZGdlIChkZXN0LT5zdWNjcyk7CisJaWYgKCFzaW5nbGUgKHN1Y2NlLT5k ZXN0LT5wcmVkcykpCisJICAgIHJldHVybiBlOworCisJYml0bWFwX3NldF9iaXQgKGV4cHIs IGRlc3QtPmluZGV4KTsKKwllID0gc3VjY2U7CisgICAgfQorfQorCitlZGdlCitjb250cmFj dF9lZGdlX3VwIChlZGdlIGUsIHNiaXRtYXAgZXhwcikKK3sKKyAgICB3aGlsZSAodHJ1ZSkK KyAgICB7CisJYmFzaWNfYmxvY2sgc3JjICA9IGUtPnNyYzsKKwliYXNpY19ibG9jayBkZXN0 ID0gZS0+ZGVzdDsKKworCWlmICghc2luZ2xlIChkZXN0LT5zdWNjcykpCisJICAgIHJldHVy biBlOworCWlmICghc2luZ2xlIChkZXN0LT5wcmVkcykpCisJICAgIHJldHVybiBlOworCWlm ICghc2luZ2xlIChzcmMtPnByZWRzKSkKKwkgICAgcmV0dXJuIGU7CisKKwlpZiAoZXhwcikg Yml0bWFwX3NldF9iaXQgKGV4cHIsIHNyYy0+aW5kZXgpOworCWUgPSBzaW5nbGVfcHJlZF9l ZGdlIChzcmMpOworICAgIH0KK30KKworYm9vbAoraXNfY29uZGl0aW9uYWxfcCAoY29uc3Qg YmFzaWNfYmxvY2sgYikKK3sKKyAgICBpZiAoc2luZ2xlX3N1Y2NfcCAoYikpCisgICAgICAg IHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHQgPSAwOworICAgIHVuc2lnbmVkIGYg PSAwOworICAgIGZvciAoZWRnZSBlIDogYi0+c3VjY3MpCisgICAgeworICAgICAgICB0IHw9 IChlLT5mbGFncyAmIEVER0VfVFJVRV9WQUxVRSk7CisgICAgICAgIGYgfD0gKGUtPmZsYWdz ICYgRURHRV9GQUxTRV9WQUxVRSk7CisgICAgfQorICAgIHJldHVybiB0ICYmIGY7Cit9CisK Ky8qIFRoZSBmaXJzdCBibG9jayBpbiB0aGUgb3V0cHV0IHdpbGwgYWx3YXlzIGJlIHRoZSBz b3VyY2UgYmxvY2sgb2YgdGhlIGVkZ2UKKyAgIHRoYXQgd2lsbCBhcHBseSB0aGUgbWFza2lu ZyBvcGVyYXRpb24sIHdpdGggdGhlIHJlbWFpbmluZyBibG9ja3MgZWZmZWN0aXZlbHkKKyAg IHVub3JkZXJlZC4KKyAqLworaW50CitmaW5kX2NvbmRpdGlvbnNfbWFza2VkX2J5ICgKKyAg ICBiYXNpY19ibG9jayBibG9jaywKKyAgICBjb25zdCBzYml0bWFwIGV4cHIsCisgICAgY29u c3QgdW5zaWduZWQgKmZsYWcsCisgICAgYmFzaWNfYmxvY2sgKm91dCwKKyAgICBpbnQgbWF4 c2l6ZSkKK3sKKyAgICBpbnQgbiA9IDA7CisgICAgZm9yIChlZGdlIGUgOiBibG9jay0+cHJl ZHMpCisgICAgeworCS8qIFNraXAgYW55IHByZWRlY2Vzc29yIG5vdCBpbiB0aGUgZXhwcmVz c2lvbiAtIHRoZXJlIG1pZ2h0IGJlIHN1Y2ggYW4KKwkgICBlZGdlIHRvIHRoZSBlbmNsb3Np bmcgZXhwcmVzc2lvbiBvciBpbiB0aGUgcHJlc2VuY2Ugb2YgbG9vcHMsIGJ1dAorCSAgIG1h c2tpbmcgY2Fubm90IGhhcHBlbiBvdXRzaWRlIHRoZSBleHByZXNzaW9uIGl0c2VsZi4gKi8K KwlpZiAoIWJpdG1hcF9iaXRfcCAoZXhwciwgZS0+c3JjLT5pbmRleCkpCisJICAgIGNvbnRp bnVlOworCisJZSA9IGNvbnRyYWN0X2VkZ2VfdXAgKGUsIE5VTEwpOworCWlmIChlLT5mbGFn cyAmIGZsYWdbMF0pCisJICAgIG91dFtuKytdID0gZS0+c3JjOworICAgIH0KKworICAgIGlm IChuID4gMSkKKyAgICB7CisJYmFzaWNfYmxvY2sgKnRvcCA9IHN0ZDo6bWF4X2VsZW1lbnQg KG91dCwgb3V0ICsgbiwgaW5kZXhfbHQpOworCXN0ZDo6aXRlcl9zd2FwICh0b3AsIG91dCk7 CisgICAgfQorCisgICAgZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgbjsgcG9zKyspCisgICAg eworCWZvciAoZWRnZSBlIDogb3V0W3Bvc10tPnByZWRzKQorCXsKKwkgICAgaWYgKCFiaXRt YXBfYml0X3AgKGV4cHIsIGUtPnNyYy0+aW5kZXgpKQorCQljb250aW51ZTsKKwkgICAgaWYg KGluZGV4X29mIChlLT5zcmMsIG91dCwgbikgIT0gLTEpCisJCWNvbnRpbnVlOworCisJICAg IGUgPSBjb250cmFjdF9lZGdlX3VwIChlLCBOVUxMKTsKKwkgICAgaWYgKGUtPmZsYWdzICYg ZmxhZ1sxXSkKKwkJb3V0W24rK10gPSBlLT5zcmM7CisKKwkgICAgZ2NjX2Fzc2VydCAobiA8 IG1heHNpemUpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworLyogU2NhbiB0 aGUgYmxvY2tzIHRoYXQgbWFrZSB1cCBhbiBleHByZXNzaW9uIGFuZCBsb29rIGZvciBjb25k aXRpb25zIHRoYXQKKyAgIHdvdWxkIG1hc2sgb3RoZXIgY29uZGl0aW9ucy4gIEZvciBhIGRl ZXBlciBkaXNjdXNzaW9uIG9uIG1hc2tpbmcsIHNlZQorICAgV2hhbGVuLCBIZWltZGFobCwg RGUgU2lsdmEgIkVmZmljaWVudCBUZXN0IENvdmVyYWdlIE1lYXN1cmVtZW50IGZvciBNQy9E QyIuCisgICBNYXNraW5nIGlzIGJlc3QgaWxsdXN0cmF0ZWQgd2l0aCBhbiBleGFtcGxlOgor CisgICBBIHx8IEIuICBJZiBCIGlzIHRydWUgdGhlbiBBIHdpbGwgZG9lcyBub3QgaW5kZXBl bmRlbnRseSBhZmZlY3QgdGhlIGRlY2lzaW9uLgorICAgSW4gYSB3YXksIHRoaXMgaXMgInJl dmVyc2UiIHNob3J0IGNpcmN1aXRpbmcsIGFuZCBhbHdheXMgd29yayBvbiB0aGUKKyAgIHJp Z2h0LWhhbmQgc2lkZSBvZiBleHByZXNzaW9ucy4gICogfHwgdHJ1ZSBpcyBhbHdheXMgdHJ1 ZSBhbmQgKiAmJiBmYWxzZSBpcworICAgYWx3YXlzIGZhbHNlIC0gdGhlIGxlZnQtaGFuZC1z aWRlIGRvZXMgbm90IGFmZmVjdCB0aGUgb3V0Y29tZSwgYW5kIHRoZWlyCisgICB2YWx1ZXMg c2hvdWxkIG5vdCBjb250cmlidXRlIHRvIG1vZGlmaWRpZWQgY29uZGl0aW9uL2RlY2lzaW9u IGNvdmVyYWdlLgorCisgICBBIHx8IEIgaW50ZXJwcmV0ZWQgYXMgYSBkZWNpc2lvbiBkaWFn cmFtIGJlY29tZXM6CisKKyAgICBBCisgICB0fFxmCisgICAgfCBcCisgICAgfCAgQgorICAg IHx0LyBcZgorICAgIHwvICAgXAorICAgIFQgICAgIEYKKworICAgVGhlIGFsZ29yaXRobSBs b29rcyBmb3IgdHJpYW5nbGVzIGxpa2UgQVRCLiAgTWFza2luZyByaWdodC1oYW5kIHNpZGVz IGhhcHBlbgorICAgd2hlbiBhIGJsb2NrIGhhcyBhIHBhaXIgb2YgaW5jb21pbmcgZWRnZXMg b2YgdGhlIHNhbWUgYm9vbGVhbiB2YWx1ZSwgYW5kCisgICB0aGVyZSBpcyBhbiBlZGdlIGNv bm5lY3RpbmcgdGhlIHR3byBwcmVkZWNlc3NvcnMgd2l0aCB0aGUgKm9wcG9zaXRlKiBib29s ZWFuCisgICB2YWx1ZS4gIFRoZSBtYXNraW5nIGJsb2NrIGlzIEIsIGFuZCB0aGUgbWFza2Vk IGJsb2NrIGlzIEEuICBJbiB0aGlzCisgICBwYXJ0aWN1bGFyIGV4YW1wbGU6CisKKyAgIE1h c2tpbmcgY2FuIGFmZmVjdCAib3V0c2lkZSIgaXRzIG93biBzdWJleHByZXNzaW9uOyBpbiBB IHx8IChCICYmIEMpIGlmIEMgaXMKKyAgIGZhbHNlLCBCIGlzIG1hc2tlZC4gIEhvd2V2ZXIs IGlmIChCICYmIEMpIGlzIHRydWUsIEEgZ2V0cyBtYXNrZWQuICBCICYmIEMKKyAgIGNhbiBi ZSBkZXRlcm1pbmVkIGZyb20gZXZhbHVhdGluZyBDIHNpbmNlICFCIHdvdWxkIHNob3J0LWNp cmN1aXQsIHNvIGEgdHJ1ZQorICAgQyB3b3VsZCBtYXNrIEEuCisKKyAgICBBCisgICB0fFxm CisgICAgfCBcCisgICAgfCAgXAorICAgIHwgICBcCisgICAgfCAgICBCCisgICAgfCAgdC8g XGYKKyAgICB8ICBDICAgfAorICAgIHx0LyBcZiB8CisgICAgfC8gICBcIHwKKyAgICBUICAg ICBGCisKKyAgIE5vdGljZSBob3cgQkZDIGZvcm1zIGEgdHJpYW5nbGUuICBFeHByZXNzaW9u cyBtYXNrZWQgYnkgYW4gZWRnZSBhcmUKKyAgIGRldGVybWluZWQgYnk6CisgICAqIEdvIHRv IHRoZSBwcmVkZWNlc3NvciB3aXRoIHRydXRoIHZhbHVlIGIgKGlmIGl0IGV4aXN0cykuCisg ICAqIEZvbGxvdyB0aGUgcGF0aCBvZiBhbmNlc3RvcnMgd2l0aCB0YWtpbmcgb25seSAhYiBl ZGdlcywgcmVjb3JkaW5nIGV2ZXJ5CisgICAgIG5vZGUgZnJvbSBoZXJlIG9uLgorCisgICBG b3IgdGhlIGNhc2Ugd2hlcmUgQyBjYW4gbWFzayBBLCB0aGUgcGF0aCBnb2VzIEMgW3RydWVd LT4gQiAtPiBbZmFsc2VdIEEsIHNvCisgICBDIFt0cnVlXSBtYXNrcyBBLgorCisgICBUaGUg bWFzayBpcyBvdXRwdXQgYXMgYSBiaXQtc2V0IHN0b3JlZCBpbiBhIGdjb3ZfdHlwZV91bnNp Z25lZC4gIFRoZQorICAgYml0LXNldHMgYXJlIG91dHB1dCBpbiBwYWlycywgb25lIGZvciBl YWNoIGRlY2lzaW9uICh0aGUgb3V0Y29tZSBvZiB0aGUKKyAgIGJvb2xlYW4gZXhwcmVzc2lv biwgb3Igd2hpY2ggYXJjIHRvIHRha2UgaW4gdGhlIENGRykuCisgKi8KK3ZvaWQKK2ZpbmRf c3ViZXhwcl9tYXNrcyAoCisgICAgY29uc3QgYmFzaWNfYmxvY2sgKmJsb2NrcywKKyAgICBp bnQgbmJsb2NrcywKKyAgICBnY292X3R5cGVfdW5zaWduZWQgKm1hc2tzKQoreworICAgIGNv bnN0IHVuc2lnbmVkIGZsYWdzW10gPSB7CisJRURHRV9UUlVFX1ZBTFVFLAorCUVER0VfRkFM U0VfVkFMVUUsCisJRURHRV9UUlVFX1ZBTFVFLAorICAgIH07CisKKyAgICBiYXNpY19ibG9j ayBwYXRoW0NPTkRJVElPTlNfTUFYX1RFUk1TXTsKKyAgICBhdXRvX3NiaXRtYXAgZXhwciAo bl9iYXNpY19ibG9ja3NfZm9yX2ZuIChjZnVuKSk7CisgICAgYml0bWFwX2NsZWFyIChleHBy KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ibG9ja3M7IGkrKykKKwliaXRtYXBfc2V0 X2JpdCAoZXhwciwgYmxvY2tzW2ldLT5pbmRleCk7CisKKyAgICBmb3IgKGludCBpID0gMDsg aSA8IG5ibG9ja3M7IGkrKykKKyAgICB7CisJYmFzaWNfYmxvY2sgYmxvY2sgPSBibG9ja3Nb aV07CisJaWYgKHNpbmdsZV9wcmVkX3AgKGJsb2NrKSkKKwkgICAgY29udGludWU7CisKKwlm b3IgKGludCBrID0gMDsgayA8IDI7IGsrKykKKwl7CisJICAgIGNvbnN0IGludCBuID0gZmlu ZF9jb25kaXRpb25zX21hc2tlZF9ieQorCQkoYmxvY2ssIGV4cHIsIGZsYWdzICsgaywgcGF0 aCwgQ09ORElUSU9OU19NQVhfVEVSTVMpOworCisJICAgIGlmIChuIDwgMikKKwkJY29udGlu dWU7CisKKwkgICAgY29uc3QgaW50IG0gPSAyKmluZGV4X29mIChwYXRoWzBdLCBibG9ja3Ms IG5ibG9ja3MpICsgazsKKwkgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspCisJICAg IHsKKwkJY29uc3QgaW50IGluZGV4ID0gaW5kZXhfb2YgKHBhdGhbaV0sIGJsb2NrcywgbmJs b2Nrcyk7CisJCW1hc2tzW21dIHw9IGdjb3ZfdHlwZV91bnNpZ25lZCAoMSkgPDwgaW5kZXg7 CisJICAgIH0KKwl9CisgICAgfQorfQorCitpbnQKK2NvbGxlY3RfcmVhY2hhYmxlX2NvbmRp dGlvbmFscyAoCisgICAgYmFzaWNfYmxvY2sgcHJlLAorICAgIGJhc2ljX2Jsb2NrIHBvc3Qs CisgICAgYmFzaWNfYmxvY2sgKm91dCwKKyAgICBpbnQgbWF4c2l6ZSwKKyAgICBzYml0bWFw IGV4cHIpCit7CisgICAgZ2NjX2Fzc2VydCAobWF4c2l6ZSA+IDApOworCisgICAgYmFzaWNf YmxvY2sgbG9vcCA9IHByZS0+bG9vcF9mYXRoZXItPmhlYWRlcjsKKyAgICBpbnQgbiA9IDA7 CisgICAgb3V0W24rK10gPSBwcmU7CisgICAgYml0bWFwX3NldF9iaXQgKGV4cHIsIHByZS0+ aW5kZXgpOworCisgICAgZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgbjsgcG9zKyspCisgICAg eworCWJhc2ljX2Jsb2NrIGJsb2NrID0gb3V0W3Bvc107CisKKwlmb3IgKGVkZ2UgZSA6IGJs b2NrLT5zdWNjcykKKwl7CisJICAgIGJhc2ljX2Jsb2NrIGRlc3QgPSBjb250cmFjdF9lZGdl IChlLCBleHByKS0+ZGVzdDsKKworCSAgICAvKiBTa2lwIGxvb3AgZWRnZXMsIGFzIHRoZXkg Z28gb3V0c2lkZSB0aGUgZXhwcmVzc2lvbi4gICovCisJICAgIGlmIChkZXN0ID09IGxvb3Ap CisJCWNvbnRpbnVlOworCSAgICBpZiAoZGVzdCA9PSBwb3N0KQorCQljb250aW51ZTsKKwkg ICAgaWYgKCFpc19jb25kaXRpb25hbF9wIChkZXN0KSkKKwkJY29udGludWU7CisJICAgIC8q IEFscmVhZHktc2VlbiwgZG9uJ3QgcmUtYWRkLiAgKi8KKwkgICAgaWYgKGJpdG1hcF9iaXRf cCAoZXhwciwgZGVzdC0+aW5kZXgpKQorCQljb250aW51ZTsKKworCSAgICBiaXRtYXBfc2V0 X2JpdCAoZXhwciwgZGVzdC0+aW5kZXgpOworCSAgICBvdXRbbisrXSA9IGRlc3Q7CisJICAg IGlmIChuID09IG1heHNpemUpCisJCXJldHVybiBuOworCX0KKyAgICB9CisKKyAgICByZXR1 cm4gbjsKK30KKworaW50Citjb2xsZWN0X25laWdoYm9ycyAoYmFzaWNfYmxvY2sgKmJsb2Nr cywgaW50IG5ibG9ja3MsIHNiaXRtYXAgcmVhY2hhYmxlKQoreworICAgIGludCBuID0gMDsK KyAgICBiYXNpY19ibG9jayAqZXhpdHMgPSBibG9ja3MgKyBuYmxvY2tzOworICAgIGZvciAo aW50IGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrKQorICAgIHsKKwlmb3IgKGVkZ2UgZSA6IGJs b2Nrc1tpXS0+c3VjY3MpCisJeworCSAgICBpZiAoYml0bWFwX2JpdF9wIChyZWFjaGFibGUs IGUtPmRlc3QtPmluZGV4KSkKKwkJY29udGludWU7CisKKwkgICAgYml0bWFwX3NldF9iaXQg KHJlYWNoYWJsZSwgZS0+ZGVzdC0+aW5kZXgpOworCSAgICBleGl0c1tuKytdID0gZS0+ZGVz dDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKKy8qIEZpbmQgYW5kIGlzb2xh dGUgdGhlIGZpcnN0IGV4cHJlc3Npb24gYmV0d2VlbiB0d28gZG9taW5hdG9ycy4KKworICAg RWl0aGVyIGJsb2NrIG9mIGEgY29uZGl0aW9uYWwgY291bGQgaGF2ZSBtb3JlIGRlY2lzaW9u cyBhbmQgbG9vcHMsIHNvCisgICBpc29sYXRlIHRoZSBmaXJzdCBkZWNpc2lvbiBieSBzZXQt aW50ZXJzZWN0aW5nIGFsbCBwYXRocyBmcm9tIHRoZQorICAgcG9zdC1kb21pbmF0b3IgdG8g dGhlIGVudHJ5IGJsb2NrLgorCisgICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVy IG9mIGJsb2NrcyBmcm9tIG4gdGhhdCBtYWtlIHVwIHRoZSBsZWFkaW5nCisgICBleHByZXNz aW9uIGluIHByZWZpeCBvcmRlciAoaS5lLiB0aGUgb3JkZXIgZXhwZWN0ZWQgYnkgdGhlIGlu c3RydW1lbnRpbmcKKyAgIGNvZGUpLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMCB0 aGVyZSBhcmUgbm8gZGVjaXNpb25zIGJldHdlZW4gcHJlIGFuZAorICAgcG9zdCwgYW5kIHRo aXMgc2VnbWVudCBvZiB0aGUgQ0ZHIGNhbiBzYWZlbHkgYmUgc2tpcHBlZC4KKworICAgVGhl IHBvc3Qgbm9kZXMgY2FuIGhhdmUgcHJlZGVjZXNzb3JzIHRoYXQgZG8gbm90IGJlbG9uZyB0 byB0aGlzIHN1YmdyYXBoLAorICAgd2hpY2ggYXJlIHNraXBwZWQuICBUaGlzIGlzIGV4cGVj dGVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZXJlIGlzIGEKKyAgIGNvbmRpdGlvbmFsIGluIHRo ZSBlbHNlLWJsb2NrIG9mIGEgbGFyZ2VyIGV4cHJlc3Npb246CisKKyAgIGlmIChBKQorICAg eworICAgICAgaWYgKEIpIHt9CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBpZiAoQykg e30gZWxzZSB7fQorICAgfQorCisgICAgICAgICAgICAgQQorICAgICAgICAgIHQgLyBcIGYK KyAgICAgICAgICAgLyAgIFwKKyAgICAgICAgICBCICAgICBDCisgICAgICAgICAvXCAgICAv IFwKKyAgICAgICAgLyAgXCAgVCAgIEYKKyAgICAgICBUICAgIFwgIFwgLworICAgICAgICBc ICAgfCAgIG8KKyAgICAgICAgIFwgIHwgIC8KKyAgICAgICAgICBcIHwgLworICAgICAgICAg ICBcfC8KKyAgICAgICAgICAgIEUKKworICAgUHJvY2Vzc2luZyBbQiwgRSkgd2hpY2ggbG9v a3MgbGlrZToKKworICAgICAgQgorICAgICAvfAorICAgIC8gfAorICAgVCAgfAorICAgIFwg LworICAgICBFIC0tLS0+IG8gLy8gcHJlZGVjZXNzb3Igb3V0c2lkZSBbQiwgZSkKKyAqLwor CisvKiBEbyBhICh1cHdhcmRzKSBzZWFyY2ggZm9yIHJlYWNoYWJsZSBub2RlcyBhbmQgbWFy ayB0aGVtIGluIHRoZSByZWFjaGFibGUKKyAgIHNldCwgbWFraW5nIHN1cmUgbm90IHRvIHRh a2UgbG9vcCBlZGdlcy4gIGRmc19lbnVtZXJhdGVfZnJvbSAoKSB3b24ndCB3b3JrIGFzCisg ICB0aGUgZmlsdGVyIGZ1bmN0aW9uIG5lZWRzIGluZm9ybWF0aW9uIGZyb20gdGhlIGVkZ2Uu ICovCit2b2lkCitmaW5kX3JlYWNoYWJsZSAoCisgICAgc2JpdG1hcCByZWFjaGFibGUsCisg ICAgYmFzaWNfYmxvY2sgcHJlLAorICAgIGJhc2ljX2Jsb2NrIHBvc3QsCisgICAgYmFzaWNf YmxvY2sgKnN0YWNrKQoreworICAgIHN0YWNrWzBdID0gcHJlOworICAgIGJpdG1hcF9zZXRf Yml0IChyZWFjaGFibGUsIHByZS0+aW5kZXgpOworICAgIGJpdG1hcF9zZXRfYml0IChyZWFj aGFibGUsIHBvc3QtPmluZGV4KTsKKyAgICBmb3IgKGludCBuID0gMDsgbiA+PSAwOyBuLS0p CisgICAgeworCWZvciAoZWRnZSBlIDogc3RhY2tbbl0tPnByZWRzKQorCXsKKwkgICAgaWYg KGJpdG1hcF9iaXRfcCAocmVhY2hhYmxlLCBlLT5zcmMtPmluZGV4KSkKKwkJY29udGludWU7 CisKKwkgICAgLyogSWdub3JlIGFueSBsb29wIGVkZ2VzLiAgKi8KKwkgICAgaWYgKGRvbWlu YXRlZF9ieV9wIChDRElfRE9NSU5BVE9SUywgZS0+c3JjLCBlLT5kZXN0KSkKKwkJY29udGlu dWU7CisKKwkgICAgYmFzaWNfYmxvY2sgc3JjID0gY29udHJhY3RfZWRnZV91cCAoZSwgcmVh Y2hhYmxlKS0+c3JjOworCSAgICBiaXRtYXBfc2V0X2JpdCAocmVhY2hhYmxlLCBzcmMtPmlu ZGV4KTsKKwkgICAgc3RhY2tbbisrXSA9IHNyYzsKKwl9CisgICAgfQorfQorCitpbnQKK2Zp bmRfZmlyc3RfY29uZGl0aW9uYWwgKGNvbmRzX2N0eCAmY3R4LCBiYXNpY19ibG9jayBwcmUs IGJhc2ljX2Jsb2NrIHBvc3QpCit7CisgICAgYmFzaWNfYmxvY2sgKmJsb2NrcyA9IGN0eC5i bG9ja3M7CisgICAgc2JpdG1hcCBleHByID0gY3R4LmV4cHI7CisgICAgc2JpdG1hcCByZWFj aGFibGUgPSBjdHgucmVhY2hhYmxlOworICAgIGJpdG1hcF9jbGVhciAoZXhwcik7CisgICAg Yml0bWFwX2NsZWFyIChyZWFjaGFibGUpOworICAgIGJsb2Nrc1swXSA9IHByZTsKKworICAg IC8qIElmIHRoZXJlIGlzIGEgZGlyZWN0IGVkZ2UgdG8gdGhlIHBvc3QgZG9taW5hdG9yIHRo ZW4gdGhpcyBjYW5ub3Qgb25seSBiZQorICAgICAgIGEgc2luZ2xlLXRlcm0gY29uZGl0aW9u YWwgKnVubGVzcyogaXQgaXMgYSBsb29wIChpbiB3aGljaCBjYXNlIHRoZQorICAgICAgIHRv LXBvc3QgZWRnZSBpcyB0aGUgbG9vcCBleGl0IGVkZ2UpLgorICAgICAqLworICAgIGNvbnN0 IGJvb2wgZG93aGlsZSA9ICFsb29wX2V4aXRzX2Zyb21fYmJfcCAocHJlLT5sb29wX2ZhdGhl ciwgcHJlKTsKKyAgICBjb25zdCBib29sIGlzbG9vcCA9IGJiX2xvb3BfaGVhZGVyX3AgKHBy ZSkgJiYgIWRvd2hpbGU7CisgICAgaWYgKGZpbmRfZWRnZSAocHJlLCBwb3N0KSAmJiAhaXNs b29wKQorCXJldHVybiAxOworCisgICAgY29uc3QgaW50IG5ibG9ja3MgPSBjb2xsZWN0X3Jl YWNoYWJsZV9jb25kaXRpb25hbHMKKwkocHJlLCBwb3N0LCBibG9ja3MsIGN0eC5tYXhzaXpl LCBleHByKTsKKyAgICBpZiAobmJsb2NrcyA9PSAxKQorCXJldHVybiBuYmxvY2tzOworCisg ICAgYml0bWFwX2NvcHkgKHJlYWNoYWJsZSwgZXhwcik7CisgICAgY29uc3QgaW50IG5leGl0 cyA9IGNvbGxlY3RfbmVpZ2hib3JzIChibG9ja3MsIG5ibG9ja3MsIHJlYWNoYWJsZSk7Cisg ICAgaWYgKG5leGl0cyA9PSAyKQorCXJldHVybiBuYmxvY2tzOworCisgICAgLyogRmluZCBy ZWFjaGFibGUgbm9kZXMgZnJvbSB0aGUgbmVpZ2hib3JzLiAgKi8KKyAgICBiYXNpY19ibG9j ayAqZXhpdHMgPSBibG9ja3MgKyBuYmxvY2tzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg bmV4aXRzOyBpKyspCisgICAgeworCWZvciAoZWRnZSBlIDogZXhpdHNbaV0tPnByZWRzKQor CXsKKwkgICAgaWYgKCFkb21pbmF0ZWRfYnlfcCAoQ0RJX0RPTUlOQVRPUlMsIGUtPnNyYywg cHJlKSkKKwkJY29udGludWU7CisKKwkgICAgYml0bWFwX2NsZWFyIChyZWFjaGFibGUpOwor CSAgICBmaW5kX3JlYWNoYWJsZSAocmVhY2hhYmxlLCBlLT5zcmMsIHByZSwgZXhpdHMgKyBu ZXhpdHMpOworCSAgICBmb3IgKGVkZ2UgZiA6IGV4aXRzW2ldLT5wcmVkcykKKwkJYml0bWFw X3NldF9iaXQgKHJlYWNoYWJsZSwgZi0+c3JjLT5pbmRleCk7CisJICAgIGJpdG1hcF9hbmQg KGV4cHIsIGV4cHIsIHJlYWNoYWJsZSk7CisJfQorICAgIH0KKworICAgIGludCBrID0gMDsK KyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ibG9ja3M7IGkrKykKKwlpZiAoYml0bWFwX2Jp dF9wIChleHByLCBibG9ja3NbaV0tPmluZGV4KSkKKwkgICAgYmxvY2tzW2srK10gPSBibG9j a3NbaV07CisgICAgcmV0dXJuIGs7Cit9CisKK3ZvaWQKK2VtaXRfYml0d2lzZV9vcCAoZWRn ZSBlLCB0cmVlIGxocywgdHJlZSBvcDEsIHRyZWVfY29kZSBvcCwgdHJlZSBvcDIsCisJCSBp bnQgYXRvbWljID0gMCkKK3sKKyAgICB0cmVlIHRtcDsKKyAgICBnYXNzaWduICpyZWFkOwor ICAgIGdhc3NpZ24gKmJpdHc7CisgICAgZ2ltcGxlICAqd3JpdGU7CisKKyAgICAvKiBJbnNl cnQgbGhzID0gb3AxIDxiaXQtb3A+IG9wMi4KKworICAgICAgIFRoZSBvcGVyYW5kcyBhcmUg YXNzdW1lZCB0byBiZSBsb2NhbCBhY2N1bXVsYXRvcnMgb3IgYWxyZWFkeSBTU0EnZCAoYW5k CisgICAgICAgbm90IHJlZmVyZW5jaW5nIGdsb2JhbHMpIGFuZCBkb24ndCBuZWVkIGF0b21p YyByZWFkcyBhbnltb3JlLgorICAgICAqLworICAgIHRtcCAgID0gbWFrZV90ZW1wX3NzYV9u YW1lIChnY292X3R5cGVfbm9kZSwgTlVMTCwgIl9fY29uZGl0aW9uc190bXAiKTsKKyAgICBy ZWFkICA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKHRtcCwgb3AxKTsKKyAgICB0bXAgICA9IG1h a2VfdGVtcF9zc2FfbmFtZSAoZ2Nvdl90eXBlX25vZGUsIE5VTEwsICJfX2NvbmRpdGlvbnNf dG1wIik7CisgICAgYml0dyAgPSBnaW1wbGVfYnVpbGRfYXNzaWduICh0bXAsIG9wLCBnaW1w bGVfYXNzaWduX2xocyAocmVhZCksIG9wMik7CisKKyAgICBpZiAoYXRvbWljKQorICAgIHsK Kwl0cmVlIHJlbGF4ZWQgPSBidWlsZF9pbnRfY3N0IChpbnRlZ2VyX3R5cGVfbm9kZSwgTUVN TU9ERUxfUkVMQVhFRCk7CisJdHJlZSBzdG9yZSA9IGJ1aWx0aW5fZGVjbF9leHBsaWNpdCAo CisJCVRZUEVfUFJFQ0lTSU9OIChnY292X3R5cGVfbm9kZSkgPiAzMgorCQk/IEJVSUxUX0lO X0FUT01JQ19TVE9SRV84CisJCTogQlVJTFRfSU5fQVRPTUlDX1NUT1JFXzQpOworCisJLy8g X19hdG9taWNfc3RvcmVfOCAoJmxocywgKG9wMSB8IG9wMiksIF9fQVRPTUlDX1JFTEFYRUQp CisJd3JpdGUgPSBnaW1wbGVfYnVpbGRfY2FsbAorCSAgICAoc3RvcmUsIDMsIGJ1aWxkX2Fk ZHIgKGxocyksIGdpbXBsZV9hc3NpZ25fbGhzIChiaXR3KSwgcmVsYXhlZCk7CisgICAgfQor ICAgIGVsc2UKKyAgICB7CisJd3JpdGUgPSBnaW1wbGVfYnVpbGRfYXNzaWduIChsaHMsIGdp bXBsZV9hc3NpZ25fbGhzIChiaXR3KSk7CisgICAgfQorCisgICAgZ3NpX2luc2VydF9vbl9l ZGdlIChlLCByZWFkKTsKKyAgICBnc2lfaW5zZXJ0X29uX2VkZ2UgKGUsIGJpdHcpOworICAg IGdzaV9pbnNlcnRfb25fZWRnZSAoZSwgd3JpdGUpOworfQorCisvKiBXYWxrIHRoZSBDRkcg YW5kIGNvbGxlY3QgY29uZGl0aW9uYWxzLgorCisgICAxLiBDb2xsZWN0IGFsbCBub2RlcyBy ZWFjaGFibGUgZnJvbSB0aGUgcm9vdCBub2RlIHRocm91Z2ggKGNvbnRyYWN0ZWQpIHBhdGhz CisgICAgICBvZiB0cnVlL2ZhbHNlIGVkZ2VzLgorICAgMi4gQ29sbGVjdCB0aGUgbmVpZ2hi b3JzIG9mIHRoZSByZWFjaGFibGUgbm9kZSAoc2V0KS4KKyAgIDMuIEZyb20gZXZlcnkgbm9k ZSBpbiB0aGUgbmVpZ2hib3Job29kLCB3YWxrIHRoZSB1cCB0aGUgQ0ZHIGFuZCBtYXJrIGV2 ZXJ5CisgICAgICByZWFjaGFibGUgbm9kZS4gIE9ubHkgdGhlIG5vZGVzIHJlYWNoYWJsZSBm cm9tICpldmVyeSogbm9kZSBpbiB0aGUKKyAgICAgIG5laWdoYm9yaG9vZCBhcmUgYSBwYXJ0 IG9mIHRoZSBmaXJzdCBleHByZXNzaW9uLgorICAgNC4gUmVjb3JkIHRoZSBleHByZXNzaW9u IHBsdXMgdGhlIHR3byBzdWNjZXNzb3JzIG9mIHRoZSBsYXN0IChoaWdoZXN0LWluZGV4KQor ICAgICAgbm9kZSBpbiB0aGUgZXhwcmVzc2lvbiwgaS5lLiB0aGUgbGFzdCB0ZXJtLgorICAg NS4gUmVwZWF0IHVzaW5nIHRoZSB0d28gc3VjY2Vzc29ycyBhcyBuZXcgcm9vdCBub2Rlcy4K KworICAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZmluZCBub2RlcyBpbiB0aGUgb3JkZXIg b2YgdGhlIGV4cHJlc3Npb24sIGkuZS4gaXQKKyAgIG1pZ2h0IGZpbmQgKGEgfHwgYikgJiYg YyBhcyBbYSBjIGJdLCBzbyB0aGUgb3V0cHV0IGlzIHNvcnRlZCBieQorICAgYmFzaWNfYmxv Y2stPmluZGV4LgorCisgICBTdGVwcyAyIGFuZCAzIGFyZSBuZWNlc3NhcnkgdG8gZGlzdGlu Z3Vpc2ggY2hhaW5lZCBjb25kaXRpb25hbHMgZnJvbQorICAgbXVsdGktdGVybSBjb25kaXRp b25hbHMsIGUuZy4gdG8gc2VwYXJhdGUKKworICAgICAgIGlmIChhKQorICAgICAgIHsKKyAg ICAgICAgICAgaWYgKGIpCisgICAgICAgICAgICAgICB3b3JrICgpOworICAgICAgIH0KKyAg ICAgICBpZiAoYSAmJiBiKQorICAgICAgICAgICB3b3JrICgpOworICovCit2b2lkCitjb2xs ZWN0X2NvbmRpdGlvbnMgKGNvbmRzX2N0eCYgY3R4LCBiYXNpY19ibG9jayBlbnRyeSwgYmFz aWNfYmxvY2sgZXhpdCkKK3sKKyAgICBiYXNpY19ibG9jayBwcmU7CisgICAgYmFzaWNfYmxv Y2sgcG9zdDsKKyAgICBmb3IgKHByZSA9IGVudHJ5IDs7IHByZSA9IHBvc3QpCisgICAgewor CWlmIChwcmUgPT0gZXhpdCkKKwkgICAgYnJlYWs7CisJaWYgKGJpdG1hcF9iaXRfcCAoY3R4 LnNlZW4sIHByZS0+aW5kZXgpKQorCSAgICBicmVhazsKKworCWJpdG1hcF9zZXRfYml0IChj dHguc2VlbiwgcHJlLT5pbmRleCk7CisJcG9zdCA9IGdldF9pbW1lZGlhdGVfZG9taW5hdG9y IChDRElfUE9TVF9ET01JTkFUT1JTLCBwcmUpOworCWlmICghaXNfY29uZGl0aW9uYWxfcCAo cHJlKSkKKwl7CisJICAgIGZvciAoZWRnZSBlIDogcHJlLT5zdWNjcykKKwkJY29sbGVjdF9j b25kaXRpb25zIChjdHgsIGUtPmRlc3QsIHBvc3QpOworCSAgICBjb250aW51ZTsKKwl9CisK KwlpbnQgbnRlcm1zID0gZmluZF9maXJzdF9jb25kaXRpb25hbCAoY3R4LCBwcmUsIHBvc3Qp OworCXN0ZDo6c29ydCAoY3R4LmJsb2NrcywgY3R4LmJsb2NrcyArIG50ZXJtcywgaW5kZXhf bHQpOworCWJhc2ljX2Jsb2NrIGxhc3QgPSBjdHguYmxvY2tzW250ZXJtcyAtIDFdOworCWlm IChzaXplX3QgKG50ZXJtcykgPD0gQ09ORElUSU9OU19NQVhfVEVSTVMpCisJeworCSAgICBm b3IgKGVkZ2UgZSA6IGxhc3QtPnN1Y2NzKQorCQlpZiAoZS0+ZmxhZ3MgJiAoRURHRV9UUlVF X1ZBTFVFIHwgRURHRV9GQUxTRV9WQUxVRSkpCisJCSAgICBjdHguYmxvY2tzW250ZXJtcysr XSA9IGUtPmRlc3Q7CisJICAgIGN0eC5jb21taXQgKHByZSwgbnRlcm1zKTsKKwl9CisJZWxz ZQorCXsKKwkgICAgbG9jYXRpb25fdCBsb2MgPSBnaW1wbGVfbG9jYXRpb24gKGdzaV9zdG10 IChnc2lfbGFzdF9iYiAocHJlKSkpOworCSAgICB3YXJuaW5nX2F0CisJCShsb2MsIE9QVF9X Y292ZXJhZ2VfdG9vX21hbnlfY29uZGl0aW9ucywKKwkJICJUb28gbWFueSBjb25kaXRpb25z IChmb3VuZCAlZCk7IGdpdmluZyB1cCBjb3ZlcmFnZSIsIG50ZXJtcyk7CisJfQorCisJZm9y IChlZGdlIGUgOiBsYXN0LT5zdWNjcykKKwkgICAgY29sbGVjdF9jb25kaXRpb25zIChjdHgs IGUtPmRlc3QsIHBvc3QpOworICAgIH0KK30KKworfQorCisvKiBDb25kaXRpb24gY292ZXJh Z2UgKE1DL0RDKQorCisgICBBbGdvcml0aG0KKyAgIC0tLS0tLS0tLQorICAgV2hhbGVuLCBI ZWltZGFobCwgRGUgU2lsdmEgaW4gIkVmZmljaWVudCBUZXN0IENvdmVyYWdlIE1lYXN1cmVt ZW50IGZvcgorICAgTUMvREMiIGRlc2NyaWJlIGFuIGFsZ29yaXRobSBmb3IgbW9kaWZpZWQg Y29uZGl0aW9uL2RlY2lzaW9uIGNvdmVyYWdlIGJhc2VkCisgICBvbiBBU1QgYW5hbHlzaXMu ICBUaGlzIGFsZ29yaXRobSBhbmFseXNlcyB0aGUgY29udHJvbCBmbG93IGdyYXBoLCBidXQg dGhlCisgICBhY2N1bXVsYXRpb24gYW5kIHJlY29yZGluZyBvZiAocGFydGlhbCkgcmVzdWx0 cyBpcyBpbnNwaXJlZCBieSB0aGVpciB3b3JrLgorICAgVGhlIGluZGl2aWR1YWwgcGhhc2Vz IGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgY2xvc2VyIHRvIHRoZQorICAgaW1wbGVt ZW50YXRpb24uCisKKyAgIFRoZSBDRkcgaXMgYnJva2VuIHVwIGludG8gc2VnbWVudHMgYmV0 d2VlbiBkb21pbmF0b3JzLiAgVGhpcyBpc24ndCBzdHJpY3RseQorICAgbmVjZXNzYXJ5LCBi dXQgc2luY2UgYm9vbGVhbiBleHByZXNzaW9ucyBjYW5ub3QgY3Jvc3MgZG9taW5hdG9ycyBp dCBtYWtlcworICAgZm9yIGEgbmljZSB3YXkgdG8gcmVkdWNlIHdvcmsuCisKKyAgIFRoZSBj b3ZlcmFnZSBvbmx5IGNvbnNpZGVycyB0aGUgcG9zaXRpb25zLCBub3QgdGhlIHN5bWJvbHMs IGluIGEKKyAgIGNvbmRpdGlvbmFsLCBlLmcuICFBIHx8ICghQiAmJiBBKSBpcyBhIDMtdGVy bSBjb25kaXRpb25hbCBldmVuIHRob3VnaCBBCisgICBhcHBlYXJzIHR3aWNlLiAgU3ViZXhw cmVzc2lvbnMgaGF2ZSBubyBlZmZlY3Qgb24gdGVybSBvcmRlcmluZzoKKyAgIChhICYmIChi IHx8IChjICYmIGQpKSB8fCBlKSBjb21lcyBvdXQgYXMgW2EgYiBjIGQgZV0uCisKKyAgIFRo ZSBvdXRwdXQgZm9yIGdjb3YgaXMgYSB2ZWN0b3Igb2YgcGFpcnMgb2YgdW5zaWduZWQgaW50 ZWdlcnMsIGludGVycHJldGVkCisgICBhcyBiaXQtc2V0cywgd2hlcmUgdGhlIGJpdCBpbmRl eCBjb3JyZXNwb25kcyB0byB0aGUgaW5kZXggb2YgdGhlIGNvbmRpdGlvbgorICAgaW4gdGhl IGV4cHJlc3Npb24uCisKKyAgIEltcGxlbWVudGF0aW9uIGFuZCBpbnRlcmZhY2UKKyAgIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFR3byBwdWJsaWMgZnVuY3Rpb25zIC0g ZmluZF9jb25kaXRpb25zIGFuZCBpbnN0cnVtZW50X2RlY2lzaW9ucy4KKworICAgZmluZF9j b25kaXRpb25zIG91dHB1dHMgdHdvIGFycmF5cywgYmxvY2tzIGFuZCBzaXplcy4gIFRoZSBz aXplcyBkZXNjcmliZXMKKyAgIHRoZSByYW5nZXMgb2YgYmxvY2tzIHRoYXQgbWFrZSB1cCBl dmVyeSBjb25kaXRpb25hbCwgaW4gYSBbZmlyc3QsIGxhc3QpCisgICBmYXNoaW9uLCBpLmUu IGJlZ2luID0gYmxvY2tzW3NpemVzW25dXSwgZW5kID0gYmxvY2tzW3NpemVzW24rMV1dIGZv cgorICAgZXhwcmVzc2lvbiBuLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBv ZiBleHByZXNzaW9ucy4KKworICAgVGhlIGNvdmVyYWdlIGlzIGRlc2lnbmVkIHRvIGdldCBt b3N0IG9mIGl0cyBtZW1vcnkgbmVlZHMgbWV0IGJ5IHRoZSBjYWxsZXIsCisgICBhbmQgaGVh dmlseSB1c2VzIHRoZSBlbmQgb2YgdGhlIGJsb2NrcyBhcnJheSBmb3IgYnVmZmVyLiAgVGhp cyBpcyBib3RoIGZvcgorICAgcGVyZm9ybWFuY2UgKG5vIHJlc2l6ZXMsIGFtb3J0aXplZCBj b3N0IG9mIGFsbG9jYXRpb24pIGFuZAorICAgZWFzZS1vZi1pbXBsZW1lbnRhdGlvbi4gIFRo aXMgbWFrZXMgdGhlIGNhbGxlciByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZworICAgbGFy Z2UgZW5vdWdoIGFycmF5cy4KKworICAgYmxvY2tzOgorICAgIEV2ZXJ5IHBlcm1hbmVudCBj b25kaXRpb25zIGFkZCAyIGJsb2NrcyAodGhlIHRydWUgJiBmYWxzZSBkZXN0IGJsb2Nrcyks IGFuZAorICAgIGFzc3VtaW5nIGEgd29yc3QgY2FzZSBvZiBvbmUtYmxvY2stcGVyLWV4cHIg anVzdCBzdG9yaW5nIHRoZSBvdXRwdXQgbmVlZHMKKyAgICAzKm5fYmFzaWNfYmxvY2tzX2Zv cl9mbiAoKS4gIEFkZGl0aW9uYWxseSwgdGhlIHNlYXJjaGVzIG1pZ2h0IG5lZWQgdG8gYnVm ZmVyCisgICAgdGhlIGZ1bGwgZ3JhcGggYmV0d2VlbiBlbnRyeSBhbmQgZXhpdCBbMV0uIElu IHRvdGFsIHRoYXQgbWVhbnMKKyAgICA1Km5fYmFzaWNfYmxvY2tzX2Zvcl9mbiAoKSBzaG91 bGQgc2hvdWxkIGJlIHBsZW50eSwgYW5kIHRoZSBzYXZpbmdzIGZvcgorICAgIHJlZHVjaW5n IHRoaXMgbnVtYmVyIGlzIHByb2JhYmx5IG5vdCB3b3J0aCB0aGUgcmlzay4KKyAgIHNpemVz OgorICAgIHNpemVzIGdldHMgb25lIGVudHJ5IHBlciBleHByZXNzaW9uIHBsdXMgaW5pdGlh bCwgc28KKyAgICAxK25fYmFzaWNfYmxvY2tzX2Zvcl9mbiAoKSBpcyBzdWZmaWNpZW50Lgor CisgICBpbnN0cnVtZW50X2RlY2lzaW9ucyB1c2VzIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRl ZCBieSBmaW5kX2NvbmRpdGlvbnMgdG8KKyAgIGluamVjdCBjb2RlIG9udG8gZWRnZXMgaW4g dGhlIENGRy4gIEV2ZXJ5IGluc3RydW1lbnRlZCBmdW5jdGlvbiBnZXRzIGxvY2FsCisgICBh Y2N1bXVsYXRvcnMgemVybydkIG9uIGZ1bmN0aW9uIGVudHJ5LCB3aGljaCBvbiBmdW5jdGlv biBleGl0IGFyZSBmbHVzaGVkIHRvCisgICB0aGUgZ2xvYmFsIGFjY3VtdWxhdG9ycyAoY3Jl YXRlZCBieSBjb3ZlcmFnZV9jb3VudGVyX2FsbG9jICgpKS4KKworICAgWzFdIEluIHRydXRo LCB0aGUgc2V0IG9mIG5vZGVzIHRoYXQgY291bGQgYmUgYnVmZmVyZWQgZ2V0cyBzbWFsbGVy IGFzIHRoZQorICAgICAgIGFsZ29yaXRobSB3YWxrcyB0aGUgQ0ZHLCBidXQgYXNzdW1pbmcg anVzdCB1c2luZyBub2RlLWNvdW50IGNvbWVzIGF0CisgICAgICAgbGl0dGxlIHJ1bi10aW1l IGNvc3QgYW5kIGlzIGd1YXJhbnRlZWQgdG8gYmUgc3VmZmljaWVudC4KKyAqLworaW50Citm aW5kX2NvbmRpdGlvbnMgKAorICAgIGJhc2ljX2Jsb2NrIGVudHJ5LAorICAgIGJhc2ljX2Js b2NrIGV4aXQsCisgICAgYmFzaWNfYmxvY2sgKmJsb2NrcywKKyAgICBpbnQgKnNpemVzLAor ICAgIGludCBtYXhzaXplKQoreworICAgIHJlY29yZF9sb29wX2V4aXRzICgpOworICAgIGJv b2wgZnJlZV9kb20gPSBmYWxzZTsKKyAgICBib29sIGZyZWVfcG9zdF9kb20gPSBmYWxzZTsK KyAgICBpZiAoIWRvbV9pbmZvX2F2YWlsYWJsZV9wIChDRElfUE9TVF9ET01JTkFUT1JTKSkK KyAgICB7CisJY2FsY3VsYXRlX2RvbWluYW5jZV9pbmZvIChDRElfUE9TVF9ET01JTkFUT1JT KTsKKwlmcmVlX3Bvc3RfZG9tID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWRvbV9pbmZv X2F2YWlsYWJsZV9wIChDRElfRE9NSU5BVE9SUykpCisgICAgeworCWNhbGN1bGF0ZV9kb21p bmFuY2VfaW5mbyAoQ0RJX0RPTUlOQVRPUlMpOworCWZyZWVfZG9tID0gdHJ1ZTsKKyAgICB9 CisKKyAgICBjb25kc19jdHggY3R4IChtYXhzaXplKTsKKyAgICBjdHguYmxvY2tzID0gYmxv Y2tzOworICAgIGN0eC5zaXplcyA9IHNpemVzICsgMTsKKyAgICBjdHgubWF4c2l6ZSA9IG1h eHNpemU7CisgICAgc2l6ZXNbMF0gPSBzaXplc1sxXSA9IDA7CisgICAgY29sbGVjdF9jb25k aXRpb25zIChjdHgsIGVudHJ5LCBleGl0KTsKKworICAgIC8qIFBhcnRpYWwgc3VtLiAgKi8K KyAgICBmb3IgKGludCBpID0gMDsgaSA8IGN0eC5leHByczsgKytpKQorCXNpemVzW2kgKyAx XSArPSBzaXplc1tpXTsKKworICAgIGlmIChmcmVlX3Bvc3RfZG9tKQorCWZyZWVfZG9taW5h bmNlX2luZm8gKENESV9QT1NUX0RPTUlOQVRPUlMpOworICAgIGlmIChmcmVlX2RvbSkKKwlm cmVlX2RvbWluYW5jZV9pbmZvIChDRElfRE9NSU5BVE9SUyk7CisKKyAgICByZXR1cm4gY3R4 LmV4cHJzOworfQorCitpbnQgaW5zdHJ1bWVudF9kZWNpc2lvbnMgKGJhc2ljX2Jsb2NrICpi bG9ja3MsIGludCBuYmxvY2tzLCBpbnQgY29uZG5vKQoreworICAgIC8qIEluc2VydCBmdW5j dGlvbi1sb2NhbCBhY2N1bXVsYXRvcnMgcGVyIGRlY2lzaW9uLiAgKi8KKyAgICB0cmVlIGFj Y3VbMl0gPSB7CisJYnVpbGRfZGVjbAorCSAgICAoVU5LTk9XTl9MT0NBVElPTiwgVkFSX0RF Q0wsCisJICAgICBnZXRfaWRlbnRpZmllciAoIl9fY29uZGl0aW9uc19hY2N1X3RydWUiKSwg Z2Nvdl90eXBlX25vZGUpLAorCWJ1aWxkX2RlY2wKKwkgICAgKFVOS05PV05fTE9DQVRJT04s IFZBUl9ERUNMLAorCSAgICAgZ2V0X2lkZW50aWZpZXIgKCJfX2NvbmRpdGlvbnNfYWNjdV9m YWxzZSIpLCBnY292X3R5cGVfbm9kZSksCisgICAgfTsKKyAgICBmb3IgKHRyZWUgYWNjIDog YWNjdSkKKyAgICB7CisJdHJlZSB6ZXJvID0gYnVpbGRfaW50X2NzdCAoZ2Nvdl90eXBlX25v ZGUsIDApOworCWZvciAoZWRnZSBlIDogRU5UUllfQkxPQ0tfUFRSX0ZPUl9GTiAoY2Z1bikt PnN1Y2NzKQorCSAgICBnc2lfaW5zZXJ0X29uX2VkZ2UgKGUsIGdpbXBsZV9idWlsZF9hc3Np Z24gKGFjYywgemVybykpOworICAgIH0KKworICAgIGF1dG9fdmVjPGdjb3ZfdHlwZV91bnNp Z25lZCwgMzI+IG1hc2tzIChuYmxvY2tzICogMik7CisgICAgbWFza3MucXVpY2tfZ3Jvd19j bGVhcmVkIChuYmxvY2tzICogMik7CisgICAgZmluZF9zdWJleHByX21hc2tzIChibG9ja3Ms IG5ibG9ja3MsIG1hc2tzLmFkZHJlc3MgKCkpOworCisgICAgLyogVGhlIHRydWUvZmFsc2Ug dGFyZ2V0IGJsb2NrcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG5ibG9ja3Mgc2V0LCBidXQKKyAg ICAgICB0aGVpciBvdXRnb2luZyBlZGdlcyBzaG91bGQgbm90IGJlIGluc3RydW1lbnRlZC4K KyAgICAgKi8KKyAgICBnY2NfYXNzZXJ0IChuYmxvY2tzID4gMik7CisKKyAgICAvKiBBZGQg aW5zdHJ1Y3Rpb25zIGZvciB1cGRhdGluZyB0aGUgZnVuY3Rpb24tbG9jYWwgYWNjdW11bGF0 b3JzLiAgKi8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ibG9ja3MgLSAyOyBpKyspCisg ICAgeworCWZvciAoZWRnZSBlIDogYmxvY2tzW2ldLT5zdWNjcykKKwl7CisJICAgIGlmICgh KGUtPmZsYWdzICYgKEVER0VfVFJVRV9WQUxVRSB8IEVER0VfRkFMU0VfVkFMVUUpKSkKKwkJ Y29udGludWU7CisKKwkgICAgLyogYWNjdSB8PSBleHByW2ldICovCisJICAgIGNvbnN0IGlu dCB0ID0gISEoZS0+ZmxhZ3MgJiBFREdFX0ZBTFNFX1ZBTFVFKTsKKwkgICAgdHJlZSByaHMg PSBidWlsZF9pbnRfY3N0IChnY292X3R5cGVfbm9kZSwgMVVMTCA8PCBpKTsKKwkgICAgZW1p dF9iaXR3aXNlX29wIChlLCBhY2N1W3RdLCBhY2N1W3RdLCBCSVRfSU9SX0VYUFIsIHJocyk7 CisKKwkgICAgaWYgKG1hc2tzWzIqaSArIHRdID09IDApCisJCWNvbnRpbnVlOworCisJICAg IC8qIGFjY3UgJj0gbWFza1tpXSAqLworCSAgICB0cmVlIG1hc2sgPSBidWlsZF9pbnRfY3N0 IChnY292X3R5cGVfbm9kZSwgfm1hc2tzWzIqaSArIHRdKTsKKwkgICAgZm9yIChpbnQgaiA9 IDA7IGogPCAyOyBqKyspCisJCWVtaXRfYml0d2lzZV9vcCAoZSwgYWNjdVtqXSwgYWNjdVtq XSwgQklUX0FORF9FWFBSLCBtYXNrKTsKKwl9CisgICAgfQorCisgICAgLyogQWRkIGluc3Ry dWN0aW9ucyBmb3IgdXBkYXRpbmcgdGhlIGdsb2JhbCBhY2N1bXVsYXRvcnMuICAqLworICAg IGJhc2ljX2Jsb2NrIGV4aXQgPSBFWElUX0JMT0NLX1BUUl9GT1JfRk4gKGNmdW4pOworICAg IGZvciAoZWRnZSBlIDogZXhpdC0+cHJlZHMpCisgICAgeworCWZvciAoaW50IGsgPSAwOyBr IDwgMjsgaysrKQorCXsKKwkgICAgdHJlZSByZWYgPSB0cmVlX2NvdmVyYWdlX2NvdW50ZXJf cmVmCisJCShHQ09WX0NPVU5URVJfQ09ORFMsIDIqY29uZG5vICsgayk7CisKKwkgICAgdHJl ZSB0bXAgPSBtYWtlX3RlbXBfc3NhX25hbWUKKwkJKGdjb3ZfdHlwZV9ub2RlLCBOVUxMLCAi X19jb25kaXRpb25zX3RtcCIpOworCisJICAgIGNvbnN0IGJvb2wgYXRvbWljID0gZmxhZ19w cm9maWxlX3VwZGF0ZSA9PSBQUk9GSUxFX1VQREFURV9BVE9NSUM7CisJICAgIGlmIChhdG9t aWMpCisJICAgIHsKKwkJdHJlZSByZWxheGVkID0gYnVpbGRfaW50X2NzdAorCQkgICAgKGlu dGVnZXJfdHlwZV9ub2RlLCBNRU1NT0RFTF9SRUxBWEVEKTsKKwkJdHJlZSBhdG9taWNfbG9h ZCA9IGJ1aWx0aW5fZGVjbF9leHBsaWNpdAorCQkgICAgKFRZUEVfUFJFQ0lTSU9OIChnY292 X3R5cGVfbm9kZSkgPiAzMgorCQkgICAgID8gQlVJTFRfSU5fQVRPTUlDX0xPQURfOAorCQkg ICAgIDogQlVJTFRfSU5fQVRPTUlDX0xPQURfNCk7CisKKwkJdHJlZSBsaHNfdHlwZSA9IFRS RUVfVFlQRSAoVFJFRV9UWVBFIChhdG9taWNfbG9hZCkpOworCQl0cmVlIGxocyA9IG1ha2Vf dGVtcF9zc2FfbmFtZQorCQkgICAgKGxoc190eXBlLCBOVUxMLCAiX19jb25kaXRpb25zX2xv YWRfbGhzIik7CisKKwkJZ2NhbGwgKmxvYWQgPSBnaW1wbGVfYnVpbGRfY2FsbAorCQkgICAg KGF0b21pY19sb2FkLCAyLCBidWlsZF9hZGRyIChyZWYpLCByZWxheGVkKTsKKwkJZ2ltcGxl X3NldF9saHMgKGxvYWQsIGxocyk7CisJCWdhc3NpZ24gKmFzc2lnbiA9IGdpbXBsZV9idWls ZF9hc3NpZ24KKwkJICAgICh0bXAsIE5PUF9FWFBSLCBnaW1wbGVfY2FsbF9saHMgKGxvYWQp KTsKKworCQlnc2lfaW5zZXJ0X29uX2VkZ2UgKGUsIGxvYWQpOworCQlnc2lfaW5zZXJ0X29u X2VkZ2UgKGUsIGFzc2lnbik7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWdhc3Np Z24gKnJlYWQgPSBnaW1wbGVfYnVpbGRfYXNzaWduICh0bXAsIHJlZik7CisJCXRtcCA9IGdp bXBsZV9hc3NpZ25fbGhzIChyZWFkKTsKKwkJZ3NpX2luc2VydF9vbl9lZGdlIChlLCByZWFk KTsKKwkgICAgfQorCisJICAgIHJlZiA9IHVuc2hhcmVfZXhwciAocmVmKTsKKwkgICAgZW1p dF9iaXR3aXNlX29wIChlLCByZWYsIGFjY3Vba10sIEJJVF9JT1JfRVhQUiwgdG1wLCBhdG9t aWMpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gbmJsb2NrcyAtIDI7Cit9CisKKyN1bmRl ZiBDT05ESVRJT05TX01BWF9URVJNUworCiAvKiBEbyBpbml0aWFsaXphdGlvbiB3b3JrIGZv ciB0aGUgZWRnZSBwcm9maWxlci4gICovCiAKIC8qIEFkZCBjb2RlOgpAQCAtNzU4LDcgKzE2 MzQsNyBAQCB0cmVlX3Byb2ZpbGluZyAodm9pZCkKIAkgIHRodW5rID0gdHJ1ZTsKIAkgIC8q IFdoZW4gZ2VuZXJhdGUgcHJvZmlsZSwgZXhwYW5kIHRodW5rIHRvIGdpbXBsZSBzbyBpdCBj YW4gYmUKIAkgICAgIGluc3RydW1lbnRlZCBzYW1lIHdheSBhcyBvdGhlciBmdW5jdGlvbnMu ICAqLwotCSAgaWYgKHByb2ZpbGVfYXJjX2ZsYWcpCisJICBpZiAocHJvZmlsZV9hcmNfZmxh ZyB8fCBwcm9maWxlX2NvbmRpdGlvbl9mbGFnKQogCSAgICBleHBhbmRfdGh1bmsgKG5vZGUs IGZhbHNlLCB0cnVlKTsKIAkgIC8qIFJlYWQgY2dyYXBoIHByb2ZpbGUgYnV0IGtlZXAgZnVu Y3Rpb24gYXMgdGh1bmsgYXQgcHJvZmlsZS11c2UKIAkgICAgIHRpbWUuICAqLwpAQCAtODAz LDcgKzE2NzksNyBAQCB0cmVlX3Byb2ZpbGluZyAodm9pZCkKICAgcmVsZWFzZV9wcm9maWxl X2ZpbGVfZmlsdGVyaW5nICgpOwogCiAgIC8qIERyb3AgcHVyZS9jb25zdCBmbGFncyBmcm9t IGluc3RydW1lbnRlZCBmdW5jdGlvbnMuICAqLwotICBpZiAocHJvZmlsZV9hcmNfZmxhZyB8 fCBmbGFnX3Rlc3RfY292ZXJhZ2UpCisgIGlmIChwcm9maWxlX2FyY19mbGFnIHx8IHByb2Zp bGVfY29uZGl0aW9uX2ZsYWcgfHwgZmxhZ190ZXN0X2NvdmVyYWdlKQogICAgIEZPUl9FQUNI X0RFRklORURfRlVOQ1RJT04gKG5vZGUpCiAgICAgICB7CiAJaWYgKCFnaW1wbGVfaGFzX2Jv ZHlfcCAobm9kZS0+ZGVjbCkKQEAgLTg5Nyw3ICsxNzczLDcgQEAgcGFzc19pcGFfdHJlZV9w cm9maWxlOjpnYXRlIChmdW5jdGlvbiAqKQogICAgICBkaXNhYmxlZC4gICovCiAgIHJldHVy biAoIWluX2x0b19wICYmICFmbGFnX2F1dG9fcHJvZmlsZQogCSAgJiYgKGZsYWdfYnJhbmNo X3Byb2JhYmlsaXRpZXMgfHwgZmxhZ190ZXN0X2NvdmVyYWdlCi0JICAgICAgfHwgcHJvZmls ZV9hcmNfZmxhZykpOworCSAgICAgIHx8IHByb2ZpbGVfYXJjX2ZsYWcgfHwgcHJvZmlsZV9j b25kaXRpb25fZmxhZykpOwogfQogCiB9IC8vIGFub24gbmFtZXNwYWNlCi0tIAoyLjIwLjEK Cg== --------------W8tOTd8uHMg0zhwCz7q3OxxO--