From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa1.mentor.iphmx.com (esa1.mentor.iphmx.com [68.232.129.153]) by sourceware.org (Postfix) with ESMTPS id 10B5E385800D for ; Tue, 2 Aug 2022 07:52:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 10B5E385800D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.93,210,1654588800"; d="diff'?scan'208";a="83339143" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa1.mentor.iphmx.com with ESMTP; 01 Aug 2022 23:52:09 -0800 IronPort-SDR: 4D8g93gZ6fva2LmQ9V26Vv3VwuGYjiTmYt3R9XiO9MOV1I6jBCEUH4AbMpO7pa6Xzjzy0SiXHS 11HFfLs0UUWJAwVM2e8MJ1L7CQ45Hla8tUfggYaUJvDfeO3KnP4vkQ/DzHQu60PzSFOE6xSyGK rashzZ0oTDetU6QpXTxbuUjxFt58Q/hXEJ9ggxiFo1f+MkkQZUVSKns0/3QBdk8YU/YexJd0EC uBeTzGRe6gpQqqrEt8bhEl6wCWnPQbt0JEeHCqU7ojdr2FWeo49PBNNjv82Zfeh0N1nBqF8jMr DMU= Content-Type: multipart/mixed; boundary="------------EciqZ0UiZuw4jFh0ovUDV44i" Message-ID: Date: Tue, 2 Aug 2022 09:52:02 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Subject: Re: [PATCH] OpenMP, libgomp: Environment variable syntax extension. From: Marcel Vollweiler To: Jakub Jelinek References: <392c847d-e798-2be3-a808-6888de6c90cd@codesourcery.com> <73621930-22ce-c3f1-61e0-f15683f8b281@codesourcery.com> <055f7cfb-2849-ba5a-a161-13333e19e538@codesourcery.com> CC: In-Reply-To: <055f7cfb-2849-ba5a-a161-13333e19e538@codesourcery.com> X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, KAM_SHORT, NICE_REPLY_A, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Aug 2022 07:52:21 -0000 --------------EciqZ0UiZuw4jFh0ovUDV44i Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: quoted-printable Hi Jakub, I updated (and simplified) my last submitted patch (https://gcc.gnu.org/pipermail/gcc-patches/2022-July/598770.html) consideri= ng the following aspects: 1. For copying ICVs to devices a struct ("gomp_offload_icvs") is used now instead of copying all ICVs individually. This is a somehow reduced struct = as we don't want to copy ICVs which are not used on the device. 2. A linked list of those gomp_offload_icvs structs was introduced (gomp_offload_icv_list) that holds only device-specific ICV values. In a following patch (for https://gcc.gnu.org/pipermail/gcc-patches/2022-April/593260.html, will be submitted soon) this list is also used to keep ICV values that were changed= on a particular device and copied back to the host. 3. The value of a device-specific ICV according to the hierarchy (DEV_X, DE= V, ALL) can be determined earliest when we copy to the device, since we do not= know the actual existing device numbers (only those that were explicitly specifi= ed). The device-specific ICV struct is added to gomp_offload_icv_list when it is copied the first time. Once it is contained it is taken from the list for e= ach copy process (to the device and back). The updated patch is attached and tested again on x86_64-linux with nvptx a= nd amdgcn offloading without regression. Marcel Am 25.07.2022 um 15:38 schrieb Marcel Vollweiler: > Hi Jakub, > >>>> I'm not sure we can rely on execv on all targets that do support libgo= mp. >>>> Any reason why you actually need this, rather than using >>>> dg-set-target-env-var directive(s) and perhaps return 0; if getenv doe= sn't >>>> return the expected values? >>> >>> Interesting topic. After some (internal) discussions I think the best w= ay is to >>> set the environment variables explicitely instead using dg-set-target-e= nv-var. >>> The reason is that dg-set-target-env-var does not work for remote testi= ng (which >>> seems to be a common test environment). For remote testing dejagnu imme= diately >>> aborts the test case with UNSUPPORTED which is specified in the corresp= onding >>> extension and makes sence from my point of view as the test assumption = cannot be >>> fulfilled (since the environment variables are not set on remote target= s). >>> It also means that whenever dg-set-target-env-var is set in the test fi= le, the >>> execution of the test case is not tested on remote targets. >> >> The only reason why dg-set-target-env-var is supported on native only ri= ght >> now is that I'm never doing remote testing myself and so couldn't test t= hat. >> There is no inherent reason why the env vars couldn't be propagated over= to >> the remote and set in the environment there. >> So trying to work around that rather than at least trying to change >> dg-set-target-env-var so that it works with the remote testing you do lo= oks >> wrong. >> If dg-set-target-env-var can be made to work remotely, it will magically >> improve those 130+ tests that use it already together with the newly add= ed >> tests. >> >> So, I'd suggest to just use dg-set-target-env-var and incrementally work= on >> making it work for remote testing if that is important to whomever does >> that kind of testing. Could be e.g. a matter of invoking remotely >> env VAR1=3Dval1 VAR2=3Dval2 program args >> instead of program args. If env is missing on the remote side, it could >> be UNSUPPORTED then. > > I agree. So I changed the tests using dg-set-target-env-var and removed t= he > execv parts. > >> >>> +/* The initial ICV values for the host, which are configured with envi= ronment >>> + variables without a suffix, e.g. OMP_NUM_TEAMS. */ >>> +struct gomp_initial_icvs gomp_initial_icvs_none; >>> + >>> +/* Initial ICV values that were configured for the host and for all de= vices by >>> + using environment variables like OMP_NUM_TEAMS_ALL. */ >>> +struct gomp_initial_icvs gomp_initial_icvs_all; >>> + >>> +/* Initial ICV values that were configured only for devices (not for t= he host) >>> + by using environment variables like OMP_NUM_TEAMS_DEV. */ >>> +struct gomp_initial_icvs gomp_initial_icvs_dev; >> >> As I said last time, I don't like allocating these >> all the time in the data section of libgomp when at least for a few upco= ming >> years, most users will never use those suffixes. >> Can't *_DEV and *_ALL go into the gomp_initial_icv_dev_list >> chain too, perhaps > > gomp_initial_icvs_{none, all, dev} are now defined as pointers (as you pr= oposed > previously). gomp_initial_icvs_{all, dev} are only instantiated if at lea= st one > according environment variable is parsed. gomp_initial_icvs_none is alway= s > initialized with the initial global ICV values. > > All three structures are now also included in gomp_initial_icv_list (prev= iously > named gomp_initial_icv_dev_list) with "magic device numbers" -1, -2, and = -3. > The list items for _DEV, _ALL and no suffix are stored at the beginning o= f the > list whereas the device-specific list items are attached at the end. > >> >>> +static const struct envvar >>> +{ >>> + const char *name; >>> + int name_len; >>> + unsigned char flag_vars[3]; >>> + unsigned char flag; >>> + void *params[3]; >>> + bool (*parse_func) (const char *, const char *, void * const[]); >>> +} envvars[] =3D { >>> + {ENTRY ("OMP_SCHEDULE_DEV"), {OMP_SCHEDULE_DEV_, >>> OMP_SCHEDULE_CHUNK_SIZE_DEV_}, GOMP_ENV_VAR_SUFFIX_DEV, >>> {&gomp_initial_icvs_dev.run_sched_var, >>> &gomp_initial_icvs_dev.run_sched_chunk_size}, &parse_schedule}, >>> + {ENTRY ("OMP_SCHEDULE_ALL"), {OMP_SCHEDULE_DEV_, >>> OMP_SCHEDULE_CHUNK_SIZE_DEV_}, GOMP_ENV_VAR_SUFFIX_ALL, >>> {&gomp_initial_icvs_all.run_sched_var, >>> &gomp_initial_icvs_all.run_sched_chunk_size}, &parse_schedule}, >>> + {ENTRY ("OMP_SCHEDULE"), {OMP_SCHEDULE_DEV_, >>> OMP_SCHEDULE_CHUNK_SIZE_DEV_}, GOMP_ENV_VAR_SUFFIX_NONE, >>> {&gomp_initial_icvs_none.run_sched_var, >>> &gomp_initial_icvs_none.run_sched_chunk_size}, &parse_schedule}, >>> + >>> + {ENTRY ("OMP_NUM_TEAMS_DEV"), {OMP_NUM_TEAMS_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_DEV , {&gomp_initial_icvs_dev.nteams_var, false}, >>> &parse_int}, >>> + {ENTRY ("OMP_NUM_TEAMS_ALL"), {OMP_NUM_TEAMS_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.nteams_var, false}, >>> &parse_int}, >>> + {ENTRY ("OMP_NUM_TEAMS"), {OMP_NUM_TEAMS_DEV_}, GOMP_ENV_VAR_SUFFIX_= NONE, >>> {&gomp_initial_icvs_none.nteams_var, false}, &parse_int}, >>> + >>> + {ENTRY ("OMP_DYNAMIC_DEV"), {OMP_DYNAMIC_DEV_}, GOMP_ENV_VAR_SUFFIX_= DEV, >>> {&gomp_initial_icvs_dev.dyn_var}, &parse_boolean}, >>> + {ENTRY ("OMP_DYNAMIC_ALL"), {OMP_DYNAMIC_DEV_}, GOMP_ENV_VAR_SUFFIX_= ALL, >>> {&gomp_initial_icvs_all.dyn_var}, &parse_boolean}, >>> + {ENTRY ("OMP_DYNAMIC"), {OMP_DYNAMIC_DEV_}, GOMP_ENV_VAR_SUFFIX_NONE= , >>> {&gomp_initial_icvs_none.dyn_var}, &parse_boolean}, >>> + >>> + {ENTRY ("OMP_TEAMS_THREAD_LIMIT_DEV"), {OMP_TEAMS_THREAD_LIMIT_DEV_}= , >>> GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initial_icvs_dev.teams_thread_limit_var= , >>> false}, &parse_int}, >>> + {ENTRY ("OMP_TEAMS_THREAD_LIMIT_ALL"), {OMP_TEAMS_THREAD_LIMIT_DEV_}= , >>> GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.teams_thread_limit_var= , >>> false}, &parse_int}, >>> + {ENTRY ("OMP_TEAMS_THREAD_LIMIT"), {OMP_TEAMS_THREAD_LIMIT_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_initial_icvs_none.teams_thread_limit_v= ar, >>> false}, &parse_int}, >>> + >>> + {ENTRY ("OMP_THREAD_LIMIT_DEV"), {OMP_THREAD_LIMIT_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initial_icvs_dev.thread_limit_var, fals= e, >>> (void *) UINT_MAX}, &parse_unsigned_long}, >>> + {ENTRY ("OMP_THREAD_LIMIT_ALL"), {OMP_THREAD_LIMIT_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.thread_limit_var, fals= e, >>> (void *) UINT_MAX}, &parse_unsigned_long}, >>> + {ENTRY ("OMP_THREAD_LIMIT"), {OMP_THREAD_LIMIT_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_initial_icvs_none.thread_limit_var, fa= lse, >>> (void *) UINT_MAX}, &parse_unsigned_long}, >>> + >>> + {ENTRY ("OMP_NUM_THREADS_DEV"), {OMP_NUM_THREADS_DEV_, >>> OMP_NTHREADS_LIST_DEV, OMP_NTHREADS_LIST_LEN_DEV}, GOMP_ENV_VAR_SUFFIX_= DEV, >>> {&gomp_initial_icvs_dev.nthreads_var, >>> &gomp_initial_icvs_dev.nthreads_var_list, >>> &gomp_initial_icvs_dev.nthreads_var_list_len}, &parse_unsigned_long_lis= t}, >>> + {ENTRY ("OMP_NUM_THREADS_ALL"), {OMP_NUM_THREADS_DEV_, >>> OMP_NTHREADS_LIST_DEV, OMP_NTHREADS_LIST_LEN_DEV}, GOMP_ENV_VAR_SUFFIX_= ALL, >>> {&gomp_initial_icvs_all.nthreads_var, >>> &gomp_initial_icvs_all.nthreads_var_list, >>> &gomp_initial_icvs_all.nthreads_var_list_len}, &parse_unsigned_long_lis= t}, >>> + {ENTRY ("OMP_NUM_THREADS"), {OMP_NUM_THREADS_DEV_, OMP_NTHREADS_LIST= _DEV, >>> OMP_NTHREADS_LIST_LEN_DEV}, GOMP_ENV_VAR_SUFFIX_NONE, >>> {&gomp_initial_icvs_none.nthreads_var, >>> &gomp_initial_icvs_none.nthreads_var_list, >>> &gomp_initial_icvs_none.nthreads_var_list_len}, &parse_unsigned_long_li= st}, >>> + >>> + {ENTRY ("OMP_PROC_BIND_DEV"), {OMP_PROC_BIND_DEV_, >>> OMP_PROC_BIND_LIST_DEV_, OMP_PROC_BIND_LIST_LEN_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initial_icvs_dev.bind_var, >>> &gomp_initial_icvs_dev.bind_var_list, >>> &gomp_initial_icvs_dev.bind_var_list_len}, &parse_bind_var}, >>> + {ENTRY ("OMP_PROC_BIND_ALL"), {OMP_PROC_BIND_DEV_, >>> OMP_PROC_BIND_LIST_DEV_, OMP_PROC_BIND_LIST_LEN_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.bind_var, >>> &gomp_initial_icvs_all.bind_var_list, >>> &gomp_initial_icvs_all.bind_var_list_len}, &parse_bind_var}, >>> + {ENTRY ("OMP_PROC_BIND"), {OMP_PROC_BIND_DEV_, OMP_PROC_BIND_LIST_DE= V_, >>> OMP_PROC_BIND_LIST_LEN_DEV_}, GOMP_ENV_VAR_SUFFIX_NONE, >>> {&gomp_initial_icvs_none.bind_var, &gomp_initial_icvs_none.bind_var_lis= t, >>> &gomp_initial_icvs_none.bind_var_list_len}, &parse_bind_var}, >>> + >>> + {ENTRY ("OMP_MAX_ACTIVE_LEVELS_DEV"), {OMP_MAX_ACTIVE_LEVELS_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initial_icvs_dev.max_active_levels_var,= (void >>> *) true, (void *) gomp_supported_active_levels}, &parse_unsigned_long}, >>> + {ENTRY ("OMP_MAX_ACTIVE_LEVELS_ALL"), {OMP_MAX_ACTIVE_LEVELS_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.max_active_levels_var,= (void >>> *) true, (void *) gomp_supported_active_levels}, &parse_unsigned_long}, >>> + {ENTRY ("OMP_MAX_ACTIVE_LEVELS"), {OMP_MAX_ACTIVE_LEVELS_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_initial_icvs_none.max_active_levels_va= r, >>> (void *) true, (void *) gomp_supported_active_levels}, &parse_unsigned_= long}, >>> + >>> + {ENTRY ("OMP_WAIT_POLICY_DEV"), {OMP_WAIT_POLICY_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initial_icvs_dev.wait_policy}, >>> &parse_wait_policy}, >>> + {ENTRY ("OMP_WAIT_POLICY_ALL"), {OMP_WAIT_POLICY_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.wait_policy}, >>> &parse_wait_policy}, >>> + {ENTRY ("OMP_WAIT_POLICY"), {OMP_WAIT_POLICY_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_initial_icvs_none.wait_policy}, >>> &parse_wait_policy}, >>> + >>> + {ENTRY ("OMP_STACKSIZE_DEV"), {OMP_STACKSIZE_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initial_icvs_dev.stacksize}, &parse_sta= cksize}, >>> + {ENTRY ("OMP_STACKSIZE_ALL"), {OMP_STACKSIZE_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.stacksize}, &parse_sta= cksize}, >>> + {ENTRY ("OMP_STACKSIZE"), {OMP_STACKSIZE_DEV_}, GOMP_ENV_VAR_SUFFIX_= NONE, >>> {&gomp_initial_icvs_none.stacksize}, &parse_stacksize}, >>> + >>> + {ENTRY ("OMP_CANCELLATION"), {}, GOMP_ENV_VAR_SUFFIX_NONE, >>> {&gomp_cancel_var}, &parse_boolean}, >>> + {ENTRY ("OMP_DISPLAY_AFFINITY"), {}, GOMP_ENV_VAR_SUFFIX_NONE, >>> {&gomp_display_affinity_var}, &parse_boolean}, >>> + {ENTRY ("OMP_TARGET_OFFLOAD"), {}, GOMP_ENV_VAR_SUFFIX_NONE, >>> {&gomp_target_offload_var}, &parse_target_offload}, >>> + {ENTRY ("OMP_MAX_TASK_PRIORITY"), {}, GOMP_ENV_VAR_SUFFIX_NONE, >>> {&gomp_max_task_priority_var, (void *) true}, &parse_int}, >>> + {ENTRY ("OMP_ALLOCATOR"), {}, GOMP_ENV_VAR_SUFFIX_NONE, >>> {&gomp_def_allocator}, &parse_allocator}, >>> + {ENTRY ("OMP_DEFAULT_DEVICE"), {OMP_DEFAULT_DEVICE_DEV_}, >>> GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_initial_icvs_none.default_device_var, = (void >>> *) true}, &parse_int}, >>> +}; >> >> This is very large, why do you need 3 entries per most of the env vars? >> Just one would be enough, with just some flag whether it accepts any >> suffixes or not. > > The tables have been optimized now. Only one entry per ICV and removed so= me parts. > >> Lines are too long, they'd need wrapping. >> I think the coding conventions are space after { and space before }. > > Both changed. > >> >>> +static bool >>> +get_device_num (char *env, int *dev_num, int *dev_num_len) >>> +{ >>> + int pos =3D 0; >>> + char dev_num_str[INT_MAX_STR_LEN+1]; >>> + >>> + *dev_num_len =3D 0; >>> + *dev_num =3D -1; >>> + if (env =3D=3D NULL) >>> + return false; >>> + >>> + while (pos < INT_MAX_STR_LEN) >>> + { >>> + if (env[pos] =3D=3D '\0' || env[pos] =3D=3D '=3D') >>> + break; >>> + dev_num_str[pos] =3D env[pos]; >>> + pos++; >>> + } >>> + >>> + if (env[pos] !=3D '=3D' || (dev_num_str[0] =3D=3D '0' && pos > 1)) >>> + return false; >>> + >>> + dev_num_str[pos] =3D '\0'; >>> + *dev_num =3D (int) strtoul (dev_num_str, 0, 10); >>> + *dev_num_len =3D pos; >> >> Why do you copy the chars to a separate stack buffer? >> strtoul will stop on anything that isn't a number. >> So, just passing it second argument and verifying that >> it points to '=3D' ('\0' wouldn't be valid) would be good enough >> (or perhaps also verying it doesn't point to the start pointer >> in case caller hasn't checked yet if it starts with a digit). > > Thanks for this hint. That makes it much simpler. Changed. > >> Also, the (int) cast means it throws away important information, >> we'd treat say >> 8589934593 >> on 64-bit arches as 1, I think we want to just ignore it. >> Also, we should ignore negative values (though, for 5.2 there >> is a question if OMP_NUM_THREADS_DEV_-1=3D5 is valid or not and >> redundant with OMP_NUM_THREADS_DEV_4=3D5 (if omp_get_num_devices() =3D= =3D 5) >> or OMP_NUM_THREADS and which one wins. > > Negative device numbers are rejected now. Btw. it seems that defining > environment variables like "OMP_NUM_THREADS_DEV_-1" is not always valid d= ue to > "-" (invalid identifier name). > >> >>> + return true; >>> +} >>> + >>> +/* Helper function for initialize_env to add a device specific ICV val= ue >>> + to gomp_initial_icv_dev_list. */ >>> + >>> +static void >>> +add_device_specific_icv (int dev_num, int icv_code, void *value) >>> +{ >>> + struct gomp_icv_list *list =3D gomp_initial_icv_dev_list; >>> + while (list !=3D NULL && list->device_num !=3D dev_num) >>> + list =3D list->next; >>> + >>> + if (list =3D=3D NULL) >>> + { >>> + list =3D >>> + (struct gomp_icv_list *) gomp_malloc (sizeof (struct gomp_icv_list= )); >> >> Formatting, =3D can't be at the end of line. >> >>> +static unsigned char >>> +get_icv_flag (unsigned char flag_var) >>> +{ >>> + switch (flag_var) >>> + { >>> + case OMP_NUM_TEAMS_DEV_: >>> + return gomp_initial_icv_flags.nteams_var; >>> + case OMP_SCHEDULE_DEV_: >>> + return gomp_initial_icv_flags.run_sched_var; >>> + case OMP_SCHEDULE_CHUNK_SIZE_DEV_: >>> + return gomp_initial_icv_flags.run_sched_chunk_size; >>> + case OMP_DYNAMIC_DEV_: >>> + return gomp_initial_icv_flags.dyn_var; >>> + case OMP_TEAMS_THREAD_LIMIT_DEV_: >>> + return gomp_initial_icv_flags.teams_thread_limit_var; >>> + case OMP_THREAD_LIMIT_DEV_: >>> + return gomp_initial_icv_flags.thread_limit_var; >>> + case OMP_NUM_THREADS_DEV_: >>> + return gomp_initial_icv_flags.nthreads_var; >>> + case OMP_NTHREADS_LIST_DEV: >>> + return gomp_initial_icv_flags.nthreads_var_list; >>> + case OMP_NTHREADS_LIST_LEN_DEV: >>> + return gomp_initial_icv_flags.nthreads_var_list_len; >>> + case OMP_PROC_BIND_DEV_: >>> + return gomp_initial_icv_flags.bind_var; >>> + case OMP_PROC_BIND_LIST_DEV_: >>> + return gomp_initial_icv_flags.bind_var_list; >>> + case OMP_PROC_BIND_LIST_LEN_DEV_: >>> + return gomp_initial_icv_flags.bind_var_list_len; >>> + case OMP_MAX_ACTIVE_LEVELS_DEV_: >>> + return gomp_initial_icv_flags.max_active_levels_var; >>> + case OMP_WAIT_POLICY_DEV_: >>> + return gomp_initial_icv_flags.wait_policy; >>> + case OMP_STACKSIZE_DEV_: >>> + return gomp_initial_icv_flags.stacksize; >>> + case OMP_DEFAULT_DEVICE_DEV_: >>> + return gomp_initial_icv_flags.default_device_var; >>> + default: >>> + return OMP_NONE; >> >> Doesn't this function return a bitmask of GOMP_ENV_VAR_SUFFIX_WHATEVER >> values? OMP_NONE isn't one of them, shouldn't it return 0 instead? >> But more importantly, wouldn't it be easier if the icv_flags was just >> an array indexed by flag_var? You don't need a large switch to handle >> setting or getting it then. As you just want 4 bits per flag instead of= 8, >> you could index it by flag_var >> 1 and for flag_var & 1 shift right or = left >> by 4. > > The ICV flags are now defined as uint32_t. This is enough to store flags = for our > current 21 ICVs. The flags for _DEV, _DEV_X, _ALL and no suffix are now > separated as we have the flags variable for each item of the initial icv = list. > >> >>> static void __attribute__((constructor)) >>> initialize_env (void) >>> { >>> - unsigned long thread_limit_var; >>> - unsigned long max_active_levels_var; >>> + extern char **environ; >>> + char **env; >>> + int omp_var, dev_num =3D 0, dev_num_len =3D 0, int_value, k; >>> + bool bool_value, ignore =3D false; >>> + char *env_val; >>> >>> /* Do a compile time check that mkomp_h.pl did good job. */ >>> omp_check_defines (); >>> >>> - parse_schedule (); >>> - parse_boolean ("OMP_DYNAMIC", &gomp_global_icv.dyn_var); >>> - parse_boolean ("OMP_CANCELLATION", &gomp_cancel_var); >>> - parse_boolean ("OMP_DISPLAY_AFFINITY", &gomp_display_affinity_var); >>> - parse_int ("OMP_DEFAULT_DEVICE", &gomp_global_icv.default_device_var= , true); >>> - parse_target_offload ("OMP_TARGET_OFFLOAD", &gomp_target_offload_var= ); >>> - parse_int ("OMP_MAX_TASK_PRIORITY", &gomp_max_task_priority_var, tru= e); >>> - gomp_def_allocator =3D parse_allocator (); >>> - if (parse_unsigned_long ("OMP_THREAD_LIMIT", &thread_limit_var, fals= e)) >>> - { >>> - gomp_global_icv.thread_limit_var >>> - =3D thread_limit_var > INT_MAX ? UINT_MAX : thread_limit_var; >>> - } >>> - parse_int_secure ("GOMP_DEBUG", &gomp_debug_var, true); >>> #ifndef HAVE_SYNC_BUILTINS >>> gomp_mutex_init (&gomp_managed_threads_lock); >>> #endif >>> gomp_init_num_threads (); >>> gomp_available_cpus =3D gomp_global_icv.nthreads_var; >>> - if (!parse_unsigned_long_list ("OMP_NUM_THREADS", >>> - &gomp_global_icv.nthreads_var, >>> - &gomp_nthreads_var_list, >>> - &gomp_nthreads_var_list_len)) >>> - gomp_global_icv.nthreads_var =3D gomp_available_cpus; >>> - parse_int ("OMP_NUM_TEAMS", &gomp_nteams_var, false); >>> - parse_int ("OMP_TEAMS_THREAD_LIMIT", &gomp_teams_thread_limit_var, f= alse); >>> - bool ignore =3D false; >>> - if (parse_bind_var ("OMP_PROC_BIND", >>> - &gomp_global_icv.bind_var, >>> - &gomp_bind_var_list, >>> - &gomp_bind_var_list_len) >>> + >>> + for (env =3D environ; *env !=3D 0; env++) >>> + { >>> + if (!startswith (*env, "OMP_")) >>> + continue; >> >> While the above is certainly good and quickly skips non-OpenMP env vars, >> I think >> >>> + >>> + for (omp_var =3D 0; omp_var < OMP_DEV_VAR_CNT; omp_var++) >>> + { >>> + if (startswith (*env, envvars_dev[omp_var].name)) >> >> walking 36 entries for each OMP_ env var and doing strncmp for each is >> expensive. >> >> Wouldn't it be better to just walk the name once, find out the suffix in >> there and the length of the part before it too, >> just a simple loop, stopping at '=3D' and when seeing '_', check if foll= owed >> by "ALL=3D", "DEV=3D" or "DEV_" followed by digit. That will determine = the >> kind and length of the env var name without the suffixes, so then >> you can just walk the much shortened table with just 16 entries now >> and can skip entries which don't have the computed length (the table >> includes name_len, so start by >> if (envvars[omp_var].name_len !=3D name_len) >> continue; >> if (memcmp (*env + strlen ("OMP_"), envvars[omp_var].name, >> envvars[omp_var].name_len) !=3D 0) >> continue; > > That's a good point. Together with the "envvars" table the parsing has be= en > optimized. Similarly to you proposal I just use a flag in the table and p= arse > the environment variable variants successively. First the basic variable = name > (e.g. OMP_NUM_TEAMS) and then checking whether "=3D", "_DEV=3D", "_ALL=3D= ", or "_DEV_" > is following if allowed according to the table's flag. (Only) for a direc= tly > following "=3D" a check is not necessary because host variants are always= allowed > (thus GOMP_ENV_VAR_SUFFIX_NONE is also omitted in the table). > >> >>> --- a/libgomp/libgomp.h >>> +++ b/libgomp/libgomp.h >>> @@ -454,6 +454,24 @@ struct gomp_team_state >>> >>> struct target_mem_desc; >>> >>> +#define OMP_NONE 0 >>> +#define OMP_NUM_TEAMS_DEV_ 1 >>> +#define OMP_SCHEDULE_DEV_ 2 >>> +#define OMP_SCHEDULE_CHUNK_SIZE_DEV_ 3 >>> +#define OMP_DYNAMIC_DEV_ 4 >>> +#define OMP_TEAMS_THREAD_LIMIT_DEV_ 5 >>> +#define OMP_THREAD_LIMIT_DEV_ 6 >>> +#define OMP_NUM_THREADS_DEV_ 7 >>> +#define OMP_NTHREADS_LIST_DEV 8 >>> +#define OMP_NTHREADS_LIST_LEN_DEV 9 >>> +#define OMP_PROC_BIND_DEV_ 10 >>> +#define OMP_PROC_BIND_LIST_DEV_ 11 >>> +#define OMP_PROC_BIND_LIST_LEN_DEV_ 12 >>> +#define OMP_MAX_ACTIVE_LEVELS_DEV_ 13 >>> +#define OMP_WAIT_POLICY_DEV_ 14 >>> +#define OMP_STACKSIZE_DEV_ 15 >>> +#define OMP_DEFAULT_DEVICE_DEV_ 16 >> >> These aren't constans defined in OpenMP standard, so I think it would >> be better to use different prefixes, say GOMP_ICV_WHATEVER or >> GOMP_ENV_WHATEVER. OMP_NONE is very much non-descriptive of what >> it means. Why do some defines have _DEV_ suffixes and others _DEV? > They are renamed accordingly. > >> It should also be an enum rather than set of defines and I don't see a >> reason for the _DEV* suffixes. > > Agreed and changed accordingly. > >> >>> + >>> /* These are the OpenMP 4.0 Internal Control Variables described in >>> section 2.3.1. Those described as having one copy per task are >>> stored within the structure; those described as having one copy >>> @@ -473,6 +491,69 @@ struct gomp_task_icv >>> struct target_mem_desc *target_data; >>> }; >>> >>> +#define GOMP_ENV_VAR_SUFFIX_UNKNOWN 0 >>> +#define GOMP_ENV_VAR_SUFFIX_NONE 1 >>> +#define GOMP_ENV_VAR_SUFFIX_DEV 2 >>> +#define GOMP_ENV_VAR_SUFFIX_ALL 4 >>> +#define GOMP_ENV_VAR_SUFFIX_DEV_X 8 >> >> Similarly, make this an enum, and perhaps just GOMP_ENV_SUFFIX_WHATEVER = ? > > Also changed. > > An updated patch is attached and tested again on x86_64-linux with nvptx = and > amdgcn offloading without regression. > > Marcel > ----------------- > Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 2= 01, 80634 > M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3=A4ftsf= =C3=BChrer: Thomas Heurung, > Frank Th=C3=BCrauf; Sitz der Gesellschaft: M=C3=BCnchen; Registergericht = M=C3=BCnchen, HRB 106955 ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955 --------------EciqZ0UiZuw4jFh0ovUDV44i Content-Type: text/plain; charset="UTF-8"; name="extend-env-variables-syntax.diff" Content-Disposition: attachment; filename="extend-env-variables-syntax.diff" Content-Transfer-Encoding: base64 T3Blbk1QLCBsaWJnb21wOiBFbnZpcm9ubWVudCB2YXJpYWJsZSBzeW50YXggZXh0ZW5zaW9u LgoKVGhpcyBwYXRjaCBjb25zaWRlcnMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHN5bnRh eCBleHRlbnNpb24gZm9yCmRldmljZS1zcGVjaWZpYyB2YXJpYW50cyBvZiBlbnZpcm9ubWVu dCB2YXJpYWJsZXMgZnJvbSBPcGVuTVAgNS4xIChzZWUKT3Blbk1QIDUuMSBzcGVjaWZpY2F0 aW9uLCBwLiA3NSBhbmQgcC4gNjM5KS4gQW4gZW52aXJvbm1lbnQgdmFyaWFibGUgKGUuZy4K T01QX05VTV9URUFNUykgY2FuIGhhdmUgZGlmZmVyZW50IHN1ZmZpeGVzOgoKX0RFViAoZS5n LiBPTVBfTlVNX1RFQU1TX0RFVik6IGFmZmVjdHMgYWxsIGRldmljZXMgYnV0IG5vdCB0aGUg aG9zdC4KX0RFVl88ZGV2aWNlPiAoZS5nLiBPTVBfTlVNX1RFQU1TX0RFVl80Mik6IGFmZmVj dHMgb25seSBkZXZpY2Ugd2l0aApudW1iZXIgPGRldmljZT4uCm5vIHN1ZmZpeCAoZS5nLiBP TVBfTlVNX1RFQU1TKTogYWZmZWN0cyBvbmx5IHRoZSBob3N0LgoKSW4gZnV0dXJlIE9wZW5N UCB2ZXJzaW9ucyBhbHNvIHN1ZmZpeCBfQUxMIHdpbGwgYmUgaW50cm9kdWNlZCAoc2VlIGRp c2N1c3Npb24KaHR0cHM6Ly9naXRodWIuY29tL09wZW5NUC9zcGVjL2lzc3Vlcy8zMTc5KS4g VGhpcyBpcyBhbHNvIGNvbnNpZGVyZWQgaW4gdGhpcwpwYXRjaDoKCl9BTEwgKGUuZy4gT01Q X05VTV9URUFNU19BTEwpOiBhZmZlY3RzIGFsbCBkZXZpY2VzIGFuZCB0aGUgaG9zdC4KCQpU aGUgcHJlY2VkZW5jZSBpcyBhcyBmb2xsb3dzIChkZXNjZW5kaW5nKS4gRm9yIHRoZSBob3N0 OgoKCTEuIG5vIHN1ZmZpeAoJMi4gX0FMTAoJCkZvciBkZXZpY2VzOgoKCTEuIF9ERVZfPGRl dmljZT4KCTIuIF9ERVYKCTMuIF9BTEwKCQpUaGF0IG1lYW5zLCBfREVWXzxkZXZpY2U+IGlz IHVzZWQgd2hlbmV2ZXIgYXZhaWxhYmxlLiBPdGhlcndpc2UgX0RFViBpcyB1c2VkIGlmCmF2 YWlsYWJsZSwgYW5kIGF0IGxhc3QgX0FMTC4gSWYgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIGFu eSBvZiB0aGUgdmFyaWFibGUKdmFyaWFudHMsIGRlZmF1bHQgdmFsdWVzIGFyZSB1c2VkIGFz IGFscmVhZHkgaW1wbGVtZW50ZWQgYmVmb3JlLgoKVGhpcyBwYXRjaCBjb25jZXJucyBwYXJz aW5nIChhKSwgc3RvcmluZyAoYiksIG91dHB1dCAoYykgYW5kIHRyYW5zbWlzc2lvbiB0byB0 aGUKZGV2aWNlIChkKToKCihhKSBUaGUgYWN0dWFsIG51bWJlciBvZiBkZXZpY2VzIGFuZCB0 aGUgbnVtYmVyaW5nIGFyZSBub3Qga25vd24gd2hlbiBwYXJzaW5nCnRoZSBlbnZpcm9ubWVu dCB2YXJpYWJsZXMuIFRodXMgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgaXRlcmF0 ZWQgYW5kCnNlYXJjaGVkIGZvciBkZXZpY2Utc3BlY2lmaWMgb25lcy4KKGIpIE9ubHkgY29u ZmlndXJlZCBkZXZpY2Utc3BlY2lmaWMgdmFyaWFibGVzIGFyZSBzdG9yZWQuIFRodXMsIGxp bmtlZCBsaXN0cwphcmUgdXNlZC4KKGMpIFRoZSBvdXRwdXQgaXMgZG9uZSBpbiBvbXBfZGlz cGxheV9lbnYgKHNlZSBzcGVjaWZpY2F0aW9uIHAuIDQ2OGYpLiBHbG9iYWwKSUNWcyBhcmUg dGFnZ2VkIHdpdGggW2FsbF0sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vT3Blbk1QL3NwZWMv aXNzdWVzLzMxNzkuCklDVnMgd2hpY2ggYXJlIG5vdCBnbG9iYWwgYnV0IGFyZW4ndCBoYW5k bGVkIGRldmljZS1zcGVjaWZpYyB5ZXQgYXJlIHRhZ2dlZAp3aXRoIFtob3N0XS4gb21wX2Rp c3BsYXlfZW52IG91dHB1dHMgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBJQ1ZzLiBUaGF0 J3Mgd2h5CnNlcGFyYXRlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW50cm9kdWNlZCAobGlrZSBn b21wX2luaXRpYWxfaWN2Li4uKS4KKGQpIERldmljZS1zcGVjaWZpYyBJQ1ZzIHdoaWNoIGFy ZSBhbHJlYWR5IHVzZXIgYWNjZXNzaWJsZSBvbiB0aGUgZGV2aWNlIGFyZQp0cmFuc21pdHRl ZCB0byB0aGUgZGV2aWNlIChtb3Jlb3ZlciBudGVhbXMtdmFyIGlzIGFkZGVkIGFuZCB1c2Vk IGZvciB0aGUgdGVzdHMpLgoKbGliZ29tcC9DaGFuZ2VMb2c6CgoJKiBjb25maWcvZ2NuL2lj di1kZXZpY2UuYyAob21wX2dldF9kZWZhdWx0X2RldmljZSk6IFJldHVybiBkZXZpY2UtCglz cGVjaWZpYyBJQ1YuCgkob21wX2dldF9tYXhfdGVhbXMpOiBBZGRlZCBmb3IgR0NOIGRldmlj ZXMuCgkob21wX3NldF9udW1fdGVhbXMpOiBMaWtld2lzZS4KCShpYWxpYXMpOiBMaWtld2lz ZS4KCSogY29uZmlnL252cHR4L2ljdi1kZXZpY2UuYyAob21wX2dldF9kZWZhdWx0X2Rldmlj ZSk6IFJldHVybiBkZXZpY2UtCglzcGVjaWZpYyBJQ1YuCgkob21wX2dldF9tYXhfdGVhbXMp OiBBZGRlZCBmb3IgTlZQVFggZGV2aWNlcy4KCShvbXBfc2V0X251bV90ZWFtcyk6IExpa2V3 aXNlLgoJKGlhbGlhcyk6IExpa2V3aXNlLgoJKiBlbnYuYyAoc3RydWN0IGdvbXBfaWN2X2xp c3QpOiBOZXcgc3RydWN0IHRvIHN0b3JlIGVudHJpZXMgb2YgaW5pdGlhbAoJSUNWIHZhbHVl cy4KCShzdHJ1Y3QgZ29tcF9vZmZsb2FkX2ljdl9saXN0KTogTmV3IHN0cnVjdCB0byBzdG9y ZSBlbnRyaWVzIG9mIGRldmljZS0KCXNwZWNpZmljIElDViB2YWx1ZXMgdGhhdCBhcmUgY29w aWVkIHRvIHRoZSBkZXZpY2UgYW5kIGJhY2suCgkoc3RydWN0IGdvbXBfZGVmYXVsdF9pY3Zf dCk6IE5ldyBzdHJ1Y3QgdG8gc3RvcmUgZGVmYXVsdCB2YWx1ZXMgb2YgSUNWcwoJYWNjb3Jk aW5nIHRvIHRoZSBPcGVuTVAgc3RhbmRhcmQuCgkocGFyc2Vfc2NoZWR1bGUpOiBHZW5lcmFs aXplZCBmb3IgZGlmZmVyZW50IHZhcmlhbnRzIG9mIE9NUF9TQ0hFRFVMRS4KCShwcmludF9l bnZfdmFyX2Vycm9yKTogRnVuY3Rpb24gdGhhdCBwcmludHMgYW4gZXJyb3IgZm9yIGludmFs aWQgdmFsdWVzCglmb3IgSUNWcy4KCShwYXJzZV91bnNpZ25lZF9sb25nXzEpOiBSZW1vdmVk IGdldGVudi4gR2VuZXJhbGl6ZWQuCgkocGFyc2VfdW5zaWduZWRfbG9uZyk6IExpa2V3aXNl LgoJKHBhcnNlX2ludF8xKTogTGlrZXdpc2UuCgkocGFyc2VfaW50KTogTGlrZXdpc2UuCgko cGFyc2VfaW50X3NlY3VyZSk6IExpa2V3aXNlLgoJKHBhcnNlX3Vuc2lnbmVkX2xvbmdfbGlz dCk6IExpa2V3aXNlLgoJKHBhcnNlX3RhcmdldF9vZmZsb2FkKTogTGlrZXdpc2UuCgkocGFy c2VfYmluZF92YXIpOiBMaWtld2lzZS4KCShwYXJzZV9zdGFja3NpemUpOiBMaWtld2lzZS4K CShwYXJzZV9ib29sZWFuKTogTGlrZXdpc2UuCgkocGFyc2Vfd2FpdF9wb2xpY3kpOiBMaWtl d2lzZS4KCShwYXJzZV9hbGxvY2F0b3IpOiBMaWtld2lzZS4KCShvbXBfZGlzcGxheV9lbnYp OiBFeHRlbmRlZCB0byBvdXRwdXQgZGlmZmVyZW50IHZhcmlhbnRzIG9mIGVudmlyb25tZW50 Cgl2YXJpYWJsZXMuCgkocHJpbnRfc2NoZWR1bGUpOiBOZXcgaGVscGVyIGZ1bmN0aW9uIGZv ciBvbXBfZGlzcGxheV9lbnYgd2hpY2ggcHJpbnRzCgl0aGUgdmFsdWVzIG9mIHJ1bl9zY2hl ZF92YXIuCgkocHJpbnRfcHJvY19iaW5kKTogTmV3IGhlbHBlciBmdW5jdGlvbiBmb3Igb21w X2Rpc3BsYXlfZW52IHdoaWNoIHByaW50cwoJdGhlIHZhbHVlcyBvZiBwcm9jX2JpbmRfdmFy LgoJKGVudW0gZ29tcF9wYXJzZV90eXBlKTogQ29sbGVjdGlvbiBvZiB0eXBlcyB1c2VkIGZv ciBwYXJzaW5nIGVudmlyb25tZW50Cgl2YXJpYWJsZXMuCgkoRU5UUlkpOiBQcmVwcm9jZXNz IHN0cmluZyBsZW5ndGhzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcy4KCShPTVBfVkFSX0NO VCk6IFByZXByb2Nlc3MgdGFibGUgc2l6ZS4KCShPTVBfSE9TVF9WQVJfQ05UKTogTGlrZXdp c2UuCgkoSU5UX01BWF9TVFJfTEVOKTogQ29uc3RhbnQgZm9yIHRoZSBtYXhpbWFsIG51bWJl ciBvZiBkaWdpdHMgb2YgYSBkZXZpY2UKCW51bWJlci4KCShnb21wX2dldF9pY3ZfZmxhZyk6 IFJldHVybnMgaWYgYSBmbGFnIGZvciBhIHBhcnRpY3VsYXIgSUNWIGlzIHNldC4KCShnb21w X3NldF9pY3ZfZmxhZyk6IFNldHMgYSBmbGFnIGZvciBhIHBhcnRpY3VsYXIgSUNWLgoJKHBy aW50X2RldmljZV9zcGVjaWZpY19pY3ZzKTogTmV3IGhlbHBlciBmdW5jdGlvbiBmb3Igb21w X2Rpc3BsYXlfZW52IHRvCglwcmludCBkZXZpY2Ugc3BlY2lmaWMgSUNWIHZhbHVlcy4KCShn ZXRfZGV2aWNlX251bSk6IE5ldyBoZWxwZXIgZnVuY3Rpb24gZm9yIHBhcnNlX2RldmljZV9z cGVjaWZpYy4KCUV4dHJhY3RzIHRoZSBkZXZpY2UgbnVtYmVyIGZyb20gYW4gZW52aXJvbm1l bnQgdmFyaWFibGUgbmFtZS4KCShnZXRfaWN2X21lbWJlcl9hZGRyKTogR2V0cyB0aGUgbWVt b3J5IGFkZHJlc3MgZm9yIGEgcGFydGljdWxhciBtZW1iZXIKCW9mIGFuIElDViBzdHJ1Y3Qu CgkoZ29tcF9nZXRfaW5pdGlhbF9pY3ZfaXRlbSk6IEdldCBhIGxpc3QgaXRlbSBvZiBnb21w X2luaXRpYWxfaWN2X2xpc3QuCgkoZ29tcF9nZXRfb2ZmbG9hZF9pY3ZfaXRlbSk6IEdldCBh IGxpc3QgaXRlbSBvZiBnb21wX29mZmxvYWRfaWN2X2xpc3QuCgkoYWRkX2luaXRpYWxfaWN2 X3RvX2xpc3QpOiBBZGRzIGFuIElDViBzdHJ1Y3QgdG8gZ29tcF9pbml0aWFsX2ljdl9saXN0 LgoJKHN0YXJ0c3dpdGgpOiBDaGVja3MgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggYSBnaXZl biBwcmVmaXguCgkoaW5pdGlhbGl6ZV9lbnYpOiBFeHRlbmRlZCB0byBwYXJzZSB0aGUgbmV3 IHN5bnRheCBvZiBlbnZpcm9ubWVudAoJdmFyaWFibGVzLgoJKiBpY3YtZGV2aWNlLmMgKG9t cF9nZXRfbWF4X3RlYW1zKTogQWRkZWQuCgkoaWFsaWFzKTogTGlrZXdpc2UuCgkob21wX3Nl dF9udW1fdGVhbXMpOiBMaWtld2lzZS4KCSogaWN2LmMgKG9tcF9zZXRfbnVtX3RlYW1zKTog TW92ZWQgdG8gaWN2LWRldmljZS5jLgoJKG9tcF9nZXRfbWF4X3RlYW1zKTogTGlrZXdpc2Uu CgkoaWFsaWFzKTogTGlrZXdpc2UuCgkqIGxpYmdvbXAtcGx1Z2luLmggKEdPTVBfREVWSUNF X05VTV9WQVIpOiBSZW1vdmVkLgoJKEdPTVBfQURESVRJT05BTF9JQ1ZTKTogTmV3IHRhcmdl dC1zaWRlIHN0cnVjdCB0aGF0Cglob2xkcyB0aGUgZGVzaWduYXRlZCBJQ1ZzIG9mIHRoZSB0 YXJnZXQgZGV2aWNlLgoJKiBsaWJnb21wLmggKGVudW0gZ29tcF9pY3ZzKTogQ29sbGVjdGlv biBvZiBJQ1ZzLgoJKGVudW0gZ29tcF9lbnZfc3VmZml4KTogQ29sbGVjdGlvbiBvZiBwb3Nz aWJsZSBzdWZmaXhlcyBvZiBlbnZpcm9ubWVudAoJdmFyaWFibGVzLgoJKHN0cnVjdCBnb21w X2luaXRpYWxfaWN2cyk6IENvbnRhaW5zIGFsbCBJQ1ZzIGZvciB3aGljaCB3ZSBuZWVkIHRv IHN0b3JlCglpbml0aWFsIHZhbHVlcy4KCShzdHJ1Y3QgZ29tcF9kZWZhdWx0X2ljdl90KTog TmV3IHN0cnVjdCB0byBob2xkIElDVnMgZm9yIHdoaWNoIHdlIG5lZWQKCXRvIHN0b3JlIGlu aXRpYWwgdmFsdWVzLgoJKHN0cnVjdCBnb21wX2ljdl9saXN0KTogRGVmaW5pdGlvbiBvZiBh IGxpbmtlZCBsaXN0IHRoYXQgaXMgdXNlZCBmb3IKCXN0b3JpbmcgSUNWcyBmb3IgdGhlIGRl dmljZXMgYW5kIGFsc28gZm9yIF9ERVYsIF9BTEwsIGFuZCB3aXRob3V0CglzdWZmaXguCgko Z29tcF9nZXRfaW5pdGlhbF9pY3ZfaXRlbSk6IEdldCBhIGxpc3QgaXRlbSBvZiBnb21wX2lu aXRpYWxfaWN2X2xpc3QuCgkoZ29tcF9nZXRfaWN2X2ZsYWcpOiBSZXR1cm5zIGlmIGEgZmxh ZyBmb3IgYSBwYXJ0aWN1bGFyIElDViBpcyBzZXQuCgkoc3RydWN0IGdvbXBfb2ZmbG9hZF9p Y3ZzKTogTmV3IHN0cnVjdCB0byBob2xkIElDVnMgdGhhdCBhcmUgY29waWVkIHRvCglhIGRl dmljZS4KCShzdHJ1Y3QgZ29tcF9vZmZsb2FkX2ljdl9saXN0KTogRGVmaW5pdGlvbiBvZiBh IGxpbmtlZCBsaXN0IHRoYXQgaG9sZHMKCWRldmljZS1zcGVjaWZpYyBJQ1ZzIHRoYXQgYXJl IGNvcGllZCB0byBkZXZpY2VzLgoJKGdvbXBfZ2V0X29mZmxvYWRfaWN2X2l0ZW0pOiBHZXQg YSBsaXN0IGl0ZW0gb2YgZ29tcF9vZmZsb2FkX2ljdl9saXN0LgoJKiBwbHVnaW4vcGx1Z2lu LWdjbi5jIChHT01QX09GRkxPQURfbG9hZF9pbWFnZSk6IEV4dGVuZGVkIHRvIHJlYWQKCWZ1 cnRoZXIgSUNWcyBmcm9tIHRoZSBvZmZsb2FkIGltYWdlLgoJKiBwbHVnaW4vcGx1Z2luLW52 cHR4LmMgKEdPTVBfT0ZGTE9BRF9sb2FkX2ltYWdlKTogTGlrZXdpc2UuCgkqIHRhcmdldC5j IChnZXRfZ29tcF9vZmZsb2FkX2ljdnMpOiBOZXcuIFJldHVybnMgdGhlIElDViB2YWx1ZXMK CWRlcGVuZGluZyBvbiB0aGUgZGV2aWNlIG51bSBhbmQgdGhlIHZhcmlhYmxlIGhpZXJhcmNo eS4KCShnb21wX2xvYWRfaW1hZ2VfdG9fZGV2aWNlKTogRXh0ZW5kZWQgdG8gY29weSBmdXJ0 aGVyIElDVnMgdG8gYSBkZXZpY2UuCgkqIHRlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1v bi9pY3YtNS5jOiBOZXcgdGVzdC4KCSogdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9u L2ljdi02LmM6IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24v aWN2LTcuYzogTmV3IHRlc3QuCgkqIHRlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9p Y3YtOC5jOiBOZXcgdGVzdC4KCSogdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL29t cC1kaXNwbGF5LWVudi0xLmM6IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvbGliZ29tcC5jLWMr Ky1jb21tb24vb21wLWRpc3BsYXktZW52LTIuYzogTmV3IHRlc3QuCgpkaWZmIC0tZ2l0IGEv bGliZ29tcC9jb25maWcvZ2NuL2ljdi1kZXZpY2UuYyBiL2xpYmdvbXAvY29uZmlnL2djbi9p Y3YtZGV2aWNlLmMKaW5kZXggZjcwYjdlNi4uYmY3NTdiYSAxMDA2NDQKLS0tIGEvbGliZ29t cC9jb25maWcvZ2NuL2ljdi1kZXZpY2UuYworKysgYi9saWJnb21wL2NvbmZpZy9nY24vaWN2 LWRldmljZS5jCkBAIC0yOCw2ICsyOCwxMCBAQAogCiAjaW5jbHVkZSAibGliZ29tcC5oIgog CisvKiBUaGlzIGlzIHNldCB0byB0aGUgSUNWIHZhbHVlcyBvZiBjdXJyZW50IEdQVSBkdXJp bmcgZGV2aWNlIGluaXRpYWxpemF0aW9uLAorICAgd2hlbiB0aGUgb2ZmbG9hZCBpbWFnZSBj b250YWluaW5nIHRoaXMgbGliZ29tcCBwb3J0aW9uIGlzIGxvYWRlZC4gICovCit2b2xhdGls ZSBzdHJ1Y3QgZ29tcF9vZmZsb2FkX2ljdnMgR09NUF9BRERJVElPTkFMX0lDVlM7CisKIHZv aWQKIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKGludCBkZXZpY2VfbnVtIF9fYXR0cmlidXRl X18oKHVudXNlZCkpKQogewpAQCAtMzYsNyArNDAsNyBAQCBvbXBfc2V0X2RlZmF1bHRfZGV2 aWNlIChpbnQgZGV2aWNlX251bSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKIGludAogb21w X2dldF9kZWZhdWx0X2RldmljZSAodm9pZCkKIHsKLSAgcmV0dXJuIDA7CisgIHJldHVybiBH T01QX0FERElUSU9OQUxfSUNWUy5kZWZhdWx0X2RldmljZTsKIH0KIAogaW50CkBAIC01OCwx NCArNjIsMjMgQEAgb21wX2lzX2luaXRpYWxfZGV2aWNlICh2b2lkKQogICByZXR1cm4gMDsK IH0KIAotLyogVGhpcyBpcyBzZXQgdG8gdGhlIGRldmljZSBudW1iZXIgb2YgY3VycmVudCBH UFUgZHVyaW5nIGRldmljZSBpbml0aWFsaXphdGlvbiwKLSAgIHdoZW4gdGhlIG9mZmxvYWQg aW1hZ2UgY29udGFpbmluZyB0aGlzIGxpYmdvbXAgcG9ydGlvbiBpcyBsb2FkZWQuICAqLwot dm9sYXRpbGUgaW50IEdPTVBfREVWSUNFX05VTV9WQVI7Ci0KIGludAogb21wX2dldF9kZXZp Y2VfbnVtICh2b2lkKQogewotICByZXR1cm4gR09NUF9ERVZJQ0VfTlVNX1ZBUjsKKyAgcmV0 dXJuIEdPTVBfQURESVRJT05BTF9JQ1ZTLmRldmljZV9udW07Cit9CisKK2ludAorb21wX2dl dF9tYXhfdGVhbXMgKHZvaWQpCit7CisgIHJldHVybiBHT01QX0FERElUSU9OQUxfSUNWUy5u dGVhbXM7Cit9CisKK3ZvaWQKK29tcF9zZXRfbnVtX3RlYW1zIChpbnQgbnVtX3RlYW1zKQor eworICBpZiAobnVtX3RlYW1zID49IDApCisgICAgR09NUF9BRERJVElPTkFMX0lDVlMubnRl YW1zID0gbnVtX3RlYW1zOwogfQogCiBpYWxpYXMgKG9tcF9zZXRfZGVmYXVsdF9kZXZpY2Up CkBAIC03NCwzICs4Nyw1IEBAIGlhbGlhcyAob21wX2dldF9pbml0aWFsX2RldmljZSkKIGlh bGlhcyAob21wX2dldF9udW1fZGV2aWNlcykKIGlhbGlhcyAob21wX2lzX2luaXRpYWxfZGV2 aWNlKQogaWFsaWFzIChvbXBfZ2V0X2RldmljZV9udW0pCitpYWxpYXMgKG9tcF9nZXRfbWF4 X3RlYW1zKQoraWFsaWFzIChvbXBfc2V0X251bV90ZWFtcykKZGlmZiAtLWdpdCBhL2xpYmdv bXAvY29uZmlnL252cHR4L2ljdi1kZXZpY2UuYyBiL2xpYmdvbXAvY29uZmlnL252cHR4L2lj di1kZXZpY2UuYwppbmRleCBmYWY5MGY5Li42Zjg2OWJlIDEwMDY0NAotLS0gYS9saWJnb21w L2NvbmZpZy9udnB0eC9pY3YtZGV2aWNlLmMKKysrIGIvbGliZ29tcC9jb25maWcvbnZwdHgv aWN2LWRldmljZS5jCkBAIC0yOCw2ICsyOCwxMCBAQAogCiAjaW5jbHVkZSAibGliZ29tcC5o IgogCisvKiBUaGlzIGlzIHNldCB0byB0aGUgSUNWIHZhbHVlcyBvZiBjdXJyZW50IEdQVSBk dXJpbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uLAorICAgd2hlbiB0aGUgb2ZmbG9hZCBpbWFn ZSBjb250YWluaW5nIHRoaXMgbGliZ29tcCBwb3J0aW9uIGlzIGxvYWRlZC4gICovCitzdGF0 aWMgdm9sYXRpbGUgc3RydWN0IGdvbXBfb2ZmbG9hZF9pY3ZzIEdPTVBfQURESVRJT05BTF9J Q1ZTOworCiB2b2lkCiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlIChpbnQgZGV2aWNlX251bSBf X2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKIHsKQEAgLTM2LDcgKzQwLDcgQEAgb21wX3NldF9k ZWZhdWx0X2RldmljZSAoaW50IGRldmljZV9udW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSkp CiBpbnQKIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKHZvaWQpCiB7Ci0gIHJldHVybiAwOwor ICByZXR1cm4gR09NUF9BRERJVElPTkFMX0lDVlMuZGVmYXVsdF9kZXZpY2U7CiB9CiAKIGlu dApAQCAtNTgsMTQgKzYyLDIzIEBAIG9tcF9pc19pbml0aWFsX2RldmljZSAodm9pZCkKICAg cmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgaXMgc2V0IHRvIHRoZSBkZXZpY2UgbnVtYmVyIG9m IGN1cnJlbnQgR1BVIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24sCi0gICB3aGVuIHRo ZSBvZmZsb2FkIGltYWdlIGNvbnRhaW5pbmcgdGhpcyBsaWJnb21wIHBvcnRpb24gaXMgbG9h ZGVkLiAgKi8KLXN0YXRpYyB2b2xhdGlsZSBpbnQgR09NUF9ERVZJQ0VfTlVNX1ZBUjsKLQog aW50CiBvbXBfZ2V0X2RldmljZV9udW0gKHZvaWQpCiB7Ci0gIHJldHVybiBHT01QX0RFVklD RV9OVU1fVkFSOworICByZXR1cm4gR09NUF9BRERJVElPTkFMX0lDVlMuZGV2aWNlX251bTsK K30KKworaW50CitvbXBfZ2V0X21heF90ZWFtcyAodm9pZCkKK3sKKyAgcmV0dXJuIEdPTVBf QURESVRJT05BTF9JQ1ZTLm50ZWFtczsKK30KKwordm9pZAorb21wX3NldF9udW1fdGVhbXMg KGludCBudW1fdGVhbXMpCit7CisgIGlmIChudW1fdGVhbXMgPj0gMCkKKyAgICBHT01QX0FE RElUSU9OQUxfSUNWUy5udGVhbXMgPSBudW1fdGVhbXM7CiB9CiAKIGlhbGlhcyAob21wX3Nl dF9kZWZhdWx0X2RldmljZSkKQEAgLTc0LDMgKzg3LDUgQEAgaWFsaWFzIChvbXBfZ2V0X2lu aXRpYWxfZGV2aWNlKQogaWFsaWFzIChvbXBfZ2V0X251bV9kZXZpY2VzKQogaWFsaWFzIChv bXBfaXNfaW5pdGlhbF9kZXZpY2UpCiBpYWxpYXMgKG9tcF9nZXRfZGV2aWNlX251bSkKK2lh bGlhcyAob21wX2dldF9tYXhfdGVhbXMpCitpYWxpYXMgKG9tcF9zZXRfbnVtX3RlYW1zKQpk aWZmIC0tZ2l0IGEvbGliZ29tcC9lbnYuYyBiL2xpYmdvbXAvZW52LmMKaW5kZXggMWM0ZWU4 OS4uOTY1NGRkMyAxMDA2NDQKLS0tIGEvbGliZ29tcC9lbnYuYworKysgYi9saWJnb21wL2Vu di5jCkBAIC03Myw2ICs3MywyNSBAQCBzdHJ1Y3QgZ29tcF90YXNrX2ljdiBnb21wX2dsb2Jh bF9pY3YgPSB7CiAgIC50YXJnZXRfZGF0YSA9IE5VTEwKIH07CiAKKy8qIExpc3QgZm9yIGlu aXRpYWwgIl9ERVYiLCAiX0FMTCIsIGFuZCAiX0RFVl9YIiBJQ1ZzIGxpa2UgT01QX05VTV9U RUFNU19ERVYsCisgICBPTVBfTlVNX1RFQU1TX0FMTCwgb3IgT01QX05VTV9URUFNU19ERVZf NDIuICAqLworc3RydWN0IGdvbXBfaWN2X2xpc3QgKmdvbXBfaW5pdGlhbF9pY3ZfbGlzdCA9 IE5VTEw7CisKKy8qIExpc3QgZm9yICJfREVWX1giIElDVnMgbGlrZSBPTVBfTlVNX1RFQU1T X0RFVl80Mi4gIFRoaXMgbGlzdCBjb250YWlucyBhbGwKKyAgIGRldmljZS1zcGVjaWZpYyBJ Q1ZzIHRoYXQgYXJlIGNvcGllZCBmcm9tIGhvc3QgdG8gZGV2aWNlIGFuZCBiYWNrLiAgKi8K K3N0cnVjdCBnb21wX29mZmxvYWRfaWN2X2xpc3QgKmdvbXBfb2ZmbG9hZF9pY3ZfbGlzdCA9 IE5VTEw7CisKKy8qIERlZmF1bHQgdmFsdWVzIG9mIElDVnMgYWNjb3JkaW5nIHRvIHRoZSBP cGVuTVAgc3RhbmRhcmQuICAqLworc3RydWN0IGdvbXBfZGVmYXVsdF9pY3ZfdCBnb21wX2Rl ZmF1bHRfaWN2X3ZhbHVlcyA9IHsKKyAgLnJ1bl9zY2hlZF92YXIgPSBHRlNfRFlOQU1JQywK KyAgLnJ1bl9zY2hlZF9jaHVua19zaXplID0gMSwKKyAgLm1heF9hY3RpdmVfbGV2ZWxzX3Zh ciA9IDEsCisgIC5iaW5kX3ZhciA9IG9tcF9wcm9jX2JpbmRfZmFsc2UsCisgIC5udGVhbXNf dmFyID0gMCwKKyAgLnRlYW1zX3RocmVhZF9saW1pdF92YXIgPSAwLAorICAuZGVmYXVsdF9k ZXZpY2VfdmFyID0gMAorfTsKKwogYm9vbCBnb21wX2NhbmNlbF92YXIgPSBmYWxzZTsKIGVu dW0gZ29tcF90YXJnZXRfb2ZmbG9hZF90IGdvbXBfdGFyZ2V0X29mZmxvYWRfdmFyCiAgID0g R09NUF9UQVJHRVRfT0ZGTE9BRF9ERUZBVUxUOwpAQCAtMTA0LDg2ICsxMjMsOTQgQEAgaW50 IGdvYWNjX2RlZmF1bHRfZGltc1tHT01QX0RJTV9NQVhdOwogc3RhdGljIGludCB3YWl0X3Bv bGljeTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHN0YWNrc2l6ZSA9IEdPTVBfREVGQVVMVF9T VEFDS1NJWkU7CiAKLS8qIFBhcnNlIHRoZSBPTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFy aWFibGUuICAqLwotCiBzdGF0aWMgdm9pZAotcGFyc2Vfc2NoZWR1bGUgKHZvaWQpCitwcmlu dF9lbnZfdmFyX2Vycm9yIChjb25zdCBjaGFyICplbnYsIGNvbnN0IGNoYXIgKnZhbCkKIHsK LSAgY2hhciAqZW52LCAqZW5kOworICBjaGFyIG5hbWVbdmFsIC0gZW52XTsKKyAgbWVtY3B5 IChuYW1lLCBlbnYsIHZhbCAtIGVudiAtIDEpOworICBuYW1lW3ZhbCAtIGVudiAtIDFdID0g J1wwJzsKKyAgZ29tcF9lcnJvciAoIkludmFsaWQgdmFsdWUgZm9yIGVudmlyb25tZW50IHZh cmlhYmxlICVzOiAlcyIsIG5hbWUsIHZhbCk7Cit9CisKKy8qIFBhcnNlIHRoZSBPTVBfU0NI RURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLworc3RhdGljIGJvb2wKK3BhcnNlX3Nj aGVkdWxlIChjb25zdCBjaGFyICplbnYsIGNvbnN0IGNoYXIgKnZhbCwgdm9pZCAqIGNvbnN0 IHBhcmFtc1tdKQoreworICBlbnVtIGdvbXBfc2NoZWR1bGVfdHlwZSAqc2NoZWR1bGUgPSAo ZW51bSBnb21wX3NjaGVkdWxlX3R5cGUgKikgcGFyYW1zWzBdOworICBpbnQgKmNodW5rX3Np emUgPSAoaW50ICopIHBhcmFtc1sxXTsKKyAgY2hhciAqZW5kOwogICB1bnNpZ25lZCBsb25n IHZhbHVlOwogICBpbnQgbW9ub3RvbmljID0gMDsKIAotICBlbnYgPSBnZXRlbnYgKCJPTVBf U0NIRURVTEUiKTsKLSAgaWYgKGVudiA9PSBOVUxMKQotICAgIHJldHVybjsKKyAgaWYgKHZh bCA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKIAotICB3aGlsZSAoaXNzcGFjZSAoKHVu c2lnbmVkIGNoYXIpICplbnYpKQotICAgICsrZW52OwotICBpZiAoc3RybmNhc2VjbXAgKGVu diwgIm1vbm90b25pYyIsIDkpID09IDApCisgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQg Y2hhcikgKnZhbCkpCisgICAgKyt2YWw7CisgIGlmIChzdHJuY2FzZWNtcCAodmFsLCAibW9u b3RvbmljIiwgOSkgPT0gMCkKICAgICB7CiAgICAgICBtb25vdG9uaWMgPSAxOwotICAgICAg ZW52ICs9IDk7CisgICAgICB2YWwgKz0gOTsKICAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNl Y21wIChlbnYsICJub25tb25vdG9uaWMiLCAxMikgPT0gMCkKKyAgZWxzZSBpZiAoc3RybmNh c2VjbXAgKHZhbCwgIm5vbm1vbm90b25pYyIsIDEyKSA9PSAwKQogICAgIHsKICAgICAgIG1v bm90b25pYyA9IC0xOwotICAgICAgZW52ICs9IDEyOworICAgICAgdmFsICs9IDEyOwogICAg IH0KICAgaWYgKG1vbm90b25pYykKICAgICB7Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVu c2lnbmVkIGNoYXIpICplbnYpKQotCSsrZW52OwotICAgICAgaWYgKCplbnYgIT0gJzonKQor ICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKwkrK3ZhbDsK KyAgICAgIGlmICgqdmFsICE9ICc6JykKIAlnb3RvIHVua25vd247Ci0gICAgICArK2VudjsK LSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmVudikpCi0JKytlbnY7 CisgICAgICArK3ZhbDsKKyAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikg KnZhbCkpCisJKyt2YWw7CiAgICAgfQotICBpZiAoc3RybmNhc2VjbXAgKGVudiwgInN0YXRp YyIsIDYpID09IDApCisgIGlmIChzdHJuY2FzZWNtcCAodmFsLCAic3RhdGljIiwgNikgPT0g MCkKICAgICB7Ci0gICAgICBnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVkX3ZhciA9IEdGU19T VEFUSUM7Ci0gICAgICBlbnYgKz0gNjsKKyAgICAgICpzY2hlZHVsZSA9IEdGU19TVEFUSUM7 CisgICAgICB2YWwgKz0gNjsKICAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChlbnYs ICJkeW5hbWljIiwgNykgPT0gMCkKKyAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHZhbCwgImR5 bmFtaWMiLCA3KSA9PSAwKQogICAgIHsKLSAgICAgIGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2No ZWRfdmFyID0gR0ZTX0RZTkFNSUM7Ci0gICAgICBlbnYgKz0gNzsKKyAgICAgICpzY2hlZHVs ZSA9IEdGU19EWU5BTUlDOworICAgICAgdmFsICs9IDc7CiAgICAgfQotICBlbHNlIGlmIChz dHJuY2FzZWNtcCAoZW52LCAiZ3VpZGVkIiwgNikgPT0gMCkKKyAgZWxzZSBpZiAoc3RybmNh c2VjbXAgKHZhbCwgImd1aWRlZCIsIDYpID09IDApCiAgICAgewotICAgICAgZ29tcF9nbG9i YWxfaWN2LnJ1bl9zY2hlZF92YXIgPSBHRlNfR1VJREVEOwotICAgICAgZW52ICs9IDY7Cisg ICAgICAqc2NoZWR1bGUgPSBHRlNfR1VJREVEOworICAgICAgdmFsICs9IDY7CiAgICAgfQot ICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoZW52LCAiYXV0byIsIDQpID09IDApCisgIGVsc2Ug aWYgKHN0cm5jYXNlY21wICh2YWwsICJhdXRvIiwgNCkgPT0gMCkKICAgICB7Ci0gICAgICBn b21wX2dsb2JhbF9pY3YucnVuX3NjaGVkX3ZhciA9IEdGU19BVVRPOwotICAgICAgZW52ICs9 IDQ7CisgICAgICAqc2NoZWR1bGUgPSBHRlNfQVVUTzsKKyAgICAgIHZhbCArPSA0OwogICAg IH0KICAgZWxzZQogICAgIGdvdG8gdW5rbm93bjsKIAogICBpZiAobW9ub3RvbmljID09IDEK LSAgICAgIHx8IChtb25vdG9uaWMgPT0gMCAmJiBnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVk X3ZhciA9PSBHRlNfU1RBVElDKSkKLSAgICBnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVkX3Zh ciB8PSBHRlNfTU9OT1RPTklDOworICAgICAgfHwgKG1vbm90b25pYyA9PSAwICYmICpzY2hl ZHVsZSA9PSBHRlNfU1RBVElDKSkKKyAgICAqc2NoZWR1bGUgfD0gR0ZTX01PTk9UT05JQzsK IAotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICplbnYpKQotICAgICsrZW52 OwotICBpZiAoKmVudiA9PSAnXDAnKQorICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNo YXIpICp2YWwpKQorICAgICsrdmFsOworICBpZiAoKnZhbCA9PSAnXDAnKQogICAgIHsKLSAg ICAgIGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfY2h1bmtfc2l6ZQotCT0gKGdvbXBfZ2xv YmFsX2ljdi5ydW5fc2NoZWRfdmFyICYgfkdGU19NT05PVE9OSUMpICE9IEdGU19TVEFUSUM7 Ci0gICAgICByZXR1cm47CisgICAgICAqY2h1bmtfc2l6ZSA9ICgqc2NoZWR1bGUgJiB+R0ZT X01PTk9UT05JQykgIT0gR0ZTX1NUQVRJQzsKKyAgICAgIHJldHVybiB0cnVlOwogICAgIH0K LSAgaWYgKCplbnYrKyAhPSAnLCcpCisgIGlmICgqdmFsKysgIT0gJywnKQogICAgIGdvdG8g dW5rbm93bjsKLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqZW52KSkKLSAg ICArK2VudjsKLSAgaWYgKCplbnYgPT0gJ1wwJykKKyAgd2hpbGUgKGlzc3BhY2UgKCh1bnNp Z25lZCBjaGFyKSAqdmFsKSkKKyAgICArK3ZhbDsKKyAgaWYgKCp2YWwgPT0gJ1wwJykKICAg ICBnb3RvIGludmFsaWQ7CiAKICAgZXJybm8gPSAwOwotICB2YWx1ZSA9IHN0cnRvdWwgKGVu diwgJmVuZCwgMTApOwotICBpZiAoZXJybm8gfHwgZW5kID09IGVudikKKyAgdmFsdWUgPSBz dHJ0b3VsICh2YWwsICZlbmQsIDEwKTsKKyAgaWYgKGVycm5vIHx8IGVuZCA9PSB2YWwpCiAg ICAgZ290byBpbnZhbGlkOwogCiAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikg KmVuZCkpCkBAIC0xOTQsMjAgKzIyMSwyMiBAQCBwYXJzZV9zY2hlZHVsZSAodm9pZCkKICAg aWYgKChpbnQpdmFsdWUgIT0gdmFsdWUpCiAgICAgZ290byBpbnZhbGlkOwogCi0gIGlmICh2 YWx1ZSA9PSAwCi0gICAgICAmJiAoZ29tcF9nbG9iYWxfaWN2LnJ1bl9zY2hlZF92YXIgJiB+ R0ZTX01PTk9UT05JQykgIT0gR0ZTX1NUQVRJQykKKyAgaWYgKHZhbHVlID09IDAgJiYgKCpz Y2hlZHVsZSAmIH5HRlNfTU9OT1RPTklDKSAhPSBHRlNfU1RBVElDKQogICAgIHZhbHVlID0g MTsKLSAgZ29tcF9nbG9iYWxfaWN2LnJ1bl9zY2hlZF9jaHVua19zaXplID0gdmFsdWU7Ci0g IHJldHVybjsKKyAgKmNodW5rX3NpemUgPSB2YWx1ZTsKKyAgcmV0dXJuIHRydWU7CiAKICB1 bmtub3duOgotICBnb21wX2Vycm9yICgiVW5rbm93biB2YWx1ZSBmb3IgZW52aXJvbm1lbnQg dmFyaWFibGUgT01QX1NDSEVEVUxFIik7Ci0gIHJldHVybjsKKyAgcHJpbnRfZW52X3Zhcl9l cnJvciAoZW52LCB2YWwpOworICByZXR1cm4gZmFsc2U7CiAKICBpbnZhbGlkOgorICBjaGFy IG5hbWVbdmFsIC0gZW52XTsKKyAgbWVtY3B5IChuYW1lLCBlbnYsIHZhbCAtIGVudiAtIDEp OworICBuYW1lW3ZhbCAtIGVudiAtIDFdID0gJ1wwJzsKICAgZ29tcF9lcnJvciAoIkludmFs aWQgdmFsdWUgZm9yIGNodW5rIHNpemUgaW4gIgotCSAgICAgICJlbnZpcm9ubWVudCB2YXJp YWJsZSBPTVBfU0NIRURVTEUiKTsKLSAgcmV0dXJuOworCSAgICAgICJlbnZpcm9ubWVudCB2 YXJpYWJsZSAlczogJXMiLCBuYW1lLCB2YWwpOworICByZXR1cm4gZmFsc2U7CiB9CiAKIC8q IFBhcnNlIGFuIHVuc2lnbmVkIGxvbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuICBSZXR1cm4g dHJ1ZSBpZiBvbmUgd2FzCkBAIC0yMTUsMjQgKzI0NCwyMyBAQCBwYXJzZV9zY2hlZHVsZSAo dm9pZCkKICAgIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KIAogc3RhdGljIGJvb2wKLXBh cnNlX3Vuc2lnbmVkX2xvbmdfMSAoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAq cHZhbHVlLCBib29sIGFsbG93X3plcm8sCi0JCSAgICAgICBib29sIHNlY3VyZSkKK3BhcnNl X3Vuc2lnbmVkX2xvbmdfMSAoY29uc3QgY2hhciAqZW52LCBjb25zdCBjaGFyICp2YWwsIHVu c2lnbmVkIGxvbmcgKnB2YWx1ZSwKKwkJICAgICAgIGJvb2wgYWxsb3dfemVybykKIHsKLSAg Y2hhciAqZW52LCAqZW5kOworICBjaGFyICplbmQ7CiAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7 CiAKLSAgZW52ID0gKHNlY3VyZSA/IHNlY3VyZV9nZXRlbnYgKG5hbWUpIDogZ2V0ZW52IChu YW1lKSk7Ci0gIGlmIChlbnYgPT0gTlVMTCkKKyAgaWYgKHZhbCA9PSBOVUxMKQogICAgIHJl dHVybiBmYWxzZTsKIAotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICplbnYp KQotICAgICsrZW52OwotICBpZiAoKmVudiA9PSAnXDAnKQorICB3aGlsZSAoaXNzcGFjZSAo KHVuc2lnbmVkIGNoYXIpICp2YWwpKQorICAgICsrdmFsOworICBpZiAoKnZhbCA9PSAnXDAn KQogICAgIGdvdG8gaW52YWxpZDsKIAogICBlcnJubyA9IDA7Ci0gIHZhbHVlID0gc3RydG91 bCAoZW52LCAmZW5kLCAxMCk7Ci0gIGlmIChlcnJubyB8fCBlbmQgPT0gZW52IHx8IChsb25n KSB2YWx1ZSA8PSAwIC0gYWxsb3dfemVybykKKyAgdmFsdWUgPSBzdHJ0b3VsICh2YWwsICZl bmQsIDEwKTsKKyAgaWYgKGVycm5vIHx8IGVuZCA9PSB2YWwgfHwgKGxvbmcpIHZhbHVlIDw9 IDAgLSBhbGxvd196ZXJvKQogICAgIGdvdG8gaW52YWxpZDsKIAogICB3aGlsZSAoaXNzcGFj ZSAoKHVuc2lnbmVkIGNoYXIpICplbmQpKQpAQCAtMjQ0LDE2ICsyNzIsMzYgQEAgcGFyc2Vf dW5zaWduZWRfbG9uZ18xIChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpwdmFs dWUsIGJvb2wgYWxsb3dfemVybywKICAgcmV0dXJuIHRydWU7CiAKICBpbnZhbGlkOgotICBn b21wX2Vycm9yICgiSW52YWxpZCB2YWx1ZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgJXMi LCBuYW1lKTsKKyAgcHJpbnRfZW52X3Zhcl9lcnJvciAoZW52LCB2YWwpOwogICByZXR1cm4g ZmFsc2U7CiB9CiAKIC8qIEFzIHBhcnNlX3Vuc2lnbmVkX2xvbmdfMSwgYnV0IGFsd2F5cyB1 c2UgZ2V0ZW52LiAgKi8KIAogc3RhdGljIGJvb2wKLXBhcnNlX3Vuc2lnbmVkX2xvbmcgKGNv bnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnB2YWx1ZSwgYm9vbCBhbGxvd196ZXJv KQorcGFyc2VfdW5zaWduZWRfbG9uZyAoY29uc3QgY2hhciAqZW52LCBjb25zdCBjaGFyICp2 YWwsIHZvaWQgKiBjb25zdCBwYXJhbXNbXSkKIHsKLSAgcmV0dXJuIHBhcnNlX3Vuc2lnbmVk X2xvbmdfMSAobmFtZSwgcHZhbHVlLCBhbGxvd196ZXJvLCBmYWxzZSk7CisgIHVuc2lnbmVk IHVwcGVyID0gKHVuc2lnbmVkIGxvbmcpIHBhcmFtc1syXTsKKyAgdW5zaWduZWQgbG9uZyBw dmFsdWUgPSAwOworICBib29sIHJldCA9IHBhcnNlX3Vuc2lnbmVkX2xvbmdfMSAoZW52LCB2 YWwsICZwdmFsdWUsIChib29sKSBwYXJhbXNbMV0pOworICBpZiAoIXJldCkKKyAgICByZXR1 cm4gZmFsc2U7CisKKyAgaWYgKHVwcGVyID09IDApCisgICAgKih1bnNpZ25lZCBsb25nICop IHBhcmFtc1swXSA9IHB2YWx1ZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwdmFsdWUg PiB1cHBlcikKKwlwdmFsdWUgPSB1cHBlcjsKKyAgICAgIGlmICh1cHBlciA8PSBVQ0hBUl9N QVgpCisJKih1bnNpZ25lZCBjaGFyICopIHBhcmFtc1swXSA9IHB2YWx1ZTsKKyAgICAgIGVs c2UgaWYgKHVwcGVyIDw9IFVJTlRfTUFYKQorCSoodW5zaWduZWQgaW50ICopIHBhcmFtc1sw XSA9IHB2YWx1ZTsKKyAgICAgIGVsc2UKKwkqKHVuc2lnbmVkIGxvbmcgKikgcGFyYW1zWzBd ID0gcHZhbHVlOworICAgIH0KKworICByZXR1cm4gcmV0OwogfQogCiAvKiBQYXJzZSBhIHBv c2l0aXZlIGludCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIFJldHVybiB0cnVlIGlmIG9uZSB3 YXMKQEAgLTI2MSw1OCArMzA5LDU3IEBAIHBhcnNlX3Vuc2lnbmVkX2xvbmcgKGNvbnN0IGNo YXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnB2YWx1ZSwgYm9vbCBhbGxvd196ZXJvKQogICAg ZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLwogCiBzdGF0aWMgYm9vbAotcGFyc2VfaW50XzEg KGNvbnN0IGNoYXIgKm5hbWUsIGludCAqcHZhbHVlLCBib29sIGFsbG93X3plcm8sIGJvb2wg c2VjdXJlKQorcGFyc2VfaW50XzEgKGNvbnN0IGNoYXIgKmVudiwgY29uc3QgY2hhciAqdmFs LCBpbnQgKnB2YWx1ZSwgYm9vbCBhbGxvd196ZXJvKQogewogICB1bnNpZ25lZCBsb25nIHZh bHVlOwotICBpZiAoIXBhcnNlX3Vuc2lnbmVkX2xvbmdfMSAobmFtZSwgJnZhbHVlLCBhbGxv d196ZXJvLCBzZWN1cmUpKQorICBpZiAoIXBhcnNlX3Vuc2lnbmVkX2xvbmdfMSAoZW52LCB2 YWwsICZ2YWx1ZSwgYWxsb3dfemVybykpCiAgICAgcmV0dXJuIGZhbHNlOwogICBpZiAodmFs dWUgPiBJTlRfTUFYKQogICAgIHsKLSAgICAgIGdvbXBfZXJyb3IgKCJJbnZhbGlkIHZhbHVl IGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSAlcyIsIG5hbWUpOworICAgICAgcHJpbnRfZW52 X3Zhcl9lcnJvciAoZW52LCB2YWwpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAg KnB2YWx1ZSA9IChpbnQpIHZhbHVlOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotLyogQXMgcGFy c2VfaW50XzEsIGJ1dCB1c2UgZ2V0ZW52LiAgKi8KLQogc3RhdGljIGJvb2wKLXBhcnNlX2lu dCAoY29uc3QgY2hhciAqbmFtZSwgaW50ICpwdmFsdWUsIGJvb2wgYWxsb3dfemVybykKK3Bh cnNlX2ludCAoY29uc3QgY2hhciAqZW52LCBjb25zdCBjaGFyICp2YWwsIHZvaWQgKiBjb25z dCBwYXJhbXNbXSkKIHsKLSAgcmV0dXJuIHBhcnNlX2ludF8xIChuYW1lLCBwdmFsdWUsIGFs bG93X3plcm8sIGZhbHNlKTsKKyAgcmV0dXJuIHBhcnNlX2ludF8xIChlbnYsIHZhbCwgKGlu dCAqKSBwYXJhbXNbMF0sIChib29sKSBwYXJhbXNbMV0pOwogfQogCiAvKiBBcyBwYXJzZV9p bnRfMSwgYnV0IHVzZSBnZXRlbnZfc2VjdXJlLiAgKi8KIAogc3RhdGljIGJvb2wKLXBhcnNl X2ludF9zZWN1cmUgKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqcHZhbHVlLCBib29sIGFsbG93 X3plcm8pCitwYXJzZV9pbnRfc2VjdXJlIChjb25zdCBjaGFyICplbnYsIGludCAqcHZhbHVl LCBib29sIGFsbG93X3plcm8pCiB7Ci0gIHJldHVybiBwYXJzZV9pbnRfMSAobmFtZSwgcHZh bHVlLCBhbGxvd196ZXJvLCB0cnVlKTsKKyAgcmV0dXJuIHBhcnNlX2ludF8xIChlbnYsIHNl Y3VyZV9nZXRlbnYgKGVudiksIHB2YWx1ZSwgYWxsb3dfemVybyk7CiB9CiAKIC8qIFBhcnNl IGFuIHVuc2lnbmVkIGxvbmcgbGlzdCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIFJldHVybiB0 cnVlIGlmIG9uZSB3YXMKICAgIHByZXNlbnQgYW5kIGl0IHdhcyBzdWNjZXNzZnVsbHkgcGFy c2VkLiAgKi8KIAogc3RhdGljIGJvb2wKLXBhcnNlX3Vuc2lnbmVkX2xvbmdfbGlzdCAoY29u c3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqcDFzdHZhbHVlLAotCQkJICB1bnNpZ25l ZCBsb25nICoqcHZhbHVlcywKLQkJCSAgdW5zaWduZWQgbG9uZyAqcG52YWx1ZXMpCitwYXJz ZV91bnNpZ25lZF9sb25nX2xpc3QgKGNvbnN0IGNoYXIgKmVudiwgY29uc3QgY2hhciAqdmFs LAorCQkJICB2b2lkICogY29uc3QgcGFyYW1zW10pCiB7Ci0gIGNoYXIgKmVudiwgKmVuZDsK KyAgdW5zaWduZWQgbG9uZyAqcDFzdHZhbHVlID0gKHVuc2lnbmVkIGxvbmcgKikgcGFyYW1z WzBdOworICB1bnNpZ25lZCBsb25nICoqcHZhbHVlcyA9ICh1bnNpZ25lZCBsb25nICoqKSBw YXJhbXNbMV07CisgIHVuc2lnbmVkIGxvbmcgKnBudmFsdWVzID0gKHVuc2lnbmVkIGxvbmcq KSBwYXJhbXNbMl07CisgIGNoYXIgKmVuZDsKICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgKnZh bHVlcyA9IE5VTEw7CiAKLSAgZW52ID0gZ2V0ZW52IChuYW1lKTsKLSAgaWYgKGVudiA9PSBO VUxMKQorICBpZiAodmFsID09IE5VTEwpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIHdoaWxl IChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmVudikpCi0gICAgKytlbnY7Ci0gIGlmICgq ZW52ID09ICdcMCcpCisgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZhbCkp CisgICAgKyt2YWw7CisgIGlmICgqdmFsID09ICdcMCcpCiAgICAgZ290byBpbnZhbGlkOwog CiAgIGVycm5vID0gMDsKLSAgdmFsdWUgPSBzdHJ0b3VsIChlbnYsICZlbmQsIDEwKTsKKyAg dmFsdWUgPSBzdHJ0b3VsICh2YWwsICZlbmQsIDEwKTsKICAgaWYgKGVycm5vIHx8IChsb25n KSB2YWx1ZSA8PSAwKQogICAgIGdvdG8gaW52YWxpZDsKIApAQCAtMzI2LDcgKzM3Myw3IEBA IHBhcnNlX3Vuc2lnbmVkX2xvbmdfbGlzdCAoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQg bG9uZyAqcDFzdHZhbHVlLAogCiAJICBkbwogCSAgICB7Ci0JICAgICAgZW52ID0gZW5kICsg MTsKKwkgICAgICB2YWwgPSBlbmQgKyAxOwogCSAgICAgIGlmIChudmFsdWVzID09IG5hbGxv Y2VkKQogCQl7CiAJCSAgdW5zaWduZWQgbG9uZyAqbjsKQEAgLTMzNSw2ICszODIsOSBAQCBw YXJzZV91bnNpZ25lZF9sb25nX2xpc3QgKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxv bmcgKnAxc3R2YWx1ZSwKIAkJICBpZiAobiA9PSBOVUxMKQogCQkgICAgewogCQkgICAgICBm cmVlICh2YWx1ZXMpOworCQkgICAgICBjaGFyIG5hbWVbdmFsIC0gZW52XTsKKwkJICAgICAg bWVtY3B5IChuYW1lLCBlbnYsIHZhbCAtIGVudiAtIDEpOworCQkgICAgICBuYW1lW3ZhbCAt IGVudiAtIDFdID0gJ1wwJzsKIAkJICAgICAgZ29tcF9lcnJvciAoIk91dCBvZiBtZW1vcnkg d2hpbGUgdHJ5aW5nIHRvIHBhcnNlIgogCQkJCSAgIiBlbnZpcm9ubWVudCB2YXJpYWJsZSAl cyIsIG5hbWUpOwogCQkgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNDQsMTMgKzM5NCwxMyBA QCBwYXJzZV91bnNpZ25lZF9sb25nX2xpc3QgKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVk IGxvbmcgKnAxc3R2YWx1ZSwKIAkJICAgIHZhbHVlc1tudmFsdWVzKytdID0gdmFsdWU7CiAJ CX0KIAotCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmVudikpCi0J CSsrZW52OwotCSAgICAgIGlmICgqZW52ID09ICdcMCcpCisJICAgICAgd2hpbGUgKGlzc3Bh Y2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKwkJKyt2YWw7CisJICAgICAgaWYgKCp2YWwg PT0gJ1wwJykKIAkJZ290byBpbnZhbGlkOwogCiAJICAgICAgZXJybm8gPSAwOwotCSAgICAg IHZhbHVlID0gc3RydG91bCAoZW52LCAmZW5kLCAxMCk7CisJICAgICAgdmFsdWUgPSBzdHJ0 b3VsICh2YWwsICZlbmQsIDEwKTsKIAkgICAgICBpZiAoZXJybm8gfHwgKGxvbmcpIHZhbHVl IDw9IDApCiAJCWdvdG8gaW52YWxpZDsKIApAQCAtMzcwLDUyICs0MjAsNTYgQEAgcGFyc2Vf dW5zaWduZWRfbG9uZ19saXN0IChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpw MXN0dmFsdWUsCiAJfQogICAgICAgZ290byBpbnZhbGlkOwogICAgIH0KKyAgZWxzZQorICAg IHsKKyAgICAgICpwbnZhbHVlcyA9IDA7CisgICAgICAqcHZhbHVlcyA9IE5VTEw7CisgICAg fQogCiAgICpwMXN0dmFsdWUgPSB2YWx1ZTsKICAgcmV0dXJuIHRydWU7CiAKICBpbnZhbGlk OgogICBmcmVlICh2YWx1ZXMpOwotICBnb21wX2Vycm9yICgiSW52YWxpZCB2YWx1ZSBmb3Ig ZW52aXJvbm1lbnQgdmFyaWFibGUgJXMiLCBuYW1lKTsKKyAgcHJpbnRfZW52X3Zhcl9lcnJv ciAoZW52LCB2YWwpOwogICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkCi1wYXJz ZV90YXJnZXRfb2ZmbG9hZCAoY29uc3QgY2hhciAqbmFtZSwgZW51bSBnb21wX3RhcmdldF9v ZmZsb2FkX3QgKm9mZmxvYWQpCitzdGF0aWMgYm9vbAorcGFyc2VfdGFyZ2V0X29mZmxvYWQg KGNvbnN0IGNoYXIgKmVudiwgY29uc3QgY2hhciAqdmFsLCB2b2lkICogY29uc3QgcGFyYW1z W10pCiB7Ci0gIGNvbnN0IGNoYXIgKmVudjsKICAgaW50IG5ld19vZmZsb2FkID0gLTE7CiAK LSAgZW52ID0gZ2V0ZW52IChuYW1lKTsKLSAgaWYgKGVudiA9PSBOVUxMKQotICAgIHJldHVy bjsKKyAgaWYgKHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKIAotICB3aGlsZSAo aXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICplbnYpKQotICAgICsrZW52OwotICBpZiAoc3Ry bmNhc2VjbXAgKGVudiwgImRlZmF1bHQiLCA3KSA9PSAwKQorICB3aGlsZSAoaXNzcGFjZSAo KHVuc2lnbmVkIGNoYXIpICp2YWwpKQorICAgICsrdmFsOworICBpZiAoc3RybmNhc2VjbXAg KHZhbCwgImRlZmF1bHQiLCA3KSA9PSAwKQogICAgIHsKLSAgICAgIGVudiArPSA3OworICAg ICAgdmFsICs9IDc7CiAgICAgICBuZXdfb2ZmbG9hZCA9IEdPTVBfVEFSR0VUX09GRkxPQURf REVGQVVMVDsKICAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChlbnYsICJtYW5kYXRv cnkiLCA5KSA9PSAwKQorICBlbHNlIGlmIChzdHJuY2FzZWNtcCAodmFsLCAibWFuZGF0b3J5 IiwgOSkgPT0gMCkKICAgICB7Ci0gICAgICBlbnYgKz0gOTsKKyAgICAgIHZhbCArPSA5Owog ICAgICAgbmV3X29mZmxvYWQgPSBHT01QX1RBUkdFVF9PRkZMT0FEX01BTkRBVE9SWTsKICAg ICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChlbnYsICJkaXNhYmxlZCIsIDgpID09IDAp CisgIGVsc2UgaWYgKHN0cm5jYXNlY21wICh2YWwsICJkaXNhYmxlZCIsIDgpID09IDApCiAg ICAgewotICAgICAgZW52ICs9IDg7CisgICAgICB2YWwgKz0gODsKICAgICAgIG5ld19vZmZs b2FkID0gR09NUF9UQVJHRVRfT0ZGTE9BRF9ESVNBQkxFRDsKICAgICB9Ci0gIHdoaWxlIChp c3NwYWNlICgodW5zaWduZWQgY2hhcikgKmVudikpCi0gICAgKytlbnY7Ci0gIGlmIChuZXdf b2ZmbG9hZCAhPSAtMSAmJiAqZW52ID09ICdcMCcpCisgIHdoaWxlIChpc3NwYWNlICgodW5z aWduZWQgY2hhcikgKnZhbCkpCisgICAgKyt2YWw7CisgIGlmIChuZXdfb2ZmbG9hZCAhPSAt MSAmJiAqdmFsID09ICdcMCcpCiAgICAgewotICAgICAgKm9mZmxvYWQgPSBuZXdfb2ZmbG9h ZDsKLSAgICAgIHJldHVybjsKKyAgICAgICooZW51bSBnb21wX3RhcmdldF9vZmZsb2FkX3Qg KikgcGFyYW1zWzBdID0gbmV3X29mZmxvYWQ7CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9 CiAKLSAgZ29tcF9lcnJvciAoIkludmFsaWQgdmFsdWUgZm9yIGVudmlyb25tZW50IHZhcmlh YmxlIE9NUF9UQVJHRVRfT0ZGTE9BRCIpOworICBwcmludF9lbnZfdmFyX2Vycm9yIChlbnYs IHZhbCk7CisgIHJldHVybiBmYWxzZTsKIH0KIAogLyogUGFyc2UgZW52aXJvbm1lbnQgdmFy aWFibGUgc2V0IHRvIGEgYm9vbGVhbiBvciBsaXN0IG9mIG9tcF9wcm9jX2JpbmRfdApAQCAt NDIzLDEwICs0NzcsMTEgQEAgcGFyc2VfdGFyZ2V0X29mZmxvYWQgKGNvbnN0IGNoYXIgKm5h bWUsIGVudW0gZ29tcF90YXJnZXRfb2ZmbG9hZF90ICpvZmZsb2FkKQogICAgcGFyc2VkLiAg Ki8KIAogc3RhdGljIGJvb2wKLXBhcnNlX2JpbmRfdmFyIChjb25zdCBjaGFyICpuYW1lLCBj aGFyICpwMXN0dmFsdWUsCi0JCWNoYXIgKipwdmFsdWVzLCB1bnNpZ25lZCBsb25nICpwbnZh bHVlcykKK3BhcnNlX2JpbmRfdmFyIChjb25zdCBjaGFyICplbnYsIGNvbnN0IGNoYXIgKnZh bCwgdm9pZCAqIGNvbnN0IHBhcmFtc1tdKQogewotICBjaGFyICplbnY7CisgIGNoYXIgKnAx c3R2YWx1ZSA9IChjaGFyICopIHBhcmFtc1swXTsKKyAgY2hhciAqKnB2YWx1ZXMgPSAoY2hh ciAqKikgcGFyYW1zWzFdOworICB1bnNpZ25lZCBsb25nICpwbnZhbHVlcyA9ICh1bnNpZ25l ZCBsb25nICopIHBhcmFtc1syXTsKICAgY2hhciB2YWx1ZSA9IG9tcF9wcm9jX2JpbmRfZmFs c2UsICp2YWx1ZXMgPSBOVUxMOwogICBpbnQgaTsKICAgc3RhdGljIHN0cnVjdCBwcm9jX2Jp bmRfa2luZHMKQEAgLTQ0NCwzMCArNDk5LDI5IEBAIHBhcnNlX2JpbmRfdmFyIChjb25zdCBj aGFyICpuYW1lLCBjaGFyICpwMXN0dmFsdWUsCiAgICAgeyAic3ByZWFkIiwgNiwgb21wX3By b2NfYmluZF9zcHJlYWQgfQogICB9OwogCi0gIGVudiA9IGdldGVudiAobmFtZSk7Ci0gIGlm IChlbnYgPT0gTlVMTCkKKyAgaWYgKHZhbCA9PSBOVUxMKQogICAgIHJldHVybiBmYWxzZTsK IAotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICplbnYpKQotICAgICsrZW52 OwotICBpZiAoKmVudiA9PSAnXDAnKQorICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNo YXIpICp2YWwpKQorICAgICsrdmFsOworICBpZiAoKnZhbCA9PSAnXDAnKQogICAgIGdvdG8g aW52YWxpZDsKIAogICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIGlmIChzdHJuY2Fz ZWNtcCAoZW52LCBraW5kc1tpXS5uYW1lLCBraW5kc1tpXS5sZW4pID09IDApCisgICAgaWYg KHN0cm5jYXNlY21wICh2YWwsIGtpbmRzW2ldLm5hbWUsIGtpbmRzW2ldLmxlbikgPT0gMCkK ICAgICAgIHsKIAl2YWx1ZSA9IGtpbmRzW2ldLmtpbmQ7Ci0JZW52ICs9IGtpbmRzW2ldLmxl bjsKKwl2YWwgKz0ga2luZHNbaV0ubGVuOwogCWJyZWFrOwogICAgICAgfQogICBpZiAoaSA9 PSA2KQogICAgIGdvdG8gaW52YWxpZDsKIAotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVk IGNoYXIpICplbnYpKQotICAgICsrZW52OwotICBpZiAoKmVudiAhPSAnXDAnKQorICB3aGls ZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICp2YWwpKQorICAgICsrdmFsOworICBpZiAo KnZhbCAhPSAnXDAnKQogICAgIHsKLSAgICAgIGlmICgqZW52ID09ICcsJykKKyAgICAgIGlm ICgqdmFsID09ICcsJykKIAl7CiAJICB1bnNpZ25lZCBsb25nIG52YWx1ZXMgPSAwLCBuYWxs b2NlZCA9IDA7CiAKQEAgLTQ3Nyw3ICs1MzEsNyBAQCBwYXJzZV9iaW5kX3ZhciAoY29uc3Qg Y2hhciAqbmFtZSwgY2hhciAqcDFzdHZhbHVlLAogCiAJICBkbwogCSAgICB7Ci0JICAgICAg ZW52Kys7CisJICAgICAgdmFsKys7CiAJICAgICAgaWYgKG52YWx1ZXMgPT0gbmFsbG9jZWQp CiAJCXsKIAkJICBjaGFyICpuOwpAQCAtNDg2LDYgKzU0MCw5IEBAIHBhcnNlX2JpbmRfdmFy IChjb25zdCBjaGFyICpuYW1lLCBjaGFyICpwMXN0dmFsdWUsCiAJCSAgaWYgKG4gPT0gTlVM TCkKIAkJICAgIHsKIAkJICAgICAgZnJlZSAodmFsdWVzKTsKKwkJICAgICAgY2hhciBuYW1l W3ZhbCAtIGVudl07CisJCSAgICAgIG1lbWNweSAobmFtZSwgZW52LCB2YWwgLSBlbnYgLSAx KTsKKwkJICAgICAgbmFtZVt2YWwgLSBlbnYgLSAxXSA9ICdcMCc7CiAJCSAgICAgIGdvbXBf ZXJyb3IgKCJPdXQgb2YgbWVtb3J5IHdoaWxlIHRyeWluZyB0byBwYXJzZSIKIAkJCQkgICIg ZW52aXJvbm1lbnQgdmFyaWFibGUgJXMiLCBuYW1lKTsKIAkJICAgICAgcmV0dXJuIGZhbHNl OwpAQCAtNDk1LDI3ICs1NTIsMjcgQEAgcGFyc2VfYmluZF92YXIgKGNvbnN0IGNoYXIgKm5h bWUsIGNoYXIgKnAxc3R2YWx1ZSwKIAkJICAgIHZhbHVlc1tudmFsdWVzKytdID0gdmFsdWU7 CiAJCX0KIAotCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmVudikp Ci0JCSsrZW52OwotCSAgICAgIGlmICgqZW52ID09ICdcMCcpCisJICAgICAgd2hpbGUgKGlz c3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKwkJKyt2YWw7CisJICAgICAgaWYgKCp2 YWwgPT0gJ1wwJykKIAkJZ290byBpbnZhbGlkOwogCiAJICAgICAgZm9yIChpID0gMjsgaSA8 IDY7IGkrKykKLQkJaWYgKHN0cm5jYXNlY21wIChlbnYsIGtpbmRzW2ldLm5hbWUsIGtpbmRz W2ldLmxlbikgPT0gMCkKKwkJaWYgKHN0cm5jYXNlY21wICh2YWwsIGtpbmRzW2ldLm5hbWUs IGtpbmRzW2ldLmxlbikgPT0gMCkKIAkJICB7CiAJCSAgICB2YWx1ZSA9IGtpbmRzW2ldLmtp bmQ7Ci0JCSAgICBlbnYgKz0ga2luZHNbaV0ubGVuOworCQkgICAgdmFsICs9IGtpbmRzW2ld LmxlbjsKIAkJICAgIGJyZWFrOwogCQkgIH0KIAkgICAgICBpZiAoaSA9PSA2KQogCQlnb3Rv IGludmFsaWQ7CiAKIAkgICAgICB2YWx1ZXNbbnZhbHVlcysrXSA9IHZhbHVlOwotCSAgICAg IHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmVudikpCi0JCSsrZW52OwotCSAg ICAgIGlmICgqZW52ID09ICdcMCcpCisJICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25l ZCBjaGFyKSAqdmFsKSkKKwkJKyt2YWw7CisJICAgICAgaWYgKCp2YWwgPT0gJ1wwJykKIAkJ YnJlYWs7Ci0JICAgICAgaWYgKCplbnYgIT0gJywnKQorCSAgICAgIGlmICgqdmFsICE9ICcs JykKIAkJZ290byBpbnZhbGlkOwogCSAgICB9CiAJICB3aGlsZSAoMSk7CkBAIC01MzIsNyAr NTg5LDcgQEAgcGFyc2VfYmluZF92YXIgKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKnAxc3R2 YWx1ZSwKIAogIGludmFsaWQ6CiAgIGZyZWUgKHZhbHVlcyk7Ci0gIGdvbXBfZXJyb3IgKCJJ bnZhbGlkIHZhbHVlIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSAlcyIsIG5hbWUpOworICBw cmludF9lbnZfdmFyX2Vycm9yIChlbnYsIHZhbCk7CiAgIHJldHVybiBmYWxzZTsKIH0KIApA QCAtODY1LDIzICs5MjIsMjIgQEAgcGFyc2VfcGxhY2VzX3ZhciAoY29uc3QgY2hhciAqbmFt ZSwgYm9vbCBpZ25vcmUpCiAgICBwcmVzZW50IGFuZCBpdCB3YXMgc3VjY2Vzc2Z1bGx5IHBh cnNlZC4gICovCiAKIHN0YXRpYyBib29sCi1wYXJzZV9zdGFja3NpemUgKGNvbnN0IGNoYXIg Km5hbWUsIHVuc2lnbmVkIGxvbmcgKnB2YWx1ZSkKK3BhcnNlX3N0YWNrc2l6ZSAoY29uc3Qg Y2hhciAqZW52LCBjb25zdCBjaGFyICp2YWwsIHZvaWQgKiBjb25zdCBwYXJhbXNbXSkKIHsK LSAgY2hhciAqZW52LCAqZW5kOworICBjaGFyICplbmQ7CiAgIHVuc2lnbmVkIGxvbmcgdmFs dWUsIHNoaWZ0ID0gMTA7CiAKLSAgZW52ID0gZ2V0ZW52IChuYW1lKTsKLSAgaWYgKGVudiA9 PSBOVUxMKQorICBpZiAodmFsID09IE5VTEwpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIHdo aWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmVudikpCi0gICAgKytlbnY7Ci0gIGlm ICgqZW52ID09ICdcMCcpCisgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZh bCkpCisgICAgKyt2YWw7CisgIGlmICgqdmFsID09ICdcMCcpCiAgICAgZ290byBpbnZhbGlk OwogCiAgIGVycm5vID0gMDsKLSAgdmFsdWUgPSBzdHJ0b3VsIChlbnYsICZlbmQsIDEwKTsK LSAgaWYgKGVycm5vIHx8IGVuZCA9PSBlbnYpCisgIHZhbHVlID0gc3RydG91bCAodmFsLCAm ZW5kLCAxMCk7CisgIGlmIChlcnJubyB8fCBlbmQgPT0gdmFsKQogICAgIGdvdG8gaW52YWxp ZDsKIAogICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICplbmQpKQpAQCAtOTE0 LDExICs5NzAsMTEgQEAgcGFyc2Vfc3RhY2tzaXplIChjb25zdCBjaGFyICpuYW1lLCB1bnNp Z25lZCBsb25nICpwdmFsdWUpCiAgIGlmICgoKHZhbHVlIDw8IHNoaWZ0KSA+PiBzaGlmdCkg IT0gdmFsdWUpCiAgICAgZ290byBpbnZhbGlkOwogCi0gICpwdmFsdWUgPSB2YWx1ZSA8PCBz aGlmdDsKKyAgKih1bnNpZ25lZCBsb25nICopIHBhcmFtc1swXSA9IHZhbHVlIDw8IHNoaWZ0 OwogICByZXR1cm4gdHJ1ZTsKIAogIGludmFsaWQ6Ci0gIGdvbXBfZXJyb3IgKCJJbnZhbGlk IHZhbHVlIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSAlcyIsIG5hbWUpOworICBwcmludF9l bnZfdmFyX2Vycm9yIChlbnYsIHZhbCk7CiAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtOTk4 LDM1ICsxMDU0LDMzIEBAIHBhcnNlX3NwaW5jb3VudCAoY29uc3QgY2hhciAqbmFtZSwgdW5z aWduZWQgbG9uZyBsb25nICpwdmFsdWUpCiAvKiBQYXJzZSBhIGJvb2xlYW4gdmFsdWUgZm9y IGVudmlyb25tZW50IHZhcmlhYmxlIE5BTUUgYW5kIHN0b3JlIHRoZQogICAgcmVzdWx0IGlu IFZBTFVFLiAgUmV0dXJuIHRydWUgaWYgb25lIHdhcyBwcmVzZW50IGFuZCBpdCB3YXMKICAg IHN1Y2Nlc3NmdWxseSBwYXJzZWQuICAqLwotCiBzdGF0aWMgYm9vbAotcGFyc2VfYm9vbGVh biAoY29uc3QgY2hhciAqbmFtZSwgYm9vbCAqdmFsdWUpCitwYXJzZV9ib29sZWFuIChjb25z dCBjaGFyICplbnYsIGNvbnN0IGNoYXIgKnZhbCwgdm9pZCAqIGNvbnN0IHBhcmFtc1tdKQog ewotICBjb25zdCBjaGFyICplbnY7CisgIGJvb2wgKnZhbHVlID0gKGJvb2wgKikgcGFyYW1z WzBdOwogCi0gIGVudiA9IGdldGVudiAobmFtZSk7Ci0gIGlmIChlbnYgPT0gTlVMTCkKKyAg aWYgKHZhbCA9PSBOVUxMKQogICAgIHJldHVybiBmYWxzZTsKIAotICB3aGlsZSAoaXNzcGFj ZSAoKHVuc2lnbmVkIGNoYXIpICplbnYpKQotICAgICsrZW52OwotICBpZiAoc3RybmNhc2Vj bXAgKGVudiwgInRydWUiLCA0KSA9PSAwKQorICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVk IGNoYXIpICp2YWwpKQorICAgICsrdmFsOworICBpZiAoc3RybmNhc2VjbXAgKHZhbCwgInRy dWUiLCA0KSA9PSAwKQogICAgIHsKICAgICAgICp2YWx1ZSA9IHRydWU7Ci0gICAgICBlbnYg Kz0gNDsKKyAgICAgIHZhbCArPSA0OwogICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAg KGVudiwgImZhbHNlIiwgNSkgPT0gMCkKKyAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHZhbCwg ImZhbHNlIiwgNSkgPT0gMCkKICAgICB7CiAgICAgICAqdmFsdWUgPSBmYWxzZTsKLSAgICAg IGVudiArPSA1OworICAgICAgdmFsICs9IDU7CiAgICAgfQogICBlbHNlCi0gICAgZW52ID0g IlgiOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICplbnYpKQotICAgICsr ZW52OwotICBpZiAoKmVudiAhPSAnXDAnKQorICAgIHZhbCA9ICJYIjsKKyAgd2hpbGUgKGlz c3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKyAgICArK3ZhbDsKKyAgaWYgKCp2YWwg IT0gJ1wwJykKICAgICB7Ci0gICAgICBnb21wX2Vycm9yICgiSW52YWxpZCB2YWx1ZSBmb3Ig ZW52aXJvbm1lbnQgdmFyaWFibGUgJXMiLCBuYW1lKTsKKyAgICAgIHByaW50X2Vudl92YXJf ZXJyb3IgKGVudiwgdmFsKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIHJldHVy biB0cnVlOwpAQCAtMTAzNCwzNiArMTA4OCw0MiBAQCBwYXJzZV9ib29sZWFuIChjb25zdCBj aGFyICpuYW1lLCBib29sICp2YWx1ZSkKIAogLyogUGFyc2UgdGhlIE9NUF9XQUlUX1BPTElD WSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4gICovCiAKLXN0 YXRpYyBpbnQKLXBhcnNlX3dhaXRfcG9saWN5ICh2b2lkKQorc3RhdGljIGJvb2wKK3BhcnNl X3dhaXRfcG9saWN5IChjb25zdCBjaGFyICplbnYsIGNvbnN0IGNoYXIgKnZhbCwgdm9pZCAq IGNvbnN0IHBhcmFtc1tdKQogewotICBjb25zdCBjaGFyICplbnY7CisgIGludCAqcHZhbHVl ID0gKGludCAqKSBwYXJhbXNbMF07CiAgIGludCByZXQgPSAtMTsKIAotICBlbnYgPSBnZXRl bnYgKCJPTVBfV0FJVF9QT0xJQ1kiKTsKLSAgaWYgKGVudiA9PSBOVUxMKQotICAgIHJldHVy biAtMTsKKyAgaWYgKHZhbCA9PSBOVUxMKQorICB7CisgICAgKnB2YWx1ZSA9IC0xOworICAg IHJldHVybiBmYWxzZTsKKyAgfQogCi0gIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hh cikgKmVudikpCi0gICAgKytlbnY7Ci0gIGlmIChzdHJuY2FzZWNtcCAoZW52LCAiYWN0aXZl IiwgNikgPT0gMCkKKyAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkK KyAgICArK3ZhbDsKKyAgaWYgKHN0cm5jYXNlY21wICh2YWwsICJhY3RpdmUiLCA2KSA9PSAw KQogICAgIHsKICAgICAgIHJldCA9IDE7Ci0gICAgICBlbnYgKz0gNjsKKyAgICAgIHZhbCAr PSA2OwogICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGVudiwgInBhc3NpdmUiLCA3 KSA9PSAwKQorICBlbHNlIGlmIChzdHJuY2FzZWNtcCAodmFsLCAicGFzc2l2ZSIsIDcpID09 IDApCiAgICAgewogICAgICAgcmV0ID0gMDsKLSAgICAgIGVudiArPSA3OworICAgICAgdmFs ICs9IDc7CiAgICAgfQogICBlbHNlCi0gICAgZW52ID0gIlgiOwotICB3aGlsZSAoaXNzcGFj ZSAoKHVuc2lnbmVkIGNoYXIpICplbnYpKQotICAgICsrZW52OwotICBpZiAoKmVudiA9PSAn XDAnKQotICAgIHJldHVybiByZXQ7Ci0gIGdvbXBfZXJyb3IgKCJJbnZhbGlkIHZhbHVlIGZv ciBlbnZpcm9ubWVudCB2YXJpYWJsZSBPTVBfV0FJVF9QT0xJQ1kiKTsKLSAgcmV0dXJuIC0x OworICAgIHZhbCA9ICJYIjsKKyAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAq dmFsKSkKKyAgICArK3ZhbDsKKyAgaWYgKCp2YWwgPT0gJ1wwJykKKyAgICB7CisgICAgICAq cHZhbHVlID0gcmV0OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICBwcmludF9lbnZf dmFyX2Vycm9yIChlbnYsIHZhbCk7CisgICpwdmFsdWUgPSAtMTsKKyAgcmV0dXJuIGZhbHNl OwogfQogCiAvKiBQYXJzZSB0aGUgR09NUF9DUFVfQUZGSU5JVFkgZW52aXJvbm1lbnQgdmFy aWJsZS4gIFJldHVybiB0cnVlIGlmIG9uZSB3YXMKQEAgLTExNjcsMjYgKzEyMjcsMjQgQEAg cGFyc2VfYWZmaW5pdHkgKGJvb2wgaWdub3JlKQogfQogCiAvKiBQYXJzZSB0aGUgT01QX0FM TE9DQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4gICov Ci0KLXN0YXRpYyB1aW50cHRyX3QKLXBhcnNlX2FsbG9jYXRvciAodm9pZCkKK3N0YXRpYyBi b29sCitwYXJzZV9hbGxvY2F0b3IgKGNvbnN0IGNoYXIgKmVudiwgY29uc3QgY2hhciAqdmFs LCB2b2lkICogY29uc3QgcGFyYW1zW10pCiB7Ci0gIGNvbnN0IGNoYXIgKmVudjsKLSAgdWlu dHB0cl90IHJldCA9IG9tcF9kZWZhdWx0X21lbV9hbGxvYzsKKyAgdWludHB0cl90ICpyZXQg PSAodWludHB0cl90ICopIHBhcmFtc1swXTsKKyAgKnJldCA9IG9tcF9kZWZhdWx0X21lbV9h bGxvYzsKIAotICBlbnYgPSBnZXRlbnYgKCJPTVBfQUxMT0NBVE9SIik7Ci0gIGlmIChlbnYg PT0gTlVMTCkKLSAgICByZXR1cm4gcmV0OworICBpZiAodmFsID09IE5VTEwpCisgICAgcmV0 dXJuIGZhbHNlOwogCi0gIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmVudikp Ci0gICAgKytlbnY7CisgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZhbCkp CisgICAgKyt2YWw7CiAgIGlmICgwKQogICAgIDsKICNkZWZpbmUgQyh2KSBcCi0gIGVsc2Ug aWYgKHN0cm5jYXNlY21wIChlbnYsICN2LCBzaXplb2YgKCN2KSAtIDEpID09IDApCVwKKyAg ZWxzZSBpZiAoc3RybmNhc2VjbXAgKHZhbCwgI3YsIHNpemVvZiAoI3YpIC0gMSkgPT0gMCkJ XAogICAgIHsJCQkJCQkJXAotICAgICAgcmV0ID0gdjsJCQkJCQlcCi0gICAgICBlbnYgKz0g c2l6ZW9mICgjdikgLSAxOwkJCQlcCisgICAgICAqcmV0ID0gdjsJCQkJCQlcCisgICAgICB2 YWwgKz0gc2l6ZW9mICgjdikgLSAxOwkJCQlcCiAgICAgfQogICBDIChvbXBfZGVmYXVsdF9t ZW1fYWxsb2MpCiAgIEMgKG9tcF9sYXJnZV9jYXBfbWVtX2FsbG9jKQpAQCAtMTE5OCwxMyAr MTI1NiwxNCBAQCBwYXJzZV9hbGxvY2F0b3IgKHZvaWQpCiAgIEMgKG9tcF90aHJlYWRfbWVt X2FsbG9jKQogI3VuZGVmIEMKICAgZWxzZQotICAgIGVudiA9ICJYIjsKLSAgd2hpbGUgKGlz c3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqZW52KSkKLSAgICArK2VudjsKLSAgaWYgKCplbnYg PT0gJ1wwJykKLSAgICByZXR1cm4gcmV0OwotICBnb21wX2Vycm9yICgiSW52YWxpZCB2YWx1 ZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgT01QX0FMTE9DQVRPUiIpOwotICByZXR1cm4g b21wX2RlZmF1bHRfbWVtX2FsbG9jOworICAgIHZhbCA9ICJYIjsKKyAgd2hpbGUgKGlzc3Bh Y2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKyAgICArK3ZhbDsKKyAgaWYgKCp2YWwgPT0g J1wwJykKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcHJpbnRfZW52X3Zhcl9lcnJvciAoZW52LCB2 YWwpOworICAqcmV0ID0gb21wX2RlZmF1bHRfbWVtX2FsbG9jOworICByZXR1cm4gZmFsc2U7 CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMjUxLDYyICsxMzEwLDU5IEBAIHBhcnNlX2dvbXBf b3BlbmFjY19kaW0gKHZvaWQpCiAgICAgfQogfQogCi12b2lkCi1vbXBfZGlzcGxheV9lbnYg KGludCB2ZXJib3NlKQotewotICBpbnQgaTsKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3Igb21w X2Rpc3BsYXlfZW52IHdoaWNoIHByaW50cyB0aGUgdmFsdWVzIG9mIHJ1bl9zY2hlZF92YXIu CisgICAnZGV2aWNlJyBjYW4gYmUgJ2hvc3QnLCAnZGV2JywgJ2FsbCcgb3IgYSBwYXJ0aWN1 bGFyIGRldmljZSBudW1iZXIuICAqLwogCi0gIGZwdXRzICgiXG5PUEVOTVAgRElTUExBWSBF TlZJUk9OTUVOVCBCRUdJTlxuIiwgc3RkZXJyKTsKLQotICBmcHV0cyAoIiAgX09QRU5NUCA9 ICcyMDE1MTEnXG4iLCBzdGRlcnIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgIE9NUF9EWU5B TUlDID0gJyVzJ1xuIiwKLQkgICBnb21wX2dsb2JhbF9pY3YuZHluX3ZhciA/ICJUUlVFIiA6 ICJGQUxTRSIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgIE9NUF9ORVNURUQgPSAnJXMnXG4i LAotCSAgIGdvbXBfZ2xvYmFsX2ljdi5tYXhfYWN0aXZlX2xldmVsc192YXIgPiAxID8gIlRS VUUiIDogIkZBTFNFIik7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiICBPTVBfTlVNX1RIUkVB RFMgPSAnJWx1IiwgZ29tcF9nbG9iYWxfaWN2Lm50aHJlYWRzX3Zhcik7Ci0gIGZvciAoaSA9 IDE7IGkgPCBnb21wX250aHJlYWRzX3Zhcl9saXN0X2xlbjsgaSsrKQotICAgIGZwcmludGYg KHN0ZGVyciwgIiwlbHUiLCBnb21wX250aHJlYWRzX3Zhcl9saXN0W2ldKTsKLSAgZnB1dHMg KCInXG4iLCBzdGRlcnIpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIiAgT01QX1NDSEVEVUxF ID0gJyIpOwotICBpZiAoKGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfdmFyICYgR0ZTX01P Tk9UT05JQykpCitzdGF0aWMgdm9pZAorcHJpbnRfc2NoZWR1bGUgKGVudW0gZ29tcF9zY2hl ZHVsZV90eXBlIHJ1bl9zY2hlZF92YXIsIGludCBydW5fc2NoZWRfY2h1bmtfc2l6ZSwKKwkJ Y29uc3QgY2hhciAqZGV2aWNlKQoreworICBmcHJpbnRmIChzdGRlcnIsICIgIFslc10gT01Q X1NDSEVEVUxFID0gJyIsIGRldmljZSk7CisgIGlmICgocnVuX3NjaGVkX3ZhciAmIEdGU19N T05PVE9OSUMpKQogICAgIHsKLSAgICAgIGlmIChnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVk X3ZhciAhPSAoR0ZTX01PTk9UT05JQyB8IEdGU19TVEFUSUMpKQorICAgICAgaWYgKHJ1bl9z Y2hlZF92YXIgIT0gKEdGU19NT05PVE9OSUMgfCBHRlNfU1RBVElDKSkKIAlmcHV0cyAoIk1P Tk9UT05JQzoiLCBzdGRlcnIpOwogICAgIH0KLSAgZWxzZSBpZiAoZ29tcF9nbG9iYWxfaWN2 LnJ1bl9zY2hlZF92YXIgPT0gR0ZTX1NUQVRJQykKKyAgZWxzZSBpZiAocnVuX3NjaGVkX3Zh ciA9PSBHRlNfU1RBVElDKQogICAgIGZwdXRzICgiTk9OTU9OT1RPTklDOiIsIHN0ZGVycik7 Ci0gIHN3aXRjaCAoZ29tcF9nbG9iYWxfaWN2LnJ1bl9zY2hlZF92YXIgJiB+R0ZTX01PTk9U T05JQykKKyAgc3dpdGNoIChydW5fc2NoZWRfdmFyICYgfkdGU19NT05PVE9OSUMpCiAgICAg ewogICAgIGNhc2UgR0ZTX1JVTlRJTUU6CiAgICAgICBmcHV0cyAoIlJVTlRJTUUiLCBzdGRl cnIpOwotICAgICAgaWYgKGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfY2h1bmtfc2l6ZSAh PSAxKQotCWZwcmludGYgKHN0ZGVyciwgIiwlZCIsIGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2No ZWRfY2h1bmtfc2l6ZSk7CisgICAgICBpZiAocnVuX3NjaGVkX2NodW5rX3NpemUgIT0gMSkK KwlmcHJpbnRmIChzdGRlcnIsICIsJWQiLCBydW5fc2NoZWRfY2h1bmtfc2l6ZSk7CiAgICAg ICBicmVhazsKICAgICBjYXNlIEdGU19TVEFUSUM6CiAgICAgICBmcHV0cyAoIlNUQVRJQyIs IHN0ZGVycik7Ci0gICAgICBpZiAoZ29tcF9nbG9iYWxfaWN2LnJ1bl9zY2hlZF9jaHVua19z aXplICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiLCVkIiwgZ29tcF9nbG9iYWxfaWN2LnJ1 bl9zY2hlZF9jaHVua19zaXplKTsKKyAgICAgIGlmIChydW5fc2NoZWRfY2h1bmtfc2l6ZSAh PSAwKQorCWZwcmludGYgKHN0ZGVyciwgIiwlZCIsIHJ1bl9zY2hlZF9jaHVua19zaXplKTsK ICAgICAgIGJyZWFrOwogICAgIGNhc2UgR0ZTX0RZTkFNSUM6CiAgICAgICBmcHV0cyAoIkRZ TkFNSUMiLCBzdGRlcnIpOwotICAgICAgaWYgKGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRf Y2h1bmtfc2l6ZSAhPSAxKQotCWZwcmludGYgKHN0ZGVyciwgIiwlZCIsIGdvbXBfZ2xvYmFs X2ljdi5ydW5fc2NoZWRfY2h1bmtfc2l6ZSk7CisgICAgICBpZiAocnVuX3NjaGVkX2NodW5r X3NpemUgIT0gMSkKKwlmcHJpbnRmIChzdGRlcnIsICIsJWQiLCBydW5fc2NoZWRfY2h1bmtf c2l6ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIEdGU19HVUlERUQ6CiAgICAgICBmcHV0 cyAoIkdVSURFRCIsIHN0ZGVycik7Ci0gICAgICBpZiAoZ29tcF9nbG9iYWxfaWN2LnJ1bl9z Y2hlZF9jaHVua19zaXplICE9IDEpCi0JZnByaW50ZiAoc3RkZXJyLCAiLCVkIiwgZ29tcF9n bG9iYWxfaWN2LnJ1bl9zY2hlZF9jaHVua19zaXplKTsKKyAgICAgIGlmIChydW5fc2NoZWRf Y2h1bmtfc2l6ZSAhPSAxKQorCWZwcmludGYgKHN0ZGVyciwgIiwlZCIsIHJ1bl9zY2hlZF9j aHVua19zaXplKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgR0ZTX0FVVE86CiAgICAgICBm cHV0cyAoIkFVVE8iLCBzdGRlcnIpOwogICAgICAgYnJlYWs7CiAgICAgfQogICBmcHV0cyAo IidcbiIsIHN0ZGVycik7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3Igb21wX2Rpc3Bs YXlfZW52IHdoaWNoIHByaW50cyB0aGUgdmFsdWVzIG9mIHByb2NfYmluZF92YXIuCisgICAn ZGV2aWNlJyBjYW4gYmUgJ2hvc3QnLCAnZGV2JywgJ2FsbCcsIG9yIGEgcGFydGljdWxhciBk ZXZpY2UgbnVtYmVyLiAgKi8KIAotICBmcHV0cyAoIiAgT01QX1BST0NfQklORCA9ICciLCBz dGRlcnIpOwotICBzd2l0Y2ggKGdvbXBfZ2xvYmFsX2ljdi5iaW5kX3ZhcikKK3N0YXRpYyB2 b2lkCitwcmludF9wcm9jX2JpbmQgKGNoYXIgcHJvY19iaW5kX3ZhciwgdW5zaWduZWQgbG9u ZyBsZW4sIGNoYXIgKipsaXN0LAorCQkgY29uc3QgY2hhciAqZGV2aWNlKQoreworICBmcHJp bnRmIChzdGRlcnIsICIgIFslc10gT01QX1BST0NfQklORCA9ICciLCBkZXZpY2UpOworICBz d2l0Y2ggKHByb2NfYmluZF92YXIpCiAgICAgewogICAgIGNhc2Ugb21wX3Byb2NfYmluZF9m YWxzZToKICAgICAgIGZwdXRzICgiRkFMU0UiLCBzdGRlcnIpOwpAQCAtMTMyNCw4ICsxMzgw LDggQEAgb21wX2Rpc3BsYXlfZW52IChpbnQgdmVyYm9zZSkKICAgICAgIGZwdXRzICgiU1BS RUFEIiwgc3RkZXJyKTsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgZm9yIChpID0gMTsgaSA8 IGdvbXBfYmluZF92YXJfbGlzdF9sZW47IGkrKykKLSAgICBzd2l0Y2ggKGdvbXBfYmluZF92 YXJfbGlzdFtpXSkKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykKKyAgICBzd2l0 Y2ggKCgqbGlzdClbaV0pCiAgICAgICB7CiAgICAgICBjYXNlIG9tcF9wcm9jX2JpbmRfbWFz dGVyOgogCWZwdXRzICgiLE1BU1RFUiIsIHN0ZGVycik7IC8qIFRPRE86IENoYW5nZSB0byBQ UklNQVJZIGZvciBPcGVuTVAgNS4xLiAqLwpAQCAtMTMzOCw3ICsxMzk0LDI4NCBAQCBvbXBf ZGlzcGxheV9lbnYgKGludCB2ZXJib3NlKQogCWJyZWFrOwogICAgICAgfQogICBmcHV0cyAo IidcbiIsIHN0ZGVycik7Ci0gIGZwdXRzICgiICBPTVBfUExBQ0VTID0gJyIsIHN0ZGVycik7 Cit9CisKK2VudW0gZ29tcF9wYXJzZV90eXBlCit7CisgIFBBUlNFX0lOVCA9IDEsCisgIFBB UlNFX0JPT0wgPSAyLAorICBQQVJTRV9VSU5UID0gMywKKyAgUEFSU0VfVUxPTkcgPSA0LAor ICBQQVJTRV9DSEFSID0gNSwKKyAgUEFSU0VfVUNIQVIgPSA2Cit9OworCisvKiBUaGUgZm9s bG93aW5nIHRhYmxlIGNvbnRhaW5zIGl0ZW1zIHRoYXQgaGVscCBwYXJzaW5nIGVudmlyb25t ZW50IHZhcmlhYmxlcworICAgYW5kIGZpbGwgY29ycmVzcG9uZGluZyBJQ1ZzIHdpdGggdmFs dWVzLiAgRkxBR19WQVJTIGNvbnRhaW4gYWxsIElDVlMgd2hpY2gKKyAgIGFyZSBhZmZlY3Rl ZCBieSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuICBGTEFHUyBkZXRlcm1pbmUgd2hhdCB2 YXJpYW50IG9mCisgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBhbGxvd2VkLiAgKi8KKwor I2RlZmluZSBFTlRSWShOQU1FKSBOQU1FLCBzaXplb2YgKE5BTUUpIC0gMQorc3RhdGljIGNv bnN0IHN0cnVjdCBlbnZ2YXIKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IG5hbWVf bGVuOworICB1aW50OF90IGZsYWdfdmFyc1szXTsKKyAgdWludDhfdCBmbGFnOworICBib29s ICgqcGFyc2VfZnVuYykgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2b2lkICogY29u c3RbXSk7Cit9IGVudnZhcnNbXSA9IHsKKyAgeyBFTlRSWSAoIk9NUF9TQ0hFRFVMRSIpLAor ICAgIHsgR09NUF9JQ1ZfU0NIRURVTEUsIEdPTVBfSUNWX1NDSEVEVUxFX0NIVU5LX1NJWkUg fSwKKyAgICBHT01QX0VOVl9TVUZGSVhfREVWIHwgR09NUF9FTlZfU1VGRklYX0FMTCB8IEdP TVBfRU5WX1NVRkZJWF9ERVZfWCwKKyAgICAmcGFyc2Vfc2NoZWR1bGUgfSwKKyAgeyBFTlRS WSAoIk9NUF9OVU1fVEVBTVMiKSwKKyAgICB7IEdPTVBfSUNWX05URUFNUyB9LAorICAgIEdP TVBfRU5WX1NVRkZJWF9ERVYgfCBHT01QX0VOVl9TVUZGSVhfQUxMIHwgR09NUF9FTlZfU1VG RklYX0RFVl9YLAorICAgICZwYXJzZV9pbnQgfSwKKyAgeyBFTlRSWSAoIk9NUF9EWU5BTUlD IiksCisgICAgeyBHT01QX0lDVl9EWU5BTUlDIH0sCisgICAgR09NUF9FTlZfU1VGRklYX0RF ViB8IEdPTVBfRU5WX1NVRkZJWF9BTEwgfCBHT01QX0VOVl9TVUZGSVhfREVWX1gsCisgICAg JnBhcnNlX2Jvb2xlYW4gfSwKKyAgeyBFTlRSWSAoIk9NUF9URUFNU19USFJFQURfTElNSVQi KSwKKyAgICB7IEdPTVBfSUNWX1RFQU1TX1RIUkVBRF9MSU1JVCB9LAorICAgIEdPTVBfRU5W X1NVRkZJWF9ERVYgfCBHT01QX0VOVl9TVUZGSVhfQUxMIHwgR09NUF9FTlZfU1VGRklYX0RF Vl9YLAorICAgICZwYXJzZV9pbnQgfSwKKyAgeyBFTlRSWSAoIk9NUF9USFJFQURfTElNSVQi KSwKKyAgICB7IEdPTVBfSUNWX1RIUkVBRF9MSU1JVCB9LAorICAgIEdPTVBfRU5WX1NVRkZJ WF9ERVYgfCBHT01QX0VOVl9TVUZGSVhfQUxMIHwgR09NUF9FTlZfU1VGRklYX0RFVl9YLAor ICAgICZwYXJzZV91bnNpZ25lZF9sb25nIH0sCisgIHsgRU5UUlkgKCJPTVBfTlVNX1RIUkVB RFMiKSwKKyAgICB7IEdPTVBfSUNWX05USFJFQURTLCBHT01QX0lDVl9OVEhSRUFEU19MSVNU LCBHT01QX0lDVl9OVEhSRUFEU19MSVNUX0xFTiB9LAorICAgIEdPTVBfRU5WX1NVRkZJWF9E RVYgfCBHT01QX0VOVl9TVUZGSVhfQUxMIHwgR09NUF9FTlZfU1VGRklYX0RFVl9YLAorICAg ICZwYXJzZV91bnNpZ25lZF9sb25nX2xpc3QgfSwKKyAgeyBFTlRSWSAoIk9NUF9QUk9DX0JJ TkQiKSwKKyAgICB7IEdPTVBfSUNWX0JJTkQsIEdPTVBfSUNWX0JJTkRfTElTVCwgR09NUF9J Q1ZfQklORF9MSVNUX0xFTiB9LAorICAgIEdPTVBfRU5WX1NVRkZJWF9ERVYgfCBHT01QX0VO Vl9TVUZGSVhfQUxMIHwgR09NUF9FTlZfU1VGRklYX0RFVl9YLAorICAgICZwYXJzZV9iaW5k X3ZhciB9LAorICB7IEVOVFJZICgiT01QX01BWF9BQ1RJVkVfTEVWRUxTIiksCisgICAgeyBH T01QX0lDVl9NQVhfQUNUSVZFX0xFVkVMUyB9LAorICAgIEdPTVBfRU5WX1NVRkZJWF9ERVYg fCBHT01QX0VOVl9TVUZGSVhfQUxMIHwgR09NUF9FTlZfU1VGRklYX0RFVl9YLAorICAgICZw YXJzZV91bnNpZ25lZF9sb25nIH0sCisgIHsgRU5UUlkgKCJPTVBfV0FJVF9QT0xJQ1kiKSwK KyAgICB7IEdPTVBfSUNWX1dBSVRfUE9MSUNZIH0sCisgICAgR09NUF9FTlZfU1VGRklYX0RF ViB8IEdPTVBfRU5WX1NVRkZJWF9BTEwgfCBHT01QX0VOVl9TVUZGSVhfREVWX1gsCisgICAg JnBhcnNlX3dhaXRfcG9saWN5IH0sCisgIHsgRU5UUlkgKCJPTVBfU1RBQ0tTSVpFIiksCisg ICAgeyBHT01QX0lDVl9TVEFDS1NJWkUgfSwKKyAgICBHT01QX0VOVl9TVUZGSVhfREVWIHwg R09NUF9FTlZfU1VGRklYX0FMTCB8IEdPTVBfRU5WX1NVRkZJWF9ERVZfWCwKKyAgICAmcGFy c2Vfc3RhY2tzaXplIH0sCisgIHsgRU5UUlkgKCJPTVBfQ0FOQ0VMTEFUSU9OIiksIHsgR09N UF9JQ1ZfQ0FOQ0VMTEFUSU9OIH0sIDAsICZwYXJzZV9ib29sZWFuIH0sCisgIHsgRU5UUlkg KCJPTVBfRElTUExBWV9BRkZJTklUWSIpLCB7IEdPTVBfSUNWX0RJU1BMQVlfQUZGSU5JVFkg fSwgMCwKKyAgICAmcGFyc2VfYm9vbGVhbiB9LAorICB7IEVOVFJZICgiT01QX1RBUkdFVF9P RkZMT0FEIiksIHsgR09NUF9JQ1ZfVEFSR0VUX09GRkxPQUQgfSwgMCwKKyAgICAmcGFyc2Vf dGFyZ2V0X29mZmxvYWQgfSwKKyAgeyBFTlRSWSAoIk9NUF9NQVhfVEFTS19QUklPUklUWSIp LCB7IEdPTVBfSUNWX01BWF9UQVNLX1BSSU9SSVRZIH0sIDAsCisgICAgJnBhcnNlX2ludCB9 LAorICB7IEVOVFJZICgiT01QX0FMTE9DQVRPUiIpLCB7IEdPTVBfSUNWX0FMTE9DQVRPUiB9 LCAwLCAmcGFyc2VfYWxsb2NhdG9yIH0sCisgIHsgRU5UUlkgKCJPTVBfREVGQVVMVF9ERVZJ Q0UiKSwgeyBHT01QX0lDVl9ERUZBVUxUX0RFVklDRSB9LCAwLCAmcGFyc2VfaW50IH0KK307 CisjdW5kZWYgRU5UUlkKKyNkZWZpbmUgT01QX1ZBUl9DTlQgKHNpemVvZiAoZW52dmFycykg LyBzaXplb2YgKGVudnZhcnNbMF0pKQorCisvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIHVz ZWQgdG8gYXBwbHkgdGhlIGhpZXJhcmNoeSBvZiBJQ1YgdmFyaWFudHMgZm9yIGhvc3QKKyAg IHZhcmlhYmxlcywgZS5nLiBudGVhbXNfdmFyIGlzIHNldCB0byBPTVBfTlVNX1RFQU1TX0FM TCBpZiBPTVBfTlVNX1RFQU1TIGlzCisgICB1bmRlZmluZWQuICAqLworCitzdGF0aWMgY29u c3Qgc3RydWN0IGhvc3RfZW52dmFyCit7CisgIHVuc2lnbmVkIGNoYXIgZmxhZ192YXI7Cisg IHZvaWQgKmRlc3RbM107CisgIGludCB0eXBlX2NvZGU7Cit9IGhvc3RfZW52dmFyc1tdID0g eworICB7IEdPTVBfSUNWX05URUFNUywgeyAmZ29tcF9udGVhbXNfdmFyIH0sIFBBUlNFX0lO VCB9LAorICB7IEdPTVBfSUNWX0RZTkFNSUMsIHsgJmdvbXBfZ2xvYmFsX2ljdi5keW5fdmFy IH0sIFBBUlNFX0JPT0wgfSwKKyAgeyBHT01QX0lDVl9ERUZBVUxUX0RFVklDRSwgeyAmZ29t cF9nbG9iYWxfaWN2LmRlZmF1bHRfZGV2aWNlX3ZhciB9LAorICAgIFBBUlNFX0lOVCB9LAor ICB7IEdPTVBfSUNWX1RFQU1TX1RIUkVBRF9MSU1JVCwgeyAmZ29tcF90ZWFtc190aHJlYWRf bGltaXRfdmFyIH0sIFBBUlNFX0lOVCB9LAorICB7IEdPTVBfSUNWX1NDSEVEVUxFLAorICAg IHsgJmdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfdmFyLCAmZ29tcF9nbG9iYWxfaWN2LnJ1 bl9zY2hlZF9jaHVua19zaXplIH0sCisgICAgUEFSU0VfSU5UIH0sCisgIHsgR09NUF9JQ1Zf VEhSRUFEX0xJTUlULCB7ICZnb21wX2dsb2JhbF9pY3YudGhyZWFkX2xpbWl0X3ZhciB9LCBQ QVJTRV9VSU5UIH0sCisgIHsgR09NUF9JQ1ZfTlRIUkVBRFMsCisgICAgeyAmZ29tcF9nbG9i YWxfaWN2Lm50aHJlYWRzX3ZhciwgJmdvbXBfbnRocmVhZHNfdmFyX2xpc3QsCisgICAgICAm Z29tcF9udGhyZWFkc192YXJfbGlzdF9sZW4gfSwgUEFSU0VfVUxPTkcgfSwKKyAgeyBHT01Q X0lDVl9CSU5ELAorICAgIHsgJmdvbXBfZ2xvYmFsX2ljdi5iaW5kX3ZhciwgJmdvbXBfYmlu ZF92YXJfbGlzdCwgJmdvbXBfYmluZF92YXJfbGlzdF9sZW4gfSwKKyAgICBQQVJTRV9DSEFS IH0sCisgIHsgR09NUF9JQ1ZfTUFYX0FDVElWRV9MRVZFTFMsIHsgJmdvbXBfZ2xvYmFsX2lj di5tYXhfYWN0aXZlX2xldmVsc192YXIgfSwKKyAgICBQQVJTRV9VQ0hBUiB9LAorfTsKKyNk ZWZpbmUgT01QX0hPU1RfVkFSX0NOVCAoc2l6ZW9mIChob3N0X2VudnZhcnMpIC8gc2l6ZW9m IChob3N0X2VudnZhcnNbMF0pKQorCisjZGVmaW5lIElOVF9NQVhfU1RSX0xFTiAxMAorCiti b29sCitnb21wX2dldF9pY3ZfZmxhZyAodWludDMyX3QgdmFsdWUsIGVudW0gZ29tcF9pY3Zz IGljdikKK3sKKyAgcmV0dXJuIHZhbHVlICYgKDEgPDwgKGljdiAtIDEpKTsKK30KKworc3Rh dGljIHZvaWQKK2dvbXBfc2V0X2ljdl9mbGFnICh1aW50MzJfdCAqdmFsdWUsIGVudW0gZ29t cF9pY3ZzIGljdikKK3sKKyAgKnZhbHVlIHw9IDEgPDwgKGljdiAtIDEpOworfQorCitzdGF0 aWMgdm9pZAorcHJpbnRfZGV2aWNlX3NwZWNpZmljX2ljdnMgKGludCBpY3ZfY29kZSkKK3sK KyAgc3RydWN0IGdvbXBfaWN2X2xpc3QgKmxpc3QgPSBnb21wX2luaXRpYWxfaWN2X2xpc3Q7 CisgIGludCBpOworICBjaGFyIGRldl9udW1bSU5UX01BWF9TVFJfTEVOICsgMV07CisKKyAg d2hpbGUgKGxpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobGlzdC0+ZGV2aWNlX251 bSA8IDApCisJeworCSAgbGlzdCA9IGxpc3QtPm5leHQ7CisJICBjb250aW51ZTsKKwl9CisK KyAgICAgIHN3aXRjaCAoaWN2X2NvZGUpCisJeworCWNhc2UgR09NUF9JQ1ZfTlRFQU1TOgor CSAgaWYgKGdvbXBfZ2V0X2ljdl9mbGFnIChsaXN0LT5mbGFncywgR09NUF9JQ1ZfTlRFQU1T KSkKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbJWRdIE9NUF9OVU1fVEVBTVMgPSAnJWQn XG4iLAorCQkgICAgIGxpc3QtPmRldmljZV9udW0sIGxpc3QtPmljdnMubnRlYW1zX3Zhcik7 CisJICBicmVhazsKKwljYXNlIEdPTVBfSUNWX0RZTkFNSUM6CisJICBpZiAoZ29tcF9nZXRf aWN2X2ZsYWcgKGxpc3QtPmZsYWdzLCBHT01QX0lDVl9EWU5BTUlDKSkKKwkgICAgZnByaW50 ZiAoc3RkZXJyLCAiICBbJWRdIE9NUF9EWU5BTUlDID0gJyVzJ1xuIiwKKwkJICAgICBsaXN0 LT5kZXZpY2VfbnVtLCBsaXN0LT5pY3ZzLmR5bl92YXIgPyAiVFJVRSIgOiAiRkFMU0UiKTsK KwkgIGJyZWFrOworCWNhc2UgR09NUF9JQ1ZfVEVBTVNfVEhSRUFEX0xJTUlUOgorCSAgaWYg KGdvbXBfZ2V0X2ljdl9mbGFnIChsaXN0LT5mbGFncywgR09NUF9JQ1ZfVEVBTVNfVEhSRUFE X0xJTUlUKSkKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbJWRdIE9NUF9URUFNU19USFJF QURfTElNSVQgPSAnJXUnXG4iLAorCQkgICAgIGxpc3QtPmRldmljZV9udW0sIGxpc3QtPmlj dnMudGVhbXNfdGhyZWFkX2xpbWl0X3Zhcik7CisJICBicmVhazsKKwljYXNlIEdPTVBfSUNW X1NDSEVEVUxFOgorCSAgaWYgKCEoZ29tcF9nZXRfaWN2X2ZsYWcgKGxpc3QtPmZsYWdzLCBH T01QX0lDVl9TQ0hFRFVMRSkpKQorCSAgICBicmVhazsKKwkgIHNwcmludGYgKGRldl9udW0s ICIlZCIsIGxpc3QtPmRldmljZV9udW0pOworCSAgcHJpbnRfc2NoZWR1bGUgKGxpc3QtPmlj dnMucnVuX3NjaGVkX3ZhciwKKwkJCSAgbGlzdC0+aWN2cy5ydW5fc2NoZWRfY2h1bmtfc2l6 ZSwKKwkJCSAgZGV2X251bSk7CisJICBicmVhazsKKwljYXNlIEdPTVBfSUNWX1RIUkVBRF9M SU1JVDoKKwkgIGlmIChnb21wX2dldF9pY3ZfZmxhZyAobGlzdC0+ZmxhZ3MsIEdPTVBfSUNW X1RIUkVBRF9MSU1JVCkpCisJICAgIGZwcmludGYgKHN0ZGVyciwgIiAgWyVkXSBPTVBfVEhS RUFEX0xJTUlUID0gJyVkJ1xuIiwKKwkJICAgICBsaXN0LT5kZXZpY2VfbnVtLCBsaXN0LT5p Y3ZzLnRocmVhZF9saW1pdF92YXIpOworCSAgYnJlYWs7CisJY2FzZSBHT01QX0lDVl9OVEhS RUFEUzoKKwkgIGlmICghKGdvbXBfZ2V0X2ljdl9mbGFnIChsaXN0LT5mbGFncywgR09NUF9J Q1ZfTlRIUkVBRFMpKSkKKwkgICAgYnJlYWs7CisJICBmcHJpbnRmIChzdGRlcnIsICIgIFsl ZF0gT01QX05VTV9USFJFQURTID0gJyVsdSIsIGxpc3QtPmRldmljZV9udW0sCisJCSAgIGxp c3QtPmljdnMubnRocmVhZHNfdmFyKTsKKwkgIGZvciAoaSA9IDE7IGkgPCBsaXN0LT5pY3Zz Lm50aHJlYWRzX3Zhcl9saXN0X2xlbjsgaSsrKQorCSAgICBmcHJpbnRmIChzdGRlcnIsICIs JWx1IiwgbGlzdC0+aWN2cy5udGhyZWFkc192YXJfbGlzdFtpXSk7CisJICBmcHV0cyAoIidc biIsIHN0ZGVycik7CisJICBicmVhazsKKwljYXNlIEdPTVBfSUNWX01BWF9BQ1RJVkVfTEVW RUxTOgorCSAgZnByaW50ZiAoc3RkZXJyLCAiICBbJWRdIE9NUF9NQVhfQUNUSVZFX0xFVkVM UyA9ICcldSdcbiIsCisJCSAgIGxpc3QtPmRldmljZV9udW0sIGxpc3QtPmljdnMubWF4X2Fj dGl2ZV9sZXZlbHNfdmFyKTsKKwkgIGJyZWFrOworCWNhc2UgR09NUF9JQ1ZfQklORDoKKwkg IGlmICghKGdvbXBfZ2V0X2ljdl9mbGFnIChsaXN0LT5mbGFncywgR09NUF9JQ1ZfQklORCkp KQorCSAgICBicmVhazsKKwkgIHNwcmludGYgKGRldl9udW0sICIlZCIsIGxpc3QtPmRldmlj ZV9udW0pOworCSAgcHJpbnRfcHJvY19iaW5kIChsaXN0LT5pY3ZzLmJpbmRfdmFyLCBsaXN0 LT5pY3ZzLmJpbmRfdmFyX2xpc3RfbGVuLAorCQkJICAgJmxpc3QtPmljdnMuYmluZF92YXJf bGlzdCwgZGV2X251bSk7CisJICBicmVhazsKKwljYXNlIEdPTVBfSUNWX1dBSVRfUE9MSUNZ OgorCSAgaWYgKGdvbXBfZ2V0X2ljdl9mbGFnIChsaXN0LT5mbGFncywgR09NUF9JQ1ZfV0FJ VF9QT0xJQ1kpKQorCSAgICBmcHJpbnRmIChzdGRlcnIsICIgIFslZF0gT01QX1dBSVRfUE9M SUNZID0gJyVzJ1xuIiwKKwkJICAgICBsaXN0LT5kZXZpY2VfbnVtLAorCQkgICAgIGxpc3Qt PmljdnMud2FpdF9wb2xpY3kgPiAwID8gIkFDVElWRSIgOiAiUEFTU0lWRSIpOworCSAgYnJl YWs7CisJY2FzZSBHT01QX0lDVl9TVEFDS1NJWkU6CisJICBpZiAoZ29tcF9nZXRfaWN2X2Zs YWcgKGxpc3QtPmZsYWdzLCBHT01QX0lDVl9TVEFDS1NJWkUpKQorCSAgICBmcHJpbnRmIChz dGRlcnIsICIgIFslZF0gT01QX1NUQUNLU0laRSA9ICclbHUnXG4iLAorCQkgICAgIGxpc3Qt PmRldmljZV9udW0sIGxpc3QtPmljdnMuc3RhY2tzaXplKTsKKwkgIGJyZWFrOworCX0KKyAg ICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KK30KKwordm9pZAorb21wX2Rpc3BsYXlf ZW52IChpbnQgdmVyYm9zZSkKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBnb21wX2ljdl9saXN0 ICpkZXYgPSBnb21wX2dldF9pbml0aWFsX2ljdl9pdGVtICgtMSk7CisgIHN0cnVjdCBnb21w X2ljdl9saXN0ICphbGwgPSBnb21wX2dldF9pbml0aWFsX2ljdl9pdGVtICgtMik7CisgIHN0 cnVjdCBnb21wX2ljdl9saXN0ICpub25lID0gZ29tcF9nZXRfaW5pdGlhbF9pY3ZfaXRlbSAo LTMpOworCisgIGZwdXRzICgiXG5PUEVOTVAgRElTUExBWSBFTlZJUk9OTUVOVCBCRUdJTlxu Iiwgc3RkZXJyKTsKKworICBmcHV0cyAoIiAgX09QRU5NUCA9ICcyMDE1MTEnXG4iLCBzdGRl cnIpOworCisgIGZwcmludGYgKHN0ZGVyciwgIiAgW2hvc3RdIE9NUF9EWU5BTUlDID0gJyVz J1xuIiwKKwkgICBub25lLT5pY3ZzLmR5bl92YXIgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAg aWYgKGFsbCAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZsYWdzLCBHT01Q X0lDVl9EWU5BTUlDKSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgIFthbGxdIE9NUF9EWU5B TUlDID0gJyVzJ1xuIiwKKwkgICAgIGFsbC0+aWN2cy5keW5fdmFyID8gIlRSVUUiIDogIkZB TFNFIik7CisgIGlmIChkZXYgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoZGV2LT5m bGFncywgR09NUF9JQ1ZfRFlOQU1JQykpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbZGV2 aWNlXSBPTVBfRFlOQU1JQyA9ICclcydcbiIsCisJICAgICBkZXYtPmljdnMuZHluX3ZhciA/ ICJUUlVFIiA6ICJGQUxTRSIpOworICBwcmludF9kZXZpY2Vfc3BlY2lmaWNfaWN2cyAoR09N UF9JQ1ZfRFlOQU1JQyk7CisKKyAgLyogVGhlIE9NUF9ORVNURUQgZW52aXJvbm1lbnQgdmFy aWFibGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gICovCisgIGZwcmludGYgKHN0ZGVyciwgIiAg W2hvc3RdIE9NUF9ORVNURUQgPSAnJXMnXG4iLAorCSAgIG5vbmUtPmljdnMubWF4X2FjdGl2 ZV9sZXZlbHNfdmFyID4gMSA/ICJUUlVFIiA6ICJGQUxTRSIpOworCisgIGZwcmludGYgKHN0 ZGVyciwgIiAgW2hvc3RdIE9NUF9OVU1fVEhSRUFEUyA9ICclbHUiLAorCSAgIG5vbmUtPmlj dnMubnRocmVhZHNfdmFyKTsKKyAgZm9yIChpID0gMTsgaSA8IG5vbmUtPmljdnMubnRocmVh ZHNfdmFyX2xpc3RfbGVuOyBpKyspCisgICAgZnByaW50ZiAoc3RkZXJyLCAiLCVsdSIsIG5v bmUtPmljdnMubnRocmVhZHNfdmFyX2xpc3RbaV0pOworICBmcHV0cyAoIidcbiIsIHN0ZGVy cik7CisgIGlmIChhbGwgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFn cywgR09NUF9JQ1ZfTlRIUkVBRFMpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwg IiAgW2FsbF0gT01QX05VTV9USFJFQURTID0gJyVsdSIsCisJICAgICAgIGFsbC0+aWN2cy5u dGhyZWFkc192YXIpOworICAgICAgZm9yIChpID0gMTsgaSA8IGFsbC0+aWN2cy5udGhyZWFk c192YXJfbGlzdF9sZW47IGkrKykKKwlmcHJpbnRmIChzdGRlcnIsICIsJWx1IiwgYWxsLT5p Y3ZzLm50aHJlYWRzX3Zhcl9saXN0W2ldKTsKKyAgICAgIGZwdXRzICgiJ1xuIiwgc3RkZXJy KTsKKyAgICB9CisgIGlmIChkZXYgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoZGV2 LT5mbGFncywgR09NUF9JQ1ZfTlRIUkVBRFMpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0 ZGVyciwgIiAgW2RldmljZV0gT01QX05VTV9USFJFQURTID0gJyVsdSIsCisJICAgICAgIGRl di0+aWN2cy5udGhyZWFkc192YXIpOworICAgICAgZm9yIChpID0gMTsgaSA8IGRldi0+aWN2 cy5udGhyZWFkc192YXJfbGlzdF9sZW47IGkrKykKKwlmcHJpbnRmIChzdGRlcnIsICIsJWx1 IiwgZGV2LT5pY3ZzLm50aHJlYWRzX3Zhcl9saXN0W2ldKTsKKyAgICAgIGZwdXRzICgiJ1xu Iiwgc3RkZXJyKTsKKyAgICB9CisgIHByaW50X2RldmljZV9zcGVjaWZpY19pY3ZzIChHT01Q X0lDVl9OVEhSRUFEUyk7CisKKworICBwcmludF9zY2hlZHVsZSAobm9uZS0+aWN2cy5ydW5f c2NoZWRfdmFyLAorCQkgIG5vbmUtPmljdnMucnVuX3NjaGVkX2NodW5rX3NpemUsICJob3N0 Iik7CisgIGlmIChhbGwgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFn cywgR09NUF9JQ1ZfU0NIRURVTEUpKQorICAgIHByaW50X3NjaGVkdWxlIChhbGwtPmljdnMu cnVuX3NjaGVkX3ZhciwKKwkJICAgIGFsbC0+aWN2cy5ydW5fc2NoZWRfY2h1bmtfc2l6ZSwg ImFsbCIpOworICBpZiAoZGV2ICE9IE5VTEwgJiYgZ29tcF9nZXRfaWN2X2ZsYWcgKGRldi0+ ZmxhZ3MsIEdPTVBfSUNWX1NDSEVEVUxFKSkKKyAgICBwcmludF9zY2hlZHVsZSAoZGV2LT5p Y3ZzLnJ1bl9zY2hlZF92YXIsCisJCSAgICBkZXYtPmljdnMucnVuX3NjaGVkX2NodW5rX3Np emUsICJkZXZpY2UiKTsKKyAgcHJpbnRfZGV2aWNlX3NwZWNpZmljX2ljdnMgKEdPTVBfSUNW X1NDSEVEVUxFKTsKKworICBwcmludF9wcm9jX2JpbmQgKG5vbmUtPmljdnMuYmluZF92YXIs CisJCSAgIG5vbmUtPmljdnMuYmluZF92YXJfbGlzdF9sZW4sCisJCSAgICZub25lLT5pY3Zz LmJpbmRfdmFyX2xpc3QsICJob3N0Iik7CisgIGlmIChhbGwgIT0gTlVMTCAmJiBnb21wX2dl dF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfQklORCkpCisgICAgcHJpbnRfcHJv Y19iaW5kIChhbGwtPmljdnMuYmluZF92YXIsCisJCSAgICAgYWxsLT5pY3ZzLmJpbmRfdmFy X2xpc3RfbGVuLAorCQkgICAgICZhbGwtPmljdnMuYmluZF92YXJfbGlzdCwgImFsbCIpOwor ICBpZiAoZGV2ICE9IE5VTEwgJiYgZ29tcF9nZXRfaWN2X2ZsYWcgKGRldi0+ZmxhZ3MsIEdP TVBfSUNWX0JJTkQpKQorICAgIHByaW50X3Byb2NfYmluZCAoZGV2LT5pY3ZzLmJpbmRfdmFy LAorCQkgICAgIGRldi0+aWN2cy5iaW5kX3Zhcl9saXN0X2xlbiwKKwkJICAgICAmZGV2LT5p Y3ZzLmJpbmRfdmFyX2xpc3QsICJkZXZpY2UiKTsKKyAgcHJpbnRfZGV2aWNlX3NwZWNpZmlj X2ljdnMgKEdPTVBfSUNWX0JJTkQpOworCisgIGZwdXRzICgiICBbaG9zdF0gT01QX1BMQUNF UyA9ICciLCBzdGRlcnIpOwogICBmb3IgKGkgPSAwOyBpIDwgZ29tcF9wbGFjZXNfbGlzdF9s ZW47IGkrKykKICAgICB7CiAgICAgICBmcHV0cyAoInsiLCBzdGRlcnIpOwpAQCAtMTM0Nywz MCArMTY4MCw4NSBAQCBvbXBfZGlzcGxheV9lbnYgKGludCB2ZXJib3NlKQogICAgIH0KICAg ZnB1dHMgKCInXG4iLCBzdGRlcnIpOwogCi0gIGZwcmludGYgKHN0ZGVyciwgIiAgT01QX1NU QUNLU0laRSA9ICclbHUnXG4iLCBzdGFja3NpemUpOworICBmcHJpbnRmIChzdGRlcnIsICIg IFtob3N0XSBPTVBfU1RBQ0tTSVpFID0gJyVsdSdcbiIsCisJICAgbm9uZS0+aWN2cy5zdGFj a3NpemUpOworICBpZiAoYWxsICE9IE5VTEwgJiYgZ29tcF9nZXRfaWN2X2ZsYWcgKGFsbC0+ ZmxhZ3MsIEdPTVBfSUNWX1NUQUNLU0laRSkpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiICBb YWxsXSBPTVBfU1RBQ0tTSVpFID0gJyVsdSdcbiIsCisJICAgICBhbGwtPmljdnMuc3RhY2tz aXplKTsKKyAgaWYgKGRldiAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChkZXYtPmZs YWdzLCBHT01QX0lDVl9TVEFDS1NJWkUpKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiAgW2Rl dmljZV0gT01QX1NUQUNLU0laRSA9ICclbHUnXG4iLAorCSAgICAgZGV2LT5pY3ZzLnN0YWNr c2l6ZSk7CisgIHByaW50X2RldmljZV9zcGVjaWZpY19pY3ZzIChHT01QX0lDVl9TVEFDS1NJ WkUpOwogCiAgIC8qIEdPTVAncyBkZWZhdWx0IHZhbHVlIGlzIGFjdHVhbGx5IG5laXRoZXIg YWN0aXZlIG5vciBwYXNzaXZlLiAgKi8KLSAgZnByaW50ZiAoc3RkZXJyLCAiICBPTVBfV0FJ VF9QT0xJQ1kgPSAnJXMnXG4iLAotCSAgIHdhaXRfcG9saWN5ID4gMCA/ICJBQ1RJVkUiIDog IlBBU1NJVkUiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICBPTVBfVEhSRUFEX0xJTUlUID0g JyV1J1xuIiwKLQkgICBnb21wX2dsb2JhbF9pY3YudGhyZWFkX2xpbWl0X3Zhcik7Ci0gIGZw cmludGYgKHN0ZGVyciwgIiAgT01QX01BWF9BQ1RJVkVfTEVWRUxTID0gJyV1J1xuIiwKLQkg ICBnb21wX2dsb2JhbF9pY3YubWF4X2FjdGl2ZV9sZXZlbHNfdmFyKTsKLSAgZnByaW50ZiAo c3RkZXJyLCAiICBPTVBfTlVNX1RFQU1TID0gJyV1J1xuIiwgZ29tcF9udGVhbXNfdmFyKTsK LSAgZnByaW50ZiAoc3RkZXJyLCAiICBPTVBfVEVBTVNfVEhSRUFEX0xJTUlUID0gJyV1J1xu IiwKLQkgICBnb21wX3RlYW1zX3RocmVhZF9saW1pdF92YXIpOwotCi0gIGZwcmludGYgKHN0 ZGVyciwgIiAgT01QX0NBTkNFTExBVElPTiA9ICclcydcbiIsCisgIGZwcmludGYgKHN0ZGVy ciwgIiAgW2hvc3RdIE9NUF9XQUlUX1BPTElDWSA9ICclcydcbiIsCisJICAgbm9uZS0+aWN2 cy53YWl0X3BvbGljeSA+IDAgPyAiQUNUSVZFIiA6ICJQQVNTSVZFIik7CisgIGlmIChhbGwg IT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfV0FJ VF9QT0xJQ1kpKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiAgW2FsbF0gT01QX1dBSVRfUE9M SUNZID0gJyVzJ1xuIiwKKwkgICAgIGFsbC0+aWN2cy53YWl0X3BvbGljeSA+IDAgPyAiQUNU SVZFIiA6ICJQQVNTSVZFIik7CisgIGlmIChkZXYgIT0gTlVMTCAmJiBnb21wX2dldF9pY3Zf ZmxhZyAoZGV2LT5mbGFncywgR09NUF9JQ1ZfV0FJVF9QT0xJQ1kpKQorICAgIGZwcmludGYg KHN0ZGVyciwgIiAgW2RldmljZV0gT01QX1dBSVRfUE9MSUNZID0gJyVzJ1xuIiwKKwkgICAg IGRldi0+aWN2cy53YWl0X3BvbGljeSA+IDAgPyAiQUNUSVZFIiA6ICJQQVNTSVZFIik7Cisg IHByaW50X2RldmljZV9zcGVjaWZpY19pY3ZzIChHT01QX0lDVl9XQUlUX1BPTElDWSk7CisK KyAgZnByaW50ZiAoc3RkZXJyLCAiICBbaG9zdF0gT01QX1RIUkVBRF9MSU1JVCA9ICcldSdc biIsCisJICAgbm9uZS0+aWN2cy50aHJlYWRfbGltaXRfdmFyKTsKKyAgaWYgKGFsbCAhPSBO VUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZsYWdzLCBHT01QX0lDVl9USFJFQURf TElNSVQpKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiAgW2FsbF0gT01QX1RIUkVBRF9MSU1J VCA9ICclZCdcbiIsCisJICAgICBhbGwtPmljdnMudGhyZWFkX2xpbWl0X3Zhcik7CisgIGlm IChkZXYgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoZGV2LT5mbGFncywgR09NUF9J Q1ZfVEhSRUFEX0xJTUlUKSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgIFtkZXZpY2VdIE9N UF9USFJFQURfTElNSVQgPSAnJWQnXG4iLAorCSAgICAgZGV2LT5pY3ZzLnRocmVhZF9saW1p dF92YXIpOworICBwcmludF9kZXZpY2Vfc3BlY2lmaWNfaWN2cyAoR09NUF9JQ1ZfVEhSRUFE X0xJTUlUKTsKKworICBmcHJpbnRmIChzdGRlcnIsICIgIFtob3N0XSBPTVBfTUFYX0FDVElW RV9MRVZFTFMgPSAnJXUnXG4iLAorCSAgIG5vbmUtPmljdnMubWF4X2FjdGl2ZV9sZXZlbHNf dmFyKTsKKyAgaWYgKGFsbCAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZs YWdzLAorCQkJIEdPTVBfSUNWX01BWF9BQ1RJVkVfTEVWRUxTKSkKKyAgICBmcHJpbnRmIChz dGRlcnIsICIgIFthbGxdIE9NUF9NQVhfQUNUSVZFX0xFVkVMUyA9ICcldSdcbiIsCisJICAg ICBhbGwtPmljdnMubWF4X2FjdGl2ZV9sZXZlbHNfdmFyKTsKKyAgaWYgKGRldiAhPSBOVUxM ICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChkZXYtPmZsYWdzLAorCQkJIEdPTVBfSUNWX01BWF9B Q1RJVkVfTEVWRUxTKSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgIFtkZXZpY2VdIE9NUF9N QVhfQUNUSVZFX0xFVkVMUyA9ICcldSdcbiIsCisJICAgICBkZXYtPmljdnMubWF4X2FjdGl2 ZV9sZXZlbHNfdmFyKTsKKyAgcHJpbnRfZGV2aWNlX3NwZWNpZmljX2ljdnMgKEdPTVBfSUNW X01BWF9BQ1RJVkVfTEVWRUxTKTsKKworCisgIGZwcmludGYgKHN0ZGVyciwgIiAgW2hvc3Rd IE9NUF9OVU1fVEVBTVMgPSAnJWQnXG4iLAorCSAgIG5vbmUtPmljdnMubnRlYW1zX3Zhcik7 CisgIGlmIChhbGwgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywg R09NUF9JQ1ZfTlRFQU1TKSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgIFthbGxdIE9NUF9O VU1fVEVBTVMgPSAnJWQnXG4iLAorCSAgICAgYWxsLT5pY3ZzLm50ZWFtc192YXIpOworICBp ZiAoZGV2ICE9IE5VTEwgJiYgZ29tcF9nZXRfaWN2X2ZsYWcgKGRldi0+ZmxhZ3MsIEdPTVBf SUNWX05URUFNUykpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbZGV2aWNlXSBPTVBfTlVN X1RFQU1TID0gJyVkJ1xuIiwKKwkgICAgIGRldi0+aWN2cy5udGVhbXNfdmFyKTsKKyAgcHJp bnRfZGV2aWNlX3NwZWNpZmljX2ljdnMgKEdPTVBfSUNWX05URUFNUyk7CisKKyAgZnByaW50 ZiAoc3RkZXJyLCAiICBbaG9zdF0gT01QX1RFQU1TX1RIUkVBRF9MSU1JVCA9ICcldSdcbiIs CisJICAgbm9uZS0+aWN2cy50ZWFtc190aHJlYWRfbGltaXRfdmFyKTsKKyAgaWYgKGFsbCAh PSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZsYWdzLAorCQkJIEdPTVBfSUNW X1RFQU1TX1RIUkVBRF9MSU1JVCkpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbYWxsXSBP TVBfVEVBTVNfVEhSRUFEX0xJTUlUID0gJyV1J1xuIiwKKwkgICAgIGFsbC0+aWN2cy50ZWFt c190aHJlYWRfbGltaXRfdmFyKTsKKyAgaWYgKGRldiAhPSBOVUxMICYmIGdvbXBfZ2V0X2lj dl9mbGFnIChkZXYtPmZsYWdzLAorCQkJIEdPTVBfSUNWX1RFQU1TX1RIUkVBRF9MSU1JVCkp CisgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbZGV2aWNlXSBPTVBfVEVBTVNfVEhSRUFEX0xJ TUlUID0gJyV1J1xuIiwKKwkgICAgIGRldi0+aWN2cy50ZWFtc190aHJlYWRfbGltaXRfdmFy KTsKKyAgcHJpbnRfZGV2aWNlX3NwZWNpZmljX2ljdnMgKEdPTVBfSUNWX1RFQU1TX1RIUkVB RF9MSU1JVCk7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBbaG9zdF0gT01QX0NBTkNFTExB VElPTiA9ICclcydcbiIsCiAJICAgZ29tcF9jYW5jZWxfdmFyID8gIlRSVUUiIDogIkZBTFNF Iik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgT01QX0RFRkFVTFRfREVWSUNFID0gJyVkJ1xu IiwKLQkgICBnb21wX2dsb2JhbF9pY3YuZGVmYXVsdF9kZXZpY2VfdmFyKTsKLSAgZnByaW50 ZiAoc3RkZXJyLCAiICBPTVBfTUFYX1RBU0tfUFJJT1JJVFkgPSAnJWQnXG4iLAorCisgIGZw cmludGYgKHN0ZGVyciwgIiAgW2hvc3RdIE9NUF9ERUZBVUxUX0RFVklDRSA9ICclZCdcbiIs CisJICAgbm9uZS0+aWN2cy5kZWZhdWx0X2RldmljZV92YXIpOworCisgIGZwcmludGYgKHN0 ZGVyciwgIiAgW2hvc3RdIE9NUF9NQVhfVEFTS19QUklPUklUWSA9ICclZCdcbiIsCiAJICAg Z29tcF9tYXhfdGFza19wcmlvcml0eV92YXIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgIE9N UF9ESVNQTEFZX0FGRklOSVRZID0gJyVzJ1xuIiwKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBb aG9zdF0gT01QX0RJU1BMQVlfQUZGSU5JVFkgPSAnJXMnXG4iLAogCSAgIGdvbXBfZGlzcGxh eV9hZmZpbml0eV92YXIgPyAiVFJVRSIgOiAiRkFMU0UiKTsKLSAgZnByaW50ZiAoc3RkZXJy LCAiICBPTVBfQUZGSU5JVFlfRk9STUFUID0gJyVzJ1xuIiwKKyAgZnByaW50ZiAoc3RkZXJy LCAiICBbaG9zdF0gT01QX0FGRklOSVRZX0ZPUk1BVCA9ICclcydcbiIsCiAJICAgZ29tcF9h ZmZpbml0eV9mb3JtYXRfdmFyKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICBPTVBfQUxMT0NB VE9SID0gJyIpOworICBmcHJpbnRmIChzdGRlcnIsICIgIFtob3N0XSBPTVBfQUxMT0NBVE9S ID0gJyIpOwogICBzd2l0Y2ggKGdvbXBfZGVmX2FsbG9jYXRvcikKICAgICB7CiAjZGVmaW5l IEModikgY2FzZSB2OiBmcHV0cyAoI3YsIHN0ZGVycik7IGJyZWFrOwpAQCAtMTM4Nyw3ICsx Nzc1LDcgQEAgb21wX2Rpc3BsYXlfZW52IChpbnQgdmVyYm9zZSkKICAgICB9CiAgIGZwdXRz ICgiJ1xuIiwgc3RkZXJyKTsKIAotICBmcHV0cyAoIiAgT01QX1RBUkdFVF9PRkZMT0FEID0g JyIsIHN0ZGVycik7CisgIGZwdXRzICgiICBbaG9zdF0gT01QX1RBUkdFVF9PRkZMT0FEID0g JyIsIHN0ZGVycik7CiAgIHN3aXRjaCAoZ29tcF90YXJnZXRfb2ZmbG9hZF92YXIpCiAgICAg ewogICAgIGNhc2UgR09NUF9UQVJHRVRfT0ZGTE9BRF9ERUZBVUxUOgpAQCAtMTQwNCwxMyAr MTc5MiwxMyBAQCBvbXBfZGlzcGxheV9lbnYgKGludCB2ZXJib3NlKQogCiAgIGlmICh2ZXJi b3NlKQogICAgIHsKLSAgICAgIGZwdXRzICgiICBHT01QX0NQVV9BRkZJTklUWSA9ICcnXG4i LCBzdGRlcnIpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBHT01QX1NUQUNLU0laRSA9 ICclbHUnXG4iLCBzdGFja3NpemUpOworICAgICAgZnB1dHMgKCIgIFtob3N0XSBHT01QX0NQ VV9BRkZJTklUWSA9ICcnXG4iLCBzdGRlcnIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAi ICBbaG9zdF0gR09NUF9TVEFDS1NJWkUgPSAnJWx1J1xuIiwgc3RhY2tzaXplKTsKICNpZmRl ZiBIQVZFX0lOVFRZUEVTX0gKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgR09NUF9TUElO Q09VTlQgPSAnJSJQUkl1NjQiJ1xuIiwKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgW2hv c3RdIEdPTVBfU1BJTkNPVU5UID0gJyUiUFJJdTY0IidcbiIsCiAJICAgICAgICh1aW50NjRf dCkgZ29tcF9zcGluX2NvdW50X3Zhcik7CiAjZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJy LCAiICBHT01QX1NQSU5DT1VOVCA9ICclbHUnXG4iLAorICAgICAgZnByaW50ZiAoc3RkZXJy LCAiICBbaG9zdF0gR09NUF9TUElOQ09VTlQgPSAnJWx1J1xuIiwKIAkgICAgICAgKHVuc2ln bmVkIGxvbmcpIGdvbXBfc3Bpbl9jb3VudF92YXIpOwogI2VuZGlmCiAgICAgfQpAQCAtMTQ1 OSw2NSArMTg0NywzODEgQEAgaGFuZGxlX29tcF9kaXNwbGF5X2VudiAodm9pZCkKICAgICBp YWxpYXNfY2FsbCAob21wX2Rpc3BsYXlfZW52KSAodmVyYm9zZSk7CiB9CiAKKy8qIEhlbHBl ciBmdW5jdGlvbiBmb3IgaW5pdGlhbGl6ZV9lbnYuICBFeHRyYWN0cyB0aGUgZGV2aWNlIG51 bWJlciBmcm9tCisgICBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lLiAgRU5WIGlzIHRo ZSBjb21wbGV0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgIERFVl9OVU1fUFRSIHBvaW50 cyB0byB0aGUgc3RhcnQgb2YgdGhlIGRldmljZSBudW1iZXIgaW4gdGhlIGVudmlyb25tZW50 CisgICB2YXJpYWJsZSBzdHJpbmcuICBERVZfTlVNX0xFTiBpcyB0aGUgcmV0dXJuZWQgbGVu Z3RoIG9mIHRoZSBkZXZpY2UgbnVtCisgICBzdHJpbmcuICAqLworCitzdGF0aWMgYm9vbAor Z2V0X2RldmljZV9udW0gKGNoYXIgKmVudiwgY2hhciAqZGV2X251bV9wdHIsIGludCAqZGV2 X251bSwgaW50ICpkZXZfbnVtX2xlbikKK3sKKyAgY2hhciAqZW5kOworICBpbnQgcG9zID0g MDsKKworICBpZiAoZGV2X251bV9wdHJbMF0gPT0gJy0nKQorICAgIHsKKyAgICAgIGdvbXBf ZXJyb3IgKCJOb24tbmVnYXRpdmUgZGV2aWNlIG51bWJlciBleHBlY3RlZCBpbiAlcyIsIGVu dik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHdoaWxlIChwb3MgPD0gSU5U X01BWF9TVFJfTEVOKQorICAgIHsKKyAgICAgIGlmIChkZXZfbnVtX3B0cltwb3NdID09ICdc MCcgfHwgZGV2X251bV9wdHJbcG9zXSA9PSAnPScpCisJYnJlYWs7CisgICAgICBwb3MrKzsK KyAgICB9CisgIGlmIChwb3MgPiBJTlRfTUFYX1NUUl9MRU4pCisgICAgeworICAgICAgZ29t cF9lcnJvciAoIkludmFsaWQgZGV2aWNlIG51bWJlciBpbiAlcyAodG9vIGxvbmcpIiwgZW52 KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgKmRldl9udW0gPSAoaW50KSBz dHJ0b3VsIChkZXZfbnVtX3B0ciwgJmVuZCwgMTApOworICBpZiAoZGV2X251bV9wdHJbMF0g PT0gJzAnICYmICpkZXZfbnVtICE9IDApCisgICAgeworICAgICAgZ29tcF9lcnJvciAoIklu dmFsaWQgZGV2aWNlIG51bWJlciBpbiAlcyAobGVhZGluZyB6ZXJvKSIsIGVudik7CisgICAg ICByZXR1cm4gZmFsc2U7CisgICAgfQorICBpZiAoZGV2X251bV9wdHIgPT0gZW5kIHx8ICpl bmQgIT0gJz0nKQorICAgIHsKKyAgICAgIGdvbXBfZXJyb3IgKCJJbnZhbGlkIGRldmljZSBu dW1iZXIgaW4gJXMiLCBlbnYpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAq ZGV2X251bV9sZW4gPSBwb3M7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAor Z2V0X2ljdl9tZW1iZXJfYWRkciAoc3RydWN0IGdvbXBfaW5pdGlhbF9pY3ZzICppY3ZzLCBp bnQgaWN2X2NvZGUsCisJCSAgICAgdm9pZCAqaWN2X2FkZHJbM10pCit7CisgIGlmIChpY3Zf Y29kZSA9PSAwIHx8IGljdl9hZGRyID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGljdl9h ZGRyWzBdID0gaWN2X2FkZHJbMV0gPSBpY3ZfYWRkclsyXSA9IE5VTEw7CisKKyAgc3dpdGNo IChpY3ZfY29kZSkKKyAgICB7CisgICAgY2FzZSBHT01QX0lDVl9OVEVBTVM6CisgICAgICBp Y3ZfYWRkclswXSA9ICYoaWN2cy0+bnRlYW1zX3Zhcik7CisgICAgICBpY3ZfYWRkclsxXSA9 IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHT01QX0lDVl9EWU5BTUlDOgorICAg ICAgaWN2X2FkZHJbMF0gPSAmKCgqaWN2cykuZHluX3Zhcik7CisgICAgICBicmVhazsKKyAg ICBjYXNlIEdPTVBfSUNWX1RFQU1TX1RIUkVBRF9MSU1JVDoKKyAgICAgIGljdl9hZGRyWzBd ID0gJihpY3ZzLT50ZWFtc190aHJlYWRfbGltaXRfdmFyKTsKKyAgICAgIGljdl9hZGRyWzFd ID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdPTVBfSUNWX1NDSEVEVUxFOgor ICAgICAgaWN2X2FkZHJbMF0gPSAmKGljdnMtPnJ1bl9zY2hlZF92YXIpOworICAgICAgaWN2 X2FkZHJbMV0gPSAmKGljdnMtPnJ1bl9zY2hlZF9jaHVua19zaXplKTsKKyAgICAgIGJyZWFr OworICAgIGNhc2UgR09NUF9JQ1ZfVEhSRUFEX0xJTUlUOgorICAgICAgaWN2X2FkZHJbMF0g PSAmKGljdnMtPnRocmVhZF9saW1pdF92YXIpOworICAgICAgaWN2X2FkZHJbMV0gPSBmYWxz ZTsKKyAgICAgIGljdl9hZGRyWzJdID0gKHZvaWQgKikgVUlOVF9NQVg7CisgICAgICBicmVh azsKKyAgICBjYXNlIEdPTVBfSUNWX05USFJFQURTOgorICAgICAgaWN2X2FkZHJbMF0gPSAm KGljdnMtPm50aHJlYWRzX3Zhcik7CisgICAgICBpY3ZfYWRkclsxXSA9ICYoaWN2cy0+bnRo cmVhZHNfdmFyX2xpc3QpOworICAgICAgaWN2X2FkZHJbMl0gPSAmKGljdnMtPm50aHJlYWRz X3Zhcl9saXN0X2xlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdPTVBfSUNWX01BWF9B Q1RJVkVfTEVWRUxTOgorICAgICAgaWN2X2FkZHJbMF0gPSAmKGljdnMtPm1heF9hY3RpdmVf bGV2ZWxzX3Zhcik7CisgICAgICBpY3ZfYWRkclsxXSA9ICh2b2lkICopIHRydWU7CisgICAg ICBpY3ZfYWRkclsyXSA9ICh2b2lkICopIGdvbXBfc3VwcG9ydGVkX2FjdGl2ZV9sZXZlbHM7 CisgICAgICBicmVhazsKKyAgICBjYXNlIEdPTVBfSUNWX0JJTkQ6CisgICAgICBpY3ZfYWRk clswXSA9ICYoaWN2cy0+YmluZF92YXIpOworICAgICAgaWN2X2FkZHJbMV0gPSAmKGljdnMt PmJpbmRfdmFyX2xpc3QpOworICAgICAgaWN2X2FkZHJbMl0gPSAmKGljdnMtPmJpbmRfdmFy X2xpc3RfbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR09NUF9JQ1ZfV0FJVF9QT0xJ Q1k6CisgICAgICBpY3ZfYWRkclswXSA9ICYoaWN2cy0+d2FpdF9wb2xpY3kpOworICAgICAg YnJlYWs7CisgICAgY2FzZSBHT01QX0lDVl9TVEFDS1NJWkU6CisgICAgICBpY3ZfYWRkclsw XSA9ICYoaWN2cy0+c3RhY2tzaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR09NUF9J Q1ZfQ0FOQ0VMTEFUSU9OOgorICAgICAgaWN2X2FkZHJbMF0gPSAmZ29tcF9jYW5jZWxfdmFy OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHT01QX0lDVl9ESVNQTEFZX0FGRklOSVRZOgor ICAgICAgaWN2X2FkZHJbMF0gPSAmZ29tcF9kaXNwbGF5X2FmZmluaXR5X3ZhcjsKKyAgICAg IGJyZWFrOworICAgIGNhc2UgR09NUF9JQ1ZfVEFSR0VUX09GRkxPQUQ6CisgICAgICBpY3Zf YWRkclswXSA9ICZnb21wX3RhcmdldF9vZmZsb2FkX3ZhcjsKKyAgICAgIGJyZWFrOworICAg IGNhc2UgR09NUF9JQ1ZfTUFYX1RBU0tfUFJJT1JJVFk6CisgICAgICBpY3ZfYWRkclswXSA9 ICZnb21wX21heF90YXNrX3ByaW9yaXR5X3ZhcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ug R09NUF9JQ1ZfQUxMT0NBVE9SOgorICAgICAgaWN2X2FkZHJbMF0gPSAmZ29tcF9kZWZfYWxs b2NhdG9yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHT01QX0lDVl9ERUZBVUxUX0RFVklD RToKKyAgICAgIGljdl9hZGRyWzBdID0gJihpY3ZzLT5kZWZhdWx0X2RldmljZV92YXIpOwor ICAgICAgaWN2X2FkZHJbMV0gPSAodm9pZCAqKSB0cnVlOworICAgICAgYnJlYWs7CisgICAg fQorfQorCitzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCAqCitnb21wX2dldF9pbml0aWFsX2ljdl9p dGVtIChpbnQgZGV2X251bSkKK3sKKyAgc3RydWN0IGdvbXBfaWN2X2xpc3QgKmwgPSBnb21w X2luaXRpYWxfaWN2X2xpc3Q7CisgIHdoaWxlIChsICE9IE5VTEwgJiYgbC0+ZGV2aWNlX251 bSAhPSBkZXZfbnVtKQorICAgIGwgPSBsLT5uZXh0OworCisgIHJldHVybiBsOworfQorCitz dHJ1Y3QgZ29tcF9vZmZsb2FkX2ljdl9saXN0ICoKK2dvbXBfZ2V0X29mZmxvYWRfaWN2X2l0 ZW0gKGludCBkZXZfbnVtKQoreworICBzdHJ1Y3QgZ29tcF9vZmZsb2FkX2ljdl9saXN0ICps ID0gZ29tcF9vZmZsb2FkX2ljdl9saXN0OworICB3aGlsZSAobCAhPSBOVUxMICYmIGwtPmRl dmljZV9udW0gIT0gZGV2X251bSkKKyAgICBsID0gbC0+bmV4dDsKKworICByZXR1cm4gbDsK K30KKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciBpbml0aWFsaXplX2VudiB0byBhZGQgYSBk ZXZpY2Ugc3BlY2lmaWMgSUNWIHZhbHVlCisgICB0byBnb21wX2luaXRpYWxfaWN2X2xpc3Qu ICAqLworCitzdGF0aWMgdWludDMyX3QgKgorYWRkX2luaXRpYWxfaWN2X3RvX2xpc3QgKGlu dCBkZXZfbnVtLCBpbnQgaWN2X2NvZGUsIHZvaWQgKmljdl9hZGRyWzNdKQoreworICBzdHJ1 Y3QgZ29tcF9pY3ZfbGlzdCAqbGFzdCA9IE5VTEwsICpsID0gZ29tcF9pbml0aWFsX2ljdl9s aXN0OworICB3aGlsZSAobCAhPSBOVUxMICYmIGwtPmRldmljZV9udW0gIT0gZGV2X251bSkK KyAgICB7CisgICAgICBsYXN0ID0gbDsKKyAgICAgIGwgPSBsLT5uZXh0OworICAgIH0KKwor ICBpZiAobCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGwKKwk9IChzdHJ1Y3QgZ29tcF9pY3Zf bGlzdCAqKSBnb21wX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCkpOwor ICAgICAgbC0+ZGV2aWNlX251bSA9IGRldl9udW07CisgICAgICBtZW1zZXQgKCYobC0+aWN2 cyksIDAsIHNpemVvZiAoc3RydWN0IGdvbXBfaW5pdGlhbF9pY3ZzKSk7CisgICAgICBsLT5m bGFncyA9IDA7CisgICAgICBpZiAoZGV2X251bSA8IDApCisJeworCSAgbC0+bmV4dCA9IGdv bXBfaW5pdGlhbF9pY3ZfbGlzdDsKKwkgIGdvbXBfaW5pdGlhbF9pY3ZfbGlzdCA9IGw7CisJ fQorICAgICAgZWxzZQorCXsKKwkgIGwtPm5leHQgPSBOVUxMOworCSAgaWYgKGxhc3QgPT0g TlVMTCkKKwkgICAgZ29tcF9pbml0aWFsX2ljdl9saXN0ID0gbDsKKwkgIGVsc2UKKwkgICAg bGFzdC0+bmV4dCA9IGw7CisJfQorICAgIH0KKworICBnZXRfaWN2X21lbWJlcl9hZGRyICgm KGwtPmljdnMpLCBpY3ZfY29kZSwgaWN2X2FkZHIpOworCisgIHJldHVybiAmKGwtPmZsYWdz KTsKK30KKworLyogUmV0dXJuIHRydWUgaWYgU1RSIHN0cmluZyBzdGFydHMgd2l0aCBQUkVG SVguICAqLworCitzdGF0aWMgaW5saW5lIGJvb2wKK3N0YXJ0c3dpdGggKGNvbnN0IGNoYXIg KnN0ciwgY29uc3QgY2hhciAqcHJlZml4KQoreworICByZXR1cm4gc3RybmNtcCAoc3RyLCBw cmVmaXgsIHN0cmxlbiAocHJlZml4KSkgPT0gMDsKK30KIAogc3RhdGljIHZvaWQgX19hdHRy aWJ1dGVfXygoY29uc3RydWN0b3IpKQogaW5pdGlhbGl6ZV9lbnYgKHZvaWQpCiB7Ci0gIHVu c2lnbmVkIGxvbmcgdGhyZWFkX2xpbWl0X3ZhcjsKLSAgdW5zaWduZWQgbG9uZyBtYXhfYWN0 aXZlX2xldmVsc192YXI7CisgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKKyAgY2hhciAqKmVu djsKKyAgaW50IG9tcF92YXIsIGRldl9udW0gPSAwLCBkZXZfbnVtX2xlbiA9IDAsIGk7Cisg IGJvb2wgaWdub3JlID0gZmFsc2U7CisgIGNoYXIgKmVudl92YWw7CisgIHZvaWQgKnBhcmFt c1szXTsKKyAgdWludDMyX3QgKmZsYWdfdmFyX2FkZHIgPSBOVUxMOworICB1bnNpZ25lZCBw b3M7CisgIHN0cnVjdCBnb21wX2ljdl9saXN0ICphbGwsICpub25lOwogCiAgIC8qIERvIGEg Y29tcGlsZSB0aW1lIGNoZWNrIHRoYXQgbWtvbXBfaC5wbCBkaWQgZ29vZCBqb2IuICAqLwog ICBvbXBfY2hlY2tfZGVmaW5lcyAoKTsKIAotICBwYXJzZV9zY2hlZHVsZSAoKTsKLSAgcGFy c2VfYm9vbGVhbiAoIk9NUF9EWU5BTUlDIiwgJmdvbXBfZ2xvYmFsX2ljdi5keW5fdmFyKTsK LSAgcGFyc2VfYm9vbGVhbiAoIk9NUF9DQU5DRUxMQVRJT04iLCAmZ29tcF9jYW5jZWxfdmFy KTsKLSAgcGFyc2VfYm9vbGVhbiAoIk9NUF9ESVNQTEFZX0FGRklOSVRZIiwgJmdvbXBfZGlz cGxheV9hZmZpbml0eV92YXIpOwotICBwYXJzZV9pbnQgKCJPTVBfREVGQVVMVF9ERVZJQ0Ui LCAmZ29tcF9nbG9iYWxfaWN2LmRlZmF1bHRfZGV2aWNlX3ZhciwgdHJ1ZSk7Ci0gIHBhcnNl X3RhcmdldF9vZmZsb2FkICgiT01QX1RBUkdFVF9PRkZMT0FEIiwgJmdvbXBfdGFyZ2V0X29m ZmxvYWRfdmFyKTsKLSAgcGFyc2VfaW50ICgiT01QX01BWF9UQVNLX1BSSU9SSVRZIiwgJmdv bXBfbWF4X3Rhc2tfcHJpb3JpdHlfdmFyLCB0cnVlKTsKLSAgZ29tcF9kZWZfYWxsb2NhdG9y ID0gcGFyc2VfYWxsb2NhdG9yICgpOwotICBpZiAocGFyc2VfdW5zaWduZWRfbG9uZyAoIk9N UF9USFJFQURfTElNSVQiLCAmdGhyZWFkX2xpbWl0X3ZhciwgZmFsc2UpKQotICAgIHsKLSAg ICAgIGdvbXBfZ2xvYmFsX2ljdi50aHJlYWRfbGltaXRfdmFyCi0JPSB0aHJlYWRfbGltaXRf dmFyID4gSU5UX01BWCA/IFVJTlRfTUFYIDogdGhyZWFkX2xpbWl0X3ZhcjsKLSAgICB9Ci0g IHBhcnNlX2ludF9zZWN1cmUgKCJHT01QX0RFQlVHIiwgJmdvbXBfZGVidWdfdmFyLCB0cnVl KTsKICNpZm5kZWYgSEFWRV9TWU5DX0JVSUxUSU5TCiAgIGdvbXBfbXV0ZXhfaW5pdCAoJmdv bXBfbWFuYWdlZF90aHJlYWRzX2xvY2spOwogI2VuZGlmCiAgIGdvbXBfaW5pdF9udW1fdGhy ZWFkcyAoKTsKICAgZ29tcF9hdmFpbGFibGVfY3B1cyA9IGdvbXBfZ2xvYmFsX2ljdi5udGhy ZWFkc192YXI7Ci0gIGlmICghcGFyc2VfdW5zaWduZWRfbG9uZ19saXN0ICgiT01QX05VTV9U SFJFQURTIiwKLQkJCQkgJmdvbXBfZ2xvYmFsX2ljdi5udGhyZWFkc192YXIsCi0JCQkJICZn b21wX250aHJlYWRzX3Zhcl9saXN0LAotCQkJCSAmZ29tcF9udGhyZWFkc192YXJfbGlzdF9s ZW4pKQotICAgIGdvbXBfZ2xvYmFsX2ljdi5udGhyZWFkc192YXIgPSBnb21wX2F2YWlsYWJs ZV9jcHVzOwotICBwYXJzZV9pbnQgKCJPTVBfTlVNX1RFQU1TIiwgJmdvbXBfbnRlYW1zX3Zh ciwgZmFsc2UpOwotICBwYXJzZV9pbnQgKCJPTVBfVEVBTVNfVEhSRUFEX0xJTUlUIiwgJmdv bXBfdGVhbXNfdGhyZWFkX2xpbWl0X3ZhciwgZmFsc2UpOwotICBib29sIGlnbm9yZSA9IGZh bHNlOwotICBpZiAocGFyc2VfYmluZF92YXIgKCJPTVBfUFJPQ19CSU5EIiwKLQkJICAgICAg JmdvbXBfZ2xvYmFsX2ljdi5iaW5kX3ZhciwKLQkJICAgICAgJmdvbXBfYmluZF92YXJfbGlz dCwKLQkJICAgICAgJmdvbXBfYmluZF92YXJfbGlzdF9sZW4pCisKKyAgLyogSW5pdGlhbCB2 YWx1ZXMgZm9yIGhvc3QgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNob3VsZCBhbHdheXMgZXhp c3QgZXZlbiBpZgorICAgICB0aGVyZSBpcyBubyBleHBsaWNpdGx5IHNldCBob3N0IGVudmly b25tZW50IHZhcmlhYmxlLiAgTW9yZW92ZXIsIHRoZXkgYXJlCisgICAgIHNldCB0byB0aGUg aW5pdGlhbCBnbG9iYWwgdmFsdWVzLiAgKi8KKyAgYWRkX2luaXRpYWxfaWN2X3RvX2xpc3Qg KC0zLCAwLCBOVUxMKTsKKyAgbm9uZSA9IGdvbXBfZ2V0X2luaXRpYWxfaWN2X2l0ZW0gKC0z KTsKKyAgbm9uZS0+aWN2cy5udGhyZWFkc192YXIgPSAxOworICBub25lLT5pY3ZzLnRocmVh ZF9saW1pdF92YXIgPSBVSU5UX01BWDsKKyAgbm9uZS0+aWN2cy5ydW5fc2NoZWRfdmFyID0g R0ZTX0RZTkFNSUM7CisgIG5vbmUtPmljdnMucnVuX3NjaGVkX2NodW5rX3NpemUgPSAxOwor ICBub25lLT5pY3ZzLmRlZmF1bHRfZGV2aWNlX3ZhciA9IDA7CisgIG5vbmUtPmljdnMuZHlu X3ZhciA9IGZhbHNlOworICBub25lLT5pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzX3ZhciA9IDE7 CisgIG5vbmUtPmljdnMuYmluZF92YXIgPSBvbXBfcHJvY19iaW5kX2ZhbHNlOworCisgIGZv ciAoZW52ID0gZW52aXJvbjsgKmVudiAhPSAwOyBlbnYrKykKKyAgICB7CisgICAgICBpZiAo IXN0YXJ0c3dpdGggKCplbnYsICJPTVBfIikpCisJY29udGludWU7CisKKyAgICAgZm9yIChv bXBfdmFyID0gMDsgb21wX3ZhciA8IE9NUF9WQVJfQ05UOyBvbXBfdmFyKyspCisJeworCSAg aWYgKHN0YXJ0c3dpdGggKCplbnYsIGVudnZhcnNbb21wX3Zhcl0ubmFtZSkpCisJICAgIHsK KwkgICAgICBwb3MgPSBlbnZ2YXJzW29tcF92YXJdLm5hbWVfbGVuOworCSAgICAgIGlmICgo KmVudilbcG9zXSA9PSAnPScpCisJCXsKKwkJICBwb3MrKzsKKwkJICBmbGFnX3Zhcl9hZGRy CisJCSAgICA9IGFkZF9pbml0aWFsX2ljdl90b19saXN0ICgtMywKKwkJCQkJICAgICAgIGVu dnZhcnNbb21wX3Zhcl0uZmxhZ192YXJzWzBdLAorCQkJCQkgICAgICAgcGFyYW1zKTsKKwkJ fQorCSAgICAgIGVsc2UgaWYgKHN0YXJ0c3dpdGggKCYoKmVudilbcG9zXSwgIl9ERVY9IikK KwkJICAgICAgICYmIGVudnZhcnNbb21wX3Zhcl0uZmxhZyAmIEdPTVBfRU5WX1NVRkZJWF9E RVYpCisJCXsKKwkJICBwb3MgKz0gNTsKKwkJICBmbGFnX3Zhcl9hZGRyCisJCSAgICA9IGFk ZF9pbml0aWFsX2ljdl90b19saXN0ICgtMSwKKwkJCQkJICAgICAgIGVudnZhcnNbb21wX3Zh cl0uZmxhZ192YXJzWzBdLAorCQkJCQkgICAgICAgcGFyYW1zKTsKKwkJfQorCSAgICAgIGVs c2UgaWYgKHN0YXJ0c3dpdGggKCYoKmVudilbcG9zXSwgIl9BTEw9IikKKwkJICAgICAgICYm IGVudnZhcnNbb21wX3Zhcl0uZmxhZyAmIEdPTVBfRU5WX1NVRkZJWF9BTEwpCisJCXsKKwkJ ICBwb3MgKz0gNTsKKwkJICBmbGFnX3Zhcl9hZGRyCisJCSAgICA9IGFkZF9pbml0aWFsX2lj dl90b19saXN0ICgtMiwKKwkJCQkJICAgICAgIGVudnZhcnNbb21wX3Zhcl0uZmxhZ192YXJz WzBdLAorCQkJCQkgICAgICAgcGFyYW1zKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHN0YXJ0 c3dpdGggKCYoKmVudilbcG9zXSwgIl9ERVZfIikKKwkJICAgICAgICYmIGVudnZhcnNbb21w X3Zhcl0uZmxhZyAmIEdPTVBfRU5WX1NVRkZJWF9ERVZfWCkKKwkJeworCQkgIHBvcyArPSA1 OworCQkgIGlmICghZ2V0X2RldmljZV9udW0gKCplbnYsICYoKmVudilbcG9zXSwgJmRldl9u dW0sCisJCQkJICAgICAgICZkZXZfbnVtX2xlbikpCisJCSAgICBnb3RvIG5leHRfdmFyOwor CisJCSAgcG9zICs9IGRldl9udW1fbGVuICsgMTsKKwkJICBmbGFnX3Zhcl9hZGRyCisJCSAg ICA9IGFkZF9pbml0aWFsX2ljdl90b19saXN0IChkZXZfbnVtLAorCQkJCQkgICAgICAgZW52 dmFyc1tvbXBfdmFyXS5mbGFnX3ZhcnNbMF0sCisJCQkJCSAgICAgICBwYXJhbXMpOworCQl9 CisJICAgICAgZWxzZQorCQl7CisJCSAgZ29tcF9lcnJvciAoIkludmFsaWQgZGV2aWNlIG51 bWJlciBpbiAlcyIsICplbnYpOworCQkgIGJyZWFrOworCQl9CisJICAgICAgZW52X3ZhbCA9 ICYoKmVudilbcG9zXTsKKworCSAgICAgIGlmIChlbnZ2YXJzW29tcF92YXJdLnBhcnNlX2Z1 bmMgKCplbnYsIGVudl92YWwsIHBhcmFtcykpCisJCXsKKwkJICBmb3IgKGkgPSAwOyBpIDwg MzsgKytpKQorCQkgICAgaWYgKGVudnZhcnNbb21wX3Zhcl0uZmxhZ192YXJzW2ldKQorCQkg ICAgICBnb21wX3NldF9pY3ZfZmxhZyAoZmxhZ192YXJfYWRkciwKKwkJCQkJIGVudnZhcnNb b21wX3Zhcl0uZmxhZ192YXJzW2ldKTsKKwkJICAgIGVsc2UKKwkJICAgICAgYnJlYWs7CisJ CX0KKworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgbmV4dF92YXI6CisgICAgfQor CisgICAgYWxsID0gZ29tcF9nZXRfaW5pdGlhbF9pY3ZfaXRlbSAoLTIpOworICAgIGZvciAo b21wX3ZhciA9IDA7IG9tcF92YXIgPCBPTVBfSE9TVF9WQVJfQ05UOyBvbXBfdmFyKyspCisg ICAgICB7CisJaWYgKG5vbmUgIT0gTlVMTAorCSAgICAmJiBnb21wX2dldF9pY3ZfZmxhZyAo bm9uZS0+ZmxhZ3MsIGhvc3RfZW52dmFyc1tvbXBfdmFyXS5mbGFnX3ZhcikpCisJICBnZXRf aWN2X21lbWJlcl9hZGRyICgmbm9uZS0+aWN2cywKKwkJCSAgICAgICBob3N0X2VudnZhcnNb b21wX3Zhcl0uZmxhZ192YXIsIHBhcmFtcyk7CisJZWxzZSBpZiAoYWxsICE9IE5VTEwKKwkJ ICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZsYWdzLAorCQkJCSAgICAgICBob3N0X2Vu dnZhcnNbb21wX3Zhcl0uZmxhZ192YXIpKQorCSAgZ2V0X2ljdl9tZW1iZXJfYWRkciAoJmFs bC0+aWN2cywgaG9zdF9lbnZ2YXJzW29tcF92YXJdLmZsYWdfdmFyLAorCQkJICAgICAgIHBh cmFtcyk7CisJZWxzZQorCSAgY29udGludWU7CisKKwlzd2l0Y2ggKGhvc3RfZW52dmFyc1tv bXBfdmFyXS50eXBlX2NvZGUpCisJICB7CisJICBjYXNlIFBBUlNFX0lOVDoKKwkgICAgZm9y IChpID0gMDsgaSA8IDM7ICsraSkKKwkgICAgICBpZiAoaG9zdF9lbnZ2YXJzW29tcF92YXJd LmRlc3RbaV0gIT0gTlVMTCAmJiBwYXJhbXNbaV0gIT0gTlVMTCkKKwkJKihpbnQgKikgKGhv c3RfZW52dmFyc1tvbXBfdmFyXS5kZXN0W2ldKSA9ICooaW50ICopIHBhcmFtc1tpXTsKKwkg ICAgYnJlYWs7CisJICBjYXNlIFBBUlNFX0JPT0w6CisJICAgIGZvciAoaSA9IDA7IGkgPCAz OyArK2kpCisJICAgICAgaWYgKGhvc3RfZW52dmFyc1tvbXBfdmFyXS5kZXN0W2ldICE9IE5V TEwgJiYgcGFyYW1zW2ldICE9IE5VTEwpCisJCSooYm9vbCAqKSAoaG9zdF9lbnZ2YXJzW29t cF92YXJdLmRlc3RbaV0pID0gKihib29sICopIHBhcmFtc1tpXTsKKwkgICAgYnJlYWs7CisJ ICBjYXNlIFBBUlNFX1VJTlQ6CisJICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpCisJICAg ICAgaWYgKGhvc3RfZW52dmFyc1tvbXBfdmFyXS5kZXN0W2ldICE9IE5VTEwgJiYgcGFyYW1z W2ldICE9IE5VTEwpCisJCSoodW5zaWduZWQgaW50ICopIChob3N0X2VudnZhcnNbb21wX3Zh cl0uZGVzdFtpXSkKKwkJICA9ICoodW5zaWduZWQgaW50ICopIHBhcmFtc1tpXTsKKwkgICAg YnJlYWs7CisJICBjYXNlIFBBUlNFX1VMT05HOgorCSAgICBmb3IgKGkgPSAwOyBpIDwgMzsg KytpKQorCSAgICAgIGlmIChob3N0X2VudnZhcnNbb21wX3Zhcl0uZGVzdFtpXSAhPSBOVUxM ICYmIHBhcmFtc1tpXSAhPSBOVUxMKQorCQkqKHVuc2lnbmVkIGxvbmcgKikgKGhvc3RfZW52 dmFyc1tvbXBfdmFyXS5kZXN0W2ldKQorCQkgID0gKih1bnNpZ25lZCBsb25nICopIHBhcmFt c1tpXTsKKwkgICAgYnJlYWs7CisJICBjYXNlIFBBUlNFX0NIQVI6CisJICAgIGZvciAoaSA9 IDA7IGkgPCAzOyArK2kpCisJICAgICAgaWYgKGhvc3RfZW52dmFyc1tvbXBfdmFyXS5kZXN0 W2ldICE9IE5VTEwgJiYgcGFyYW1zW2ldICE9IE5VTEwpCisJCSooY2hhciAqKSAoaG9zdF9l bnZ2YXJzW29tcF92YXJdLmRlc3RbaV0pID0gKihjaGFyICopIHBhcmFtc1tpXTsKKwkgICAg YnJlYWs7CisJICBjYXNlIFBBUlNFX1VDSEFSOgorCSAgICBmb3IgKGkgPSAwOyBpIDwgMzsg KytpKQorCSAgICAgIGlmIChob3N0X2VudnZhcnNbb21wX3Zhcl0uZGVzdFtpXSAhPSBOVUxM ICYmIHBhcmFtc1tpXSAhPSBOVUxMKQorCQkqKHVuc2lnbmVkIGNoYXIgKikgKGhvc3RfZW52 dmFyc1tvbXBfdmFyXS5kZXN0W2ldKQorCQkgID0gKih1bnNpZ25lZCBjaGFyICopIHBhcmFt c1tpXTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9CisKKyAgaWYgKCgobm9uZSAhPSBO VUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChub25lLT5mbGFncywgR09NUF9JQ1ZfQklORCkp CisgICAgICAgfHwgKGFsbCAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZs YWdzLCBHT01QX0lDVl9CSU5EKSkpCiAgICAgICAmJiBnb21wX2dsb2JhbF9pY3YuYmluZF92 YXIgPT0gb21wX3Byb2NfYmluZF9mYWxzZSkKICAgICBpZ25vcmUgPSB0cnVlOwotICBpZiAo cGFyc2VfdW5zaWduZWRfbG9uZyAoIk9NUF9NQVhfQUNUSVZFX0xFVkVMUyIsCi0JCQkgICAm bWF4X2FjdGl2ZV9sZXZlbHNfdmFyLCB0cnVlKSkKLSAgICBnb21wX2dsb2JhbF9pY3YubWF4 X2FjdGl2ZV9sZXZlbHNfdmFyCi0gICAgICA9IChtYXhfYWN0aXZlX2xldmVsc192YXIgPiBn b21wX3N1cHBvcnRlZF9hY3RpdmVfbGV2ZWxzKQotCT8gZ29tcF9zdXBwb3J0ZWRfYWN0aXZl X2xldmVscyA6IG1heF9hY3RpdmVfbGV2ZWxzX3ZhcjsKLSAgZWxzZQorCisgIGlmICghKChu b25lICE9IE5VTEwKKwkgJiYgZ29tcF9nZXRfaWN2X2ZsYWcgKG5vbmUtPmZsYWdzLCBHT01Q X0lDVl9NQVhfQUNUSVZFX0xFVkVMUykpCisgICAgICAgfHwgKGFsbCAhPSBOVUxMCisJICAg JiYgZ29tcF9nZXRfaWN2X2ZsYWcgKGFsbC0+ZmxhZ3MsIEdPTVBfSUNWX01BWF9BQ1RJVkVf TEVWRUxTKSkpKQogICAgIHsKICAgICAgIGJvb2wgbmVzdGVkID0gdHJ1ZTsKKyAgICAgIGNv bnN0IGNoYXIgKmVudiA9IGdldGVudiAoIk9NUF9ORVNURUQiKTsKIAogICAgICAgLyogT01Q X05FU1RFRCBpcyBkZXByZWNhdGVkIGluIE9wZW5NUCA1LjAuICAqLwotICAgICAgaWYgKHBh cnNlX2Jvb2xlYW4gKCJPTVBfTkVTVEVEIiwgJm5lc3RlZCkpCisgICAgICBpZiAocGFyc2Vf Ym9vbGVhbiAoIk9NUF9ORVNURUQiLCBlbnYsICh2b2lkICpbXSkgeyZuZXN0ZWR9KSkKIAln b21wX2dsb2JhbF9pY3YubWF4X2FjdGl2ZV9sZXZlbHNfdmFyCiAJICA9IG5lc3RlZCA/IGdv bXBfc3VwcG9ydGVkX2FjdGl2ZV9sZXZlbHMgOiAxOwogICAgICAgZWxzZSBpZiAoZ29tcF9u dGhyZWFkc192YXJfbGlzdF9sZW4gPiAxIHx8IGdvbXBfYmluZF92YXJfbGlzdF9sZW4gPiAx KQogCWdvbXBfZ2xvYmFsX2ljdi5tYXhfYWN0aXZlX2xldmVsc192YXIgPSBnb21wX3N1cHBv cnRlZF9hY3RpdmVfbGV2ZWxzOwogICAgIH0KKworICAvKiBQcm9jZXNzIEdPTVBfKiB2YXJp YWJsZXMgYW5kIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHBhcnNlZCBJQ1ZzLiAgKi8KKyAgcGFy c2VfaW50X3NlY3VyZSAoIkdPTVBfREVCVUciLCAmZ29tcF9kZWJ1Z192YXIsIHRydWUpOwor CiAgIC8qIE1ha2Ugc3VyZSBPTVBfUExBQ0VTIGFuZCBHT01QX0NQVV9BRkZJTklUWSBlbnYg dmFycyBhcmUgYWx3YXlzCiAgICAgIHBhcnNlZCBpZiBwcmVzZW50IGluIHRoZSBlbnZpcm9u bWVudC4gIElmIE9NUF9QUk9DX0JJTkQgd2FzIHNldAogICAgICBleHBsaWNpdGx5IHRvIGZh bHNlLCBkb24ndCBwb3B1bGF0ZSBwbGFjZXMgbGlzdCB0aG91Z2guICBJZiBwbGFjZXMKQEAg LTE1NDcsNyArMjI1MSwxMSBAQCBpbml0aWFsaXplX2VudiAodm9pZCkKICAgICAgIGdvbXBf c2V0X2FmZmluaXR5X2Zvcm1hdCAoZW52LCBzdHJsZW4gKGVudikpOwogICB9CiAKLSAgd2Fp dF9wb2xpY3kgPSBwYXJzZV93YWl0X3BvbGljeSAoKTsKKyAgaWYgKG5vbmUgIT0gTlVMTCAm JiBnb21wX2dldF9pY3ZfZmxhZyAobm9uZS0+ZmxhZ3MsIEdPTVBfSUNWX1dBSVRfUE9MSUNZ KSkKKyAgICB3YWl0X3BvbGljeSA9IG5vbmUtPmljdnMud2FpdF9wb2xpY3k7CisgIGVsc2Ug aWYgKGFsbCAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZsYWdzLCBHT01Q X0lDVl9XQUlUX1BPTElDWSkpCisgICAgd2FpdF9wb2xpY3kgPSBhbGwtPmljdnMud2FpdF9w b2xpY3k7CisKICAgaWYgKCFwYXJzZV9zcGluY291bnQgKCJHT01QX1NQSU5DT1VOVCIsICZn b21wX3NwaW5fY291bnRfdmFyKSkKICAgICB7CiAgICAgICAvKiBVc2luZyBhIHJvdWdoIGVz dGltYXRpb24gb2YgMTAwMDAwIHNwaW5zIHBlciBtc2VjLApAQCAtMTU3Myw4ICsyMjgxLDIx IEBAIGluaXRpYWxpemVfZW52ICh2b2lkKQogICAvKiBOb3Qgc3RyaWN0bHkgZW52aXJvbm1l bnQgcmVsYXRlZCwgYnV0IG9yZGVyaW5nIGNvbnN0cnVjdG9ycyBpcyB0cmlja3kuICAqLwog ICBwdGhyZWFkX2F0dHJfaW5pdCAoJmdvbXBfdGhyZWFkX2F0dHIpOwogCi0gIGlmIChwYXJz ZV9zdGFja3NpemUgKCJPTVBfU1RBQ0tTSVpFIiwgJnN0YWNrc2l6ZSkKLSAgICAgIHx8IHBh cnNlX3N0YWNrc2l6ZSAoIkdPTVBfU1RBQ0tTSVpFIiwgJnN0YWNrc2l6ZSkKKyAgaWYgKCEo bm9uZSAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChub25lLT5mbGFncywgR09NUF9J Q1ZfU1RBQ0tTSVpFKSkpCisgICAgeworICAgICAgY29uc3QgY2hhciAqZW52ID0gZ2V0ZW52 ICgiR09NUF9TVEFDS1NJWkUiKTsKKyAgICAgIGlmIChlbnYgIT0gTlVMTAorCSAgJiYgcGFy c2Vfc3RhY2tzaXplICgiR09NUF9TVEFDS1NJWkUiLCBlbnYsCisJCQkgICAgICAodm9pZCAq WzNdKSB7Jm5vbmUtPmljdnMuc3RhY2tzaXplfSkpCisJZ29tcF9zZXRfaWN2X2ZsYWcgKCZu b25lLT5mbGFncywgR09NUF9JQ1ZfU1RBQ0tTSVpFKTsKKyAgICB9CisgIGlmIChub25lICE9 IE5VTEwgJiYgZ29tcF9nZXRfaWN2X2ZsYWcgKG5vbmUtPmZsYWdzLCBHT01QX0lDVl9TVEFD S1NJWkUpKQorICAgIHN0YWNrc2l6ZSA9IG5vbmUtPmljdnMuc3RhY2tzaXplOworICBlbHNl IGlmIChhbGwgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09N UF9JQ1ZfU1RBQ0tTSVpFKSkKKyAgICBzdGFja3NpemUgPSBhbGwtPmljdnMuc3RhY2tzaXpl OworCisgIGlmICgobm9uZSAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChub25lLT5m bGFncywgR09NUF9JQ1ZfU1RBQ0tTSVpFKSkKKyAgICAgIHx8IChhbGwgIT0gTlVMTCAmJiBn b21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfU1RBQ0tTSVpFKSkKICAg ICAgIHx8IEdPTVBfREVGQVVMVF9TVEFDS1NJWkUpCiAgICAgewogICAgICAgaW50IGVycjsK QEAgLTE2MDEsNyArMjMyMiw4IEBAIGluaXRpYWxpemVfZW52ICh2b2lkKQogCiAgIC8qIE9w ZW5BQ0MuICAqLwogCi0gIGlmICghcGFyc2VfaW50ICgiQUNDX0RFVklDRV9OVU0iLCAmZ29h Y2NfZGV2aWNlX251bSwgdHJ1ZSkpCisgIGlmICghcGFyc2VfaW50ICgiQUNDX0RFVklDRV9O VU0iLCBnZXRlbnYgKCJBQ0NfREVWSUNFX05VTSIpLAorCQkgICh2b2lkICpbXSkgeyZnb2Fj Y19kZXZpY2VfbnVtLCAodm9pZCAqKSB0cnVlfSkpCiAgICAgZ29hY2NfZGV2aWNlX251bSA9 IDA7CiAKICAgcGFyc2VfYWNjX2RldmljZV90eXBlICgpOwpkaWZmIC0tZ2l0IGEvbGliZ29t cC9pY3YtZGV2aWNlLmMgYi9saWJnb21wL2ljdi1kZXZpY2UuYwppbmRleCAxMWNlYjMwLi5k OGFjZjBlIDEwMDY0NAotLS0gYS9saWJnb21wL2ljdi1kZXZpY2UuYworKysgYi9saWJnb21w L2ljdi1kZXZpY2UuYwpAQCAtODAsMyArODAsMjAgQEAgb21wX2dldF9kZXZpY2VfbnVtICh2 b2lkKQogfQogCiBpYWxpYXMgKG9tcF9nZXRfZGV2aWNlX251bSkKKworaW50CitvbXBfZ2V0 X21heF90ZWFtcyAodm9pZCkKK3sKKyAgcmV0dXJuIGdvbXBfbnRlYW1zX3ZhcjsKK30KKwor aWFsaWFzIChvbXBfZ2V0X21heF90ZWFtcykKKwordm9pZAorb21wX3NldF9udW1fdGVhbXMg KGludCBudW1fdGVhbXMpCit7CisgIGlmIChudW1fdGVhbXMgPj0gMCkKKyAgICBnb21wX250 ZWFtc192YXIgPSBudW1fdGVhbXM7Cit9CisKK2lhbGlhcyAob21wX3NldF9udW1fdGVhbXMp CmRpZmYgLS1naXQgYS9saWJnb21wL2ljdi5jIGIvbGliZ29tcC9pY3YuYwppbmRleCBkZTE1 Y2M4Li5kZjQyM2MwIDEwMDY0NAotLS0gYS9saWJnb21wL2ljdi5jCisrKyBiL2xpYmdvbXAv aWN2LmMKQEAgLTE0OSwxOSArMTQ5LDYgQEAgb21wX2dldF9zdXBwb3J0ZWRfYWN0aXZlX2xl dmVscyAodm9pZCkKIH0KIAogdm9pZAotb21wX3NldF9udW1fdGVhbXMgKGludCBudW1fdGVh bXMpCi17Ci0gIGlmIChudW1fdGVhbXMgPj0gMCkKLSAgICBnb21wX250ZWFtc192YXIgPSBu dW1fdGVhbXM7Ci19Ci0KLWludAotb21wX2dldF9tYXhfdGVhbXMgKHZvaWQpCi17Ci0gIHJl dHVybiBnb21wX250ZWFtc192YXI7Ci19Ci0KLXZvaWQKIG9tcF9zZXRfdGVhbXNfdGhyZWFk X2xpbWl0IChpbnQgdGhyZWFkX2xpbWl0KQogewogICBpZiAodGhyZWFkX2xpbWl0ID49IDAp CkBAIC0yNzQsOCArMjYxLDYgQEAgaWFsaWFzIChvbXBfZ2V0X3RocmVhZF9saW1pdCkKIGlh bGlhcyAob21wX3NldF9tYXhfYWN0aXZlX2xldmVscykKIGlhbGlhcyAob21wX2dldF9tYXhf YWN0aXZlX2xldmVscykKIGlhbGlhcyAob21wX2dldF9zdXBwb3J0ZWRfYWN0aXZlX2xldmVs cykKLWlhbGlhcyAob21wX3NldF9udW1fdGVhbXMpCi1pYWxpYXMgKG9tcF9nZXRfbWF4X3Rl YW1zKQogaWFsaWFzIChvbXBfc2V0X3RlYW1zX3RocmVhZF9saW1pdCkKIGlhbGlhcyAob21w X2dldF90ZWFtc190aHJlYWRfbGltaXQpCiBpYWxpYXMgKG9tcF9nZXRfY2FuY2VsbGF0aW9u KQpkaWZmIC0tZ2l0IGEvbGliZ29tcC9saWJnb21wLXBsdWdpbi5oIGIvbGliZ29tcC9saWJn b21wLXBsdWdpbi5oCmluZGV4IGFiM2VkNjMuLjcxYTMwN2YgMTAwNjQ0Ci0tLSBhL2xpYmdv bXAvbGliZ29tcC1wbHVnaW4uaAorKysgYi9saWJnb21wL2xpYmdvbXAtcGx1Z2luLmgKQEAg LTEwMiwxMSArMTAyLDExIEBAIHN0cnVjdCBhZGRyX3BhaXIKICAgdWludHB0cl90IGVuZDsK IH07CiAKLS8qIFRoaXMgc3ltYm9sIGlzIHRvIG5hbWUgYSB0YXJnZXQgc2lkZSB2YXJpYWJs ZSB0aGF0IGhvbGRzIHRoZSBkZXNpZ25hdGVkCi0gICAnZGV2aWNlIG51bWJlcicgb2YgdGhl IHRhcmdldCBkZXZpY2UuIFRoZSBzeW1ib2wgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIHRvCi0g ICBsaWJnb21wIGNvZGUgYW5kIHRoZSBvZmZsb2FkIHBsdWdpbiAod2hpY2ggaW4gdGhlIGxh dHRlciBjYXNlIG11c3QgYmUKLSAgIHN0cmluZ2lmaWVkKS4gICovCi0jZGVmaW5lIEdPTVBf REVWSUNFX05VTV9WQVIgX19nb21wX2RldmljZV9udW0KKy8qIFRoaXMgZm9sbG93aW5nIHN5 bWJvbCBpcyB1c2VkIHRvIG5hbWUgdGhlIHRhcmdldCBzaWRlIHZhcmlhYmxlIHN0cnVjdCB0 aGF0CisgICBob2xkcyB0aGUgZGVzaWduYXRlZCBJQ1ZzIG9mIHRoZSB0YXJnZXQgZGV2aWNl LiBUaGUgc3ltYm9sIG5lZWRzIHRvIGJlCisgICBhdmFpbGFibGUgdG8gbGliZ29tcCBjb2Rl IGFuZCB0aGUgb2ZmbG9hZCBwbHVnaW4gKHdoaWNoIGluIHRoZSBsYXR0ZXIgY2FzZQorICAg bXVzdCBiZSBzdHJpbmdpZmllZCkuICAqLworI2RlZmluZSBHT01QX0FERElUSU9OQUxfSUNW UyBfX2dvbXBfYWRkaXRpb25hbF9pY3ZzCiAKIC8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25z LiAgKi8KIGV4dGVybiB2b2lkICpHT01QX1BMVUdJTl9tYWxsb2MgKHNpemVfdCkgX19hdHRy aWJ1dGVfXyAoKG1hbGxvYykpOwpkaWZmIC0tZ2l0IGEvbGliZ29tcC9saWJnb21wLmggYi9s aWJnb21wL2xpYmdvbXAuaAppbmRleCBjMjQzYzRkLi44NGU4NWYxIDEwMDY0NAotLS0gYS9s aWJnb21wL2xpYmdvbXAuaAorKysgYi9saWJnb21wL2xpYmdvbXAuaApAQCAtNDUzLDYgKzQ1 MywzMSBAQCBzdHJ1Y3QgZ29tcF90ZWFtX3N0YXRlCiAKIHN0cnVjdCB0YXJnZXRfbWVtX2Rl c2M7CiAKK2VudW0gZ29tcF9pY3ZzCit7CisgICBHT01QX0lDVl9OVEVBTVMgPSAxLAorICAg R09NUF9JQ1ZfU0NIRURVTEUgPSAyLAorICAgR09NUF9JQ1ZfU0NIRURVTEVfQ0hVTktfU0la RSA9IDMsCisgICBHT01QX0lDVl9EWU5BTUlDID0gNCwKKyAgIEdPTVBfSUNWX1RFQU1TX1RI UkVBRF9MSU1JVCA9IDUsCisgICBHT01QX0lDVl9USFJFQURfTElNSVQgPSA2LAorICAgR09N UF9JQ1ZfTlRIUkVBRFMgPSA3LAorICAgR09NUF9JQ1ZfTlRIUkVBRFNfTElTVCA9IDgsCisg ICBHT01QX0lDVl9OVEhSRUFEU19MSVNUX0xFTiA9IDksCisgICBHT01QX0lDVl9CSU5EID0g MTAsCisgICBHT01QX0lDVl9CSU5EX0xJU1QgPSAxMSwKKyAgIEdPTVBfSUNWX0JJTkRfTElT VF9MRU4gPSAxMiwKKyAgIEdPTVBfSUNWX01BWF9BQ1RJVkVfTEVWRUxTID0gMTMsCisgICBH T01QX0lDVl9XQUlUX1BPTElDWSA9IDE0LAorICAgR09NUF9JQ1ZfU1RBQ0tTSVpFID0gMTUs CisgICBHT01QX0lDVl9ERUZBVUxUX0RFVklDRSA9IDE2LAorICAgR09NUF9JQ1ZfQ0FOQ0VM TEFUSU9OID0gMTcsCisgICBHT01QX0lDVl9ESVNQTEFZX0FGRklOSVRZID0gMTgsCisgICBH T01QX0lDVl9UQVJHRVRfT0ZGTE9BRCA9IDE5LAorICAgR09NUF9JQ1ZfTUFYX1RBU0tfUFJJ T1JJVFkgPSAyMCwKKyAgIEdPTVBfSUNWX0FMTE9DQVRPUiA9IDIxCit9OworCiAvKiBUaGVz ZSBhcmUgdGhlIE9wZW5NUCA0LjAgSW50ZXJuYWwgQ29udHJvbCBWYXJpYWJsZXMgZGVzY3Jp YmVkIGluCiAgICBzZWN0aW9uIDIuMy4xLiAgVGhvc2UgZGVzY3JpYmVkIGFzIGhhdmluZyBv bmUgY29weSBwZXIgdGFzayBhcmUKICAgIHN0b3JlZCB3aXRoaW4gdGhlIHN0cnVjdHVyZTsg dGhvc2UgZGVzY3JpYmVkIGFzIGhhdmluZyBvbmUgY29weQpAQCAtNDcyLDYgKzQ5Nyw4NiBA QCBzdHJ1Y3QgZ29tcF90YXNrX2ljdgogICBzdHJ1Y3QgdGFyZ2V0X21lbV9kZXNjICp0YXJn ZXRfZGF0YTsKIH07CiAKK2VudW0gZ29tcF9lbnZfc3VmZml4Cit7CisgIEdPTVBfRU5WX1NV RkZJWF9VTktOT1dOID0gMCwKKyAgR09NUF9FTlZfU1VGRklYX05PTkUgPSAxLAorICBHT01Q X0VOVl9TVUZGSVhfREVWID0gMiwKKyAgR09NUF9FTlZfU1VGRklYX0FMTCA9IDQsCisgIEdP TVBfRU5WX1NVRkZJWF9ERVZfWCA9IDgKK307CisKKy8qIFN0cnVjdCB0aGF0IGNvbnRhaW5z IGFsbCBJQ1ZzIGZvciB3aGljaCB3ZSBuZWVkIHRvIHN0b3JlIGluaXRpYWwgdmFsdWVzLgor ICAgS2VlcGluZyB0aGUgaW5pdGlhbCB2YWx1ZXMgaXMgbmVlZGVkIGZvciBvbXBfZGlzcGxh eV9lbnYuICBNb3Jlb3ZlciBpbml0aWFsCisgICBfREVWIGFuZCBfQUxMIHZhcmlhbnRzIG9m IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYWxzbyB1c2VkIHRvIGRldGVybWluZQorICAg YWN0dWFsbHkgdXNlZCB2YWx1ZXMgZm9yIGRldmljZXMgYW5kIGZvciB0aGUgaG9zdC4gICov CitzdHJ1Y3QgZ29tcF9pbml0aWFsX2ljdnMKK3sKKyAgdW5zaWduZWQgbG9uZyAqbnRocmVh ZHNfdmFyX2xpc3Q7CisgIGNoYXIgKmJpbmRfdmFyX2xpc3Q7CisgIHVuc2lnbmVkIGxvbmcg bnRocmVhZHNfdmFyOworICB1bnNpZ25lZCBsb25nIG50aHJlYWRzX3Zhcl9saXN0X2xlbjsK KyAgdW5zaWduZWQgbG9uZyBiaW5kX3Zhcl9saXN0X2xlbjsKKyAgdW5zaWduZWQgbG9uZyBz dGFja3NpemU7CisgIGludCBydW5fc2NoZWRfY2h1bmtfc2l6ZTsKKyAgaW50IGRlZmF1bHRf ZGV2aWNlX3ZhcjsKKyAgaW50IG50ZWFtc192YXI7CisgIGludCB0ZWFtc190aHJlYWRfbGlt aXRfdmFyOworICBpbnQgd2FpdF9wb2xpY3k7CisgIHVuc2lnbmVkIGludCB0aHJlYWRfbGlt aXRfdmFyOworICBlbnVtIGdvbXBfc2NoZWR1bGVfdHlwZSBydW5fc2NoZWRfdmFyOworICBi b29sIGR5bl92YXI7CisgIHVuc2lnbmVkIGNoYXIgbWF4X2FjdGl2ZV9sZXZlbHNfdmFyOwor ICBjaGFyIGJpbmRfdmFyOworfTsKKworc3RydWN0IGdvbXBfZGVmYXVsdF9pY3ZfdAorewor ICBlbnVtIGdvbXBfc2NoZWR1bGVfdHlwZSBydW5fc2NoZWRfdmFyOworICBpbnQgcnVuX3Nj aGVkX2NodW5rX3NpemU7CisgIHVuc2lnbmVkIGNoYXIgbWF4X2FjdGl2ZV9sZXZlbHNfdmFy OworICBjaGFyIGJpbmRfdmFyOworICBpbnQgbnRlYW1zX3ZhcjsKKyAgaW50IHRlYW1zX3Ro cmVhZF9saW1pdF92YXI7CisgIGludCBkZWZhdWx0X2RldmljZV92YXI7Cit9OworZXh0ZXJu IHN0cnVjdCBnb21wX2RlZmF1bHRfaWN2X3QgZ29tcF9kZWZhdWx0X2ljdl92YWx1ZXM7CisK Ky8qICBERVZJQ0VfTlVNICItMSIgaXMgcmVzZXJ2ZWQgZm9yICJfREVWIiBpY3ZzLgorICAg IERFVklDRV9OVU0gIi0yIiBpcyByZXNlcnZlZCBmb3IgIl9BTEwiIGljdnMuCisgICAgREVW SUNFX05VTSAiLTMiIGlzIHJlc2VydmVkIGZvciBJQ1ZzIHdpdGhvdXQgc3VmZml4LgorICAg IE5vbi1uZWdhdGl2ZSBERVZJQ0VfTlVNIGlzIGZvciAiX0RFVl9YIiBpY3ZzLiAgKi8KK3N0 cnVjdCBnb21wX2ljdl9saXN0Cit7CisgIGludCBkZXZpY2VfbnVtOworICBzdHJ1Y3QgZ29t cF9pbml0aWFsX2ljdnMgaWN2czsKKyAgdWludDMyX3QgZmxhZ3M7CisgIHN0cnVjdCBnb21w X2ljdl9saXN0ICpuZXh0OworfTsKK2V4dGVybiBzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCAqZ29t cF9pbml0aWFsX2ljdl9saXN0OworZXh0ZXJuIHN0cnVjdCBnb21wX2ljdl9saXN0ICpnb21w X2dldF9pbml0aWFsX2ljdl9pdGVtIChpbnQgZGV2X251bSk7CisKK2V4dGVybiBib29sIGdv bXBfZ2V0X2ljdl9mbGFnICh1aW50MzJfdCB2YWx1ZSwgZW51bSBnb21wX2ljdnMgaWN2KTsK K2V4dGVybiBzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCogZ29tcF9hZGRfZGV2aWNlX3NwZWNpZmlj X2ljdgorICAoaW50IGRldl9udW0sIHNpemVfdCBzaXplLCBzdHJ1Y3QgZ29tcF9pY3ZfbGlz dCAqKmxpc3QpOworCitzdHJ1Y3QgZ29tcF9vZmZsb2FkX2ljdnMKK3sKKyAgaW50IGRldmlj ZV9udW07CisgIGludCBkZWZhdWx0X2RldmljZTsKKyAgaW50IG50ZWFtczsKKyAgaW50IHRl YW1zX3RocmVhZF9saW1pdDsKK307CisKK3N0cnVjdCBnb21wX29mZmxvYWRfaWN2X2xpc3QK K3sKKyAgaW50IGRldmljZV9udW07CisgIHN0cnVjdCBnb21wX29mZmxvYWRfaWN2cyBpY3Zz OworICBzdHJ1Y3QgZ29tcF9vZmZsb2FkX2ljdl9saXN0ICpuZXh0OworfTsKK2V4dGVybiBz dHJ1Y3QgZ29tcF9vZmZsb2FkX2ljdl9saXN0ICpnb21wX29mZmxvYWRfaWN2X2xpc3Q7Citl eHRlcm4gc3RydWN0IGdvbXBfb2ZmbG9hZF9pY3ZfbGlzdCAqZ29tcF9nZXRfb2ZmbG9hZF9p Y3ZfaXRlbSAoaW50IGRldl9udW0pOworCiBlbnVtIGdvbXBfdGFyZ2V0X29mZmxvYWRfdAog ewogICBHT01QX1RBUkdFVF9PRkZMT0FEX0RFRkFVTFQsCmRpZmYgLS1naXQgYS9saWJnb21w L3BsdWdpbi9wbHVnaW4tZ2NuLmMgYi9saWJnb21wL3BsdWdpbi9wbHVnaW4tZ2NuLmMKaW5k ZXggZWEzMjdiZi4uODgyMTg3MCAxMDA2NDQKLS0tIGEvbGliZ29tcC9wbHVnaW4vcGx1Z2lu LWdjbi5jCisrKyBiL2xpYmdvbXAvcGx1Z2luL3BsdWdpbi1nY24uYwpAQCAtMzM2Nyw2ICsz MzY3LDcgQEAgR09NUF9PRkZMT0FEX2xvYWRfaW1hZ2UgKGludCBvcmQsIHVuc2lnbmVkIHZl cnNpb24sIGNvbnN0IHZvaWQgKnRhcmdldF9kYXRhLAogICBzdHJ1Y3Qga2VybmVsX2luZm8g Kmtlcm5lbDsKICAgaW50IGtlcm5lbF9jb3VudCA9IGltYWdlX2Rlc2MtPmtlcm5lbF9jb3Vu dDsKICAgdW5zaWduZWQgdmFyX2NvdW50ID0gaW1hZ2VfZGVzYy0+Z2xvYmFsX3ZhcmlhYmxl X2NvdW50OworICAvKiBDdXJyZW50bHksICJvdGhlcnMiIGlzIGEgc3RydWN0IG9mIElDVlMu ICAqLwogICBpbnQgb3RoZXJfY291bnQgPSAxOwogCiAgIGFnZW50ID0gZ2V0X2FnZW50X2lu Zm8gKG9yZCk7CkBAIC0zNDY0LDM2ICszNDY1LDM5IEBAIEdPTVBfT0ZGTE9BRF9sb2FkX2lt YWdlIChpbnQgb3JkLCB1bnNpZ25lZCB2ZXJzaW9uLCBjb25zdCB2b2lkICp0YXJnZXRfZGF0 YSwKIAl9CiAgICAgfQogCi0gIEdDTl9ERUJVRyAoIkxvb2tpbmcgZm9yIHZhcmlhYmxlICVz XG4iLCBYU1RSSU5HIChHT01QX0RFVklDRV9OVU1fVkFSKSk7CisgIEdDTl9ERUJVRyAoIkxv b2tpbmcgZm9yIHZhcmlhYmxlICVzXG4iLCBYU1RSSU5HIChHT01QX0FERElUSU9OQUxfSUNW UykpOwogCiAgIGhzYV9zdGF0dXNfdCBzdGF0dXM7CiAgIGhzYV9leGVjdXRhYmxlX3N5bWJv bF90IHZhcl9zeW1ib2w7CiAgIHN0YXR1cyA9IGhzYV9mbnMuaHNhX2V4ZWN1dGFibGVfZ2V0 X3N5bWJvbF9mbiAoYWdlbnQtPmV4ZWN1dGFibGUsIE5VTEwsCi0JCQkJCQkgWFNUUklORyAo R09NUF9ERVZJQ0VfTlVNX1ZBUiksCisJCQkJCQkgWFNUUklORyAoR09NUF9BRERJVElPTkFM X0lDVlMpLAogCQkJCQkJIGFnZW50LT5pZCwgMCwgJnZhcl9zeW1ib2wpOwogICBpZiAoc3Rh dHVzID09IEhTQV9TVEFUVVNfU1VDQ0VTUykKICAgICB7Ci0gICAgICB1aW50NjRfdCBkZXZp Y2VfbnVtX3ZhcnB0cjsKLSAgICAgIHVpbnQzMl90IGRldmljZV9udW1fdmFyc2l6ZTsKKyAg ICAgIHVpbnQ2NF90IHZhcnB0cjsKKyAgICAgIHVpbnQzMl90IHZhcnNpemU7CiAKICAgICAg IHN0YXR1cyA9IGhzYV9mbnMuaHNhX2V4ZWN1dGFibGVfc3ltYm9sX2dldF9pbmZvX2ZuCiAJ KHZhcl9zeW1ib2wsIEhTQV9FWEVDVVRBQkxFX1NZTUJPTF9JTkZPX1ZBUklBQkxFX0FERFJF U1MsCi0JICZkZXZpY2VfbnVtX3ZhcnB0cik7CisJICZ2YXJwdHIpOwogICAgICAgaWYgKHN0 YXR1cyAhPSBIU0FfU1RBVFVTX1NVQ0NFU1MpCiAJaHNhX2ZhdGFsICgiQ291bGQgbm90IGV4 dHJhY3QgYSB2YXJpYWJsZSBmcm9tIGl0cyBzeW1ib2wiLCBzdGF0dXMpOwogICAgICAgc3Rh dHVzID0gaHNhX2Zucy5oc2FfZXhlY3V0YWJsZV9zeW1ib2xfZ2V0X2luZm9fZm4KIAkodmFy X3N5bWJvbCwgSFNBX0VYRUNVVEFCTEVfU1lNQk9MX0lORk9fVkFSSUFCTEVfU0laRSwKLQkg JmRldmljZV9udW1fdmFyc2l6ZSk7CisJICZ2YXJzaXplKTsKICAgICAgIGlmIChzdGF0dXMg IT0gSFNBX1NUQVRVU19TVUNDRVNTKQotCWhzYV9mYXRhbCAoIkNvdWxkIG5vdCBleHRyYWN0 IGEgdmFyaWFibGUgc2l6ZSBmcm9tIGl0cyBzeW1ib2wiLCBzdGF0dXMpOworCWhzYV9mYXRh bCAoIkNvdWxkIG5vdCBleHRyYWN0IGEgdmFyaWFibGUgc2l6ZSBmcm9tIGl0cyBzeW1ib2wi LAorCQkgICBzdGF0dXMpOwogCi0gICAgICBwYWlyLT5zdGFydCA9IGRldmljZV9udW1fdmFy cHRyOwotICAgICAgcGFpci0+ZW5kID0gZGV2aWNlX251bV92YXJwdHIgKyBkZXZpY2VfbnVt X3ZhcnNpemU7CisgICAgICBwYWlyLT5zdGFydCA9IHZhcnB0cjsKKyAgICAgIHBhaXItPmVu ZCA9IHZhcnB0ciArIHZhcnNpemU7CiAgICAgfQogICBlbHNlCi0gICAgLyogVGhlICdHT01Q X0RFVklDRV9OVU1fVkFSJyB2YXJpYWJsZSB3YXMgbm90IGluIHRoaXMgaW1hZ2UuICAqLwot ICAgIHBhaXItPnN0YXJ0ID0gcGFpci0+ZW5kID0gMDsKLSAgcGFpcisrOworICAgIHsKKyAg ICAgIC8qIFRoZSB2YXJpYWJsZSB3YXMgbm90IGluIHRoaXMgaW1hZ2UuICAqLworICAgICAg R0NOX0RFQlVHICgiVmFyaWFibGUgbm90IGZvdW5kIGluIGltYWdlOiAlc1xuIiwgWFNUUklO RyAoR09NUF9BRERJVElPTkFMX0lDVlMpKTsKKyAgICAgIHBhaXItPnN0YXJ0ID0gcGFpci0+ ZW5kID0gMDsKKyAgICB9CiAKICAgLyogRW5zdXJlIHRoYXQgY29uc3RydWN0b3JzIGFyZSBy dW4gZmlyc3QuICAqLwogICBzdHJ1Y3QgR09NUF9rZXJuZWxfbGF1bmNoX2F0dHJpYnV0ZXMg a2xhID0KZGlmZiAtLWdpdCBhL2xpYmdvbXAvcGx1Z2luL3BsdWdpbi1udnB0eC5jIGIvbGli Z29tcC9wbHVnaW4vcGx1Z2luLW52cHR4LmMKaW5kZXggYmM2M2UyNzQuLmExMmYxYWMgMTAw NjQ0Ci0tLSBhL2xpYmdvbXAvcGx1Z2luL3BsdWdpbi1udnB0eC5jCisrKyBiL2xpYmdvbXAv cGx1Z2luL3BsdWdpbi1udnB0eC5jCkBAIC0xMzA1LDcgKzEzMDUsNyBAQCBHT01QX09GRkxP QURfbG9hZF9pbWFnZSAoaW50IG9yZCwgdW5zaWduZWQgdmVyc2lvbiwgY29uc3Qgdm9pZCAq dGFyZ2V0X2RhdGEsCiAgIGZuX2VudHJpZXMgPSBpbWdfaGVhZGVyLT5mbl9udW07CiAgIGZu X2Rlc2NzID0gaW1nX2hlYWRlci0+Zm5fZGVzY3M7CiAKLSAgLyogQ3VycmVudGx5LCB0aGUg b25seSBvdGhlciBlbnRyeSBraW5kIGlzICdkZXZpY2UgbnVtYmVyJy4gICovCisgIC8qIEN1 cnJlbnRseSwgb3RoZXJfZW50cmllcyBjb250YWlucyBvbmx5IHRoZSBzdHJ1Y3Qgb2YgSUNW cy4gICovCiAgIG90aGVyX2VudHJpZXMgPSAxOwogCiAgIHRhcmdfdGJsID0gR09NUF9QTFVH SU5fbWFsbG9jIChzaXplb2YgKHN0cnVjdCBhZGRyX3BhaXIpCkBAIC0xMzU4LDIwICsxMzU4 LDE5IEBAIEdPTVBfT0ZGTE9BRF9sb2FkX2ltYWdlIChpbnQgb3JkLCB1bnNpZ25lZCB2ZXJz aW9uLCBjb25zdCB2b2lkICp0YXJnZXRfZGF0YSwKICAgICAgIHRhcmdfdGJsLT5lbmQgPSB0 YXJnX3RibC0+c3RhcnQgKyBieXRlczsKICAgICB9CiAKLSAgQ1VkZXZpY2VwdHIgZGV2aWNl X251bV92YXJwdHI7Ci0gIHNpemVfdCBkZXZpY2VfbnVtX3ZhcnNpemU7Ci0gIENVcmVzdWx0 IHIgPSBDVURBX0NBTExfTk9DSEVDSyAoY3VNb2R1bGVHZXRHbG9iYWwsICZkZXZpY2VfbnVt X3ZhcnB0ciwKLQkJCQkgICZkZXZpY2VfbnVtX3ZhcnNpemUsIG1vZHVsZSwKLQkJCQkgIFhT VFJJTkcgKEdPTVBfREVWSUNFX05VTV9WQVIpKTsKKyAgQ1VkZXZpY2VwdHIgdmFycHRyOwor ICBzaXplX3QgdmFyc2l6ZTsKKyAgQ1VyZXN1bHQgciA9IENVREFfQ0FMTF9OT0NIRUNLIChj dU1vZHVsZUdldEdsb2JhbCwgJnZhcnB0ciwgJnZhcnNpemUsCisJCQkJICBtb2R1bGUsIFhT VFJJTkcgKEdPTVBfQURESVRJT05BTF9JQ1ZTKSk7CisKICAgaWYgKHIgPT0gQ1VEQV9TVUND RVNTKQogICAgIHsKLSAgICAgIHRhcmdfdGJsLT5zdGFydCA9ICh1aW50cHRyX3QpIGRldmlj ZV9udW1fdmFycHRyOwotICAgICAgdGFyZ190YmwtPmVuZCA9ICh1aW50cHRyX3QpIChkZXZp Y2VfbnVtX3ZhcnB0ciArIGRldmljZV9udW1fdmFyc2l6ZSk7CisgICAgICB0YXJnX3RibC0+ c3RhcnQgPSAodWludHB0cl90KSB2YXJwdHI7CisgICAgICB0YXJnX3RibC0+ZW5kID0gKHVp bnRwdHJfdCkgKHZhcnB0ciArIHZhcnNpemUpOwogICAgIH0KICAgZWxzZQotICAgIC8qIFRo ZSAnR09NUF9ERVZJQ0VfTlVNX1ZBUicgdmFyaWFibGUgd2FzIG5vdCBpbiB0aGlzIGltYWdl LiAgKi8KKyAgICAvKiBUaGUgdmFyaWFibGUgd2FzIG5vdCBpbiB0aGlzIGltYWdlLiAgKi8K ICAgICB0YXJnX3RibC0+c3RhcnQgPSB0YXJnX3RibC0+ZW5kID0gMDsKLSAgdGFyZ190Ymwr KzsKIAogICBudnB0eF9zZXRfY2xvY2t0aWNrIChtb2R1bGUsIGRldik7CiAKZGlmZiAtLWdp dCBhL2xpYmdvbXAvdGFyZ2V0LmMgYi9saWJnb21wL3RhcmdldC5jCmluZGV4IDEzNWRiMWQu LjE2MjQ5MzggMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvdGFyZ2V0LmMKKysrIGIvbGliZ29tcC90 YXJnZXQuYwpAQCAtMjEwOCw2ICsyMTA4LDU2IEBAIGdvbXBfdXBkYXRlIChzdHJ1Y3QgZ29t cF9kZXZpY2VfZGVzY3IgKmRldmljZXAsIHNpemVfdCBtYXBudW0sIHZvaWQgKipob3N0YWRk cnMsCiAgIGdvbXBfbXV0ZXhfdW5sb2NrICgmZGV2aWNlcC0+bG9jayk7CiB9CiAKKy8qIEhl bHBlciBmdW5jdGlvbiBmb3IgJ2dvbXBfbG9hZF9pbWFnZV90b19kZXZpY2UnLiAgUmV0dXJu cyB0aGUgSUNWIHZhbHVlcworICAgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UgbnVtIGFuZCB0 aGUgdmFyaWFibGUgaGllcmFyY2h5CisgICAoX0RFVl80MiwgX0RFViwgX0FMTCkuICBJZiBu byBJQ1Ygd2FzIGluaXRpYWxseSBjb25maWd1cmVkIGZvciB0aGUgZ2l2ZW4KKyAgIGRldmlj ZSBhbmQgdGh1cyBubyBpdGVtIHdpdGggdGhhdCBkZXZpY2UgbnVtYmVyIGlzIGNvbnRhaW5l ZCBpbgorICAgZ29tcF9vZmZsb2FkX2ljdl9saXN0LCB0aGVuIGEgbmV3IGl0ZW0gaXMgY3Jl YXRlZCBhbmQgYWRkZWQgdG8gdGhlIGxpc3QuICAqLworCitzdGF0aWMgc3RydWN0IGdvbXBf b2ZmbG9hZF9pY3ZzICoKK2dldF9nb21wX29mZmxvYWRfaWN2cyAoaW50IGRldl9udW0pCit7 CisgIHN0cnVjdCBnb21wX2ljdl9saXN0ICpkZXYgPSBnb21wX2dldF9pbml0aWFsX2ljdl9p dGVtICgtMSk7CisgIHN0cnVjdCBnb21wX2ljdl9saXN0ICphbGwgPSBnb21wX2dldF9pbml0 aWFsX2ljdl9pdGVtICgtMik7CisgIHN0cnVjdCBnb21wX2ljdl9saXN0ICpkZXZfeCA9IGdv bXBfZ2V0X2luaXRpYWxfaWN2X2l0ZW0gKGRldl9udW0pOworICBzdHJ1Y3QgZ29tcF9vZmZs b2FkX2ljdl9saXN0ICpvZmZsb2FkX2ljdnMKKyAgICA9IGdvbXBfZ2V0X29mZmxvYWRfaWN2 X2l0ZW0gKGRldl9udW0pOworCisgIGlmIChvZmZsb2FkX2ljdnMgIT0gTlVMTCkKKyAgICBy ZXR1cm4gJm9mZmxvYWRfaWN2cy0+aWN2czsKKworICBzdHJ1Y3QgZ29tcF9vZmZsb2FkX2lj dl9saXN0ICpuZXcKKyAgICA9IChzdHJ1Y3QgZ29tcF9vZmZsb2FkX2ljdl9saXN0ICopIGdv bXBfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBnb21wX29mZmxvYWRfaWN2X2xpc3QpKTsKKwor ICBuZXctPmRldmljZV9udW0gPSBkZXZfbnVtOworICBuZXctPmljdnMuZGV2aWNlX251bSA9 IGRldl9udW07CisgIG5ldy0+bmV4dCA9IGdvbXBfb2ZmbG9hZF9pY3ZfbGlzdDsKKworICBp ZiAoZGV2X3ggIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoZGV2X3gtPmZsYWdzLCBH T01QX0lDVl9OVEVBTVMpKQorICAgIG5ldy0+aWN2cy5udGVhbXMgPSBkZXZfeC0+aWN2cy5u dGVhbXNfdmFyOworICBlbHNlIGlmIChkZXYgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxh ZyAoZGV2LT5mbGFncywgR09NUF9JQ1ZfTlRFQU1TKSkKKyAgICBuZXctPmljdnMubnRlYW1z ID0gZGV2LT5pY3ZzLm50ZWFtc192YXI7CisgIGVsc2UgaWYgKGFsbCAhPSBOVUxMICYmIGdv bXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZsYWdzLCBHT01QX0lDVl9OVEVBTVMpKQorICAgIG5l dy0+aWN2cy5udGVhbXMgPSBhbGwtPmljdnMubnRlYW1zX3ZhcjsKKyAgZWxzZQorICAgIG5l dy0+aWN2cy5udGVhbXMgPSBnb21wX2RlZmF1bHRfaWN2X3ZhbHVlcy5udGVhbXNfdmFyOwor CisgIGlmIChkZXZfeCAhPSBOVUxMCisgICAgICAmJiBnb21wX2dldF9pY3ZfZmxhZyAoZGV2 X3gtPmZsYWdzLCBHT01QX0lDVl9ERUZBVUxUX0RFVklDRSkpCisgICAgbmV3LT5pY3ZzLmRl ZmF1bHRfZGV2aWNlID0gZGV2X3gtPmljdnMuZGVmYXVsdF9kZXZpY2VfdmFyOworICBlbHNl IGlmIChkZXYgIT0gTlVMTAorCSAgICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChkZXYtPmZsYWdz LCBHT01QX0lDVl9ERUZBVUxUX0RFVklDRSkpCisgICAgbmV3LT5pY3ZzLmRlZmF1bHRfZGV2 aWNlID0gZGV2LT5pY3ZzLmRlZmF1bHRfZGV2aWNlX3ZhcjsKKyAgZWxzZSBpZiAoYWxsICE9 IE5VTEwKKwkgICAmJiBnb21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1Zf REVGQVVMVF9ERVZJQ0UpKQorICAgIG5ldy0+aWN2cy5kZWZhdWx0X2RldmljZSA9IGFsbC0+ aWN2cy5kZWZhdWx0X2RldmljZV92YXI7CisgIGVsc2UKKyAgICBuZXctPmljdnMuZGVmYXVs dF9kZXZpY2UgPSBnb21wX2RlZmF1bHRfaWN2X3ZhbHVlcy5kZWZhdWx0X2RldmljZV92YXI7 CisKKyAgZ29tcF9vZmZsb2FkX2ljdl9saXN0ID0gbmV3OworICByZXR1cm4gJm5ldy0+aWN2 czsKK30KKwogLyogTG9hZCBpbWFnZSBwb2ludGVkIGJ5IFRBUkdFVF9EQVRBIHRvIHRoZSBk ZXZpY2UsIHNwZWNpZmllZCBieSBERVZJQ0VQLgogICAgQW5kIGluc2VydCB0byBzcGxheSB0 cmVlIHRoZSBtYXBwaW5nIGJldHdlZW4gYWRkcmVzc2VzIGZyb20gSE9TVF9UQUJMRSBhbmQK ICAgIGZyb20gbG9hZGVkIHRhcmdldCBpbWFnZS4gIFdlIHJlbHkgaW4gdGhlIGhvc3QgYW5k IGRldmljZSBjb21waWxlcgpAQCAtMjEyOCw5ICsyMTc4LDYgQEAgZ29tcF9sb2FkX2ltYWdl X3RvX2RldmljZSAoc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyICpkZXZpY2VwLCB1bnNpZ25l ZCB2ZXJzaW9uLAogICBpbnQgbnVtX2Z1bmNzID0gaG9zdF9mdW5jc19lbmQgLSBob3N0X2Z1 bmNfdGFibGU7CiAgIGludCBudW1fdmFycyAgPSAoaG9zdF92YXJzX2VuZCAtIGhvc3RfdmFy X3RhYmxlKSAvIDI7CiAKLSAgLyogT3RoZXJzIGN1cnJlbnRseSBpcyBvbmx5ICdkZXZpY2Vf bnVtJyAqLwotICBpbnQgbnVtX290aGVycyA9IDE7Ci0KICAgLyogTG9hZCBpbWFnZSB0byBk ZXZpY2UgYW5kIGdldCB0YXJnZXQgYWRkcmVzc2VzIGZvciB0aGUgaW1hZ2UuICAqLwogICBz dHJ1Y3QgYWRkcl9wYWlyICp0YXJnZXRfdGFibGUgPSBOVUxMOwogICBpbnQgaSwgbnVtX3Rh cmdldF9lbnRyaWVzOwpAQCAtMjE0MCw4ICsyMTg3LDggQEAgZ29tcF9sb2FkX2ltYWdlX3Rv X2RldmljZSAoc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyICpkZXZpY2VwLCB1bnNpZ25lZCB2 ZXJzaW9uLAogCQkJCXRhcmdldF9kYXRhLCAmdGFyZ2V0X3RhYmxlKTsKIAogICBpZiAobnVt X3RhcmdldF9lbnRyaWVzICE9IG51bV9mdW5jcyArIG51bV92YXJzCi0gICAgICAvKiBPdGhl cnMgKGRldmljZV9udW0pIGFyZSBpbmNsdWRlZCBhcyB0cmFpbGluZyBlbnRyaWVzIGluIHBh aXIgbGlzdC4gICovCi0gICAgICAmJiBudW1fdGFyZ2V0X2VudHJpZXMgIT0gbnVtX2Z1bmNz ICsgbnVtX3ZhcnMgKyBudW1fb3RoZXJzKQorICAgICAgLyogIisxIiBkdWUgdG8gdGhlIGFk ZGl0aW9uYWwgSUNWIHN0cnVjdC4gICovCisgICAgICAmJiBudW1fdGFyZ2V0X2VudHJpZXMg IT0gbnVtX2Z1bmNzICsgbnVtX3ZhcnMgKyAxKQogICAgIHsKICAgICAgIGdvbXBfbXV0ZXhf dW5sb2NrICgmZGV2aWNlcC0+bG9jayk7CiAgICAgICBpZiAoaXNfcmVnaXN0ZXJfbG9jaykK QEAgLTIxNTMsNyArMjIwMCw5IEBAIGdvbXBfbG9hZF9pbWFnZV90b19kZXZpY2UgKHN0cnVj dCBnb21wX2RldmljZV9kZXNjciAqZGV2aWNlcCwgdW5zaWduZWQgdmVyc2lvbiwKIAogICAv KiBJbnNlcnQgaG9zdC10YXJnZXQgYWRkcmVzcyBtYXBwaW5nIGludG8gc3BsYXkgdHJlZS4g ICovCiAgIHN0cnVjdCB0YXJnZXRfbWVtX2Rlc2MgKnRndCA9IGdvbXBfbWFsbG9jIChzaXpl b2YgKCp0Z3QpKTsKLSAgdGd0LT5hcnJheSA9IGdvbXBfbWFsbG9jICgobnVtX2Z1bmNzICsg bnVtX3ZhcnMpICogc2l6ZW9mICgqdGd0LT5hcnJheSkpOworICAvKiAiKzEiIGR1ZSB0byB0 aGUgYWRkaXRpb25hbCBJQ1Ygc3RydWN0LiAgKi8KKyAgdGd0LT5hcnJheSA9IGdvbXBfbWFs bG9jICgobnVtX2Z1bmNzICsgbnVtX3ZhcnMgKyAxKQorCQkJICAgICogc2l6ZW9mICgqdGd0 LT5hcnJheSkpOwogICB0Z3QtPnJlZmNvdW50ID0gUkVGQ09VTlRfSU5GSU5JVFk7CiAgIHRn dC0+dGd0X3N0YXJ0ID0gMDsKICAgdGd0LT50Z3RfZW5kID0gMDsKQEAgLTIyMTMsMzIgKzIy NjIsNDAgQEAgZ29tcF9sb2FkX2ltYWdlX3RvX2RldmljZSAoc3RydWN0IGdvbXBfZGV2aWNl X2Rlc2NyICpkZXZpY2VwLCB1bnNpZ25lZCB2ZXJzaW9uLAogICAgICAgYXJyYXkrKzsKICAg ICB9CiAKLSAgLyogTGFzdCBlbnRyeSBpcyBmb3IgdGhlIG9uLWRldmljZSAnZGV2aWNlX251 bScgdmFyaWFibGUuIFRvbGVyYXRlIGNhc2UKLSAgICAgd2hlcmUgcGx1Z2luIGRvZXMgbm90 IHJldHVybiB0aGlzIGVudHJ5LiAgKi8KKyAgLyogTGFzdCBlbnRyeSBpcyBmb3IgYSBJQ1Zz IHZhcmlhYmxlLgorICAgICBUb2xlcmF0ZSBjYXNlIHdoZXJlIHBsdWdpbiBkb2VzIG5vdCBy ZXR1cm4gdGhvc2UgZW50cmllcy4gICovCiAgIGlmIChudW1fZnVuY3MgKyBudW1fdmFycyA8 IG51bV90YXJnZXRfZW50cmllcykKICAgICB7Ci0gICAgICBzdHJ1Y3QgYWRkcl9wYWlyICpk ZXZpY2VfbnVtX3ZhciA9ICZ0YXJnZXRfdGFibGVbbnVtX2Z1bmNzICsgbnVtX3ZhcnNdOwot ICAgICAgLyogU3RhcnQgYWRkcmVzcyB3aWxsIGJlIG5vbi16ZXJvIGZvciBsYXN0IGVudHJ5 IGlmIEdPTVBfREVWSUNFX05VTV9WQVIKLQkgd2FzIGZvdW5kIGluIHRoaXMgaW1hZ2UuICAq LwotICAgICAgaWYgKGRldmljZV9udW1fdmFyLT5zdGFydCAhPSAwKQorICAgICAgc3RydWN0 IGFkZHJfcGFpciAqdmFyID0gJnRhcmdldF90YWJsZVtudW1fZnVuY3MgKyBudW1fdmFyc107 CisKKyAgICAgIC8qIFN0YXJ0IGFkZHJlc3Mgd2lsbCBiZSBub24temVybyBmb3IgdGhlIElD VnMgdmFyaWFibGUgaWYKKwkgdGhlIHZhcmlhYmxlIHdhcyBmb3VuZCBpbiB0aGlzIGltYWdl LiAgKi8KKyAgICAgIGlmICh2YXItPnN0YXJ0ICE9IDApCiAJewogCSAgLyogVGhlIGluZGV4 IG9mIHRoZSBkZXZpY2VwIHdpdGhpbiBkZXZpY2VzW10gaXMgcmVnYXJkZWQgYXMgaXRzCiAJ ICAgICAnZGV2aWNlIG51bWJlcicsIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBwZXIt ZGV2aWNlIHR5cGUKIAkgICAgIGRldmljZXAtPnRhcmdldF9pZC4gICovCi0JICBpbnQgZGV2 aWNlX251bV92YWwgPSAoaW50KSAoZGV2aWNlcCAtICZkZXZpY2VzWzBdKTsKLQkgIGlmIChk ZXZpY2VfbnVtX3Zhci0+ZW5kIC0gZGV2aWNlX251bV92YXItPnN0YXJ0ICE9IHNpemVvZiAo aW50KSkKLQkgICAgewotCSAgICAgIGdvbXBfbXV0ZXhfdW5sb2NrICgmZGV2aWNlcC0+bG9j ayk7Ci0JICAgICAgaWYgKGlzX3JlZ2lzdGVyX2xvY2spCi0JCWdvbXBfbXV0ZXhfdW5sb2Nr ICgmcmVnaXN0ZXJfbG9jayk7Ci0JICAgICAgZ29tcF9mYXRhbCAoIm9mZmxvYWQgcGx1Z2lu IG1hbmFnZWQgJ2RldmljZV9udW0nIG5vdCBvZiBleHBlY3RlZCAiCi0JCQkgICJmb3JtYXQi KTsKLQkgICAgfQotCi0JICAvKiBDb3B5IGRldmljZV9udW0gdmFsdWUgdG8gcGxhY2Ugb24g ZGV2aWNlIG1lbW9yeSwgaGVyZWJ5IGFjdHVhbGx5Ci0JICAgICBkZXNpZ25hdGluZyBpdHMg ZGV2aWNlIG51bWJlciBpbnRvIGVmZmVjdC4gICovCi0JICBnb21wX2NvcHlfaG9zdDJkZXYg KGRldmljZXAsIE5VTEwsICh2b2lkICopIGRldmljZV9udW1fdmFyLT5zdGFydCwKLQkJCSAg ICAgICZkZXZpY2VfbnVtX3ZhbCwgc2l6ZW9mIChpbnQpLCBmYWxzZSwgTlVMTCk7CisJICBp bnQgZGV2X251bSA9IChpbnQpIChkZXZpY2VwIC0gJmRldmljZXNbMF0pOworCSAgc3RydWN0 IGdvbXBfb2ZmbG9hZF9pY3ZzICppY3ZzID0gZ2V0X2dvbXBfb2ZmbG9hZF9pY3ZzIChkZXZf bnVtKTsKKwkgIHNpemVfdCB2YXJfc2l6ZSA9IHZhci0+ZW5kIC0gdmFyLT5zdGFydDsKKwor CSAgLyogQ29weSB0aGUgSUNWcyB2YXJpYWJsZSB0byBwbGFjZSBvbiBkZXZpY2UgbWVtb3J5 LCBoZXJlYnkKKwkgICAgIGFjdHVhbGx5IGRlc2lnbmF0aW5nIGl0cyBkZXZpY2UgbnVtYmVy IGludG8gZWZmZWN0LiAgKi8KKwkgIGdvbXBfY29weV9ob3N0MmRldiAoZGV2aWNlcCwgTlVM TCwgKHZvaWQgKikgdmFyLT5zdGFydCwgaWN2cywKKwkJCSAgICAgIHZhcl9zaXplLCBmYWxz ZSwgTlVMTCk7CisJICAgIHNwbGF5X3RyZWVfa2V5IGsgPSAmYXJyYXktPmtleTsKKwkgICAg ay0+aG9zdF9zdGFydCA9ICh1aW50cHRyX3QpIGljdnM7CisJICAgIGstPmhvc3RfZW5kID0K KwkgICAgICBrLT5ob3N0X3N0YXJ0ICsgKHNpemVfbWFzayAmIHNpemVvZiAoc3RydWN0IGdv bXBfb2ZmbG9hZF9pY3ZzKSk7CisJICAgIGstPnRndCA9IHRndDsKKwkgICAgay0+dGd0X29m ZnNldCA9IHZhci0+c3RhcnQ7CisJICAgIGstPnJlZmNvdW50ID0gUkVGQ09VTlRfSU5GSU5J VFk7CisJICAgIGstPmR5bmFtaWNfcmVmY291bnQgPSAwOworCSAgICBrLT5hdXggPSBOVUxM OworCSAgICBhcnJheS0+bGVmdCA9IE5VTEw7CisJICAgIGFycmF5LT5yaWdodCA9IE5VTEw7 CisJICAgIHNwbGF5X3RyZWVfaW5zZXJ0ICgmZGV2aWNlcC0+bWVtX21hcCwgYXJyYXkpOwor CSAgICBhcnJheSsrOwogCX0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmdvbXAvdGVzdHN1 aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2ljdi01LmMgYi9saWJnb21wL3Rlc3RzdWl0ZS9s aWJnb21wLmMtYysrLWNvbW1vbi9pY3YtNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAuLjgyMTA4YmNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3Vp dGUvbGliZ29tcC5jLWMrKy1jb21tb24vaWN2LTUuYwpAQCAtMCwwICsxLDI1IEBACisvKiB7 IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfTlVNX1RF QU1TX0RFVl8wICI0MiIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX05V TV9URUFNU19ERVZfMSAiNDMiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9N UF9OVU1fVEVBTVNfREVWXzIgIjQ0IiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZh ciBPTVBfTlVNX1RFQU1TX0FMTCAiNDUiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYt dmFyIE9NUF9OVU1fVEVBTVNfREVWICI0NiIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVu di12YXIgT01QX05VTV9URUFNUyAiNDciIH0gKi8KKworI2luY2x1ZGUgPG9tcC5oPgorI2lu Y2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICpjb25zdCAq YXJndikKK3sKKyAgaWYgKG9tcF9nZXRfbWF4X3RlYW1zICgpICE9IDQ3KQorICAgIGFib3J0 ICgpOworCisgIGludCBudW1fZGV2aWNlcyA9IG9tcF9nZXRfbnVtX2RldmljZXMgKCkgPiAz ID8gMyA6IG9tcF9nZXRfbnVtX2RldmljZXMgKCk7CisgIGZvciAoaW50IGk9MDsgaSA8IG51 bV9kZXZpY2VzOyBpKyspCisgICAgI3ByYWdtYSBvbXAgdGFyZ2V0IGRldmljZSAoaSkKKyAg ICAgIGlmIChvbXBfZ2V0X21heF90ZWFtcyAoKSAhPSA0MiArIGkpCisJYWJvcnQgKCk7CisK KyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21w LmMtYysrLWNvbW1vbi9pY3YtNi5jIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMr Ky1jb21tb24vaWN2LTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4w NWYwN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5j LWMrKy1jb21tb24vaWN2LTYuYwpAQCAtMCwwICsxLDQ0IEBACisvKiB7IGRnLWRvIHJ1biB9 ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfTlVNX1RFQU1TX0FMTCAiNDIi IH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEVBTVNfREVWICI0 MyIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1NDSEVEVUxFX0FMTCAi Z3VpZGVkLDQiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9EWU5BTUlD X0FMTCAidHJ1ZSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1RFQU1T X1RIUkVBRF9MSU1JVF9BTEwgIjQ0IiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZh ciBPTVBfVEhSRUFEX0xJTUlUX0FMTCAiNDUiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1l bnYtdmFyIE9NUF9OVU1fVEhSRUFEU19BTEwgIjQ2LDMsMiIgfSAqLworLyogeyBkZy1zZXQt dGFyZ2V0LWVudi12YXIgT01QX01BWF9BQ1RJVkVfTEVWRUxTX0FMTCAiNDciIH0gKi8KKy8q IHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9QUk9DX0JJTkRfQUxMICJzcHJlYWQiIH0g Ki8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9XQUlUX1BPTElDWV9BTEwgImFj dGl2ZSIgfSAqLworCisvKiBUaGlzIHRlc3RzIHRoZSBoaWVyYXJjaGljYWwgdXNhZ2Ugb2Yg SUNWcyBvbiB0aGUgZGV2aWNlLCBpLmUuIGlmCisgICBPTVBfTlVNX1RFQU1TX0RFVl88ZGV2 aWNlX251bT4gaXMgbm90IGNvbmZpZ3VyZWQsIHRoZW4gdGhlIHZhbHVlIG9mCisgICBPTVBf TlVNX1RFQU1TX0RFViBzaG91bGQgYmUgdXNlZC4gIEFuZCBpZiAqLworCisjaW5jbHVkZSA8 b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNo YXIgKmNvbnN0ICphcmd2KQoreworICBlbnVtIG9tcF9zY2hlZF90IGtpbmQ7CisgIGludCBj aHVua19zaXplOworICBvbXBfZ2V0X3NjaGVkdWxlKCZraW5kLCAmY2h1bmtfc2l6ZSk7CisK KyAgaWYgKG9tcF9nZXRfbWF4X3RlYW1zICgpICE9IDQyCisgICAgICB8fCAhb21wX2dldF9k eW5hbWljICgpCisgICAgICB8fCBraW5kICE9IDMgfHwgY2h1bmtfc2l6ZSAhPSA0CisgICAg ICB8fCBvbXBfZ2V0X3RlYW1zX3RocmVhZF9saW1pdCAoKSAhPSA0NAorICAgICAgfHwgb21w X2dldF90aHJlYWRfbGltaXQgKCkgIT0gNDUKKyAgICAgIHx8IG9tcF9nZXRfbWF4X3RocmVh ZHMgKCkgIT0gNDYKKyAgICAgIHx8IG9tcF9nZXRfcHJvY19iaW5kICgpICE9IG9tcF9wcm9j X2JpbmRfc3ByZWFkCisgICAgICB8fCBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICgpICE9 IDQ3KQorICAgIGFib3J0ICgpOworCisgIGludCBudW1fZGV2aWNlcyA9IG9tcF9nZXRfbnVt X2RldmljZXMgKCkgPiAzID8gMyA6IG9tcF9nZXRfbnVtX2RldmljZXMgKCk7CisgIGZvciAo aW50IGk9MDsgaSA8IG51bV9kZXZpY2VzOyBpKyspCisgICAgI3ByYWdtYSBvbXAgdGFyZ2V0 IGRldmljZSAoaSkKKyAgICAgIGlmIChvbXBfZ2V0X21heF90ZWFtcyAoKSAhPSA0MykKKwlh Ym9ydCAoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmdvbXAvdGVzdHN1 aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2ljdi03LmMgYi9saWJnb21wL3Rlc3RzdWl0ZS9s aWJnb21wLmMtYysrLWNvbW1vbi9pY3YtNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAuLjY3MDgxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnb21wL3Rlc3RzdWl0 ZS9saWJnb21wLmMtYysrLWNvbW1vbi9pY3YtNy5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qIHsg ZGctZG8gcnVuIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEVB TVNfQUxMICI0MiIgfSAqLworCisvKiBUaGlzIHRlc3RzIHRoZSBoaWVyYXJjaGljYWwgdXNh Z2Ugb2YgSUNWcyBvbiB0aGUgaG9zdCBhbmQgb24gZGV2aWNlcywgaS5lLiBpZgorICAgT01Q X05VTV9URUFNU19ERVZfPGRldmljZV9udW0+LCBPTVBfTlVNX1RFQU1TX0RFViwgYW5kCisg ICBPTVBfTlVNX1RFQU1TIGFyZSBub3QgY29uZmlndXJlZCwgdGhlbiB0aGUgdmFsdWUgb2YK KyAgIE9NUF9OVU1fVEVBTVNfQUxMIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgaG9zdCBhcyB3 ZWxsIGFzIGZvciB0aGUKKyAgIGRldmljZXMuICAqLworCisjaW5jbHVkZSA8b21wLmg+Cisj aW5jbHVkZSA8c3RkbGliLmg+CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0 ICphcmd2KQoreworICBpZiAob21wX2dldF9tYXhfdGVhbXMgKCkgIT0gNDIpCisgICAgYWJv cnQgKCk7CisKKyAgaW50IG51bV9kZXZpY2VzID0gb21wX2dldF9udW1fZGV2aWNlcyAoKSA+ IDMgPyAzIDogb21wX2dldF9udW1fZGV2aWNlcyAoKTsKKyAgZm9yIChpbnQgaT0wOyBpIDwg bnVtX2RldmljZXM7IGkrKykKKyAgICAjcHJhZ21hIG9tcCB0YXJnZXQgZGV2aWNlIChpKQor ICAgICAgaWYgKG9tcF9nZXRfbWF4X3RlYW1zICgpICE9IDQyKQorCWFib3J0ICgpOworCisg IHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5j LWMrKy1jb21tb24vaWN2LTguYyBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKyst Y29tbW9uL2ljdi04LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRh ZmY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1j KystY29tbW9uL2ljdi04LmMKQEAgLTAsMCArMSwyMiBAQAorLyogeyBkZy1kbyBydW4gfSAq LworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX05VTV9URUFNU19ERVZfMTIzNDU2 Nzg5MCAiNDIiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEVB TVNfREVWXyAiNDMiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1f VEVBTVNfREVWXzAxICI0NCIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01Q X05VTV9URUFNU19ERVZfYSAiNDUiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFy IE9NUF9OVU1fVEVBTVNfREVWXzEyMzQ1Njc4OTAxICI0NiIgfSAqLworLyogeyBkZy1zZXQt dGFyZ2V0LWVudi12YXIgT01QX05VTV9URUFNU19ERVZfLTEgIjQ3IiB9ICovCisKKyNpbmNs dWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworaW50CittYWluIChpbnQgYXJn YywgY2hhciAqY29uc3QgKmFyZ3YpCit7CisgIHJldHVybiAwOworfQorCisvKiB7IGRnLW91 dHB1dCAiLipJbnZhbGlkIGRldmljZSBudW1iZXIgaW4gT01QX05VTV9URUFNU19ERVZfPTQz LioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKkludmFsaWQgZGV2aWNlIG51bWJlciBpbiBP TVBfTlVNX1RFQU1TX0RFVl8wMT00NCAobGVhZGluZyB6ZXJvKS4qIiB9ICovCisvKiB7IGRn LW91dHB1dCAiLipJbnZhbGlkIGRldmljZSBudW1iZXIgaW4gT01QX05VTV9URUFNU19ERVZf YT00NS4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipJbnZhbGlkIGRldmljZSBudW1iZXIg aW4gT01QX05VTV9URUFNU19ERVZfMTIzNDU2Nzg5MDE9NDYgKHRvbyBsb25nKS4qIiB9ICov CisvKiB7IGRnLW91dHB1dCAiLipOb24tbmVnYXRpdmUgZGV2aWNlIG51bWJlciBleHBlY3Rl ZCBpbiBPTVBfTlVNX1RFQU1TX0RFVl8tMT00Ny4qIiB9ICovCmRpZmYgLS1naXQgYS9saWJn b21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9vbXAtZGlzcGxheS1lbnYtMS5j IGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vb21wLWRpc3BsYXkt ZW52LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTg2ZDNiCi0t LSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21t b24vb21wLWRpc3BsYXktZW52LTEuYwpAQCAtMCwwICsxLDExOSBAQAorLyogeyBkZy1kbyBy dW4gfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1RIUkVBRF9MSU1JVF9E RVZfMjQgIjQyIiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfVEhSRUFE X0xJTUlUX0FMTCAiNDMiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9U SFJFQURfTElNSVRfREVWICI0NCIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIg T01QX1RIUkVBRF9MSU1JVCAiNDUiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFy IE9NUF9ERUZBVUxUX0RFVklDRSAiNDIiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYt dmFyIE9NUF9TQ0hFRFVMRV9ERVZfMjQgImd1aWRlZCw0IiB9ICovCisvKiB7IGRnLXNldC10 YXJnZXQtZW52LXZhciBPTVBfU0NIRURVTEVfQUxMICJkeW5hbWljIiB9ICovCisvKiB7IGRn LXNldC10YXJnZXQtZW52LXZhciBPTVBfU0NIRURVTEVfREVWICJndWlkZWQsMSIgfSAqLwor LyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1NDSEVEVUxFICJndWlkZWQsMiIgfSAq LworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX0RZTkFNSUNfREVWXzI0ICJ0cnVl IiB9ICovCisKKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9EWU5BTUlDX0FMTCAi dHJ1ZSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX0RZTkFNSUNfREVW ICJ0cnVlIiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfRFlOQU1JQyAi dHJ1ZSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX05VTV9USFJFQURT ICI0LDMsMiIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX05VTV9USFJF QURTX0FMTCAiNDUsNDYsNDciIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9N UF9OVU1fVEhSRUFEU19ERVYgIjQyLDQzLDQ0IiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQt ZW52LXZhciBPTVBfTlVNX1RIUkVBRFNfREVWXzI0ICIxNCwxMywxMiIgfSAqLworLyogeyBk Zy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX01BWF9BQ1RJVkVfTEVWRUxTICI0MiIgfSAqLwor LyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX01BWF9BQ1RJVkVfTEVWRUxTX0FMTCAi NDMiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9NQVhfQUNUSVZFX0xF VkVMU19ERVYgIjQ0IiB9ICovCisKKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9N QVhfQUNUSVZFX0xFVkVMU19ERVZfMjQgIjQ1IiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQt ZW52LXZhciBPTVBfTlVNX1RFQU1TICI0MiIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVu di12YXIgT01QX05VTV9URUFNU19BTEwgIjQzIiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQt ZW52LXZhciBPTVBfTlVNX1RFQU1TX0RFViAiNDQiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdl dC1lbnYtdmFyIE9NUF9OVU1fVEVBTVNfREVWXzI0ICI0NSIgfSAqLworLyogeyBkZy1zZXQt dGFyZ2V0LWVudi12YXIgT01QX1BST0NfQklORCAic3ByZWFkIiB9ICovCisvKiB7IGRnLXNl dC10YXJnZXQtZW52LXZhciBPTVBfUFJPQ19CSU5EX0FMTCAiY2xvc2UiIH0gKi8KKy8qIHsg ZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9QUk9DX0JJTkRfREVWICJzcHJlYWQsc3ByZWFk IiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfUFJPQ19CSU5EX0RFVl8y NCAic3ByZWFkLGNsb3NlIiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBf U1RBQ0tTSVpFICI0MiIgfSAqLworCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBf U1RBQ0tTSVpFX0FMTCAiNDIgTSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIg T01QX1NUQUNLU0laRV9ERVYgIjQzIGsiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYt dmFyIE9NUF9TVEFDS1NJWkVfREVWXzI0ICI0NCIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0 LWVudi12YXIgT01QX1dBSVRfUE9MSUNZICJhY3RpdmUiIH0gKi8KKy8qIHsgZGctc2V0LXRh cmdldC1lbnYtdmFyIE9NUF9XQUlUX1BPTElDWV9BTEwgIkFDVElWRSIgfSAqLworLyogeyBk Zy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1dBSVRfUE9MSUNZX0RFViAicGFzc2l2ZSIgfSAq LworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1dBSVRfUE9MSUNZX0RFVl8yNCAi UEFTU0lWRSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1RFQU1TX1RI UkVBRF9MSU1JVCAiNDIiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9U RUFNU19USFJFQURfTElNSVRfQUxMICI0MyIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVu di12YXIgT01QX1RFQU1TX1RIUkVBRF9MSU1JVF9ERVYgIjQ0IiB9ICovCisKKy8qIHsgZGct c2V0LXRhcmdldC1lbnYtdmFyIE9NUF9URUFNU19USFJFQURfTElNSVRfREVWXzI0ICI0NSIg fSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX0NBTkNFTExBVElPTiAidHJ1 ZSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX0RJU1BMQVlfQUZGSU5J VFkgInRydWUiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9UQVJHRVRf T0ZGTE9BRCAibWFuZGF0b3J5IiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBP TVBfTUFYX1RBU0tfUFJJT1JJVFkgIjIwIiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52 LXZhciBPTVBfQUxMT0NBVE9SICJvbXBfY29uc3RfbWVtX2FsbG9jIiB9ICovCisvKiB7IGRn LXNldC10YXJnZXQtZW52LXZhciBPTVBfTkVTVEVEICJmYWxzZSIgfSAqLworCisjaW5jbHVk ZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludAorbWFpbiAoaW50IGFyZ2Ms IGNoYXIgKmNvbnN0ICphcmd2KQoreworICBvbXBfZGlzcGxheV9lbnYgKDEpOworICByZXR1 cm4gMDsKK30KKworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2hvc3RdIE9NUF9EWU5BTUlDID0g J1RSVUUnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFthbGxdIE9NUF9EWU5BTUlD ID0gJ1RSVUUnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtkZXZpY2VdIE9NUF9E WU5BTUlDID0gJ1RSVUUnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFsyNFxdIE9N UF9EWU5BTUlDID0gJ1RSVUUnLioiIH0gKi8KKworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2hv c3RdIE9NUF9OVU1fVEhSRUFEUyA9ICc0LDMsMicuKiIgfSAqLworLyogeyBkZy1vdXRwdXQg Ii4qXFxcW2FsbFxdIE9NUF9OVU1fVEhSRUFEUyA9ICc0NSw0Niw0NycuKiIgfSAqLworLyog eyBkZy1vdXRwdXQgIi4qXFxcW2RldmljZVxdIE9NUF9OVU1fVEhSRUFEUyA9ICc0Miw0Myw0 NCcuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcWzI0XF0gT01QX05VTV9USFJFQURT ID0gJzE0LDEzLDEyJy4qIiB9ICovCisKKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtob3N0XSBP TVBfU0NIRURVTEUgPSAnR1VJREVELDInLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxc XFthbGxcXSBPTVBfU0NIRURVTEUgPSAnRFlOQU1JQycuKiIgfSAqLworLyogeyBkZy1vdXRw dXQgIi4qXFxcW2RldmljZVxdIE9NUF9TQ0hFRFVMRSA9ICdHVUlERUQnLioiIH0gKi8KKy8q IHsgZGctb3V0cHV0ICIuKlxcXFsyNFxdIE9NUF9TQ0hFRFVMRSA9ICdHVUlERUQsNCcuKiIg fSAqLworCisvKiB7IGRnLW91dHB1dCAiLipcXFxbaG9zdF0gT01QX1BST0NfQklORCA9ICdT UFJFQUQnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFthbGxcXSBPTVBfUFJPQ19C SU5EID0gJ0NMT1NFJy4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipcXFxbZGV2aWNlXF0g T01QX1BST0NfQklORCA9ICdTUFJFQUQsU1BSRUFEJy4qIiB9ICovCisvKiB7IGRnLW91dHB1 dCAiLipcXFxbMjRcXSBPTVBfUFJPQ19CSU5EID0gJ1NQUkVBRCxDTE9TRScuKiIgfSAqLwor CisvKiB7IGRnLW91dHB1dCAiLipcXFxbaG9zdF0gT01QX1NUQUNLU0laRSA9ICc0MzAwOCcu KiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2FsbFxdIE9NUF9TVEFDS1NJWkUgPSAn NDQwNDAxOTInLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtkZXZpY2VcXSBPTVBf U1RBQ0tTSVpFID0gJzQ0MDMyJy4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipcXFxbMjRc XSBPTVBfU1RBQ0tTSVpFID0gJzQ1MDU2Jy4qIiB9ICovCisKKy8qIHsgZGctb3V0cHV0ICIu KlxcXFtob3N0XSBPTVBfV0FJVF9QT0xJQ1kgPSAnQUNUSVZFJy4qIiB9ICovCisvKiB7IGRn LW91dHB1dCAiLipcXFxbYWxsXF0gT01QX1dBSVRfUE9MSUNZID0gJ0FDVElWRScuKiIgfSAq LworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2RldmljZVxdIE9NUF9XQUlUX1BPTElDWSA9ICdQ QVNTSVZFJy4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipcXFxbMjRcXSBPTVBfV0FJVF9Q T0xJQ1kgPSAnUEFTU0lWRScuKiIgfSAqLworCisvKiB7IGRnLW91dHB1dCAiLipcXFxbaG9z dF0gT01QX1RIUkVBRF9MSU1JVCA9ICc0NScuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4q XFxcW2FsbFxdIE9NUF9USFJFQURfTElNSVQgPSAnNDMnLioiIH0gKi8KKy8qIHsgZGctb3V0 cHV0ICIuKlxcXFtkZXZpY2VcXSBPTVBfVEhSRUFEX0xJTUlUID0gJzQ0Jy4qIiB9ICovCisv KiB7IGRnLW91dHB1dCAiLipcXFxbMjRcXSBPTVBfVEhSRUFEX0xJTUlUID0gJzQyJy4qIiB9 ICovCisKKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtob3N0XSBPTVBfTUFYX0FDVElWRV9MRVZF TFMgPSAnNDInLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFthbGxcXSBPTVBfTUFY X0FDVElWRV9MRVZFTFMgPSAnNDMnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtk ZXZpY2VcXSBPTVBfTUFYX0FDVElWRV9MRVZFTFMgPSAnNDQnLioiIH0gKi8KKy8qIHsgZGct b3V0cHV0ICIuKlxcXFsyNFxdIE9NUF9NQVhfQUNUSVZFX0xFVkVMUyA9ICc0NScuKiIgfSAq LworCisvKiB7IGRnLW91dHB1dCAiLipcXFxbaG9zdF0gT01QX05VTV9URUFNUyA9ICc0Micu KiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2FsbFxdIE9NUF9OVU1fVEVBTVMgPSAn NDMnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtkZXZpY2VcXSBPTVBfTlVNX1RF QU1TID0gJzQ0Jy4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipcXFxbMjRcXSBPTVBfTlVN X1RFQU1TID0gJzQ1Jy4qIiB9ICovCisKKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtob3N0XSBP TVBfVEVBTVNfVEhSRUFEX0xJTUlUID0gJzQyJy4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAi LipcXFxbYWxsXF0gT01QX1RFQU1TX1RIUkVBRF9MSU1JVCA9ICc0MycuKiIgfSAqLworLyog eyBkZy1vdXRwdXQgIi4qXFxcW2RldmljZVxdIE9NUF9URUFNU19USFJFQURfTElNSVQgPSAn NDQnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFsyNFxdIE9NUF9URUFNU19USFJF QURfTElNSVQgPSAnNDUnLioiIH0gKi8KKworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2hvc3Rd IE9NUF9DQU5DRUxMQVRJT04gPSAnVFJVRScuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4q XFxcW2hvc3RdIE9NUF9ERUZBVUxUX0RFVklDRSA9ICc0MicuKiIgfSAqLworLyogeyBkZy1v dXRwdXQgIi4qXFxcW2hvc3RdIE9NUF9NQVhfVEFTS19QUklPUklUWSA9ICcyMCcuKiIgfSAq LworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2hvc3RdIE9NUF9ESVNQTEFZX0FGRklOSVRZID0g J1RSVUUnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtob3N0XSBPTVBfQUxMT0NB VE9SID0gJ29tcF9jb25zdF9tZW1fYWxsb2MnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIu KlxcXFtob3N0XSBPTVBfVEFSR0VUX09GRkxPQUQgPSAnTUFOREFUT1JZJy4qIiB9ICovCmRp ZmYgLS1naXQgYS9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9vbXAt ZGlzcGxheS1lbnYtMi5jIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21t b24vb21wLWRpc3BsYXktZW52LTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi42NjBkYTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGli Z29tcC5jLWMrKy1jb21tb24vb21wLWRpc3BsYXktZW52LTIuYwpAQCAtMCwwICsxLDIyIEBA CisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBf TlVNX1RFQU1TICI0MiIgfSAqLworCisvKiBUaGlzIHRlc3QgY2hlY2tzIGlmIG9tcF9kaXNw bGF5X2VudiBvdXRwdXRzIHRoZSBpbml0aWFsIElDViB2YWx1ZXMgYWx0aG91Z2gKKyAgIHRo ZSB2YWx1ZSB3YXMgdXBkYXRlZC4gICovCisKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRl IDxzdGRsaWIuaD4KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3Yp Cit7CisgIG9tcF9kaXNwbGF5X2VudiAoMSk7CisgIG9tcF9zZXRfbnVtX3RlYW1zICgyNCk7 CisgIGlmIChvbXBfZ2V0X21heF90ZWFtcyAoKSAhPSAyNCkKKyAgICBhYm9ydCAoKTsKKyAg b21wX2Rpc3BsYXlfZW52ICgxKTsKKworICByZXR1cm4gMDsKK30KKworLyogeyBkZy1vdXRw dXQgIi4qXFxcW2hvc3RdIE9NUF9OVU1fVEVBTVMgPSAnNDInLipcXFxbaG9zdF0gT01QX05V TV9URUFNUyA9ICc0MiciIH0gKi8K --------------EciqZ0UiZuw4jFh0ovUDV44i--