Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wFurF-005hSk-2l for pgpool-hackers@arkaria.postgresql.org; Thu, 23 Apr 2026 14:16:46 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wFurF-002DMD-0c for pgpool-hackers@arkaria.postgresql.org; Thu, 23 Apr 2026 14:16:45 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wFurE-002DLv-0v for pgpool-hackers@lists.postgresql.org; Thu, 23 Apr 2026 14:16:44 +0000 Received: from mail-yw1-x1129.google.com ([2607:f8b0:4864:20::1129]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wFur8-00000002QVy-0CUe for pgpool-hackers@lists.postgresql.org; Thu, 23 Apr 2026 14:16:43 +0000 Received: by mail-yw1-x1129.google.com with SMTP id 00721157ae682-7986e538decso68491837b3.1 for ; Thu, 23 Apr 2026 07:16:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776953798; cv=none; d=google.com; s=arc-20240605; b=dTic90dNOqQx5wHY2/tjb1xgc472dt2UzwgzVZtaRP276K1lRVVQtWJ2LNaJmBGM6l NCNKHA2zUelsD1zpSsJzY8j/Z/dSRoGNXYRhvnklHrbUBNCdvC+gG2ixVgl9aJR0tA0f rGl/olnpmHcZQjcFzDpyl02xuCv/+QNLbFyQ4yFHZmmzX2OpH9ejj6Vz5y+LzR2V+hJJ bpgfLc+6GXb9N9wc1vqGBi/jcIL+lUDlzCd7ZMh5VSuhMc3Mh5I1CY5Cy9Syd9ojHIUx oIK3Pvp4COqEVKo1QaYf6UhsRgNSbccn+j3fQ9Bb5ytnRszv/Lbk3zTiavstp3NSZ7yd gZgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=b+7zJmLAmOfjhdHbRkMu1Rgdqir66P3ekANB+e7kQdc=; fh=m3oiE62fRN5J1XaE+5vpHZRIgCyFefxVI0mFw3d8yxA=; b=IKtU8TokrGAT55FAJfWAZ5ghV7aXYWT0AnyzKZQfHTvKw0db9GYfxR09rnk/mpuyZ6 HEfQigUpNBTd9XsLqqIf1GGmguX38ITZDG6Lhviu79i5IfUQ5STc/CKPjF3ajT1P/jeT kpY1g2OWpUubYHO8FENc4Rb3HrFu2bjsJ5HaQDQxEZzIZhvv6gtuB3pgxvZ4XgpY0QSp rP81Jd4fzg83FMmLQAUhBvhFpTCT4CNgsMeJDD8tsPjl1W0kD2jXdLe2WeDpi6t6Xwjy fzAjoO16sZqPEKvxyuDOImkQX5CLl1ZiOIXsmonbbBDt0iW0gvfUnJrPHcIJKSV0pLUl ETAg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tailorbrands.com; s=google; t=1776953798; x=1777558598; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=b+7zJmLAmOfjhdHbRkMu1Rgdqir66P3ekANB+e7kQdc=; b=blOzyeS1ZiJ3TOuiWO3+Qj7yjzDs/4dDLp66WB7Jy3wXUU/cGK/S7MRrmWyhyw7mSZ r1HCr6rLa118PU4z1eaUSO3R7Rswg3lydJpqbRSqRaROAU0VoC08LJaQLYs06Z9eEM3D VUMt/lN8Xt7A2hd4wSsjLlRtNgBnqCj3YtiovoR239Q9nLHGcVvGz6ygZaPrIgZs/0Fb 5D6ckIjlmv8+u745kx7PcachouH3JcIU+VJsjus9drI6s86DdpmFedAfEYqNuhLcwoOI xK/mb64tYI56nOiT/ZwCix1JZYiNFu8GAlHUvh20gOq2Z9a9J+RVBPheN9NHWQch6S3t ykqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776953798; x=1777558598; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=b+7zJmLAmOfjhdHbRkMu1Rgdqir66P3ekANB+e7kQdc=; b=FyUoMRc9bG89ILB1brPTyDGgdqUK18NZDdWyzdsy7VfFT/xmVriKITM/00te7f8vuQ d5HrQ2LVj0G37MITXo/VaEc7QQ+jrJfu4j+9ex4Ru+nHL2F62jVgJCVL5U7gH+7vhdKd qYdRzP6PocA+NrGtnASjnqlnUITlRlX/i8nSdE33t/RprsNEWv6IBVkuYRCglA+fLLAP aN7MhZarbCkbwhVaDOZnZy895UkvahFqhdTW+DAdC/ivQL+YIT2dB+hqJWMtrz3UZDEi CNCLjR79AQLsqhGc3rv8stzf53qaTm2iO9m/9HtCftKXgfhGNzSM6oEmhcPDPzFzzk1p qCfg== X-Gm-Message-State: AOJu0Yy43p5/YFXL7RY2cWeW3iYFt39aYaRGORe6I1kI3Twx1njR1TBY dHRpm9yyFo1DC0r7dF/YSfpZRWovylrS6DGgxWMLBmq4+3I38kIQTPWzqWE1JR+umr1mUHk4GL4 igbcBvKfHCJbxiOxI1ga1NgskjBPfkc96rhBN/UIXew== X-Gm-Gg: AeBDiesrV4aHC3PlsnczaxkFZ0z9pR2R1NpuGCGe0oVETzk4SyifCmHPjG/FfIjLLaa jKeb6cEZfvot6LfnVWhmGvrrBVWYmWE9sGTP63gkqZzfeceN4WZWEUFbCo7nyD7C+LGctyPW4sk ecQm8XiE6trS6vJNo4zWsT4akcOPT4FAN+1qZXs61+Zjy3mjkJYQ0fpxpJw9t8DVu31VJ1B2Ym5 Sr5DvqSVILy1xZ5xNoXciw6BtN2y3vjzM5tDAAdwmC4aTSepwixDkPFl3i6Yof9GT9Q1x5ex2tE UkyBOWVEuVvezHidIG0F6snNoh2PSWWK3Hz/DyyzwDOKAPBHw968ogF/EKjJZ2ctgrdc8a3LOVE UfvULMatvyvaA9NQ5nWBipyULrTHc0BmQ5HTx1JgWJb36Y2s= X-Received: by 2002:a05:690c:10d:b0:7bb:eaf:5101 with SMTP id 00721157ae682-7bb0eaf590emr73324307b3.16.1776953797442; Thu, 23 Apr 2026 07:16:37 -0700 (PDT) MIME-Version: 1.0 References: <20260419.162444.1985634870518309110.ishii@postgresql.org> <20260423.171408.1934918588656421138.ishii@postgresql.org> In-Reply-To: <20260423.171408.1934918588656421138.ishii@postgresql.org> From: Nadav Shatz Date: Thu, 23 Apr 2026 17:16:24 +0300 X-Gm-Features: AQROBzDZL6VGRy9wTBU9k7O5KoQG_2YpnzyZRo32TrmIvbmMD8BouD7HCCerea0 Message-ID: Subject: Re: Proposal: Recent mutated table tracking in memory To: Tatsuo Ishii Cc: pgpool-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000e18a100650214b62" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e18a100650214b62 Content-Type: multipart/alternative; boundary="000000000000e18a0f0650214b60" --000000000000e18a0f0650214b60 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Tatsuo, Good catch on the 006.memqcache timeout. My previous fix had wrong side effects -- setting writing_transaction for dml_adaptive_global also changed routing behavior (it forced the whole transaction to primary, effectively reducing the feature to 'transaction' mode). That's what caused the hang. Fixed properly in v3: instead of touching writing_transaction, added a memqcache-specific guard that checks whether the current dml_adaptive* session has tracked writes in the current transaction, and skips the cache fetch if so. Attached: v3-0001-Feature-load-balancing-control-by-table-tracking.patch Changes in v3 vs v2: - pool_set_writing_transaction() reverted to original behavior (dml_adaptive_global no longer sets writing_transaction, so routing stays per-table as intended). - Added new helper pool_has_dml_adaptive_write_in_transaction() in pool_session_context.c. Returns true when the current session is in dml_adaptive* mode, is inside an explicit transaction, and has already tracked at least one write (via transaction_temp_write_list). - The two memqcache fetch guards in pool_proto_modules.c (simple query at line 270, extended query at line 1028) now also call !pool_has_dml_adaptive_write_in_transaction(). Autocommit writes in dml_adaptive_global are still handled by the existing pool_invalidate_query_cache() at COMMIT time -- no change needed there. Verified locally by mutating 006.memqcache with disable_load_balance_on_write =3D 'dml_adaptive_global' in the streaming replication mode (the only mode where dml_adaptive applies) and the jdbctest now correctly returns "2" instead of the stale cached "1". Both 006.memqcache and 043.track_table_mutation pass. Thanks! On Thu, Apr 23, 2026 at 11:14=E2=80=AFAM Tatsuo Ishii wrote: > Hi Nadav, > > Unfortunately the mutated 006.memqcache failed (timeout). > > >> > memqcache bug fix > >> > ----------------- > >> > > >> > Good catch. The root cause: pool_set_writing_transaction() was > >> > explicitly skipping dml_adaptive_global, so > >> > pool_is_writing_transaction() always returned false in this mode. > >> > The query cache fetch guard at pool_proto_modules.c:270 > >> > (!pool_is_writing_transaction()) then served stale cached results > >> > after DML in the same transaction. > >> > > >> > Fix: pool_set_writing_transaction() now sets the flag for > >> > dml_adaptive_global (only 'off' and 'dml_adaptive' skip it). This > >> > ensures the query cache is properly bypassed after writes within > >> > the same transaction. > > Regards, > -- > Tatsuo Ishii > SRA OSS K.K. > English: http://www.sraoss.co.jp/index_en/ > Japanese:http://www.sraoss.co.jp > > > Hi Tatsuo, > > > > Rebased onto current master, renumbered the regression tests > > (043/044 to avoid collision with the new 042.ssl_reload), and > > combined everything into a single commit. > > > > Attached: v2-0001-Feature-load-balancing-control-by-table-tracking.patc= h > > > > Looking forward to your review. > > > > > > On Sun, Apr 19, 2026 at 10:25=E2=80=AFAM Tatsuo Ishii > wrote: > > > >> > Hi Tatsuo, > >> > > >> > hank you for the detailed review. Attached patch addresses all items= . > >> > >> I guess the attached patch is on top of > >> v1-0001-Feature-load-balancing-control-by-table-tracking.patch. To > >> apply v2-0001-address-review.patch, we need to apply > >> v1-0001-Feature-load-balancing-control-by-table-tracking.patch first. > >> Unfortunately due to recent commit, it does not apply anymore. Can you > >> please provide v1 + v2 that are rebased against latest master branch? > >> Also 042 regression test is already used by recent commit. Can you > >> renumber 042.track_table_mutation and > >> 043.track_table_mutation_watchdog to 043.track_table_mutation and > >> 044.track_table_mutation_watchdog accordingly? > >> > >> Looking forward to seeing new patch. > >> > >> Regards, > >> -- > >> Tatsuo Ishii > >> SRA OSS K.K. > >> English: http://www.sraoss.co.jp/index_en/ > >> Japanese:http://www.sraoss.co.jp > >> > >> > >> > memqcache bug fix > >> > ----------------- > >> > > >> > Good catch. The root cause: pool_set_writing_transaction() was > >> > explicitly skipping dml_adaptive_global, so > >> > pool_is_writing_transaction() always returned false in this mode. > >> > The query cache fetch guard at pool_proto_modules.c:270 > >> > (!pool_is_writing_transaction()) then served stale cached results > >> > after DML in the same transaction. > >> > > >> > Fix: pool_set_writing_transaction() now sets the flag for > >> > dml_adaptive_global (only 'off' and 'dml_adaptive' skip it). This > >> > ensures the query cache is properly bypassed after writes within > >> > the same transaction. > >> > > >> > Removed dead query parse cache code (~700 lines) > >> > ------------------------------------------------- > >> > > >> > You're right -- pool_track_table_mutation_get_cached_parse, > >> > pool_track_table_mutation_cache_parse, and > >> > pool_track_table_mutation_normalize_and_hash were never called. > >> > These were leftover from an earlier design where we planned to > >> > cache SQL parse results in shared memory. The feature ended up > >> > using pgpool's existing parser directly, and this code was never > >> > wired up. > >> > > >> > Removed: QueryParseCache and QueryParseEntry structs, all related > >> > static functions, the TRACK_TABLE_MUTATION_QUERY_SEM semaphore, > >> > and the track_table_mutation_query_buckets / > >> > track_table_mutation_query_parse_cache_size configuration > >> > parameters. This also reduces shared memory usage from ~6.4 MB > >> > to ~80 KB with default settings. > >> > > >> > check_object_relationship_list scope > >> > ------------------------------------- > >> > > >> > You're correct -- dml_adaptive_global does not use > >> > dml_adaptive_object_relationship_list. Changed > >> > check_object_relationship_list() to check for DLBOW_DML_ADAPTIVE > >> > only, not DLBOW_IS_DML_ADAPTIVE (which includes global). > >> > > >> > Documentation fixes > >> > ------------------- > >> > > >> > - Removed "(Lagless Replica Reads)" from section title and > >> > "lagless" language from description. > >> > > >> > - Described fallback behavior when neither > >> > replication_delay_source_cmd nor delay_threshold_by_time is > >> > configured (TTL stays at 100ms default minimum). > >> > > >> > - "query cache" references removed (the query parse cache is gone). > >> > > >> > - Added 128-table-per-SELECT limit to Limitations section > >> > (uses POOL_MAX_SELECT_OIDS). > >> > > >> > Code style fixes > >> > ---------------- > >> > > >> > - DLBOW_IS_DML_ADAPTIVE() calls no longer split across lines. > >> > > >> > - Split the long errmsg line in > >> > is_select_object_in_temp_write_list. > >> > > >> > - Removed redundant is_adaptive variable in > >> > is_select_object_in_temp_write_list (the check at function > >> > entry already guarantees it). > >> > > >> > Thanks! > >> > > >> > On Wed, Apr 15, 2026 at 1:43=E2=80=AFAM Tatsuo Ishii > >> wrote: > >> > > >> >> Hi Nadav, > >> >> > >> >> > Hi Tatsuo, > >> >> > > >> >> > Looks good to me thanks! > >> >> > > >> >> > Please go ahead with your review. waiting to hear back from you. > >> >> > >> >> Here are the code review results. > >> >> > >> >> diff --git a/doc/src/sgml/loadbalance.sgml > >> b/doc/src/sgml/loadbalance.sgml > >> >> index 9e1e7b39b..7384ce81a 100644 > >> >> --- a/doc/src/sgml/loadbalance.sgml > >> >> +++ b/doc/src/sgml/loadbalance.sgml > >> >> : > >> >> + > >> >> + Table Mutation Map Configuration (Lagless Replica > >> Reads) > >> >> > >> >> "(Lagless Replica Reads)" sounds like an advertisement to me. It > >> >> should be removed. > >> >> > >> >> + > >> >> + These parameters configure the track table mutation feature, > which > >> is > >> >> activated by setting > >> >> + to > >> >> dml_adaptive_global. > >> >> + The feature tracks recently written tables to prevent stale rea= ds > >> from > >> >> replica nodes during > >> >> + replication lag, implementing the "lagless" architecture patter= n > for > >> >> distributed systems > >> >> + with read replicas. > >> >> > >> >> I think the feature does not guarantee "lagless" anytime, in all > cases. > >> >> > >> >> + > >> >> + This feature requires time-based replication delay monitoring. > This > >> >> can be provided by either > >> >> + (external > command > >> >> mode) or by setting > >> >> + (which uses > >> >> pg_stat_replication.replay_lag > >> >> + from PostgreSQL 10+). At least one of these must be configured > for > >> the > >> >> TTL calculation to work. > >> >> > >> >> If one of these is not set, what happens? Error? Need to describe i= t. > >> >> > >> >> + > >> >> + > >> >> + > >> >> + > >> >> + Enabling dml_adaptive_global increases shar= ed > >> >> memory consumption. With default settings, > >> >> + the feature requires approximately 6.4 MB of shared memory (0.= 1 > MB > >> >> for table tracking + 6.3 MB for query cache). > >> >> > >> >> "query cache" should be "query parse cache". > >> >> > >> >> + Memory usage scales with configuration parameters: > >> >> + > >> >> + > >> >> + > >> >> + > >> >> + Table tracking: track_table_mutation_table_size * 4= 0 > >> >> bytes (default: 2048 * 40 =3D ~80 KB) > >> >> + > >> >> + > >> >> + > >> >> + > >> >> + Query cache: > >> track_table_mutation_query_parse_cache_size * > >> >> 640 bytes (default: 10000 * 640 =3D ~6.3 MB) > >> >> > >> >> "query cache" should be "query parse cache". > >> >> > >> >> + Limitations > >> >> > >> >> I think number of tables tacked in a SELECT is limited to 8. It > should > >> >> be mentioned. > >> >> > >> >> diff --git a/src/context/pool_query_context.c > >> >> b/src/context/pool_query_context.c > >> >> index a056ac596..0190d3673 100644 > >> >> --- a/src/context/pool_query_context.c > >> >> +++ b/src/context/pool_query_context.c > >> >> @@ -1828,15 +1829,23 @@ is_in_list(char *name, List *list) > >> >> static bool > >> >> is_select_object_in_temp_write_list(Node *node, void *context) > >> >> { > >> >> - if (node =3D=3D NULL || > pool_config->disable_load_balance_on_write > >> !=3D > >> >> DLBOW_DML_ADAPTIVE) > >> >> + if (node =3D=3D NULL || > >> >> + !DLBOW_IS_DML_ADAPTIVE( > >> >> + > >> >> pool_config->disable_load_balance_on_write)) > >> >> > >> >> You don't need to split the line. > >> >> > >> >> + is_adaptive =3D DLBOW_IS_DML_ADAPTIVE( > >> >> + > >> >> pool_config->disable_load_balance_on_write); > >> >> > >> >> You don't need to split the line. > >> >> > >> >> - if (pool_config->disable_load_balance_on_write =3D= =3D > >> >> DLBOW_DML_ADAPTIVE && session_context->is_in_transaction) > >> >> + if (is_adaptive && > >> >> + session_context->is_in_transaction) > >> >> { > >> >> ereport(DEBUG1, > >> >> > >> >> (errmsg("is_select_object_in_temp_write_list: \"%s\", found relatio= n > >> >> \"%s\"", (char *) context, rgv->relname))); > >> >> This line is too long. Please split. > >> >> > >> >> @@ -1880,7 +1889,13 @@ static char > >> >> *get_associated_object_from_dml_adaptive_relations > >> >> void > >> >> check_object_relationship_list(char *name, bool is_func_name) > >> >> { > >> >> - if (pool_config->disable_load_balance_on_write =3D=3D > >> >> DLBOW_DML_ADAPTIVE && > >> >> pool_config->parsed_dml_adaptive_object_relationship_list) > >> >> + bool is_adaptive; > >> >> + > >> >> + is_adaptive =3D DLBOW_IS_DML_ADAPTIVE( > >> >> + > >> >> pool_config->disable_load_balance_on_write); > >> >> > >> >> I wrote in the commit message: > >> >> > >> >> modifications are only detected in the same transaction). Note, > >> >> however, you cannot use dml_adaptive_object_relationship_list to > track > >> >> dependency among table and other objects. > >> >> > >> >> In my understanding the feature does not use > >> >> dml_adaptive_object_relationship_list. If this is correct, why > >> >> check_object_relationship_list() is called here in case > >> >> dml_adaptive_global? If the feature uses > >> >> dml_adaptive_object_relationship_list, test cases should be include= d. > >> >> > >> >> diff --git a/src/utils/pool_track_table_mutation.c > >> >> b/src/utils/pool_track_table_mutation.c > >> >> new file mode 100644 > >> >> index 000000000..9be46b28f > >> >> --- /dev/null > >> >> +++ b/src/utils/pool_track_table_mutation.c > >> >> > >> >> It seems following functions are not used anywhere. I wonder if thi= s > >> >> feature actually use "query parse cache". > >> >> > >> >> pool_track_table_mutation_get_cached_parse > >> >> pool_track_table_mutation_cache_parse > >> >> pool_track_table_mutation_normalize_and_hash > >> >> > >> >> Besides the code review, I mutated one of regression tests to check > >> >> whether the feature co exists with in the existing memory query cac= he > >> >> feature. After attached patch applied, I ran 006.memqcache and got > the > >> >> following result. > >> >> > >> >> cd src/test/regression > >> >> ./regress.sh 006 > >> >> creating pgpool-II temporary installation ... > >> >> moving pgpool_setup to temporary installation path ... > >> >> moving watchdog_setup to temporary installation path ... > >> >> using pgpool-II at > >> >> > >> > /home/t-ishii/work/Pgpool-II/current/pgpool2/src/test/regression/temp/ins= talled > >> >> ************************* > >> >> REGRESSION MODE : install > >> >> Pgpool-II version : pgpool-II version 4.8devel > (mitsukakeboshi) > >> >> Pgpool-II install path : > >> >> > >> > /home/t-ishii/work/Pgpool-II/current/pgpool2/src/test/regression/temp/ins= talled > >> >> PostgreSQL bin : /usr/local/pgsql/bin > >> >> PostgreSQL Major version : 18 > >> >> pgbench : /usr/local/pgsql/bin/pgbench > >> >> PostgreSQL jdbc : > >> >> /usr/local/pgsql/share/postgresql-9.2-1003.jdbc4.jar > >> >> ************************* > >> >> testing 006.memqcache...failed. > >> >> out of 1 ok:0 failed:1 timeout:0 > >> >> > >> >> log/006.memqcache shows: > >> >> > >> >> ../expected.txt result.txt differ: char 1, line 1 > >> >> > >> >> So I checked the test script and found the error was generated by a > >> >> Java program test. > >> >> > >> >> java jdbctest > result.txt 2>&1 > >> >> cmp ../expected.txt result.txt > >> >> if [ $? !=3D 0 ];then > >> >> ./shutdownall > >> >> exit 1 > >> >> fi > >> >> > >> >> In jdbctest.java: > >> >> > >> >> /* > >> >> * Cache test in an explicit transaction > >> >> */ > >> >> conn.setAutoCommit(false); > >> >> // execute DML. This should prevent SELECTs from > using > >> >> query cache in the transaction. > >> >> sql =3D "UPDATE t1 SET i =3D 2;"; > >> >> pst =3D conn.createStatement(); > >> >> pst.executeUpdate(sql); > >> >> pst.close(); > >> >> // should not use the cache and should return "2", > >> rather > >> >> than "1" > >> >> prest =3D conn.prepareStatement("SELECT * FROM t1")= ; > >> >> rs =3D prest.executeQuery(); > >> >> > >> >> The expected file (expected.txt) has "2" but the result file > >> >> (testdir/result.txt) was "1". This is the reason why the test > >> >> failed. I wonder if there's something wrong with the feature when t= he > >> >> query cache is enabled. Can you look into this? > >> >> > >> >> Regards, > >> >> -- > >> >> Tatsuo Ishii > >> >> SRA OSS K.K. > >> >> English: http://www.sraoss.co.jp/index_en/ > >> >> Japanese:http://www.sraoss.co.jp > >> >> > >> > > >> > > >> > -- > >> > Nadav Shatz > >> > Tailor Brands | CTO > >> > > > > > > -- > > Nadav Shatz > > Tailor Brands | CTO > --=20 Nadav Shatz Tailor Brands | CTO --000000000000e18a0f0650214b60 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Tatsuo,

Good catch on the 006.memqcache timeout.= My previous fix had
wrong side effects -- setting writing_transaction f= or
dml_adaptive_global also changed routing behavior (it forced the
w= hole transaction to primary, effectively reducing the feature to
'tr= ansaction' mode). That's what caused the hang.

Fixed properl= y in v3: instead of touching writing_transaction,
added a memqcache-spec= ific guard that checks whether the current
dml_adaptive* session has tra= cked writes in the current
transaction, and skips the cache fetch if so.=

Attached: v3-0001-Feature-load-balancing-control-by-table-tracking.= patch

Changes in v3 vs v2:

- pool_set_writing_transaction() r= everted to original behavior
=C2=A0 (dml_adaptive_global no longer sets = writing_transaction, so
=C2=A0 routing stays per-table as intended).
=
- Added new helper pool_has_dml_adaptive_write_in_transaction()
=C2= =A0 in pool_session_context.c. Returns true when the current session
=C2= =A0 is in dml_adaptive* mode, is inside an explicit transaction, and
=C2= =A0 has already tracked at least one write (via
=C2=A0 transaction_temp_= write_list).

- The two memqcache fetch guards in pool_proto_modules.= c
=C2=A0 (simple query at line 270, extended query at line 1028) now
= =C2=A0 also call !pool_has_dml_adaptive_write_in_transaction().
=C2=A0 A= utocommit writes in dml_adaptive_global are still handled by
=C2=A0 the = existing pool_invalidate_query_cache() at COMMIT time --
=C2=A0 no chang= e needed there.

Verified locally by mutating 006.memqcache with
d= isable_load_balance_on_write =3D 'dml_adaptive_global' in the
st= reaming replication mode (the only mode where dml_adaptive
applies) and = the jdbctest now correctly returns "2" instead of
the stale ca= ched "1". Both 006.memqcache and 043.track_table_mutation
pass= .

Thanks!

=
On Thu, Apr 23, 2026 at 11:14=E2=80= =AFAM Tatsuo Ishii <ishii@postgr= esql.org> wrote:
Hi Nadav,

Unfortunately the mutated 006.memqcache failed (timeout).

>> > memqcache bug fix
>> > -----------------
>> >
>> > Good catch. The root cause: pool_set_writing_transaction() wa= s
>> > explicitly skipping dml_adaptive_global, so
>> > pool_is_writing_transaction() always returned false in this m= ode.
>> > The query cache fetch guard at pool_proto_modules.c:270
>> > (!pool_is_writing_transaction()) then served stale cached res= ults
>> > after DML in the same transaction.
>> >
>> > Fix: pool_set_writing_transaction() now sets the flag for
>> > dml_adaptive_global (only 'off' and 'dml_adaptive= ' skip it). This
>> > ensures the query cache is properly bypassed after writes wit= hin
>> > the same transaction.

Regards,
--
Tatsuo Ishii
SRA OSS K.K.
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp

> Hi Tatsuo,
>
> Rebased onto current master, renumbered the regression tests
> (043/044 to avoid collision with the new 042.ssl_reload), and
> combined everything into a single commit.
>
> Attached: v2-0001-Feature-load-balancing-control-by-table-tracking.pat= ch
>
> Looking forward to your review.
>
>
> On Sun, Apr 19, 2026 at 10:25=E2=80=AFAM Tatsuo Ishii <ishii@postgresql.org> = wrote:
>
>> > Hi Tatsuo,
>> >
>> > hank you for the detailed review. Attached patch addresses al= l items.
>>
>> I guess the attached patch is on top of
>> v1-0001-Feature-load-balancing-control-by-table-tracking.patch.=C2= =A0 To
>> apply v2-0001-address-review.patch, we need to apply
>> v1-0001-Feature-load-balancing-control-by-table-tracking.patch fir= st.
>> Unfortunately due to recent commit, it does not apply anymore. Can= you
>> please provide v1 + v2 that are rebased against latest master bran= ch?
>> Also 042 regression test is already used by recent commit. Can you=
>> renumber 042.track_table_mutation and
>> 043.track_table_mutation_watchdog to 043.track_table_mutation and<= br> >> 044.track_table_mutation_watchdog accordingly?
>>
>> Looking forward to seeing new patch.
>>
>> Regards,
>> --
>> Tatsuo Ishii
>> SRA OSS K.K.
>> English: http://www.sraoss.co.jp/index_en/
>> Japanese:http://www.sraoss.co.jp
>>
>>
>> > memqcache bug fix
>> > -----------------
>> >
>> > Good catch. The root cause: pool_set_writing_transaction() wa= s
>> > explicitly skipping dml_adaptive_global, so
>> > pool_is_writing_transaction() always returned false in this m= ode.
>> > The query cache fetch guard at pool_proto_modules.c:270
>> > (!pool_is_writing_transaction()) then served stale cached res= ults
>> > after DML in the same transaction.
>> >
>> > Fix: pool_set_writing_transaction() now sets the flag for
>> > dml_adaptive_global (only 'off' and 'dml_adaptive= ' skip it). This
>> > ensures the query cache is properly bypassed after writes wit= hin
>> > the same transaction.
>> >
>> > Removed dead query parse cache code (~700 lines)
>> > -------------------------------------------------
>> >
>> > You're right -- pool_track_table_mutation_get_cached_pars= e,
>> > pool_track_table_mutation_cache_parse, and
>> > pool_track_table_mutation_normalize_and_hash were never calle= d.
>> > These were leftover from an earlier design where we planned t= o
>> > cache SQL parse results in shared memory. The feature ended u= p
>> > using pgpool's existing parser directly, and this code wa= s never
>> > wired up.
>> >
>> > Removed: QueryParseCache and QueryParseEntry structs, all rel= ated
>> > static functions, the TRACK_TABLE_MUTATION_QUERY_SEM semaphor= e,
>> > and the track_table_mutation_query_buckets /
>> > track_table_mutation_query_parse_cache_size configuration
>> > parameters. This also reduces shared memory usage from ~6.4 M= B
>> > to ~80 KB with default settings.
>> >
>> > check_object_relationship_list scope
>> > -------------------------------------
>> >
>> > You're correct -- dml_adaptive_global does not use
>> > dml_adaptive_object_relationship_list. Changed
>> > check_object_relationship_list() to check for DLBOW_DML_ADAPT= IVE
>> > only, not DLBOW_IS_DML_ADAPTIVE (which includes global).
>> >
>> > Documentation fixes
>> > -------------------
>> >
>> > - Removed "(Lagless Replica Reads)" from section ti= tle and
>> >=C2=A0 =C2=A0"lagless" language from description. >> >
>> > - Described fallback behavior when neither
>> >=C2=A0 =C2=A0replication_delay_source_cmd nor delay_threshold_= by_time is
>> >=C2=A0 =C2=A0configured (TTL stays at 100ms default minimum).<= br> >> >
>> > - "query cache" references removed (the query parse= cache is gone).
>> >
>> > - Added 128-table-per-SELECT limit to Limitations section
>> >=C2=A0 =C2=A0(uses POOL_MAX_SELECT_OIDS).
>> >
>> > Code style fixes
>> > ----------------
>> >
>> > - DLBOW_IS_DML_ADAPTIVE() calls no longer split across lines.=
>> >
>> > - Split the long errmsg line in
>> >=C2=A0 =C2=A0is_select_object_in_temp_write_list.
>> >
>> > - Removed redundant is_adaptive variable in
>> >=C2=A0 =C2=A0is_select_object_in_temp_write_list (the check at= function
>> >=C2=A0 =C2=A0entry already guarantees it).
>> >
>> > Thanks!
>> >
>> > On Wed, Apr 15, 2026 at 1:43=E2=80=AFAM Tatsuo Ishii <ishii@postgresql.org<= /a>>
>> wrote:
>> >
>> >> Hi Nadav,
>> >>
>> >> > Hi Tatsuo,
>> >> >
>> >> > Looks good to me thanks!
>> >> >
>> >> > Please go ahead with your review. waiting to hear ba= ck from you.
>> >>
>> >> Here are the code review results.
>> >>
>> >> diff --git a/doc/src/sgml/loadbalance.sgml
>> b/doc/src/sgml/loadbalance.sgml
>> >> index 9e1e7b39b..7384ce81a 100644
>> >> --- a/doc/src/sgml/loadbalance.sgml
>> >> +++ b/doc/src/sgml/loadbalance.sgml
>> >> :
>> >> + <sect2 id=3D"runtime-config-table-mutation-map&= quot;>
>> >> +=C2=A0 <title>Table Mutation Map Configuration (La= gless Replica
>> Reads)</title>
>> >>
>> >> "(Lagless Replica Reads)" sounds like an advert= isement to me. It
>> >> should be removed.
>> >>
>> >> +=C2=A0 <para>
>> >> +=C2=A0 =C2=A0These parameters configure the track table = mutation feature, which
>> is
>> >> activated by setting
>> >> +=C2=A0 =C2=A0<xref linkend=3D"guc-disable-load-b= alance-on-write"> to
>> >> <literal>dml_adaptive_global</literal>.
>> >> +=C2=A0 =C2=A0The feature tracks recently written tables = to prevent stale reads
>> from
>> >> replica nodes during
>> >> +=C2=A0 =C2=A0replication lag, implementing the "lag= less" architecture pattern for
>> >> distributed systems
>> >> +=C2=A0 =C2=A0with read replicas.
>> >>
>> >> I think the feature does not guarantee "lagless"= ; anytime, in all cases.
>> >>
>> >> +=C2=A0 <para>
>> >> +=C2=A0 =C2=A0This feature requires time-based replicatio= n delay monitoring. This
>> >> can be provided by either
>> >> +=C2=A0 =C2=A0<xref linkend=3D"guc-replication-de= lay-source-cmd"> (external command
>> >> mode) or by setting
>> >> +=C2=A0 =C2=A0<xref linkend=3D"guc-delay-threshol= d-by-time"> (which uses
>> >> <literal>pg_stat_replication.replay_lag</literal= >
>> >> +=C2=A0 =C2=A0from PostgreSQL 10+). At least one of these= must be configured for
>> the
>> >> TTL calculation to work.
>> >>
>> >> If one of these is not set, what happens? Error? Need to = describe it.
>> >>
>> >> +=C2=A0 </para>
>> >> +
>> >> +=C2=A0 <warning>
>> >> +=C2=A0 =C2=A0<para>
>> >> +=C2=A0 =C2=A0 Enabling <literal>dml_adaptive_globa= l</literal> increases shared
>> >> memory consumption. With default settings,
>> >> +=C2=A0 =C2=A0 the feature requires approximately 6.4 MB = of shared memory (0.1 MB
>> >> for table tracking + 6.3 MB for query cache).
>> >>
>> >> "query cache" should be "query parse cache= ".
>> >>
>> >> +=C2=A0 =C2=A0 Memory usage scales with configuration par= ameters:
>> >> +=C2=A0 =C2=A0</para>
>> >> +=C2=A0 =C2=A0<itemizedlist>
>> >> +=C2=A0 =C2=A0 <listitem>
>> >> +=C2=A0 =C2=A0 =C2=A0<para>
>> >> +=C2=A0 =C2=A0 =C2=A0 Table tracking: <literal>trac= k_table_mutation_table_size * 40
>> >> bytes</literal> (default: 2048 * 40 =3D ~80 KB)
>> >> +=C2=A0 =C2=A0 =C2=A0</para>
>> >> +=C2=A0 =C2=A0 </listitem>
>> >> +=C2=A0 =C2=A0 <listitem>
>> >> +=C2=A0 =C2=A0 =C2=A0<para>
>> >> +=C2=A0 =C2=A0 =C2=A0 Query cache:
>> <literal>track_table_mutation_query_parse_cache_size *
>> >> 640 bytes</literal> (default: 10000 * 640 =3D ~6.3 = MB)
>> >>
>> >> "query cache" should be "query parse cache= ".
>> >>
>> >> +=C2=A0 =C2=A0<title>Limitations</title>
>> >>
>> >> I think number of tables tacked in a SELECT is limited to= 8. It should
>> >> be mentioned.
>> >>
>> >> diff --git a/src/context/pool_query_context.c
>> >> b/src/context/pool_query_context.c
>> >> index a056ac596..0190d3673 100644
>> >> --- a/src/context/pool_query_context.c
>> >> +++ b/src/context/pool_query_context.c
>> >> @@ -1828,15 +1829,23 @@ is_in_list(char *name, List *list= )
>> >>=C2=A0 static bool
>> >>=C2=A0 is_select_object_in_temp_write_list(Node *node, voi= d *context)
>> >>=C2=A0 {
>> >> -=C2=A0 =C2=A0 =C2=A0 =C2=A0if (node =3D=3D NULL || pool_= config->disable_load_balance_on_write
>> !=3D
>> >> DLBOW_DML_ADAPTIVE)
>> >> +=C2=A0 =C2=A0 =C2=A0 =C2=A0if (node =3D=3D NULL ||
>> >> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0!= DLBOW_IS_DML_ADAPTIVE(
>> >> +
>> >> pool_config->disable_load_balance_on_write))
>> >>
>> >> You don't need to split the line.
>> >>
>> >> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0i= s_adaptive =3D DLBOW_IS_DML_ADAPTIVE(
>> >> +
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pool_conf= ig->disable_load_balance_on_write);
>> >>
>> >> You don't need to split the line.
>> >>
>> >> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0i= f (pool_config->disable_load_balance_on_write =3D=3D
>> >> DLBOW_DML_ADAPTIVE && session_context->is_in_t= ransaction)
>> >> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0i= f (is_adaptive &&
>> >> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0session_context->is_in_transaction)
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0{
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ereport(DEBUG1,
>> >>
>> >> (errmsg("is_select_object_in_temp_write_list: \"= ;%s\", found relation
>> >> \"%s\"", (char *) context, rgv->relname= )));
>> >> This line is too long. Please split.
>> >>
>> >> @@ -1880,7 +1889,13 @@ static char
>> >> *get_associated_object_from_dml_adaptive_relations
>> >>=C2=A0 void
>> >>=C2=A0 check_object_relationship_list(char *name, bool is_= func_name)
>> >>=C2=A0 {
>> >> -=C2=A0 =C2=A0 =C2=A0 =C2=A0if (pool_config->disable_l= oad_balance_on_write =3D=3D
>> >> DLBOW_DML_ADAPTIVE &&
>> >> pool_config->parsed_dml_adaptive_object_relationship_l= ist)
>> >> +=C2=A0 =C2=A0 =C2=A0 =C2=A0bool=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 is_adaptive;
>> >> +
>> >> +=C2=A0 =C2=A0 =C2=A0 =C2=A0is_adaptive =3D DLBOW_IS_DML_= ADAPTIVE(
>> >> +
>> >>=C2=A0 =C2=A0 =C2=A0 pool_config->disable_load_balance_= on_write);
>> >>
>> >> I wrote in the commit message:
>> >>
>> >> modifications are only detected in the same transaction).= Note,
>> >> however, you cannot use dml_adaptive_object_relationship_= list to track
>> >> dependency among table and other objects.
>> >>
>> >> In my understanding the feature does not use
>> >> dml_adaptive_object_relationship_list. If this is correct= , why
>> >> check_object_relationship_list() is called here in case >> >> dml_adaptive_global?=C2=A0 If the feature uses
>> >> dml_adaptive_object_relationship_list, test cases should = be included.
>> >>
>> >> diff --git a/src/utils/pool_track_table_mutation.c
>> >> b/src/utils/pool_track_table_mutation.c
>> >> new file mode 100644
>> >> index 000000000..9be46b28f
>> >> --- /dev/null
>> >> +++ b/src/utils/pool_track_table_mutation.c
>> >>
>> >> It seems following functions are not used anywhere. I won= der if this
>> >> feature actually use "query parse cache".
>> >>
>> >> pool_track_table_mutation_get_cached_parse
>> >> pool_track_table_mutation_cache_parse
>> >> pool_track_table_mutation_normalize_and_hash
>> >>
>> >> Besides the code review, I mutated one of regression test= s to check
>> >> whether the feature co exists with in the existing memory= query cache
>> >> feature. After attached patch applied, I ran 006.memqcach= e and got the
>> >> following result.
>> >>
>> >> cd src/test/regression
>> >> ./regress.sh 006
>> >> creating pgpool-II temporary installation ...
>> >> moving pgpool_setup to temporary installation path ... >> >> moving watchdog_setup to temporary installation path ...<= br> >> >> using pgpool-II at
>> >>
>> /home/t-ishii/work/Pgpool-II/current/pgpool2/src/test/regression/t= emp/installed
>> >> *************************
>> >> REGRESSION MODE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 : insta= ll
>> >> Pgpool-II version=C2=A0 =C2=A0 =C2=A0 =C2=A0 : pgpool-II = version 4.8devel (mitsukakeboshi)
>> >> Pgpool-II install path=C2=A0 =C2=A0:
>> >>
>> /home/t-ishii/work/Pgpool-II/current/pgpool2/src/test/regression/t= emp/installed
>> >> PostgreSQL bin=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0: = /usr/local/pgsql/bin
>> >> PostgreSQL Major version : 18
>> >> pgbench=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 : /usr/local/pgsql/bin/pgbench
>> >> PostgreSQL jdbc=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :
>> >> /usr/local/pgsql/share/postgresql-9.2-1003.jdbc4.jar
>> >> *************************
>> >> testing 006.memqcache...failed.
>> >> out of 1 ok:0 failed:1 timeout:0
>> >>
>> >> log/006.memqcache shows:
>> >>
>> >> ../expected.txt result.txt differ: char 1, line 1
>> >>
>> >> So I checked the test script and found the error was gene= rated by a
>> >> Java program test.
>> >>
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0java jdbctest > resul= t.txt 2>&1
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0cmp ../expected.txt resu= lt.txt
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if [ $? !=3D 0 ];then >> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0./shutdownall
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0exit 1
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fi
>> >>
>> >> In jdbctest.java:
>> >>
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0/*
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 * Cache test in an explicit transaction
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 */
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0conn.setAutoCommit(false);
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0// execute DML. This should prevent SELECTs from using
>> >> query cache in the transaction.
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0sql =3D "UPDATE t1 SET i =3D 2;";
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0pst =3D conn.createStatement();
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0pst.executeUpdate(sql);
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0pst.close();
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0// should not use the cache and should return "2",
>> rather
>> >> than "1"
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0prest =3D conn.prepareStatement("SELECT * FROM t1");
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0rs =3D prest.executeQuery();
>> >>
>> >> The expected file (expected.txt) has "2" but th= e result file
>> >> (testdir/result.txt) was "1".=C2=A0 This is the= reason why the test
>> >> failed. I wonder if there's something wrong with the = feature when the
>> >> query cache is enabled. Can you look into this?
>> >>
>> >> Regards,
>> >> --
>> >> Tatsuo Ishii
>> >> SRA OSS K.K.
>> >> English:
http://www.sraoss.co.jp/index_en/ >> >> Japanese:http://www.sraoss.co.jp
>> >>
>> >
>> >
>> > --
>> > Nadav Shatz
>> > Tailor Brands | CTO
>>
>
>
> --
> Nadav Shatz
> Tailor Brands | CTO


--
Nadav Shatz
<= font color=3D"#000000">Tailor Brands=C2=A0| CTO
--000000000000e18a0f0650214b60-- --000000000000e18a100650214b62 Content-Type: application/octet-stream; name="v3-0001-Feature-load-balancing-control-by-table-tracking.patch" Content-Disposition: attachment; filename="v3-0001-Feature-load-balancing-control-by-table-tracking.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mobkegsf0 RnJvbSA0ODQyZWU4OTU1MWZhYmEwNDA4MjIxOWU1ZWQ2MjE2OWIxNjQwMDhlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYWRhdiBTaGF0eiA8bmFkYXZAdGFpbG9yYnJhbmRzLmNvbT4K RGF0ZTogU3VuLCAxOSBBcHIgMjAyNiAxNzoxMDoyNCArMDMwMApTdWJqZWN0OiBbUEFUQ0ggdjNd IEZlYXR1cmU6IGxvYWQgYmFsYW5jaW5nIGNvbnRyb2wgYnkgdGFibGUgdHJhY2tpbmcuCgpQcmV2 ZW50IHJvdXRpbmcgb2YgcmVhZCBvbmx5IHF1ZXJpZXMgdG8gc3RhbmRieSBpZiByZXBsaWNhdGlv biBkZWxheQpvZiB0YWJsZXMgdXNlZCBpbiB0aGUgcXVlcnkgZXhjZWVkcyBjZXJ0YWluIGFtb3Vu dCBvZiB2YWx1ZQpjb2xsZWN0ZWQgYnkgc3RyZWFtaW5nIHJlcGxpY2F0aW9uIHByb2Nlc3MuIFRv IGVuYWJsZSB0aGlzIGZlYXR1cmUsCnNldCBkaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSB0 byBkbWxfYWRhcHRpdmVfZ2xvYmFsLgoKSW4gdGhpcyBtb2RlLCB3aGVuIHRhYmxlcyBhcmUgbW9k aWZpZWQgYnkKSU5TRVJUL1VQREFURS9ERUxFVEUvVFJVTkNBVEUvTUVSR0UvZGF0YSBtb2RpZmlj YXRpb24gV0lUSCwgZm9yCmNlcnRhaW4gcGVvcmlvZCBTRUxFQ1RzIHVzaW5nIHRoZSB0YWJsZXMg YXJlIG5vdCBsb2FkIGJhbGFuY2VkOgppLmUuIHJvdXRlZCB0byB0aGUgcHJpbWFyeSBQb3N0Z3Jl U1FMIHNlcnZlciB0byBhdm9pZCB0aGUgZGF0YQpzdGFsZW5lc3MgYnkgcmVwbGljYXRpb24gZGVs YXkuCgpVbmxpa2UgZG1sX2FkYXB0aXZlIG1vZGUsIGFueSB0YWJsZSBtb2RpZmljYXRpb25zIGRl Y3JpYmVkIGFib3ZlIGFyZQpkZXRlY3RlZCBldmVuIHRoZXkgaGFwcG4gaW4gb3RoZXIgc2Vzc2lv bnMgKGluIGRtbF9hZGFwdGl2ZSwgdGFibGUKbW9kaWZpY2F0aW9ucyBhcmUgb25seSBkZXRlY3Rl ZCBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbikuIE5vdGUsCmhvd2V2ZXIsIHlvdSBjYW5ub3QgdXNl IGRtbF9hZGFwdGl2ZV9vYmplY3RfcmVsYXRpb25zaGlwX2xpc3QgdG8gdHJhY2sKZGVwZW5kZW5j eSBhbW9uZyB0YWJsZSBhbmQgb3RoZXIgb2JqZWN0cy4KCkJlc2lkZXMgZG1sX2FkYXB0aXZlX2ds b2JhbCwgdGhlcmUgYXJlIHNvbWUgdHVuaW5nIGtub2JzIGZvciB0aGUKZmVhdHVyZToKCi0gdHJh Y2tfdGFibGVfbXV0YXRpb25fdHRsX2ZhY3RvcgogIFBhcmFtZXRlciB0byBjYWxjdWxhdGUgVFRM IG9mIGVhY2ggdHJhY2tpbmcgZGF0YS4KCi0gdHJhY2tfdGFibGVfbXV0YXRpb25fbWF4X3N0YWxl bmVzcwogIE1heGltdW0gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRoYXQgYSBzaW5nbGUgdGFi bGUgZW50cnkgY2FuCiAgY29udGludW91c2x5IGZvcmNlIHF1ZXJpZXMgdG8gcHJpbWFyeS4KCi0g dHJhY2tfdGFibGVfbXV0YXRpb25fY29sZF9zdGFydF9kdXJhdGlvbgogIER1cmF0aW9uIGluIG1p bGxpc2Vjb25kcyB0byByb3V0ZSBhbGwgcXVlcmllcyB0byBwcmltYXJ5IGFmdGVyIGEKICBjaGls ZCBwcm9jZXNzIHN0YXJ0cy4KCi0gdHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfYnVja2V0cwog IE51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIHRoZSB0cmFjayB0YWJsZSBtdXRhdGlvbiBoYXNo IHRhYmxlLgoKLSB0cmFja190YWJsZV9tdXRhdGlvbl90YWJsZV9zaXplCiAgTWF4aW11bSBudW1i ZXIgb2YgdGFibGVzIHRoYXQgY2FuIGJlIHRyYWNrZWQgc2ltdWx0YW5lb3VzbHkgaW4gdGhlCiAg dHJhY2sgdGFibGUgbXV0YXRpb24uCgpBdXRob3I6IE5hZGF2IFNoYXR6IDxuYWRhdkB0YWlsb3Ji cmFuZHMuY29tPgpSZXZpZXdlZC1ieTogVGF0c3VvIElzaGlpIDxpc2hpaUBwb3N0Z3Jlc3FsLm9y Zz4KRGlzY3Vzc2lvbjogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0 LzIwMjYwNDA3LjE4MTAwOS4xNzYyMjA0MDMzMDc0MTY0ODQxLmlzaGlpJTQwcG9zdGdyZXNxbC5v cmcjNThjMTM5YzFhN2Y4ZDU1NjI4NjU5MjFkMDczMzY2N2IKLS0tCiBkb2Mvc3JjL3NnbWwvbG9h ZGJhbGFuY2Uuc2dtbCAgICAgICAgICAgICAgICAgfCAyODggKysrKysrCiBzcmMvTWFrZWZpbGUu YW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL2NvbmZpZy9wb29s X2NvbmZpZ192YXJpYWJsZXMuYyAgICAgICAgICAgIHwgIDY1ICsrCiBzcmMvY29udGV4dC9wb29s X3F1ZXJ5X2NvbnRleHQuYyAgICAgICAgICAgICAgfCAyNDIgKysrKy0KIHNyYy9jb250ZXh0L3Bv b2xfc2Vzc2lvbl9jb250ZXh0LmMgICAgICAgICAgICB8ICAzNyArLQogc3JjL2luY2x1ZGUvY29u dGV4dC9wb29sX3Nlc3Npb25fY29udGV4dC5oICAgIHwgICAxICsKIHNyYy9pbmNsdWRlL3Bvb2wu aCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMyArLQogc3JjL2luY2x1ZGUvcG9vbF9j b25maWcuaCAgICAgICAgICAgICAgICAgICAgIHwgIDI0ICstCiBzcmMvaW5jbHVkZS91dGlscy9w b29sX3RyYWNrX3RhYmxlX211dGF0aW9uLmggfCAxNjcgKysrKwogc3JjL21haW4vcGdwb29sX21h aW4uYyAgICAgICAgICAgICAgICAgICAgICAgIHwgIDI5ICstCiBzcmMvcHJvdG9jb2wvQ29tbWFu ZENvbXBsZXRlLmMgICAgICAgICAgICAgICAgfCAgMjggKwogc3JjL3Byb3RvY29sL2NoaWxkLmMg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4ICsKIHNyYy9wcm90b2NvbC9wb29sX3Byb3Rv X21vZHVsZXMuYyAgICAgICAgICAgICB8ICAgOCArLQogc3JjL3NhbXBsZS9wZ3Bvb2wuY29uZi5z YW1wbGUtc3RyZWFtICAgICAgICAgIHwgIDQ1ICsKIHNyYy9zdHJlYW1pbmdfcmVwbGljYXRpb24v cG9vbF93b3JrZXJfY2hpbGQuYyB8ICAyNCArCiBzcmMvdGVzdC9yZWdyZXNzaW9uL2xpYnMuc2gg ICAgICAgICAgICAgICAgICAgfCAgIDIgKwogLi4uL3Rlc3RzLzA0My50cmFja190YWJsZV9tdXRh dGlvbi90ZXN0LnNoICAgIHwgMzU0ICsrKysrKysKIC4uLi8wNDQudHJhY2tfdGFibGVfbXV0YXRp b25fd2F0Y2hkb2cvdGVzdC5zaCB8IDE4NCArKysrCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRl ZnMubGlzdCAgICAgICAgICAgICAgfCAgIDQgKwogc3JjL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVf bXV0YXRpb24uYyAgICAgICAgIHwgOTAyICsrKysrKysrKysrKysrKysrKwogMjAgZmlsZXMgY2hh bmdlZCwgMjM5MSBpbnNlcnRpb25zKCspLCAyNSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEw MDY0NCBzcmMvaW5jbHVkZS91dGlscy9wb29sX3RyYWNrX3RhYmxlX211dGF0aW9uLmgKIGNyZWF0 ZSBtb2RlIDEwMDc1NSBzcmMvdGVzdC9yZWdyZXNzaW9uL3Rlc3RzLzA0My50cmFja190YWJsZV9t dXRhdGlvbi90ZXN0LnNoCiBjcmVhdGUgbW9kZSAxMDA3NTUgc3JjL3Rlc3QvcmVncmVzc2lvbi90 ZXN0cy8wNDQudHJhY2tfdGFibGVfbXV0YXRpb25fd2F0Y2hkb2cvdGVzdC5zaAogY3JlYXRlIG1v ZGUgMTAwNjQ0IHNyYy91dGlscy9wb29sX3RyYWNrX3RhYmxlX211dGF0aW9uLmMKCmRpZmYgLS1n aXQgYS9kb2Mvc3JjL3NnbWwvbG9hZGJhbGFuY2Uuc2dtbCBiL2RvYy9zcmMvc2dtbC9sb2FkYmFs YW5jZS5zZ21sCmluZGV4IDllMWU3YjM5Yi4uZDRmYmNmMWE1IDEwMDY0NAotLS0gYS9kb2Mvc3Jj L3NnbWwvbG9hZGJhbGFuY2Uuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvbG9hZGJhbGFuY2Uuc2dt bApAQCAtMTExMCw2ICsxMTEwLDE4IEBAIGFwcF9uYW1lX3JlZGlyZWN0X3ByZWZlcmVuY2VfbGlz dCAmZ3Q7IGRhdGFiYXNlX3JlZGlyZWN0X3ByZWZlcmVuY2VfbGlzdCAmZ3Q7IHVzCiAJCURlcGVu ZGVudCBmdW5jdGlvbnMsIHRyaWdnZXJzLCBhbmQgdmlld3Mgb24gdGhlIHRhYmxlcyBjYW4gYmUg Y29uZmlndXJlZAogCQl1c2luZyA8eHJlZiBsaW5rZW5kPSJndWMtZG1sLWFkYXB0aXZlLW9iamVj dC1yZWxhdGlvbnNoaXAtbGlzdCI+CiAgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKwkJSWYg dGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvIDx2YXJuYW1lPmRtbF9hZGFwdGl2ZV9nbG9iYWw8L3Zh cm5hbWU+LAorCQk8cHJvZHVjdG5hbWU+UGdwb29sLUlJPC8+IGJlaGF2ZXMgbGlrZSA8dmFybmFt ZT5kbWxfYWRhcHRpdmU8L3Zhcm5hbWU+CisJCShwZXItdHJhbnNhY3Rpb24gd3JpdGUgdHJhY2tp bmcpIGFuZCBhZGRpdGlvbmFsbHkgdXNlcyBzaGFyZWQgbWVtb3J5IHRvIHRyYWNrCisJCXJlY2Vu dGx5IHdyaXR0ZW4gdGFibGVzIGFjcm9zcyBhbGwgc2Vzc2lvbnMgY2x1c3Rlci13aWRlLiBXaGVu IGEgdGFibGUgaXMKKwkJd3JpdHRlbiBpbiBhbnkgc2Vzc2lvbiwgc3Vic2VxdWVudCByZWFkcyBv ZiB0aGF0IHRhYmxlIGZyb20gYW55IHNlc3Npb24gYXJlCisJCXJvdXRlZCB0byBwcmltYXJ5IHVu dGlsIGEgVFRMIChiYXNlZCBvbiBtZWFzdXJlZCByZXBsaWNhdGlvbiBkZWxheSkgZXhwaXJlcy4K KwkJVGhpcyBwcmV2ZW50cyBzdGFsZSByZWFkcyBhZnRlciB3cml0ZXMgZXZlbiBhY3Jvc3MgZGlm ZmVyZW50IGNvbm5lY3Rpb25zLgorCQlTZWUgPHhyZWYgbGlua2VuZD0icnVudGltZS1jb25maWct dGFibGUtbXV0YXRpb24tbWFwIj4gZm9yIHRoZSBzdWItcGFyYW1ldGVycworCQl0aGF0IGNvbnRy b2wgdGhlIHNoYXJlZC1tZW1vcnkgdHJhY2tpbmcgYmVoYXZpb3IuCisgICAgIDwvcGFyYT4KICAg ICA8L2xpc3RpdGVtPgogICAgPC92YXJsaXN0ZW50cnk+CiAKQEAgLTExOTUsNCArMTIwNywyODAg QEAgZG1sX2FkYXB0aXZlX29iamVjdF9yZWxhdGlvbnNoaXBfbGlzdCA9ICd0YWJsZV8xOnRhYmxl XzInCiAKICAgPC92YXJpYWJsZWxpc3Q+CiAgPC9zZWN0Mj4KKworIDxzZWN0MiBpZD0icnVudGlt ZS1jb25maWctdGFibGUtbXV0YXRpb24tbWFwIj4KKyAgPHRpdGxlPlRhYmxlIE11dGF0aW9uIFRy YWNraW5nIENvbmZpZ3VyYXRpb248L3RpdGxlPgorCisgIDxwYXJhPgorICAgVGhlc2UgcGFyYW1l dGVycyBjb25maWd1cmUgdGhlIHRyYWNrIHRhYmxlIG11dGF0aW9uIGZlYXR1cmUsIHdoaWNoIGlz IGFjdGl2YXRlZCBieSBzZXR0aW5nCisgICA8eHJlZiBsaW5rZW5kPSJndWMtZGlzYWJsZS1sb2Fk LWJhbGFuY2Utb24td3JpdGUiPiB0byA8bGl0ZXJhbD5kbWxfYWRhcHRpdmVfZ2xvYmFsPC9saXRl cmFsPi4KKyAgIFRoZSBmZWF0dXJlIHRyYWNrcyByZWNlbnRseSB3cml0dGVuIHRhYmxlcyB0byBw cmV2ZW50IHN0YWxlIHJlYWRzIGZyb20gcmVwbGljYSBub2RlcyBkdXJpbmcKKyAgIHJlcGxpY2F0 aW9uIGxhZy4KKyAgPC9wYXJhPgorCisgIDxwYXJhPgorICAgV2hlbiBhIHRhYmxlIGlzIG1vZGlm aWVkIChJTlNFUlQvVVBEQVRFL0RFTEVURSksIGl0IGlzIG1hcmtlZCBhcyAic3RhbGUiIGZvciBh IFRUTCBwZXJpb2QKKyAgICg8bGl0ZXJhbD5yZXBsaWNhdGlvbl9kZWxheSAqIHRyYWNrX3RhYmxl X211dGF0aW9uX3R0bF9mYWN0b3I8L2xpdGVyYWw+KS4gQW55IFNFTEVDVCBxdWVyaWVzIG9uIHN0 YWxlIHRhYmxlcyBhcmUgcm91dGVkCisgICB0byB0aGUgcHJpbWFyeSBub2RlIGluc3RlYWQgb2Yg cmVwbGljYXMsIGVuc3VyaW5nIHJlYWQtYWZ0ZXItd3JpdGUgY29uc2lzdGVuY3kuCisgIDwvcGFy YT4KKworICA8cGFyYT4KKyAgIFRoaXMgZmVhdHVyZSByZXF1aXJlcyB0aW1lLWJhc2VkIHJlcGxp Y2F0aW9uIGRlbGF5IG1vbml0b3JpbmcuIFRoaXMgY2FuIGJlIHByb3ZpZGVkIGJ5IGVpdGhlcgor ICAgPHhyZWYgbGlua2VuZD0iZ3VjLXJlcGxpY2F0aW9uLWRlbGF5LXNvdXJjZS1jbWQiPiAoZXh0 ZXJuYWwgY29tbWFuZCBtb2RlKSBvciBieSBzZXR0aW5nCisgICA8eHJlZiBsaW5rZW5kPSJndWMt ZGVsYXktdGhyZXNob2xkLWJ5LXRpbWUiPiAod2hpY2ggdXNlcyA8bGl0ZXJhbD5wZ19zdGF0X3Jl cGxpY2F0aW9uLnJlcGxheV9sYWc8L2xpdGVyYWw+CisgICBmcm9tIFBvc3RncmVTUUwgMTArKS4g SWYgbmVpdGhlciBpcyBjb25maWd1cmVkLCB0aGUgVFRMIHJlbWFpbnMgYXQgaXRzIGRlZmF1bHQg bWluaW11bSB2YWx1ZQorICAgKDEwMCBtaWxsaXNlY29uZHMpIGFuZCBpcyBuZXZlciB1cGRhdGVk IGJhc2VkIG9uIGFjdHVhbCByZXBsaWNhdGlvbiBkZWxheSwgd2hpY2ggbWF5IHJlc3VsdAorICAg aW4gc3Vib3B0aW1hbCByb3V0aW5nIGRlY2lzaW9ucy4KKyAgPC9wYXJhPgorCisgIDx3YXJuaW5n PgorICAgPHBhcmE+CisgICAgRW5hYmxpbmcgPGxpdGVyYWw+ZG1sX2FkYXB0aXZlX2dsb2JhbDwv bGl0ZXJhbD4gaW5jcmVhc2VzIHNoYXJlZCBtZW1vcnkgY29uc3VtcHRpb24uIFdpdGggZGVmYXVs dCBzZXR0aW5ncywKKyAgICB0aGUgZmVhdHVyZSByZXF1aXJlcyBhcHByb3hpbWF0ZWx5IDgwIEtC IG9mIHNoYXJlZCBtZW1vcnkgZm9yIHRhYmxlIHRyYWNraW5nOgorICAgIDxsaXRlcmFsPnRyYWNr X3RhYmxlX211dGF0aW9uX3RhYmxlX3NpemUgKiA0MCBieXRlczwvbGl0ZXJhbD4gKGRlZmF1bHQ6 IDIwNDggKiA0MCA9IH44MCBLQikuCisgICA8L3BhcmE+CisgIDwvd2FybmluZz4KKworICA8dmFy aWFibGVsaXN0PgorCisgICA8dmFybGlzdGVudHJ5IGlkPSJndWMtdHJhY2stdGFibGUtbXV0YXRp b24tdHRsLWZhY3RvciIgeHJlZmxhYmVsPSJ0cmFja190YWJsZV9tdXRhdGlvbl90dGxfZmFjdG9y Ij4KKyAgICA8dGVybT48dmFybmFtZT50cmFja190YWJsZV9tdXRhdGlvbl90dGxfZmFjdG9yPC92 YXJuYW1lPiAoPHR5cGU+ZmxvYXRpbmcgcG9pbnQ8L3R5cGU+KQorICAgICA8aW5kZXh0ZXJtPgor ICAgICAgPHByaW1hcnk+PHZhcm5hbWU+dHJhY2tfdGFibGVfbXV0YXRpb25fdHRsX2ZhY3Rvcjwv dmFybmFtZT4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI8L3ByaW1hcnk+CisgICAgIDwvaW5kZXh0 ZXJtPgorICAgIDwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgIDxwYXJhPgorICAgICAgTXVs dGlwbGllciBmb3IgY2FsY3VsYXRpbmcgdGhlIFRUTDogPGxpdGVyYWw+VFRMID0gcmVwbGljYXRp b25fZGVsYXkgKiB0cmFja190YWJsZV9tdXRhdGlvbl90dGxfZmFjdG9yPC9saXRlcmFsPi4KKyAg ICAgIEhpZ2hlciB2YWx1ZXMgcHJvdmlkZSBtb3JlIHNhZmV0eSBtYXJnaW4gYnV0IG1heSByZWR1 Y2UgcmVhZCByZXBsaWNhIHV0aWxpemF0aW9uLgorICAgICA8L3BhcmE+CisgICAgIDxwYXJhPgor ICAgICAgVmFsaWQgcmFuZ2U6IDEuMC0xMDAuMC4gRGVmYXVsdCBpcyA8bGl0ZXJhbD41LjA8L2xp dGVyYWw+LgorICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGNoYW5nZWQgYnkgcmVsb2FkaW5n IHRoZSA8cHJvZHVjdG5hbWU+UGdwb29sLUlJPC8+IGNvbmZpZ3VyYXRpb25zLgorICAgICA8L3Bh cmE+CisgICAgPC9saXN0aXRlbT4KKyAgIDwvdmFybGlzdGVudHJ5PgorCisgICA8dmFybGlzdGVu dHJ5IGlkPSJndWMtdHJhY2stdGFibGUtbXV0YXRpb24tbWF4LXN0YWxlbmVzcyIgeHJlZmxhYmVs PSJ0cmFja190YWJsZV9tdXRhdGlvbl9tYXhfc3RhbGVuZXNzIj4KKyAgICA8dGVybT48dmFybmFt ZT50cmFja190YWJsZV9tdXRhdGlvbl9tYXhfc3RhbGVuZXNzPC92YXJuYW1lPiAoPHR5cGU+aW50 ZWdlcjwvdHlwZT4pCisgICAgIDxpbmRleHRlcm0+CisgICAgICA8cHJpbWFyeT48dmFybmFtZT50 cmFja190YWJsZV9tdXRhdGlvbl9tYXhfc3RhbGVuZXNzPC92YXJuYW1lPiBjb25maWd1cmF0aW9u IHBhcmFtZXRlcjwvcHJpbWFyeT4KKyAgICAgPC9pbmRleHRlcm0+CisgICAgPC90ZXJtPgorICAg IDxsaXN0aXRlbT4KKyAgICAgPHBhcmE+CisgICAgICBNYXhpbXVtIGR1cmF0aW9uIGluIG1pbGxp c2Vjb25kcyB0aGF0IGEgc2luZ2xlIHRhYmxlIGVudHJ5IGNhbiBjb250aW51b3VzbHkgZm9yY2Ug cXVlcmllcyB0byBwcmltYXJ5LAorICAgICAgbWVhc3VyZWQgZnJvbSB3aGVuIHRoZSB0YWJsZSB3 YXMgZmlyc3QgbWFya2VkIHN0YWxlLiBXaGVuIHRoaXMgY2FwIGlzIHJlYWNoZWQsIHRoZSBlbnRy eSBpcyBleHBpcmVkCisgICAgICByZWdhcmRsZXNzIG9mIHJlY2VudCB3cml0ZXMuIElmIHRoZSB0 YWJsZSBpcyB3cml0dGVuIHRvIGFnYWluIGFmdGVyIGV4cGlyeSwgYSBmcmVzaCB0cmFja2luZyBl bnRyeQorICAgICAgaXMgY3JlYXRlZC4KKyAgICAgPC9wYXJhPgorICAgICA8cGFyYT4KKyAgICAg IFRoaXMgcGFyYW1ldGVyIGJvdW5kcyB0aGUgY3Jvc3Mtc2Vzc2lvbiBpbXBhY3Qgb2YgdGFibGUg bXV0YXRpb24gdHJhY2tpbmcuIEV2ZW4gaWYgYSB0YWJsZSBpcyB3cml0dGVuCisgICAgICB0byBp biBhIHRpZ2h0IGxvb3AsIGl0cyBlZmZlY3Qgb24gb3RoZXIgc2Vzc2lvbnMnIGxvYWQgYmFsYW5j aW5nIGlzIGxpbWl0ZWQgdG8gdGhpcyBkdXJhdGlvbi4gRm9yCisgICAgICBsZWdpdGltYXRlbHkg YnVzeSB0YWJsZXMsIHRoZSBnYXAgYmV0d2VlbiBmb3JjZWQgZXhwaXJ5IGFuZCB0aGUgbmV4dCB3 cml0ZSByZS1tYXJraW5nIHRoZSB0YWJsZSBpcworICAgICAgbmVnbGlnaWJsZSAodHlwaWNhbGx5 IG1pbGxpc2Vjb25kcykuCisgICAgIDwvcGFyYT4KKyAgICAgPHBhcmE+CisgICAgICBTZXQgdG8g MCB0byBkaXNhYmxlIHRoZSBjYXAgKG5vdCByZWNvbW1lbmRlZCBmb3IgcHJvZHVjdGlvbikuCisg ICAgICBWYWxpZCByYW5nZTogMC0zNjAwMDAwIG1zLiBEZWZhdWx0IGlzIDxsaXRlcmFsPjYwMDAw PC9saXRlcmFsPiAoNjAgc2Vjb25kcykuCisgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgY2hh bmdlZCBieSByZWxvYWRpbmcgdGhlIDxwcm9kdWN0bmFtZT5QZ3Bvb2wtSUk8Lz4gY29uZmlndXJh dGlvbnMuCisgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgPC92YXJsaXN0ZW50cnk+ CisKKyAgIDx2YXJsaXN0ZW50cnkgaWQ9Imd1Yy10cmFjay10YWJsZS1tdXRhdGlvbi1jb2xkLXN0 YXJ0LWR1cmF0aW9uIiB4cmVmbGFiZWw9InRyYWNrX3RhYmxlX211dGF0aW9uX2NvbGRfc3RhcnRf ZHVyYXRpb24iPgorICAgIDx0ZXJtPjx2YXJuYW1lPnRyYWNrX3RhYmxlX211dGF0aW9uX2NvbGRf c3RhcnRfZHVyYXRpb248L3Zhcm5hbWU+ICg8dHlwZT5pbnRlZ2VyPC90eXBlPikKKyAgICAgPGlu ZGV4dGVybT4KKyAgICAgIDxwcmltYXJ5Pjx2YXJuYW1lPnRyYWNrX3RhYmxlX211dGF0aW9uX2Nv bGRfc3RhcnRfZHVyYXRpb248L3Zhcm5hbWU+IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyPC9wcmlt YXJ5PgorICAgICA8L2luZGV4dGVybT4KKyAgICA8L3Rlcm0+CisgICAgPGxpc3RpdGVtPgorICAg ICA8cGFyYT4KKyAgICAgIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyB0byByb3V0ZSBhbGwgcXVl cmllcyB0byBwcmltYXJ5IGFmdGVyIGEgY2hpbGQgcHJvY2VzcyBzdGFydHMuCisgICAgICBUaGlz IHByZXZlbnRzIHN0YWxlIHJlYWRzIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hl ZCBiZWZvcmUgdGhlIHRyYWNrIHRhYmxlIG11dGF0aW9uCisgICAgICBpcyBwb3B1bGF0ZWQgd2l0 aCByZWNlbnQgd3JpdGUgaGlzdG9yeS4KKyAgICAgPC9wYXJhPgorICAgICA8cGFyYT4KKyAgICAg IFdoZW4gd2F0Y2hkb2cgaXMgZW5hYmxlZCBhbmQgdGhlIGxvY2FsIG5vZGUgYmVjb21lcyB0aGUg bGVhZGVyLCBQZ3Bvb2wtSUkgYWxzbyB0cmlnZ2VycyBhCisgICAgICBnbG9iYWwgY29sZCBzdGFy dCBmb3IgdGhpcyBkdXJhdGlvbiB0byBhdm9pZCBzdGFsZSByZWFkcyBhZnRlciBsZWFkZXJzaGlw IGNoYW5nZXMuCisgICAgIDwvcGFyYT4KKyAgICAgPHBhcmE+CisgICAgICBWYWxpZCByYW5nZTog MC02MDAwMCBtcy4gRGVmYXVsdCBpcyA8bGl0ZXJhbD4yMDAwPC9saXRlcmFsPiAoMiBzZWNvbmRz KS4KKyAgICAgIFNldCB0byAwIHRvIGRpc2FibGUgY29sZCBzdGFydCBiZWhhdmlvci4KKyAgICAg IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBjaGFuZ2VkIGJ5IHJlbG9hZGluZyB0aGUgPHByb2R1Y3Ru YW1lPlBncG9vbC1JSTwvPiBjb25maWd1cmF0aW9ucy4KKyAgICAgPC9wYXJhPgorICAgIDwvbGlz dGl0ZW0+CisgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgPHZhcmxpc3RlbnRyeSBpZD0iZ3VjLXRy YWNrLXRhYmxlLW11dGF0aW9uLXRhYmxlLWJ1Y2tldHMiIHhyZWZsYWJlbD0idHJhY2tfdGFibGVf bXV0YXRpb25fdGFibGVfYnVja2V0cyI+CisgICAgPHRlcm0+PHZhcm5hbWU+dHJhY2tfdGFibGVf bXV0YXRpb25fdGFibGVfYnVja2V0czwvdmFybmFtZT4gKDx0eXBlPmludGVnZXI8L3R5cGU+KQor ICAgICA8aW5kZXh0ZXJtPgorICAgICAgPHByaW1hcnk+PHZhcm5hbWU+dHJhY2tfdGFibGVfbXV0 YXRpb25fdGFibGVfYnVja2V0czwvdmFybmFtZT4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI8L3By aW1hcnk+CisgICAgIDwvaW5kZXh0ZXJtPgorICAgIDwvdGVybT4KKyAgICA8bGlzdGl0ZW0+Cisg ICAgIDxwYXJhPgorICAgICAgTnVtYmVyIG9mIGhhc2ggYnVja2V0cyBmb3IgdGhlIHRyYWNrIHRh YmxlIG11dGF0aW9uIGhhc2ggdGFibGUuCisgICAgICBIaWdoZXIgdmFsdWVzIHJlZHVjZSBoYXNo IGNvbGxpc2lvbnMgYW5kIGltcHJvdmUgbG9va3VwIHBlcmZvcm1hbmNlLgorICAgICA8L3BhcmE+ CisgICAgIDxwYXJhPgorICAgICAgVmFsaWQgcmFuZ2U6IDY0LTY1NTM2LiBEZWZhdWx0IGlzIDxs aXRlcmFsPjEwMjQ8L2xpdGVyYWw+LgorICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIG9ubHkgYmUg c2V0IGF0IHNlcnZlciBzdGFydC4KKyAgICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgICA8 L3Zhcmxpc3RlbnRyeT4KKworICAgPHZhcmxpc3RlbnRyeSBpZD0iZ3VjLXRyYWNrLXRhYmxlLW11 dGF0aW9uLXRhYmxlLXNpemUiIHhyZWZsYWJlbD0idHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVf c2l6ZSI+CisgICAgPHRlcm0+PHZhcm5hbWU+dHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfc2l6 ZTwvdmFybmFtZT4gKDx0eXBlPmludGVnZXI8L3R5cGU+KQorICAgICA8aW5kZXh0ZXJtPgorICAg ICAgPHByaW1hcnk+PHZhcm5hbWU+dHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfc2l6ZTwvdmFy bmFtZT4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI8L3ByaW1hcnk+CisgICAgIDwvaW5kZXh0ZXJt PgorICAgIDwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgIDxwYXJhPgorICAgICAgTWF4aW11 bSBudW1iZXIgb2YgdGFibGVzIHRoYXQgY2FuIGJlIHRyYWNrZWQgc2ltdWx0YW5lb3VzbHkgaW4g dGhlIHRyYWNrIHRhYmxlIG11dGF0aW9uLgorICAgICAgV2hlbiBmdWxsLCBvbGRlc3QgZW50cmll cyBhcmUgZXZpY3RlZCB1c2luZyBhIHNpbXBsZSBldmljdGlvbiBzdHJhdGVneS4KKyAgICAgPC9w YXJhPgorICAgICA8cGFyYT4KKyAgICAgIFZhbGlkIHJhbmdlOiAxMjgtMTMxMDcyLiBEZWZhdWx0 IGlzIDxsaXRlcmFsPjIwNDg8L2xpdGVyYWw+LgorICAgICAgTWVtb3J5IHVzYWdlOiBhcHByb3hp bWF0ZWx5IDQwIGJ5dGVzIHBlciBlbnRyeS4KKyAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBvbmx5 IGJlIHNldCBhdCBzZXJ2ZXIgc3RhcnQuCisgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgor ICAgPC92YXJsaXN0ZW50cnk+CisKKyAgPC92YXJpYWJsZWxpc3Q+CisKKyAgPHNlY3QzIGlkPSJy dW50aW1lLWNvbmZpZy10cmFjay10YWJsZS1tdXRhdGlvbi1leGFtcGxlIj4KKyAgIDx0aXRsZT5U cmFjayBUYWJsZSBNdXRhdGlvbiBDb25maWd1cmF0aW9uIEV4YW1wbGU8L3RpdGxlPgorICAgPHBh cmE+CisgICAgVG8gZW5hYmxlIHRyYWNrIHRhYmxlIG11dGF0aW9uIHdpdGggcmVwbGljYXRpb24g ZGVsYXkgbW9uaXRvcmluZzoKKyAgIDwvcGFyYT4KKyAgIDxwcm9ncmFtbGlzdGluZz4KKyMgRW5h YmxlIGRtbF9hZGFwdGl2ZV9nbG9iYWwgbW9kZSAoaW5jbHVkZXMgdHJhY2sgdGFibGUgbXV0YXRp b24pCitkaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSA9ICdkbWxfYWRhcHRpdmVfZ2xvYmFs JwordHJhY2tfdGFibGVfbXV0YXRpb25fdHRsX2ZhY3RvciA9IDUuMAordHJhY2tfdGFibGVfbXV0 YXRpb25fbWF4X3N0YWxlbmVzcyA9IDYwMDAwCit0cmFja190YWJsZV9tdXRhdGlvbl9jb2xkX3N0 YXJ0X2R1cmF0aW9uID0gMjAwMAorCisjIE9wdGlvbiBBOiBVc2UgZXh0ZXJuYWwgY29tbWFuZCBm b3IgcmVwbGljYXRpb24gZGVsYXkKK3JlcGxpY2F0aW9uX2RlbGF5X3NvdXJjZV9jbWQgPSAnL3Bh dGgvdG8vZ2V0LXJlcGxpY2F0aW9uLWRlbGF5LnNoJworcmVwbGljYXRpb25fZGVsYXlfc291cmNl X3RpbWVvdXQgPSAxMAorCisjIE9wdGlvbiBCOiBVc2UgcGdfc3RhdF9yZXBsaWNhdGlvbiByZXBs YXlfbGFnIChQRyAxMCspCisjIGRlbGF5X3RocmVzaG9sZF9ieV90aW1lID0gMTAwMAorCisjIEFk anVzdCB0YWJsZSBtYXAgc2l6ZSBiYXNlZCBvbiB3b3JrbG9hZAordHJhY2tfdGFibGVfbXV0YXRp b25fdGFibGVfc2l6ZSA9IDQwOTYKKyAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICA8cGFyYT4KKyAg ICBTaGFyZWQgbWVtb3J5IHJlcXVpcmVkIGZvciBhYm92ZSBjb25maWd1cmF0aW9uOiBhcHByb3hp bWF0ZWx5IDE2MCBLQiBmb3IgdGhlIHRhYmxlIG1hcC4KKyAgICBEZWZhdWx0IGNvbmZpZ3VyYXRp b24gKDIwNDggdGFibGVzKSByZXF1aXJlcyBhcHByb3hpbWF0ZWx5IDgwIEtCLgorICAgPC9wYXJh PgorICA8L3NlY3QzPgorCisgIDxzZWN0MyBpZD0icnVudGltZS1jb25maWctdHJhY2stdGFibGUt bXV0YXRpb24tbGltaXRhdGlvbnMiPgorICAgPHRpdGxlPkxpbWl0YXRpb25zPC90aXRsZT4KKyAg IDxwYXJhPgorICAgIFRoZSB0cmFjayB0YWJsZSBtdXRhdGlvbiBmZWF0dXJlIGhhcyB0aGUgZm9s bG93aW5nIGxpbWl0YXRpb25zOgorICAgPC9wYXJhPgorICAgPGl0ZW1pemVkbGlzdD4KKyAgICA8 bGlzdGl0ZW0+CisgICAgIDxwYXJhPgorICAgICAgPGxpdGVyYWw+UFJFUEFSRTwvbGl0ZXJhbD4g c3RhdGVtZW50cyBhcmUgbm90IHRyYWNrZWQuIFdoZW4gYSBwcmVwYXJlZCBzdGF0ZW1lbnQKKyAg ICAgIGNvbnRhaW5pbmcgZGF0YSBtb2RpZmljYXRpb24gaXMgZXhlY3V0ZWQsIHRoZSB0YWJsZSBt dXRhdGlvbiBpcyBub3QgcmVjb3JkZWQuCisgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgor ICAgIDxsaXN0aXRlbT4KKyAgICAgPHBhcmE+CisgICAgICBBIG1heGltdW0gb2YgMTI4IHRhYmxl cyBjYW4gYmUgdHJhY2tlZCBwZXIgU0VMRUNUIHF1ZXJ5IGZvciBzdGFsZW5lc3MgY2hlY2tpbmcu CisgICAgICBUaGlzIGxpbWl0IGlzIHNoYXJlZCB3aXRoIHRoZSBxdWVyeSBjYWNoZSBzdWJzeXN0 ZW0KKyAgICAgICg8bGl0ZXJhbD5QT09MX01BWF9TRUxFQ1RfT0lEUzwvbGl0ZXJhbD4pLgorICAg ICA8L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgIDwvaXRlbWl6ZWRsaXN0PgorICAgPHBhcmE+ CisgICAgSWYgeW91ciBhcHBsaWNhdGlvbiB1c2VzIHByZXBhcmVkIHN0YXRlbWVudHMgYW5kIHJl cXVpcmVzIHJlYWQtYWZ0ZXItd3JpdGUgY29uc2lzdGVuY3ksCisgICAgY29uc2lkZXIgdXNpbmcg ZXhwbGljaXQgdHJhbnNhY3Rpb24gcm91dGluZyBvciB0aGUgPGxpdGVyYWw+LypOTyBMT0FEIEJB TEFOQ0UqLzwvbGl0ZXJhbD4KKyAgICBjb21tZW50IGRpcmVjdGl2ZSBmb3IgYWZmZWN0ZWQgcXVl cmllcy4KKyAgIDwvcGFyYT4KKyAgIDxwYXJhPgorICAgIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50 IHR5cGVzIDxlbXBoYXNpcz5hcmU8L2VtcGhhc2lzPiB0cmFja2VkIGFuZCB3aWxsIG1hcmsgdGFi bGVzIGFzIHN0YWxlOgorICAgPC9wYXJhPgorICAgPGl0ZW1pemVkbGlzdD4KKyAgICA8bGlzdGl0 ZW0+CisgICAgIDxwYXJhPgorICAgICAgPGxpdGVyYWw+SU5TRVJUPC9saXRlcmFsPiwgPGxpdGVy YWw+VVBEQVRFPC9saXRlcmFsPiwgPGxpdGVyYWw+REVMRVRFPC9saXRlcmFsPgorICAgICAgc3Rh dGVtZW50cyAoaW5jbHVkaW5nIHRob3NlIHdpdGggPGxpdGVyYWw+UkVUVVJOSU5HPC9saXRlcmFs PiBjbGF1c2VzKS4KKyAgICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVt PgorICAgICA8cGFyYT4KKyAgICAgIDxsaXRlcmFsPlRSVU5DQVRFPC9saXRlcmFsPiBzdGF0ZW1l bnRzIChpbmNsdWRpbmcgbXVsdGlwbGUgdGFibGVzKS4KKyAgICAgPC9wYXJhPgorICAgIDwvbGlz dGl0ZW0+CisgICAgPGxpc3RpdGVtPgorICAgICA8cGFyYT4KKyAgICAgIDxsaXRlcmFsPk1FUkdF PC9saXRlcmFsPiBzdGF0ZW1lbnRzIChQb3N0Z3JlU1FMIDE1KykuCisgICAgIDwvcGFyYT4KKyAg ICA8L2xpc3RpdGVtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgPHBhcmE+CisgICAgICA8bGl0ZXJh bD5XSVRIPC9saXRlcmFsPiBjbGF1c2VzIGNvbnRhaW5pbmcgZGF0YSBtb2RpZmljYXRpb25zIChD b21tb24gVGFibGUgRXhwcmVzc2lvbnMKKyAgICAgIHdpdGggPGxpdGVyYWw+SU5TRVJUPC9saXRl cmFsPiwgPGxpdGVyYWw+VVBEQVRFPC9saXRlcmFsPiwgb3IgPGxpdGVyYWw+REVMRVRFPC9saXRl cmFsPikuCisgICAgICBGb3IgZXhhbXBsZSwgPGxpdGVyYWw+V0lUSCBkZWxldGVkIEFTIChERUxF VEUgRlJPTSB0MSBSRVRVUk5JTkcgKikgU0VMRUNUICogRlJPTSBkZWxldGVkPC9saXRlcmFsPgor ICAgICAgd2lsbCBwcm9wZXJseSBtYXJrIHRhYmxlIDxsaXRlcmFsPnQxPC9saXRlcmFsPiBhcyBz dGFsZS4KKyAgICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgICA8L2l0ZW1pemVkbGlzdD4K KyAgIDxwYXJhPgorICAgIDxlbXBoYXNpcz5UcmFuc2FjdGlvbiBSb2xsYmFjayBCZWhhdmlvcjo8 L2VtcGhhc2lzPiBXaXRoaW4gZXhwbGljaXQgdHJhbnNhY3Rpb25zLCB0YWJsZXMKKyAgICBhcmUg b25seSBtYXJrZWQgYXMgc3RhbGUgaW4gc2hhcmVkIG1lbW9yeSB3aGVuIHRoZSB0cmFuc2FjdGlv biBpcyBjb21taXR0ZWQuIElmIHRoZQorICAgIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrLCBu byB0YWJsZXMgYXJlIG1hcmtlZCwgc2luY2Ugbm8gYWN0dWFsIGRhdGEgbW9kaWZpY2F0aW9uCisg ICAgb2NjdXJyZWQgb24gcmVwbGljYXMuIFRoaXMgcHJldmVudHMgcm9sbGVkLWJhY2sgdHJhbnNh Y3Rpb25zIGZyb20gdW5uZWNlc3NhcmlseQorICAgIGRpc2FibGluZyBsb2FkIGJhbGFuY2luZy4g Rm9yIGF1dG9jb21taXQgc3RhdGVtZW50cyAob3V0c2lkZSBleHBsaWNpdCB0cmFuc2FjdGlvbnMp LAorICAgIHRhYmxlcyBhcmUgbWFya2VkIGltbWVkaWF0ZWx5IHVwb24gY29tbWFuZCBjb21wbGV0 aW9uLgorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICA8ZW1waGFzaXM+Q3Jvc3MtU2Vzc2lv biBJbXBhY3QgYW5kIFNhZmV0eSBCb3VuZHM6PC9lbXBoYXNpcz4KKyAgICBVbmxpa2UgPGxpdGVy YWw+ZG1sX2FkYXB0aXZlPC9saXRlcmFsPiAod2hpY2ggb25seSBhZmZlY3RzIHRoZSBzZXNzaW9u IHRoYXQgaXNzdWVkIHRoZSB3cml0ZSksCisgICAgPGxpdGVyYWw+ZG1sX2FkYXB0aXZlX2dsb2Jh bDwvbGl0ZXJhbD4gYWZmZWN0cyBhbGwgc2Vzc2lvbnMgcmVhZGluZyB0aGUgc2FtZSB0YWJsZSBp biB0aGUgc2FtZSBkYXRhYmFzZS4KKyAgICBUaGUgZm9sbG93aW5nIHNhZmV0eSBtZWNoYW5pc21z IGJvdW5kIHRoaXMgY3Jvc3Mtc2Vzc2lvbiBpbXBhY3Q6CisgICA8L3BhcmE+CisgICA8aXRlbWl6 ZWRsaXN0PgorICAgIDxsaXN0aXRlbT4KKyAgICAgPHBhcmE+CisgICAgICA8ZW1waGFzaXM+TWF4 aW11bSBzdGFsZW5lc3MgY2FwOjwvZW1waGFzaXM+IFRoZSA8eHJlZiBsaW5rZW5kPSJndWMtdHJh Y2stdGFibGUtbXV0YXRpb24tbWF4LXN0YWxlbmVzcyI+CisgICAgICBwYXJhbWV0ZXIgKGRlZmF1 bHQ6IDYwIHNlY29uZHMpIGxpbWl0cyBob3cgbG9uZyBhbnkgc2luZ2xlIHRhYmxlIGVudHJ5IGNh biBjb250aW51b3VzbHkgZm9yY2UgcHJpbWFyeQorICAgICAgcm91dGluZy4gRXZlbiB1bmRlciBz dXN0YWluZWQgd3JpdGVzLCB0aGUgZW50cnkgZXhwaXJlcyBhZnRlciB0aGlzIHBlcmlvZCBhbmQg aXMgb25seSByZW5ld2VkIGJ5CisgICAgICBzdWJzZXF1ZW50IGNvbW1pdHRlZCB3cml0ZXMuCisg ICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgPHBhcmE+ CisgICAgICA8ZW1waGFzaXM+RGF0YWJhc2UgaXNvbGF0aW9uOjwvZW1waGFzaXM+IFRhYmxlIHN0 YWxlbmVzcyB0cmFja2luZyBpcyBzY29wZWQgYnkgZGF0YWJhc2UgT0lELiBXcml0ZXMKKyAgICAg IGluIG9uZSBkYXRhYmFzZSBuZXZlciBhZmZlY3QgbG9hZCBiYWxhbmNpbmcgZGVjaXNpb25zIGZv ciBzZXNzaW9ucyBjb25uZWN0ZWQgdG8gYSBkaWZmZXJlbnQgZGF0YWJhc2UuCisgICAgICBJbiBt dWx0aS10ZW5hbnQgZGVwbG95bWVudHMgd2hlcmUgdGVuYW50cyB1c2Ugc2VwYXJhdGUgZGF0YWJh c2VzLCBvbmUgdGVuYW50J3Mgd3JpdGUgYWN0aXZpdHkgY2Fubm90CisgICAgICBpbmZsdWVuY2Ug YW5vdGhlciB0ZW5hbnQncyBxdWVyeSByb3V0aW5nLgorICAgICA8L3BhcmE+CisgICAgPC9saXN0 aXRlbT4KKyAgICA8bGlzdGl0ZW0+CisgICAgIDxwYXJhPgorICAgICAgPGVtcGhhc2lzPkNvbW1p dHRlZCB3cml0ZXMgb25seTo8L2VtcGhhc2lzPiBPbmx5IGNvbW1pdHRlZCB0cmFuc2FjdGlvbnMg bWFyayB0YWJsZXMgYXMgc3RhbGUuCisgICAgICBSb2xsZWQtYmFjayB0cmFuc2FjdGlvbnMgaGF2 ZSBubyBlZmZlY3Qgb24gdGhlIHNoYXJlZCB0cmFja2luZyBzdGF0ZS4KKyAgICAgPC9wYXJhPgor ICAgIDwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPgorICAgICA8cGFyYT4KKyAgICAgIDxlbXBo YXNpcz5Cb3VuZGVkIHRhYmxlIG1hcCBzaXplOjwvZW1waGFzaXM+IFRoZSBzaGFyZWQgbWVtb3J5 IHRhYmxlIG1hcCBoYXMgYSBmaXhlZCBtYXhpbXVtIHNpemUKKyAgICAgICg8eHJlZiBsaW5rZW5k PSJndWMtdHJhY2stdGFibGUtbXV0YXRpb24tdGFibGUtc2l6ZSI+KS4gQXQgbW9zdCB0aGlzIG1h bnkgdGFibGVzIGNhbiBiZSBtYXJrZWQgc3RhbGUKKyAgICAgIHNpbXVsdGFuZW91c2x5LCBwcm92 aWRpbmcgYSBuYXR1cmFsIGNlaWxpbmcgb24gdGhlIGZlYXR1cmUncyBpbXBhY3QuCisgICAgIDwv cGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgPC9pdGVtaXplZGxpc3Q+CisgIDwvc2VjdDM+CisK KyA8L3NlY3QyPgorCiA8L3NlY3QxPgpkaWZmIC0tZ2l0IGEvc3JjL01ha2VmaWxlLmFtIGIvc3Jj L01ha2VmaWxlLmFtCmluZGV4IDQ2NzhhYjUzMC4uMzk1ODhhZjU4IDEwMDY0NAotLS0gYS9zcmMv TWFrZWZpbGUuYW0KKysrIGIvc3JjL01ha2VmaWxlLmFtCkBAIC0zNSw2ICszNSw3IEBAIHBncG9v bF9TT1VSQ0VTID0gbWFpbi9tYWluLmMgXAogCXJld3JpdGUvcG9vbF90aW1lc3RhbXAuYyBcCiAJ cmV3cml0ZS9wb29sX2xvYmouYyBcCiAJdXRpbHMvcG9vbF9zZWxlY3Rfd2Fsa2VyLmMgXAorCXV0 aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24uYyBcCiAJdXRpbHMvc3RybGNweS5jIFwKIAl1 dGlscy9wc3ByaW50Zi5jIFwKIAl1dGlscy9wb29sX3BhcmFtcy5jIFwKZGlmZiAtLWdpdCBhL3Ny Yy9jb25maWcvcG9vbF9jb25maWdfdmFyaWFibGVzLmMgYi9zcmMvY29uZmlnL3Bvb2xfY29uZmln X3ZhcmlhYmxlcy5jCmluZGV4IGI3NzViMjEwNi4uMzAzOWUzMmYwIDEwMDY0NAotLS0gYS9zcmMv Y29uZmlnL3Bvb2xfY29uZmlnX3ZhcmlhYmxlcy5jCisrKyBiL3NyYy9jb25maWcvcG9vbF9jb25m aWdfdmFyaWFibGVzLmMKQEAgLTI5MCw2ICsyOTAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGNv bmZpZ19lbnVtX2VudHJ5IGRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlX29wdGlvbnNbXSA9 CiAJeyJ0cmFuc190cmFuc2FjdGlvbiIsIERMQk9XX1RSQU5TX1RSQU5TQUNUSU9OLCBmYWxzZX0s CiAJeyJhbHdheXMiLCBETEJPV19BTFdBWVMsIGZhbHNlfSwKIAl7ImRtbF9hZGFwdGl2ZSIsIERM Qk9XX0RNTF9BREFQVElWRSwgZmFsc2V9LAorCXsiZG1sX2FkYXB0aXZlX2dsb2JhbCIsIERMQk9X X0RNTF9BREFQVElWRV9HTE9CQUwsIGZhbHNlfSwKIAl7TlVMTCwgMCwgZmFsc2V9CiB9OwogCkBA IC0xNzc3LDYgKzE3NzgsMTkgQEAgc3RhdGljIHN0cnVjdCBjb25maWdfaW50X2FycmF5IENvbmZp Z3VyZU5hbWVzSW50QXJyYXlbXSA9CiAKIHN0YXRpYyBzdHJ1Y3QgY29uZmlnX2RvdWJsZSBDb25m aWd1cmVOYW1lc0RvdWJsZVtdID0KIHsKKwl7CisJCXsidHJhY2tfdGFibGVfbXV0YXRpb25fdHRs X2ZhY3RvciIsCisJCQlDRkdDWFRfUkVMT0FELCBMT0FEX0JBTEFOQ0VfQ09ORklHLAorCQkJIlRU TCBtdWx0aXBsaWVyIGZvciB0cmFjayB0YWJsZSBtdXRhdGlvbiAiCisJCQkiKFRUTCA9IHJlcGxp Y2F0aW9uX2RlbGF5ICogZmFjdG9yKSIsCisJCQlDT05GSUdfVkFSX1RZUEVfRE9VQkxFLCBmYWxz ZSwgMAorCQl9LAorCQkmZ19wb29sX2NvbmZpZy50cmFja190YWJsZV9tdXRhdGlvbl90dGxfZmFj dG9yLAorCQk1LjAsCQkJCQkvKiBib290IHZhbHVlOiA1eCByZXBsaWNhdGlvbiBkZWxheSAqLwor CQkxLjAsIDEwMC4wLAkJCQkvKiBtaW4sIG1heCAqLworCQlOVUxMLCBOVUxMLCBOVUxMCisJfSwK KwogCS8qIEVuZC1vZi1saXN0IG1hcmtlciAqLwogCUVNUFRZX0NPTkZJR19ET1VCTEUKIH07CkBA IC0yMzk3LDYgKzI0MTEsNTcgQEAgc3RhdGljIHN0cnVjdCBjb25maWdfaW50IENvbmZpZ3VyZU5h bWVzSW50W10gPQogCQlOVUxMLCBOVUxMLCBOVUxMCiAJfSwKIAorCXsKKwkJeyJ0cmFja190YWJs ZV9tdXRhdGlvbl9tYXhfc3RhbGVuZXNzIiwKKwkJCUNGR0NYVF9SRUxPQUQsIExPQURfQkFMQU5D RV9DT05GSUcsCisJCQkiTWF4aW11bSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdGhhdCBhICIK KwkJCSJ0YWJsZSBjYW4gYmUgbWFya2VkIHN0YWxlIGZyb20gaXRzIGZpcnN0ICIKKwkJCSJ3cml0 ZS4gMCBkaXNhYmxlcyB0aGUgY2FwLiIsCisJCQlDT05GSUdfVkFSX1RZUEVfSU5ULCBmYWxzZSwg R1VDX1VOSVRfTVMKKwkJfSwKKwkJJmdfcG9vbF9jb25maWcudHJhY2tfdGFibGVfbXV0YXRpb25f bWF4X3N0YWxlbmVzcywKKwkJNjAwMDAsCQkJCQkvKiA2MCBzZWNvbmRzICovCisJCTAsIDM2MDAw MDAsCQkJCS8qIDAgdG8gMSBob3VyICovCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAorCisJewor CQl7InRyYWNrX3RhYmxlX211dGF0aW9uX2NvbGRfc3RhcnRfZHVyYXRpb24iLAorCQkJQ0ZHQ1hU X1JFTE9BRCwgTE9BRF9CQUxBTkNFX0NPTkZJRywKKwkJCSJEdXJhdGlvbiBpbiBtaWxsaXNlY29u ZHMgdG8gZm9yY2UgcXVlcmllcyAiCisJCQkidG8gcHJpbWFyeSBhZnRlciBjaGlsZCBwcm9jZXNz IHN0YXJ0cy4iLAorCQkJQ09ORklHX1ZBUl9UWVBFX0lOVCwgZmFsc2UsIEdVQ19VTklUX01TCisJ CX0sCisJCSZnX3Bvb2xfY29uZmlnLnRyYWNrX3RhYmxlX211dGF0aW9uX2NvbGRfc3RhcnRfZHVy YXRpb24sCisJCTIwMDAsCQkJCQkvKiAyIHNlY29uZHMgKi8KKwkJMCwgNjAwMDAsCQkJCS8qIDAg dG8gNjAgc2Vjb25kcyAqLworCQlOVUxMLCBOVUxMLCBOVUxMCisJfSwKKworCXsKKwkJeyJ0cmFj a190YWJsZV9tdXRhdGlvbl90YWJsZV9idWNrZXRzIiwKKwkJCUNGR0NYVF9JTklULCBMT0FEX0JB TEFOQ0VfQ09ORklHLAorCQkJIk51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIHRyYWNrIHRhYmxl IG11dGF0aW9uLiIsCisJCQlDT05GSUdfVkFSX1RZUEVfSU5ULCBmYWxzZSwgMAorCQl9LAorCQkm Z19wb29sX2NvbmZpZy50cmFja190YWJsZV9tdXRhdGlvbl90YWJsZV9idWNrZXRzLAorCQkxMDI0 LAorCQk2NCwgNjU1MzYsCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAorCisJeworCQl7InRyYWNr X3RhYmxlX211dGF0aW9uX3RhYmxlX3NpemUiLAorCQkJQ0ZHQ1hUX0lOSVQsIExPQURfQkFMQU5D RV9DT05GSUcsCisJCQkiTWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiB0cmFjayB0YWJsZSBt dXRhdGlvbi4iLAorCQkJQ09ORklHX1ZBUl9UWVBFX0lOVCwgZmFsc2UsIDAKKwkJfSwKKwkJJmdf cG9vbF9jb25maWcudHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfc2l6ZSwKKwkJMjA0OCwKKwkJ MTI4LCAxMzEwNzIsCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAorCiAJLyogRW5kLW9mLWxpc3Qg bWFya2VyICovCiAJRU1QVFlfQ09ORklHX0lOVAogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb250ZXh0 L3Bvb2xfcXVlcnlfY29udGV4dC5jIGIvc3JjL2NvbnRleHQvcG9vbF9xdWVyeV9jb250ZXh0LmMK aW5kZXggYTA1NmFjNTk2Li5jMjBhM2E0MjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb250ZXh0L3Bvb2xf cXVlcnlfY29udGV4dC5jCisrKyBiL3NyYy9jb250ZXh0L3Bvb2xfcXVlcnlfY29udGV4dC5jCkBA IC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAidXRpbHMvc3RhdGlzdGljcy5oIgogI2luY2x1ZGUg InV0aWxzL3Bvb2xfc2VsZWN0X3dhbGtlci5oIgogI2luY2x1ZGUgInV0aWxzL3Bvb2xfc3RyZWFt LmgiCisjaW5jbHVkZSAidXRpbHMvcG9vbF90cmFja190YWJsZV9tdXRhdGlvbi5oIgogI2luY2x1 ZGUgImNvbnRleHQvcG9vbF9zZXNzaW9uX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb250ZXh0L3Bv b2xfcXVlcnlfY29udGV4dC5oIgogI2luY2x1ZGUgInBhcnNlci9ub2Rlcy5oIgpAQCAtMTgyOCwy MCArMTgyOSwyNiBAQCBpc19pbl9saXN0KGNoYXIgKm5hbWUsIExpc3QgKmxpc3QpCiBzdGF0aWMg Ym9vbAogaXNfc2VsZWN0X29iamVjdF9pbl90ZW1wX3dyaXRlX2xpc3QoTm9kZSAqbm9kZSwgdm9p ZCAqY29udGV4dCkKIHsKLQlpZiAobm9kZSA9PSBOVUxMIHx8IHBvb2xfY29uZmlnLT5kaXNhYmxl X2xvYWRfYmFsYW5jZV9vbl93cml0ZSAhPSBETEJPV19ETUxfQURBUFRJVkUpCisJaWYgKG5vZGUg PT0gTlVMTCB8fAorCQkhRExCT1dfSVNfRE1MX0FEQVBUSVZFKHBvb2xfY29uZmlnLT5kaXNhYmxl X2xvYWRfYmFsYW5jZV9vbl93cml0ZSkpCiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChJc0Eobm9k ZSwgUmFuZ2VWYXIpKQogCXsKIAkJUmFuZ2VWYXIgICAqcmd2ID0gKFJhbmdlVmFyICopIG5vZGU7 Ci0JCVBPT0xfU0VTU0lPTl9DT05URVhUICpzZXNzaW9uX2NvbnRleHQgPSBwb29sX2dldF9zZXNz aW9uX2NvbnRleHQoZmFsc2UpOworCQlQT09MX1NFU1NJT05fQ09OVEVYVCAqc2Vzc2lvbl9jb250 ZXh0OwogCi0JCWlmIChwb29sX2NvbmZpZy0+ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3JpdGUg PT0gRExCT1dfRE1MX0FEQVBUSVZFICYmIHNlc3Npb25fY29udGV4dC0+aXNfaW5fdHJhbnNhY3Rp b24pCisJCXNlc3Npb25fY29udGV4dCA9IHBvb2xfZ2V0X3Nlc3Npb25fY29udGV4dChmYWxzZSk7 CisKKwkJaWYgKHNlc3Npb25fY29udGV4dC0+aXNfaW5fdHJhbnNhY3Rpb24pCiAJCXsKIAkJCWVy ZXBvcnQoREVCVUcxLAotCQkJCQkoZXJybXNnKCJpc19zZWxlY3Rfb2JqZWN0X2luX3RlbXBfd3Jp dGVfbGlzdDogXCIlc1wiLCBmb3VuZCByZWxhdGlvbiBcIiVzXCIiLCAoY2hhciAqKSBjb250ZXh0 LCByZ3YtPnJlbG5hbWUpKSk7CisJCQkJCShlcnJtc2coImlzX3NlbGVjdF9vYmplY3RfaW5fdGVt cF93cml0ZV9saXN0OiIKKwkJCQkJCQkiIFwiJXNcIiwgZm91bmQgcmVsYXRpb24gXCIlc1wiIiwK KwkJCQkJCQkoY2hhciAqKSBjb250ZXh0LCByZ3YtPnJlbG5hbWUpKSk7CiAKLQkJCXJldHVybiBp c19pbl9saXN0KHJndi0+cmVsbmFtZSwgc2Vzc2lvbl9jb250ZXh0LT50cmFuc2FjdGlvbl90ZW1w X3dyaXRlX2xpc3QpOworCQkJcmV0dXJuIGlzX2luX2xpc3Qocmd2LT5yZWxuYW1lLAorCQkJCQkJ CSAgc2Vzc2lvbl9jb250ZXh0LT50cmFuc2FjdGlvbl90ZW1wX3dyaXRlX2xpc3QpOwogCQl9CiAJ fQogCkBAIC0xODgwLDE1ICsxODg3LDIyIEBAIHN0YXRpYyBjaGFyICpnZXRfYXNzb2NpYXRlZF9v YmplY3RfZnJvbV9kbWxfYWRhcHRpdmVfcmVsYXRpb25zCiB2b2lkCiBjaGVja19vYmplY3RfcmVs YXRpb25zaGlwX2xpc3QoY2hhciAqbmFtZSwgYm9vbCBpc19mdW5jX25hbWUpCiB7Ci0JaWYgKHBv b2xfY29uZmlnLT5kaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSA9PSBETEJPV19ETUxfQURB UFRJVkUgJiYgcG9vbF9jb25maWctPnBhcnNlZF9kbWxfYWRhcHRpdmVfb2JqZWN0X3JlbGF0aW9u c2hpcF9saXN0KQorCWJvb2wJCWlzX2FkYXB0aXZlOworCisJaXNfYWRhcHRpdmUgPQorCQkocG9v bF9jb25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlID09CisJCSBETEJPV19ETUxf QURBUFRJVkUpOworCisJaWYgKGlzX2FkYXB0aXZlICYmCisJCXBvb2xfY29uZmlnLT5wYXJzZWRf ZG1sX2FkYXB0aXZlX29iamVjdF9yZWxhdGlvbnNoaXBfbGlzdCkKIAl7CiAJCVBPT0xfU0VTU0lP Tl9DT05URVhUICpzZXNzaW9uX2NvbnRleHQgPSBwb29sX2dldF9zZXNzaW9uX2NvbnRleHQoZmFs c2UpOwogCiAJCWlmIChzZXNzaW9uX2NvbnRleHQtPmlzX2luX3RyYW5zYWN0aW9uKQogCQl7CiAJ CQljaGFyCSAgICpyaWdodF90b2tlbiA9Ci0JCQkJZ2V0X2Fzc29jaWF0ZWRfb2JqZWN0X2Zyb21f ZG1sX2FkYXB0aXZlX3JlbGF0aW9ucwotCQkJCShuYW1lLCBpc19mdW5jX25hbWUgPyBPQkpFQ1Rf VFlQRV9GVU5DVElPTiA6IE9CSkVDVF9UWVBFX1JFTEFUSU9OKTsKKwkJCWdldF9hc3NvY2lhdGVk X29iamVjdF9mcm9tX2RtbF9hZGFwdGl2ZV9yZWxhdGlvbnMKKwkJCShuYW1lLCBpc19mdW5jX25h bWUgPyBPQkpFQ1RfVFlQRV9GVU5DVElPTiA6IE9CSkVDVF9UWVBFX1JFTEFUSU9OKTsKIAogCQkJ aWYgKHJpZ2h0X3Rva2VuKQogCQkJewpAQCAtMTk0Nyw3ICsxOTYxLDcgQEAgYWRkX29iamVjdF9p bnRvX3RlbXBfd3JpdGVfbGlzdChOb2RlICpub2RlLCB2b2lkICpjb250ZXh0KQogc3RhdGljIHZv aWQKIGRtbF9hZGFwdGl2ZShOb2RlICpub2RlLCBjaGFyICpxdWVyeSkKIHsKLQlpZiAocG9vbF9j b25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlID09IERMQk9XX0RNTF9BREFQVElW RSkKKwlpZiAoRExCT1dfSVNfRE1MX0FEQVBUSVZFKHBvb2xfY29uZmlnLT5kaXNhYmxlX2xvYWRf YmFsYW5jZV9vbl93cml0ZSkpCiAJewogCQkvKiBTZXQvVW5zZXQgdHJhbnNhY3Rpb24gc3RhdHVz IGZsYWdzICovCiAJCWlmIChJc0Eobm9kZSwgVHJhbnNhY3Rpb25TdG10KSkKQEAgLTE5NjYsNiAr MTk4MCw0NSBAQCBkbWxfYWRhcHRpdmUoTm9kZSAqbm9kZSwgY2hhciAqcXVlcnkpCiAJCQl9CiAJ CQllbHNlIGlmIChpc19jb21taXRfb3Jfcm9sbGJhY2tfcXVlcnkobm9kZSkpCiAJCQl7CisJCQkJ LyoKKwkJCQkgKiBGb3IgZG1sX2FkYXB0aXZlX2dsb2JhbDogb24gQ09NTUlULCBmbHVzaCB0aGUg YWNjdW11bGF0ZWQKKwkJCQkgKiB0YWJsZSB3cml0ZXMgdG8gc2hhcmVkIG1lbW9yeS4gIE9uIFJP TExCQUNLLCBza2lwIC0tIHRoZQorCQkJCSAqIHdyaXRlcyBuZXZlciBjb21taXR0ZWQgc28gbm8g c3RhbGUtcmVhZCByaXNrIGV4aXN0cy4gIFRoaXMKKwkJCQkgKiBwcmV2ZW50cyBwb2xsdXRpbmcg dGhlIHRhYmxlIG1hcCB3aXRoIHJvbGxlZC1iYWNrCisJCQkJICogdHJhbnNhY3Rpb25zLgorCQkJ CSAqLworCQkJCWludAkJCWRsYm93ID0KKwkJCQlwb29sX2NvbmZpZy0+ZGlzYWJsZV9sb2FkX2Jh bGFuY2Vfb25fd3JpdGU7CisJCQkJTGlzdAkgICAqd2xpc3QgPQorCQkJCXNlc3Npb25fY29udGV4 dC0+dHJhbnNhY3Rpb25fdGVtcF93cml0ZV9saXN0OworCisJCQkJaWYgKGRsYm93ID09IERMQk9X X0RNTF9BREFQVElWRV9HTE9CQUwgJiYKKwkJCQkJaXNfY29tbWl0X3F1ZXJ5KG5vZGUpICYmCisJ CQkJCXdsaXN0ICE9IE5JTCkKKwkJCQl7CisJCQkJCUxpc3RDZWxsICAgKmNlbGw7CisJCQkJCWlu dAkJCWRib2lkOworCisJCQkJCWRib2lkID0KKwkJCQkJCXBvb2xfdHJhY2tfdGFibGVfbXV0YXRp b25fZ2V0X2RhdGFiYXNlX29pZCgpOworCQkJCQlpZiAoZGJvaWQgPiAwKQorCQkJCQl7CisJCQkJ CQlmb3JlYWNoKGNlbGwsIHdsaXN0KQorCQkJCQkJeworCQkJCQkJCWNoYXIJICAgKnRuYW1lOwor CQkJCQkJCWludAkJCXRvaWQ7CisKKwkJCQkJCQl0bmFtZSA9IChjaGFyICopIGxmaXJzdChjZWxs KTsKKwkJCQkJCQl0b2lkID0KKwkJCQkJCQkJcG9vbF90YWJsZV9uYW1lX3RvX29pZCh0bmFtZSk7 CisKKwkJCQkJCQlpZiAodG9pZCA+IDApCisJCQkJCQkJCXBvb2xfdHJhY2tfdGFibGVfbXV0YXRp b25fbWFya190YWJsZV93cml0dGVuKAorCQkJCQkJCQkJCQkJCQkJCQkJCSB0b2lkLCBkYm9pZCk7 CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKIAkJCQlzZXNzaW9uX2NvbnRleHQtPmlzX2luX3Ry YW5zYWN0aW9uID0gZmFsc2U7CiAKIAkJCQlpZiAoc2Vzc2lvbl9jb250ZXh0LT50cmFuc2FjdGlv bl90ZW1wX3dyaXRlX2xpc3QgIT0gTklMKQpAQCAtMjAwOCw3ICsyMDYxLDcgQEAgd2hlcmVfdG9f c2VuZF9tYWluX3JlcGxpY2EoUE9PTF9RVUVSWV9DT05URVhUICpxdWVyeV9jb250ZXh0LCBjaGFy ICpxdWVyeSwgTm9kZQogCXNlc3Npb25fY29udGV4dCA9IHBvb2xfZ2V0X3Nlc3Npb25fY29udGV4 dChmYWxzZSk7CiAJYmFja2VuZCA9IHNlc3Npb25fY29udGV4dC0+YmFja2VuZDsKIAotCS8qIAor CS8qCiAJICogQ29sbGVjdC9kaXNjYXJkIGluZm9ybWF0aW9uIGZvciBkaXNhYmxlX2xvYWRfYmFs YW5jZV9vbl93cml0ZSA9CiAJICogZG1sX2FkYXB0aXZlIGNhc2UuCiAJICovCkBAIC0yMDIyLDYg KzIwNzUsMjAgQEAgd2hlcmVfdG9fc2VuZF9tYWluX3JlcGxpY2EoUE9PTF9RVUVSWV9DT05URVhU ICpxdWVyeV9jb250ZXh0LCBjaGFyICpxdWVyeSwgTm9kZQogCWlmIChkZXN0ID09IFBPT0xfUFJJ TUFSWSkKIAl7CiAJCXBvb2xfc2V0X25vZGVfdG9fYmVfc2VudChxdWVyeV9jb250ZXh0LCBQUklN QVJZX05PREVfSUQpOworCisJCS8qCisJCSAqIFJlc29sdmUgdGFibGUgYW5kIGRhdGFiYXNlIE9J RHMgbm93IHRvIHBvcHVsYXRlIHJlbGNhY2hlLiBUaGlzCisJCSAqIGF2b2lkcyBwb3RlbnRpYWwg aGFuZ3MgaW4gQ29tbWFuZENvbXBsZXRlIHdoZXJlIHdlIHNob3VsZG4ndCBiZQorCQkgKiBydW5u aW5nIG5ldyBxdWVyaWVzIGFnYWluc3QgdGhlIGJhY2tlbmQuCisJCSAqLworCQlpZiAocG9vbF9j b25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlID09CisJCQlETEJPV19ETUxfQURB UFRJVkVfR0xPQkFMKQorCQl7CisJCQlpbnQJCSAgICpvaWRzOworCisJCQlwb29sX2V4dHJhY3Rf dGFibGVfb2lkcyhub2RlLCAmb2lkcyk7CisJCQlwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX2dl dF9kYXRhYmFzZV9vaWQoKTsKKwkJfQogCX0KIAkvKiBTaG91bGQgYmUgc2VudCB0byBib3RoIHBy aW1hcnkgYW5kIHN0YW5kYnk/ICovCiAJZWxzZSBpZiAoZGVzdCA9PSBQT09MX0JPVEgpCkBAIC0y MTUxLDYgKzIyMTgsMTUzIEBAIHdoZXJlX3RvX3NlbmRfbWFpbl9yZXBsaWNhKFBPT0xfUVVFUllf Q09OVEVYVCAqcXVlcnlfY29udGV4dCwgY2hhciAqcXVlcnksIE5vZGUKIAkJCQl7CiAJCQkJCXBv b2xfc2V0X25vZGVfdG9fYmVfc2VudChxdWVyeV9jb250ZXh0LCBQUklNQVJZX05PREVfSUQpOwog CQkJCX0KKworCQkJCS8qCisJCQkJICogQ2hlY2sgdHJhY2sgdGFibGUgbXV0YXRpb24gZm9yIHJl Y2VudGx5IHdyaXR0ZW4gdGFibGVzLiAgSWYKKwkJCQkgKiBpbiBjb2xkIHN0YXJ0IG9yIGFueSB0 YWJsZSB3YXMgcmVjZW50bHkgd3JpdHRlbiwgcm91dGUgdG8KKwkJCQkgKiBwcmltYXJ5IHRvIGF2 b2lkIHN0YWxlIHJlYWRzLgorCQkJCSAqLworCQkJCWVsc2UgaWYgKHBvb2xfY29uZmlnLT5kaXNh YmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSA9PQorCQkJCQkJIERMQk9XX0RNTF9BREFQVElWRV9H TE9CQUwpCisJCQkJeworCQkJCQlib29sCQlmb3JjZV9wcmltYXJ5ID0gZmFsc2U7CisJCQkJCWlu dAkJCWxiX25vZGU7CisJCQkJCVBPT0xfUVVFUllfQ09OVEVYVCAqcWN0eCA9CisJCQkJCXNlc3Np b25fY29udGV4dC0+cXVlcnlfY29udGV4dDsKKworCQkJCQlpZiAocG9vbF90cmFja190YWJsZV9t dXRhdGlvbl9pbl9jb2xkX3N0YXJ0KCkpCisJCQkJCXsKKwkJCQkJCWVyZXBvcnQoREVCVUcxLAor CQkJCQkJCQkoZXJybXNnKCJjb3VsZCBub3QgbG9hZCBiYWxhbmNlIgorCQkJCQkJCQkJCSIgYmVj YXVzZSBvZiB0cmFjayB0YWJsZSIKKwkJCQkJCQkJCQkiIG11dGF0aW9uIGNvbGQgc3RhcnQiKSwK KwkJCQkJCQkJIGVycmRldGFpbCgiZGVzdGluYXRpb24gPSBQUklNQVJZIgorCQkJCQkJCQkJCSAg ICIgZm9yIHF1ZXJ5PSBcIiVzXCIiLAorCQkJCQkJCQkJCSAgIHF1ZXJ5KSkpOworCQkJCQkJZm9y Y2VfcHJpbWFyeSA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlTZWxl Y3RDb250ZXh0IGN0eDsKKwkJCQkJCWludAkJCWRib2lkOworCQkJCQkJaW50CQkJbnVtX29pZHM7 CisJCQkJCQlpbnQJCQlpOworCisJCQkJCQltZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOwor CQkJCQkJbnVtX29pZHMgPQorCQkJCQkJCXBvb2xfZXh0cmFjdF90YWJsZV9vaWRzX2Zyb21fc2Vs ZWN0X3N0bXQoCisJCQkJCQkJCQkJCQkJCQkJCSBub2RlLCAmY3R4KTsKKwkJCQkJCWlmIChudW1f b2lkcyA+IDApCisJCQkJCQl7CisJCQkJCQkJZGJvaWQgPQorCQkJCQkJCQlwb29sX3RyYWNrX3Rh YmxlX211dGF0aW9uX2dldF9kYXRhYmFzZV9vaWQoKTsKKworCQkJCQkJCWlmIChkYm9pZCA8PSAw KQorCQkJCQkJCXsKKwkJCQkJCQkJZXJlcG9ydChERUJVRzEsCisJCQkJCQkJCQkJKGVycm1zZygi Y291bGQgbm90IGxvYWQiCisJCQkJCQkJCQkJCQkiIGJhbGFuY2UgYmVjYXVzZSIKKwkJCQkJCQkJ CQkJCSIgZGF0YWJhc2Ugb2lkIHdhcyIKKwkJCQkJCQkJCQkJCSIgdW5hdmFpbGFibGUiKSwKKwkJ CQkJCQkJCQkgZXJyZGV0YWlsKCJkZXN0aW5hdGlvbiIKKwkJCQkJCQkJCQkJCSAgICIgPSBQUklN QVJZIGZvciIKKwkJCQkJCQkJCQkJCSAgICIgcXVlcnk9IFwiJXNcIiIsCisJCQkJCQkJCQkJCQkg ICBxdWVyeSkpKTsKKwkJCQkJCQkJZm9yY2VfcHJpbWFyeSA9IHRydWU7CisJCQkJCQkJfQorCQkJ CQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBudW1fb2lkczsgaSsr KQorCQkJCQkJCQl7CisJCQkJCQkJCQlib29sCQlzdGFsZTsKKworCQkJCQkJCQkJc3RhbGUgPQor CQkJCQkJCQkJCXBvb2xfdHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfaXNfc3RhbGUoCisJCQkJ CQkJCQkJCQkJCQkJCQkJCSBjdHgudGFibGVfb2lkc1tpXSwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJ IGRib2lkKTsKKwkJCQkJCQkJCWlmIChzdGFsZSkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQllcmVw b3J0KERFQlVHMSwKKwkJCQkJCQkJCQkJCShlcnJtc2coImNvdWxkIG5vdCBsb2FkIgorCQkJCQkJ CQkJCQkJCQkiIGJhbGFuY2UgYmVjYXVzZSIKKwkJCQkJCQkJCQkJCQkJIiB0YWJsZSBcIiVzXCIg d2FzIgorCQkJCQkJCQkJCQkJCQkiIHJlY2VudGx5IHdyaXR0ZW4iLAorCQkJCQkJCQkJCQkJCQlj dHgudGFibGVfbmFtZXNbaV0pLAorCQkJCQkJCQkJCQkJIGVycmRldGFpbCgiZGVzdGluYXRpb24i CisJCQkJCQkJCQkJCQkJCSAgICIgPSBQUklNQVJZIGZvciIKKwkJCQkJCQkJCQkJCQkJICAgIiBx dWVyeT0gXCIlc1wiIiwKKwkJCQkJCQkJCQkJCQkJICAgcXVlcnkpKSk7CisJCQkJCQkJCQkJZm9y Y2VfcHJpbWFyeSA9IHRydWU7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJ CX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoZm9yY2VfcHJpbWFyeSkK KwkJCQkJeworCQkJCQkJcG9vbF9zZXRfbm9kZV90b19iZV9zZW50KAorCQkJCQkJCQkJCQkJIHF1 ZXJ5X2NvbnRleHQsCisJCQkJCQkJCQkJCQkgUFJJTUFSWV9OT0RFX0lEKTsKKwkJCQkJfQorCQkJ CQllbHNlCisJCQkJCXsKKwkJCQkJCWlmIChwb29sX2NvbmZpZy0+c3RhdGVtZW50X2xldmVsX2xv YWRfYmFsYW5jZSkKKwkJCQkJCXsKKwkJCQkJCQlzZXNzaW9uX2NvbnRleHQtPmxvYWRfYmFsYW5j ZV9ub2RlX2lkID0KKwkJCQkJCQkJc2VsZWN0X2xvYWRfYmFsYW5jaW5nX25vZGUoKTsKKwkJCQkJ CX0KKworCQkJCQkJLyoKKwkJCQkJCSAqIElmIHJlcGxpY2F0aW9uIGRlbGF5IGlzIHRvbyBtdWNo LCBhbmQKKwkJCQkJCSAqIHByZWZlcl9sb3dlcl9kZWxheV9zdGFuZGJ5IGlzIHRydWUgdGhlbiBl bGVjdCB0aGUKKwkJCQkJCSAqIGxvd2VzdC1kZWxheWVkIG5vZGUsIG90aGVyd2lzZSBzZW5kIHRv IHByaW1hcnkuCisJCQkJCQkgKi8KKwkJCQkJCWxiX25vZGUgPQorCQkJCQkJCXNlc3Npb25fY29u dGV4dC0+bG9hZF9iYWxhbmNlX25vZGVfaWQ7CisJCQkJCQlpZiAoU1RSRUFNICYmCisJCQkJCQkJ Y2hlY2tfcmVwbGljYXRpb25fZGVsYXkobGJfbm9kZSkpCisJCQkJCQl7CisJCQkJCQkJZXJlcG9y dChERUJVRzEsCisJCQkJCQkJCQkoZXJybXNnKCJjb3VsZCBub3QgbG9hZCIKKwkJCQkJCQkJCQkJ IiBiYWxhbmNlIGJlY2F1c2Ugb2YiCisJCQkJCQkJCQkJCSIgdG9vIG11Y2ggcmVwbGljYXRpb24i CisJCQkJCQkJCQkJCSIgZGVsYXkiKSwKKwkJCQkJCQkJCSBlcnJkZXRhaWwoImRlc3RpbmF0aW9u IgorCQkJCQkJCQkJCQkgICAiID0gJWQgZm9yIgorCQkJCQkJCQkJCQkgICAiIHF1ZXJ5PSBcIiVz XCIiLAorCQkJCQkJCQkJCQkgICBkZXN0LCBxdWVyeSkpKTsKKworCQkJCQkJCWlmIChwb29sX2Nv bmZpZy0+cHJlZmVyX2xvd2VyX2RlbGF5X3N0YW5kYnkpCisJCQkJCQkJeworCQkJCQkJCQlsYl9u b2RlID0KKwkJCQkJCQkJCXNlbGVjdF9sb2FkX2JhbGFuY2luZ19ub2RlKCk7CisJCQkJCQkJCXNl c3Npb25fY29udGV4dC0+bG9hZF9iYWxhbmNlX25vZGVfaWQgPQorCQkJCQkJCQkJbGJfbm9kZTsK KwkJCQkJCQkJcWN0eC0+bG9hZF9iYWxhbmNlX25vZGVfaWQgPQorCQkJCQkJCQkJbGJfbm9kZTsK KwkJCQkJCQkJcG9vbF9zZXRfbm9kZV90b19iZV9zZW50KAorCQkJCQkJCQkJCQkJCQkgcXVlcnlf Y29udGV4dCwKKwkJCQkJCQkJCQkJCQkJIGxiX25vZGUpOworCQkJCQkJCX0KKwkJCQkJCQllbHNl CisJCQkJCQkJeworCQkJCQkJCQlwb29sX3NldF9ub2RlX3RvX2JlX3NlbnQoCisJCQkJCQkJCQkJ CQkJCSBxdWVyeV9jb250ZXh0LAorCQkJCQkJCQkJCQkJCQkgUFJJTUFSWV9OT0RFX0lEKTsKKwkJ CQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcWN0eC0+bG9hZF9i YWxhbmNlX25vZGVfaWQgPQorCQkJCQkJCQlzZXNzaW9uX2NvbnRleHQtPmxvYWRfYmFsYW5jZV9u b2RlX2lkOworCQkJCQkJCXBvb2xfc2V0X25vZGVfdG9fYmVfc2VudCgKKwkJCQkJCQkJCQkJCQkg cXVlcnlfY29udGV4dCwKKwkJCQkJCQkJCQkJCQkgcWN0eC0+bG9hZF9iYWxhbmNlX25vZGVfaWQp OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQogCQkJCWVsc2UKIAkJCQl7CiAJCQkJCWlmIChwb29s X2NvbmZpZy0+c3RhdGVtZW50X2xldmVsX2xvYWRfYmFsYW5jZSkKQEAgLTIxNzEsNyArMjM4NSw4 IEBAIHdoZXJlX3RvX3NlbmRfbWFpbl9yZXBsaWNhKFBPT0xfUVVFUllfQ09OVEVYVCAqcXVlcnlf Y29udGV4dCwgY2hhciAqcXVlcnksIE5vZGUKIAkJCQkJCQkJIGVycmRldGFpbCgiZGVzdGluYXRp b24gPSAlZCBmb3IgcXVlcnk9IFwiJXNcIiIsIGRlc3QsIHF1ZXJ5KSkpOwogCiAJCQkJCQkvKgot CQkJCQkJICogSWYgcHJlZmVyX2xvd2VyX2RlbGF5X3N0YW5kYnkgaXMgb24sIGNob29zZSBsb3dl ciBkZWxheSBzdGFuZGJ5LgorCQkJCQkJICogSWYgcHJlZmVyX2xvd2VyX2RlbGF5X3N0YW5kYnkg aXMgb24sIGNob29zZSBsb3dlcgorCQkJCQkJICogZGVsYXkgc3RhbmRieS4KIAkJCQkJCSAqLwog CQkJCQkJaWYgKHBvb2xfY29uZmlnLT5wcmVmZXJfbG93ZXJfZGVsYXlfc3RhbmRieSkKIAkJCQkJ CXsKQEAgLTIxODEsNyArMjM5Niw4IEBAIHdoZXJlX3RvX3NlbmRfbWFpbl9yZXBsaWNhKFBPT0xf UVVFUllfQ09OVEVYVCAqcXVlcnlfY29udGV4dCwgY2hhciAqcXVlcnksIE5vZGUKIAkJCQkJCQlz ZXNzaW9uX2NvbnRleHQtPnF1ZXJ5X2NvbnRleHQtPmxvYWRfYmFsYW5jZV9ub2RlX2lkID0gc2Vz c2lvbl9jb250ZXh0LT5sb2FkX2JhbGFuY2Vfbm9kZV9pZDsKIAkJCQkJCQlwb29sX3NldF9ub2Rl X3RvX2JlX3NlbnQocXVlcnlfY29udGV4dCwgc2Vzc2lvbl9jb250ZXh0LT5xdWVyeV9jb250ZXh0 LT5sb2FkX2JhbGFuY2Vfbm9kZV9pZCk7CiAJCQkJCQl9Ci0JCQkJCQllbHNlCS8qIGRlbGF5IGlz IHRvbyBtdWNoLiBwcmVmZXIgdG8gc2VuZCB0byBwcmltYXJ5ICovCisJCQkJCQllbHNlCS8qIGRl bGF5IGlzIHRvbyBtdWNoLiBwcmVmZXIgdG8gc2VuZCB0bworCQkJCQkJCQkgKiBwcmltYXJ5ICov CiAJCQkJCQl7CiAJCQkJCQkJcG9vbF9zZXRfbm9kZV90b19iZV9zZW50KHF1ZXJ5X2NvbnRleHQs IFBSSU1BUllfTk9ERV9JRCk7CiAJCQkJCQl9CkBAIC0yMTkxLDcgKzI0MDcsNyBAQCB3aGVyZV90 b19zZW5kX21haW5fcmVwbGljYShQT09MX1FVRVJZX0NPTlRFWFQgKnF1ZXJ5X2NvbnRleHQsIGNo YXIgKnF1ZXJ5LCBOb2RlCiAJCQkJCSAqIE5vdCBzdHJlYW1pbmcgcmVwbGljYXRpb24gbW9kZSwg b3IgZGVsYXlfdGhyZXNob2xkIGlzIDAKIAkJCQkJICogb3IgcmVwbGljYXRpb24gZGVsYXkgaXMg c21hbGwgZW5vdWdoLgogCQkJCQkgKi8KLQkJCQkJZWxzZQkKKwkJCQkJZWxzZQogCQkJCQl7CiAJ CQkJCQlzZXNzaW9uX2NvbnRleHQtPnF1ZXJ5X2NvbnRleHQtPmxvYWRfYmFsYW5jZV9ub2RlX2lk ID0gc2Vzc2lvbl9jb250ZXh0LT5sb2FkX2JhbGFuY2Vfbm9kZV9pZDsKIAkJCQkJCXBvb2xfc2V0 X25vZGVfdG9fYmVfc2VudChxdWVyeV9jb250ZXh0LApkaWZmIC0tZ2l0IGEvc3JjL2NvbnRleHQv cG9vbF9zZXNzaW9uX2NvbnRleHQuYyBiL3NyYy9jb250ZXh0L3Bvb2xfc2Vzc2lvbl9jb250ZXh0 LmMKaW5kZXggZGVkNDFjN2ZjLi4xZTc3N2I5ODMgMTAwNjQ0Ci0tLSBhL3NyYy9jb250ZXh0L3Bv b2xfc2Vzc2lvbl9jb250ZXh0LmMKKysrIGIvc3JjL2NvbnRleHQvcG9vbF9zZXNzaW9uX2NvbnRl eHQuYwpAQCAtNTMyLDcgKzUzMiw3IEBAIGR1bXBfc2VudF9tZXNzYWdlKGNoYXIgKmNhbGxlciwg UE9PTF9TRU5UX01FU1NBR0UgKm0pCiBzdGF0aWMgdm9pZAogZG1sX2FkYXB0aXZlX2luaXQodm9p ZCkKIHsKLQlpZiAocG9vbF9jb25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlID09 IERMQk9XX0RNTF9BREFQVElWRSkKKwlpZiAoRExCT1dfSVNfRE1MX0FEQVBUSVZFKHBvb2xfY29u ZmlnLT5kaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSkpCiAJewogCQlzZXNzaW9uX2NvbnRl eHQtPmlzX2luX3RyYW5zYWN0aW9uID0gZmFsc2U7CiAJCXNlc3Npb25fY29udGV4dC0+dHJhbnNh Y3Rpb25fdGVtcF93cml0ZV9saXN0ID0gTklMOwpAQCAtNTQyLDcgKzU0Miw5IEBAIGRtbF9hZGFw dGl2ZV9pbml0KHZvaWQpCiBzdGF0aWMgdm9pZAogZG1sX2FkYXB0aXZlX2Rlc3Ryb3kodm9pZCkK IHsKLQlpZiAocG9vbF9jb25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlID09IERM Qk9XX0RNTF9BREFQVElWRSAmJiBzZXNzaW9uX2NvbnRleHQpCisJaWYgKERMQk9XX0lTX0RNTF9B REFQVElWRSgKKwkJCQkJCQkgIHBvb2xfY29uZmlnLT5kaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93 cml0ZSkgJiYKKwkJc2Vzc2lvbl9jb250ZXh0KQogCXsKIAkJaWYgKHNlc3Npb25fY29udGV4dC0+ dHJhbnNhY3Rpb25fdGVtcF93cml0ZV9saXN0ICE9IE5JTCkKIAkJCWxpc3RfZnJlZV9kZWVwKHNl c3Npb25fY29udGV4dC0+dHJhbnNhY3Rpb25fdGVtcF93cml0ZV9saXN0KTsKQEAgLTczOCwxMCAr NzQwLDEzIEBAIHZvaWQKIHBvb2xfc2V0X3dyaXRpbmdfdHJhbnNhY3Rpb24odm9pZCkKIHsKIAkv KgotCSAqIElmIGRpc2FibGVfdHJhbnNhY3Rpb25fb25fd3JpdGUgaXMgJ29mZicgb3IgJ2RtbF9h ZGFwdGl2ZScsIHRoZW4gbmV2ZXIKLQkgKiB0dXJuIG9uIHdyaXRpbmcgdHJhbnNhY3Rpb24gZmxh Zy4KKwkgKiBJZiBkaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSBpcyAnb2ZmJyBvciAnZG1s X2FkYXB0aXZlJyBvcgorCSAqICdkbWxfYWRhcHRpdmVfZ2xvYmFsJywgdGhlbiBuZXZlciB0dXJu IG9uIHdyaXRpbmcgdHJhbnNhY3Rpb24gZmxhZy4KIAkgKi8KLQlpZiAocG9vbF9jb25maWctPmRp c2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlICE9IERMQk9XX09GRiAmJiBwb29sX2NvbmZpZy0+ ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3JpdGUgIT0gRExCT1dfRE1MX0FEQVBUSVZFKQorCWlm IChwb29sX2NvbmZpZy0+ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3JpdGUgIT0KKwkJRExCT1df T0ZGICYmCisJCSFETEJPV19JU19ETUxfQURBUFRJVkUoCisJCQkJCQkJICAgcG9vbF9jb25maWct PmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlKSkKIAl7CiAJCXBvb2xfZ2V0X3Nlc3Npb25f Y29udGV4dChmYWxzZSktPndyaXRpbmdfdHJhbnNhY3Rpb24gPSB0cnVlOwogCQllcmVwb3J0KERF QlVHNSwKQEAgLTc1OCw2ICs3NjMsMjggQEAgcG9vbF9pc193cml0aW5nX3RyYW5zYWN0aW9uKHZv aWQpCiAJcmV0dXJuIHBvb2xfZ2V0X3Nlc3Npb25fY29udGV4dChmYWxzZSktPndyaXRpbmdfdHJh bnNhY3Rpb247CiB9CiAKKy8qCisgKiBEbyB3ZSBoYXZlIGEgRE1MIHdyaXRlIGluIHRoaXMgdHJh bnNhY3Rpb24gdHJhY2tlZCBieSBkbWxfYWRhcHRpdmUKKyAqIG9yIGRtbF9hZGFwdGl2ZV9nbG9i YWwgbW9kZT8gIFVzZWQgdG8gYnlwYXNzIHRoZSBxdWVyeSBjYWNoZSB3aGVuCisgKiB0aG9zZSBt b2RlcyBhcmUgYWN0aXZlLCBzaW5jZSB0aGV5IGRvIG5vdCBzZXQgd3JpdGluZ190cmFuc2FjdGlv bi4KKyAqLworYm9vbAorcG9vbF9oYXNfZG1sX2FkYXB0aXZlX3dyaXRlX2luX3RyYW5zYWN0aW9u KHZvaWQpCit7CisJUE9PTF9TRVNTSU9OX0NPTlRFWFQgKnM7CisKKwlpZiAoIURMQk9XX0lTX0RN TF9BREFQVElWRSgKKwkJCQkJCQkgICBwb29sX2NvbmZpZy0+ZGlzYWJsZV9sb2FkX2JhbGFuY2Vf b25fd3JpdGUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzID0gcG9vbF9nZXRfc2Vzc2lvbl9jb250 ZXh0KHRydWUpOworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBz LT5pc19pbl90cmFuc2FjdGlvbiAmJgorCQlzLT50cmFuc2FjdGlvbl90ZW1wX3dyaXRlX2xpc3Qg IT0gTklMOworfQorCiAvKgogICogRXJyb3IgZG9lc24ndCBvY2N1ciBpbiB0aGlzIHRyYW5zYWN0 aW9uIHlldC4KICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY29udGV4dC9wb29sX3Nlc3Np b25fY29udGV4dC5oIGIvc3JjL2luY2x1ZGUvY29udGV4dC9wb29sX3Nlc3Npb25fY29udGV4dC5o CmluZGV4IDQ0NjM1N2RlMy4uNWQ0M2VhYzM3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jb250 ZXh0L3Bvb2xfc2Vzc2lvbl9jb250ZXh0LmgKKysrIGIvc3JjL2luY2x1ZGUvY29udGV4dC9wb29s X3Nlc3Npb25fY29udGV4dC5oCkBAIC0zODAsNiArMzgwLDcgQEAgZXh0ZXJuIFBPT0xfU0VOVF9N RVNTQUdFICpwb29sX2dldF9zZW50X21lc3NhZ2VfYnlfcXVlcnlfY29udGV4dChQT09MX1FVRVJZ X0NPTlQKIGV4dGVybiB2b2lkIHBvb2xfdW5zZXRfd3JpdGluZ190cmFuc2FjdGlvbih2b2lkKTsK IGV4dGVybiB2b2lkIHBvb2xfc2V0X3dyaXRpbmdfdHJhbnNhY3Rpb24odm9pZCk7CiBleHRlcm4g Ym9vbCBwb29sX2lzX3dyaXRpbmdfdHJhbnNhY3Rpb24odm9pZCk7CitleHRlcm4gYm9vbCBwb29s X2hhc19kbWxfYWRhcHRpdmVfd3JpdGVfaW5fdHJhbnNhY3Rpb24odm9pZCk7CiBleHRlcm4gdm9p ZCBwb29sX3Vuc2V0X2ZhaWxlZF90cmFuc2FjdGlvbih2b2lkKTsKIGV4dGVybiB2b2lkIHBvb2xf c2V0X2ZhaWxlZF90cmFuc2FjdGlvbih2b2lkKTsKIGV4dGVybiBib29sIHBvb2xfaXNfZmFpbGVk X3RyYW5zYWN0aW9uKHZvaWQpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvcG9vbC5oIGIvc3Jj L2luY2x1ZGUvcG9vbC5oCmluZGV4IDY1OTA3ZGNmMS4uNzlkNzk4OGZjIDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS9wb29sLmgKKysrIGIvc3JjL2luY2x1ZGUvcG9vbC5oCkBAIC00MjQsNyArNDI0 LDcgQEAgdHlwZWRlZiBlbnVtCiAjZGVmaW5lIE1pbih4LCB5KQkJKCh4KSA8ICh5KSA/ICh4KSA6 ICh5KSkKIAogCi0jZGVmaW5lIE1BWF9OVU1fU0VNQVBIT1JFUwkJOAorI2RlZmluZSBNQVhfTlVN X1NFTUFQSE9SRVMJCTkKICNkZWZpbmUgQ09OTl9DT1VOVEVSX1NFTQkJMAogI2RlZmluZSBSRVFV RVNUX0lORk9fU0VNCQkxCiAjZGVmaW5lIFFVRVJZX0NBQ0hFX1NUQVRTX1NFTQkyCkBAIC00MzQs NiArNDM0LDcgQEAgdHlwZWRlZiBlbnVtCiAjZGVmaW5lIEZPTExPV19QUklNQVJZX1NFTQkJNgog I2RlZmluZSBNQUlOX0VYSVRfSEFORExFUl9TRU0JNwkvKiB1c2VkIGluIGV4aXRfaGFuZGVyIGlu IHBncG9vbCBtYWluCiAJCQkJCQkJCQkgKiBwcm9jZXNzICovCisjZGVmaW5lIFRSQUNLX1RBQkxF X01VVEFUSU9OX1RBQkxFX1NFTQk4CiAjZGVmaW5lIE1BWF9SRVFVRVNUX1FVRVVFX1NJWkUJMTAK IAogI2RlZmluZSBNQVhfU0VDX1dBSVRfRk9SX0NMVVNURVJfVFJBTlNBQ1RJT04gMTAgLyogdGlt ZSBpbiBzZWNvbmRzIHRvIGtlZXAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3Bvb2xfY29uZmln LmggYi9zcmMvaW5jbHVkZS9wb29sX2NvbmZpZy5oCmluZGV4IDlhMzk3ZDE2Ni4uYjhhYmFkZDUw IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9wb29sX2NvbmZpZy5oCisrKyBiL3NyYy9pbmNsdWRl L3Bvb2xfY29uZmlnLmgKQEAgLTEwNSw5ICsxMDUsMTMgQEAgdHlwZWRlZiBlbnVtIERMQk9XX09Q VElPTgogCURMQk9XX1RSQU5TQUNUSU9OLAogCURMQk9XX1RSQU5TX1RSQU5TQUNUSU9OLAogCURM Qk9XX0FMV0FZUywKLQlETEJPV19ETUxfQURBUFRJVkUKKwlETEJPV19ETUxfQURBUFRJVkUsCisJ RExCT1dfRE1MX0FEQVBUSVZFX0dMT0JBTAogfSBETEJPV19PUFRJT047CiAKKyNkZWZpbmUgRExC T1dfSVNfRE1MX0FEQVBUSVZFKG9wdCkgXAorCSgob3B0KSA9PSBETEJPV19ETUxfQURBUFRJVkUg fHwgKG9wdCkgPT0gRExCT1dfRE1MX0FEQVBUSVZFX0dMT0JBTCkKKwogdHlwZWRlZiBlbnVtIFJF TFFUQVJHRVRfT1BUSU9OCiB7CiAJUkVMUVRBUkdFVF9QUklNQVJZID0gMSwKQEAgLTM2Myw4ICsz NjcsMjIgQEAgdHlwZWRlZiBzdHJ1Y3QKIAljaGFyCSAgICpzcl9jaGVja19wYXNzd29yZDsJLyog cGFzc3dvcmQgZm9yIHNyX2NoZWNrX3VzZXIgKi8KIAljaGFyCSAgICpzcl9jaGVja19kYXRhYmFz ZTsJLyogUG9zdGdyZVNRTCBkYXRhYmFzZSBuYW1lIGZvciBzdHJlYW1pbmcKIAkJCQkJCQkJCSAq IHJlcGxpY2F0aW9uIGNoZWNrICovCi0JY2hhcgkgICAqcmVwbGljYXRpb25fZGVsYXlfc291cmNl X2NtZDsJLyogZXh0ZXJuYWwgY29tbWFuZCBmb3IgcmVwbGljYXRpb24gZGVsYXkgKi8KLQlpbnQJ CQlyZXBsaWNhdGlvbl9kZWxheV9zb3VyY2VfdGltZW91dDsJLyogdGltZW91dCBmb3IgZXh0ZXJu YWwgY29tbWFuZCBpbiBzZWNvbmRzICovCisJY2hhcgkgICAqcmVwbGljYXRpb25fZGVsYXlfc291 cmNlX2NtZDsJLyogZXh0ZXJuYWwgY29tbWFuZCBmb3IKKwkJCQkJCQkJCQkJCSAqIHJlcGxpY2F0 aW9uIGRlbGF5ICovCisJaW50CQkJcmVwbGljYXRpb25fZGVsYXlfc291cmNlX3RpbWVvdXQ7CS8q IHRpbWVvdXQgZm9yIGV4dGVybmFsCisJCQkJCQkJCQkJCQkJICogY29tbWFuZCBpbiBzZWNvbmRz ICovCisKKwkvKiBUcmFjayB0YWJsZSBtdXRhdGlvbiBjb25maWd1cmF0aW9uICovCisJZG91Ymxl CQl0cmFja190YWJsZV9tdXRhdGlvbl90dGxfZmFjdG9yOwkvKiBUVEwgbXVsdGlwbGllciBmb3IK KwkJCQkJCQkJCQkJCQkgKiByZXBsaWNhdGlvbiBkZWxheSAqLworCWludAkJCXRyYWNrX3RhYmxl X211dGF0aW9uX21heF9zdGFsZW5lc3M7IC8qIG1heCBzdGFsZW5lc3MgZHVyYXRpb24KKwkJCQkJ CQkJCQkJCQkgKiBtcyAqLworCWludAkJCXRyYWNrX3RhYmxlX211dGF0aW9uX2NvbGRfc3RhcnRf ZHVyYXRpb247CS8qIGNvbGQgc3RhcnQgZHVyYXRpb24KKwkJCQkJCQkJCQkJCQkJCSAqIG1zICov CisJaW50CQkJdHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfYnVja2V0czsgLyogaGFzaCBidWNr ZXRzIGZvciB0YWJsZQorCQkJCQkJCQkJCQkJCSAqIG1hcCAqLworCWludAkJCXRyYWNrX3RhYmxl X211dGF0aW9uX3RhYmxlX3NpemU7CS8qIG1heCB0YWJsZSBtYXAgZW50cmllcyAqLworCiAJY2hh cgkgICAqZmFpbG92ZXJfY29tbWFuZDsJLyogZXhlY3V0ZSBjb21tYW5kIHdoZW4gZmFpbG92ZXIg aGFwcGVucyAqLwogCWNoYXIJICAgKmZvbGxvd19wcmltYXJ5X2NvbW1hbmQ7IC8qIGV4ZWN1dGUg Y29tbWFuZCB3aGVuIGZhaWxvdmVyIGlzCiAJCQkJCQkJCQkJICogZW5kZWQgKi8KZGlmZiAtLWdp dCBhL3NyYy9pbmNsdWRlL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24uaCBiL3NyYy9p bmNsdWRlL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24uaApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAuLmRmYmFjNjY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9p bmNsdWRlL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24uaApAQCAtMCwwICsxLDE2NyBA QAorLyogLSotcGdzcWwtYy0qLSAqLworLyoKKyAqIHBncG9vbDogYSBsYW5ndWFnZSBpbmRlcGVu ZGVudCBjb25uZWN0aW9uIHBvb2wgc2VydmVyIGZvciBQb3N0Z3JlU1FMCisgKiB3cml0dGVuIGJ5 IFRhdHN1byBJc2hpaQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDI2CVBnUG9vbCBHbG9i YWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9k aWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRp b24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkKKyAqIGdyYW50ZWQs IHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbAor ICogY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl cm1pc3Npb24KKyAqIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBh bmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUKKyAqIGF1dGhvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRp c2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bworICogZGlzdHJpYnV0aW9uIG9mIHRoZSBz b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCisgKiBwZXJtaXNzaW9uLiBU aGUgYXV0aG9yIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyAqIHN1aXRhYmls aXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFz CisgKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogcG9v bF90cmFja190YWJsZV9tdXRhdGlvbi5oOiBJbi1tZW1vcnkgdHJhY2tpbmcgb2YKKyAqICAgcmVj ZW50bHkgd3JpdHRlbiB0YWJsZXMgdG8gcHJldmVudCBzdGFsZSByZWFkcy4KKyAqLworCisjaWZu ZGVmIFBPT0xfVFJBQ0tfVEFCTEVfTVVUQVRJT05fSAorI2RlZmluZSBQT09MX1RSQUNLX1RBQkxF X01VVEFUSU9OX0gKKworI2luY2x1ZGUgInBvb2wuaCIKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgor CisvKgorICogSW52YWxpZCBpbmRleCBtYXJrZXIgZm9yIGxpbmtlZCBsaXN0cworICovCisjZGVm aW5lIFRSQUNLX1RBQkxFX01VVEFUSU9OX0lOVkFMSURfSU5ERVgJKC0xKQorCisvKgorICogRGVm YXVsdCBUVEwgaW4gbWljcm9zZWNvbmRzICgxMDBtcykgdXNlZCB3aGVuIHJlcGxpY2F0aW9uIGRl bGF5IGlzIHVua25vd24KKyAqLworI2RlZmluZSBUUkFDS19UQUJMRV9NVVRBVElPTl9ERUZBVUxU X1RUTF9VUwkoMTAwICogMTAwMCkKKworLyoKKyAqIEVudHJ5IGluIHRoZSB0YWJsZSBtdXRhdGlv biBoYXNoIHRhYmxlIChrZXllZCBieSB0YWJsZS9kYXRhYmFzZSBvaWRzKQorICovCit0eXBlZGVm IHN0cnVjdCBUcmFja1RhYmxlTXV0YXRpb25FbnRyeQoreworCWludAkJCXRhYmxlX29pZDsJCS8q IFRhYmxlIG9pZCAqLworCWludAkJCWRib2lkOwkJCS8qIERhdGFiYXNlIG9pZCAqLworCXN0cnVj dCB0aW1ldmFsIGZpcnN0X3dyaXRlX3RpbWU7CS8qIFdoZW4gdGhlIGVudHJ5IHdhcyBmaXJzdCBj cmVhdGVkICovCisJc3RydWN0IHRpbWV2YWwgbGFzdF93cml0ZV90aW1lOyAvKiBXaGVuIHRoZSB0 YWJsZSB3YXMgbGFzdCB3cml0dGVuICovCisJdWludDMyCQloYXNoOwkJCS8qIFByZS1jb21wdXRl ZCBoYXNoIHZhbHVlICovCisJaW50CQkJbmV4dDsJCQkvKiBOZXh0IGluIGNvbGxpc2lvbiBjaGFp biAqLworCWJvb2wJCWluX3VzZTsJCQkvKiBJcyB0aGlzIGVudHJ5IGluIHVzZT8gKi8KK30gVHJh Y2tUYWJsZU11dGF0aW9uRW50cnk7CisKKy8qCisgKiBIZWFkZXIgZm9yIHRoZSB0YWJsZSBtdXRh dGlvbiBoYXNoIHRhYmxlIGluIHNoYXJlZCBtZW1vcnkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgVHJh Y2tUYWJsZU11dGF0aW9uSGFzaFRhYmxlCit7CisJaW50CQkJbnVtX2J1Y2tldHM7CS8qIE51bWJl ciBvZiBoYXNoIGJ1Y2tldHMgKi8KKwlpbnQJCQltYXhfZW50cmllczsJLyogTWF4aW11bSBlbnRy aWVzIGFsbG93ZWQgKi8KKwlpbnQJCQludW1fZW50cmllczsJLyogQ3VycmVudCBudW1iZXIgb2Yg ZW50cmllcyAqLworCWludAkJCWZyZWVfbGlzdF9oZWFkOyAvKiBIZWFkIG9mIGZyZWUgZW50cnkg bGlzdCAqLworCisJLyoKKwkgKiBGbGV4aWJsZSBhcnJheSBtZW1iZXJzIGZvbGxvdyBpbiBzaGFy ZWQgbWVtb3J5OiBpbnQKKwkgKiBidWNrZXRzW251bV9idWNrZXRzXTsgVHJhY2tUYWJsZU11dGF0 aW9uRW50cnkgZW50cmllc1ttYXhfZW50cmllc107CisJICovCit9IFRyYWNrVGFibGVNdXRhdGlv bkhhc2hUYWJsZTsKKworLyoKKyAqIEdsb2JhbCBzdGF0ZSBmb3IgdHJhY2sgdGFibGUgbXV0YXRp b24gZmVhdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBUcmFja1RhYmxlTXV0YXRpb25TdGF0ZQor eworCWJvb2wJCWluaXRpYWxpemVkOwkvKiBTaG1lbSBpbml0aWFsaXplZD8gKi8KKwl1aW50NjQJ CWN1cnJlbnRfdHRsX3VzOyAvKiBDdXJyZW50IFRUTCBpbiBtaWNyb3NlY29uZHMgKi8KKwlzdHJ1 Y3QgdGltZXZhbCB0dGxfbGFzdF91cGRhdGVkOwkvKiBXaGVuIFRUTCB3YXMgbGFzdCB1cGRhdGVk ICovCisJc3RydWN0IHRpbWV2YWwgbGFzdF9jbGVhbnVwX3RpbWU7CS8qIFdoZW4gbGFzdCBleHBp cmVkIGNsZWFudXAgcmFuICovCisJc3RydWN0IHRpbWV2YWwgZ2xvYmFsX2NvbGRfc3RhcnRfdW50 aWw7IC8qIEdsb2JhbCBjb2xkIHN0YXJ0IGVuZCB0aW1lICovCisJdWludDMyCQlzdGF0c19xdWVy aWVzX2NoZWNrZWQ7CS8qIFF1ZXJpZXMgY2hlY2tlZCAqLworCXVpbnQzMgkJc3RhdHNfZm9yY2Vk X3ByaW1hcnk7CS8qIEZvcmNlZCB0byBwcmltYXJ5ICovCisJdWludDMyCQlzdGF0c19hbGxvd2Vk X3JlcGxpY2E7CS8qIEFsbG93ZWQgdG8gcmVwbGljYSAqLworfSBUcmFja1RhYmxlTXV0YXRpb25T dGF0ZTsKKworLyoKKyAqIE1haW4gc2hhcmVkIG1lbW9yeSBzdHJ1Y3R1cmUgY29udGFpbmluZyBh bGwgY29tcG9uZW50cworICovCit0eXBlZGVmIHN0cnVjdCBUcmFja1RhYmxlTXV0YXRpb25TaG1l bQoreworCVRyYWNrVGFibGVNdXRhdGlvblN0YXRlIHN0YXRlOworCVRyYWNrVGFibGVNdXRhdGlv bkhhc2hUYWJsZSAqdGFibGVfbWFwOworfSBUcmFja1RhYmxlTXV0YXRpb25TaG1lbTsKKworLyog LS0tLS0tLS0tLS0tLS0tLQorICogUHVibGljIEFQSSBmdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0t LS0tLS0KKyAqLworCisvKgorICogSW5pdGlhbGl6ZSBzaGFyZWQgbWVtb3J5IHN0cnVjdHVyZXMg Zm9yIHRyYWNrIHRhYmxlIG11dGF0aW9uLgorICogQ2FsbGVkIGZyb20gcGdwb29sX21haW4uYyBh ZnRlciBwb29sX2luaXRfcG9vbF9pbmZvKCkuCisgKi8KK2V4dGVybiB2b2lkIHBvb2xfdHJhY2tf dGFibGVfbXV0YXRpb25faW5pdCh2b2lkKTsKKworLyoKKyAqIEluaXRpYWxpemUgcGVyLWNoaWxk IHByb2Nlc3Mgc3RhdGUgZm9yIHRyYWNrIHRhYmxlIG11dGF0aW9uLgorICogQ2FsbGVkIGZyb20g Y2hpbGQuYyB3aGVuIGEgbmV3IGNoaWxkIHByb2Nlc3Mgc3RhcnRzLgorICogU2V0cyB1cCBjb2xk IHN0YXJ0IHRyYWNraW5nLgorICovCitleHRlcm4gdm9pZCBwb29sX3RyYWNrX3RhYmxlX211dGF0 aW9uX2NoaWxkX2luaXQodm9pZCk7CisKKy8qCisgKiBDaGVjayBpZiB0aGUgY2hpbGQgcHJvY2Vz cyBpcyBpbiBjb2xkIHN0YXJ0IHBlcmlvZC4KKyAqIER1cmluZyBjb2xkIHN0YXJ0LCBhbGwgcXVl cmllcyBhcmUgcm91dGVkIHRvIHByaW1hcnkuCisgKiBSZXR1cm5zIHRydWUgaWYgaW4gY29sZCBz dGFydCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitleHRlcm4gYm9vbCBwb29sX3RyYWNrX3RhYmxl X211dGF0aW9uX2luX2NvbGRfc3RhcnQodm9pZCk7CisKKy8qCisgKiBUcmlnZ2VyIGEgZ2xvYmFs IGNvbGQgc3RhcnQgcGVyaW9kIGZvciBhbGwgcHJvY2Vzc2VzLgorICogVXNlZCBhZnRlciB3YXRj aGRvZyBsZWFkZXIgY2hhbmdlIHRvIGF2b2lkIHN0YWxlIHJlYWRzLgorICovCitleHRlcm4gdm9p ZCBwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX3RyaWdnZXJfZ2xvYmFsX2NvbGRfc3RhcnQodm9p ZCk7CisKKy8qCisgKiBHZXQgb2lkIG9mIGN1cnJlbnQgZGF0YWJhc2UuCisgKi8KK2V4dGVybiBp bnQJcG9vbF90cmFja190YWJsZV9tdXRhdGlvbl9nZXRfZGF0YWJhc2Vfb2lkKHZvaWQpOworCisv KgorICogQ2hlY2sgaWYgYSB0YWJsZSB3YXMgcmVjZW50bHkgd3JpdHRlbiB0byAoaXMgInN0YWxl IikuCisgKiBJZiBzdGFsZSwgcmVhZHMgZnJvbSB0aGlzIHRhYmxlIHNob3VsZCBnbyB0byBwcmlt YXJ5LgorICogUmV0dXJucyB0cnVlIGlmIHRhYmxlIGlzIHN0YWxlIChyZWNlbnRseSB3cml0dGVu KSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitleHRlcm4gYm9vbCBwb29sX3RyYWNrX3RhYmxlX211 dGF0aW9uX3RhYmxlX2lzX3N0YWxlKAorCQkJCQkJCQkJCQkJCSBpbnQgdGFibGVfb2lkLCBpbnQg ZGJvaWQpOworCisvKgorICogTWFyayB0YWJsZXMgYXMgcmVjZW50bHkgd3JpdHRlbi4KKyAqIENh bGxlZCBhZnRlciBJTlNFUlQvVVBEQVRFL0RFTEVURSBxdWVyaWVzIGNvbXBsZXRlLgorICogdGFi bGVfb2lkczogYXJyYXkgb2YgdGFibGUgb2lkcworICogbnVtX3RhYmxlczogbnVtYmVyIG9mIHRh YmxlcyBpbiBhcnJheQorICogZGJvaWQ6IGRhdGFiYXNlIG9pZAorICovCitleHRlcm4gdm9pZCBw b29sX3RyYWNrX3RhYmxlX211dGF0aW9uX21hcmtfdGFibGVzX3dyaXR0ZW4oCisJCQkJCQkJCQkJ CQkJCSAgY29uc3QgaW50ICp0YWJsZV9vaWRzLCBpbnQgbnVtX3RhYmxlcywgaW50IGRib2lkKTsK KworLyoKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIG1hcmsgYSBzaW5nbGUgdGFibGUgYXMg d3JpdHRlbi4KKyAqIHRhYmxlX29pZDogdGFibGUgb2lkCisgKiBkYm9pZDogZGF0YWJhc2Ugb2lk CisgKi8KK2V4dGVybiB2b2lkIHBvb2xfdHJhY2tfdGFibGVfbXV0YXRpb25fbWFya190YWJsZV93 cml0dGVuKAorCQkJCQkJCQkJCQkJCQkgaW50IHRhYmxlX29pZCwgaW50IGRib2lkKTsKKworLyoK KyAqIFVwZGF0ZSB0aGUgVFRMIGJhc2VkIG9uIGN1cnJlbnQgcmVwbGljYXRpb24gZGVsYXkuCisg KiBDYWxsZWQgZnJvbSBwb29sX3dvcmtlcl9jaGlsZC5jIHdoZW4gcmVwbGljYXRpb24gZGVsYXkg aXMgdXBkYXRlZC4KKyAqIGRlbGF5X3VzOiByZXBsaWNhdGlvbiBkZWxheSBpbiBtaWNyb3NlY29u ZHMKKyAqLworZXh0ZXJuIHZvaWQgcG9vbF90cmFja190YWJsZV9tdXRhdGlvbl91cGRhdGVfdHRs KHVpbnQ2NCBkZWxheV91cyk7CisKKy8qCisgKiBDYWxjdWxhdGUgcmVxdWlyZWQgc2hhcmVkIG1l bW9yeSBzaXplIGZvciB0cmFjayB0YWJsZSBtdXRhdGlvbi4KKyAqLworZXh0ZXJuIFNpemUgcG9v bF90cmFja190YWJsZV9tdXRhdGlvbl9zaG1lbV9zaXplKHZvaWQpOworCisjZW5kaWYJCQkJCQkJ LyogUE9PTF9UUkFDS19UQUJMRV9NVVRBVElPTl9IICovCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9w Z3Bvb2xfbWFpbi5jIGIvc3JjL21haW4vcGdwb29sX21haW4uYwppbmRleCAzMmJjYjBhMWYuLmU0 MWM1NzViZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vcGdwb29sX21haW4uYworKysgYi9zcmMvbWFp bi9wZ3Bvb2xfbWFpbi5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSAiYXV0aC9wb29sX3Bh c3N3ZC5oIgogI2luY2x1ZGUgImF1dGgvcG9vbF9oYmEuaCIKICNpbmNsdWRlICJxdWVyeV9jYWNo ZS9wb29sX21lbXFjYWNoZS5oIgorI2luY2x1ZGUgInV0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0 YXRpb24uaCIKICNpbmNsdWRlICJ3YXRjaGRvZy93ZF9pbnRlcm5hbF9jb21tYW5kcy5oIgogI2lu Y2x1ZGUgIndhdGNoZG9nL3dkX2xpZmVjaGVjay5oIgogI2luY2x1ZGUgIndhdGNoZG9nL3dhdGNo ZG9nLmgiCkBAIC0xNTAxLDExICsxNTAyLDE0IEBAIHNpZ3VzcjFfaW50ZXJydXB0X3Byb2Nlc3Nv cih2b2lkKQogCiAJaWYgKHVzZXIxU2lnbmFsU2xvdC0+c2lnbmFsRmxhZ3NbU0lHX1dBVENIRE9H X1NUQVRFX0NIQU5HRURdKQogCXsKKwkJV0RfU1RBVEVTCXdkX3N0YXRlOworCiAJCWVyZXBvcnQo TE9HLAogCQkJCShlcnJtc2coIlBncG9vbC1JSSBwYXJlbnQgcHJvY2VzcyByZWNlaXZlZCB3YXRj aGRvZyBzdGF0ZSBjaGFuZ2Ugc2lnbmFsIGZyb20gd2F0Y2hkb2ciKSkpOwogCiAJCXVzZXIxU2ln bmFsU2xvdC0+c2lnbmFsRmxhZ3NbU0lHX1dBVENIRE9HX1NUQVRFX0NIQU5HRURdID0gZmFsc2U7 Ci0JCWlmICh3ZF9pbnRlcm5hbF9nZXRfd2F0Y2hkb2dfbG9jYWxfbm9kZV9zdGF0ZSgpID09IFdE X1NUQU5EQlkpCisJCXdkX3N0YXRlID0gd2RfaW50ZXJuYWxfZ2V0X3dhdGNoZG9nX2xvY2FsX25v ZGVfc3RhdGUoKTsKKwkJaWYgKHdkX3N0YXRlID09IFdEX1NUQU5EQlkpCiAJCXsKIAkJCWVyZXBv cnQoTE9HLAogCQkJCQkoZXJybXNnKCJ3ZSBoYXZlIGpvaW5lZCB0aGUgd2F0Y2hkb2cgY2x1c3Rl ciBhcyBTVEFOREJZIG5vZGUiKSwKQEAgLTE1MTksNiArMTUyMywxMiBAQCBzaWd1c3IxX2ludGVy cnVwdF9wcm9jZXNzb3Iodm9pZCkKIAkJCSAqLwogCQkJcG9vbF9yZWxlYXNlX2ZvbGxvd19wcmlt YXJ5X2xvY2sodHJ1ZSk7CiAJCX0KKwkJZWxzZSBpZiAod2Rfc3RhdGUgPT0gV0RfQ09PUkRJTkFU T1IgJiYKKwkJCQkgcG9vbF9jb25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlID09 CisJCQkJIERMQk9XX0RNTF9BREFQVElWRV9HTE9CQUwpCisJCXsKKwkJCXBvb2xfdHJhY2tfdGFi bGVfbXV0YXRpb25fdHJpZ2dlcl9nbG9iYWxfY29sZF9zdGFydCgpOworCQl9CiAJfQogCWlmICh1 c2VyMVNpZ25hbFNsb3QtPnNpZ25hbEZsYWdzW1NJR19GQUlMT1ZFUl9JTlRFUlJVUFRdKQogCXsK QEAgLTMwODQsNiArMzA5NCwxNiBAQCBpbml0aWFsaXplX3NoYXJlZF9tZW1fb2JqZWN0cyhib29s IGNsZWFyX21lbWNhY2hlX29pZG1hcHMpCiAJCWVsb2coREVCVUcxLCAid2F0Y2hkb2c6ICV6dSBi eXRlcyByZXF1ZXN0ZWQgZm9yIHNoYXJlZCBtZW1vcnkiLCBNQVhBTElHTih3ZF9pcGNfZ2V0X3No YXJlZF9tZW1fc2l6ZSgpKSk7CiAJfQogCisJaWYgKHBvb2xfY29uZmlnLT5kaXNhYmxlX2xvYWRf YmFsYW5jZV9vbl93cml0ZSA9PQorCQlETEJPV19ETUxfQURBUFRJVkVfR0xPQkFMKQorCXsKKwkJ c2l6ZSArPSBNQVhBTElHTihwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX3NobWVtX3NpemUoKSk7 CisJCWVsb2coREVCVUcxLAorCQkJICJ0cmFja190YWJsZV9tdXRhdGlvbjogJXp1IGJ5dGVzIHJl cXVlc3RlZCIKKwkJCSAiIGZvciBzaGFyZWQgbWVtb3J5IiwKKwkJCSBNQVhBTElHTihwb29sX3Ry YWNrX3RhYmxlX211dGF0aW9uX3NobWVtX3NpemUoKSkpOworCX0KKwogCWluaXRpYWxpemVfc2hh cmVkX21lbW9yeV9tYWluX3NlZ21lbnQoc2l6ZSk7CiAKIAkvKiBNb3ZlIHRoZSBiYWNrZW5kIGRl c2NyaXB0b3JzIHRvIHNoYXJlZCBtZW1vcnkgKi8KQEAgLTMyMDAsNiArMzIyMCwxMyBAQCBpbml0 aWFsaXplX3NoYXJlZF9tZW1fb2JqZWN0cyhib29sIGNsZWFyX21lbWNhY2hlX29pZG1hcHMpCiAJ CXdkX2lwY19pbml0aWFsaXplX2RhdGEoKTsKIAl9CiAKKwkvKiBJbml0aWFsaXplIHRyYWNrIHRh YmxlIG11dGF0aW9uIGZvciByZWNlbnRseSB3cml0dGVuIHRhYmxlcyAqLworCWlmIChwb29sX2Nv bmZpZy0+ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3JpdGUgPT0KKwkJRExCT1dfRE1MX0FEQVBU SVZFX0dMT0JBTCkKKwl7CisJCXBvb2xfdHJhY2tfdGFibGVfbXV0YXRpb25faW5pdCgpOworCX0K KwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvY29sL0NvbW1hbmRDb21wbGV0ZS5jIGIv c3JjL3Byb3RvY29sL0NvbW1hbmRDb21wbGV0ZS5jCmluZGV4IGEzYjhmMGVhMS4uZjQ0NWYyNjhi IDEwMDY0NAotLS0gYS9zcmMvcHJvdG9jb2wvQ29tbWFuZENvbXBsZXRlLmMKKysrIGIvc3JjL3By b3RvY29sL0NvbW1hbmRDb21wbGV0ZS5jCkBAIC0zOCw2ICszOCw4IEBACiAjaW5jbHVkZSAidXRp bHMvcGFsbG9jLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGls cy9wb29sX3N0cmVhbS5oIgorI2luY2x1ZGUgInV0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRp b24uaCIKKyNpbmNsdWRlICJxdWVyeV9jYWNoZS9wb29sX21lbXFjYWNoZS5oIgogCiBzdGF0aWMg aW50CWV4dHJhY3RfbnR1cGxlcyhjaGFyICptZXNzYWdlKTsKIHN0YXRpYyBQT09MX1NUQVRVUyBo YW5kbGVfbWlzbWF0Y2hfdHVwbGVzKFBPT0xfQ09OTkVDVElPTiAqZnJvbnRlbmQsIFBPT0xfQ09O TkVDVElPTl9QT09MICpiYWNrZW5kLCBjaGFyICpwYWNrZXQsIGludCBwYWNrZXRsZW4sIGJvb2wg Y29tbWFuZF9jb21wbGV0ZSk7CkBAIC0zMDQsNiArMzA2LDMyIEBAIGhhbmRsZV9xdWVyeV9jb250 ZXh0KFBPT0xfQ09OTkVDVElPTl9QT09MICpiYWNrZW5kKQogCiAJbm9kZSA9IHNlc3Npb25fY29u dGV4dC0+cXVlcnlfY29udGV4dC0+cGFyc2VfdHJlZTsKIAorCS8qCisJICogVHJhY2sgdGFibGUg d3JpdGVzIGZvciBkbWxfYWRhcHRpdmVfZ2xvYmFsIGZlYXR1cmUuIEZvciBhdXRvY29tbWl0CisJ ICogc3RhdGVtZW50cyAobm90IGluIGV4cGxpY2l0IHRyYW5zYWN0aW9uKSwgbWFyayB0YWJsZXMg aW1tZWRpYXRlbHkuIEZvcgorCSAqIGV4cGxpY2l0IHRyYW5zYWN0aW9ucywgbWFya2luZyBpcyBk ZWZlcnJlZCB0byBDT01NSVQgaW4gZG1sX2FkYXB0aXZlKCkKKwkgKiBzbyB0aGF0IFJPTExCQUNL ZWQgd3JpdGVzIGRvbid0IHBvbGx1dGUgdGhlIHNoYXJlZCBtZW1vcnkgdGFibGUgbWFwLgorCSAq LworCWlmIChwb29sX2NvbmZpZy0+ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3JpdGUgPT0KKwkJ RExCT1dfRE1MX0FEQVBUSVZFX0dMT0JBTCAmJgorCQlub2RlICE9IE5VTEwgJiYKKwkJIXNlc3Np b25fY29udGV4dC0+aXNfaW5fdHJhbnNhY3Rpb24pCisJeworCQlpbnQJCSAgICpvaWRzOworCQlp bnQJCQludW1fb2lkczsKKworCQludW1fb2lkcyA9IHBvb2xfZXh0cmFjdF90YWJsZV9vaWRzKG5v ZGUsICZvaWRzKTsKKwkJaWYgKG51bV9vaWRzID4gMCkKKwkJeworCQkJaW50CQkJZGJvaWQ7CisK KwkJCWRib2lkID0gcG9vbF90cmFja190YWJsZV9tdXRhdGlvbl9nZXRfZGF0YWJhc2Vfb2lkKCk7 CisJCQlpZiAoZGJvaWQgPiAwKQorCQkJCXBvb2xfdHJhY2tfdGFibGVfbXV0YXRpb25fbWFya190 YWJsZXNfd3JpdHRlbigKKwkJCQkJCQkJCQkJCQkJCSAgb2lkcywgbnVtX29pZHMsIGRib2lkKTsK KwkJfQorCX0KKwogCWlmIChJc0Eobm9kZSwgUHJlcGFyZVN0bXQpKQogCXsKIAkJaWYgKHNlc3Np b25fY29udGV4dC0+dW5jb21wbGV0ZWRfbWVzc2FnZSkKZGlmZiAtLWdpdCBhL3NyYy9wcm90b2Nv bC9jaGlsZC5jIGIvc3JjL3Byb3RvY29sL2NoaWxkLmMKaW5kZXggNzYxODc2ZjUzLi40YTUyN2M4 NGMgMTAwNjQ0Ci0tLSBhL3NyYy9wcm90b2NvbC9jaGlsZC5jCisrKyBiL3NyYy9wcm90b2NvbC9j aGlsZC5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSAidXRpbHMvZWxvZy5oIgogI2luY2x1 ZGUgInV0aWxzL3BzX3N0YXR1cy5oIgogI2luY2x1ZGUgInV0aWxzL3RpbWVzdGFtcC5oIgorI2lu Y2x1ZGUgInV0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24uaCIKIAogI2luY2x1ZGUgImNv bnRleHQvcG9vbF9wcm9jZXNzX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb250ZXh0L3Bvb2xfc2Vz c2lvbl9jb250ZXh0LmgiCkBAIC0yMTMsNiArMjE0LDEzIEBAIGRvX2NoaWxkKGludCAqZmRzKQog CS8qIEluaXRpYWxpemUgcGVyIHByb2Nlc3MgY29udGV4dCAqLwogCXBvb2xfaW5pdF9wcm9jZXNz X2NvbnRleHQoKTsKIAorCS8qIEluaXRpYWxpemUgdHJhY2sgdGFibGUgbXV0YXRpb24gY2hpbGQg c3RhdGUgZm9yIGNvbGQgc3RhcnQgdHJhY2tpbmcgKi8KKwlpZiAocG9vbF9jb25maWctPmRpc2Fi bGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlID09CisJCURMQk9XX0RNTF9BREFQVElWRV9HTE9CQUwp CisJeworCQlwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX2NoaWxkX2luaXQoKTsKKwl9CisKIAkv KiBpbml0aWFsaXplIGNvbm5lY3Rpb24gcG9vbCAqLwogCWlmIChwb29sX2luaXRfY3AoKSkKIAl7 CmRpZmYgLS1naXQgYS9zcmMvcHJvdG9jb2wvcG9vbF9wcm90b19tb2R1bGVzLmMgYi9zcmMvcHJv dG9jb2wvcG9vbF9wcm90b19tb2R1bGVzLmMKaW5kZXggZjk0NThiYjU1Li41YmVlNjNhMTUgMTAw NjQ0Ci0tLSBhL3NyYy9wcm90b2NvbC9wb29sX3Byb3RvX21vZHVsZXMuYworKysgYi9zcmMvcHJv dG9jb2wvcG9vbF9wcm90b19tb2R1bGVzLmMKQEAgLTI2OCw2ICsyNjgsNyBAQCBTaW1wbGVRdWVy eShQT09MX0NPTk5FQ1RJT04gKmZyb250ZW5kLAogCSAqLwogCWlmIChwb29sX2NvbmZpZy0+bWVt b3J5X2NhY2hlX2VuYWJsZWQgJiYgaXNfbGlrZWx5X3NlbGVjdCAmJgogCQkhcG9vbF9pc193cml0 aW5nX3RyYW5zYWN0aW9uKCkgJiYKKwkJIXBvb2xfaGFzX2RtbF9hZGFwdGl2ZV93cml0ZV9pbl90 cmFuc2FjdGlvbigpICYmCiAJCVRTVEFURShiYWNrZW5kLCBNQUlOX1JFUExJQ0EgPyBQUklNQVJZ X05PREVfSUQgOiBSRUFMX01BSU5fTk9ERV9JRCkgIT0gJ0UnICYmCiAJCSFxdWVyeV9jYWNoZV9k aXNhYmxlZCgpKQogCXsKQEAgLTEwMjUsNiArMTAyNiw3IEBAIEV4ZWN1dGUoUE9PTF9DT05ORUNU SU9OICpmcm9udGVuZCwgUE9PTF9DT05ORUNUSU9OX1BPT0wgKmJhY2tlbmQsCiAJICogcGFydGlh bF9mZXRjaCBpcyB0cnVlLCBjYW5ub3QgdXNlIGNhY2hlLgogCSAqLwogCWlmIChwb29sX2NvbmZp Zy0+bWVtb3J5X2NhY2hlX2VuYWJsZWQgJiYgIXBvb2xfaXNfd3JpdGluZ190cmFuc2FjdGlvbigp ICYmCisJCSFwb29sX2hhc19kbWxfYWRhcHRpdmVfd3JpdGVfaW5fdHJhbnNhY3Rpb24oKSAmJgog CQkoVFNUQVRFKGJhY2tlbmQsIE1BSU5fUkVQTElDQSA/IFBSSU1BUllfTk9ERV9JRCA6IFJFQUxf TUFJTl9OT0RFX0lEKSAhPSAnRScpCiAJCSYmIHBvb2xfaXNfbGlrZWx5X3NlbGVjdChxdWVyeSkg JiYgIXF1ZXJ5X2NhY2hlX2Rpc2FibGVkKCkgJiYKIAkJKHF1ZXJ5X2NvbnRleHQtPmF0RW5kIHx8 IG51bV9yb3dzID09IDApICYmCkBAIC0xNDYxLDcgKzE0NjMsOSBAQCBQYXJzZShQT09MX0NPTk5F Q1RJT04gKmZyb250ZW5kLCBQT09MX0NPTk5FQ1RJT05fUE9PTCAqYmFja2VuZCwKIAkJcG9vbF93 aGVyZV90b19zZW5kKHF1ZXJ5X2NvbnRleHQsIHF1ZXJ5X2NvbnRleHQtPm9yaWdpbmFsX3F1ZXJ5 LAogCQkJCQkJICAgcXVlcnlfY29udGV4dC0+cGFyc2VfdHJlZSk7CiAKLQkJaWYgKHBvb2xfY29u ZmlnLT5kaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSA9PSBETEJPV19ETUxfQURBUFRJVkUg JiYgc3RybGVuKG5hbWUpICE9IDApCisJCWlmIChETEJPV19JU19ETUxfQURBUFRJVkUoCisJCQkJ CQkJCSAgcG9vbF9jb25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dyaXRlKQorCQkJJiYg c3RybGVuKG5hbWUpICE9IDApCiAJCQlwb29sX3NldGFsbF9ub2RlX3RvX2JlX3NlbnQocXVlcnlf Y29udGV4dCk7CiAKIAkJaWYgKFJFUExJQ0FUSU9OKQpAQCAtMTgwNCw3ICsxODA4LDcgQEAgQmlu ZChQT09MX0NPTk5FQ1RJT04gKmZyb250ZW5kLCBQT09MX0NPTk5FQ1RJT05fUE9PTCAqYmFja2Vu ZCwKIAkJCXJldHVybiBQT09MX0VORDsKIAl9CiAKLQlpZiAocG9vbF9jb25maWctPmRpc2FibGVf bG9hZF9iYWxhbmNlX29uX3dyaXRlID09IERMQk9XX0RNTF9BREFQVElWRSAmJgorCWlmIChETEJP V19JU19ETUxfQURBUFRJVkUocG9vbF9jb25maWctPmRpc2FibGVfbG9hZF9iYWxhbmNlX29uX3dy aXRlKSAmJgogCQlUU1RBVEUoYmFja2VuZCwgTUFJTl9SRVBMSUNBID8gUFJJTUFSWV9OT0RFX0lE IDogUkVBTF9NQUlOX05PREVfSUQpID09ICdUJykKIAl7CiAJCXBvb2xfd2hlcmVfdG9fc2VuZChx dWVyeV9jb250ZXh0LCBxdWVyeV9jb250ZXh0LT5vcmlnaW5hbF9xdWVyeSwKZGlmZiAtLWdpdCBh L3NyYy9zYW1wbGUvcGdwb29sLmNvbmYuc2FtcGxlLXN0cmVhbSBiL3NyYy9zYW1wbGUvcGdwb29s LmNvbmYuc2FtcGxlLXN0cmVhbQppbmRleCAxYWM5ODI5MDcuLmNlOWI5MmRhMCAxMDA2NDQKLS0t IGEvc3JjL3NhbXBsZS9wZ3Bvb2wuY29uZi5zYW1wbGUtc3RyZWFtCisrKyBiL3NyYy9zYW1wbGUv cGdwb29sLmNvbmYuc2FtcGxlLXN0cmVhbQpAQCAtNDc4LDYgKzQ3OCwxNCBAQCBiYWNrZW5kX2Ns dXN0ZXJpbmdfbW9kZSA9IHN0cmVhbWluZ19yZXBsaWNhdGlvbgogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAjICAgICBtb2RpZmllZCB3aXRoaW4gdGhlIGN1cnJlbnQgZXhwbGlj aXQgdHJhbnNhY3Rpb24gd2lsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAj ICAgICBub3QgYmUgbG9hZCBiYWxhbmNlZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlv bi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAjIGRtbF9hZGFwdGl2ZV9nbG9iYWw6CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICMgICAgIFN1cGVyc2V0IG9mIGRtbF9hZGFwdGl2ZS4gSW4g YWRkaXRpb24gdG8gcGVyLXRyYW5zYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICMgICAgIHRyYWNraW5nLCB1c2VzIHNoYXJlZCBtZW1vcnkgdG8gdHJhY2sgcmVjZW50 bHkgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICB0YWJs ZXMgYWNyb3NzIGFsbCBzZXNzaW9ucy4gUmVhZHMgZnJvbSByZWNlbnRseSB3cml0dGVuCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgIHRhYmxlcyBhcmUgcm91dGVkIHRv IHByaW1hcnkgdW50aWwgYSBUVEwgKGJhc2VkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICMgICAgIHJlcGxpY2F0aW9uIGRlbGF5KSBleHBpcmVzLiBSZXF1aXJlcyBhZGRp dGlvbmFsIHNoYXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBt ZW1vcnkuIFNlZSB0cmFja190YWJsZV9tdXRhdGlvbl8qIHBhcmFtZXRlcnMgYmVsb3cuCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIyBhbHdheXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICMgICAgIGlmIGEgd3JpdGUgcXVlcnkgaXMgaXNzdWVkLCByZWFkIHF1ZXJpZXMgd2lsbAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBub3QgYmUgbG9hZCBiYWxhbmNl ZCB1bnRpbCB0aGUgc2Vzc2lvbiBlbmRzLgpAQCAtNDk5LDYgKzUwNyw0MyBAQCBiYWNrZW5kX2Ns dXN0ZXJpbmdfbW9kZSA9IHN0cmVhbWluZ19yZXBsaWNhdGlvbgogI3N0YXRlbWVudF9sZXZlbF9s b2FkX2JhbGFuY2UgPSBvZmYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBF bmFibGVzIHN0YXRlbWVudCBsZXZlbCBsb2FkIGJhbGFuY2luZwogCisjIC0gVHJhY2sgVGFibGUg TXV0YXRpb24gKHVzZWQgYnkgZG1sX2FkYXB0aXZlX2dsb2JhbCkgLQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAjIFdBUk5JTkc6IGRtbF9hZGFwdGl2ZV9nbG9iYWwgaW5jcmVh c2VzIHNoYXJlZCBtZW1vcnkgdXNhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIyBEZWZhdWx0IHNldHRpbmdzIHJlcXVpcmUgfjgwIEtCIHNoYXJlZCBtZW1vcnkgZm9yIHRh YmxlIHRyYWNraW5nCisKKyN0cmFja190YWJsZV9tdXRhdGlvbl90dGxfZmFjdG9yID0gNS4wCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVFRMIG11bHRpcGxpZXI6IFRUTCA9 IHJlcGxpY2F0aW9uX2RlbGF5ICogZmFjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICMgSGlnaGVyIHZhbHVlcyBwcm92aWRlIG1vcmUgc2FmZXR5IG1hcmdpbgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJhbmdlOiAxLjAtMTAwLjAgKGRlZmF1bHQ6 IDUuMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoY2hhbmdlIHJlcXVp cmVzIHJlbG9hZCkKKworI3RyYWNrX3RhYmxlX211dGF0aW9uX21heF9zdGFsZW5lc3MgPSA2MDAw MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1heGltdW0gZHVyYXRpb24g KG1zKSBhIHRhYmxlIGNhbiBiZSBtYXJrZWQgc3RhbGUKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIyBmcm9tIGl0cyBmaXJzdCB3cml0ZS4gQm91bmRzIGNyb3NzLXNlc3Npb24g aW1wYWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV2ZW4gdW5kZXIg Y29udGludW91cyB3cml0ZXMsIHN0YWxlbmVzcyBleHBpcmVzCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICMgYWZ0ZXIgdGhpcyBwZXJpb2QgYW5kIGlzIG9ubHkgcmVuZXdlZCBi eSBuZXcgd3JpdGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDAgZGlz YWJsZXMgdGhlIGNhcC4gUmFuZ2U6IDAtMzYwMDAwMCAoZGVmYXVsdDogNjAwMDAgPSA2MHMpCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKGNoYW5nZSByZXF1aXJlcyByZWxv YWQpCisKKyN0cmFja190YWJsZV9tdXRhdGlvbl9jb2xkX3N0YXJ0X2R1cmF0aW9uID0gMjAwMAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIER1cmF0aW9uIGluIG1pbGxpc2Vj b25kcyB0byByb3V0ZSBhbGwgcXVlcmllcyB0byBwcmltYXJ5CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICMgYWZ0ZXIgY2hpbGQgcHJvY2VzcyBzdGFydHMgKGNvbGQgc3RhcnQg cGVyaW9kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJhbmdlOiAwLTYw MDAwIG1zIChkZWZhdWx0OiAyMDAwIG1zID0gMiBzZWNvbmRzKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAjIFNldCB0byAwIHRvIGRpc2FibGUgY29sZCBzdGFydCBiZWhhdmlv cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChjaGFuZ2UgcmVxdWlyZXMg cmVsb2FkKQorCisjdHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfYnVja2V0cyA9IDEwMjQKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgaGFzaCBidWNrZXRz IGZvciB0cmFjayB0YWJsZSBtdXRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAjIEhpZ2hlciB2YWx1ZXMgcmVkdWNlIGhhc2ggY29sbGlzaW9ucworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAjIFJhbmdlOiA2NC02NTUzNiAoZGVmYXVsdDogMTAyNCkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoY2hhbmdlIHJlcXVpcmVzIHJl c3RhcnQpCisKKyN0cmFja190YWJsZV9tdXRhdGlvbl90YWJsZV9zaXplID0gMjA0OAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1heGltdW0gbnVtYmVyIG9mIHRhYmxlcyB0 byB0cmFjayBzaW11bHRhbmVvdXNseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAjIFJhbmdlOiAxMjgtMTMxMDcyIChkZWZhdWx0OiAyMDQ4KQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAjIChjaGFuZ2UgcmVxdWlyZXMgcmVzdGFydCkKKworCiAjLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCiAjIFNUUkVBTUlORyBSRVBMSUNBVElPTiBNT0RFCiAjLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvc3RyZWFtaW5nX3JlcGxpY2F0aW9uL3Bvb2xf d29ya2VyX2NoaWxkLmMgYi9zcmMvc3RyZWFtaW5nX3JlcGxpY2F0aW9uL3Bvb2xfd29ya2VyX2No aWxkLmMKaW5kZXggMzExYjYzODY1Li5jZGQ1NzAzOTYgMTAwNjQ0Ci0tLSBhL3NyYy9zdHJlYW1p bmdfcmVwbGljYXRpb24vcG9vbF93b3JrZXJfY2hpbGQuYworKysgYi9zcmMvc3RyZWFtaW5nX3Jl cGxpY2F0aW9uL3Bvb2xfd29ya2VyX2NoaWxkLmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRl ICJ1dGlscy9wb29sX2lwLmgiCiAjaW5jbHVkZSAidXRpbHMvcHNfc3RhdHVzLmgiCiAjaW5jbHVk ZSAidXRpbHMvcG9vbF9zdHJlYW0uaCIKKyNpbmNsdWRlICJ1dGlscy9wb29sX3RyYWNrX3RhYmxl X211dGF0aW9uLmgiCiAKICNpbmNsdWRlICJjb250ZXh0L3Bvb2xfcHJvY2Vzc19jb250ZXh0Lmgi CiAjaW5jbHVkZSAiY29udGV4dC9wb29sX3Nlc3Npb25fY29udGV4dC5oIgpAQCAtNDE5LDYgKzQy MCw3IEBAIGNoZWNrX3JlcGxpY2F0aW9uX3RpbWVfbGFnKHZvaWQpCiAJQmFja2VuZEluZm8gKmJr aW5mbzsKIAl1aW50NjQJCWxhZzsKIAl1aW50NjQJCWRlbGF5X3RocmVzaG9sZF9ieV90aW1lOwor CXVpbnQ2NAkJbWF4X2RlbGF5X3VzID0gMDsKIAlFcnJvckNvbnRleHRDYWxsYmFjayBjYWxsYmFj azsKIAlpbnQJCQlhY3RpdmVfc3RhbmRieV9ub2RlOwogCWJvb2wJCXJlcGxpY2F0aW9uX2RlbGF5 X2J5X3RpbWU7CkBAIC02NDMsNiArNjQ1LDEwIEBAIGNoZWNrX3JlcGxpY2F0aW9uX3RpbWVfbGFn KHZvaWQpCiAJCQkJCQkJCQkJCQkJICogc2Vjb25kcyB0byBtaWNybwogCQkJCQkJCQkJCQkJCSAq IHNlY29uZHMgKi8KIAorCQkJCS8qIFRyYWNrIG1heCBkZWxheSBmb3IgbXV0YXRpb24gVFRMICov CisJCQkJaWYgKGxhZyA+IG1heF9kZWxheV91cykKKwkJCQkJbWF4X2RlbGF5X3VzID0gbGFnOwor CiAJCQkJLyogTG9nIGRlbGF5IGlmIG5lY2Vzc2FyeSAqLwogCQkJCWlmICgocG9vbF9jb25maWct PmxvZ19zdGFuZGJ5X2RlbGF5ID09IExTRF9BTFdBWVMgJiYgbGFnID4gMCkgfHwKIAkJCQkJKHBv b2xfY29uZmlnLT5sb2dfc3RhbmRieV9kZWxheSA9PSBMU0RfT1ZFUl9USFJFU0hPTEQgJiYKQEAg LTY2OCw2ICs2NzQsMTMgQEAgY2hlY2tfcmVwbGljYXRpb25fdGltZV9sYWcodm9pZCkKIAkJfQog CX0KIAorCS8qCisJICogVXBkYXRlIHRyYWNrIHRhYmxlIG11dGF0aW9uIFRUTCBmcm9tIHRoZSBt YXggb2JzZXJ2ZWQgdGltZS1iYXNlZAorCSAqIHJlcGxpY2F0aW9uIGRlbGF5LgorCSAqLworCWlm IChyZXBsaWNhdGlvbl9kZWxheV9ieV90aW1lICYmIG1heF9kZWxheV91cyA+IDApCisJCXBvb2xf dHJhY2tfdGFibGVfbXV0YXRpb25fdXBkYXRlX3R0bChtYXhfZGVsYXlfdXMpOworCiAJZXJyb3Jf Y29udGV4dF9zdGFjayA9IGNhbGxiYWNrLnByZXZpb3VzOwogfQogCkBAIC02OTUsNiArNzA4LDcg QEAgY2hlY2tfcmVwbGljYXRpb25fdGltZV9sYWdfd2l0aF9jbWQodm9pZCkKIAlkb3VibGUJCWRl bGF5X21zOwogCXVpbnQ2NAkJZGVsYXk7CiAJdWludDY0CQlkZWxheV90aHJlc2hvbGRfYnlfdGlt ZTsKKwl1aW50NjQJCW1heF9kZWxheV91cyA9IDA7CS8qIFRyYWNrIG1heCBkZWxheSBmb3IgbXV0 YXRpb24gbWFwICovCiAJaW50CQkJdG9rZW5fY291bnQgPSAwOwogCWludAkJCXByaW1hcnlfbm9k ZV9pZDsKIAlpbnQJCQlzYXZlX2Vycm5vOwpAQCAtMTAwMyw2ICsxMDE3LDEwIEBAIGNoZWNrX3Jl cGxpY2F0aW9uX3RpbWVfbGFnX3dpdGhfY21kKHZvaWQpCiAJCQlia2luZm8tPnN0YW5kYnlfZGVs YXkgPSBkZWxheTsKIAkJCWJraW5mby0+c3RhbmRieV9kZWxheV9ieV90aW1lID0gdHJ1ZTsKIAor CQkJLyogVHJhY2sgbWF4aW11bSBkZWxheSBmb3IgdGFibGUgbXV0YXRpb24gbWFwIFRUTCBjYWxj dWxhdGlvbiAqLworCQkJaWYgKGRlbGF5ID4gbWF4X2RlbGF5X3VzKQorCQkJCW1heF9kZWxheV91 cyA9IGRlbGF5OworCiAJCQkvKgogCQkJICogTG9nIGRlbGF5IGlmIG5lY2Vzc2FyeS4gdGhyZXNo b2xkIGlzIGluIG1pbGxpc2Vjb25kcywgY29udmVydAogCQkJICogdG8gbWljcm9zZWNvbmRzLgpA QCAtMTAyMSw2ICsxMDM5LDEyIEBAIGNoZWNrX3JlcGxpY2F0aW9uX3RpbWVfbGFnX3dpdGhfY21k KHZvaWQpCiAJCQl0b2tlbiA9IHN0cnRva19yKE5VTEwsICIgXHRcbiIsICZzYXZlcHRyKTsKIAkJ fQogCisJCS8qIFVwZGF0ZSB0YWJsZSBtdXRhdGlvbiBUVEwgYmFzZWQgb24gbWF4IG9ic2VydmVk IGRlbGF5ICovCisJCWlmIChwb29sX2NvbmZpZy0+ZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3Jp dGUgPT0KKwkJCURMQk9XX0RNTF9BREFQVElWRV9HTE9CQUwgJiYKKwkJCW1heF9kZWxheV91cyA+ IDApCisJCQlwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX3VwZGF0ZV90dGwobWF4X2RlbGF5X3Vz KTsKKwogCX0KIAlQR19DQVRDSCgpOwogCXsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Np b24vbGlicy5zaCBiL3NyYy90ZXN0L3JlZ3Jlc3Npb24vbGlicy5zaAppbmRleCA3YzVhMGMxODIu LjFjOGFlMzkyZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzc2lvbi9saWJzLnNoCisrKyBi L3NyYy90ZXN0L3JlZ3Jlc3Npb24vbGlicy5zaApAQCAtNDIsNiArNDIsOCBAQCBmdW5jdGlvbiB3 YWl0X2Zvcl9mYWlsb3Zlcl9kb25lIHsKIGZ1bmN0aW9uIGNsZWFuX2FsbCB7CiAJcGdyZXAgcGdw b29sIHwgeGFyZ3Mga2lsbCAtOSA+IC9kZXYvbnVsbCAyPiYxCiAJcGdyZXAgcG9zdGdyZXMgfCB4 YXJncyBraWxsIC05ID4gL2Rldi9udWxsIDI+JjEKKwkjIENsZWFuIHVwIGxlYWtlZCBTeXNWIElQ QyByZXNvdXJjZXMgbGVmdCBiZWhpbmQgYnkga2lsbCAtOQorCWlwY3JtIC0tYWxsIDI+L2Rldi9u dWxsIHx8IHRydWUKIAlybSAtZiAkUEdTT0NLRVRfRElSLy5zLlBHU1FMLioKIAluZXRzdGF0IC10 IC1wIDI+L2Rldi9udWxsfGdyZXAgcGdwb29sCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzaW9uL3Rlc3RzLzA0My50cmFja190YWJsZV9tdXRhdGlvbi90ZXN0LnNoIGIvc3JjL3Rlc3Qv cmVncmVzc2lvbi90ZXN0cy8wNDMudHJhY2tfdGFibGVfbXV0YXRpb24vdGVzdC5zaApuZXcgZmls ZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwMDAuLjhiNGRkMTdiOAotLS0gL2Rldi9udWxsCisr KyBiL3NyYy90ZXN0L3JlZ3Jlc3Npb24vdGVzdHMvMDQzLnRyYWNrX3RhYmxlX211dGF0aW9uL3Rl c3Quc2gKQEAgLTAsMCArMSwzNTQgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisjIHRlc3Qgc2NyaXB0IGZvciB0cmFjayB0YWJsZSBtdXRhdGlvbiBmZWF0dXJlIChpbi1tZW1v cnkgdGFibGUgdHJhY2tpbmcpLgorIyBUZXN0cyByb3V0aW5nIG9mIHF1ZXJpZXMgYmFzZWQgb24g cmVjZW50bHkgd3JpdHRlbiB0YWJsZXMuCisjCitzb3VyY2UgJFRFU1RMSUJTCitURVNURElSPXRl c3RkaXIKK1BTUUw9JFBHQklOL3BzcWwKK1BTUUxPUFRTPSItYSAtcSAtWCIKK1BHUE9PTEJJTj0k UEdQT09MX0lOU1RBTExfRElSL2JpbgorZXhwb3J0IFBHREFUQUJBU0U9dGVzdAorCisjIE9ubHkg cnVuIGluIHN0cmVhbWluZyByZXBsaWNhdGlvbiBtb2RlIHNpbmNlIHRoYXQncyB0aGUgdGFyZ2V0 IHVzZSBjYXNlCitmb3IgbW9kZSBpbiBzCitkbworICAgIHJtIC1mciAkVEVTVERJUgorICAgIG1r ZGlyICRURVNURElSCisgICAgY2QgJFRFU1RESVIKKworICAgICMgQ3JlYXRlIHRlc3QgZW52aXJv bm1lbnQgd2l0aCAyIG5vZGVzCisgICAgZWNobyAtbiAiY3JlYXRpbmcgdGVzdCBlbnZpcm9ubWVu dC4uLiIKKyAgICAkUEdQT09MX1NFVFVQIC1tICRtb2RlIC1uIDIgfHwgZXhpdCAxCisgICAgZWNo byAiZG9uZS4iCisKKyAgICBzb3VyY2UgLi9iYXNocmMucG9ydHMKKworICAgICMgQ29uZmlndXJl IHRyYWNrIHRhYmxlIG11dGF0aW9uIGZlYXR1cmUgdmlhIGRtbF9hZGFwdGl2ZV9nbG9iYWwKKyAg ICBlY2hvICJkaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSA9ICdkbWxfYWRhcHRpdmVfZ2xv YmFsJyIgPj4gZXRjL3BncG9vbC5jb25mCisgICAgZWNobyAidHJhY2tfdGFibGVfbXV0YXRpb25f dHRsX2ZhY3RvciA9IDUuMCIgPj4gZXRjL3BncG9vbC5jb25mCisgICAgZWNobyAidHJhY2tfdGFi bGVfbXV0YXRpb25fY29sZF9zdGFydF9kdXJhdGlvbiA9IDEwMDAwIiA+PiBldGMvcGdwb29sLmNv bmYKKworICAgICMgRW5hYmxlIGxvYWQgYmFsYW5jaW5nIGV4cGxpY2l0bHkKKyAgICBlY2hvICJs b2FkX2JhbGFuY2VfbW9kZSA9IG9uIiA+PiBldGMvcGdwb29sLmNvbmYKKworICAgICMgQ29uZmln dXJlIHdlaWdodHMgc28gd2UgY2FuIGRpc3Rpbmd1aXNoIHJvdXRpbmcKKyAgICAjIEJhY2tlbmQg MCAocHJpbWFyeSkgd2VpZ2h0PTAsIEJhY2tlbmQgMSAoc3RhbmRieSkgd2VpZ2h0PTEKKyAgICAj IFRoaXMgbWVhbnMgbG9hZCBiYWxhbmNlZCBxdWVyaWVzIGdvIHRvIG5vZGUgMSBieSBkZWZhdWx0 CisgICAgZWNobyAiYmFja2VuZF93ZWlnaHQwID0gMCIgPj4gZXRjL3BncG9vbC5jb25mCisgICAg ZWNobyAiYmFja2VuZF93ZWlnaHQxID0gMSIgPj4gZXRjL3BncG9vbC5jb25mCisKKyAgICAjIEVu YWJsZSBkZWJ1ZyBsb2dnaW5nIHRvIHNlZSByb3V0aW5nIGRlY2lzaW9ucworICAgIGVjaG8gImxv Z19taW5fbWVzc2FnZXMgPSBkZWJ1ZzEiID4+IGV0Yy9wZ3Bvb2wuY29uZgorCisgICAgLi9zdGFy dGFsbAorCisgICAgZXhwb3J0IFBHUE9SVD0kUEdQT09MX1BPUlQKKyAgICBleHBvcnQgUEdIT1NU PWxvY2FsaG9zdAorCisgICAgd2FpdF9mb3JfcGdwb29sX3N0YXJ0dXAKKworICAgICMgQ3JlYXRl IHRlc3QgdGFibGVzCisgICAgJFBTUUwgdGVzdCA8PEVPRgorQ1JFQVRFIFRBQkxFIHQxKGkgSU5U RUdFUik7CitDUkVBVEUgVEFCTEUgdDIoaSBJTlRFR0VSKTsKK0NSRUFURSBUQUJMRSB0MyhpIElO VEVHRVIpOworRU9GCisKKyAgICBlY2hvICI9PT0gVGVzdCAxOiBDb2xkIFN0YXJ0IFJvdXRpbmcg PT09IgorICAgICMgRHVyaW5nIGNvbGQgc3RhcnQsIGFsbCBxdWVyaWVzIHNob3VsZCBnbyB0byBw cmltYXJ5CisgICAgIyBSZXN0YXJ0IHBncG9vbCB0byB0cmlnZ2VyIGNvbGQgc3RhcnQKKyAgICAu L3NodXRkb3duYWxsCisgICAgLi9zdGFydGFsbAorICAgIHdhaXRfZm9yX3BncG9vbF9zdGFydHVw CisKKyAgICAjIEltbWVkaWF0ZWx5IHF1ZXJ5IC0gc2hvdWxkIGdvIHRvIHByaW1hcnkgZHVlIHRv IGNvbGQgc3RhcnQKKyAgICAkUFNRTCB0ZXN0IC1jICJTRUxFQ1QgJ2NvbGRfc3RhcnRfdGVzdCcg YXMgbWFya2VyLCAqIEZST00gdDE7IiA+IC9kZXYvbnVsbCAyPiYxCisKKyAgICAjIENoZWNrIGxv ZyBmb3IgY29sZCBzdGFydCBtZXNzYWdlICh1c2UgLWEgdG8gaGFuZGxlIGJpbmFyeSBsb2cgZmls ZXMpCisgICAgaWYgZ3JlcCAtYSAtcSAiY291bGQgbm90IGxvYWQgYmFsYW5jZSBiZWNhdXNlIG9m IHRyYWNrIHRhYmxlIG11dGF0aW9uIGNvbGQgc3RhcnQiIGxvZy9wZ3Bvb2wubG9nOyB0aGVuCisg ICAgICAgIGVjaG8gIlRlc3QgMSBQQVNTRUQ6IENvbGQgc3RhcnQgcm91dGluZyB3b3JrcyIKKyAg ICBlbHNlCisgICAgICAgIGVjaG8gIlRlc3QgMSBGQUlMRUQ6IENvbGQgc3RhcnQgcm91dGluZyBu b3QgZGV0ZWN0ZWQiCisgICAgICAgIC4vc2h1dGRvd25hbGwKKyAgICAgICAgZXhpdCAxCisgICAg ZmkKKworICAgIGVjaG8gIj09PSBUZXN0IDI6IFdhaXQgZm9yIGNvbGQgc3RhcnQgdG8gZW5kID09 PSIKKyAgICAjIFdhaXQgZm9yIGNvbGQgc3RhcnQgcGVyaW9kIHRvIGVuZCAoMTAgc2Vjb25kcyku CisgICAgIyBVc2UgZ2VuZXJvdXMgbWFyZ2luIHRvIGF2b2lkIGZsYWtpbmVzcyB1bmRlciBsb2Fk IChlLmcuIGZ1bGwgcmVncmVzc2lvbiBzdWl0ZSkuCisgICAgc2xlZXAgMTIKKworICAgICMgQ2xl YXIgdGhlIGxvZworICAgID4gbG9nL3BncG9vbC5sb2cKKworICAgICMgTm93IGEgY2xlYW4gdGFi bGUgcXVlcnkgc2hvdWxkIGxvYWQgYmFsYW5jZSAoZ28gdG8gbm9kZSAxKQorICAgICRQU1FMIHRl c3QgLWMgIlNFTEVDVCAnYWZ0ZXJfY29sZF9zdGFydCcgYXMgbWFya2VyLCAqIEZST00gdDM7IiA+ IC9kZXYvbnVsbCAyPiYxCisKKyAgICAjIEFmdGVyIGNvbGQgc3RhcnQsIHF1ZXJpZXMgdG8gY2xl YW4gdGFibGVzIHNob3VsZCBsb2FkIGJhbGFuY2UKKyAgICAjIENoZWNrIHRoYXQgaXQgZGlkIE5P VCBnZXQgZm9yY2VkIHRvIHByaW1hcnkgZHVlIHRvIHRyYWNrIHRhYmxlIG11dGF0aW9uCisgICAg aWYgZ3JlcCAtYSAtcSAiY291bGQgbm90IGxvYWQgYmFsYW5jZSBiZWNhdXNlIG9mIHRyYWNrIHRh YmxlIG11dGF0aW9uIGNvbGQgc3RhcnQiIGxvZy9wZ3Bvb2wubG9nOyB0aGVuCisgICAgICAgIGVj aG8gIlRlc3QgMiBGQUlMRUQ6IFN0aWxsIGluIGNvbGQgc3RhcnQgYWZ0ZXIgd2FpdGluZyIKKyAg ICAgICAgLi9zaHV0ZG93bmFsbAorICAgICAgICBleGl0IDEKKyAgICBmaQorICAgIGVjaG8gIlRl c3QgMiBQQVNTRUQ6IENvbGQgc3RhcnQgZW5kZWQgY29ycmVjdGx5IgorCisgICAgZWNobyAiPT09 IFRlc3QgMzogV3JpdGUtdGhlbi1SZWFkIFJvdXRpbmcgPT09IgorICAgICMgQ2xlYXIgdGhlIGxv ZworICAgID4gbG9nL3BncG9vbC5sb2cKKworICAgICMgV3JpdGUgdG8gdDEgYW5kIHRoZW4gcmVh ZCAtIHVzZSBzaW5nbGUgY29ubmVjdGlvbiB0byBlbnN1cmUgc2FtZSBzZXNzaW9uCisgICAgJFBT UUwgdGVzdCA8PEVPRgorSU5TRVJUIElOVE8gdDEgVkFMVUVTICgxKTsKK1NFTEVDVCAnd3JpdGVf cmVhZF90ZXN0JyBhcyBtYXJrZXIsICogRlJPTSB0MTsKK0VPRgorCisgICAgIyBTbWFsbCBkZWxh eSB0byBlbnN1cmUgbG9nIGlzIGZsdXNoZWQKKyAgICBzbGVlcCAwLjUKKworICAgICMgQ2hlY2sg bG9nIGZvciB0YWJsZSBzdGFsZW5lc3MgbWVzc2FnZQorICAgIGlmIGdyZXAgLWEgLXEgImNvdWxk IG5vdCBsb2FkIGJhbGFuY2UgYmVjYXVzZSB0YWJsZS4qd2FzIHJlY2VudGx5IHdyaXR0ZW4iIGxv Zy9wZ3Bvb2wubG9nOyB0aGVuCisgICAgICAgIGVjaG8gIlRlc3QgMyBQQVNTRUQ6IFdyaXRlLXRo ZW4tcmVhZCByb3V0aW5nIHdvcmtzIgorICAgIGVsc2UKKyAgICAgICAgZWNobyAiVGVzdCAzIEZB SUxFRDogVGFibGUgc3RhbGVuZXNzIG5vdCBkZXRlY3RlZCBhZnRlciB3cml0ZSIKKyAgICAgICAg IyBTaG93IHJlbGV2YW50IGxvZyBlbnRyaWVzIGZvciBkZWJ1Z2dpbmcKKyAgICAgICAgZ3JlcCAt YSAtaSAidHJhY2tfdGFibGVfbXV0YXRpb24iIGxvZy9wZ3Bvb2wubG9nIHwgdGFpbCAtMjAKKyAg ICAgICAgLi9zaHV0ZG93bmFsbAorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgZWNobyAi PT09IFRlc3QgNDogQ2xlYW4gVGFibGUgU3RpbGwgTG9hZCBCYWxhbmNlcyA9PT0iCisgICAgIyBD bGVhciB0aGUgbG9nCisgICAgPiBsb2cvcGdwb29sLmxvZworCisgICAgIyBSZWFkIGZyb20gdDIg KG5ldmVyIHdyaXR0ZW4gdG8pIC0gc2hvdWxkIGxvYWQgYmFsYW5jZQorICAgICRQU1FMIHRlc3Qg LWMgIlNFTEVDVCAnY2xlYW5fdGFibGVfdGVzdCcgYXMgbWFya2VyLCAqIEZST00gdDI7IiA+IC9k ZXYvbnVsbCAyPiYxCisKKyAgICAjIFNob3VsZCBOT1Qgc2VlIHRyYWNrIHRhYmxlIG11dGF0aW9u IGJsb2NraW5nIG1lc3NhZ2UgZm9yIHQyCisgICAgaWYgZ3JlcCAtYSAtcSAiY291bGQgbm90IGxv YWQgYmFsYW5jZSBiZWNhdXNlIHRhYmxlLip0Mi4qd2FzIHJlY2VudGx5IHdyaXR0ZW4iIGxvZy9w Z3Bvb2wubG9nOyB0aGVuCisgICAgICAgIGVjaG8gIlRlc3QgNCBGQUlMRUQ6IENsZWFuIHRhYmxl IGluY29ycmVjdGx5IG1hcmtlZCBhcyBzdGFsZSIKKyAgICAgICAgLi9zaHV0ZG93bmFsbAorICAg ICAgICBleGl0IDEKKyAgICBmaQorICAgIGVjaG8gIlRlc3QgNCBQQVNTRUQ6IENsZWFuIHRhYmxl cyBzdGlsbCBsb2FkIGJhbGFuY2UiCisKKyAgICBlY2hvICI9PT0gVGVzdCA1OiBVUERBVEUgTWFy a3MgVGFibGUgYXMgU3RhbGUgPT09IgorICAgICMgQ2xlYXIgdGhlIGxvZworICAgID4gbG9nL3Bn cG9vbC5sb2cKKworICAgICMgVXBkYXRlIHQyIGFuZCB0aGVuIHJlYWQgLSB1c2Ugc2luZ2xlIGNv bm5lY3Rpb24KKyAgICAkUFNRTCB0ZXN0IDw8RU9GCitVUERBVEUgdDIgU0VUIGkgPSA5OTkgV0hF UkUgaSA9IDA7CitTRUxFQ1QgJ3VwZGF0ZV90ZXN0JyBhcyBtYXJrZXIsICogRlJPTSB0MjsKK0VP RgorCisgICAgIyBTbWFsbCBkZWxheSB0byBlbnN1cmUgbG9nIGlzIGZsdXNoZWQKKyAgICBzbGVl cCAwLjUKKworICAgIGlmIGdyZXAgLWEgLXEgImNvdWxkIG5vdCBsb2FkIGJhbGFuY2UgYmVjYXVz ZSB0YWJsZS4qd2FzIHJlY2VudGx5IHdyaXR0ZW4iIGxvZy9wZ3Bvb2wubG9nOyB0aGVuCisgICAg ICAgIGVjaG8gIlRlc3QgNSBQQVNTRUQ6IFVQREFURSBtYXJrcyB0YWJsZSBhcyBzdGFsZSIKKyAg ICBlbHNlCisgICAgICAgIGVjaG8gIlRlc3QgNSBGQUlMRUQ6IFVQREFURSBkaWQgbm90IG1hcmsg dGFibGUgYXMgc3RhbGUiCisgICAgICAgIC4vc2h1dGRvd25hbGwKKyAgICAgICAgZXhpdCAxCisg ICAgZmkKKworICAgIGVjaG8gIj09PSBUZXN0IDY6IERFTEVURSBNYXJrcyBUYWJsZSBhcyBTdGFs ZSA9PT0iCisgICAgIyBDbGVhciB0aGUgbG9nCisgICAgPiBsb2cvcGdwb29sLmxvZworCisgICAg IyBEZWxldGUgZnJvbSB0MyBhbmQgdGhlbiByZWFkIC0gdXNlIHNpbmdsZSBjb25uZWN0aW9uCisg ICAgJFBTUUwgdGVzdCA8PEVPRgorREVMRVRFIEZST00gdDMgV0hFUkUgaSA9IDA7CitTRUxFQ1Qg J2RlbGV0ZV90ZXN0JyBhcyBtYXJrZXIsICogRlJPTSB0MzsKK0VPRgorCisgICAgIyBTbWFsbCBk ZWxheSB0byBlbnN1cmUgbG9nIGlzIGZsdXNoZWQKKyAgICBzbGVlcCAwLjUKKworICAgIGlmIGdy ZXAgLWEgLXEgImNvdWxkIG5vdCBsb2FkIGJhbGFuY2UgYmVjYXVzZSB0YWJsZS4qd2FzIHJlY2Vu dGx5IHdyaXR0ZW4iIGxvZy9wZ3Bvb2wubG9nOyB0aGVuCisgICAgICAgIGVjaG8gIlRlc3QgNiBQ QVNTRUQ6IERFTEVURSBtYXJrcyB0YWJsZSBhcyBzdGFsZSIKKyAgICBlbHNlCisgICAgICAgIGVj aG8gIlRlc3QgNiBGQUlMRUQ6IERFTEVURSBkaWQgbm90IG1hcmsgdGFibGUgYXMgc3RhbGUiCisg ICAgICAgIC4vc2h1dGRvd25hbGwKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGVjaG8g Ij09PSBUZXN0IDc6IFRSVU5DQVRFIE1hcmtzIFRhYmxlIGFzIFN0YWxlID09PSIKKyAgICAjIENs ZWFyIHRoZSBsb2cKKyAgICA+IGxvZy9wZ3Bvb2wubG9nCisKKyAgICAjIENyZWF0ZSBhIGZyZXNo IHRhYmxlIGZvciBUUlVOQ0FURSB0ZXN0CisgICAgJFBTUUwgdGVzdCAtYyAiQ1JFQVRFIFRBQkxF IHRfdHJ1bmNhdGUoaSBJTlRFR0VSKTsiID4gL2Rldi9udWxsIDI+JjEKKyAgICAkUFNRTCB0ZXN0 IC1jICJJTlNFUlQgSU5UTyB0X3RydW5jYXRlIFZBTFVFUyAoMSksICgyKSwgKDMpOyIgPiAvZGV2 L251bGwgMj4mMQorCisgICAgIyBXYWl0IGZvciBhbnkgVFRMIHRvIGV4cGlyZQorICAgIHNsZWVw IDMKKworICAgICMgQ2xlYXIgdGhlIGxvZyBhZ2FpbgorICAgID4gbG9nL3BncG9vbC5sb2cKKwor ICAgICMgVHJ1bmNhdGUgYW5kIHRoZW4gcmVhZCAtIHVzZSBzaW5nbGUgY29ubmVjdGlvbgorICAg ICRQU1FMIHRlc3QgPDxFT0YKK1RSVU5DQVRFIHRfdHJ1bmNhdGU7CitTRUxFQ1QgJ3RydW5jYXRl X3Rlc3QnIGFzIG1hcmtlciwgKiBGUk9NIHRfdHJ1bmNhdGU7CitFT0YKKworICAgICMgU21hbGwg ZGVsYXkgdG8gZW5zdXJlIGxvZyBpcyBmbHVzaGVkCisgICAgc2xlZXAgMC41CisKKyAgICBpZiBn cmVwIC1hIC1xICJjb3VsZCBub3QgbG9hZCBiYWxhbmNlIGJlY2F1c2UgdGFibGUuKndhcyByZWNl bnRseSB3cml0dGVuIiBsb2cvcGdwb29sLmxvZzsgdGhlbgorICAgICAgICBlY2hvICJUZXN0IDcg UEFTU0VEOiBUUlVOQ0FURSBtYXJrcyB0YWJsZSBhcyBzdGFsZSIKKyAgICBlbHNlCisgICAgICAg IGVjaG8gIlRlc3QgNyBGQUlMRUQ6IFRSVU5DQVRFIGRpZCBub3QgbWFyayB0YWJsZSBhcyBzdGFs ZSIKKyAgICAgICAgZ3JlcCAtYSAtaSAidHJhY2tfdGFibGVfbXV0YXRpb24iIGxvZy9wZ3Bvb2wu bG9nIHwgdGFpbCAtMjAKKyAgICAgICAgLi9zaHV0ZG93bmFsbAorICAgICAgICBleGl0IDEKKyAg ICBmaQorCisgICAgZWNobyAiPT09IFRlc3QgODogV0lUSCBDbGF1c2UgKENURSB3aXRoIERFTEVU RSkgTWFya3MgVGFibGUgYXMgU3RhbGUgPT09IgorICAgICMgQ2xlYXIgdGhlIGxvZworICAgID4g bG9nL3BncG9vbC5sb2cKKworICAgICMgQ3JlYXRlIGEgZnJlc2ggdGFibGUgZm9yIFdJVEggdGVz dAorICAgICRQU1FMIHRlc3QgLWMgIkNSRUFURSBUQUJMRSB0X2N0ZShpIElOVEVHRVIpOyIgPiAv ZGV2L251bGwgMj4mMQorICAgICRQU1FMIHRlc3QgLWMgIklOU0VSVCBJTlRPIHRfY3RlIFZBTFVF UyAoMSksICgyKSwgKDMpOyIgPiAvZGV2L251bGwgMj4mMQorCisgICAgIyBXYWl0IGZvciBhbnkg VFRMIHRvIGV4cGlyZQorICAgIHNsZWVwIDMKKworICAgICMgQ2xlYXIgdGhlIGxvZyBhZ2Fpbgor ICAgID4gbG9nL3BncG9vbC5sb2cKKworICAgICMgVXNlIFdJVEggY2xhdXNlIHdpdGggREVMRVRF LCB0aGVuIHJlYWQgZnJvbSB0aGUgdGFibGUKKyAgICAkUFNRTCB0ZXN0IDw8RU9GCitXSVRIIGRl bGV0ZWQgQVMgKERFTEVURSBGUk9NIHRfY3RlIFdIRVJFIGkgPSAxIFJFVFVSTklORyAqKQorU0VM RUNUICogRlJPTSBkZWxldGVkOworU0VMRUNUICdjdGVfdGVzdCcgYXMgbWFya2VyLCAqIEZST00g dF9jdGU7CitFT0YKKworICAgICMgU21hbGwgZGVsYXkgdG8gZW5zdXJlIGxvZyBpcyBmbHVzaGVk CisgICAgc2xlZXAgMC41CisKKyAgICBpZiBncmVwIC1hIC1xICJjb3VsZCBub3QgbG9hZCBiYWxh bmNlIGJlY2F1c2UgdGFibGUuKndhcyByZWNlbnRseSB3cml0dGVuIiBsb2cvcGdwb29sLmxvZzsg dGhlbgorICAgICAgICBlY2hvICJUZXN0IDggUEFTU0VEOiBXSVRIIGNsYXVzZSAoQ1RFKSBtYXJr cyB0YWJsZSBhcyBzdGFsZSIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIlRlc3QgOCBGQUlMRUQ6 IFdJVEggY2xhdXNlIChDVEUpIGRpZCBub3QgbWFyayB0YWJsZSBhcyBzdGFsZSIKKyAgICAgICAg Z3JlcCAtYSAtaSAidHJhY2tfdGFibGVfbXV0YXRpb24iIGxvZy9wZ3Bvb2wubG9nIHwgdGFpbCAt MjAKKyAgICAgICAgLi9zaHV0ZG93bmFsbAorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAg IyBUZXN0IDk6IE1FUkdFIChQb3N0Z3JlU1FMIDE1KyBvbmx5KQorICAgIFBHX01BSk9SX1ZFUlNJ T049JCgkUFNRTCAtdCAtYyAiU0VMRUNUIHN1YnN0cmluZyh2ZXJzaW9uKCkgZnJvbSAnUG9zdGdy ZVNRTCAoWzAtOV0rKScpOyIgfCB0ciAtZCAnICcpCisgICAgaWYgWyAiJFBHX01BSk9SX1ZFUlNJ T04iIC1nZSAxNSBdIDI+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIGVjaG8gIj09PSBUZXN0IDk6 IE1FUkdFIE1hcmtzIFRhYmxlIGFzIFN0YWxlIChQb3N0Z3JlU1FMICRQR19NQUpPUl9WRVJTSU9O KSA9PT0iCisgICAgICAgICMgQ2xlYXIgdGhlIGxvZworICAgICAgICA+IGxvZy9wZ3Bvb2wubG9n CisKKyAgICAgICAgIyBDcmVhdGUgdGFibGVzIGZvciBNRVJHRSB0ZXN0CisgICAgICAgICRQU1FM IHRlc3QgLWMgIkNSRUFURSBUQUJMRSB0X21lcmdlX3RhcmdldChpZCBJTlRFR0VSIFBSSU1BUlkg S0VZLCB2YWwgVEVYVCk7IiA+IC9kZXYvbnVsbCAyPiYxCisgICAgICAgICRQU1FMIHRlc3QgLWMg IkNSRUFURSBUQUJMRSB0X21lcmdlX3NvdXJjZShpZCBJTlRFR0VSLCB2YWwgVEVYVCk7IiA+IC9k ZXYvbnVsbCAyPiYxCisgICAgICAgICRQU1FMIHRlc3QgLWMgIklOU0VSVCBJTlRPIHRfbWVyZ2Vf dGFyZ2V0IFZBTFVFUyAoMSwgJ29sZCcpOyIgPiAvZGV2L251bGwgMj4mMQorICAgICAgICAkUFNR TCB0ZXN0IC1jICJJTlNFUlQgSU5UTyB0X21lcmdlX3NvdXJjZSBWQUxVRVMgKDEsICduZXcnKSwg KDIsICdpbnNlcnQnKTsiID4gL2Rldi9udWxsIDI+JjEKKworICAgICAgICAjIFdhaXQgZm9yIGFu eSBUVEwgdG8gZXhwaXJlCisgICAgICAgIHNsZWVwIDMKKworICAgICAgICAjIENsZWFyIHRoZSBs b2cgYWdhaW4KKyAgICAgICAgPiBsb2cvcGdwb29sLmxvZworCisgICAgICAgICMgVXNlIE1FUkdF LCB0aGVuIHJlYWQgZnJvbSB0aGUgdGFyZ2V0IHRhYmxlCisgICAgICAgICRQU1FMIHRlc3QgPDxF T0YKK01FUkdFIElOVE8gdF9tZXJnZV90YXJnZXQgdAorVVNJTkcgdF9tZXJnZV9zb3VyY2UgcyBP TiB0LmlkID0gcy5pZAorV0hFTiBNQVRDSEVEIFRIRU4gVVBEQVRFIFNFVCB2YWwgPSBzLnZhbAor V0hFTiBOT1QgTUFUQ0hFRCBUSEVOIElOU0VSVCBWQUxVRVMgKHMuaWQsIHMudmFsKTsKK1NFTEVD VCAnbWVyZ2VfdGVzdCcgYXMgbWFya2VyLCAqIEZST00gdF9tZXJnZV90YXJnZXQ7CitFT0YKKwor ICAgICAgICAjIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBsb2cgaXMgZmx1c2hlZAorICAgICAgICBz bGVlcCAwLjUKKworICAgICAgICBpZiBncmVwIC1hIC1xICJjb3VsZCBub3QgbG9hZCBiYWxhbmNl IGJlY2F1c2UgdGFibGUuKndhcyByZWNlbnRseSB3cml0dGVuIiBsb2cvcGdwb29sLmxvZzsgdGhl bgorICAgICAgICAgICAgZWNobyAiVGVzdCA5IFBBU1NFRDogTUVSR0UgbWFya3MgdGFibGUgYXMg c3RhbGUiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlRlc3QgOSBGQUlMRUQ6IE1F UkdFIGRpZCBub3QgbWFyayB0YWJsZSBhcyBzdGFsZSIKKyAgICAgICAgICAgIGdyZXAgLWEgLWkg InRyYWNrX3RhYmxlX211dGF0aW9uIiBsb2cvcGdwb29sLmxvZyB8IHRhaWwgLTIwCisgICAgICAg ICAgICAuL3NodXRkb3duYWxsCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICBl bHNlCisgICAgICAgIGVjaG8gIj09PSBUZXN0IDk6IE1FUkdFIHNraXBwZWQgKHJlcXVpcmVzIFBv c3RncmVTUUwgMTUrLCBoYXZlICRQR19NQUpPUl9WRVJTSU9OKSA9PT0iCisgICAgZmkKKworICAg IGVjaG8gIj09PSBUZXN0IDEwOiBST0xMQkFDSyBEb2VzIE5PVCBNYXJrIFRhYmxlIGFzIFN0YWxl ID09PSIKKyAgICAjIENyZWF0ZSBhIGZyZXNoIHRhYmxlIGZvciByb2xsYmFjayB0ZXN0CisgICAg JFBTUUwgdGVzdCAtYyAiQ1JFQVRFIFRBQkxFIHRfcm9sbGJhY2soaSBJTlRFR0VSKTsiID4gL2Rl di9udWxsIDI+JjEKKworICAgICMgV2FpdCBmb3IgYW55IFRUTCB0byBleHBpcmUKKyAgICBzbGVl cCAzCisKKyAgICAjIENsZWFyIHRoZSBsb2cKKyAgICA+IGxvZy9wZ3Bvb2wubG9nCisKKyAgICAj IFdyaXRlIGluc2lkZSBhIHRyYW5zYWN0aW9uLCB0aGVuIHJvbGxiYWNrCisgICAgJFBTUUwgdGVz dCA8PEVPRgorQkVHSU47CitJTlNFUlQgSU5UTyB0X3JvbGxiYWNrIFZBTFVFUyAoMSk7CitST0xM QkFDSzsKK1NFTEVDVCAncm9sbGJhY2tfdGVzdCcgYXMgbWFya2VyLCAqIEZST00gdF9yb2xsYmFj azsKK0VPRgorCisgICAgIyBTbWFsbCBkZWxheSB0byBlbnN1cmUgbG9nIGlzIGZsdXNoZWQKKyAg ICBzbGVlcCAwLjUKKworICAgICMgU2hvdWxkIE5PVCBzZWUgdF9yb2xsYmFjayBtYXJrZWQgYXMg c3RhbGUgc2luY2UgdGhlIHdyaXRlIHdhcyByb2xsZWQgYmFjaworICAgIGlmIGdyZXAgLWEgLXEg ImNvdWxkIG5vdCBsb2FkIGJhbGFuY2UgYmVjYXVzZSB0YWJsZS4qdF9yb2xsYmFjay4qd2FzIHJl Y2VudGx5IHdyaXR0ZW4iIGxvZy9wZ3Bvb2wubG9nOyB0aGVuCisgICAgICAgIGVjaG8gIlRlc3Qg MTAgRkFJTEVEOiBSb2xsZWQtYmFjayB3cml0ZSBpbmNvcnJlY3RseSBtYXJrZWQgdGFibGUgYXMg c3RhbGUiCisgICAgICAgIGdyZXAgLWEgLWkgInRyYWNrX3RhYmxlX211dGF0aW9uIiBsb2cvcGdw b29sLmxvZyB8IHRhaWwgLTIwCisgICAgICAgIC4vc2h1dGRvd25hbGwKKyAgICAgICAgZXhpdCAx CisgICAgZmkKKyAgICBlY2hvICJUZXN0IDEwIFBBU1NFRDogUk9MTEJBQ0sgZG9lcyBub3QgbWFy ayB0YWJsZSBhcyBzdGFsZSIKKworICAgIGVjaG8gIj09PSBUZXN0IDExOiBDT01NSVQgTWFya3Mg VGFibGUgYXMgU3RhbGUgPT09IgorICAgICMgQ3JlYXRlIGEgZnJlc2ggdGFibGUgZm9yIGNvbW1p dCB0ZXN0CisgICAgJFBTUUwgdGVzdCAtYyAiQ1JFQVRFIFRBQkxFIHRfY29tbWl0KGkgSU5URUdF Uik7IiA+IC9kZXYvbnVsbCAyPiYxCisKKyAgICAjIFdhaXQgZm9yIGFueSBUVEwgdG8gZXhwaXJl CisgICAgc2xlZXAgMworCisgICAgIyBDbGVhciB0aGUgbG9nCisgICAgPiBsb2cvcGdwb29sLmxv ZworCisgICAgIyBXcml0ZSBpbnNpZGUgYSB0cmFuc2FjdGlvbiwgdGhlbiBjb21taXQsIHRoZW4g cmVhZAorICAgICRQU1FMIHRlc3QgPDxFT0YKK0JFR0lOOworSU5TRVJUIElOVE8gdF9jb21taXQg VkFMVUVTICgxKTsKK0NPTU1JVDsKK1NFTEVDVCAnY29tbWl0X3Rlc3QnIGFzIG1hcmtlciwgKiBG Uk9NIHRfY29tbWl0OworRU9GCisKKyAgICAjIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBsb2cgaXMg Zmx1c2hlZAorICAgIHNsZWVwIDAuNQorCisgICAgaWYgZ3JlcCAtYSAtcSAiY291bGQgbm90IGxv YWQgYmFsYW5jZSBiZWNhdXNlIHRhYmxlLip3YXMgcmVjZW50bHkgd3JpdHRlbiIgbG9nL3BncG9v bC5sb2c7IHRoZW4KKyAgICAgICAgZWNobyAiVGVzdCAxMSBQQVNTRUQ6IENPTU1JVCBtYXJrcyB0 YWJsZSBhcyBzdGFsZSIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIlRlc3QgMTEgRkFJTEVEOiBD b21taXR0ZWQgd3JpdGUgZGlkIG5vdCBtYXJrIHRhYmxlIGFzIHN0YWxlIgorICAgICAgICBncmVw IC1hIC1pICJ0cmFja190YWJsZV9tdXRhdGlvbiIgbG9nL3BncG9vbC5sb2cgfCB0YWlsIC0yMAor ICAgICAgICAuL3NodXRkb3duYWxsCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBlY2hv ICIiCisgICAgZWNobyAiPT09IEFsbCBUcmFjayBUYWJsZSBNdXRhdGlvbiBUZXN0cyBQQVNTRUQg PT09IgorCisgICAgLi9zaHV0ZG93bmFsbAorCisgICAgY2QgLi4KK2RvbmUKKworZXhpdCAwCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzaW9uL3Rlc3RzLzA0NC50cmFja190YWJsZV9tdXRh dGlvbl93YXRjaGRvZy90ZXN0LnNoIGIvc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDQudHJh Y2tfdGFibGVfbXV0YXRpb25fd2F0Y2hkb2cvdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQpp bmRleCAwMDAwMDAwMDAuLmM1MGMyMTNkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jl Z3Jlc3Npb24vdGVzdHMvMDQ0LnRyYWNrX3RhYmxlX211dGF0aW9uX3dhdGNoZG9nL3Rlc3Quc2gK QEAgLTAsMCArMSwxODQgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRl c3Qgc2NyaXB0IGZvciB0cmFjayB0YWJsZSBtdXRhdGlvbiBnbG9iYWwgY29sZCBzdGFydAorIyBv biB3YXRjaGRvZyBsZWFkZXIgY2hhbmdlLgorIworIyBVc2VzICRXQVRDSERPR19TRVRVUCB0byBj cmVhdGUgYSAyLW5vZGUgd2F0Y2hkb2cgY2x1c3RlciwKKyMgdGhlbiB2ZXJpZmllcyB0aGF0IHdo ZW4gdGhlIGxlYWRlciBpcyBzdG9wcGVkIHRoZSBuZXcKKyMgbGVhZGVyIHRyaWdnZXJzIGEgZ2xv YmFsIGNvbGQgc3RhcnQuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc291cmNlICRURVNUTElCUworVEVTVERJUj10 ZXN0ZGlyCitQU1FMPSRQR0JJTi9wc3FsCitzdWNjZXNzX2NvdW50PTAKKworZGlyPWBwd2RgCity bSAtZnIgJFRFU1RESVIKK21rZGlyICRURVNURElSCitjZCAkVEVTVERJUgorCisjIENyZWF0ZSAy LW5vZGUgd2F0Y2hkb2cgY2x1c3RlcgorJFdBVENIRE9HX1NFVFVQIC13biAyIHx8IGV4aXQgMQor CisjIEVuc3VyZSBwZXItbm9kZSBzY3JpcHRzIGFyZSBleGVjdXRhYmxlCisjIChzZWQgLWkgaW4g d2F0Y2hkb2dfc2V0dXAgY2FuIHN0cmlwIHBlcm1pc3Npb25zKQorY2htb2QgNzU1IHBncG9vbCov c3RhcnRhbGwgcGdwb29sKi9zaHV0ZG93bmFsbAorCisjIEFwcGVuZCB0cmFja190YWJsZV9tdXRh dGlvbiBjb25maWcgdG8gYm90aCBub2RlcworZm9yIGkgaW4gMCAxCitkbworCWNhdCA+PiBwZ3Bv b2wke2l9L2V0Yy9wZ3Bvb2wuY29uZiA8PEVPRgorZGlzYWJsZV9sb2FkX2JhbGFuY2Vfb25fd3Jp dGUgPSAnZG1sX2FkYXB0aXZlX2dsb2JhbCcKK3RyYWNrX3RhYmxlX211dGF0aW9uX2NvbGRfc3Rh cnRfZHVyYXRpb24gPSAyMDAwCitlbmFibGVfY29uc2Vuc3VzX3dpdGhfaGFsZl92b3RlcyA9IG9u Citsb2dfbWluX21lc3NhZ2VzID0gZGVidWcxCitFT0YKK2RvbmUKKworLi9zdGFydGFsbAorZXhw b3J0IFBDUFBBU1NGSUxFPSRkaXIvJFRFU1RESVIvcGdwb29sMC9wY3BwYXNzCisKKyMgV2FpdCBm b3Igd2F0Y2hkb2cgbGlmZWNoZWNrIG9uIG5vZGUgMAorZWNobyAtbiAid2FpdGluZyBmb3Igd2F0 Y2hkb2cgbm9kZSAwIHN0YXJ0aW5nIHVwLi4uIgorZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDkg MTAKK2RvCisJZ3JlcCAibGlmZWNoZWNrIHN0YXJ0ZWQiIFwKKwkJcGdwb29sMC9sb2cvcGdwb29s LmxvZyA+IC9kZXYvbnVsbCAyPiYxCisJaWYgWyAkPyA9IDAgXTsgdGhlbgorCQlicmVhaworCWZp CisJc2xlZXAgMgorZG9uZQorZWNobyAiZG9uZS4iCisKKyMgVGVzdCAxOiBWZXJpZnkgbGVhZGVy IGNhbWUgdXAKK2VjaG8gIj09PSBUZXN0IDE6IFdhaXRpbmcgZm9yIHRoZSBwZ3Bvb2wgbGVhZGVy Li4uID09PSIKK2ZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA5IDEwCitkbworCWdyZXAgIkkgYW0g dGhlIGNsdXN0ZXIgbGVhZGVyIG5vZGUiIFwKKwkJcGdwb29sMC9sb2cvcGdwb29sLmxvZyA+IC9k ZXYvbnVsbCAyPiYxCisJaWYgWyAkPyA9IDAgXTsgdGhlbgorCQlzdWNjZXNzX2NvdW50PSQoKCBz dWNjZXNzX2NvdW50ICsgMSApKQorCQllY2hvICJUZXN0IDEgUEFTU0VEOiBMZWFkZXIgYnJvdWdo dCB1cC4iCisJCWJyZWFrCisJZmkKKwllY2hvICJbY2hlY2tdICRpIHRpbWVzIgorCXNsZWVwIDIK K2RvbmUKKworaWYgWyAkc3VjY2Vzc19jb3VudCAtbHQgMSBdOyB0aGVuCisJZWNobyAiVGVzdCAx IEZBSUxFRDogTGVhZGVyIGRpZCBub3Qgc3RhcnQiCisJLi9zaHV0ZG93bmFsbAorCWV4aXQgMQor ZmkKKworIyBUZXN0IDI6IFZlcmlmeSBzdGFuZGJ5IGpvaW5lZCBjbHVzdGVyCitlY2hvICI9PT0g VGVzdCAyOiBXYWl0aW5nIGZvciBzdGFuZGJ5IHRvIGpvaW4uLi4gPT09IgorZm9yIGkgaW4gMSAy IDMgNCA1IDYgNyA4IDkgMTAKK2RvCisJZ3JlcCAic3VjY2Vzc2Z1bGx5IGpvaW5lZCB0aGUgd2F0 Y2hkb2cgY2x1c3RlciIgXAorCQlwZ3Bvb2wxL2xvZy9wZ3Bvb2wubG9nID4gL2Rldi9udWxsIDI+ JjEKKwlpZiBbICQ/ID0gMCBdOyB0aGVuCisJCXN1Y2Nlc3NfY291bnQ9JCgoIHN1Y2Nlc3NfY291 bnQgKyAxICkpCisJCWVjaG8gIlRlc3QgMiBQQVNTRUQ6IFN0YW5kYnkgam9pbmVkLiIKKwkJYnJl YWsKKwlmaQorCWVjaG8gIltjaGVja10gJGkgdGltZXMiCisJc2xlZXAgMgorZG9uZQorCitpZiBb ICRzdWNjZXNzX2NvdW50IC1sdCAyIF07IHRoZW4KKwllY2hvICJUZXN0IDIgRkFJTEVEOiBTdGFu ZGJ5IGRpZCBub3Qgam9pbiIKKwkuL3NodXRkb3duYWxsCisJZXhpdCAxCitmaQorCisjIFRlc3Qg MzogVmVyaWZ5IHRyYWNrX3RhYmxlX211dGF0aW9uIGluaXRpYWxpemVkCitlY2hvICI9PT0gVGVz dCAzOiBWZXJpZnkgZmVhdHVyZSBpbml0aWFsaXplZCA9PT0iCitpZiBncmVwIC1hICJ0cmFja190 YWJsZV9tdXRhdGlvbjogaW5pdGlhbGl6ZWQiIFwKKwlwZ3Bvb2wwL2xvZy9wZ3Bvb2wubG9nID4g L2Rldi9udWxsIDI+JjE7IHRoZW4KKwlzdWNjZXNzX2NvdW50PSQoKCBzdWNjZXNzX2NvdW50ICsg MSApKQorCWVjaG8gIlRlc3QgMyBQQVNTRUQ6IEZlYXR1cmUgaW5pdGlhbGl6ZWQuIgorZWxzZQor CWVjaG8gIlRlc3QgMyBGQUlMRUQ6IEZlYXR1cmUgbm90IGluaXRpYWxpemVkIgorCS4vc2h1dGRv d25hbGwKKwlleGl0IDEKK2ZpCisKKyMgVGVzdCA0OiBTdG9wIGxlYWRlciAocGdwb29sMCkgdG8g dHJpZ2dlciBmYWlsb3ZlcgorZWNobyAiPT09IFRlc3QgNDogU3RvcHBpbmcgbGVhZGVyLi4uID09 PSIKK2NkIHBncG9vbDAKK3NvdXJjZSAuL2Jhc2hyYy5wb3J0cworJFBHUE9PTF9JTlNUQUxMX0RJ Ui9iaW4vcGdwb29sIFwKKwktZiBldGMvcGdwb29sLmNvbmYgLW0gZiBzdG9wCitjZCAuLgorCitl Y2hvICJDaGVja2luZyBzdGFuZGJ5IGRldGVjdGVkIHNodXRkb3duLi4uIgorZm9yIGkgaW4gMSAy IDMgNCA1IDYgNyA4IDkgMTAKK2RvCisJZ3JlcCAtYSAiaXMgc2h1dHRpbmcgZG93biIgXAorCQlw Z3Bvb2wxL2xvZy9wZ3Bvb2wubG9nID4gL2Rldi9udWxsIDI+JjEKKwlpZiBbICQ/ID0gMCBdOyB0 aGVuCisJCXN1Y2Nlc3NfY291bnQ9JCgoIHN1Y2Nlc3NfY291bnQgKyAxICkpCisJCWVjaG8gIlRl c3QgNCBQQVNTRUQ6IFNodXRkb3duIGRldGVjdGVkLiIKKwkJYnJlYWsKKwlmaQorCWVjaG8gIltj aGVja10gJGkgdGltZXMiCisJc2xlZXAgMgorZG9uZQorCitpZiBbICRzdWNjZXNzX2NvdW50IC1s dCA0IF07IHRoZW4KKwllY2hvICJUZXN0IDQgRkFJTEVEOiBTaHV0ZG93biBub3QgZGV0ZWN0ZWQi CisJLi9zaHV0ZG93bmFsbAorCWV4aXQgMQorZmkKKworIyBUZXN0IDU6IFZlcmlmeSBzdGFuZGJ5 IGJlY2FtZSBuZXcgbGVhZGVyCitlY2hvICI9PT0gVGVzdCA1OiBDaGVja2luZyBzdGFuZGJ5IHRh a2VzIG92ZXIuLi4gPT09IgorZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDkgMTAKK2RvCisJZ3Jl cCAtYSAiSSBhbSB0aGUgY2x1c3RlciBsZWFkZXIgbm9kZSIgXAorCQlwZ3Bvb2wxL2xvZy9wZ3Bv b2wubG9nID4gL2Rldi9udWxsIDI+JjEKKwlpZiBbICQ/ID0gMCBdOyB0aGVuCisJCXN1Y2Nlc3Nf Y291bnQ9JCgoIHN1Y2Nlc3NfY291bnQgKyAxICkpCisJCWVjaG8gIlRlc3QgNSBQQVNTRUQ6IFN0 YW5kYnkgYmVjYW1lIGxlYWRlci4iCisJCWJyZWFrCisJZmkKKwllY2hvICJbY2hlY2tdICRpIHRp bWVzIgorCXNsZWVwIDIKK2RvbmUKKworaWYgWyAkc3VjY2Vzc19jb3VudCAtbHQgNSBdOyB0aGVu CisJZWNobyAiVGVzdCA1IEZBSUxFRDogU3RhbmRieSBkaWQgbm90IGJlY29tZSBsZWFkZXIiCisJ Li9zaHV0ZG93bmFsbAorCWV4aXQgMQorZmkKKworIyBUZXN0IDY6IFZlcmlmeSBnbG9iYWwgY29s ZCBzdGFydCB3YXMgdHJpZ2dlcmVkCitlY2hvICI9PT0gVGVzdCA2OiBDaGVja2luZyBnbG9iYWwg Y29sZCBzdGFydC4uLiA9PT0iCitmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOSAxMAorZG8KKwln cmVwIC1hICJ0cmFja190YWJsZV9tdXRhdGlvbjogZ2xvYmFsIGNvbGQgc3RhcnQiIFwKKwkJcGdw b29sMS9sb2cvcGdwb29sLmxvZyA+IC9kZXYvbnVsbCAyPiYxCisJaWYgWyAkPyA9IDAgXTsgdGhl bgorCQlzdWNjZXNzX2NvdW50PSQoKCBzdWNjZXNzX2NvdW50ICsgMSApKQorCQllY2hvICJUZXN0 IDYgUEFTU0VEOiBHbG9iYWwgY29sZCBzdGFydCB0cmlnZ2VyZWQuIgorCQlicmVhaworCWZpCisJ ZWNobyAiW2NoZWNrXSAkaSB0aW1lcyIKKwlzbGVlcCAyCitkb25lCisKKyMgQ2xlYW51cAorLi9z aHV0ZG93bmFsbAorCitlY2hvICIiCitlY2hvICIkc3VjY2Vzc19jb3VudCBvdXQgb2YgNiBzdWNj ZXNzZnVsIgorCitpZiB0ZXN0ICRzdWNjZXNzX2NvdW50IC1lcSA2Cit0aGVuCisJZWNobyAiPT09 IEFsbCBXYXRjaGRvZyBUZXN0cyBQQVNTRUQgPT09IgorCWV4aXQgMAorZmkKKworZXhpdCAxCmRp ZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCBiL3NyYy90b29scy9w Z2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4IDkzOTIwMDk2NS4uNDY3ZWMxMTRjIDEwMDY0NAot LS0gYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdp bmRlbnQvdHlwZWRlZnMubGlzdApAQCAtNTE5LDYgKzUxOSwxMCBAQCBUYWJsZUxpa2VDbGF1c2UK IFRhYmxlU2FtcGxlQ2xhdXNlCiBUYXJnZXRFbnRyeQogVG9rZW5pemVkTGluZQorVHJhY2tUYWJs ZU11dGF0aW9uRW50cnkKK1RyYWNrVGFibGVNdXRhdGlvbkhhc2hUYWJsZQorVHJhY2tUYWJsZU11 dGF0aW9uU2htZW0KK1RyYWNrVGFibGVNdXRhdGlvblN0YXRlCiBUcmFuc2FjdGlvbklkCiBUcmFu c2FjdGlvblN0bXQKIFRyYW5zYWN0aW9uU3RtdEtpbmQKZGlmZiAtLWdpdCBhL3NyYy91dGlscy9w b29sX3RyYWNrX3RhYmxlX211dGF0aW9uLmMgYi9zcmMvdXRpbHMvcG9vbF90cmFja190YWJsZV9t dXRhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4uZTc3NzFlN2Jm Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3V0aWxzL3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb24u YwpAQCAtMCwwICsxLDkwMiBAQAorLyogLSotcGdzcWwtYy0qLSAqLworLyoKKyAqIHBncG9vbDog YSBsYW5ndWFnZSBpbmRlcGVuZGVudCBjb25uZWN0aW9uIHBvb2wgc2VydmVyIGZvciBQb3N0Z3Jl U1FMCisgKiB3cml0dGVuIGJ5IFRhdHN1byBJc2hpaQorICoKKyAqIENvcHlyaWdodCAoYykgMjAw My0yMDI2CVBnUG9vbCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBQZXJtaXNzaW9u IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAor ICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBo ZXJlYnkKKyAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3Rp Y2UgYXBwZWFyIGluIGFsbAorICogY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24KKyAqIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGlu ZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUKKyAqIGF1dGhvciBub3Qg YmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bworICogZGlz dHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9y CisgKiBwZXJtaXNzaW9uLiBUaGUgYXV0aG9yIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91 dCB0aGUKKyAqIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAg SXQgaXMgcHJvdmlkZWQgImFzCisgKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2Fy cmFudHkuCisgKgorICogcG9vbF90cmFja190YWJsZV9tdXRhdGlvbi5jOiBJbi1tZW1vcnkgdHJh Y2tpbmcgb2YgcmVjZW50bHkKKyAqICAgd3JpdHRlbiB0YWJsZXMgdG8gcHJldmVudCBzdGFsZSBy ZWFkcyBmcm9tIHJlcGxpY2FzLgorICoKKyAqIEJhc2VkIG9uIHRoZSAibGFnbGVzcyIgYXJjaGl0 ZWN0dXJlIGZyb20gVGFpbG9yIEJyYW5kcy4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+Cisj aW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlz dGQuaD4KKworI2luY2x1ZGUgInBvb2wuaCIKKyNpbmNsdWRlICJwb29sX2NvbmZpZy5oIgorI2lu Y2x1ZGUgImNvbnRleHQvcG9vbF9zZXNzaW9uX2NvbnRleHQuaCIKKyNpbmNsdWRlICJ1dGlscy9w b29sX3RyYWNrX3RhYmxlX211dGF0aW9uLmgiCisjaW5jbHVkZSAidXRpbHMvZWxvZy5oIgorI2lu Y2x1ZGUgInV0aWxzL3Bvb2xfaXBjLmgiCisjaW5jbHVkZSAidXRpbHMvcGFsbG9jLmgiCisjaW5j bHVkZSAidXRpbHMvcG9vbF9yZWxjYWNoZS5oIgorCisjZGVmaW5lIERBVEFCQVNFX1RPX09JRF9R VUVSWSBcCisJIlNFTEVDVCBvaWQgRlJPTSBwZ19jYXRhbG9nLnBnX2RhdGFiYXNlIiBcCisJIiBX SEVSRSBkYXRuYW1lID0gJyVzJyIKKworLyoKKyAqIEhlbHBlciBtYWNybzogdHJ1ZSB3aGVuIHRo ZSBmZWF0dXJlIGlzIG5vdCBhY3RpdmUuCisgKi8KKyNkZWZpbmUgVFJBQ0tfVEFCTEVfTVVUQVRJ T05fRElTQUJMRUQoKSBcCisJKHBvb2xfY29uZmlnLT5kaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93 cml0ZSAhPSBcCisJIERMQk9XX0RNTF9BREFQVElWRV9HTE9CQUwgfHwgXAorCSB0cmFja190YWJs ZV9tdXRhdGlvbl9zaG1lbSA9PSBOVUxMKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tCisgKiBMb2Nh bCB2YXJpYWJsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBQb2ludGVyIHRvIHNo YXJlZCBtZW1vcnkgc3RydWN0dXJlICovCitzdGF0aWMgVHJhY2tUYWJsZU11dGF0aW9uU2htZW0g KnRyYWNrX3RhYmxlX211dGF0aW9uX3NobWVtID0gTlVMTDsKKworLyogUGVyLXByb2Nlc3MgY29s ZCBzdGFydCB0cmFja2luZyAobm90IGluIHNoYXJlZCBtZW1vcnkpICovCitzdGF0aWMgc3RydWN0 IHRpbWV2YWwgcHJvY2Vzc19zdGFydF90aW1lOworc3RhdGljIGJvb2wgY29sZF9zdGFydF9pbml0 aWFsaXplZCA9IGZhbHNlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tCisgKiBIZWxwZXIgbWFjcm9z IGZvciBmbGV4aWJsZSBhcnJheXMgaW4gc2hhcmVkIG1lbW9yeQorICogLS0tLS0tLS0tLS0tLS0t LQorICovCisKKy8qIEdldCBwb2ludGVyIHRvIGJ1Y2tldCBhcnJheSBpbiB0YWJsZSBtYXAgKi8K KyNkZWZpbmUgVEFCTEVfTUFQX0JVQ0tFVFMobWFwKSBcCisJKChpbnQgKikoKGNoYXIgKikobWFw KSArIFwKKwkJc2l6ZW9mKFRyYWNrVGFibGVNdXRhdGlvbkhhc2hUYWJsZSkpKQorCisvKiBHZXQg cG9pbnRlciB0byBlbnRyeSBhcnJheSBpbiB0YWJsZSBtYXAgKi8KKyNkZWZpbmUgVEFCTEVfTUFQ X0VOVFJJRVMobWFwKSBcCisJKChUcmFja1RhYmxlTXV0YXRpb25FbnRyeSAqKSgoY2hhciAqKSht YXApICsgXAorCQlzaXplb2YoVHJhY2tUYWJsZU11dGF0aW9uSGFzaFRhYmxlKSArIFwKKwkJKG1h cCktPm51bV9idWNrZXRzICogc2l6ZW9mKGludCkpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tCisg KiBTZW1hcGhvcmUgbG9jayBoZWxwZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3Rh dGljIGlubGluZSB2b2lkCit0YWJsZV9tYXBfbG9jayh2b2lkKQoreworCXBvb2xfc2VtYXBob3Jl X2xvY2soVFJBQ0tfVEFCTEVfTVVUQVRJT05fVEFCTEVfU0VNKTsKK30KKworc3RhdGljIGlubGlu ZSB2b2lkCit0YWJsZV9tYXBfdW5sb2NrKHZvaWQpCit7CisJcG9vbF9zZW1hcGhvcmVfdW5sb2Nr KFRSQUNLX1RBQkxFX01VVEFUSU9OX1RBQkxFX1NFTSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0t LS0KKyAqIEhhc2ggZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAq IEZOVi0xYSBoYXNoIGZvciB0YWJsZS9kYXRhYmFzZSBvaWQgcGFpcgorICovCitzdGF0aWMgdWlu dDMyCitmbnYxYV9oYXNoX3RhYmxlX2tleShpbnQgdGFibGVfb2lkLCBpbnQgZGJvaWQpCit7CisJ dWludDMyCQloYXNoID0gMjE2NjEzNjI2MXU7IC8qIEZOViBvZmZzZXQgYmFzaXMgKi8KKwl1aW50 MzIJCWRhdGFbMl07CisJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXM7CisJc2l6ZV90CQlpOwor CisJZGF0YVswXSA9ICh1aW50MzIpIHRhYmxlX29pZDsKKwlkYXRhWzFdID0gKHVpbnQzMikgZGJv aWQ7CisJYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBkYXRhOworCisJZm9yIChpID0g MDsgaSA8IHNpemVvZihkYXRhKTsgaSsrKQorCXsKKwkJaGFzaCBePSBieXRlc1tpXTsKKwkJaGFz aCAqPSAxNjc3NzYxOXU7CQkvKiBGTlYgcHJpbWUgKi8KKwl9CisKKwlyZXR1cm4gaGFzaDsKK30K KworLyogLS0tLS0tLS0tLS0tLS0tLQorICogVGltZSB1dGlsaXRpZXMKKyAqIC0tLS0tLS0tLS0t LS0tLS0KKyAqLworCisvKgorICogR2V0IGVsYXBzZWQgdGltZSBpbiBtaWNyb3NlY29uZHMgYmV0 d2VlbiB0d28gdGltZXZhbHMKKyAqLworc3RhdGljIGludDY0CitlbGFwc2VkX3VzKHN0cnVjdCB0 aW1ldmFsICpzdGFydCwgc3RydWN0IHRpbWV2YWwgKmVuZCkKK3sKKwlyZXR1cm4gKChpbnQ2NCkg KGVuZC0+dHZfc2VjIC0gc3RhcnQtPnR2X3NlYykgKiAxMDAwMDAwKQorCQkrIChlbmQtPnR2X3Vz ZWMgLSBzdGFydC0+dHZfdXNlYyk7Cit9CisKKy8qCisgKiBHZXQgY3VycmVudCB0aW1lCisgKi8K K3N0YXRpYyB2b2lkCitnZXRfY3VycmVudF90aW1lKHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwln ZXR0aW1lb2ZkYXkodHYsIE5VTEwpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tCisgKiBEYXRh YmFzZSBvaWQgbG9va3VwCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludAor dHJhY2tfdGFibGVfbXV0YXRpb25fZ2V0X2RhdGFiYXNlX29pZF9pbnRlcm5hbCh2b2lkKQorewor CWludAkJCW9pZCA9IDA7CisJc3RhdGljIFBPT0xfUkVMQ0FDSEUgKnJlbGNhY2hlOworCVBPT0xf Q09OTkVDVElPTl9QT09MICpiYWNrZW5kOworCVBPT0xfU0VTU0lPTl9DT05URVhUICpzZXNzaW9u X2NvbnRleHQ7CisKKwkvKiBTYWZldHkgY2hlY2s6IG11c3QgaGF2ZSBzaG1lbSBpbml0aWFsaXpl ZCAqLworCWlmICh0cmFja190YWJsZV9tdXRhdGlvbl9zaG1lbSA9PSBOVUxMKQorCQlyZXR1cm4g b2lkOworCisJc2Vzc2lvbl9jb250ZXh0ID0gcG9vbF9nZXRfc2Vzc2lvbl9jb250ZXh0KGZhbHNl KTsKKwlpZiAoc2Vzc2lvbl9jb250ZXh0ID09IE5VTEwpCisJCXJldHVybiBvaWQ7CisKKwliYWNr ZW5kID0gc2Vzc2lvbl9jb250ZXh0LT5iYWNrZW5kOworCWlmIChiYWNrZW5kID09IE5VTEwgfHwK KwkJTUFJTl9DT05ORUNUSU9OKGJhY2tlbmQpID09IE5VTEwgfHwKKwkJTUFJTl9DT05ORUNUSU9O KGJhY2tlbmQpLT5zcCA9PSBOVUxMKQorCQlyZXR1cm4gb2lkOworCisJLyogRW5zdXJlIGRhdGFi YXNlIG5hbWUgaXMgdmFsaWQgKi8KKwlpZiAoTUFJTl9DT05ORUNUSU9OKGJhY2tlbmQpLT5zcC0+ ZGF0YWJhc2UgPT0gTlVMTCkKKwkJcmV0dXJuIG9pZDsKKworCWlmICghcmVsY2FjaGUpCisJewor CQlyZWxjYWNoZSA9IHBvb2xfY3JlYXRlX3JlbGNhY2hlKAorCQkJCQkJCQkJCXBvb2xfY29uZmln LT5yZWxjYWNoZV9zaXplLAorCQkJCQkJCQkJCURBVEFCQVNFX1RPX09JRF9RVUVSWSwKKwkJCQkJ CQkJCQlpbnRfcmVnaXN0ZXJfZnVuYywKKwkJCQkJCQkJCQlpbnRfdW5yZWdpc3Rlcl9mdW5jLAor CQkJCQkJCQkJCWZhbHNlKTsKKwkJaWYgKHJlbGNhY2hlID09IE5VTEwpCisJCXsKKwkJCWVyZXBv cnQoTE9HLAorCQkJCQkoZXJybXNnKCJ0cmFja190YWJsZV9tdXRhdGlvbjogIgorCQkJCQkJCSJl cnJvciBjcmVhdGluZyByZWxjYWNoZSIpKSk7CisJCQlyZXR1cm4gb2lkOworCQl9CisJfQorCisJ b2lkID0gKGludCkgKGludHB0cl90KSBwb29sX3NlYXJjaF9yZWxjYWNoZSgKKwkJCQkJCQkJCQkJ CXJlbGNhY2hlLCBiYWNrZW5kLAorCQkJCQkJCQkJCQkJTUFJTl9DT05ORUNUSU9OKGJhY2tlbmQp LT5zcC0+ZGF0YWJhc2UpOworCXJldHVybiBvaWQ7Cit9CisKK2ludAorcG9vbF90cmFja190YWJs ZV9tdXRhdGlvbl9nZXRfZGF0YWJhc2Vfb2lkKHZvaWQpCit7CisJcmV0dXJuIHRyYWNrX3RhYmxl X211dGF0aW9uX2dldF9kYXRhYmFzZV9vaWRfaW50ZXJuYWwoKTsKK30KKworLyogLS0tLS0tLS0t LS0tLS0tLQorICogVGFibGUgbXV0YXRpb24gaGFzaCB0YWJsZSBvcGVyYXRpb25zCisgKiAtLS0t LS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIEluaXRpYWxpemUgdGFibGUgbXV0YXRpb24gaGFz aCB0YWJsZQorICovCitzdGF0aWMgdm9pZAordGFibGVfbWFwX2luaXQoVHJhY2tUYWJsZU11dGF0 aW9uSGFzaFRhYmxlICptYXAsCisJCQkgICBpbnQgbnVtX2J1Y2tldHMsIGludCBtYXhfZW50cmll cykKK3sKKwlpbnQJCSAgICpidWNrZXRzOworCVRyYWNrVGFibGVNdXRhdGlvbkVudHJ5ICplbnRy aWVzOworCWludAkJCWk7CisJaW50CQkJaW52YWxpZCA9IFRSQUNLX1RBQkxFX01VVEFUSU9OX0lO VkFMSURfSU5ERVg7CisKKwltYXAtPm51bV9idWNrZXRzID0gbnVtX2J1Y2tldHM7CisJbWFwLT5t YXhfZW50cmllcyA9IG1heF9lbnRyaWVzOworCW1hcC0+bnVtX2VudHJpZXMgPSAwOworCW1hcC0+ ZnJlZV9saXN0X2hlYWQgPSAwOworCisJYnVja2V0cyA9IFRBQkxFX01BUF9CVUNLRVRTKG1hcCk7 CisJZW50cmllcyA9IFRBQkxFX01BUF9FTlRSSUVTKG1hcCk7CisKKwkvKiBJbml0aWFsaXplIGFs bCBidWNrZXRzIHRvIGVtcHR5ICovCisJZm9yIChpID0gMDsgaSA8IG51bV9idWNrZXRzOyBpKysp CisJCWJ1Y2tldHNbaV0gPSBpbnZhbGlkOworCisJLyogSW5pdGlhbGl6ZSBmcmVlIGxpc3QgLSBj aGFpbiBhbGwgZW50cmllcyAqLworCWZvciAoaSA9IDA7IGkgPCBtYXhfZW50cmllczsgaSsrKQor CXsKKwkJZW50cmllc1tpXS5pbl91c2UgPSBmYWxzZTsKKwkJZW50cmllc1tpXS5uZXh0ID0gKGkg PCBtYXhfZW50cmllcyAtIDEpID8KKwkJCWkgKyAxIDogaW52YWxpZDsKKwl9CisKKwllcmVwb3J0 KERFQlVHMSwKKwkJCShlcnJtc2coInRyYWNrX3RhYmxlX211dGF0aW9uOiAiCisJCQkJCSJ0YWJs ZSBtYXAgaW5pdCAlZCBidWNrZXRzLCAiCisJCQkJCSIlZCBtYXggZW50cmllcyIsCisJCQkJCW51 bV9idWNrZXRzLCBtYXhfZW50cmllcykpKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuIGVudHJ5 IGZyb20gdGhlIGZyZWUgbGlzdAorICovCitzdGF0aWMgaW50Cit0YWJsZV9tYXBfYWxsb2NfZW50 cnkoVHJhY2tUYWJsZU11dGF0aW9uSGFzaFRhYmxlICptYXApCit7CisJVHJhY2tUYWJsZU11dGF0 aW9uRW50cnkgKmVudHJpZXM7CisJaW50CQkJaWR4OworCWludAkJCWludmFsaWQgPSBUUkFDS19U QUJMRV9NVVRBVElPTl9JTlZBTElEX0lOREVYOworCisJZW50cmllcyA9IFRBQkxFX01BUF9FTlRS SUVTKG1hcCk7CisKKwlpZiAobWFwLT5mcmVlX2xpc3RfaGVhZCA9PSBpbnZhbGlkKQorCQlyZXR1 cm4gaW52YWxpZDsKKworCWlkeCA9IG1hcC0+ZnJlZV9saXN0X2hlYWQ7CisJbWFwLT5mcmVlX2xp c3RfaGVhZCA9IGVudHJpZXNbaWR4XS5uZXh0OworCWVudHJpZXNbaWR4XS5pbl91c2UgPSB0cnVl OworCWVudHJpZXNbaWR4XS5uZXh0ID0gaW52YWxpZDsKKwltYXAtPm51bV9lbnRyaWVzKys7CisK KwlyZXR1cm4gaWR4OworfQorCisvKgorICogRnJlZSBhbiBlbnRyeSBiYWNrIHRvIHRoZSBmcmVl IGxpc3QKKyAqLworc3RhdGljIHZvaWQKK3RhYmxlX21hcF9mcmVlX2VudHJ5KFRyYWNrVGFibGVN dXRhdGlvbkhhc2hUYWJsZSAqbWFwLAorCQkJCQkgaW50IGlkeCkKK3sKKwlUcmFja1RhYmxlTXV0 YXRpb25FbnRyeSAqZW50cmllczsKKworCWVudHJpZXMgPSBUQUJMRV9NQVBfRU5UUklFUyhtYXAp OworCisJZW50cmllc1tpZHhdLmluX3VzZSA9IGZhbHNlOworCWVudHJpZXNbaWR4XS5uZXh0ID0g bWFwLT5mcmVlX2xpc3RfaGVhZDsKKwltYXAtPmZyZWVfbGlzdF9oZWFkID0gaWR4OworCW1hcC0+ bnVtX2VudHJpZXMtLTsKK30KKworLyoKKyAqIExvb2sgdXAgYSB0YWJsZSBpbiB0aGUgaGFzaCB0 YWJsZS4KKyAqIFJldHVybnMgZW50cnkgaW5kZXggb3IgSU5WQUxJRF9JTkRFWCBpZiBub3QgZm91 bmQuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludAor dGFibGVfbWFwX2xvb2t1cChUcmFja1RhYmxlTXV0YXRpb25IYXNoVGFibGUgKm1hcCwKKwkJCQkg aW50IHRhYmxlX29pZCwgaW50IGRib2lkLAorCQkJCSB1aW50MzIgaGFzaCkKK3sKKwlpbnQJCSAg ICpidWNrZXRzID0gVEFCTEVfTUFQX0JVQ0tFVFMobWFwKTsKKwlUcmFja1RhYmxlTXV0YXRpb25F bnRyeSAqZW50cmllczsKKwlpbnQJCQlidWNrZXQgPSBoYXNoICUgbWFwLT5udW1fYnVja2V0czsK KwlpbnQJCQlpZHggPSBidWNrZXRzW2J1Y2tldF07CisJaW50CQkJaW52YWxpZCA9IFRSQUNLX1RB QkxFX01VVEFUSU9OX0lOVkFMSURfSU5ERVg7CisKKwllbnRyaWVzID0gVEFCTEVfTUFQX0VOVFJJ RVMobWFwKTsKKworCXdoaWxlIChpZHggIT0gaW52YWxpZCkKKwl7CisJCWlmIChlbnRyaWVzW2lk eF0uaGFzaCA9PSBoYXNoICYmCisJCQllbnRyaWVzW2lkeF0udGFibGVfb2lkID09IHRhYmxlX29p ZCAmJgorCQkJZW50cmllc1tpZHhdLmRib2lkID09IGRib2lkKQorCQl7CisJCQlyZXR1cm4gaWR4 OworCQl9CisJCWlkeCA9IGVudHJpZXNbaWR4XS5uZXh0OworCX0KKworCXJldHVybiBpbnZhbGlk OworfQorCisvKgorICogSW5zZXJ0IG9yIHVwZGF0ZSBhIHRhYmxlIGVudHJ5LgorICogTXVzdCBi ZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkCit0YWJsZV9tYXBfaW5z ZXJ0KFRyYWNrVGFibGVNdXRhdGlvbkhhc2hUYWJsZSAqbWFwLAorCQkJCSBpbnQgdGFibGVfb2lk LCBpbnQgZGJvaWQsCisJCQkJIHVpbnQzMiBoYXNoLAorCQkJCSBzdHJ1Y3QgdGltZXZhbCAqd3Jp dGVfdGltZSkKK3sKKwlpbnQJCSAgICpidWNrZXRzID0gVEFCTEVfTUFQX0JVQ0tFVFMobWFwKTsK KwlUcmFja1RhYmxlTXV0YXRpb25FbnRyeSAqZW50cmllczsKKwlpbnQJCQlidWNrZXQgPSBoYXNo ICUgbWFwLT5udW1fYnVja2V0czsKKwlpbnQJCQlpZHg7CisJaW50CQkJaW52YWxpZCA9IFRSQUNL X1RBQkxFX01VVEFUSU9OX0lOVkFMSURfSU5ERVg7CisKKwllbnRyaWVzID0gVEFCTEVfTUFQX0VO VFJJRVMobWFwKTsKKworCS8qIENoZWNrIGlmIGVudHJ5IGFscmVhZHkgZXhpc3RzICovCisJaWR4 ID0gdGFibGVfbWFwX2xvb2t1cChtYXAsIHRhYmxlX29pZCwgZGJvaWQsIGhhc2gpOworCWlmIChp ZHggIT0gaW52YWxpZCkKKwl7CisJCS8qIFVwZGF0ZSBsYXN0IHdyaXRlIHRpbWU7IGtlZXAgZmly c3Rfd3JpdGVfdGltZSAqLworCQllbnRyaWVzW2lkeF0ubGFzdF93cml0ZV90aW1lID0gKndyaXRl X3RpbWU7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBuZXcgZW50cnkgKi8KKwlpZHgg PSB0YWJsZV9tYXBfYWxsb2NfZW50cnkobWFwKTsKKwlpZiAoaWR4ID09IGludmFsaWQpCisJewor CQlpbnQJCQliOworCisJCS8qIFRhYmxlIGlzIGZ1bGwgLSBldmljdCBmaXJzdCBub24tZW1wdHkg YnVja2V0ICovCisJCWZvciAoYiA9IDA7IGIgPCBtYXAtPm51bV9idWNrZXRzOyBiKyspCisJCXsK KwkJCWlmIChidWNrZXRzW2JdICE9IGludmFsaWQpCisJCQl7CisJCQkJaW50CQkJdmljdGltID0g YnVja2V0c1tiXTsKKworCQkJCWJ1Y2tldHNbYl0gPSBlbnRyaWVzW3ZpY3RpbV0ubmV4dDsKKwkJ CQl0YWJsZV9tYXBfZnJlZV9lbnRyeShtYXAsIHZpY3RpbSk7CisJCQkJaWR4ID0gdGFibGVfbWFw X2FsbG9jX2VudHJ5KG1hcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoaWR4ID09 IGludmFsaWQpCisJCXsKKwkJCWVyZXBvcnQoV0FSTklORywKKwkJCQkJKGVycm1zZygidHJhY2tf dGFibGVfbXV0YXRpb246ICIKKwkJCQkJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIGVudHJ5ICIKKwkJ CQkJCQkiZm9yIG9pZCAlZCAoZGJvaWQgJWQpIiwKKwkJCQkJCQl0YWJsZV9vaWQsIGRib2lkKSkp OworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBuZXcgZW50cnkgKi8KKwll bnRyaWVzW2lkeF0udGFibGVfb2lkID0gdGFibGVfb2lkOworCWVudHJpZXNbaWR4XS5kYm9pZCA9 IGRib2lkOworCWVudHJpZXNbaWR4XS5oYXNoID0gaGFzaDsKKwllbnRyaWVzW2lkeF0uZmlyc3Rf d3JpdGVfdGltZSA9ICp3cml0ZV90aW1lOworCWVudHJpZXNbaWR4XS5sYXN0X3dyaXRlX3RpbWUg PSAqd3JpdGVfdGltZTsKKworCS8qIEluc2VydCBhdCBoZWFkIG9mIGJ1Y2tldCBjaGFpbiAqLwor CWVudHJpZXNbaWR4XS5uZXh0ID0gYnVja2V0c1tidWNrZXRdOworCWJ1Y2tldHNbYnVja2V0XSA9 IGlkeDsKKworCWVyZXBvcnQoREVCVUcyLAorCQkJKGVycm1zZygidHJhY2tfdGFibGVfbXV0YXRp b246ICIKKwkJCQkJIm1hcmtlZCBvaWQgJWQgKGRib2lkICVkKSB3cml0dGVuIiwKKwkJCQkJdGFi bGVfb2lkLCBkYm9pZCkpKTsKK30KKworLyoKKyAqIFJlbW92ZSBleHBpcmVkIGVudHJpZXMgZnJv bSB0aGUgdGFibGUgbWFwLgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8K K3N0YXRpYyB2b2lkCit0YWJsZV9tYXBfY2xlYW51cF9leHBpcmVkKAorCQkJCQkJICBUcmFja1Rh YmxlTXV0YXRpb25IYXNoVGFibGUgKm1hcCwgdWludDY0IHR0bF91cykKK3sKKwlpbnQJCSAgICpi dWNrZXRzID0gVEFCTEVfTUFQX0JVQ0tFVFMobWFwKTsKKwlUcmFja1RhYmxlTXV0YXRpb25FbnRy eSAqZW50cmllczsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJaW50NjQJCW1heF9zdGFsZV91czsK KwlpbnQJCQlyZW1vdmVkID0gMDsKKwlpbnQJCQliOworCWludAkJCWludmFsaWQgPSBUUkFDS19U QUJMRV9NVVRBVElPTl9JTlZBTElEX0lOREVYOworCisJZW50cmllcyA9IFRBQkxFX01BUF9FTlRS SUVTKG1hcCk7CisJZ2V0X2N1cnJlbnRfdGltZSgmbm93KTsKKworCW1heF9zdGFsZV91cyA9IChp bnQ2NCkgcG9vbF9jb25maWcKKwkJLT50cmFja190YWJsZV9tdXRhdGlvbl9tYXhfc3RhbGVuZXNz ICogMTAwMExMOworCisJZm9yIChiID0gMDsgYiA8IG1hcC0+bnVtX2J1Y2tldHM7IGIrKykKKwl7 CisJCWludAkJICAgKnByZXZfcHRyID0gJmJ1Y2tldHNbYl07CisJCWludAkJCWlkeCA9IGJ1Y2tl dHNbYl07CisKKwkJd2hpbGUgKGlkeCAhPSBpbnZhbGlkKQorCQl7CisJCQlpbnQ2NAkJYWdlOwor CQkJaW50NjQJCXRvdGFsX2FnZTsKKwkJCWJvb2wJCWV4cGlyZWQ7CisKKwkJCWFnZSA9IGVsYXBz ZWRfdXMoCisJCQkJCQkJICZlbnRyaWVzW2lkeF0ubGFzdF93cml0ZV90aW1lLCAmbm93KTsKKwkJ CWV4cGlyZWQgPSAoYWdlID4gKGludDY0KSB0dGxfdXMpOworCisJCQkvKgorCQkJICogQWxzbyBl dmljdCBlbnRyaWVzIHRoYXQgZXhjZWVkIG1heF9zdGFsZW5lc3MgZnJvbSBmaXJzdCB3cml0ZS4K KwkJCSAqLworCQkJaWYgKCFleHBpcmVkICYmIG1heF9zdGFsZV91cyA+IDApCisJCQl7CisJCQkJ dG90YWxfYWdlID0gZWxhcHNlZF91cygKKwkJCQkJCQkJCSAgICZlbnRyaWVzW2lkeF0uZmlyc3Rf d3JpdGVfdGltZSwKKwkJCQkJCQkJCSAgICZub3cpOworCQkJCWV4cGlyZWQgPSAodG90YWxfYWdl ID49IG1heF9zdGFsZV91cyk7CisJCQl9CisKKwkJCWlmIChleHBpcmVkKQorCQkJeworCQkJCS8q IEVudHJ5IGhhcyBleHBpcmVkIC0gcmVtb3ZlIGl0ICovCisJCQkJaW50CQkJbmV4dCA9IGVudHJp ZXNbaWR4XS5uZXh0OworCisJCQkJKnByZXZfcHRyID0gbmV4dDsKKwkJCQl0YWJsZV9tYXBfZnJl ZV9lbnRyeShtYXAsIGlkeCk7CisJCQkJaWR4ID0gbmV4dDsKKwkJCQlyZW1vdmVkKys7CisJCQl9 CisJCQllbHNlCisJCQl7CisJCQkJcHJldl9wdHIgPSAmZW50cmllc1tpZHhdLm5leHQ7CisJCQkJ aWR4ID0gZW50cmllc1tpZHhdLm5leHQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAocmVtb3ZlZCA+ IDApCisJeworCQllcmVwb3J0KERFQlVHMSwKKwkJCQkoZXJybXNnKCJ0cmFja190YWJsZV9tdXRh dGlvbjogIgorCQkJCQkJImNsZWFuZWQgdXAgJWQgZXhwaXJlZCBlbnRyaWVzIiwKKwkJCQkJCXJl bW92ZWQpKSk7CisJfQorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1YmxpYyBBUEkg aW1wbGVtZW50YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogQ2FsY3Vs YXRlIHRoZSB0b3RhbCBzaGFyZWQgbWVtb3J5IHNpemUgcmVxdWlyZWQKKyAqIGZvciB0aGUgdHJh Y2sgdGFibGUgbXV0YXRpb24gZmVhdHVyZS4KKyAqLworU2l6ZQorcG9vbF90cmFja190YWJsZV9t dXRhdGlvbl9zaG1lbV9zaXplKHZvaWQpCit7CisJU2l6ZQkJc2l6ZSA9IDA7CisJaW50CQkJdGJs X2JrdDsKKwlpbnQJCQl0Ymxfc3o7CisKKwl0YmxfYmt0ID0gcG9vbF9jb25maWctPnRyYWNrX3Rh YmxlX211dGF0aW9uX3RhYmxlX2J1Y2tldHM7CisJdGJsX3N6ID0gcG9vbF9jb25maWctPnRyYWNr X3RhYmxlX211dGF0aW9uX3RhYmxlX3NpemU7CisKKwkvKiBNYWluIHN0cnVjdHVyZSAqLworCXNp emUgKz0gc2l6ZW9mKFRyYWNrVGFibGVNdXRhdGlvblNobWVtKTsKKworCS8qIFRhYmxlIG11dGF0 aW9uIGhhc2ggdGFibGUgKi8KKwlzaXplICs9IHNpemVvZihUcmFja1RhYmxlTXV0YXRpb25IYXNo VGFibGUpOworCXNpemUgKz0gdGJsX2JrdCAqIHNpemVvZihpbnQpOworCXNpemUgKz0gdGJsX3N6 ICogc2l6ZW9mKFRyYWNrVGFibGVNdXRhdGlvbkVudHJ5KTsKKworCXJldHVybiBzaXplOworfQor CisvKgorICogSW5pdGlhbGl6ZSBzaGFyZWQgbWVtb3J5IHN0cnVjdHVyZXMgZm9yIHRoZQorICog dHJhY2sgdGFibGUgbXV0YXRpb24gZmVhdHVyZS4gIEFsbG9jYXRlcyBhbmQgc2V0cworICogdXAg dGhlIHRhYmxlIG1hcCBhbmQgcGFyc2UgY2FjaGUgaW4gc2hhcmVkIG1lbW9yeS4KKyAqIENhbGxl ZCBvbmNlIGZyb20gcGdwb29sIG1haW4gcHJvY2VzcyBhdCBzdGFydHVwLgorICovCit2b2lkCitw b29sX3RyYWNrX3RhYmxlX211dGF0aW9uX2luaXQodm9pZCkKK3sKKyNpZm5kZWYgUE9PTF9QUklW QVRFCisJU2l6ZQkJc2htZW1fc2l6ZTsKKwljaGFyCSAgICpzaG1lbV9wdHI7CisJVHJhY2tUYWJs ZU11dGF0aW9uU3RhdGUgKnN0OworCWludAkJCXRibF9ia3Q7CisJaW50CQkJdGJsX3N6OworCisJ aWYgKHBvb2xfY29uZmlnLT5kaXNhYmxlX2xvYWRfYmFsYW5jZV9vbl93cml0ZSAhPQorCQlETEJP V19ETUxfQURBUFRJVkVfR0xPQkFMKQorCXsKKwkJZXJlcG9ydChERUJVRzEsCisJCQkJKGVycm1z ZygidHJhY2tfdGFibGVfbXV0YXRpb246ICIKKwkJCQkJCSJmZWF0dXJlIGRpc2FibGVkIikpKTsK KwkJcmV0dXJuOworCX0KKworCXRibF9ia3QgPSBwb29sX2NvbmZpZy0+dHJhY2tfdGFibGVfbXV0 YXRpb25fdGFibGVfYnVja2V0czsKKwl0Ymxfc3ogPSBwb29sX2NvbmZpZy0+dHJhY2tfdGFibGVf bXV0YXRpb25fdGFibGVfc2l6ZTsKKworCXNobWVtX3NpemUgPSBwb29sX3RyYWNrX3RhYmxlX211 dGF0aW9uX3NobWVtX3NpemUoKTsKKworCS8qCisJICogQWxsb2NhdGUgZnJvbSB0aGUgbWFpbiBz aGFyZWQgbWVtb3J5IHNlZ21lbnQuIE1lbW9yeSBpcyB6ZXJvZWQgYnkKKwkgKiBpbml0aWFsaXpl X3NoYXJlZF9tZW1vcnlfbWFpbl9zZWdtZW50KCkuCisJICovCisJc2htZW1fcHRyID0gcG9vbF9z aGFyZWRfbWVtb3J5X3NlZ21lbnRfZ2V0X2NodW5rKAorCQkJCQkJCQkJCQkJCSBzaG1lbV9zaXpl KTsKKwlpZiAoc2htZW1fcHRyID09IE5VTEwpCisJeworCQllcmVwb3J0KEVSUk9SLAorCQkJCShl cnJtc2coInRyYWNrX3RhYmxlX211dGF0aW9uOiAiCisJCQkJCQkiZmFpbGVkIHRvIGFsbG9jYXRl ICV6dSBieXRlcyIsCisJCQkJCQlzaG1lbV9zaXplKSkpOworCQlyZXR1cm47CisJfQorCisJLyog U2V0IHVwIHBvaW50ZXJzIHdpdGhpbiBzaGFyZWQgbWVtb3J5ICovCisJdHJhY2tfdGFibGVfbXV0 YXRpb25fc2htZW0gPQorCQkoVHJhY2tUYWJsZU11dGF0aW9uU2htZW0gKikgc2htZW1fcHRyOwor CXNobWVtX3B0ciArPSBzaXplb2YoVHJhY2tUYWJsZU11dGF0aW9uU2htZW0pOworCisJdHJhY2tf dGFibGVfbXV0YXRpb25fc2htZW0tPnRhYmxlX21hcCA9CisJCShUcmFja1RhYmxlTXV0YXRpb25I YXNoVGFibGUgKikgc2htZW1fcHRyOworCisJLyogSW5pdGlhbGl6ZSB0YWJsZSBtYXAgKi8KKwl0 YWJsZV9tYXBfaW5pdCgKKwkJCQkgICB0cmFja190YWJsZV9tdXRhdGlvbl9zaG1lbS0+dGFibGVf bWFwLAorCQkJCSAgIHRibF9ia3QsIHRibF9zeik7CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBz dGF0ZSAqLworCXN0ID0gJnRyYWNrX3RhYmxlX211dGF0aW9uX3NobWVtLT5zdGF0ZTsKKwlzdC0+ aW5pdGlhbGl6ZWQgPSB0cnVlOworCXN0LT5jdXJyZW50X3R0bF91cyA9IFRSQUNLX1RBQkxFX01V VEFUSU9OX0RFRkFVTFRfVFRMX1VTOworCWdldF9jdXJyZW50X3RpbWUoJnN0LT50dGxfbGFzdF91 cGRhdGVkKTsKKwlnZXRfY3VycmVudF90aW1lKCZzdC0+bGFzdF9jbGVhbnVwX3RpbWUpOworCXN0 LT5nbG9iYWxfY29sZF9zdGFydF91bnRpbC50dl9zZWMgPSAwOworCXN0LT5nbG9iYWxfY29sZF9z dGFydF91bnRpbC50dl91c2VjID0gMDsKKwlzdC0+c3RhdHNfcXVlcmllc19jaGVja2VkID0gMDsK KwlzdC0+c3RhdHNfZm9yY2VkX3ByaW1hcnkgPSAwOworCXN0LT5zdGF0c19hbGxvd2VkX3JlcGxp Y2EgPSAwOworCisJZXJlcG9ydChMT0csCisJCQkoZXJybXNnKCJ0cmFja190YWJsZV9tdXRhdGlv bjogIgorCQkJCQkiaW5pdGlhbGl6ZWQgd2l0aCAlenUgYnl0ZXMgc2htZW0iLAorCQkJCQlzaG1l bV9zaXplKSkpOworI2VuZGlmCit9CisKKy8qCisgKiBJbml0aWFsaXplIHBlci1jaGlsZCBwcm9j ZXNzIHN0YXRlLgorICogUmVjb3JkcyB0aGUgcHJvY2VzcyBzdGFydCB0aW1lIGZvciBjb2xkIHN0 YXJ0CisgKiBwZXJpb2QgdHJhY2tpbmcuICBDYWxsZWQgd2hlbiBhIGNoaWxkIHByb2Nlc3Mgc3Rh cnRzLgorICovCit2b2lkCitwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX2NoaWxkX2luaXQodm9p ZCkKK3sKKwlpbnQJCQlkdXI7CisKKwlpZiAoVFJBQ0tfVEFCTEVfTVVUQVRJT05fRElTQUJMRUQo KSkKKwkJcmV0dXJuOworCisJZ2V0X2N1cnJlbnRfdGltZSgmcHJvY2Vzc19zdGFydF90aW1lKTsK Kwljb2xkX3N0YXJ0X2luaXRpYWxpemVkID0gdHJ1ZTsKKwlkdXIgPSBwb29sX2NvbmZpZy0+dHJh Y2tfdGFibGVfbXV0YXRpb25fY29sZF9zdGFydF9kdXJhdGlvbjsKKworCWVyZXBvcnQoREVCVUcx LAorCQkJKGVycm1zZygidHJhY2tfdGFibGVfbXV0YXRpb246ICIKKwkJCQkJImNoaWxkIGluaXQs IGNvbGQgc3RhcnQgJWQgbXMiLAorCQkJCQlkdXIpKSk7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0 aGUgcHJvY2VzcyBpcyBpbiBjb2xkIHN0YXJ0IHBlcmlvZC4KKyAqIER1cmluZyBjb2xkIHN0YXJ0 LCBhbGwgcXVlcmllcyBhcmUgcm91dGVkIHRvCisgKiBwcmltYXJ5IHRvIGF2b2lkIHN0YWxlIHJl YWRzLiAgQ2hlY2tzIGJvdGgKKyAqIHBlci1wcm9jZXNzIGFuZCBnbG9iYWwgKHdhdGNoZG9nKSBj b2xkIHN0YXJ0LgorICovCitib29sCitwb29sX3RyYWNrX3RhYmxlX211dGF0aW9uX2luX2NvbGRf c3RhcnQodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJaW50NjQJCWVsYXBzZWRfbXM7 CisJaW50CQkJZHVyOworCVRyYWNrVGFibGVNdXRhdGlvblN0YXRlICpzdDsKKworCWlmIChUUkFD S19UQUJMRV9NVVRBVElPTl9ESVNBQkxFRCgpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlkdXIgPSBw b29sX2NvbmZpZy0+dHJhY2tfdGFibGVfbXV0YXRpb25fY29sZF9zdGFydF9kdXJhdGlvbjsKKwlp ZiAoZHVyIDw9IDApCisJCXJldHVybiBmYWxzZTsKKworCWdldF9jdXJyZW50X3RpbWUoJm5vdyk7 CisJc3QgPSAmdHJhY2tfdGFibGVfbXV0YXRpb25fc2htZW0tPnN0YXRlOworCisJLyogQ2hlY2sg d2F0Y2hkb2ctdHJpZ2dlcmVkIGdsb2JhbCBjb2xkIHN0YXJ0ICovCisJaWYgKHN0LT5nbG9iYWxf Y29sZF9zdGFydF91bnRpbC50dl9zZWMgIT0gMCAmJgorCQllbGFwc2VkX3VzKCZub3csCisJCQkJ ICAgJnN0LT5nbG9iYWxfY29sZF9zdGFydF91bnRpbCkgPiAwKQorCXsKKwkJcmV0dXJuIHRydWU7 CisJfQorCisJLyogQ2hlY2sgcGVyLXByb2Nlc3MgY29sZCBzdGFydCAqLworCWlmICghY29sZF9z dGFydF9pbml0aWFsaXplZCkKKwkJcmV0dXJuIGZhbHNlOworCisJZWxhcHNlZF9tcyA9IGVsYXBz ZWRfdXMoJnByb2Nlc3Nfc3RhcnRfdGltZSwgJm5vdykgLyAxMDAwOworCisJaWYgKGVsYXBzZWRf bXMgPCBkdXIpCisJeworCQllcmVwb3J0KERFQlVHMiwKKwkJCQkoZXJybXNnKCJ0cmFja190YWJs ZV9tdXRhdGlvbjogIgorCQkJCQkJImNvbGQgc3RhcnQgKCVsZC8lZCBtcykiLAorCQkJCQkJKGxv bmcpIGVsYXBzZWRfbXMsIGR1cikpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZh bHNlOworfQorCisvKgorICogVHJpZ2dlciBhIGdsb2JhbCBjb2xkIHN0YXJ0IGZvciBhbGwgcHJv Y2Vzc2VzLgorICogU2V0cyB0aGUgY29sZCBzdGFydCBlbmQgdGltZSBpbiBzaGFyZWQgbWVtb3J5 LgorICogQ2FsbGVkIGFmdGVyIHdhdGNoZG9nIGxlYWRlciBjaGFuZ2UgdG8gZm9yY2UgYWxsCisg KiBxdWVyaWVzIHRvIHByaW1hcnkgZHVyaW5nIHRoZSB0cmFuc2l0aW9uLgorICovCit2b2lkCitw b29sX3RyYWNrX3RhYmxlX211dGF0aW9uX3RyaWdnZXJfZ2xvYmFsX2NvbGRfc3RhcnQodm9pZCkK K3sKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJc3RydWN0IHRpbWV2YWwgKnVudGlsOworCWludAkJ CWR1cjsKKworCWlmIChUUkFDS19UQUJMRV9NVVRBVElPTl9ESVNBQkxFRCgpKQorCQlyZXR1cm47 CisKKwlkdXIgPSBwb29sX2NvbmZpZy0+dHJhY2tfdGFibGVfbXV0YXRpb25fY29sZF9zdGFydF9k dXJhdGlvbjsKKwlpZiAoZHVyIDw9IDApCisJCXJldHVybjsKKworCWdldF9jdXJyZW50X3RpbWUo Jm5vdyk7CisJdW50aWwgPSAmdHJhY2tfdGFibGVfbXV0YXRpb25fc2htZW0tPnN0YXRlCisJCS5n bG9iYWxfY29sZF9zdGFydF91bnRpbDsKKwkqdW50aWwgPSBub3c7CisJdW50aWwtPnR2X3NlYyAr PSBkdXIgLyAxMDAwOworCXVudGlsLT50dl91c2VjICs9IChkdXIgJSAxMDAwKSAqIDEwMDA7CisJ aWYgKHVudGlsLT50dl91c2VjID49IDEwMDAwMDApCisJeworCQl1bnRpbC0+dHZfc2VjICs9IHVu dGlsLT50dl91c2VjIC8gMTAwMDAwMDsKKwkJdW50aWwtPnR2X3VzZWMgJT0gMTAwMDAwMDsKKwl9 CisKKwllcmVwb3J0KExPRywKKwkJCShlcnJtc2coInRyYWNrX3RhYmxlX211dGF0aW9uOiAiCisJ CQkJCSJnbG9iYWwgY29sZCBzdGFydCBmb3IgJWQgbXMiLAorCQkJCQlkdXIpKSk7Cit9CisKKy8q CisgKiBDaGVjayBpZiBhIHRhYmxlIHdhcyByZWNlbnRseSB3cml0dGVuIChpcyAic3RhbGUiKS4K KyAqIFJldHVybnMgdHJ1ZSBpZiByZWFkcyBzaG91bGQgZ28gdG8gcHJpbWFyeSBiZWNhdXNlCisg KiB0aGUgdGFibGUgd2FzIHdyaXR0ZW4gd2l0aGluIHRoZSBjdXJyZW50IFRUTCB3aW5kb3cuCisg Ki8KK2Jvb2wKK3Bvb2xfdHJhY2tfdGFibGVfbXV0YXRpb25fdGFibGVfaXNfc3RhbGUoCisJCQkJ CQkJCQkJIGludCB0YWJsZV9vaWQsIGludCBkYm9pZCkKK3sKKwlUcmFja1RhYmxlTXV0YXRpb25I YXNoVGFibGUgKm1hcDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJdWludDY0CQl0dGxfdXM7CisJ dWludDMyCQloYXNoOworCWludAkJCWlkeDsKKwlib29sCQlpc19zdGFsZSA9IGZhbHNlOworCisJ aWYgKFRSQUNLX1RBQkxFX01VVEFUSU9OX0RJU0FCTEVEKCkpCisJCXJldHVybiBmYWxzZTsKKwor CWlmICh0YWJsZV9vaWQgPD0gMCB8fCBkYm9pZCA8PSAwKQorCXsKKwkJaXNfc3RhbGUgPSB0cnVl OworCQlnb3RvIHVwZGF0ZV9zdGF0czsKKwl9CisKKwltYXAgPSB0cmFja190YWJsZV9tdXRhdGlv bl9zaG1lbS0+dGFibGVfbWFwOworCWhhc2ggPSBmbnYxYV9oYXNoX3RhYmxlX2tleSh0YWJsZV9v aWQsIGRib2lkKTsKKworCXRhYmxlX21hcF9sb2NrKCk7CisKKwlpZHggPSB0YWJsZV9tYXBfbG9v a3VwKG1hcCwgdGFibGVfb2lkLCBkYm9pZCwgaGFzaCk7CisJaWYgKGlkeCAhPSBUUkFDS19UQUJM RV9NVVRBVElPTl9JTlZBTElEX0lOREVYKQorCXsKKwkJVHJhY2tUYWJsZU11dGF0aW9uRW50cnkg KmVudHJpZXM7CisJCWludDY0CQlhZ2U7CisJCWludDY0CQl0b3RhbF9hZ2U7CisJCWludDY0CQlt YXhfc3RhbGVfdXM7CisKKwkJZW50cmllcyA9IFRBQkxFX01BUF9FTlRSSUVTKG1hcCk7CisJCWdl dF9jdXJyZW50X3RpbWUoJm5vdyk7CisJCXR0bF91cyA9IHRyYWNrX3RhYmxlX211dGF0aW9uX3No bWVtLT5zdGF0ZQorCQkJLmN1cnJlbnRfdHRsX3VzOworCisJCWFnZSA9IGVsYXBzZWRfdXMoCisJ CQkJCQkgJmVudHJpZXNbaWR4XS5sYXN0X3dyaXRlX3RpbWUsICZub3cpOworCQlpc19zdGFsZSA9 IChhZ2UgPCAoaW50NjQpIHR0bF91cyk7CisKKwkJLyoKKwkJICogRW5mb3JjZSBtYXhfc3RhbGVu ZXNzIGhhcmQgY2FwOiBubyBlbnRyeSBjYW4gZm9yY2UgcHJpbWFyeSByb3V0aW5nCisJCSAqIGxv bmdlciB0aGFuIG1heF9zdGFsZW5lc3MgZnJvbSBpdHMgZmlyc3Qgd3JpdGUuCisJCSAqLworCQlp ZiAoaXNfc3RhbGUpCisJCXsKKwkJCW1heF9zdGFsZV91cyA9IChpbnQ2NCkgcG9vbF9jb25maWcK KwkJCQktPnRyYWNrX3RhYmxlX211dGF0aW9uX21heF9zdGFsZW5lc3MKKwkJCQkqIDEwMDBMTDsK KwkJCWlmIChtYXhfc3RhbGVfdXMgPiAwKQorCQkJeworCQkJCXRvdGFsX2FnZSA9IGVsYXBzZWRf dXMoCisJCQkJCQkJCQkgICAmZW50cmllc1tpZHhdLmZpcnN0X3dyaXRlX3RpbWUsCisJCQkJCQkJ CQkgICAmbm93KTsKKwkJCQlpZiAodG90YWxfYWdlID49IG1heF9zdGFsZV91cykKKwkJCQkJaXNf c3RhbGUgPSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCWVyZXBvcnQoREVCVUcyLAorCQkJCShlcnJt c2coInRyYWNrX3RhYmxlX211dGF0aW9uOiAiCisJCQkJCQkib2lkICVkIGRib2lkICVkICIKKwkJ CQkJCSJlbGFwc2VkPSVsZCB0dGw9JWx1IHN0YWxlPSVkIiwKKwkJCQkJCXRhYmxlX29pZCwgZGJv aWQsCisJCQkJCQkobG9uZykgYWdlLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHR0bF91cywKKwkJ CQkJCWlzX3N0YWxlKSkpOworCX0KKworCXRhYmxlX21hcF91bmxvY2soKTsKKwordXBkYXRlX3N0 YXRzOgorCS8qIFVwZGF0ZSBzdGF0aXN0aWNzIHVzaW5nIHNlbWFwaG9yZSAqLworCWlmICh0cmFj a190YWJsZV9tdXRhdGlvbl9zaG1lbSAhPSBOVUxMKQorCXsKKwkJVHJhY2tUYWJsZU11dGF0aW9u U3RhdGUgKnN0OworCisJCXRhYmxlX21hcF9sb2NrKCk7CisJCXN0ID0gJnRyYWNrX3RhYmxlX211 dGF0aW9uX3NobWVtLT5zdGF0ZTsKKwkJc3QtPnN0YXRzX3F1ZXJpZXNfY2hlY2tlZCsrOworCQlp ZiAoaXNfc3RhbGUpCisJCQlzdC0+c3RhdHNfZm9yY2VkX3ByaW1hcnkrKzsKKwkJZWxzZQorCQkJ c3QtPnN0YXRzX2FsbG93ZWRfcmVwbGljYSsrOworCQl0YWJsZV9tYXBfdW5sb2NrKCk7CisJfQor CisJcmV0dXJuIGlzX3N0YWxlOworfQorCisvKgorICogTWFyayBtdWx0aXBsZSB0YWJsZXMgYXMg cmVjZW50bHkgd3JpdHRlbi4KKyAqIENhbGxlZCBhZnRlciBETUwgcXVlcmllcyBjb21wbGV0ZSB0 byByZWNvcmQKKyAqIHdoaWNoIHRhYmxlcyB3ZXJlIG1vZGlmaWVkLgorICovCit2b2lkCitwb29s X3RyYWNrX3RhYmxlX211dGF0aW9uX21hcmtfdGFibGVzX3dyaXR0ZW4oCisJCQkJCQkJCQkJCSAg Y29uc3QgaW50ICp0YWJsZV9vaWRzLCBpbnQgbnVtX3RhYmxlcywgaW50IGRib2lkKQoreworCVRy YWNrVGFibGVNdXRhdGlvbkhhc2hUYWJsZSAqbWFwOworCVRyYWNrVGFibGVNdXRhdGlvblN0YXRl ICpzdDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJaW50CQkJaTsKKworCWlmIChUUkFDS19UQUJM RV9NVVRBVElPTl9ESVNBQkxFRCgpKQorCQlyZXR1cm47CisKKwlpZiAobnVtX3RhYmxlcyA8PSAw IHx8IHRhYmxlX29pZHMgPT0gTlVMTCB8fAorCQlkYm9pZCA8PSAwKQorCQlyZXR1cm47CisKKwlt YXAgPSB0cmFja190YWJsZV9tdXRhdGlvbl9zaG1lbS0+dGFibGVfbWFwOworCXN0ID0gJnRyYWNr X3RhYmxlX211dGF0aW9uX3NobWVtLT5zdGF0ZTsKKwlnZXRfY3VycmVudF90aW1lKCZub3cpOwor CisJdGFibGVfbWFwX2xvY2soKTsKKworCS8qIFBlcmlvZGljYWxseSBjbGVhbiB1cCBleHBpcmVk IGVudHJpZXMgKi8KKwlpZiAobWFwLT5udW1fZW50cmllcyA+IG1hcC0+bWF4X2VudHJpZXMgKiAz IC8gNCkKKwl7CisJCWludDY0CQlzaW5jZV9jbGVhbnVwOworCisJCXNpbmNlX2NsZWFudXAgPSBl bGFwc2VkX3VzKAorCQkJCQkJCQkgICAmc3QtPmxhc3RfY2xlYW51cF90aW1lLCAmbm93KTsKKwkJ LyogMTAwbXMgaW50ZXJ2YWwgKi8KKwkJaWYgKHNpbmNlX2NsZWFudXAgPiAxMDAwMDApCisJCXsK KwkJCXRhYmxlX21hcF9jbGVhbnVwX2V4cGlyZWQoCisJCQkJCQkJCQkgIG1hcCwgc3QtPmN1cnJl bnRfdHRsX3VzKTsKKwkJCXN0LT5sYXN0X2NsZWFudXBfdGltZSA9IG5vdzsKKwkJfQorCX0KKwor CWZvciAoaSA9IDA7IGkgPCBudW1fdGFibGVzOyBpKyspCisJeworCQl1aW50MzIJCWhhc2g7CisJ CWludAkJCXRhYmxlX29pZCA9IHRhYmxlX29pZHNbaV07CisKKwkJaWYgKHRhYmxlX29pZCA+IDAp CisJCXsKKwkJCWhhc2ggPSBmbnYxYV9oYXNoX3RhYmxlX2tleSgKKwkJCQkJCQkJCQl0YWJsZV9v aWQsIGRib2lkKTsKKwkJCXRhYmxlX21hcF9pbnNlcnQobWFwLCB0YWJsZV9vaWQsCisJCQkJCQkJ IGRib2lkLCBoYXNoLCAmbm93KTsKKwkJfQorCX0KKworCXRhYmxlX21hcF91bmxvY2soKTsKK30K KworLyoKKyAqIE1hcmsgYSBzaW5nbGUgdGFibGUgYXMgcmVjZW50bHkgd3JpdHRlbi4KKyAqLwor dm9pZAorcG9vbF90cmFja190YWJsZV9tdXRhdGlvbl9tYXJrX3RhYmxlX3dyaXR0ZW4oCisJCQkJ CQkJCQkJCSBpbnQgdGFibGVfb2lkLCBpbnQgZGJvaWQpCit7CisJaWYgKHRhYmxlX29pZCA+IDAg JiYgZGJvaWQgPiAwKQorCXsKKwkJY29uc3QgaW50CXRhYmxlc1sxXSA9IHt0YWJsZV9vaWR9Owor CisJCXBvb2xfdHJhY2tfdGFibGVfbXV0YXRpb25fbWFya190YWJsZXNfd3JpdHRlbigKKwkJCQkJ CQkJCQkJCQkgIHRhYmxlcywgMSwgZGJvaWQpOworCX0KK30KKworLyoKKyAqIFVwZGF0ZSB0aGUg c3RhbGVuZXNzIFRUTCBiYXNlZCBvbiBvYnNlcnZlZAorICogcmVwbGljYXRpb24gZGVsYXkuICBO ZXcgVFRMID0gZGVsYXkgKiBmYWN0b3IsCisgKiBjbGFtcGVkIHRvIFtkZWZhdWx0X3R0bCwgMSBo b3VyXS4KKyAqLwordm9pZAorcG9vbF90cmFja190YWJsZV9tdXRhdGlvbl91cGRhdGVfdHRsKHVp bnQ2NCBkZWxheV91cykKK3sKKwl1aW50NjQJCW5ld190dGw7CisJZG91YmxlCQlmYWN0b3I7CisJ VHJhY2tUYWJsZU11dGF0aW9uU3RhdGUgKnN0OworCisJaWYgKFRSQUNLX1RBQkxFX01VVEFUSU9O X0RJU0FCTEVEKCkpCisJCXJldHVybjsKKworCWZhY3RvciA9IHBvb2xfY29uZmlnLT50cmFja190 YWJsZV9tdXRhdGlvbl90dGxfZmFjdG9yOworCW5ld190dGwgPSAodWludDY0KSAoZGVsYXlfdXMg KiBmYWN0b3IpOworCWlmIChuZXdfdHRsIDwgVFJBQ0tfVEFCTEVfTVVUQVRJT05fREVGQVVMVF9U VExfVVMpCisJCW5ld190dGwgPSBUUkFDS19UQUJMRV9NVVRBVElPTl9ERUZBVUxUX1RUTF9VUzsK KworCS8qIE1heGltdW0gVFRMIG9mIDEgaG91ciAqLworCWlmIChuZXdfdHRsID4gMzYwMFVMTCAq IDEwMDAwMDBVTEwpCisJCW5ld190dGwgPSAzNjAwVUxMICogMTAwMDAwMFVMTDsKKworCXN0ID0g JnRyYWNrX3RhYmxlX211dGF0aW9uX3NobWVtLT5zdGF0ZTsKKwlzdC0+Y3VycmVudF90dGxfdXMg PSBuZXdfdHRsOworCWdldF9jdXJyZW50X3RpbWUoJnN0LT50dGxfbGFzdF91cGRhdGVkKTsKKwor CWVyZXBvcnQoREVCVUcxLAorCQkJKGVycm1zZygidHJhY2tfdGFibGVfbXV0YXRpb246ICIKKwkJ CQkJIlRUTD0lbHUgdXMgKGRlbGF5PSVsdSBmYWN0b3I9JS4xZikiLAorCQkJCQkodW5zaWduZWQg bG9uZykgbmV3X3R0bCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpIGRlbGF5X3VzLAorCQkJCQlmYWN0 b3IpKSk7Cit9Ci0tIAoyLjU0LjAKCg== --000000000000e18a100650214b62--