From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 97924 invoked by alias); 6 Sep 2017 13:05:06 -0000 Mailing-List: contact fortran-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: fortran-owner@gcc.gnu.org Received: (qmail 97904 invoked by uid 89); 6 Sep 2017 13:05:05 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-8.3 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,GIT_PATCH_1,GIT_PATCH_2,KAM_ASCII_DIVIDERS,LIKELY_SPAM_BODY,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=goodbye, Part, ________, xz X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-yw0-f176.google.com Received: from mail-yw0-f176.google.com (HELO mail-yw0-f176.google.com) (209.85.161.176) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 06 Sep 2017 13:04:48 +0000 Received: by mail-yw0-f176.google.com with SMTP id x144so21538846ywg.2; Wed, 06 Sep 2017 06:04:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc; bh=CajUy1kvRgiFr6oL9ZPPB+ubahvP3YdYLOhw8Bn1jLg=; b=eRtnjzzqlhEps7/nuim6NRaOagWtBL/W1LrRVsEawEZiGAZ0rVqej44Z+BTIxriiKw juWPr/zp2NJq4TI6l+gZCkCdT2P9QwRd40MR8rxZ+SHxwU7uxUsMllh+0ZwMUbwHlLdu GDdqZMGb2HkkxcT2JPqc1MyxWQuX4dSA4C8pPAV+BY3Mmmg2XNVHCCYJ9TQ4Z9htwPjf UA/7lsMmx4776rPYNs1qoJGQ8hh5C2KzNX6TCQ/BAUYmyRvaHNVAmUduYwicscsZVZmk dMn9sOz1VfDQH3ap74vUnZ/jIl15cCe6IB1Kfd0jBDelM5mQu9MBD3dGRaeyoFB/yjTk ItXg== X-Gm-Message-State: AHPjjUhfxQngonS3NAHQ/N9uET+aJeFJOzU5xErYecHeITgKwYUVwEiK aZI4ns7ccwHye0b43wsWlH5C3l7LyksF X-Google-Smtp-Source: ADKCNb66ACp/PKW7nf7h814qK4OaNBE5gYJRRs1VbqQly/zl7fNZMSnBpMZmT3LNf623gm6XIsjWgoTl6kCFrbCJfbg= X-Received: by 10.129.87.3 with SMTP id l3mr1816323ywb.145.1504703086447; Wed, 06 Sep 2017 06:04:46 -0700 (PDT) MIME-Version: 1.0 Received: by 10.129.145.147 with HTTP; Wed, 6 Sep 2017 06:04:45 -0700 (PDT) From: Paul Richard Thomas Date: Wed, 06 Sep 2017 13:05:00 -0000 Message-ID: Subject: [Patch, fortran] Parameterized Derived Types To: "fortran@gcc.gnu.org" , gcc-patches Cc: Damian Rouson , Mark LeAir Content-Type: multipart/mixed; boundary="001a113b3dd8f6e259055884fcd1" X-IsSubscribed: yes X-SW-Source: 2017-09/txt/msg00015.txt.bz2 --001a113b3dd8f6e259055884fcd1 Content-Type: text/plain; charset="UTF-8" Content-length: 7849 Dear All, Since my message to the list of 16 August 2017 I have put in another intense period of activity to develop a patch to implement PDTs in gfortran. I have now temporarily run out of time to develop it further; partly because of a backlog of other patches and PRs to deal with but also pressure from daytime work. The patch adds the last unimplemented F2003 feature to gfortran. As in the provisional patch, I have attached some notes on the implementation. This indicates some of the weaknesses, problem areas and TODOs. Suggest that a good read of Mark Leair's excellent PGInsider article on PDTs - http://www.pgroup.com/lit/articles/insider/v5n2a4.htm is a worthwhile exercise. To judge by the complete silence following my previous message, I will have a problem getting this patch reviewed. I would welcome any remarks or reviews but intend to commit, warts and all, on Saturday unless something fundamentally wrong comes out of the woodwork. Note that the PDT parts in the compiler are rather well insulated from the rest of fortran and that I do not believe that any regressions will result. I hope that a month or two of testing in other hands will add to the list of TODOs and that when I return to PDTs a greatly improved version will result. Bootstrapped and regtested on FC23/x86_4 - OK for trunk? (Note above remark about committing on Saturday in the absence of a review.) Best regards Paul 2017-09-05 Paul Thomas * decl.c : Add decl_type_param_list, type_param_spec_list as static variables to hold PDT spec lists. (build_sym): Copy 'type_param_spec_list' to symbol spec_list. (build_struct): Copy the 'saved_kind_expr' to the component 'kind_expr'. Check that KIND or LEN components appear in the decl_type_param_list. These should appear as symbols in the f2k_derived namespace. If the component is itself a PDT type, copy the decl_type_param_list to the component param_list. (gfc_match_kind_spec): If the KIND expression is parameterized set KIND to zero and store the expression in 'saved_kind_expr'. (insert_parameter_exprs): New function. (gfc_insert_kind_parameter_exprs): New function. (gfc_insert_parameter_exprs): New function. (gfc_get_pdt_instance): New function. (gfc_match_decl_type_spec): Match the decl_type_spec_list if it is present. If it is, call 'gfc_get_pdt_instance' to obtain the specific instance of the PDT. (match_attr_spec): Match KIND and LEN attributes. Check for the standard and for type/kind of the parameter. They are also not allowed outside a derived type definition. (gfc_match_data_decl): Null the decl_type_param_list and the type_param_spec_list on entry and free them on exit. (gfc_match_formal_arglist): If 'typeparam' is true, add the formal symbol to the f2k_derived namespace. (gfc_match_derived_decl): Register the decl_type_param_list if this is a PDT. If this is a type extension, gather up all the type parameters and put them in the right order. *dump-parse-tree.c (show_attr): Signal PDT templates and the parameter attributes. (show_components): Output parameter atrributes and component parameter list. (show_symbol): Show variable parameter lists. * expr.c (expr.c): Copy the expression parameter list. (gfc_is_constant_expr): Pass on symbols representing PDT parameters. (gfc_check_init_expr): Break on PDT KIND parameters and PDT parameter expressions. (gfc_check_assign): Assigning to KIND or LEN components is an error. (derived_parameter_expr): New function. (gfc_derived_parameter_expr): New function. (gfc_spec_list_type): New function. * gfortran.h : Add enum gfc_param_spec_type. Add the PDT attrs to the structure symbol_attr. Add the 'kind_expr' and 'param_list' field to the gfc_component structure. Comment on the reuse of the gfc_actual_arglist structure as storage for type parameter spec lists. Add the new field 'spec_type' to this structure. Add 'param_list' fields to gfc_symbol and gfc_expr. Add prototypes for gfc_insert_kind_parameter_exprs, gfc_insert_parameter_exprs, gfc_add_kind, gfc_add_len, gfc_derived_parameter_expr and gfc_spec_list_type. * interface.c (gfc_compare_derived_types): Treat PDTs in the same way as sequence types. * match.c : Add variable 'type_param_spec_list'. (gfc_op2string, gfc_match_member_sep, gfc_match_label): Remove trailing whitespace. (match_derived_type_spec): Match PDTs and find specific instance. (gfc_match_type_spec): Remove more trailing whitespace. (gfc_match_allocate): Assumed or deferred parameters cannot appear here. Copy the type parameter spec list to the expr for the allocatable entity. Free 'type_param_spec_list'. (gfc_match_common, gfc_match_namelist, gfc_match_module): Still more trailing whitespace to remove. (gfc_match_type_is): Allow PDT typespecs. * match.h : Modify prototypes for gfc_match_formal_arglist and gfc_match_actual_arglist. * module.c (ab_attribute, mstring attr_bits): PDT attributes added. (mio_symbol_attribute): PDT attributes handled. (mio_component): Deal with 'kind_expr' field. (mio_full_f2k_derived): For PDT templates, transfer the formal namespace symroot to the f2k_derived namespace. *primary.c (match_keyword_arg, gfc_match_actual_arglist): Add modifications to handle PDT spec lists. These are flagged in both cases by new boolean arguments, whose prototype defaults are false. (gfc_match_structure_constructor, match_variable): Remove yet more trailing whitespace. * resolve.c (get_pdt_spec_expr, get_pdt_constructor): New functions. (resolve_structure_cons): If the constructor is a PDT template, call get_pdt_constructor to build it using the parameter lists and then get the specific instance of the PDT. (resolve_component): PDT strings need a hidden string length component like deferred characters. (resolve_symbol): Dummy PDTs cannot have deferred parameters. * symbol.c (gfc_add_kind, gfc_add_len): New functions. (free_components): Free 'kind_expr' and 'param_list' fields. (gfc_free_symbol): Free the 'param_list' field. (gfc_find_sym_tree): If the current state is a PDT template, look for the symtree in the f2k_derived namspaces. trans-array.c (structure_alloc_comps): Allocate and deallocate PDTs. Check dummy arguments for compliance of LEN parameters. Add the new functions to the preceeding enum. (gfc_allocate_pdt_comp, gfc_deallocate_pdt_comp and gfc_check_pdt_dummy): New functions calling above. * trans-array.h : Add prototypes for these functions. trans-decl.c (gfc_get_symbol_decl): Call gfc_defer_symbol_init as appropriate for PDT symbols. (gfc_trans_deferred_vars): Allocate/deallocate PDT entities as they come into and out of scope. Exclude pdt_types from being 'gcc_unreachable'. (gfc_trans_subcomponent_assign): PDT array components must be handles as if they are allocatable. * trans-stmt.c (gfc_trans_allocate): Handle initialization of PDT entities. (gfc_trans_deallocate): Likewise. * trans-types.c (gfc_get_derived_type): PDT templates must not arrive here. PDT string components are handles as if deferred. Similarly, PDT arrays are treated as if allocatable. PDT strings are pointer types. * trans.c (gfc_deferred_strlen): Handle PDT strings in the same way as deferred characters. 2017-09-05 Paul Thomas * gfortran.dg/pdt_1.f03 : New test. * gfortran.dg/pdt_2.f03 : New test. * gfortran.dg/pdt_3.f03 : New test. * gfortran.dg/pdt_4.f03 : New test. * gfortran.dg/pdt_5.f03 : New test. --001a113b3dd8f6e259055884fcd1 Content-Type: text/plain; charset="US-ASCII"; name="notes0609.txt" Content-Disposition: attachment; filename="notes0609.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j791byev3 Content-length: 10692 Tm90ZXMgb24gaW1wbGVtZW50YXRpb24gb2YgUGFyYW1ldGVyaXplZCBEZXJp dmVkIFR5cGVzIGluIGdmb3J0cmFuCgoxKSBEZXJpdmVkIHR5cGUgZGVmaW5p dGlvbjoKX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpSNDI1CmRlcml2 ZWQtdHlwZS1kZWYgaXMgZGVyaXZlZC10eXBlLXN0bXQKCQkJWyB0eXBlLXBh cmFtLWRlZi1zdG10IF0KICAgICAJCQlbIHByaXZhdGUtb3Itc2VxdWVuY2Ug XSAuLi4KCQkJWyBjb21wb25lbnQtcGFydCBdCgkJCVsgdHlwZS1ib3VuZC1w cm9jZWR1cmUtcGFydCBdCgkJICAgIGVuZC10eXBlLXN0bXQKUjQyNgpkZXJp dmVkLXR5cGUtc3RtdCBpcyBUWVBFIFsgWyAsIHR5cGUtYXR0ci1zcGVjLWxp c3QgXSA6OiBdIHR5cGUtbmFtZSBbICggdHlwZS1wYXJhbS1uYW1lLWxpc3Qg KSBdCgpFeGFtcGxlIGluIE5vdGUgNC4yMzoKClRoZSBmb2xsb3dpbmcgZXhh bXBsZSB1c2VzIGRlcml2ZWQtdHlwZSBwYXJhbWV0ZXJzLgogICAgVFlQRSBo dW1vbmdvdXNfbWF0cml4KGssIGQpICAgICAgICAgICAgICAgICAgISAoIHR5 cGUtcGFyYW0tbmFtZS1saXN0ICkgPSAoayxkKQogICAgICBJTlRFR0VSLCBL SU5EIDo6IGsgPSBraW5kKDAuMCkgICAgICAgICAgICAgISBLSU5EIHBhcmFt ZXRlciB2YWx1ZXMga25vd24gYXQgY29tcGlsZSB0aW1lLgogICAgICBJTlRF R0VSKHNlbGVjdGVkX2ludF9raW5kKDEyKSksIExFTiA6OiBkICAgISBMRU4g cGFyYW1ldGVycyBtYXkgbm90IGJlIGtub3duIGF0IGNvbXBpbGUgdGltZQog IS0tIFNwZWNpZnkgYSBub25kZWZhdWx0IGtpbmQgZm9yIGQuCiAgICAgIFJF QUwoaykgOjogZWxlbWVudChkLGQpCiAgICBFTkQgVFlQRQoKSW4gdGhlIHBy ZXNlbnQgdmVyc2lvbiBvZiB0aGUgcGF0Y2gsIHRoZSAndHlwZS1wYXJhbS1u YW1lLWxpc3QnIGlzIHN0b3JlZCBhcyBhIGZvcm1hbF9hcmdsaXN0IGluIHRo ZSAnZm9ybWFsJyBmaWVsZCBvZiB0aGUgZGVyaXZlZCB0eXBlIHN5bWJvbCwg c2luY2UgaXQgaXMgbm90IG90aGVyd2lzZSB1c2VkLgoKVGhlIGdmY19zeW1i b2xzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZm9ybWFsX2FyZ2xpc3QgYXJlIGFk ZGVkIHRvIHRoZSBkZXJpdmVkIHR5cGUgJ2Yya19kZXJpdmVkJyBuYW1lc3Bh Y2UsIHdoaWNoIHdhcyBvbmUgb2YgdGhlIHJlYXNvbnMgd2h5IHRoaXMgbmFt ZXNwYWNlIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBmaXJzdCBwbGFjZS4KCklu IHRoaXMgZXhhbXBsZSwgJ2h1bW9uZ291c19tYXRyaXggaXMgbWFya2VkIHdp dGggdGhlIGF0dHJpYnV0ZSBwZHRfdGVtcGxhdGUgYW5kIHRoZSBjb21wb25l bnRzIHtrLGQsZWxlbWVudH0gd2l0aCBhdHRyaWJ1dGVzIHtwZHRfa2luZCxw ZHRfbGVuLHBkdF9hcnJheX0KCkEgbmV3IGdmY19jb21wb25lbnQgZmllbGQg J2tpbmRfZXhwcicgaGFzIGJlZW4gYWRkZWQsIHN1Y2ggdGhhdCBraW5kIGV4 cHJlc3Npb25zLCBzdWNoIGFzIHRoYXQgZm9yICdlbGVtZW50JyBjYW4gYmUg c3RvcmVkLiBUaGUgYXJyYXkgYm91bmQgZXhwcmVzc2lvbnMgYXJlIHN0b3Jl ZCBpbiB0aGUgYXJyYXlzcGVjIGFzIHVzdWFsLgoKVHlwZSBleHRlbnNpb24g aGFzIGJlZW4gaW1wbGVtZW50ZWQgYW5kIGVuc3VyZXMgdGhhdCB0aGUgZXh0 ZW5zaW9uIHBpY2tzIHVwIGEgY29weSBvZiB0aGUgJ3R5cGUtcGFyYW0tbmFt ZS1saXN0JyBvZiB0aGUgZXh0ZW5kZWQgdHlwZSwgd2hpY2ggaXMgY29uY2F0 ZW5hdGVkIHdpdGggc3VjaCBuZXcgJ3R5cGUtcGFyYW0tbmFtZS1saXN0JyBh cyB0aGVyZSBtaWdodCBiZS4KCjIpIFR5cGUgZGVjbGFyYXRpb24gc3RhdGVt ZW50czoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKUjUwMQp0 eXBlLWRlY2xhcmF0aW9uLXN0bXQgaXMgZGVjbGFyYXRpb24tdHlwZS1zcGVj IFsgWyAsIGF0dHItc3BlYyBdIC4uLiA6OiBdIGVudGl0eS1kZWNsIC1saXN0 CgpSNDAzCmRlY2xhcmF0aW9uLXR5cGUtc3BlYyBpcyBpbnRyaW5zaWMtdHlw ZS1zcGVjCgkJCW9yIFRZUEUgKCBpbnRyaW5zaWMtdHlwZS1zcGVjICkKCQkJ b3IgVFlQRSAoIGRlcml2ZWQtdHlwZS1zcGVjICkKCQkJb3IgQ0xBU1MgKCBk ZXJpdmVkLXR5cGUtc3BlYyApCgkJCW9yIENMQVNTICggKiApClI0NTMKZGVy aXZlZC10eXBlLXNwZWMgaXMgdHlwZS1uYW1lIFsgKCB0eXBlLXBhcmFtLXNw ZWMtbGlzdCApIF0KClI0NTQgdHlwZS1wYXJhbS1zcGVjIGlzIFsga2V5d29y ZCA9IF0gdHlwZS1wYXJhbS12YWx1ZQoKUjQwMQp0eXBlLXBhcmFtLXZhbHVl IGlzIHNjYWxhci1pbnQtZXhwcgoJCW9yICoKCQlvciA6CgpFeGFtcGxlIGlu IE5vdGUgNS4xOgpUWVBFIChodW1vbmdvdXNfbWF0cml4IChrPTgsIGQ9MTAw MCkpIDo6IG1hdAoKR2l2ZW4gdGhlIHNpbWlsYXJpdHkgdG8gYWN0dWFsIGFy Z3VtZW50cywgZ2ZjX2FjdHVhbF9hcmdsaXN0IGhhcyBiZWVuIHRha2VuIG92 ZXIgdG8gcmVwcmVzZW50IHRoZSB0eXBlX3BhcmFtX3NwZWNfbGlzdC4KCidw YXJhbV9saXN0JyBmaWVsZHMgaGF2ZSBiZWVuIGFkZGVkIHRvIGdmY19leHBy LCBnZmNfc3ltYm9sIGFuZCBnZmNfY29tcG9uZW50IHRvIHN0b3JlIGFsbCBv ciBwYXJ0IG9mIHRoZSB0eXBlLXBhcmFtLXNwZWMtbGlzdCwgYXMgcmVxdWly ZWQuCgpUaGUgd29ya2hvcnNlIGluIHRoZSBwcmVzZW50IGltcGxlbWVudGF0 aW9uIGlzIGRlY2wuYyhnZmNfZ2V0X3BkdF9pbnN0YW5jZSksIHdoaWNoIGNv bnZlcnRzIHRoZSBwZHQgdGVtcGxhdGVzIGludG8gaW5zdGFuY2VzIG9mIHBk dCB0eXBlcy4gVGhlc2UgaGF2ZSB0aGUgYXR0cmlidXRlIHBkdF90eXBlIG5h dHVyYWxseSBlbm91Z2guCgonZ2ZjX2dldF9wZHRfaW5zdGFuY2UnIGVuc3Vy ZXMgdGhhdCB0aGUgZXhwcmVzc2lvbnMgZm9yIHRoZSBLSU5EIHBhcmFtZXRl cnMgY2FuIGJlIHNpbXBsaWZpZWQgdG8gY29uc3RhbnQgZXhwcmVzc2lvbnMg YW5kIHRoZSBpbnN0YW5jZSBuYW1pbmcgaXMgUGR0Ly90ZW1wbGF0ZV9uYW1l Ly9fa2luZC52YWwxX2tpbmQudmFsMi4uLgoKVGhlIGluc3RhbmNlIG9mIHRo ZSBleGFtcGxlIGFib3ZlIGlzIG5hbWVkICdQZHRodW1vbmdvdXNfbWF0cml4 XzgKCklkZWFsbHksIHRoZSBuYW1lIHdvdWxkIGhhdmUgc3RhcnRlZCB3aXRo IGEgbm9uX2FscGhhIGNoYXJhY3RlciBzbyB0aGF0IGl0IHdvdWxkIG5vdCBi ZSBwb3NzaWJsZSB0byBjYXVzZSBhIGNsYXNoIHdpdGggYW4gZXhwbGljaXRs eSBkZWNsYXJlZCBlbnRpdHkuIFVuZm9ydHVuYXRlbHksIHRoaXMgd291bGQg aW50ZXJmZXJlIHdpdGggdGhlIG1lY2hhbmlzbSBkaXN0aW5ndWlzaGluZyB0 aGUgdHlwZSBmcm9tIGl0cyBjb25zdHJ1Y3Rvciwgd2hlcmUgbGVhZGluZyB1 cHBlciBhbmQgbG93ZXIgY2FzZSBhcmUgdXNlZCByZXNwZWN0aXZlbHkuIFVz aW5nICdAJyBiZXR3ZWVuICdQZHQnIGFuZCB0aGUgdGVtcGxhdGUgbmFtZSB3 b3JrZWQgdW50aWwgQ0xBU1MgZGVjbGFyYXRpb25zIHdlcmUgaW50cm9kdWNl ZCwgd2hlbiBhbGwgc29ydHMgb2YgbGlua2VyIHByb2JsZW1zIHdlcmUgY2F1 c2VkIGJ5IHRoZSBuYW1pbmcgb2YgdGhlIGZ1bmN0aW9ucyBhc3NvY2lhdGVk IHdpdGggdGhlIHZ0YWJsZXMuIFRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVk IHNvbWV0aW1lLgoKVE9ETyBFcnJvciBtZXNzYWdlcyBhdCB0aGUgbW9tZW50 IHVzZSB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWMgaW5zdGFuY2UuIFRoaXMg d2lsbCBoYXZlIHRvIGJlIGNoYW5nZWQgc28gdGhhdCB0aGUgbmFtZXMgYXBw ZWFyIGFzIHBlciBhIFBEVCBkZWNsYXJhdGlvbi4KCkl0IHNob3VsZCBiZSBu b3RlZCB0aGF0IEkgaGF2ZSB0aHVzIGZhciBiZWVuIHJhdGhlciBjYXZhbGll ciBhYm91dCBhc3N1bWVkIGFuZCBkZWZlcnJlZCBwYXJhbWV0ZXJzLiBUaGUg cmVxdWlzaXRlIGNoZWNrcyB3aWxsIGhhdmUgdG8gYmUgYWRkZWQgdG8gY29t cGx5IHdpdGggYWxsIHRoZSByZWxldmFudCBjb25zdHJhaW50cy4KCldoZXJl IGV4cGxpY2l0ICd0eXBlLXBhcmFtLXZhbHVlJ3MgYXJlIGdpdmVuIHRvIGR1 bW15IGFyZ3VtZW50cywgYSBydWRpbWVudGFyeSBydW50aW1lIGNoZWNrIGhh cyBiZWVuIGltcGxlbWVudGVkIHRvIGFzc2VydCB0aGF0IHRoZSBhY3R1YWwg YXJndW1lbnQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgY29tcGxpYW50LgoKVE9E TyBEZXRlcm1pbmUgaWYgaXQgcmVhbGx5IGlzIGFuIGVycm9yIGZvciBkdW1t eSBhcmd1bWVudHMgdG8gaGF2ZSBkZWZlcnJlZCB0eXBlIHBhcmFtZXRlcnMu CgpJIGhhdmUgZG9uZSBhIHJlYXNvbmFibHkgdGhvcm91Z2ggam9iIHRvIGVu c3VyZSB0aGF0IGFsbCB0aGUgc3BlY19saXN0cyBhcmUgZnJlZWQgYXMgd2Vs bCBhcyB0aGUga2luZCBleHByZXNzaW9ucy4KVE9ETyBDaGVjayB0aGF0IG5v IG5ldyBtZW1vcnkgbGVha3MgaGF2ZSBiZWVuIGludHJvZHVjZWQgaW4gdGhl IGNvbXBpbGVyLgoKMykgTWF0Y2hpbmcgdHlwZXNwZWNzIGluIG90aGVyIHNp dHVhdGlvbnMgKGVnLiBBTExPQ0FURSBvciBUWVBFIElTIHN0YXRlbWVudHMp Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KClRoaXMgaGFzIGJlZW4gZG9uZSBp biBtYXRjaC5jKGdmY19tYXRjaF9kZWNsX3R5cGVfc3BlYykgdXNpbmcgJ2dm Y19nZXRfcGR0X2luc3RhbmNlJy4gTm90aWNlIHRoYXQgdGhpcyBpcyBvbmx5 IHVzZWQgaW4gdGhlIEFMTE9DQVRFIGFuZCBUWVBFIElTIHN0YXRlbWVudHMg aW4gdGhlIHByZXNlbnQgcGF0Y2guIEluIHRoZSBQR0luc2lkZXIgYXJ0aWNs ZSBvbiB0aGUgc3ViamVjdCBvZiBQRFRzLCBhbGxvY2F0ZShhZGpfbWF0cml4 KDgsYyxyKTo6bWF0KSBhcHBlYXJzLCB3aGljaCBpcyBtYXRjaGVkIGJ5IHRo aXMgbWVjaGFuaXNtLgoKVE9ETyBGb3IgcmVhc29ucyB0aGF0IEkgaGF2ZSBu b3QgeWV0IGlkZW50aWZpZWQsIGFsbG9jYXRlKGFkal9tYXRyaXgoNCxzaXpl KHMsMSksc2l6ZShzLDIpKTo6ZCkgY2F1c2VzIGxpbmsgZXJyb3JzIGR1ZSB0 byAndW5kZWZpbmVkIHNpemVfJy4KCgo0KSBSdW50aW1lIGluaXRpYWxpemF0 aW9uIG9mIFBEVCBlbnRpdGllcwpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwoKVGhpcyBoYXMgYmVlbiBhY2NvbXBsaXNoZWQg YnkgZXh0ZW5kaW5nIHRoZSBhbGxvY2F0YWJsZSBjb21wb25lbnQgd29ya2hv cnNlIHRyYW5zLWFycmF5LmMoc3RydWN0dXJlX2FsbG9jX2NvbXBzKSB0byBp bmNsdWRlIHRoZSBjYWxscyAnZ2ZjX2FsbG9jYXRlX3BkdF9jb21wJywgJ2dm Y19kZWFsbG9jYXRlX3BkdF9jb21wJyBhbmQgJ2dmY19jaGVja19wZHRfZHVt bXknLgoKVGhlIGltcGxlbWVudGF0aW9uIGFsbG93cyByZWN1cnNpb24gaW50 byBleHRlbmRlZCB0eXBlcyBhbmQgUERUIGNvbXBvbmVudHMuCgpUaGUgaGFu ZGxpbmcgb2YgYXNzdW1lZCBhbmQgZGVmZXJyZWQgcGFyYW1ldGVycyBzdGls bCBuZWVkcyBhIGJpdCBvZiBjbGVhbmluZyB1cC4KClRPRE8gSSBoYXZlIHll dCB0byBwZXJ1c2UgdGhlIHN0YW5kYXJkIHRvIHVuZGVyc3Rvb2Qgd2hhdCBz aG91bGQgaGFwcGVuIHRvIHVzZSBhc3NvY2lhdGVkIFBEVCBlbnRpdGllcy4g T24gdGhlIGZhY2Ugb2YgaXQsIGl0IGlzIGRpZmZpY3VsdCB0byBzZWUgd2hl biBhbmQgaG93IHRoZXNlIHNob3VsZCBiZSBpbml0aWFsaXplZC4KCnRyYW5z X2RlY2wuYyhnZmNfdHJhbnNfZGVmZXJyZWRfdmFycykgaGFuZGxlcyB0aGUg aW50aWFsaXphdGlvbiBhbmQgYXV0b21hdGljIGRlYWxsb2NhdGlvbiBjYWxs cy4KCnRyYW5zLXN0bXQuYyhnZmNfdHJhbnNfYWxsb2NhdGUpICYgKGdmY190 cmFuc19kZWFsbG9jYXRlKSBzZWVtIHRvIHdvcmsgY29ycmVjdGx5IGFuZCB0 byBjYWxsICdnZmNfYWxsb2NhdGVfcGR0X2NvbXAnIGFzIHJlcXVpcmVkLgoK VE9ETyBOb3RlIHRoYXQgaW4gUERUXzUuZjAzLCB0aGUgYWxsb2NhdGUgd2l0 aCBNT0xEIGlzIHBlcnR1cmJlZCBieSB0aGUgZGVmaW5lZCBhc3NpZ25tZW50 IGRlZmluaXRpb25zIGFuZCB0aGF0IHRoZSBMRU4gcGFyYW1ldGVycyBhcmUg bm90IGJlaW5nIHNldC4gVGhpcyBsaWtlbHkgbmVlZHMgeWV0IGFub3RoZXIg ZnVuY3Rpb24gaW4gdHJhbnMtYXJyYXkuYyB0byBjb3B5IFBEVCBlbnRpdGll cy4KCkkgaGF2ZSBub3QgY2hlY2tlZCBmdWxseSBmb3IgcnVudGltZSBtZW1v cnkgbGVha3MuCgoKNSkgT3RoZXIgcmVtYXJrcwpfX19fX19fX19fX19fX19f CgpJIGhhdmUgcmVzdHJpY3RlZCBMRU4gcGFyYW1ldGVycyB0byBiZSBvZiBk ZWZhdWx0IGludGVnZXIga2luZC4gSSBub3RlIGZyb20gdGhlIHN0YW5kYXJk LCBmb3IgZXhhbXBsZSBpIDEpIGFib3ZlLCB0aGF0IHRoaXMgaXMgbm90IG5l Y2Vzc2FyeS4KCkkgbWFkZSBzb21lIGNoYW5nZXMgdG8gZHVtcC1wYXJzZS10 cmVlLmMgYmVjYXVzZSBjb21wb25lbnRzIGluIHBhcnRpY3VsYXIgd2VyZSBn ZXR0aW5nIHZlcnkgY2x1dHRlcmVkIHdpdGggdGhlIG5ldyBmaWVsZHMuCgpp bnRlcmZhY2UuYyhnZmNfY29tcGFyZV9kZXJpdmVkX3R5cGVzKSBoYWQgdG8g YmUgbW9kaWZpZWQgdG8gZW5zdXJlIHRoYXQgbGlrZSAncGR0X3R5cGUncyB3 ZXJlIG5vdCByZWplY3RlZC4KCkluIG1vZHVsZS5jKG1pb19mdWxsX2Yya19k ZXJpdmVkKSB0aGUgJ3N5bV9yb290JyBvZiB0aGUgZm9ybWFsIG5hbWVzcGFj ZSBpcyBoaWphY2tlZCBhbmQgYXBwZW5kZWQgdG8gdGhlICdmMmtfZGVyaXZl ZCcgbmFtZXNwYWNlLgoKVGhlIG5ldyBmdW5jdGlvbiByZXNvbHZlLmMoZ2V0 X3BkdF9jb25zdHJ1Y3Rvcikgc29ydHMgb3V0IHRoZSBwYXJhbWV0ZXIgZXhw cmVzc2lvbnMgZm9yIHRoZSBjb21wb25lbnQgZXhwcmVzc2lvbnMuCgpUT0RP IEkgcmF0aGVyIHRoaW5rIHRoYXQgdGhlIGhhbmRsaW5nIG9mIENMQVNTIFBE VHMgaXMgaW4gb25lIG9yIHR3byBwbGFjZXMgd3Jvbmcgb3IgaW5jb25zaXN0 ZW50LgoKVE9ETyBJIHJhdGhlciB0aGluayB0aGF0IG11Y2ggb2YgdGhlIG5l dyBjb250ZW50IGluIGRlY2wuYyBzaG91bGQgYmUgbW92ZWQgdG8gY2xhc3Mu YyBvciBleHByLmMuIFNpbmNlIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBm dW5jdGlvbmFsaXR5LCBJIGhhdmUgbGVmdCB0aGlzIHRhc2sgdW50aWwgSSBo YXZlIHNvbWUgbW9yZSB0aW1lIHRvIHNwZW5kIG9uIFBEVHMuCgo2KSBUZXN0 cwpfX19fX19fXwoKcGR0XzEuZjAzIC0gY2hlY2tzIGJhc2ljIFBEVCBmdW5j dGlvbmFsaXR5CnBkdF8yLmYwMyAtIHRlc3RzIHJ1bnRpbWUgZXJyb3IgZm9y IG1pc21hdGNoIGJldHdlZW4gYWN0dWFsIGFuZCBkdW1teSBsZW4gcGFyYW1l dGVycwpwZHRfMy5mMDMgLSBjaGVja3MgdHlwZSBleHRlbnNpb24gYW5kIGJh c2ljIE9PUCwgaW5jbHVkaW5nIFNFTEVDVCBUWVBFCnBkdF80LmYwMyAtIGV4 ZXJjaXNlcyB0aGUgY29tcGlsZSB0aW1lIGVycm9ycy4KcGR0XzUuZjAzIC0g dGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHRoaXJkIGV4YW1w bGUgaW4gdGhlIFBHSW5zaWRlciBhcnRpY2xlIG9uIFBEVHMuCgpUT0RPIFNv bWUgb2YgdGhlIG1vZGlmaWNhdGlvbnMgaW4gcGR0XzUuZjAzIGFyZSBkdWUg dG8gc29tZSBhcHBhcmVudCBzaG9ydGNvbWluZ3MgaW4gZ2ZvcnRyYW47IGVn LiBhbGxvY2F0aW5nIGludHJpbnNpYyB0eXBlcyB3aXRoIGFuIHVubGltaXRl ZCBwb2x5bW9ycGhpYyBzb3VyY2UuIEFsc28gbmVlZCB0byBmaW5kIG91dCB3 aHkgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgbWFpbiBwcm9ncmFtIGhhZCB0 byBiZSBjaGFuZ2VkIGZvciBDTEFTUyB0byBUWVBFIGFuZCB3aGF0IGlzIGhh cHBlbmluZyB3aXRoIHRoZSB1c2Ugb2YgU0laRSBpbiB0aGUgdHlwZXNwZWNz LiBBbGwgdGhlc2UgcG9pbnRzIGFyZSBjb21tZW50ZWQgaW4gdGhlIHRlc3Qu CgoKCgoKCgoKCgo= --001a113b3dd8f6e259055884fcd1 Content-Type: text/plain; charset="US-ASCII"; name="check0609.diff" Content-Disposition: attachment; filename="check0609.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j791c7d94 Content-length: 154070 SW5kZXg6IGdjYy9mb3J0cmFuL2RlY2wuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09CioqKiBnY2MvZm9ydHJhbi9kZWNsLmMJKHJldmlzaW9uIDI1MTU0NikK LS0tIGdjYy9mb3J0cmFuL2RlY2wuYwkod29ya2luZyBjb3B5KQoqKioqKioq KioqKioqKiogZ2ZjX3N5bWJvbCAqZ2ZjX25ld19ibG9jazsKKioqIDk1LDEw MCAqKioqCi0tLSA5NSwxMDkgLS0tLQogIAogIGJvb2wgZ2ZjX21hdGNoaW5n X2Z1bmN0aW9uOwogIAorIC8qIElmIGEga2luZCBleHByZXNzaW9uIG9mIGEg Y29tcG9uZW50IG9mIGEgcGFyYW1ldGVyaXplZCBkZXJpdmVkIHR5cGUgaXMK KyAgICBwYXJhbWV0ZXJpemVkLCB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgZXhw cmVzc2lvbiBoZXJlLiAgKi8KKyBzdGF0aWMgZ2ZjX2V4cHIgKnNhdmVkX2tp bmRfZXhwciA9IE5VTEw7CisgCisgLyogVXNlZCB0byBzdG9yZSB0aGUgcGFy YW1ldGVyIGxpc3QgYXJpc2luZyBpbiBhIFBEVCBkZWNsYXJhdGlvbiBhbmQK KyAgICBpbiB0aGUgdHlwZXNwZWMgb2YgYSBQRFQgdmFyaWFibGUgb3IgY29t cG9uZW50LiAgKi8KKyBzdGF0aWMgZ2ZjX2FjdHVhbF9hcmdsaXN0ICpkZWNs X3R5cGVfcGFyYW1fbGlzdDsKKyBzdGF0aWMgZ2ZjX2FjdHVhbF9hcmdsaXN0 ICp0eXBlX3BhcmFtX3NwZWNfbGlzdDsKKyAKICAKICAvKioqKioqKioqKioq KioqKioqKioqIERBVEEgc3RhdGVtZW50IHN1YnJvdXRpbmVzICoqKioqKioq KioqKioqKioqKioqKi8KICAKKioqKioqKioqKioqKioqIGJ1aWxkX3N5bSAo Y29uc3QgY2hhciAqbmFtZSwgZ2ZjX2NoYXJsZW4KKioqIDE1MDAsMTUwNSAq KioqCi0tLSAxNTA5LDE1MTkgLS0tLQogIAogICAgc3ltLT5hdHRyLmltcGxp ZWRfaW5kZXggPSAwOwogIAorICAgLyogVXNlIHRoZSBwYXJhbWV0ZXIgZXhw cmVzc2lvbnMgZm9yIGEgcGFyYW1ldGVyaXplZCBkZXJpdmVkIHR5cGUuICAq LworICAgaWYgKChzeW0tPnRzLnR5cGUgPT0gQlRfREVSSVZFRCB8fCBzeW0t PnRzLnR5cGUgPT0gQlRfQ0xBU1MpCisgICAgICAgJiYgc3ltLT50cy51LmRl cml2ZWQtPmF0dHIucGR0X3R5cGUgJiYgdHlwZV9wYXJhbV9zcGVjX2xpc3Qp CisgICAgIHN5bS0+cGFyYW1fbGlzdCA9IGdmY19jb3B5X2FjdHVhbF9hcmds aXN0ICh0eXBlX3BhcmFtX3NwZWNfbGlzdCk7CisgCiAgICBpZiAoc3ltLT50 cy50eXBlID09IEJUX0NMQVNTKQogICAgICByZXR1cm4gZ2ZjX2J1aWxkX2Ns YXNzX3N5bWJvbCAoJnN5bS0+dHMsICZzeW0tPmF0dHIsICZzeW0tPmFzKTsK ICAKKioqKioqKioqKioqKioqIGJ1aWxkX3N0cnVjdCAoY29uc3QgY2hhciAq bmFtZSwgZ2ZjX2NoYXIKKioqIDE5NDYsMTk1MSAqKioqCi0tLSAxOTYwLDE5 NzAgLS0tLQogICAgYy0+dHMgPSBjdXJyZW50X3RzOwogICAgaWYgKGMtPnRz LnR5cGUgPT0gQlRfQ0hBUkFDVEVSKQogICAgICBjLT50cy51LmNsID0gY2w7 CisgCisgICBpZiAoYy0+dHMudHlwZSAhPSBCVF9DTEFTUyAmJiBjLT50cy50 eXBlICE9IEJUX0RFUklWRUQKKyAgICAgICAmJiBjLT50cy5raW5kID09IDAg JiYgc2F2ZWRfa2luZF9leHByICE9IE5VTEwpCisgICAgIGMtPmtpbmRfZXhw ciA9IGdmY19jb3B5X2V4cHIgKHNhdmVkX2tpbmRfZXhwcik7CisgCiAgICBj LT5hdHRyID0gY3VycmVudF9hdHRyOwogIAogICAgYy0+aW5pdGlhbGl6ZXIg PSAqaW5pdDsKKioqKioqKioqKioqKioqIHNjYWxhcjoKKioqIDE5OTksMjAw NCAqKioqCi0tLSAyMDE4LDIwNDggLS0tLQogICAgaWYgKGMtPnRzLnR5cGUg PT0gQlRfQ0xBU1MpCiAgICAgIHJldHVybiBnZmNfYnVpbGRfY2xhc3Nfc3lt Ym9sICgmYy0+dHMsICZjLT5hdHRyLCAmYy0+YXMpOwogIAorICAgaWYgKGMt PmF0dHIucGR0X2tpbmQgfHwgYy0+YXR0ci5wZHRfbGVuKQorICAgICB7Cisg ICAgICAgZ2ZjX3N5bWJvbCAqc3ltOworICAgICAgIGdmY19maW5kX3N5bWJv bCAoYy0+bmFtZSwgZ2ZjX2N1cnJlbnRfYmxvY2sgKCktPmYya19kZXJpdmVk LAorIAkJICAgICAgIDAsICZzeW0pOworICAgICAgIGlmIChzeW0gPT0gTlVM TCkKKyAJeworIAkgIGdmY19lcnJvciAoIlR5cGUgcGFyYW1ldGVyICVxcyBh dCAlQyBoYXMgbm8gY29ycmVzcG9uZGluZyBlbnRyeSAiCisgCQkgICAgICJp biB0aGUgdHlwZSBwYXJhbWV0ZXIgbmFtZSBsaXN0IGF0ICVMIiwKKyAJCSAg ICAgYy0+bmFtZSwgJmdmY19jdXJyZW50X2Jsb2NrICgpLT5kZWNsYXJlZF9h dCk7CisgCSAgcmV0dXJuIGZhbHNlOworIAl9CisgICAgICAgc3ltLT50cyA9 IGMtPnRzOworICAgICAgIHN5bS0+YXR0ci5wZHRfa2luZCA9IGMtPmF0dHIu cGR0X2tpbmQ7CisgICAgICAgc3ltLT5hdHRyLnBkdF9sZW4gPSBjLT5hdHRy LnBkdF9sZW47CisgICAgICAgaWYgKGMtPmluaXRpYWxpemVyKQorIAlzeW0t PnZhbHVlID0gZ2ZjX2NvcHlfZXhwciAoYy0+aW5pdGlhbGl6ZXIpOworICAg ICAgIHN5bS0+YXR0ci5mbGF2b3IgPSBGTF9WQVJJQUJMRTsKKyAgICAgfQor IAorICAgaWYgKChjLT50cy50eXBlID09IEJUX0RFUklWRUQgfHwgYy0+dHMu dHlwZSA9PSBCVF9DTEFTUykKKyAgICAgICAmJiBjLT50cy51LmRlcml2ZWQg JiYgYy0+dHMudS5kZXJpdmVkLT5hdHRyLnBkdF90ZW1wbGF0ZQorICAgICAg ICYmIGRlY2xfdHlwZV9wYXJhbV9saXN0KQorICAgICBjLT5wYXJhbV9saXN0 ID0gZ2ZjX2NvcHlfYWN0dWFsX2FyZ2xpc3QgKGRlY2xfdHlwZV9wYXJhbV9s aXN0KTsKKyAKICAgIHJldHVybiB0cnVlOwogIH0KICAKKioqKioqKioqKioq KioqIGdmY19tYXRjaF9raW5kX3NwZWMgKGdmY190eXBlc3BlYyAqdHMsIGIK KioqIDI2MTIsMjYxNyAqKioqCi0tLSAyNjU2LDI2NjIgLS0tLQogICAgbSA9 IE1BVENIX05POwogICAgbiA9IE1BVENIX1lFUzsKICAgIGUgPSBOVUxMOwor ICAgc2F2ZWRfa2luZF9leHByID0gTlVMTDsKICAKICAgIHdoZXJlID0gbG9j ID0gZ2ZjX2N1cnJlbnRfbG9jdXM7CiAgCioqKioqKioqKioqKioqKiBnZmNf bWF0Y2hfa2luZF9zcGVjIChnZmNfdHlwZXNwZWMgKnRzLCBiCioqKiAyNjI4 LDI2MzUgKioqKgotLS0gMjY3MywyNjg4IC0tLS0KICAgIGxvYyA9IGdmY19j dXJyZW50X2xvY3VzOwogIAogIGtpbmRfZXhwcjoKKyAKICAgIG4gPSBnZmNf bWF0Y2hfaW5pdF9leHByICgmZSk7CiAgCisgICBpZiAoZ2ZjX2Rlcml2ZWRf cGFyYW1ldGVyX2V4cHIgKGUpKQorICAgICB7CisgICAgICAgdHMtPmtpbmQg PSAwOworICAgICAgIHNhdmVkX2tpbmRfZXhwciA9IGdmY19jb3B5X2V4cHIg KGUpOworICAgICAgIGdvdG8gY2xvc2VfYnJhY2tldHM7CisgICAgIH0KKyAK ICAgIGlmIChuICE9IE1BVENIX1lFUykKICAgICAgewogICAgICAgIGlmIChn ZmNfbWF0Y2hpbmdfZnVuY3Rpb24pCioqKioqKioqKioqKioqKiBraW5kX2V4 cHI6CioqKiAyNzA3LDI3MTIgKioqKgotLS0gMjc2MCwyNzY3IC0tLS0KICAJ CSAgICAgImlzICVzIiwgZ2ZjX2Jhc2ljX3R5cGVuYW1lICh0cy0+ZjkwX3R5 cGUpLCAmd2hlcmUsCiAgCQkgICAgIGdmY19iYXNpY190eXBlbmFtZSAodHMt PnR5cGUpKTsKICAKKyBjbG9zZV9icmFja2V0czoKKyAKICAgIGdmY19nb2Ji bGVfd2hpdGVzcGFjZSAoKTsKICAgIGlmICgoYyA9IGdmY19uZXh0X2FzY2lp X2NoYXIgKCkpICE9ICcpJwogICAgICAgICYmICh0cy0+dHlwZSAhPSBCVF9D SEFSQUNURVIgfHwgYyAhPSAnLCcpKQoqKioqKioqKioqKioqKiogbWF0Y2hf cmVjb3JkX2RlY2wgKGNoYXIgKm5hbWUpCioqKiAzMDMwLDMwMzUgKioqKgot LS0gMzA4NSwzNTA3IC0tLS0KICAgIHJldHVybiBNQVRDSF9FUlJPUjsKICB9 CiAgCisgCisgLyogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBnZmNfYWN0dWFs X2FyZ2xpc3QgJ3R5cGVfcGFyYW1fc3BlY19saXN0JyBhcyBhIHNvdXJjZQor ICAgIG9mIGV4cHJlc3Npb25zIHRvIHN1YnN0aXR1dGUgaW50byB0aGUgcG9z c2libHkgcGFyYW1ldGVyaXplZCBleHByZXNzaW9uCisgICAgJ2UnLiBVc2lu ZyBhIGxpc3QgaXMgaW5lZmZpY2llbnQgYnV0IHNob3VsZCBub3QgYmUgdG9v IGJhZCBzaW5jZSB0aGUKKyAgICBudW1iZXIgb2YgdHlwZSBwYXJhbWV0ZXJz IGlzIG5vdCBsaWtlbHkgdG8gYmUgbGFyZ2UuICAqLworIHN0YXRpYyBib29s CisgaW5zZXJ0X3BhcmFtZXRlcl9leHBycyAoZ2ZjX2V4cHIqIGUsIGdmY19z eW1ib2wqIHN5bSBBVFRSSUJVVEVfVU5VU0VELAorIAkJCWludCogZikKKyB7 CisgICBnZmNfYWN0dWFsX2FyZ2xpc3QgKnBhcmFtOworICAgZ2ZjX2V4cHIg KmNvcHk7CisgCisgICBpZiAoZS0+ZXhwcl90eXBlICE9IEVYUFJfVkFSSUFC TEUpCisgICAgIHJldHVybiBmYWxzZTsKKyAKKyAgIGdjY19hc3NlcnQgKGUt PnN5bXRyZWUpOworICAgaWYgKGUtPnN5bXRyZWUtPm4uc3ltLT5hdHRyLnBk dF9raW5kCisgICAgICAgfHwgKCpmICE9IDAgJiYgZS0+c3ltdHJlZS0+bi5z eW0tPmF0dHIucGR0X2xlbikpCisgICAgIHsKKyAgICAgICBmb3IgKHBhcmFt ID0gdHlwZV9wYXJhbV9zcGVjX2xpc3Q7IHBhcmFtOyBwYXJhbSA9IHBhcmFt LT5uZXh0KQorIAlpZiAoc3RyY21wIChlLT5zeW10cmVlLT5uLnN5bS0+bmFt ZSwgcGFyYW0tPm5hbWUpID09IDApCisgCSAgYnJlYWs7CisgCisgICAgICAg aWYgKHBhcmFtKQorIAl7CisgCSAgY29weSA9IGdmY19jb3B5X2V4cHIgKHBh cmFtLT5leHByKTsKKyAJICAqZSA9ICpjb3B5OworIAkgIGZyZWUgKGNvcHkp OworIAl9CisgICAgIH0KKyAKKyAgIHJldHVybiBmYWxzZTsKKyB9CisgCisg CisgYm9vbAorIGdmY19pbnNlcnRfa2luZF9wYXJhbWV0ZXJfZXhwcnMgKGdm Y19leHByICplKQorIHsKKyAgIHJldHVybiBnZmNfdHJhdmVyc2VfZXhwciAo ZSwgTlVMTCwgJmluc2VydF9wYXJhbWV0ZXJfZXhwcnMsIDApOworIH0KKyAK KyAKKyBib29sCisgZ2ZjX2luc2VydF9wYXJhbWV0ZXJfZXhwcnMgKGdmY19l eHByICplLCBnZmNfYWN0dWFsX2FyZ2xpc3QgKnBhcmFtX2xpc3QpCisgewor ICAgZ2ZjX2FjdHVhbF9hcmdsaXN0ICpvbGRfcGFyYW1fc3BlY19saXN0ID0g dHlwZV9wYXJhbV9zcGVjX2xpc3Q7CisgICB0eXBlX3BhcmFtX3NwZWNfbGlz dCA9IHBhcmFtX2xpc3Q7CisgICByZXR1cm4gZ2ZjX3RyYXZlcnNlX2V4cHIg KGUsIE5VTEwsICZpbnNlcnRfcGFyYW1ldGVyX2V4cHJzLCAxKTsKKyAgIHR5 cGVfcGFyYW1fc3BlY19saXN0ID0gTlVMTDsKKyAgIHR5cGVfcGFyYW1fc3Bl Y19saXN0ID0gb2xkX3BhcmFtX3NwZWNfbGlzdDsKKyB9CisgCisgLyogRGV0 ZXJtaW5lcyB0aGUgaW5zdGFuY2Ugb2YgYSBwYXJhbWV0ZXJpemVkIGRlcml2 ZWQgdHlwZSB0byBiZSB1c2VkIGJ5CisgICAgbWF0Y2hpbmcgZGV0ZXJtaW5p bmcgdGhlIHZhbHVlcyBvZiB0aGUga2luZCBwYXJhbWV0ZXJzIGFuZCB1c2lu ZyB0aGVtCisgICAgaW4gdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlLiBJZiB0 aGUgaW5zdGFuY2UgZXhpc3RzLCBpdCBpcyB1c2VkLCBvdGhlcndpc2UKKyAg ICBhIG5ldyBkZXJpdmVkIHR5cGUgaXMgY3JlYXRlZC4gICovCisgbWF0Y2gK KyBnZmNfZ2V0X3BkdF9pbnN0YW5jZSAoZ2ZjX2FjdHVhbF9hcmdsaXN0ICpw YXJhbV9saXN0LCBnZmNfc3ltYm9sICoqc3ltLAorIAkJICAgICAgZ2ZjX2Fj dHVhbF9hcmdsaXN0ICoqZXh0X3BhcmFtX2xpc3QpCisgeworICAgLyogVGhl IFBEVCB0ZW1wbGF0ZSBzeW1ib2wuICAqLworICAgZ2ZjX3N5bWJvbCAqcGR0 ID0gKnN5bTsKKyAgIC8qIFRoZSBzeW1ib2wgZm9yIHRoZSBwYXJhbWV0ZXIg aW4gdGhlIHRlbXBsYXRlIGYya19uYW1lc3BhY2UuICAqLworICAgZ2ZjX3N5 bWJvbCAqcGFyYW07CisgICAvKiBUaGUgaG9wZWQgZm9yIGluc3RhbmNlIG9m IHRoZSBQRFQuICAqLworICAgZ2ZjX3N5bWJvbCAqaW5zdGFuY2U7CisgICAv KiBUaGUgbGlzdCBvZiBwYXJhbWV0ZXJzIGFwcGVhcmluZyBpbiB0aGUgUERU IGRlY2xhcmF0aW9uLiAgKi8KKyAgIGdmY19mb3JtYWxfYXJnbGlzdCAqdHlw ZV9wYXJhbV9uYW1lX2xpc3Q7CisgICAvKiBVc2VkIHRvIHN0b3JlIHRoZSBw YXJhbWV0ZXIgc3BlY2lmaWNhdGlvbiBsaXN0IGR1cmluZyByZWN1cnNpdmUg Y2FsbHMuICAqLworICAgZ2ZjX2FjdHVhbF9hcmdsaXN0ICpvbGRfcGFyYW1f c3BlY19saXN0OworICAgLyogUG9pbnRlcnMgdG8gdGhlIHBhcmFtZXRlciBz cGVjaWZpY2F0aW9uIGJlaW5nIHVzZWQuICAqLworICAgZ2ZjX2FjdHVhbF9h cmdsaXN0ICphY3R1YWxfcGFyYW07CisgICBnZmNfYWN0dWFsX2FyZ2xpc3Qg KnRhaWwgPSBOVUxMOworICAgLyogVXNlZCB0byBidWlsZCB1cCB0aGUgbmFt ZSBvZiB0aGUgUERUIGluc3RhbmNlLiBUaGUgcHJlZml4IHVzZXMgNAorICAg ICAgY2hhcmFjdGVycyBhbmQgZWFjaCBLSU5EIHBhcmFtZXRlciAyIG1vcmUu ICBBbGxvdyA4IG9mIHRoZSBsYXR0ZXIuICovCisgICBjaGFyIG5hbWVbR0ZD X01BWF9TWU1CT0xfTEVOICsgMjFdOworIAorICAgYm9vbCBuYW1lX3NlZW4g PSAocGFyYW1fbGlzdCA9PSBOVUxMKTsKKyAgIGJvb2wgYXNzdW1lZF9zZWVu ID0gZmFsc2U7CisgICBib29sIGRlZmVycmVkX3NlZW4gPSBmYWxzZTsKKyAg IGJvb2wgc3BlY19lcnJvciA9IGZhbHNlOworICAgaW50IGtpbmRfdmFsdWUs IGk7CisgICBnZmNfZXhwciAqa2luZF9leHByOworICAgZ2ZjX2NvbXBvbmVu dCAqYzEsICpjMjsKKyAgIG1hdGNoIG07CisgCisgICB0eXBlX3BhcmFtX3Nw ZWNfbGlzdCA9IE5VTEw7CisgCisgICB0eXBlX3BhcmFtX25hbWVfbGlzdCA9 IHBkdC0+Zm9ybWFsOworICAgYWN0dWFsX3BhcmFtID0gcGFyYW1fbGlzdDsK KyAgIHNwcmludGYgKG5hbWUsICJQZHQlcyIsIHBkdC0+bmFtZSk7CisgCisg ICAvKiBSdW4gdGhyb3VnaCB0aGUgcGFyYW1ldGVyIG5hbWUgbGlzdCBhbmQg cGljayB1cCB0aGUgYWN0dWFsCisgICAgICBwYXJhbWV0ZXIgdmFsdWVzIG9y IHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIFBEVCBkZWNsYXJhdGlv bi4gICovCisgICBmb3IgKDsgdHlwZV9wYXJhbV9uYW1lX2xpc3Q7CisgICAg ICAgIHR5cGVfcGFyYW1fbmFtZV9saXN0ID0gdHlwZV9wYXJhbV9uYW1lX2xp c3QtPm5leHQpCisgICAgIHsKKyAgICAgICBpZiAoYWN0dWFsX3BhcmFtICYm IGFjdHVhbF9wYXJhbS0+c3BlY190eXBlICE9IFNQRUNfRVhQTElDSVQpCisg CXsKKyAJICBpZiAoYWN0dWFsX3BhcmFtLT5zcGVjX3R5cGUgPT0gU1BFQ19B U1NVTUVEKQorIAkgICAgc3BlY19lcnJvciA9IGRlZmVycmVkX3NlZW47Cisg CSAgZWxzZQorIAkgICAgc3BlY19lcnJvciA9IGFzc3VtZWRfc2VlbjsKKyAK KyAJICBpZiAoc3BlY19lcnJvcikKKyAJICAgIHsKKyAJICAgICAgZ2ZjX2Vy cm9yICgiVGhlIHR5cGUgcGFyYW1ldGVyIHNwZWMgbGlzdCBhdCAlQyBjYW5u b3QgY29udGFpbiAiCisgCQkJICJib3RoIEFTU1VNRUQgYW5kIERFRkVSUkVE IHBhcmFtZXRlcnMiKTsKKyAJICAgICAgZ2ZjX2ZyZWVfYWN0dWFsX2FyZ2xp c3QgKHR5cGVfcGFyYW1fc3BlY19saXN0KTsKKyAJICAgICAgcmV0dXJuIE1B VENIX0VSUk9SOworIAkgICAgfQorIAl9CisgCisgICAgICAgaWYgKGFjdHVh bF9wYXJhbSAmJiBhY3R1YWxfcGFyYW0tPm5hbWUpCisgCW5hbWVfc2VlbiA9 IHRydWU7CisgICAgICAgcGFyYW0gPSB0eXBlX3BhcmFtX25hbWVfbGlzdC0+ c3ltOworIAorICAgICAgIGtpbmRfZXhwciA9IE5VTEw7CisgICAgICAgaWYg KCFuYW1lX3NlZW4pCisgCXsKKyAJICBpZiAoYWN0dWFsX3BhcmFtICYmIGFj dHVhbF9wYXJhbS0+c3BlY190eXBlID09IFNQRUNfRVhQTElDSVQpCisgCSAg ICBraW5kX2V4cHIgPSBnZmNfY29weV9leHByIChhY3R1YWxfcGFyYW0tPmV4 cHIpOworIAl9CisgICAgICAgZWxzZQorIAl7CisgCSAgYWN0dWFsX3BhcmFt ID0gcGFyYW1fbGlzdDsKKyAJICBmb3IgKDthY3R1YWxfcGFyYW07IGFjdHVh bF9wYXJhbSA9IGFjdHVhbF9wYXJhbS0+bmV4dCkKKyAJICAgIGlmIChhY3R1 YWxfcGFyYW0tPm5hbWUKKyAJICAgICAgICAmJiBzdHJjbXAgKGFjdHVhbF9w YXJhbS0+bmFtZSwgcGFyYW0tPm5hbWUpID09IDApCisgCSAgICAgIGJyZWFr OworIAkgIGlmIChhY3R1YWxfcGFyYW0gJiYgYWN0dWFsX3BhcmFtLT5zcGVj X3R5cGUgPT0gU1BFQ19FWFBMSUNJVCkKKyAJICAgIGtpbmRfZXhwciA9IGdm Y19jb3B5X2V4cHIgKGFjdHVhbF9wYXJhbS0+ZXhwcik7CisgCSAgZWxzZQor IAkgICAgeworIAkgICAgICBpZiAocGFyYW0tPnZhbHVlKQorIAkJa2luZF9l eHByID0gZ2ZjX2NvcHlfZXhwciAocGFyYW0tPnZhbHVlKTsKKyAJICAgICAg ZWxzZSBpZiAoIShhY3R1YWxfcGFyYW0gJiYgcGFyYW0tPmF0dHIucGR0X2xl bikpCisgCQl7CisgCQkgIGdmY19lcnJvciAoIlRoZSBkZXJpdmVkIHBhcmFt ZXRlciAnJXFzJyBhdCAlQyBkb2VzIG5vdCAiCisgCQkJICAgICAiaGF2ZSBh IGRlZmF1bHQgdmFsdWUiLCBwYXJhbS0+bmFtZSk7CisgCQkgIHJldHVybiBN QVRDSF9FUlJPUjsKKyAJCX0KKyAJICAgIH0KKyAJfQorIAorICAgICAgIC8q IFN0b3JlIHRoZSBjdXJyZW50IHBhcmFtZXRlciBleHByZXNzaW9ucyBpbiBh IHRlbXBvcmFyeSBhY3R1YWwKKyAJIGFyZ2xpc3QgJ2xpc3QnIHNvIHRoYXQg dGhleSBjYW4gYmUgc3Vic3RpdHV0ZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcK KyAJIGV4cHJlc3Npb25zIGluIHRoZSBQRFQgaW5zdGFuY2UuICAqLworICAg ICAgIGlmICh0eXBlX3BhcmFtX3NwZWNfbGlzdCA9PSBOVUxMKQorIAl7Cisg CSAgdHlwZV9wYXJhbV9zcGVjX2xpc3QgPSBnZmNfZ2V0X2FjdHVhbF9hcmds aXN0ICgpOworIAkgIHRhaWwgPSB0eXBlX3BhcmFtX3NwZWNfbGlzdDsKKyAJ fQorICAgICAgIGVsc2UKKyAJeworIAkgIHRhaWwtPm5leHQgPSBnZmNfZ2V0 X2FjdHVhbF9hcmdsaXN0ICgpOworIAkgIHRhaWwgPSB0YWlsLT5uZXh0Owor IAl9CisgICAgICAgdGFpbC0+bmFtZSA9IHBhcmFtLT5uYW1lOworIAorICAg ICAgIGlmIChraW5kX2V4cHIpCisgCXsKKyAJICB0YWlsLT5leHByID0gZ2Zj X2NvcHlfZXhwciAoa2luZF9leHByKTsKKyAJICAvKiBUcnkgc2ltcGxpZmlj YXRpb24gZXZlbiBmb3IgTEVOIGV4cHJlc3Npb25zLiAgKi8KKyAJICBnZmNf c2ltcGxpZnlfZXhwciAodGFpbC0+ZXhwciwgMSk7CisgCX0KKyAKKyAgICAg ICBpZiAoYWN0dWFsX3BhcmFtKQorIAl0YWlsLT5zcGVjX3R5cGUgPSBhY3R1 YWxfcGFyYW0tPnNwZWNfdHlwZTsKKyAKKyAgICAgICBpZiAoIXBhcmFtLT5h dHRyLnBkdF9raW5kKQorIAl7CisgCSAgaWYgKCFuYW1lX3NlZW4pCisgCSAg ICBhY3R1YWxfcGFyYW0gPSBhY3R1YWxfcGFyYW0tPm5leHQ7CisgCSAgaWYg KGtpbmRfZXhwcikKKyAJICAgIHsKKyAJICAgICAgZ2ZjX2ZyZWVfZXhwciAo a2luZF9leHByKTsKKyAJICAgICAga2luZF9leHByID0gTlVMTDsKKyAJICAg IH0KKyAJICBjb250aW51ZTsKKyAJfQorIAorICAgICAgIGlmIChhY3R1YWxf cGFyYW0KKyAJICAmJiAoYWN0dWFsX3BhcmFtLT5zcGVjX3R5cGUgPT0gU1BF Q19BU1NVTUVECisgCSAgICAgIHx8IGFjdHVhbF9wYXJhbS0+c3BlY190eXBl ID09IFNQRUNfREVGRVJSRUQpKQorIAl7CisgCSAgZ2ZjX2Vycm9yICgiVGhl IEtJTkQgcGFyYW1ldGVyICclcXMnIGF0ICVDIGNhbm5vdCBlaXRoZXIgYmUg IgorIAkJICAgICAiQVNTVU1FRCBvciBERUZFUlJFRCIsIHBhcmFtLT5uYW1l KTsKKyAJICBnZmNfZnJlZV9hY3R1YWxfYXJnbGlzdCAodHlwZV9wYXJhbV9z cGVjX2xpc3QpOworIAkgIHJldHVybiBNQVRDSF9FUlJPUjsKKyAJfQorIAor ICAgICAgIGlmICgha2luZF9leHByIHx8ICFnZmNfaXNfY29uc3RhbnRfZXhw ciAoa2luZF9leHByKSkKKyAJeworIAkgIGdmY19lcnJvciAoIlRoZSB2YWx1 ZSBmb3IgdGhlIEtJTkQgcGFyYW1ldGVyICclcXMnIGF0ICVDIGRvZXMgbm90 ICIKKyAJCSAgICAgInJlZHVjZSB0byBhIGNvbnN0YW50IGV4cHJlc3Npb24i LCBwYXJhbS0+bmFtZSk7CisgCSAgZ2ZjX2ZyZWVfYWN0dWFsX2FyZ2xpc3Qg KHR5cGVfcGFyYW1fc3BlY19saXN0KTsKKyAJICByZXR1cm4gTUFUQ0hfRVJS T1I7CisgCX0KKyAKKyAgICAgICBnZmNfZXh0cmFjdF9pbnQgKGtpbmRfZXhw ciwgJmtpbmRfdmFsdWUpOworICAgICAgIHNwcmludGYgKG5hbWUsICIlc18l ZCIsIG5hbWUsIGtpbmRfdmFsdWUpOworIAorICAgICAgIGlmICghbmFtZV9z ZWVuICYmIGFjdHVhbF9wYXJhbSkKKyAJYWN0dWFsX3BhcmFtID0gYWN0dWFs X3BhcmFtLT5uZXh0OworICAgICAgIGdmY19mcmVlX2V4cHIgKGtpbmRfZXhw cik7CisgICAgIH0KKyAKKyAgIC8qIE5vdyB3ZSBzZWFyY2ggZm9yIHRoZSBQ RFQgaW5zdGFuY2UgJ25hbWUnLiBJZiBpdCBkb2Vzbid0IGV4aXN0LCB3ZQor ICAgICAgYnVpbGQgaXQsIHVzaW5nICdwZHQnIGFzIGEgdGVtcGxhdGUuICAq LworICAgaWYgKGdmY19nZXRfc3ltYm9sIChuYW1lLCBwZHQtPm5zLCAmaW5z dGFuY2UpKQorICAgICB7CisgICAgICAgZ2ZjX2Vycm9yICgiUGFyYW1ldGVy aXplZCBkZXJpdmVkIHR5cGUgYXQgJUMgaXMgYW1iaWd1b3VzIik7CisgICAg ICAgcmV0dXJuIE1BVENIX0VSUk9SOworICAgICB9CisgCisgICBtID0gTUFU Q0hfWUVTOworIAorICAgaWYgKGluc3RhbmNlLT5hdHRyLmZsYXZvciA9PSBG TF9ERVJJVkVECisgICAgICAgJiYgaW5zdGFuY2UtPmF0dHIucGR0X3R5cGUp CisgICAgIHsKKyAgICAgICBpbnN0YW5jZS0+cmVmcysrOworICAgICAgIGlm IChleHRfcGFyYW1fbGlzdCkKKyAgICAgICAgICpleHRfcGFyYW1fbGlzdCA9 IHR5cGVfcGFyYW1fc3BlY19saXN0OworICAgICAgICpzeW0gPSBpbnN0YW5j ZTsKKyAgICAgICBnZmNfY29tbWl0X3N5bWJvbHMgKCk7CisgICAgICAgcmV0 dXJuIG07CisgICAgIH0KKyAKKyAgIC8qIFN0YXJ0IGJ1aWxkaW5nIHRoZSBu ZXcgaW5zdGFuY2Ugb2YgdGhlIHBhcmFtZXRlcml6ZWQgdHlwZS4gICovCisg ICBnZmNfY29weV9hdHRyICgmaW5zdGFuY2UtPmF0dHIsICZwZHQtPmF0dHIs ICZwZHQtPmRlY2xhcmVkX2F0KTsKKyAgIGluc3RhbmNlLT5hdHRyLnBkdF90 ZW1wbGF0ZSA9IDA7CisgICBpbnN0YW5jZS0+YXR0ci5wZHRfdHlwZSA9IDE7 CisgICBpbnN0YW5jZS0+ZGVjbGFyZWRfYXQgPSBnZmNfY3VycmVudF9sb2N1 czsKKyAKKyAgIC8qIEFkZCB0aGUgY29tcG9uZW50cywgcmVwbGFjaW5nIHRo ZSBwYXJhbWV0ZXJzIGluIGFsbCBleHByZXNzaW9ucworICAgICAgd2l0aCB0 aGUgZXhwcmVzc2lvbnMgZm9yIHRoZWlyIHZhbHVlcyBpbiAndHlwZV9wYXJh bV9zcGVjX2xpc3QnLiAgKi8KKyAgIGMxID0gcGR0LT5jb21wb25lbnRzOwor ICAgdGFpbCA9IHR5cGVfcGFyYW1fc3BlY19saXN0OworICAgZm9yICg7IGMx OyBjMSA9IGMxLT5uZXh0KQorICAgICB7CisgICAgICAgZ2ZjX2FkZF9jb21w b25lbnQgKGluc3RhbmNlLCBjMS0+bmFtZSwgJmMyKTsKKyAgICAgICBjMi0+ dHMgPSBjMS0+dHM7CisgICAgICAgYzItPmF0dHIgPSBjMS0+YXR0cjsKKyAK KyAgICAgICAvKiBEZWFsIHdpdGggdHlwZSBleHRlbnNpb24gYnkgcmVjdXJz aXZlbHkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgCSB0byBvYnRhaW4gdGhl IGluc3RhbmNlIG9mIHRoZSBleHRlbmRlZCB0eXBlLiAgKi8KKyAgICAgICBp ZiAoZ2ZjX2N1cnJlbnRfc3RhdGUgKCkgIT0gQ09NUF9ERVJJVkVECisgCSAg JiYgYzEgPT0gcGR0LT5jb21wb25lbnRzCisgCSAgJiYgKGMxLT50cy50eXBl ID09IEJUX0RFUklWRUQgfHwgYzEtPnRzLnR5cGUgPT0gQlRfQ0xBU1MpCisg CSAgJiYgYzEtPnRzLnUuZGVyaXZlZCAmJiBjMS0+dHMudS5kZXJpdmVkLT5h dHRyLnBkdF90ZW1wbGF0ZQorIAkgICYmIGdmY19nZXRfZGVyaXZlZF9zdXBl cl90eXBlICgqc3ltKSA9PSBjMi0+dHMudS5kZXJpdmVkKQorIAl7CisgCSAg Z2ZjX2Zvcm1hbF9hcmdsaXN0ICpmOworIAorIAkgIG9sZF9wYXJhbV9zcGVj X2xpc3QgPSB0eXBlX3BhcmFtX3NwZWNfbGlzdDsKKyAKKyAJICAvKiBPYnRh aW4gYSBzcGVjIGxpc3QgYXBwcm9wcmlhdGUgdG8gdGhlIGV4dGVuZGVkIHR5 cGUuLiovCisgCSAgYWN0dWFsX3BhcmFtID0gZ2ZjX2NvcHlfYWN0dWFsX2Fy Z2xpc3QgKHR5cGVfcGFyYW1fc3BlY19saXN0KTsKKyAJICB0eXBlX3BhcmFt X3NwZWNfbGlzdCA9IGFjdHVhbF9wYXJhbTsKKyAJICBmb3IgKGYgPSBjMS0+ dHMudS5kZXJpdmVkLT5mb3JtYWw7IGYgJiYgZi0+bmV4dDsgZiA9IGYtPm5l eHQpCisgCSAgICBhY3R1YWxfcGFyYW0gPSBhY3R1YWxfcGFyYW0tPm5leHQ7 CisgCSAgaWYgKGFjdHVhbF9wYXJhbSkKKyAJICAgIHsKKyAJICAgICAgZ2Zj X2ZyZWVfYWN0dWFsX2FyZ2xpc3QgKGFjdHVhbF9wYXJhbS0+bmV4dCk7Cisg CSAgICAgIGFjdHVhbF9wYXJhbS0+bmV4dCA9IE5VTEw7CisgCSAgICB9Cisg CisgCSAgLyogTm93IG9idGFpbiB0aGUgUERUIGluc3RhbmNlIGZvciB0aGUg ZXh0ZW5kZWQgdHlwZS4gICovCisgCSAgYzItPnBhcmFtX2xpc3QgPSB0eXBl X3BhcmFtX3NwZWNfbGlzdDsKKyAJICBtID0gZ2ZjX2dldF9wZHRfaW5zdGFu Y2UgKHR5cGVfcGFyYW1fc3BlY19saXN0LCAmYzItPnRzLnUuZGVyaXZlZCwK KyAJCQkJICAgIE5VTEwpOworIAkgIHR5cGVfcGFyYW1fc3BlY19saXN0ID0g b2xkX3BhcmFtX3NwZWNfbGlzdDsKKyAKKyAJICBjMi0+dHMudS5kZXJpdmVk LT5yZWZzKys7CisgCSAgZ2ZjX3NldF9zeW1fcmVmZXJlbmNlZCAoYzItPnRz LnUuZGVyaXZlZCk7CisgCisgCSAgLyogU2V0IGV4dGVuc2lvbiBsZXZlbC4g ICovCisgCSAgaWYgKGMyLT50cy51LmRlcml2ZWQtPmF0dHIuZXh0ZW5zaW9u ID09IDI1NSkKKyAJICAgIHsKKyAJICAgICAgLyogU2luY2UgdGhlIGV4dGVu c2lvbiBmaWVsZCBpcyA4IGJpdCB3aWRlLCB3ZSBjYW4gb25seSBoYXZlCisg CQkgdXAgdG8gMjU1IGV4dGVuc2lvbiBsZXZlbHMuICAqLworIAkgICAgICBn ZmNfZXJyb3IgKCJNYXhpbXVtIGV4dGVuc2lvbiBsZXZlbCByZWFjaGVkIHdp dGggdHlwZSAlcXMgYXQgJUwiLAorIAkJCSBjMi0+dHMudS5kZXJpdmVkLT5u YW1lLAorIAkJCSAmYzItPnRzLnUuZGVyaXZlZC0+ZGVjbGFyZWRfYXQpOwor IAkgICAgICByZXR1cm4gTUFUQ0hfRVJST1I7CisgCSAgICB9CisgCSAgaW5z dGFuY2UtPmF0dHIuZXh0ZW5zaW9uID0gYzItPnRzLnUuZGVyaXZlZC0+YXR0 ci5leHRlbnNpb24gKyAxOworIAorIAkgIC8qIEFkdmFuY2UgdGhlIHBvc2l0 aW9uIGluIHRoZSBzcGVjIGxpc3QgYnkgdGhlIG51bWJlciBvZgorIAkgICAg IHBhcmFtZXRlcnMgaW4gdGhlIGV4dGVuZGVkIHR5cGUuICAqLworIAkgIHRh aWwgPSB0eXBlX3BhcmFtX3NwZWNfbGlzdDsKKyAJICBmb3IgKGYgPSBjMS0+ dHMudS5kZXJpdmVkLT5mb3JtYWw7IGYgJiYgZi0+bmV4dDsgZiA9IGYtPm5l eHQpCisgCSAgICB0YWlsID0gdGFpbC0+bmV4dDsKKyAKKyAJICBjb250aW51 ZTsKKyAJfQorIAorICAgICAgIC8qIFNldCB0aGUgY29tcG9uZW50IGtpbmQg dXNpbmcgdGhlIHBhcmFtZXRlcml6ZWQgZXhwcmVzc2lvbi4gICovCisgICAg ICAgaWYgKGMxLT50cy5raW5kID09IDAgJiYgYzEtPmtpbmRfZXhwciAhPSBO VUxMKQorIAl7CisgCSAgZ2ZjX2V4cHIgKmUgPSBnZmNfY29weV9leHByIChj MS0+a2luZF9leHByKTsKKyAJICBnZmNfaW5zZXJ0X2tpbmRfcGFyYW1ldGVy X2V4cHJzIChlKTsKKyAJICBnZmNfZXh0cmFjdF9pbnQgKGUsICZjMi0+dHMu a2luZCk7CisgCSAgZ2ZjX2ZyZWVfZXhwciAoZSk7CisgCX0KKyAKKyAgICAg ICAvKiBTaW1pbGFybHksIHNldCB0aGUgc3RyaW5nIGxlbmd0aCBpZiBwYXJh bWV0ZXJpemVkLiAgKi8KKyAgICAgICBpZiAoYzEtPnRzLnR5cGUgPT0gQlRf Q0hBUkFDVEVSCisgCSAgJiYgYzEtPnRzLnUuY2wtPmxlbmd0aAorIAkgICYm IGdmY19kZXJpdmVkX3BhcmFtZXRlcl9leHByIChjMS0+dHMudS5jbC0+bGVu Z3RoKSkKKyAJeworIAkgIGdmY19leHByICplOworIAkgIGUgPSBnZmNfY29w eV9leHByIChjMS0+dHMudS5jbC0+bGVuZ3RoKTsKKyAJICBnZmNfaW5zZXJ0 X2tpbmRfcGFyYW1ldGVyX2V4cHJzIChlKTsKKyAJICBnZmNfc2ltcGxpZnlf ZXhwciAoZSwgMSk7CisgCSAgYzItPnRzLnUuY2wgPSBnZmNfbmV3X2NoYXJs ZW4gKGdmY19jdXJyZW50X25zLCBOVUxMKTsKKyAJICBjMi0+dHMudS5jbC0+ bGVuZ3RoID0gZTsKKyAJICBjMi0+YXR0ci5wZHRfc3RyaW5nID0gMTsKKyAJ fQorIAorICAgICAgIC8qIFNldCB1cCBlaXRoZXIgdGhlIEtJTkQvTEVOIGlu aXRpYWxpemVyLCBpZiBjb25zdGFudCwKKyAJIG9yIHRoZSBwYXJhbWV0ZXJp emVkIGV4cHJlc3Npb24uIFVzZSB0aGUgdGVtcGxhdGUKKyAJIGluaXRpYWxp emVyIGlmIG9uZSBpcyBub3QgYWxyZWFkeSBzZXQgaW4gdGhpcyBpbnN0YW5j ZS4gICovCisgICAgICAgaWYgKGMyLT5hdHRyLnBkdF9raW5kIHx8IGMyLT5h dHRyLnBkdF9sZW4pCisgCXsKKyAJICBpZiAodGFpbCAmJiB0YWlsLT5leHBy ICYmIGdmY19pc19jb25zdGFudF9leHByICh0YWlsLT5leHByKSkKKyAJICAg IGMyLT5pbml0aWFsaXplciA9IGdmY19jb3B5X2V4cHIgKHRhaWwtPmV4cHIp OworIAkgIGVsc2UgaWYgKHRhaWwgJiYgdGFpbC0+ZXhwcikKKyAJICAgIHsK KyAJICAgICAgYzItPnBhcmFtX2xpc3QgPSBnZmNfZ2V0X2FjdHVhbF9hcmds aXN0ICgpOworIAkgICAgICBjMi0+cGFyYW1fbGlzdC0+bmFtZSA9IHRhaWwt Pm5hbWU7CisgCSAgICAgIGMyLT5wYXJhbV9saXN0LT5leHByID0gZ2ZjX2Nv cHlfZXhwciAodGFpbC0+ZXhwcik7CisgCSAgICAgIGMyLT5wYXJhbV9saXN0 LT5uZXh0ID0gTlVMTDsKKyAJICAgIH0KKyAKKyAJICBpZiAoIWMyLT5pbml0 aWFsaXplciAmJiBjMS0+aW5pdGlhbGl6ZXIpCisgCSAgICBjMi0+aW5pdGlh bGl6ZXIgPSBnZmNfY29weV9leHByIChjMS0+aW5pdGlhbGl6ZXIpOworIAor IAkgIHRhaWwgPSB0YWlsLT5uZXh0OworIAl9CisgCisgICAgICAgLyogQ29w eSB0aGUgYXJyYXkgc3BlYy4gICovCisgICAgICAgYzItPmFzID0gZ2ZjX2Nv cHlfYXJyYXlfc3BlYyAoYzEtPmFzKTsKKyAgICAgICBpZiAoYzEtPnRzLnR5 cGUgPT0gQlRfQ0xBU1MpCisgCUNMQVNTX0RBVEEgKGMyKS0+YXMgPSBnZmNf Y29weV9hcnJheV9zcGVjIChDTEFTU19EQVRBIChjMSktPmFzKTsKKyAKKyAg ICAgICAvKiBEZXRlcm1pbmUgaWYgYW4gYXJyYXkgc3BlYyBpcyBwYXJhbWV0 ZXJpemVkLiBJZiBzbywgc3Vic3RpdHV0ZQorIAkgaW4gdGhlIHBhcmFtZXRl ciBleHByZXNzaW9ucyBmb3IgdGhlIGJvdW5kcyBhbmQgc2V0IHRoZSBwZHRf YXJyYXkKKyAJIGF0dHJpYnV0ZS4gTm90aWNlIHRoYXQgdGhpcyBhdHRyaWJ1 dGUgbXVzdCBiZSB1bmNvbmRpdGlvbmFsbHkgc2V0CisgCSBpZiB0aGlzIGlz IGFuIGFycmF5IG9mIHBhcmFtZXRlcml6ZWQgY2hhcmFjdGVyIGxlbmd0aC4g ICovCisgICAgICAgaWYgKGMxLT5hcyAmJiBjMS0+YXMtPnR5cGUgPT0gQVNf RVhQTElDSVQpCisgCXsKKyAJICBib29sIHBkdF9hcnJheSA9IGZhbHNlOwor IAorIAkgIC8qIEFyZSB0aGUgYm91bmRzIG9mIHRoZSBhcnJheSBwYXJhbWV0 ZXJpemVkPyAgKi8KKyAJICBmb3IgKGkgPSAwOyBpIDwgYzEtPmFzLT5yYW5r OyBpKyspCisgCSAgICB7CisgCSAgICAgIGlmIChnZmNfZGVyaXZlZF9wYXJh bWV0ZXJfZXhwciAoYzEtPmFzLT5sb3dlcltpXSkpCisgCQlwZHRfYXJyYXkg PSB0cnVlOworIAkgICAgICBpZiAoZ2ZjX2Rlcml2ZWRfcGFyYW1ldGVyX2V4 cHIgKGMxLT5hcy0+dXBwZXJbaV0pKQorIAkJcGR0X2FycmF5ID0gdHJ1ZTsK KyAJICAgIH0KKyAKKyAJICAvKiBJZiB0aGV5IGFyZSwgZnJlZSB0aGUgZXhw cmVzc2lvbnMgZm9yIHRoZSBib3VuZHMgYW5kCisgCSAgICAgcmVwbGFjZSB0 aGVtIHdpdGggdGhlIHRlbXBsYXRlIGV4cHJlc3Npb25zIHdpdGggc3Vic3Rp dHV0ZQorIAkgICAgIHZhbHVlcy4gICovCisgCSAgZm9yIChpID0gMDsgcGR0 X2FycmF5ICYmIGkgPCBjMS0+YXMtPnJhbms7IGkrKykKKyAJICAgIHsKKyAJ ICAgICAgZ2ZjX2V4cHIgKmU7CisgCSAgICAgIGUgPSBnZmNfY29weV9leHBy IChjMS0+YXMtPmxvd2VyW2ldKTsKKyAJICAgICAgZ2ZjX2luc2VydF9raW5k X3BhcmFtZXRlcl9leHBycyAoZSk7CisgCSAgICAgIGdmY19zaW1wbGlmeV9l eHByIChlLCAxKTsKKyAJICAgICAgZ2ZjX2ZyZWVfZXhwciAoYzItPmFzLT5s b3dlcltpXSk7CisgCSAgICAgIGMyLT5hcy0+bG93ZXJbaV0gPSBlOworIAkg ICAgICBlID0gZ2ZjX2NvcHlfZXhwciAoYzEtPmFzLT51cHBlcltpXSk7Cisg CSAgICAgIGdmY19pbnNlcnRfa2luZF9wYXJhbWV0ZXJfZXhwcnMgKGUpOwor IAkgICAgICBnZmNfc2ltcGxpZnlfZXhwciAoZSwgMSk7CisgCSAgICAgIGdm Y19mcmVlX2V4cHIgKGMyLT5hcy0+dXBwZXJbaV0pOworIAkgICAgICBjMi0+ YXMtPnVwcGVyW2ldID0gZTsKKyAJICAgIH0KKyAJICBjMi0+YXR0ci5wZHRf YXJyYXkgPSBwZHRfYXJyYXkgPyAxIDogYzItPmF0dHIucGR0X3N0cmluZzsK KyAJfQorIAorICAgICAgIC8qIFJlY3Vyc2UgaW50byB0aGlzIGZ1bmN0aW9u IGZvciBQRFQgY29tcG9uZW50cy4gICovCisgICAgICAgaWYgKChjMS0+dHMu dHlwZSA9PSBCVF9ERVJJVkVEIHx8IGMxLT50cy50eXBlID09IEJUX0NMQVNT KQorIAkgICYmIGMxLT50cy51LmRlcml2ZWQgJiYgYzEtPnRzLnUuZGVyaXZl ZC0+YXR0ci5wZHRfdGVtcGxhdGUpCisgCXsKKyAJICBnZmNfYWN0dWFsX2Fy Z2xpc3QgKnBhcmFtczsKKyAJICAvKiBUaGUgY29tcG9uZW50IGluIHRoZSB0 ZW1wbGF0ZSBoYXMgYSBsaXN0IG9mIHNwZWNpZmljYXRpb24KKyAJICAgICBl eHByZXNzaW9ucyBkZXJpdmVkIGZyb20gaXRzIGRlY2xhcmF0aW9uLiAgKi8K KyAJICBwYXJhbXMgPSBnZmNfY29weV9hY3R1YWxfYXJnbGlzdCAoYzEtPnBh cmFtX2xpc3QpOworIAkgIGFjdHVhbF9wYXJhbSA9IHBhcmFtczsKKyAJICAv KiBTdWJzdGl0dXRlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGggdGhl IGV4cHJlc3Npb25zCisgCSAgICAgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBs aXN0LiAgKi8KKyAJICBmb3IgKDthY3R1YWxfcGFyYW07IGFjdHVhbF9wYXJh bSA9IGFjdHVhbF9wYXJhbS0+bmV4dCkKKyAJICAgIGdmY19pbnNlcnRfcGFy YW1ldGVyX2V4cHJzIChhY3R1YWxfcGFyYW0tPmV4cHIsCisgCQkJCQl0eXBl X3BhcmFtX3NwZWNfbGlzdCk7CisgCisgCSAgLyogTm93IG9idGFpbiB0aGUg UERUIGluc3RhbmNlIGZvciB0aGUgY29tcG9uZW50LiAgKi8KKyAJICBvbGRf cGFyYW1fc3BlY19saXN0ID0gdHlwZV9wYXJhbV9zcGVjX2xpc3Q7CisgCSAg bSA9IGdmY19nZXRfcGR0X2luc3RhbmNlIChwYXJhbXMsICZjMi0+dHMudS5k ZXJpdmVkLCBOVUxMKTsKKyAJICB0eXBlX3BhcmFtX3NwZWNfbGlzdCA9IG9s ZF9wYXJhbV9zcGVjX2xpc3Q7CisgCisgCSAgYzItPnBhcmFtX2xpc3QgPSBw YXJhbXM7CisgCSAgYzItPmluaXRpYWxpemVyID0gZ2ZjX2RlZmF1bHRfaW5p dGlhbGl6ZXIgKCZjMi0+dHMpOworIAl9CisgICAgIH0KKyAKKyAgIGdmY19j b21taXRfc3ltYm9sIChpbnN0YW5jZSk7CisgICBpZiAoZXh0X3BhcmFtX2xp c3QpCisgICAgICpleHRfcGFyYW1fbGlzdCA9IHR5cGVfcGFyYW1fc3BlY19s aXN0OworICAgKnN5bSA9IGluc3RhbmNlOworICAgcmV0dXJuIG07CisgfQor IAorIAogIC8qIE1hdGNoZXMgYSBkZWNsYXJhdGlvbi10eXBlLXNwZWMgKEYw MzpSNTAyKS4gIElmIHN1Y2Nlc3NmdWwsIHNldHMgdGhlIHRzCiAgICAgc3Ry dWN0dXJlIHRvIHRoZSBtYXRjaGVkIHNwZWNpZmljYXRpb24uICBUaGlzIGlz IG5lY2Vzc2FyeSBmb3IgRlVOQ1RJT04gYW5kCiAgICAgSU1QTElDSVQgc3Rh dGVtZW50cy4KKioqKioqKioqKioqKioqIGdmY19tYXRjaF9kZWNsX3R5cGVf c3BlYyAoZ2ZjX3R5cGVzcGVjICoKKioqIDMwNDgsMzA1MyAqKioqCi0tLSAz NTIwLDM1MjcgLS0tLQogICAgYm9vbCBzZWVuX2RlZmVycmVkX2tpbmQsIG1h dGNoZWRfdHlwZTsKICAgIGNvbnN0IGNoYXIgKmR0X25hbWU7CiAgCisgICBk ZWNsX3R5cGVfcGFyYW1fbGlzdCA9IE5VTEw7CisgCiAgICAvKiBBIGJlbHQg YW5kIGJyYWNlcyBjaGVjayB0aGF0IHRoZSB0eXBlc3BlYyBpcyBjb3JyZWN0 bHkgYmVpbmcgdHJlYXRlZAogICAgICAgYXMgYSBkZWZlcnJlZCBjaGFyYWN0 ZXJpc3RpYyBhc3NvY2lhdGlvbi4gICovCiAgICBzZWVuX2RlZmVycmVkX2tp bmQgPSAoZ2ZjX2N1cnJlbnRfc3RhdGUgKCkgPT0gQ09NUF9GVU5DVElPTikK KioqKioqKioqKioqKioqIGdmY19tYXRjaF9kZWNsX3R5cGVfc3BlYyAoZ2Zj X3R5cGVzcGVjICoKKioqIDMxOTYsMzIwMiAqKioqCi0tLSAzNjcwLDM2ODIg LS0tLQogICAgICB9CiAgCiAgICBpZiAobWF0Y2hlZF90eXBlKQorICAgICB7 CisgICAgICAgbSA9IGdmY19tYXRjaF9hY3R1YWxfYXJnbGlzdCAoMSwgJmRl Y2xfdHlwZV9wYXJhbV9saXN0LCB0cnVlKTsKKyAgICAgICBpZiAobSA9PSBN QVRDSF9FUlJPUikKKyAJcmV0dXJuIG07CisgCiAgICAgIG0gPSBnZmNfbWF0 Y2hfY2hhciAoJyknKTsKKyAgICAgfQogIAogICAgaWYgKG0gIT0gTUFUQ0hf WUVTKQogICAgICBtID0gbWF0Y2hfcmVjb3JkX2RlY2wgKG5hbWUpOwoqKioq KioqKioqKioqKiogZ2ZjX21hdGNoX2RlY2xfdHlwZV9zcGVjIChnZmNfdHlw ZXNwZWMgKgoqKiogMzIxMSwzMjE2ICoqKioKLS0tIDM2OTEsMzcwOSAtLS0t CiAgICAgICAgICAgIGdmY19lcnJvciAoIlR5cGUgbmFtZSAlcXMgYXQgJUMg aXMgYW1iaWd1b3VzIiwgbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBNQVRD SF9FUlJPUjsKICAgICAgICAgIH0KKyAKKyAgICAgICBpZiAoc3ltICYmIHN5 bS0+YXR0ci5mbGF2b3IgPT0gRkxfREVSSVZFRAorIAkgICYmIHN5bS0+YXR0 ci5wZHRfdGVtcGxhdGUKKyAJICAmJiBnZmNfY3VycmVudF9zdGF0ZSAoKSAh PSBDT01QX0RFUklWRUQpCisgCXsKKyAJICBtID0gZ2ZjX2dldF9wZHRfaW5z dGFuY2UgKGRlY2xfdHlwZV9wYXJhbV9saXN0LCAmc3ltLCAgTlVMTCk7Cisg CSAgaWYgKG0gIT0gTUFUQ0hfWUVTKQorIAkgICAgcmV0dXJuIG07CisgCSAg Z2NjX2Fzc2VydCAoIXN5bS0+YXR0ci5wZHRfdGVtcGxhdGUgJiYgc3ltLT5h dHRyLnBkdF90eXBlKTsKKyAJICB0cy0+dS5kZXJpdmVkID0gc3ltOworIAkg IHN0cmNweSAobmFtZSwgZ2ZjX2R0X2xvd2VyX3N0cmluZyAoc3ltLT5uYW1l KSk7CisgCX0KKyAKICAgICAgICBpZiAoc3ltICYmIHN5bS0+YXR0ci5mbGF2 b3IgPT0gRkxfU1RSVUNUKQogICAgICAgICAgewogICAgICAgICAgICB0cy0+ dS5kZXJpdmVkID0gc3ltOwoqKioqKioqKioqKioqKiogZ2ZjX21hdGNoX2Rl Y2xfdHlwZV9zcGVjIChnZmNfdHlwZXNwZWMgKgoqKiogMzI3OSwzMjkxICoq KioKICAJICByZXR1cm4gbTsKICAJfQogIAohICAgICAgIG0gPSBnZmNfbWF0 Y2ggKCIgY2xhc3MgKCAlbiApIiwgbmFtZSk7CiAgICAgICAgaWYgKG0gIT0g TUFUQ0hfWUVTKQogIAlyZXR1cm4gbTsKICAgICAgICB0cy0+dHlwZSA9IEJU X0NMQVNTOwogIAogICAgICAgIGlmICghZ2ZjX25vdGlmeV9zdGQgKEdGQ19T VERfRjIwMDMsICJDTEFTUyBzdGF0ZW1lbnQgYXQgJUMiKSkKICAJcmV0dXJu IE1BVENIX0VSUk9SOwogICAgICB9CiAgCiAgICAvKiBEZWZlciBhc3NvY2lh dGlvbiBvZiB0aGUgZGVyaXZlZCB0eXBlIHVudGlsIHRoZSBlbmQgb2YgdGhl Ci0tLSAzNzcyLDM3OTggLS0tLQogIAkgIHJldHVybiBtOwogIAl9CiAgCiEg ICAgICAgbSA9IGdmY19tYXRjaCAoIiBjbGFzcyAoIik7CiEgCiEgICAgICAg aWYgKG0gPT0gTUFUQ0hfWUVTKQohIAltID0gZ2ZjX21hdGNoICgiJW4iLCBu YW1lKTsKISAgICAgICBlbHNlCiEgCXJldHVybiBtOwohIAogICAgICAgIGlm IChtICE9IE1BVENIX1lFUykKICAJcmV0dXJuIG07CiAgICAgICAgdHMtPnR5 cGUgPSBCVF9DTEFTUzsKICAKICAgICAgICBpZiAoIWdmY19ub3RpZnlfc3Rk IChHRkNfU1REX0YyMDAzLCAiQ0xBU1Mgc3RhdGVtZW50IGF0ICVDIikpCiAg CXJldHVybiBNQVRDSF9FUlJPUjsKKyAKKyAgICAgICBtID0gZ2ZjX21hdGNo X2FjdHVhbF9hcmdsaXN0ICgxLCAmZGVjbF90eXBlX3BhcmFtX2xpc3QsIHRy dWUpOworICAgICAgIGlmIChtID09IE1BVENIX0VSUk9SKQorIAlyZXR1cm4g bTsKKyAKKyAgICAgICBtID0gZ2ZjX21hdGNoX2NoYXIgKCcpJyk7CisgICAg ICAgaWYgKG0gIT0gTUFUQ0hfWUVTKQorIAlyZXR1cm4gbTsKICAgICAgfQog IAogICAgLyogRGVmZXIgYXNzb2NpYXRpb24gb2YgdGhlIGRlcml2ZWQgdHlw ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZQoqKioqKioqKioqKioqKiogZ2ZjX21h dGNoX2RlY2xfdHlwZV9zcGVjIChnZmNfdHlwZXNwZWMgKgoqKiogMzM1MSwz MzU2ICoqKioKLS0tIDM4NTgsMzg3NSAtLS0tCiAgICAgICAgcmV0dXJuIE1B VENIX0VSUk9SOwogICAgICB9CiAgCisgICBpZiAoc3ltICYmIHN5bS0+YXR0 ci5mbGF2b3IgPT0gRkxfREVSSVZFRAorICAgICAgICYmIHN5bS0+YXR0ci5w ZHRfdGVtcGxhdGUKKyAgICAgICAmJiBnZmNfY3VycmVudF9zdGF0ZSAoKSAh PSBDT01QX0RFUklWRUQpCisgCXsKKyAJICBtID0gZ2ZjX2dldF9wZHRfaW5z dGFuY2UgKGRlY2xfdHlwZV9wYXJhbV9saXN0LCAmc3ltLCBOVUxMKTsKKyAJ ICBpZiAobSAhPSBNQVRDSF9ZRVMpCisgCSAgICByZXR1cm4gbTsKKyAJICBn Y2NfYXNzZXJ0ICghc3ltLT5hdHRyLnBkdF90ZW1wbGF0ZSAmJiBzeW0tPmF0 dHIucGR0X3R5cGUpOworIAkgIHRzLT51LmRlcml2ZWQgPSBzeW07CisgCSAg c3RyY3B5IChuYW1lLCBnZmNfZHRfbG93ZXJfc3RyaW5nIChzeW0tPm5hbWUp KTsKKyAJfQorIAogICAgZ2ZjX3NhdmVfc3ltYm9sX2RhdGEgKHN5bSk7CiAg ICBnZmNfc2V0X3N5bV9yZWZlcmVuY2VkIChzeW0pOwogICAgaWYgKCFzeW0t PmF0dHIuZ2VuZXJpYwoqKioqKioqKioqKioqKiogZ2ZjX21hdGNoX2RlY2xf dHlwZV9zcGVjIChnZmNfdHlwZXNwZWMgKgoqKiogMzM2MSwzMzY2ICoqKioK LS0tIDM4ODAsMzg5NSAtLS0tCiAgICAgICAgJiYgIWdmY19hZGRfZnVuY3Rp b24gKCZzeW0tPmF0dHIsIHN5bS0+bmFtZSwgTlVMTCkpCiAgICAgIHJldHVy biBNQVRDSF9FUlJPUjsKICAKKyAgIGlmIChkdF9zeW0gJiYgZHRfc3ltLT5h dHRyLmZsYXZvciA9PSBGTF9ERVJJVkVECisgICAgICAgJiYgZHRfc3ltLT5h dHRyLnBkdF90ZW1wbGF0ZQorICAgICAgICYmIGdmY19jdXJyZW50X3N0YXRl ICgpICE9IENPTVBfREVSSVZFRCkKKyAgICAgeworICAgICAgIG0gPSBnZmNf Z2V0X3BkdF9pbnN0YW5jZSAoZGVjbF90eXBlX3BhcmFtX2xpc3QsICZkdF9z eW0sIE5VTEwpOworICAgICAgIGlmIChtICE9IE1BVENIX1lFUykKKyAJcmV0 dXJuIG07CisgICAgICAgZ2NjX2Fzc2VydCAoIWR0X3N5bS0+YXR0ci5wZHRf dGVtcGxhdGUgJiYgZHRfc3ltLT5hdHRyLnBkdF90eXBlKTsKKyAgICAgfQor IAogICAgaWYgKCFkdF9zeW0pCiAgICAgIHsKICAgICAgICBnZmNfaW50ZXJm YWNlICppbnRyLCAqaGVhZDsKKioqKioqKioqKioqKioqIG1hdGNoX2F0dHJf c3BlYyAodm9pZCkKKioqIDM4OTAsMzg5NiAqKioqCiAgICAgIERFQ0xfU1RB VElDLCBERUNMX0FVVE9NQVRJQywKICAgICAgREVDTF9QVUJMSUMsIERFQ0xf U0FWRSwgREVDTF9UQVJHRVQsIERFQ0xfVkFMVUUsIERFQ0xfVk9MQVRJTEUs CiAgICAgIERFQ0xfSVNfQklORF9DLCBERUNMX0NPRElNRU5TSU9OLCBERUNM X0FTWU5DSFJPTk9VUywgREVDTF9DT05USUdVT1VTLAohICAgICBERUNMX05P TkUsIEdGQ19ERUNMX0VORCAvKiBTZW50aW5lbCAqLwogICAgfTsKICAKICAv KiBHRkNfREVDTF9FTkQgaXMgdGhlIHNlbnRpbmVsLCBpbmRleCBzdGFydHMg YXQgMC4gICovCi0tLSA0NDE5LDQ0MjUgLS0tLQogICAgICBERUNMX1NUQVRJ QywgREVDTF9BVVRPTUFUSUMsCiAgICAgIERFQ0xfUFVCTElDLCBERUNMX1NB VkUsIERFQ0xfVEFSR0VULCBERUNMX1ZBTFVFLCBERUNMX1ZPTEFUSUxFLAog ICAgICBERUNMX0lTX0JJTkRfQywgREVDTF9DT0RJTUVOU0lPTiwgREVDTF9B U1lOQ0hST05PVVMsIERFQ0xfQ09OVElHVU9VUywKISAgICAgREVDTF9MRU4s IERFQ0xfS0lORCwgREVDTF9OT05FLCBHRkNfREVDTF9FTkQgLyogU2VudGlu ZWwgKi8KICAgIH07CiAgCiAgLyogR0ZDX0RFQ0xfRU5EIGlzIHRoZSBzZW50 aW5lbCwgaW5kZXggc3RhcnRzIGF0IDAuICAqLwoqKioqKioqKioqKioqKiog bWF0Y2hfYXR0cl9zcGVjICh2b2lkKQoqKiogNDAzMyw0MDM4ICoqKioKLS0t IDQ1NjIsNDU3NyAtLS0tCiAgCQl9CiAgCSAgICAgIGJyZWFrOwogIAorIAkg ICAgY2FzZSAnayc6CisgCSAgICAgIGlmIChtYXRjaF9zdHJpbmdfcCAoImtp bmQiKSkKKyAJCWQgPSBERUNMX0tJTkQ7CisgCSAgICAgIGJyZWFrOworIAor IAkgICAgY2FzZSAnbCc6CisgCSAgICAgIGlmIChtYXRjaF9zdHJpbmdfcCAo ImxlbiIpKQorIAkJZCA9IERFQ0xfTEVOOworIAkgICAgICBicmVhazsKKyAK ICAJICAgIGNhc2UgJ28nOgogIAkgICAgICBpZiAobWF0Y2hfc3RyaW5nX3Ag KCJvcHRpb25hbCIpKQogIAkJZCA9IERFQ0xfT1BUSU9OQUw7CioqKioqKioq KioqKioqKiBtYXRjaF9hdHRyX3NwZWMgKHZvaWQpCioqKiA0MjI2LDQyMzEg KioqKgotLS0gNDc2NSw0Nzc2IC0tLS0KICAJICBjYXNlIERFQ0xfT1BUSU9O QUw6CiAgCSAgICBhdHRyID0gIk9QVElPTkFMIjsKICAJICAgIGJyZWFrOwor IAkgIGNhc2UgREVDTF9LSU5EOgorIAkgICAgYXR0ciA9ICJLSU5EIjsKKyAJ ICAgIGJyZWFrOworIAkgIGNhc2UgREVDTF9MRU46CisgCSAgICBhdHRyID0g IkxFTiI7CisgCSAgICBicmVhazsKICAJICBjYXNlIERFQ0xfUEFSQU1FVEVS OgogIAkgICAgYXR0ciA9ICJQQVJBTUVURVIiOwogIAkgICAgYnJlYWs7Cioq KioqKioqKioqKioqKiBtYXRjaF9hdHRyX3NwZWMgKHZvaWQpCioqKiA0MzA3 LDQzMTIgKioqKgotLS0gNDg1Miw0OTA1IC0tLS0KICAJCSAgZ290byBjbGVh bnVwOwogIAkJfQogIAkgICAgfQorIAkgIGVsc2UgaWYgKGQgPT0gREVDTF9L SU5EKQorIAkgICAgeworIAkgICAgICBpZiAoIWdmY19ub3RpZnlfc3RkIChH RkNfU1REX0YyMDAzLCAiS0lORCAiCisgCQkJCSAgICJhdHRyaWJ1dGUgYXQg JUMgaW4gYSBUWVBFIGRlZmluaXRpb24iKSkKKyAJCXsKKyAJCSAgbSA9IE1B VENIX0VSUk9SOworIAkJICBnb3RvIGNsZWFudXA7CisgCQl9CisgCSAgICAg IGlmIChjdXJyZW50X3RzLnR5cGUgIT0gQlRfSU5URUdFUikKKyAJCXsKKyAJ CSAgZ2ZjX2Vycm9yICgiQ29tcG9uZW50IHdpdGggS0lORCBhdHRyaWJ1dGUg YXQgJUMgbXVzdCBiZSAiCisgCQkJICAgICAiSU5URUdFUiIpOworIAkJICBt ID0gTUFUQ0hfRVJST1I7CisgCQkgIGdvdG8gY2xlYW51cDsKKyAJCX0KKyAJ ICAgICAgaWYgKGN1cnJlbnRfdHMua2luZCAhPSBnZmNfZGVmYXVsdF9pbnRl Z2VyX2tpbmQpCisgCQl7CisgCQkgIGdmY19lcnJvciAoIkNvbXBvbmVudCB3 aXRoIEtJTkQgYXR0cmlidXRlIGF0ICVDIG11c3QgYmUgIgorIAkJCSAgICAg ImRlZmF1bHQgaW50ZWdlciBraW5kICglZCkiLAorIAkJCSAgICAgIGdmY19k ZWZhdWx0X2ludGVnZXJfa2luZCk7CisgCQkgIG0gPSBNQVRDSF9FUlJPUjsK KyAJCSAgZ290byBjbGVhbnVwOworIAkJfQorIAkgICAgfQorIAkgIGVsc2Ug aWYgKGQgPT0gREVDTF9MRU4pCisgCSAgICB7CisgCSAgICAgIGlmICghZ2Zj X25vdGlmeV9zdGQgKEdGQ19TVERfRjIwMDMsICJMRU4gIgorIAkJCQkgICAi YXR0cmlidXRlIGF0ICVDIGluIGEgVFlQRSBkZWZpbml0aW9uIikpCisgCQl7 CisgCQkgIG0gPSBNQVRDSF9FUlJPUjsKKyAJCSAgZ290byBjbGVhbnVwOwor IAkJfQorIAkgICAgICBpZiAoY3VycmVudF90cy50eXBlICE9IEJUX0lOVEVH RVIpCisgCQl7CisgCQkgIGdmY19lcnJvciAoIkNvbXBvbmVudCB3aXRoIExF TiBhdHRyaWJ1dGUgYXQgJUMgbXVzdCBiZSAiCisgCQkJICAgICAiSU5URUdF UiIpOworIAkJICBtID0gTUFUQ0hfRVJST1I7CisgCQkgIGdvdG8gY2xlYW51 cDsKKyAJCX0KKyAJICAgICAgaWYgKGN1cnJlbnRfdHMua2luZCAhPSBnZmNf ZGVmYXVsdF9pbnRlZ2VyX2tpbmQpCisgCQl7CisgCQkgIGdmY19lcnJvciAo IkNvbXBvbmVudCB3aXRoIExFTiBhdHRyaWJ1dGUgYXQgJUMgbXVzdCBiZSAi CisgCQkJICAgICAiZGVmYXVsdCBpbnRlZ2VyIGtpbmQgKCVkKSIsCisgCQkJ ICAgICAgZ2ZjX2RlZmF1bHRfaW50ZWdlcl9raW5kKTsKKyAJCSAgbSA9IE1B VENIX0VSUk9SOworIAkJICBnb3RvIGNsZWFudXA7CisgCQl9CisgCSAgICB9 CiAgCSAgZWxzZQogIAkgICAgewogIAkgICAgICBnZmNfZXJyb3IgKCJBdHRy aWJ1dGUgYXQgJUwgaXMgbm90IGFsbG93ZWQgaW4gYSBUWVBFIGRlZmluaXRp b24iLAoqKioqKioqKioqKioqKiogbWF0Y2hfYXR0cl9zcGVjICh2b2lkKQoq KiogNDM0NCw0MzQ5ICoqKioKLS0tIDQ5MzcsNDk1MSAtLS0tCiAgCSAgICB9 CiAgCX0KICAKKyAgICAgICBpZiAoZ2ZjX2N1cnJlbnRfc3RhdGUgKCkgIT0g Q09NUF9ERVJJVkVECisgCSAgJiYgKGQgPT0gREVDTF9LSU5EIHx8IGQgPT0g REVDTF9MRU4pKQorIAl7CisgCSAgZ2ZjX2Vycm9yICgiQXR0cmlidXRlIGF0 ICVMIGlzIG5vdCBhbGxvd2VkIG91dHNpZGUgYSBUWVBFICIKKyAJCSAgICAg ImRlZmluaXRpb24iLCAmc2Vlbl9hdFtkXSk7CisgCSAgbSA9IE1BVENIX0VS Uk9SOworIAkgIGdvdG8gY2xlYW51cDsKKyAJfQorIAogICAgICAgIHN3aXRj aCAoZCkKICAJewogIAljYXNlIERFQ0xfQUxMT0NBVEFCTEU6CioqKioqKioq KioqKioqKiBtYXRjaF9hdHRyX3NwZWMgKHZvaWQpCioqKiA0Mzk2LDQ0MDEg KioqKgotLS0gNDk5OCw1MDExIC0tLS0KICAJICB0ID0gZ2ZjX2FkZF9vcHRp b25hbCAoJmN1cnJlbnRfYXR0ciwgJnNlZW5fYXRbZF0pOwogIAkgIGJyZWFr OwogIAorIAljYXNlIERFQ0xfS0lORDoKKyAJICB0ID0gZ2ZjX2FkZF9raW5k ICgmY3VycmVudF9hdHRyLCAmc2Vlbl9hdFtkXSk7CisgCSAgYnJlYWs7Cisg CisgCWNhc2UgREVDTF9MRU46CisgCSAgdCA9IGdmY19hZGRfbGVuICgmY3Vy cmVudF9hdHRyLCAmc2Vlbl9hdFtkXSk7CisgCSAgYnJlYWs7CisgCiAgCWNh c2UgREVDTF9QQVJBTUVURVI6CiAgCSAgdCA9IGdmY19hZGRfZmxhdm9yICgm Y3VycmVudF9hdHRyLCBGTF9QQVJBTUVURVIsIE5VTEwsICZzZWVuX2F0W2Rd KTsKICAJICBicmVhazsKKioqKioqKioqKioqKioqIGdmY19tYXRjaF9kYXRh X2RlY2wgKHZvaWQpCioqKiA0ODg2LDQ4OTEgKioqKgotLS0gNTQ5Niw1NTA0 IC0tLS0KICAgIG1hdGNoIG07CiAgICBpbnQgZWxlbTsKICAKKyAgIHR5cGVf cGFyYW1fc3BlY19saXN0ID0gTlVMTDsKKyAgIGRlY2xfdHlwZV9wYXJhbV9s aXN0ID0gTlVMTDsKKyAKICAgIG51bV9pZGVudHNfb25fbGluZSA9IDA7CiAg CiAgICBtID0gZ2ZjX21hdGNoX2RlY2xfdHlwZV9zcGVjICgmY3VycmVudF90 cywgMCk7CioqKioqKioqKioqKioqKiBvazoKKioqIDUwMDAsNTAwNSAqKioq Ci0tLSA1NjEzLDU2MjUgLS0tLQogICAgZ2ZjX2ZyZWVfZGF0YV9hbGwgKGdm Y19jdXJyZW50X25zKTsKICAKICBjbGVhbnVwOgorICAgaWYgKHNhdmVkX2tp bmRfZXhwcikKKyAgICAgZ2ZjX2ZyZWVfZXhwciAoc2F2ZWRfa2luZF9leHBy KTsKKyAgIGlmICh0eXBlX3BhcmFtX3NwZWNfbGlzdCkKKyAgICAgZ2ZjX2Zy ZWVfYWN0dWFsX2FyZ2xpc3QgKHR5cGVfcGFyYW1fc3BlY19saXN0KTsKKyAg IGlmIChkZWNsX3R5cGVfcGFyYW1fbGlzdCkKKyAgICAgZ2ZjX2ZyZWVfYWN0 dWFsX2FyZ2xpc3QgKGRlY2xfdHlwZV9wYXJhbV9saXN0KTsKKyAgIHNhdmVk X2tpbmRfZXhwciA9IE5VTEw7CiAgICBnZmNfZnJlZV9hcnJheV9zcGVjIChj dXJyZW50X2FzKTsKICAgIGN1cnJlbnRfYXMgPSBOVUxMOwogICAgcmV0dXJu IG07CioqKioqKioqKioqKioqKiBjb3B5X3ByZWZpeCAoc3ltYm9sX2F0dHJp YnV0ZSAqZGVzdCwgbG9jCioqKiA1MTczLDUxODIgKioqKgogIH0KICAKICAK ISAvKiBNYXRjaCBhIGZvcm1hbCBhcmd1bWVudCBsaXN0LiAgKi8KICAKICBt YXRjaAohIGdmY19tYXRjaF9mb3JtYWxfYXJnbGlzdCAoZ2ZjX3N5bWJvbCAq cHJvZ25hbWUsIGludCBzdF9mbGFnLCBpbnQgbnVsbF9mbGFnKQogIHsKICAg IGdmY19mb3JtYWxfYXJnbGlzdCAqaGVhZCwgKnRhaWwsICpwLCAqcTsKICAg IGNoYXIgbmFtZVtHRkNfTUFYX1NZTUJPTF9MRU4gKyAxXTsKLS0tIDU3OTMs NTgwNCAtLS0tCiAgfQogIAogIAohIC8qIE1hdGNoIGEgZm9ybWFsIGFyZ3Vt ZW50IGxpc3Qgb3IsIGlmIHR5cGVwYXJhbSBpcyB0cnVlLCBhCiEgICAgdHlw ZV9wYXJhbV9uYW1lX2xpc3QuICAqLwogIAogIG1hdGNoCiEgZ2ZjX21hdGNo X2Zvcm1hbF9hcmdsaXN0IChnZmNfc3ltYm9sICpwcm9nbmFtZSwgaW50IHN0 X2ZsYWcsCiEgCQkJICBpbnQgbnVsbF9mbGFnLCBib29sIHR5cGVwYXJhbSkK ICB7CiAgICBnZmNfZm9ybWFsX2FyZ2xpc3QgKmhlYWQsICp0YWlsLCAqcCwg KnE7CiAgICBjaGFyIG5hbWVbR0ZDX01BWF9TWU1CT0xfTEVOICsgMV07Cioq KioqKioqKioqKioqKiBnZmNfbWF0Y2hfZm9ybWFsX2FyZ2xpc3QgKGdmY19z eW1ib2wgKnByCioqKiA1MjI4LDUyMzQgKioqKgogIAkgIGlmIChtICE9IE1B VENIX1lFUykKICAJICAgIGdvdG8gY2xlYW51cDsKICAKISAJICBpZiAoZ2Zj X2dldF9zeW1ib2wgKG5hbWUsIE5VTEwsICZzeW0pKQogIAkgICAgZ290byBj bGVhbnVwOwogIAl9CiAgCi0tLSA1ODUwLDU4NTkgLS0tLQogIAkgIGlmICht ICE9IE1BVENIX1lFUykKICAJICAgIGdvdG8gY2xlYW51cDsKICAKISAJICBp ZiAoIXR5cGVwYXJhbSAmJiBnZmNfZ2V0X3N5bWJvbCAobmFtZSwgTlVMTCwg JnN5bSkpCiEgCSAgICBnb3RvIGNsZWFudXA7CiEgCSAgZWxzZSBpZiAodHlw ZXBhcmFtCiEgCQkgICAmJiBnZmNfZ2V0X3N5bWJvbCAobmFtZSwgcHJvZ25h bWUtPmYya19kZXJpdmVkLCAmc3ltKSkKICAJICAgIGdvdG8gY2xlYW51cDsK ICAJfQogIAoqKioqKioqKioqKioqKiogZ2ZjX21hdGNoX2Rlcml2ZWRfZGVj bCAodm9pZCkKKioqIDg5NDUsODk1MCAqKioqCi0tLSA5NTcwLDk1NzcgLS0t LQogICAgbWF0Y2ggaXNfdHlwZV9hdHRyX3NwZWMgPSBNQVRDSF9OTzsKICAg IGJvb2wgc2Vlbl9hdHRyID0gZmFsc2U7CiAgICBnZmNfaW50ZXJmYWNlICpp bnRyID0gTlVMTCwgKmhlYWQ7CisgICBib29sIHBhcmFtZXRlcml6ZWRfdHlw ZSA9IGZhbHNlOworICAgYm9vbCBzZWVuX2NvbG9ucyA9IGZhbHNlOwogIAog ICAgaWYgKGdmY19jb21wX3N0cnVjdCAoZ2ZjX2N1cnJlbnRfc3RhdGUgKCkp KQogICAgICByZXR1cm4gTUFUQ0hfTk87CioqKioqKioqKioqKioqKiBnZmNf bWF0Y2hfZGVyaXZlZF9kZWNsICh2b2lkKQoqKiogODk3Miw4OTg3ICoqKioK ICAgIGlmIChwYXJlbnRbMF0gJiYgIWV4dGVuZGVkKQogICAgICByZXR1cm4g TUFUQ0hfRVJST1I7CiAgCiEgICBpZiAoZ2ZjX21hdGNoICgiIDo6IikgIT0g TUFUQ0hfWUVTICYmIHNlZW5fYXR0cikKICAgICAgewogICAgICAgIGdmY19l cnJvciAoIkV4cGVjdGVkIDo6IGluIFRZUEUgZGVmaW5pdGlvbiBhdCAlQyIp OwogICAgICAgIHJldHVybiBNQVRDSF9FUlJPUjsKICAgICAgfQogIAohICAg bSA9IGdmY19tYXRjaCAoIiAlbiV0IiwgbmFtZSk7CiAgICBpZiAobSAhPSBN QVRDSF9ZRVMpCiAgICAgIHJldHVybiBtOwogIAogICAgLyogTWFrZSBzdXJl IHRoZSBuYW1lIGlzIG5vdCB0aGUgbmFtZSBvZiBhbiBpbnRyaW5zaWMgdHlw ZS4gICovCiAgICBpZiAoZ2ZjX2lzX2ludHJpbnNpY190eXBlbmFtZSAobmFt ZSkpCiAgICAgIHsKLS0tIDk1OTksOTYzNiAtLS0tCiAgICBpZiAocGFyZW50 WzBdICYmICFleHRlbmRlZCkKICAgICAgcmV0dXJuIE1BVENIX0VSUk9SOwog IAohICAgbSA9IGdmY19tYXRjaCAoIiA6OiIpOwohICAgaWYgKG0gPT0gTUFU Q0hfWUVTKQohICAgICB7CiEgICAgICAgc2Vlbl9jb2xvbnMgPSB0cnVlOwoh ICAgICB9CiEgICBlbHNlIGlmIChzZWVuX2F0dHIpCiAgICAgIHsKICAgICAg ICBnZmNfZXJyb3IgKCJFeHBlY3RlZCA6OiBpbiBUWVBFIGRlZmluaXRpb24g YXQgJUMiKTsKICAgICAgICByZXR1cm4gTUFUQ0hfRVJST1I7CiAgICAgIH0K ICAKISAgIG0gPSBnZmNfbWF0Y2ggKCIgJW4gIiwgbmFtZSk7CiAgICBpZiAo bSAhPSBNQVRDSF9ZRVMpCiAgICAgIHJldHVybiBtOwogIAorICAgLyogTWFr ZSBzdXJlIHRoYXQgd2UgZG9uJ3QgaWRlbnRpZnkgVFlQRSBJUyAoLi4uKSBh cyBhIHBhcmFtZXRlcml6ZWQKKyAgICAgIGRlcml2ZWQgdHlwZSBuYW1lZCAn aXMnLgorICAgICAgVE9ETyBFeHBhbmQgdGhlIGNoZWNrLCB3aGVuICduYW1l JyA9ICJpcyIgYnkgbWF0Y2hpbmcgIiAodG5hbWUpICIKKyAgICAgIGFuZCBj aGVja2luZyBpZiB0aGlzIGlzIGEobiBpbnRyaW5zaWMpIHR5cGVuYW1lLiBo aXMgcGlja3MgdXAKKyAgICAgIG1pc3BsYWNlZCBUWVBFIElTIHN0YXRlbWVu dHMgc3VjaCBhcyBpbiBzZWxlY3RfdHlwZV8xLmYwMy4gICovCisgICBpZiAo Z2ZjX3BlZWtfYXNjaWlfY2hhciAoKSA9PSAnKCcpCisgICAgIHsKKyAgICAg ICBpZiAoZ2ZjX2N1cnJlbnRfc3RhdGUgKCkgPT0gQ09NUF9TRUxFQ1RfVFlQ RQorIAkgIHx8ICghc2Vlbl9jb2xvbnMgJiYgIXN0cmNtcCAobmFtZSwgImlz IikpKQorIAlyZXR1cm4gTUFUQ0hfTk87CisgICAgICAgcGFyYW1ldGVyaXpl ZF90eXBlID0gdHJ1ZTsKKyAgICAgfQorIAorICAgbSA9IGdmY19tYXRjaF9l b3MgKCk7CisgICBpZiAobSAhPSBNQVRDSF9ZRVMgJiYgIXBhcmFtZXRlcml6 ZWRfdHlwZSkKKyAgICAgcmV0dXJuIG07CisgCiAgICAvKiBNYWtlIHN1cmUg dGhlIG5hbWUgaXMgbm90IHRoZSBuYW1lIG9mIGFuIGludHJpbnNpYyB0eXBl LiAgKi8KICAgIGlmIChnZmNfaXNfaW50cmluc2ljX3R5cGVuYW1lIChuYW1l KSkKICAgICAgewoqKioqKioqKioqKioqKiogZ2ZjX21hdGNoX2Rlcml2ZWRf ZGVjbCAodm9pZCkKKioqIDkwNjIsOTA3MCAqKioqCi0tLSA5NzExLDk3MzEg LS0tLQogICAgaWYgKCFzeW0tPmYya19kZXJpdmVkKQogICAgICBzeW0tPmYy a19kZXJpdmVkID0gZ2ZjX2dldF9uYW1lc3BhY2UgKE5VTEwsIDApOwogIAor ICAgaWYgKHBhcmFtZXRlcml6ZWRfdHlwZSkKKyAgICAgeworICAgICAgIG0g PSBnZmNfbWF0Y2hfZm9ybWFsX2FyZ2xpc3QgKHN5bSwgMCwgMCwgdHJ1ZSk7 CisgICAgICAgaWYgKG0gIT0gTUFUQ0hfWUVTKQorIAlyZXR1cm4gbTsKKyAg ICAgICBtID0gZ2ZjX21hdGNoX2VvcyAoKTsKKyAgICAgICBpZiAobSAhPSBN QVRDSF9ZRVMpCisgCXJldHVybiBtOworICAgICAgIHN5bS0+YXR0ci5wZHRf dGVtcGxhdGUgPSAxOworICAgICB9CisgCiAgICBpZiAoZXh0ZW5kZWQgJiYg IXN5bS0+Y29tcG9uZW50cykKICAgICAgewogICAgICAgIGdmY19jb21wb25l bnQgKnA7CisgICAgICAgZ2ZjX2Zvcm1hbF9hcmdsaXN0ICpmLCAqZywgKmg7 CiAgCiAgICAgICAgLyogQWRkIHRoZSBleHRlbmRlZCBkZXJpdmVkIHR5cGUg YXMgdGhlIGZpcnN0IGNvbXBvbmVudC4gICovCiAgICAgICAgZ2ZjX2FkZF9j b21wb25lbnQgKHN5bSwgcGFyZW50LCAmcCk7CioqKioqKioqKioqKioqKiBn ZmNfbWF0Y2hfZGVyaXZlZF9kZWNsICh2b2lkKQoqKiogOTA4OSw5MDk0ICoq KioKLS0tIDk3NTAsOTc4MCAtLS0tCiAgICAgICAgLyogUHJvdmlkZSB0aGUg bGlua3MgYmV0d2VlbiB0aGUgZXh0ZW5kZWQgdHlwZSBhbmQgaXRzIGV4dGVu c2lvbi4gICovCiAgICAgICAgaWYgKCFleHRlbmRlZC0+ZjJrX2Rlcml2ZWQp CiAgCWV4dGVuZGVkLT5mMmtfZGVyaXZlZCA9IGdmY19nZXRfbmFtZXNwYWNl IChOVUxMLCAwKTsKKyAKKyAgICAgICAvKiBDb3B5IHRoZSBleHRlbmRlZCB0 eXBlLXBhcmFtLW5hbWUtbGlzdCBmcm9tIHRoZSBleHRlbmRlZCB0eXBlLAor IAkgYXBwZW5kIHRob3NlIG9mIHRoZSBleHRlbnNpb24gYW5kIGFkZCB0aGUg d2hvbGUgbG90IHRvIHRoZQorIAkgZXh0ZW5zaW9uLiAgKi8KKyAgICAgICBp ZiAoZXh0ZW5kZWQtPmF0dHIucGR0X3RlbXBsYXRlKQorIAl7CisgCSAgZyA9 IGggPSBOVUxMOworIAkgIHN5bS0+YXR0ci5wZHRfdGVtcGxhdGUgPSAxOwor IAkgIGZvciAoZiA9IGV4dGVuZGVkLT5mb3JtYWw7IGY7IGYgPSBmLT5uZXh0 KQorIAkgICAgeworIAkgICAgICBpZiAoZiA9PSBleHRlbmRlZC0+Zm9ybWFs KQorIAkJeworIAkJICBnID0gZ2ZjX2dldF9mb3JtYWxfYXJnbGlzdCAoKTsK KyAJCSAgaCA9IGc7CisgCQl9CisgCSAgICAgIGVsc2UKKyAJCXsKKyAJCSAg Zy0+bmV4dCA9IGdmY19nZXRfZm9ybWFsX2FyZ2xpc3QgKCk7CisgCQkgIGcg PSBnLT5uZXh0OworIAkJfQorIAkgICAgICBnLT5zeW0gPSBmLT5zeW07Cisg CSAgICB9CisgCSAgZy0+bmV4dCA9IHN5bS0+Zm9ybWFsOworIAkgIHN5bS0+ Zm9ybWFsID0gaDsKKyAJfQogICAgICB9CiAgCiAgICBpZiAoIXN5bS0+aGFz aF92YWx1ZSkKSW5kZXg6IGdjYy9mb3J0cmFuL2R1bXAtcGFyc2UtdHJlZS5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy9mb3J0cmFuL2R1bXAt cGFyc2UtdHJlZS5jCShyZXZpc2lvbiAyNTE1NDYpCi0tLSBnY2MvZm9ydHJh bi9kdW1wLXBhcnNlLXRyZWUuYwkod29ya2luZyBjb3B5KQoqKioqKioqKioq KioqKiogc3RhdGljIHZvaWQKKioqIDYyNyw2MzMgKioqKgotLS0gNjI3LDYz OCAtLS0tCiAgc2hvd19hdHRyIChzeW1ib2xfYXR0cmlidXRlICphdHRyLCBj b25zdCBjaGFyICogbW9kdWxlKQogIHsKICAgIGlmIChhdHRyLT5mbGF2b3Ig IT0gRkxfVU5LTk9XTikKKyAgICAgeworICAgICAgIGlmIChhdHRyLT5mbGF2 b3IgPT0gRkxfREVSSVZFRCAmJiBhdHRyLT5wZHRfdGVtcGxhdGUpCisgCWZw dXRzICgiIChQRFQgdGVtcGxhdGUiLCBkdW1wZmlsZSk7CisgICAgICAgZWxz ZQogICAgICBmcHJpbnRmIChkdW1wZmlsZSwgIiglcyAiLCBnZmNfY29kZTJz dHJpbmcgKGZsYXZvcnMsIGF0dHItPmZsYXZvcikpOworICAgICB9CiAgICBp ZiAoYXR0ci0+YWNjZXNzICE9IEFDQ0VTU19VTktOT1dOKQogICAgICBmcHJp bnRmIChkdW1wZmlsZSwgIiVzICIsIGdmY19jb2RlMnN0cmluZyAoYWNjZXNz X3R5cGVzLCBhdHRyLT5hY2Nlc3MpKTsKICAgIGlmIChhdHRyLT5wcm9jICE9 IFBST0NfVU5LTk9XTikKKioqKioqKioqKioqKioqIHNob3dfYXR0ciAoc3lt Ym9sX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QKKioqIDY1Myw2NTggKioqKgot LS0gNjU4LDY2NyAtLS0tCiAgICAgIGZwdXRzICgiIElOVFJJTlNJQyIsIGR1 bXBmaWxlKTsKICAgIGlmIChhdHRyLT5vcHRpb25hbCkKICAgICAgZnB1dHMg KCIgT1BUSU9OQUwiLCBkdW1wZmlsZSk7CisgICBpZiAoYXR0ci0+cGR0X2tp bmQpCisgICAgIGZwdXRzICgiIEtJTkQiLCBkdW1wZmlsZSk7CisgICBpZiAo YXR0ci0+cGR0X2xlbikKKyAgICAgZnB1dHMgKCIgTEVOIiwgZHVtcGZpbGUp OwogICAgaWYgKGF0dHItPnBvaW50ZXIpCiAgICAgIGZwdXRzICgiIFBPSU5U RVIiLCBkdW1wZmlsZSk7CiAgICBpZiAoYXR0ci0+aXNfcHJvdGVjdGVkKQoq KioqKioqKioqKioqKiogc2hvd19jb21wb25lbnRzIChnZmNfc3ltYm9sICpz eW0pCioqKiA3MjQsNzMzICoqKioKLS0tIDczMyw3NTggLS0tLQogIAogICAg Zm9yIChjID0gc3ltLT5jb21wb25lbnRzOyBjOyBjID0gYy0+bmV4dCkKICAg ICAgeworICAgICAgIHNob3dfaW5kZW50ICgpOwogICAgICAgIGZwcmludGYg KGR1bXBmaWxlLCAiKCVzICIsIGMtPm5hbWUpOwogICAgICAgIHNob3dfdHlw ZXNwZWMgKCZjLT50cyk7CisgICAgICAgaWYgKGMtPmtpbmRfZXhwcikKKyAJ eworIAkgIGZwdXRzICgiIGtpbmRfZXhwcjogIiwgZHVtcGZpbGUpOworIAkg IHNob3dfZXhwciAoYy0+a2luZF9leHByKTsKKyAJfQorICAgICAgIGlmIChj LT5wYXJhbV9saXN0KQorIAl7CisgCSAgZnB1dHMgKCJQRFQgcGFyYW1ldGVy cyIsIGR1bXBmaWxlKTsKKyAJICBzaG93X2FjdHVhbF9hcmdsaXN0IChjLT5w YXJhbV9saXN0KTsKKyAJfQorIAogICAgICAgIGlmIChjLT5hdHRyLmFsbG9j YXRhYmxlKQogIAlmcHV0cyAoIiBBTExPQ0FUQUJMRSIsIGR1bXBmaWxlKTsK KyAgICAgICBpZiAoYy0+YXR0ci5wZHRfa2luZCkKKyAJZnB1dHMgKCIgS0lO RCIsIGR1bXBmaWxlKTsKKyAgICAgICBpZiAoYy0+YXR0ci5wZHRfbGVuKQor IAlmcHV0cyAoIiBMRU4iLCBkdW1wZmlsZSk7CiAgICAgICAgaWYgKGMtPmF0 dHIucG9pbnRlcikKICAJZnB1dHMgKCIgUE9JTlRFUiIsIGR1bXBmaWxlKTsK ICAgICAgICBpZiAoYy0+YXR0ci5wcm9jX3BvaW50ZXIpCioqKioqKioqKioq KioqKiBzaG93X3N5bWJvbCAoZ2ZjX3N5bWJvbCAqc3ltKQoqKiogOTM1LDk0 MCAqKioqCi0tLSA5NjAsOTc0IC0tLS0KICAgICAgICBmcHV0cyAoIkZvcm1h bCBuYW1lc3BhY2UiLCBkdW1wZmlsZSk7CiAgICAgICAgc2hvd19uYW1lc3Bh Y2UgKHN5bS0+Zm9ybWFsX25zKTsKICAgICAgfQorIAorICAgaWYgKHN5bS0+ YXR0ci5mbGF2b3IgPT0gRkxfVkFSSUFCTEUKKyAgICAgICAmJiBzeW0tPnBh cmFtX2xpc3QpCisgICAgIHsKKyAgICAgICBzaG93X2luZGVudCAoKTsKKyAg ICAgICBmcHV0cyAoIlBEVCBwYXJhbWV0ZXJzIiwgZHVtcGZpbGUpOworICAg ICAgIHNob3dfYWN0dWFsX2FyZ2xpc3QgKHN5bS0+cGFyYW1fbGlzdCk7Cisg CisgICAgIH0KICAgIC0tc2hvd19sZXZlbDsKICB9CiAgCkluZGV4OiBnY2Mv Zm9ydHJhbi9leHByLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2Nj L2ZvcnRyYW4vZXhwci5jCShyZXZpc2lvbiAyNTE1NDYpCi0tLSBnY2MvZm9y dHJhbi9leHByLmMJKHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqIGdm Y19jb3B5X2V4cHIgKGdmY19leHByICpwKQoqKiogMzk0LDM5OSAqKioqCi0t LSAzOTQsNDAyIC0tLS0KICAKICAgIHEtPnJlZiA9IGdmY19jb3B5X3JlZiAo cC0+cmVmKTsKICAKKyAgIGlmIChwLT5wYXJhbV9saXN0KQorICAgICBxLT5w YXJhbV9saXN0ID0gZ2ZjX2NvcHlfYWN0dWFsX2FyZ2xpc3QgKHAtPnBhcmFt X2xpc3QpOworIAogICAgcmV0dXJuIHE7CiAgfQogIAoqKioqKioqKioqKioq KiogZnJlZV9leHByMCAoZ2ZjX2V4cHIgKmUpCioqKiA0OTksNTA0ICoqKioK LS0tIDUwMiw1MDkgLS0tLQogIAogICAgZ2ZjX2ZyZWVfcmVmX2xpc3QgKGUt PnJlZik7CiAgCisgICBnZmNfZnJlZV9hY3R1YWxfYXJnbGlzdCAoZS0+cGFy YW1fbGlzdCk7CisgCiAgICBtZW1zZXQgKGUsICdcMCcsIHNpemVvZiAoZ2Zj X2V4cHIpKTsKICB9CiAgCioqKioqKioqKioqKioqKiBnZmNfZnJlZV9hY3R1 YWxfYXJnbGlzdCAoZ2ZjX2FjdHVhbF9hcmdsCioqKiA1MjUsNTMwICoqKioK LS0tIDUzMCw1MzYgLS0tLQogICAgd2hpbGUgKGExKQogICAgICB7CiAgICAg ICAgYTIgPSBhMS0+bmV4dDsKKyAgICAgICBpZiAoYTEtPmV4cHIpCiAgICAg ICAgZ2ZjX2ZyZWVfZXhwciAoYTEtPmV4cHIpOwogICAgICAgIGZyZWUgKGEx KTsKICAgICAgICBhMSA9IGEyOwoqKioqKioqKioqKioqKiogZ2ZjX2lzX2Nv bnN0YW50X2V4cHIgKGdmY19leHByICplKQoqKiogOTE3LDkyMiAqKioqCi0t LSA5MjMsOTMzIC0tLS0KICAJCSAgfHwgZ2ZjX2lzX2NvbnN0YW50X2V4cHIg KGUtPnZhbHVlLm9wLm9wMikpKTsKICAKICAgICAgY2FzZSBFWFBSX1ZBUklB QkxFOgorICAgICAgIC8qIFRoZSBvbmx5IGNvbnRleHQgaW4gd2hpY2ggdGhp cyBjYW4gb2NjdXIgaXMgaW4gYSBwYXJhbWV0ZXJpemVkCisgCSBkZXJpdmVk IHR5cGUgZGVjbGFyYXRpb24sIHNvIHJldHVybmluZyB0cnVlIGlzIE9LLiAg Ki8KKyAgICAgICBpZiAoZS0+c3ltdHJlZS0+bi5zeW0tPmF0dHIucGR0X2xl bgorIAkgIHx8IGUtPnN5bXRyZWUtPm4uc3ltLT5hdHRyLnBkdF9raW5kKQor ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwog IAogICAgICBjYXNlIEVYUFJfRlVOQ1RJT046CioqKioqKioqKioqKioqKiBn ZmNfY2hlY2tfaW5pdF9leHByIChnZmNfZXhwciAqZSkKKioqIDI1MzEsMjUz NiAqKioqCi0tLSAyNTQyLDI1NTEgLS0tLQogICAgICBjYXNlIEVYUFJfVkFS SUFCTEU6CiAgICAgICAgdCA9IHRydWU7CiAgCisgICAgICAgLyogVGhpcyBv Y2N1cnMgd2hlbiBwYXJzaW5nIHBkdCB0ZW1wbGF0ZXMuICAqLworICAgICAg IGlmIChlLT5zeW10cmVlLT5uLnN5bS0+YXR0ci5wZHRfa2luZCkKKyAJYnJl YWs7CisgCiAgICAgICAgaWYgKGdmY19jaGVja19pdGVyX3ZhcmlhYmxlIChl KSkKICAJYnJlYWs7CiAgCioqKioqKioqKioqKioqKiBnZmNfbWF0Y2hfaW5p dF9leHByIChnZmNfZXhwciAqKnJlc3VsdCkKKioqIDI3MDAsMjcwNSAqKioq Ci0tLSAyNzE1LDI3MjcgLS0tLQogICAgICAgIHJldHVybiBtOwogICAgICB9 CiAgCisgICBpZiAoZ2ZjX2Rlcml2ZWRfcGFyYW1ldGVyX2V4cHIgKGV4cHIp KQorICAgICB7CisgICAgICAgKnJlc3VsdCA9IGV4cHI7CisgICAgICAgZ2Zj X2luaXRfZXhwcl9mbGFnID0gZmFsc2U7CisgICAgICAgcmV0dXJuIG07Cisg ICAgIH0KKyAKICAgIHQgPSBnZmNfcmVkdWNlX2luaXRfZXhwciAoZXhwcik7 CiAgICBpZiAoIXQpCiAgICAgIHsKKioqKioqKioqKioqKioqIGdmY19jaGVj a19hc3NpZ24gKGdmY19leHByICpsdmFsdWUsIGdmY18KKioqIDMyODIsMzI4 NyAqKioqCi0tLSAzMzA0LDMzMTcgLS0tLQogIAl9CiAgICAgIH0KICAKKyAg IGlmIChnZmNfZXhwcl9hdHRyIChsdmFsdWUpLnBkdF9raW5kIHx8IGdmY19l eHByX2F0dHIgKGx2YWx1ZSkucGR0X2xlbikKKyAgICAgeworICAgICAgIGdm Y19lcnJvciAoIlRoZSBhc3NpZ25tZW50IHRvIGEgS0lORCBvciBMRU4gY29t cG9uZW50IG9mIGEgIgorIAkJICJwYXJhbWV0ZXJpemVkIHR5cGUgYXQgJUwg aXMgbm90IGFsbG93ZWQiLAorIAkJICZsdmFsdWUtPndoZXJlKTsKKyAgICAg ICByZXR1cm4gZmFsc2U7CisgICAgIH0KKyAKICAgIGlmIChnZmNfY29tcGFy ZV90eXBlcyAoJmx2YWx1ZS0+dHMsICZydmFsdWUtPnRzKSkKICAgICAgcmV0 dXJuIHRydWU7CiAgCioqKioqKioqKioqKioqKiBnZmNfZXhwcl9jaGVja190 eXBlZCAoZ2ZjX2V4cHIqIGUsIGdmY19uCioqKiA0ODM3LDQ4NDIgKioqKgot LS0gNDg2Nyw0OTQyIC0tLS0KICB9CiAgCiAgCisgLyogVGhpcyBmdW5jdGlv biByZXR1cm5zIHRydWUgaWYgaXQgY29udGFpbnMgYW55IHJlZmVyZW5jZXMg dG8gUERUIEtJTkQKKyAgICBvciBMRU4gcGFyYW1ldGVycy4gICovCisgCisg c3RhdGljIGJvb2wKKyBkZXJpdmVkX3BhcmFtZXRlcl9leHByIChnZmNfZXhw ciogZSwgZ2ZjX3N5bWJvbCogc3ltIEFUVFJJQlVURV9VTlVTRUQsCisgCQkJ aW50KiBmIEFUVFJJQlVURV9VTlVTRUQpCisgeworICAgaWYgKGUtPmV4cHJf dHlwZSAhPSBFWFBSX1ZBUklBQkxFKQorICAgICByZXR1cm4gZmFsc2U7Cisg CisgICBnY2NfYXNzZXJ0IChlLT5zeW10cmVlKTsKKyAgIGlmIChlLT5zeW10 cmVlLT5uLnN5bS0+YXR0ci5wZHRfa2luZAorICAgICAgIHx8IGUtPnN5bXRy ZWUtPm4uc3ltLT5hdHRyLnBkdF9sZW4pCisgICAgIHJldHVybiB0cnVlOwor IAorICAgcmV0dXJuIGZhbHNlOworIH0KKyAKKyAKKyBib29sCisgZ2ZjX2Rl cml2ZWRfcGFyYW1ldGVyX2V4cHIgKGdmY19leHByICplKQorIHsKKyAgIHJl dHVybiBnZmNfdHJhdmVyc2VfZXhwciAoZSwgTlVMTCwgJmRlcml2ZWRfcGFy YW1ldGVyX2V4cHIsIDApOworIH0KKyAKKyAKKyAvKiBUaGlzIGZ1bmN0aW9u IHJldHVybnMgdGhlIG92ZXJhbGwgdHlwZSBvZiBhIHR5cGUgcGFyYW1ldGVy IHNwZWMgbGlzdC4KKyAgICBJZiBhbGwgdGhlIHNwZWNzIGFyZSBleHBsaWNp dCwgU1BFQ19FWFBMSUNJVCBpcyByZXR1cm5lZC4gSWYgYW55IG9mIHRoZQor ICAgIHBhcmFtZXRlcnMgYXJlIGFzc3VtZWQvZGVmZXJyZWQgdGhlbiBTUEVD X0FTU1VNRUQvREVGRVJSRUQgaXMgcmV0dXJuZWQKKyAgICB1bmxlc3MgZGVy aXZlZCBpcyBub3QgTlVMTC4gIEluIHRoaXMgbGF0dGVyIGNhc2UsIGFsbCB0 aGUgTEVOIHBhcmFtZXRlcnMKKyAgICBtdXN0IGJlIGVpdGhlciBhc3N1bWVk IG9yIGRlZmVycmVkIGZvciB0aGUgcmV0dXJuIGFyZ3VtZW50IHRvIGJlIHNl dCB0bworICAgIGFueXRoaW5nIG90aGVyIHRoYW4gU1BFQ19FWFBMSUNJVC4g ICovCisgCisgZ2ZjX3BhcmFtX3NwZWNfdHlwZQorIGdmY19zcGVjX2xpc3Rf dHlwZSAoZ2ZjX2FjdHVhbF9hcmdsaXN0ICpwYXJhbV9saXN0LCBnZmNfc3lt Ym9sICpkZXJpdmVkKQorIHsKKyAgIGdmY19wYXJhbV9zcGVjX3R5cGUgcmVz ID0gU1BFQ19FWFBMSUNJVDsKKyAgIGdmY19jb21wb25lbnQgKmM7CisgICBi b29sIHNlZW5fYXNzdW1lZCA9IGZhbHNlOworICAgYm9vbCBzZWVuX2RlZmVy cmVkID0gZmFsc2U7CisgCisgICBpZiAoZGVyaXZlZCA9PSBOVUxMKQorICAg ICB7CisgICAgICAgZm9yICg7IHBhcmFtX2xpc3Q7IHBhcmFtX2xpc3QgPSBw YXJhbV9saXN0LT5uZXh0KQorIAlpZiAocGFyYW1fbGlzdC0+c3BlY190eXBl ID09IFNQRUNfQVNTVU1FRAorIAkgICAgfHwgcGFyYW1fbGlzdC0+c3BlY190 eXBlID09IFNQRUNfREVGRVJSRUQpCisgCSAgcmV0dXJuIHBhcmFtX2xpc3Qt PnNwZWNfdHlwZTsKKyAgICAgfQorICAgZWxzZQorICAgICB7CisgICAgICAg Zm9yICg7IHBhcmFtX2xpc3Q7IHBhcmFtX2xpc3QgPSBwYXJhbV9saXN0LT5u ZXh0KQorIAl7CisgCSAgYyA9IGdmY19maW5kX2NvbXBvbmVudCAoZGVyaXZl ZCwgcGFyYW1fbGlzdC0+bmFtZSwKKyAJCQkJICB0cnVlLCB0cnVlLCBOVUxM KTsKKyAJICBnY2NfYXNzZXJ0IChjICE9IE5VTEwpOworIAkgIGlmIChjLT5h dHRyLnBkdF9raW5kKQorIAkgICAgY29udGludWU7CisgCSAgZWxzZSBpZiAo cGFyYW1fbGlzdC0+c3BlY190eXBlID09IFNQRUNfRVhQTElDSVQpCisgCSAg ICByZXR1cm4gU1BFQ19FWFBMSUNJVDsKKyAJICBzZWVuX2Fzc3VtZWQgPSBw YXJhbV9saXN0LT5zcGVjX3R5cGUgPT0gU1BFQ19BU1NVTUVEOworIAkgIHNl ZW5fZGVmZXJyZWQgPSBwYXJhbV9saXN0LT5zcGVjX3R5cGUgPT0gU1BFQ19E RUZFUlJFRDsKKyAJICBpZiAoc2Vlbl9hc3N1bWVkICYmIHNlZW5fZGVmZXJy ZWQpCisgCSAgICByZXR1cm4gU1BFQ19FWFBMSUNJVDsKKyAJfQorICAgICAg IHJlcyA9IHNlZW5fYXNzdW1lZCA/IFNQRUNfQVNTVU1FRCA6IFNQRUNfREVG RVJSRUQ7CisgICAgIH0KKyAgIHJldHVybiByZXM7CisgfQorIAorIAogIGJv b2wKICBnZmNfcmVmX3RoaXNfaW1hZ2UgKGdmY19yZWYgKnJlZikKICB7Cklu ZGV4OiBnY2MvZm9ydHJhbi9nZm9ydHJhbi5oCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKioqIGdjYy9mb3J0cmFuL2dmb3J0cmFuLmgJKHJldmlzaW9uIDI1 MTU0NikKLS0tIGdjYy9mb3J0cmFuL2dmb3J0cmFuLmgJKHdvcmtpbmcgY29w eSkKKioqKioqKioqKioqKioqIGVudW0gZ2ZjX3JldmVyc2UKKioqIDY0Niw2 NTEgKioqKgotLS0gNjQ2LDY1OCAtLS0tCiAgICBHRkNfSU5ISUJJVF9SRVZF UlNFCiAgfTsKICAKKyBlbnVtIGdmY19wYXJhbV9zcGVjX3R5cGUKKyB7Cisg ICBTUEVDX0VYUExJQ0lULAorICAgU1BFQ19BU1NVTUVELAorICAgU1BFQ19E RUZFUlJFRAorIH07CisgCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKiog U3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAK ICAvKiBVc2VkIGZvciBrZWVwaW5nIHRoaW5ncyBpbiBiYWxhbmNlZCBiaW5h cnkgdHJlZXMuICAqLwoqKioqKioqKioqKioqKiogdHlwZWRlZiBzdHJ1Y3QK KioqIDg2OSw4NzQgKioqKgotLS0gODc2LDg4NiAtLS0tCiAgICAgICB2YXJp YWJsZSBmb3IgU0VMRUNUX1RZUEUgb3IgQVNTT0NJQVRFLiAgKi8KICAgIHVu c2lnbmVkIHNlbGVjdF90eXBlX3RlbXBvcmFyeToxLCBhc3NvY2lhdGVfdmFy OjE7CiAgCisgICAvKiBUaGVzZSBhcmUgdGhlIGF0dHJpYnV0ZXMgcmVxdWly ZWQgZm9yIHBhcmFtZXRlcml6ZWQgZGVyaXZlZAorICAgICAgdHlwZXMuICAq LworICAgdW5zaWduZWQgcGR0X2tpbmQ6MSwgcGR0X2xlbjoxLCBwZHRfdHlw ZToxLCBwZHRfdGVtcGxhdGU6MSwKKyAJICAgcGR0X2FycmF5OjEsIHBkdF9z dHJpbmc6MTsKKyAKICAgIC8qIFRoaXMgaXMgb21wX3tvdXQsaW4scHJpdixv cmlnfSBhcnRpZmljaWFsIHZhcmlhYmxlIGluCiAgICAgICAhJE9NUCBERUNM QVJFIFJFRFVDVElPTi4gICovCiAgICB1bnNpZ25lZCBvbXBfdWRyX2FydGlm aWNpYWxfdmFyOjE7CioqKioqKioqKioqKioqKiB0eXBlZGVmIHN0cnVjdCBn ZmNfY29tcG9uZW50CioqKiAxMDUzLDEwNTggKioqKgotLS0gMTA2NSwxMDc1 IC0tLS0KICAgIHRyZWUgbm9yZXN0cmljdF9kZWNsOwogICAgbG9jdXMgbG9j OwogICAgc3RydWN0IGdmY19leHByICppbml0aWFsaXplcjsKKyAgIC8qIFVz ZWQgaW4gcGFyYW1ldGVyaXplZCBkZXJpdmVkIHR5cGUgZGVjbGFyYXRpb25z IHRvIHN0b3JlIHBhcmFtZXRlcml6ZWQKKyAgICAgIGtpbmQgZXhwcmVzc2lv bnMuICAqLworICAgc3RydWN0IGdmY19leHByICpraW5kX2V4cHI7CisgICBz dHJ1Y3QgZ2ZjX2FjdHVhbF9hcmdsaXN0ICpwYXJhbV9saXN0OworIAogICAg c3RydWN0IGdmY19jb21wb25lbnQgKm5leHQ7CiAgCiAgICAvKiBOZWVkZWQg Zm9yIHByb2NlZHVyZSBwb2ludGVyIGNvbXBvbmVudHMuICAqLwoqKioqKioq KioqKioqKiogZ2ZjX2Zvcm1hbF9hcmdsaXN0OwoqKiogMTA3NywxMDgzICoq KioKICAjZGVmaW5lIGdmY19nZXRfZm9ybWFsX2FyZ2xpc3QoKSBYQ05FVyAo Z2ZjX2Zvcm1hbF9hcmdsaXN0KQogIAogIAohIC8qIFRoZSBnZmNfYWN0dWFs X2FyZ2xpc3Qgc3RydWN0dXJlIGlzIGZvciBhY3R1YWwgYXJndW1lbnRzLiAg Ki8KICB0eXBlZGVmIHN0cnVjdCBnZmNfYWN0dWFsX2FyZ2xpc3QKICB7CiAg ICBjb25zdCBjaGFyICpuYW1lOwotLS0gMTA5NCwxMTAxIC0tLS0KICAjZGVm aW5lIGdmY19nZXRfZm9ybWFsX2FyZ2xpc3QoKSBYQ05FVyAoZ2ZjX2Zvcm1h bF9hcmdsaXN0KQogIAogIAohIC8qIFRoZSBnZmNfYWN0dWFsX2FyZ2xpc3Qg c3RydWN0dXJlIGlzIGZvciBhY3R1YWwgYXJndW1lbnRzIGFuZAohICAgIGZv ciB0eXBlIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uIGxpc3RzLiAgKi8KICB0 eXBlZGVmIHN0cnVjdCBnZmNfYWN0dWFsX2FyZ2xpc3QKICB7CiAgICBjb25z dCBjaGFyICpuYW1lOwoqKioqKioqKioqKioqKiogdHlwZWRlZiBzdHJ1Y3Qg Z2ZjX2FjdHVhbF9hcmdsaXN0CioqKiAxMDg5LDEwOTQgKioqKgotLS0gMTEw NywxMTE0IC0tLS0KICAgICAgIGFyZ3VtZW50IGhhcyB0byBiZSBhZGRlZCB0 byBhIGZ1bmN0aW9uIGNhbGwuICAqLwogICAgYnQgbWlzc2luZ19hcmdfdHlw ZTsKICAKKyAgIGdmY19wYXJhbV9zcGVjX3R5cGUgc3BlY190eXBlOworIAog ICAgc3RydWN0IGdmY19leHByICpleHByOwogICAgc3RydWN0IGdmY19hY3R1 YWxfYXJnbGlzdCAqbmV4dDsKICB9CioqKioqKioqKioqKioqKiB0eXBlZGVm IHN0cnVjdCBnZmNfc3ltYm9sCioqKiAxNTA3LDE1MTIgKioqKgotLS0gMTUy NywxNTM1IC0tLS0KICAgIHN0cnVjdCBnZmNfbmFtZXNwYWNlICpmb3JtYWxf bnM7CiAgICBzdHJ1Y3QgZ2ZjX25hbWVzcGFjZSAqZjJrX2Rlcml2ZWQ7CiAg CisgICAvKiBMaXN0IG9mIFBEVCBwYXJhbWV0ZXIgZXhwcmVzc2lvbnMgICov CisgICBzdHJ1Y3QgZ2ZjX2FjdHVhbF9hcmdsaXN0ICpwYXJhbV9saXN0Owor IAogICAgc3RydWN0IGdmY19leHByICp2YWx1ZTsJLyogUGFyYW1ldGVyL0lu aXRpYWxpemVyIHZhbHVlICovCiAgICBnZmNfYXJyYXlfc3BlYyAqYXM7CiAg ICBzdHJ1Y3QgZ2ZjX3N5bWJvbCAqcmVzdWx0OwkvKiBmdW5jdGlvbiByZXN1 bHQgc3ltYm9sICovCioqKioqKioqKioqKioqKiB0eXBlZGVmIHN0cnVjdCBn ZmNfZXhwcgoqKiogMjE3OSwyMTg0ICoqKioKLS0tIDIyMDIsMjIxMCAtLS0t CiAgICB9CiAgICB2YWx1ZTsKICAKKyAgIC8qIFVzZWQgdG8gc3RvcmUgUERU IGV4cHJlc3Npb24gbGlzdHMgYXNzb2NpYXRlZCB3aXRoIGV4cHJlc3Npb25z LiAgKi8KKyAgIGdmY19hY3R1YWxfYXJnbGlzdCAqcGFyYW1fbGlzdDsKKyAK ICB9CiAgZ2ZjX2V4cHI7CiAgCioqKioqKioqKioqKioqKiBnZmNfZmluYWxp emVyOwoqKiogMjY5OSwyNzA0ICoqKioKLS0tIDI3MjUsMjczNiAtLS0tCiAg Ym9vbCBnZmNfaW5fbWF0Y2hfZGF0YSAodm9pZCk7CiAgbWF0Y2ggZ2ZjX21h dGNoX2NoYXJfc3BlYyAoZ2ZjX3R5cGVzcGVjICopOwogIAorIC8qIEhhbmRs aW5nIFBhcmFtZXRlcml6ZWQgRGVyaXZlZCBUeXBlcyAgKi8KKyBib29sIGdm Y19pbnNlcnRfa2luZF9wYXJhbWV0ZXJfZXhwcnMgKGdmY19leHByICopOwor IGJvb2wgZ2ZjX2luc2VydF9wYXJhbWV0ZXJfZXhwcnMgKGdmY19leHByICos IGdmY19hY3R1YWxfYXJnbGlzdCAqKTsKKyBtYXRjaCBnZmNfZ2V0X3BkdF9p bnN0YW5jZSAoZ2ZjX2FjdHVhbF9hcmdsaXN0ICosIGdmY19zeW1ib2wgKios CisgCQkJICAgIGdmY19hY3R1YWxfYXJnbGlzdCAqKik7CisgCiAgLyogc2Nh bm5lci5jICovCiAgdm9pZCBnZmNfc2Nhbm5lcl9kb25lXzEgKHZvaWQpOwog IHZvaWQgZ2ZjX3NjYW5uZXJfaW5pdF8xICh2b2lkKTsKKioqKioqKioqKioq KioqIGJvb2wgZ2ZjX2FkZF9kaW1lbnNpb24gKHN5bWJvbF9hdHRyaWJ1dGUK KioqIDI4ODAsMjg4NSAqKioqCi0tLSAyOTEyLDI5MTkgLS0tLQogIGJvb2wg Z2ZjX2FkZF9leHRlcm5hbCAoc3ltYm9sX2F0dHJpYnV0ZSAqLCBsb2N1cyAq KTsKICBib29sIGdmY19hZGRfaW50cmluc2ljIChzeW1ib2xfYXR0cmlidXRl ICosIGxvY3VzICopOwogIGJvb2wgZ2ZjX2FkZF9vcHRpb25hbCAoc3ltYm9s X2F0dHJpYnV0ZSAqLCBsb2N1cyAqKTsKKyBib29sIGdmY19hZGRfa2luZCAo c3ltYm9sX2F0dHJpYnV0ZSAqLCBsb2N1cyAqKTsKKyBib29sIGdmY19hZGRf bGVuIChzeW1ib2xfYXR0cmlidXRlICosIGxvY3VzICopOwogIGJvb2wgZ2Zj X2FkZF9wb2ludGVyIChzeW1ib2xfYXR0cmlidXRlICosIGxvY3VzICopOwog IGJvb2wgZ2ZjX2FkZF9jcmF5X3BvaW50ZXIgKHN5bWJvbF9hdHRyaWJ1dGUg KiwgbG9jdXMgKik7CiAgYm9vbCBnZmNfYWRkX2NyYXlfcG9pbnRlZSAoc3lt Ym9sX2F0dHJpYnV0ZSAqLCBsb2N1cyAqKTsKKioqKioqKioqKioqKioqIGJv b2wgZ2ZjX3RyYXZlcnNlX2V4cHIgKGdmY19leHByICosIGdmY18KKioqIDMx NDMsMzE0OSAqKioqCiAgCQkJaW50KTsKICB2b2lkIGdmY19leHByX3NldF9z eW1ib2xzX3JlZmVyZW5jZWQgKGdmY19leHByICopOwogIGJvb2wgZ2ZjX2V4 cHJfY2hlY2tfdHlwZWQgKGdmY19leHByKiwgZ2ZjX25hbWVzcGFjZSosIGJv b2wpOwohIAogIGdmY19jb21wb25lbnQgKiBnZmNfZ2V0X3Byb2NfcHRyX2Nv bXAgKGdmY19leHByICopOwogIGJvb2wgZ2ZjX2lzX3Byb2NfcHRyX2NvbXAg KGdmY19leHByICopOwogIGJvb2wgZ2ZjX2lzX2FsbG9jX2NsYXNzX3NjYWxh cl9mdW5jdGlvbiAoZ2ZjX2V4cHIgKik7Ci0tLSAzMTc3LDMxODQgLS0tLQog IAkJCWludCk7CiAgdm9pZCBnZmNfZXhwcl9zZXRfc3ltYm9sc19yZWZlcmVu Y2VkIChnZmNfZXhwciAqKTsKICBib29sIGdmY19leHByX2NoZWNrX3R5cGVk IChnZmNfZXhwciosIGdmY19uYW1lc3BhY2UqLCBib29sKTsKISBib29sIGdm Y19kZXJpdmVkX3BhcmFtZXRlcl9leHByIChnZmNfZXhwciAqKTsKISBnZmNf cGFyYW1fc3BlY190eXBlIGdmY19zcGVjX2xpc3RfdHlwZSAoZ2ZjX2FjdHVh bF9hcmdsaXN0ICosIGdmY19zeW1ib2wgKik7CiAgZ2ZjX2NvbXBvbmVudCAq IGdmY19nZXRfcHJvY19wdHJfY29tcCAoZ2ZjX2V4cHIgKik7CiAgYm9vbCBn ZmNfaXNfcHJvY19wdHJfY29tcCAoZ2ZjX2V4cHIgKik7CiAgYm9vbCBnZmNf aXNfYWxsb2NfY2xhc3Nfc2NhbGFyX2Z1bmN0aW9uIChnZmNfZXhwciAqKTsK SW5kZXg6IGdjYy9mb3J0cmFuL2ludGVyZmFjZS5jCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKioqIGdjYy9mb3J0cmFuL2ludGVyZmFjZS5jCShyZXZpc2lv biAyNTE1NDYpCi0tLSBnY2MvZm9ydHJhbi9pbnRlcmZhY2UuYwkod29ya2lu ZyBjb3B5KQoqKioqKioqKioqKioqKiogZ2ZjX2NvbXBhcmVfZGVyaXZlZF90 eXBlcyAoZ2ZjX3N5bWJvbCAqZAoqKiogNjQ1LDY1MSAqKioqCiAgICAgIHJl dHVybiBmYWxzZTsKICAKICAgIGlmICghKGRlcml2ZWQxLT5hdHRyLnNlcXVl bmNlICYmIGRlcml2ZWQyLT5hdHRyLnNlcXVlbmNlKQohICAgICAgICYmICEo ZGVyaXZlZDEtPmF0dHIuaXNfYmluZF9jICYmIGRlcml2ZWQyLT5hdHRyLmlz X2JpbmRfYykpCiAgICAgIHJldHVybiBmYWxzZTsKICAKICAgIC8qIFByb3Rl Y3QgYWdhaW5zdCBudWxsIGNvbXBvbmVudHMuICAqLwotLS0gNjQ1LDY1MiAt LS0tCiAgICAgIHJldHVybiBmYWxzZTsKICAKICAgIGlmICghKGRlcml2ZWQx LT5hdHRyLnNlcXVlbmNlICYmIGRlcml2ZWQyLT5hdHRyLnNlcXVlbmNlKQoh ICAgICAgICYmICEoZGVyaXZlZDEtPmF0dHIuaXNfYmluZF9jICYmIGRlcml2 ZWQyLT5hdHRyLmlzX2JpbmRfYykKISAgICAgICAmJiAhKGRlcml2ZWQxLT5h dHRyLnBkdF90eXBlICYmIGRlcml2ZWQyLT5hdHRyLnBkdF90eXBlKSkKICAg ICAgcmV0dXJuIGZhbHNlOwogIAogICAgLyogUHJvdGVjdCBhZ2FpbnN0IG51 bGwgY29tcG9uZW50cy4gICovCkluZGV4OiBnY2MvZm9ydHJhbi9tYXRjaC5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy9mb3J0cmFuL21hdGNo LmMJKHJldmlzaW9uIDI1MTU0NikKLS0tIGdjYy9mb3J0cmFuL21hdGNoLmMJ KHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqIGJvb2wgZ2ZjX21hdGNo aW5nX3ByZWZpeCA9IGZhbHNlOwoqKiogMzMsMzggKioqKgotLS0gMzMsNDEg LS0tLQogIC8qIFN0YWNrIG9mIFNFTEVDVCBUWVBFIHN0YXRlbWVudHMuICAq LwogIGdmY19zZWxlY3RfdHlwZV9zdGFjayAqc2VsZWN0X3R5cGVfc3RhY2sg PSBOVUxMOwogIAorIC8qIExpc3Qgb2YgdHlwZSBwYXJhbWV0ZXIgZXhwcmVz c2lvbnMuICAqLworIGdmY19hY3R1YWxfYXJnbGlzdCAqdHlwZV9wYXJhbV9z cGVjX2xpc3Q7CisgCiAgLyogRm9yIGRlYnVnZ2luZyBhbmQgZGlhZ25vc3Rp YyBwdXJwb3Nlcy4gIFJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlv bgogICAgIG9mIHRoZSBpbnRyaW5zaWMgb3BlcmF0b3IgT1AuICAqLwogIGNv bnN0IGNoYXIgKgoqKioqKioqKioqKioqKiogZ2ZjX29wMnN0cmluZyAoZ2Zj X2ludHJpbnNpY19vcCBvcCkKKioqIDEzMiwxNDMgKioqKgogICAgICAgKDEp IElmIGFueSB1c2VyIGRlZmluZWQgb3BlcmF0b3IgIi55LiIgZXhpc3RzLCB0 aGlzIGlzIGFsd2F5cyB5KHgseikKICAgICAgICAgICAoZXZlbiBpZiAiLnku IiBpcyB0aGUgd3JvbmcgdHlwZSBhbmQvb3IgeCBoYXMgYSBtZW1iZXIgeSku CiAgICAgICAoMikgT3RoZXJ3aXNlIGlmIHggaGFzIGEgbWVtYmVyIHksIGFu ZCB5IGlzIGl0c2VsZiBhIGRlcml2ZWQgdHlwZSwKISAgICAgICAgICB0aGlz IGlzICh4LT55KS0+eiwgZXZlbiBpZiBhbiBpbnRyaW5zaWMgb3BlcmF0b3Ig ZXhpc3RzIHdoaWNoIAohICAgICAgICAgIGNhbiBoYW5kbGUgKHgseikuIAoh ICAgICAgKDMpIElmIHggaGFzIG5vIG1lbWJlciB5IG9yICh4LT55KSBpcyBu b3QgYSBkZXJpdmVkIHR5cGUgYnV0ICIueS4iIAogICAgICAgICAgIGlzIGFu IGludHJpbnNpYyBvcGVyYXRvciAoc3VjaCBhcyAiLmVxLiIpLCB0aGlzIGlz IHkoeCx6KS4KICAgICAgICg0KSBMYXN0bHkgaWYgdGhlcmUgaXMgbm8gb3Bl cmF0b3IgIi55LiIgYW5kIHggaGFzIG5vIG1lbWJlciAieSIsIGl0IGlzIGFu CiEgICAgICAgICAgZXJyb3IuICAKICAgICBJdCBpcyB3b3J0aCBub3Rpbmcg dGhhdCB0aGUgbG9naWMgaGVyZSBkb2VzIG5vdCBzdXBwb3J0IG1peGVkIHVz ZSBvZiBtZW1iZXIKICAgICBhY2Nlc3NvcnMgd2l0aGluIGEgc2luZ2xlIHN0 cmluZy4gVGhhdCBpcywgZXZlbiBpZiB4IGhhcyBjb21wb25lbnQgeSBhbmQg eQogICAgIGhhcyBjb21wb25lbnQgeiwgdGhlIGZvbGxvd2luZyBhcmUgYWxs IHN5bnRheCBlcnJvcnM6Ci0tLSAxMzUsMTQ2IC0tLS0KICAgICAgICgxKSBJ ZiBhbnkgdXNlciBkZWZpbmVkIG9wZXJhdG9yICIueS4iIGV4aXN0cywgdGhp cyBpcyBhbHdheXMgeSh4LHopCiAgICAgICAgICAgKGV2ZW4gaWYgIi55LiIg aXMgdGhlIHdyb25nIHR5cGUgYW5kL29yIHggaGFzIGEgbWVtYmVyIHkpLgog ICAgICAgKDIpIE90aGVyd2lzZSBpZiB4IGhhcyBhIG1lbWJlciB5LCBhbmQg eSBpcyBpdHNlbGYgYSBkZXJpdmVkIHR5cGUsCiEgICAgICAgICAgdGhpcyBp cyAoeC0+eSktPnosIGV2ZW4gaWYgYW4gaW50cmluc2ljIG9wZXJhdG9yIGV4 aXN0cyB3aGljaAohICAgICAgICAgIGNhbiBoYW5kbGUgKHgseikuCiEgICAg ICAoMykgSWYgeCBoYXMgbm8gbWVtYmVyIHkgb3IgKHgtPnkpIGlzIG5vdCBh IGRlcml2ZWQgdHlwZSBidXQgIi55LiIKICAgICAgICAgICBpcyBhbiBpbnRy aW5zaWMgb3BlcmF0b3IgKHN1Y2ggYXMgIi5lcS4iKSwgdGhpcyBpcyB5KHgs eikuCiAgICAgICAoNCkgTGFzdGx5IGlmIHRoZXJlIGlzIG5vIG9wZXJhdG9y ICIueS4iIGFuZCB4IGhhcyBubyBtZW1iZXIgInkiLCBpdCBpcyBhbgohICAg ICAgICAgIGVycm9yLgogICAgIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHRo ZSBsb2dpYyBoZXJlIGRvZXMgbm90IHN1cHBvcnQgbWl4ZWQgdXNlIG9mIG1l bWJlcgogICAgIGFjY2Vzc29ycyB3aXRoaW4gYSBzaW5nbGUgc3RyaW5nLiBU aGF0IGlzLCBldmVuIGlmIHggaGFzIGNvbXBvbmVudCB5IGFuZCB5CiAgICAg aGFzIGNvbXBvbmVudCB6LCB0aGUgZm9sbG93aW5nIGFyZSBhbGwgc3ludGF4 IGVycm9yczoKKioqKioqKioqKioqKioqIGdmY19tYXRjaF9tZW1iZXJfc2Vw KGdmY19zeW1ib2wgKnN5bSkKKioqIDE2NSwxNzEgKioqKgogICAgdHN5bSA9 IE5VTEw7CiAgCiAgICAvKiBXZSBtYXkgYmUgZ2l2ZW4gZWl0aGVyIGEgZGVy aXZlZCB0eXBlIHZhcmlhYmxlIG9yIHRoZSBkZXJpdmVkIHR5cGUKISAgICAg ZGVjbGFyYXRpb24gaXRzZWxmICh3aGljaCBhY3R1YWxseSBjb250YWlucyB0 aGUgY29tcG9uZW50cyk7IAogICAgICB3ZSBuZWVkIHRoZSBsYXR0ZXIgdG8g c2VhcmNoIGZvciBjb21wb25lbnRzLiAgKi8KICAgIGlmIChnZmNfZmxfc3Ry dWN0IChzeW0tPmF0dHIuZmxhdm9yKSkKICAgICAgdHN5bSA9IHN5bTsKLS0t IDE2OCwxNzQgLS0tLQogICAgdHN5bSA9IE5VTEw7CiAgCiAgICAvKiBXZSBt YXkgYmUgZ2l2ZW4gZWl0aGVyIGEgZGVyaXZlZCB0eXBlIHZhcmlhYmxlIG9y IHRoZSBkZXJpdmVkIHR5cGUKISAgICAgZGVjbGFyYXRpb24gaXRzZWxmICh3 aGljaCBhY3R1YWxseSBjb250YWlucyB0aGUgY29tcG9uZW50cyk7CiAgICAg IHdlIG5lZWQgdGhlIGxhdHRlciB0byBzZWFyY2ggZm9yIGNvbXBvbmVudHMu ICAqLwogICAgaWYgKGdmY19mbF9zdHJ1Y3QgKHN5bS0+YXR0ci5mbGF2b3Ip KQogICAgICB0c3ltID0gc3ltOwoqKioqKioqKioqKioqKiogZ2ZjX21hdGNo X21lbWJlcl9zZXAoZ2ZjX3N5bWJvbCAqc3ltKQoqKiogMjA1LDIxMSAqKioq CiAgICBpZiAoZ2ZjX2ZpbmRfdW9wIChuYW1lLCBzeW0tPm5zKSAhPSBOVUxM KQogICAgICBnb3RvIG5vOwogIAohICAgLyogTWF0Y2ggYWNjZXNzZXMgdG8g ZXhpc3RpbmcgZGVyaXZlZC10eXBlIGNvbXBvbmVudHMgZm9yIAogICAgICBk ZXJpdmVkLXR5cGUgdmFyczogIngueS56IiA9ICh4LT55KS0+eiAgKi8KICAg IGMgPSBnZmNfZmluZF9jb21wb25lbnQodHN5bSwgbmFtZSwgZmFsc2UsIHRy dWUsIE5VTEwpOwogICAgaWYgKGMgJiYgKGdmY19idF9zdHJ1Y3QgKGMtPnRz LnR5cGUpIHx8IGMtPnRzLnR5cGUgPT0gQlRfQ0xBU1MpKQotLS0gMjA4LDIx NCAtLS0tCiAgICBpZiAoZ2ZjX2ZpbmRfdW9wIChuYW1lLCBzeW0tPm5zKSAh PSBOVUxMKQogICAgICBnb3RvIG5vOwogIAohICAgLyogTWF0Y2ggYWNjZXNz ZXMgdG8gZXhpc3RpbmcgZGVyaXZlZC10eXBlIGNvbXBvbmVudHMgZm9yCiAg ICAgIGRlcml2ZWQtdHlwZSB2YXJzOiAieC55LnoiID0gKHgtPnkpLT56ICAq LwogICAgYyA9IGdmY19maW5kX2NvbXBvbmVudCh0c3ltLCBuYW1lLCBmYWxz ZSwgdHJ1ZSwgTlVMTCk7CiAgICBpZiAoYyAmJiAoZ2ZjX2J0X3N0cnVjdCAo Yy0+dHMudHlwZSkgfHwgYy0+dHMudHlwZSA9PSBCVF9DTEFTUykpCioqKioq KioqKioqKioqKiBnZmNfbWF0Y2hfbWVtYmVyX3NlcChnZmNfc3ltYm9sICpz eW0pCioqKiAyMTYsMjIyICoqKioKICAgIGlmIChnZmNfbWF0Y2hfaW50cmlu c2ljX29wICgmaW9wKSAhPSBNQVRDSF9ZRVMpCiAgICAgIHsKICAgICAgICAv KiBJZiAiLnkuIiBpcyBub3QgYW4gaW50cmluc2ljIG9wZXJhdG9yIGJ1dCB5 IHdhcyBhIHZhbGlkIG5vbi0KISAgICAgICAgIHN0cnVjdHVyZSBjb21wb25l bnQsIG1hdGNoIGFuZCBsZWF2ZSB0aGUgdHJhaWxpbmcgZG90IHRvIGJlIAog ICAgICAgICAgZGVhbHQgd2l0aCBsYXRlci4gICovCiAgICAgICAgaWYgKGMp CiAgICAgICAgICBnb3RvIHllczsKLS0tIDIxOSwyMjUgLS0tLQogICAgaWYg KGdmY19tYXRjaF9pbnRyaW5zaWNfb3AgKCZpb3ApICE9IE1BVENIX1lFUykK ICAgICAgewogICAgICAgIC8qIElmICIueS4iIGlzIG5vdCBhbiBpbnRyaW5z aWMgb3BlcmF0b3IgYnV0IHkgd2FzIGEgdmFsaWQgbm9uLQohICAgICAgICAg c3RydWN0dXJlIGNvbXBvbmVudCwgbWF0Y2ggYW5kIGxlYXZlIHRoZSB0cmFp bGluZyBkb3QgdG8gYmUKICAgICAgICAgIGRlYWx0IHdpdGggbGF0ZXIuICAq LwogICAgICAgIGlmIChjKQogICAgICAgICAgZ290byB5ZXM7CioqKioqKioq KioqKioqKiBnZmNfbWF0Y2hfbGFiZWwgKHZvaWQpCioqKiA2MjMsNjI5ICoq KioKICAgICAgICByZXR1cm4gTUFUQ0hfRVJST1I7CiAgICAgIH0KICAKISAg IGlmICghZ2ZjX2FkZF9mbGF2b3IgKCZnZmNfbmV3X2Jsb2NrLT5hdHRyLCBG TF9MQUJFTCwgCiAgCQkgICAgICAgZ2ZjX25ld19ibG9jay0+bmFtZSwgTlVM TCkpCiAgICAgIHJldHVybiBNQVRDSF9FUlJPUjsKICAKLS0tIDYyNiw2MzIg LS0tLQogICAgICAgIHJldHVybiBNQVRDSF9FUlJPUjsKICAgICAgfQogIAoh ICAgaWYgKCFnZmNfYWRkX2ZsYXZvciAoJmdmY19uZXdfYmxvY2stPmF0dHIs IEZMX0xBQkVMLAogIAkJICAgICAgIGdmY19uZXdfYmxvY2stPm5hbWUsIE5V TEwpKQogICAgICByZXR1cm4gTUFUQ0hfRVJST1I7CiAgCioqKioqKioqKioq KioqKiBtYXRjaF9kZXJpdmVkX3R5cGVfc3BlYyAoZ2ZjX3R5cGVzcGVjICp0 CioqKiAxOTU1LDE5NjEgKioqKgogIHsKICAgIGNoYXIgbmFtZVtHRkNfTUFY X1NZTUJPTF9MRU4gKyAxXTsKICAgIGxvY3VzIG9sZF9sb2N1czsKISAgIGdm Y19zeW1ib2wgKmRlcml2ZWQ7CiAgCiAgICBvbGRfbG9jdXMgPSBnZmNfY3Vy cmVudF9sb2N1czsKICAKLS0tIDE5NTgsMTk2NyAtLS0tCiAgewogICAgY2hh ciBuYW1lW0dGQ19NQVhfU1lNQk9MX0xFTiArIDFdOwogICAgbG9jdXMgb2xk X2xvY3VzOwohICAgZ2ZjX3N5bWJvbCAqZGVyaXZlZCwgKmRlcl90eXBlOwoh ICAgbWF0Y2ggbSA9IE1BVENIX1lFUzsKISAgIGdmY19hY3R1YWxfYXJnbGlz dCAqZGVjbF90eXBlX3BhcmFtX2xpc3QgPSBOVUxMOwohICAgYm9vbCBpc19w ZHRfdGVtcGxhdGUgPSBmYWxzZTsKICAKICAgIG9sZF9sb2N1cyA9IGdmY19j dXJyZW50X2xvY3VzOwogIAoqKioqKioqKioqKioqKiogbWF0Y2hfZGVyaXZl ZF90eXBlX3NwZWMgKGdmY190eXBlc3BlYyAqdAoqKiogMTk2NywxOTc1ICoq KioKLS0tIDE5NzMsMjAyMyAtLS0tCiAgCiAgICBnZmNfZmluZF9zeW1ib2wg KG5hbWUsIE5VTEwsIDEsICZkZXJpdmVkKTsKICAKKyAgIC8qIE1hdGNoIHRo ZSBQRFQgc3BlYyBsaXN0LCBpZiB0aGVyZS4gICovCisgICBpZiAoZGVyaXZl ZCAmJiBkZXJpdmVkLT5hdHRyLmZsYXZvciA9PSBGTF9QUk9DRURVUkUpCisg ICAgIHsKKyAgICAgICBnZmNfZmluZF9zeW1ib2wgKGdmY19kdF91cHBlcl9z dHJpbmcgKG5hbWUpLCBOVUxMLCAxLCAmZGVyX3R5cGUpOworICAgICAgIGlz X3BkdF90ZW1wbGF0ZSA9IGRlcl90eXBlCisgCQkJJiYgZGVyX3R5cGUtPmF0 dHIuZmxhdm9yID09IEZMX0RFUklWRUQKKyAJCQkmJiBkZXJfdHlwZS0+YXR0 ci5wZHRfdGVtcGxhdGU7CisgICAgIH0KKyAKKyAgIGlmIChpc19wZHRfdGVt cGxhdGUpCisgICAgIG0gPSBnZmNfbWF0Y2hfYWN0dWFsX2FyZ2xpc3QgKDEs ICZkZWNsX3R5cGVfcGFyYW1fbGlzdCwgdHJ1ZSk7CisgCisgICBpZiAobSA9 PSBNQVRDSF9FUlJPUikKKyAgICAgeworICAgICAgIGdmY19mcmVlX2FjdHVh bF9hcmdsaXN0IChkZWNsX3R5cGVfcGFyYW1fbGlzdCk7CisgICAgICAgcmV0 dXJuIG07CisgICAgIH0KKyAKICAgIGlmIChkZXJpdmVkICYmIGRlcml2ZWQt PmF0dHIuZmxhdm9yID09IEZMX1BST0NFRFVSRSAmJiBkZXJpdmVkLT5hdHRy LmdlbmVyaWMpCiAgICAgIGRlcml2ZWQgPSBnZmNfZmluZF9kdF9pbl9nZW5l cmljIChkZXJpdmVkKTsKICAKKyAgIC8qIElmIHRoaXMgaXMgYSBQRFQsIGZp bmQgdGhlIHNwZWNpZmljIGluc3RhbmNlLiAgKi8KKyAgIGlmIChtID09IE1B VENIX1lFUyAmJiBpc19wZHRfdGVtcGxhdGUpCisgICAgIHsKKyAgICAgICBn ZmNfbmFtZXNwYWNlICpvbGRfbnM7CisgCisgICAgICAgb2xkX25zID0gZ2Zj X2N1cnJlbnRfbnM7CisgICAgICAgd2hpbGUgKGdmY19jdXJyZW50X25zICYm IGdmY19jdXJyZW50X25zLT5wYXJlbnQpCisgCWdmY19jdXJyZW50X25zID0g Z2ZjX2N1cnJlbnRfbnMtPnBhcmVudDsKKyAKKyAgICAgICBpZiAodHlwZV9w YXJhbV9zcGVjX2xpc3QpCisgCWdmY19mcmVlX2FjdHVhbF9hcmdsaXN0ICh0 eXBlX3BhcmFtX3NwZWNfbGlzdCk7CisgICAgICAgbSA9IGdmY19nZXRfcGR0 X2luc3RhbmNlIChkZWNsX3R5cGVfcGFyYW1fbGlzdCwgJmRlcl90eXBlLAor IAkJCQkmdHlwZV9wYXJhbV9zcGVjX2xpc3QpOworICAgICAgIGdmY19mcmVl X2FjdHVhbF9hcmdsaXN0IChkZWNsX3R5cGVfcGFyYW1fbGlzdCk7CisgCisg ICAgICAgaWYgKG0gIT0gTUFUQ0hfWUVTKQorIAlyZXR1cm4gbTsKKyAgICAg ICBkZXJpdmVkID0gZGVyX3R5cGU7CisgICAgICAgZ2NjX2Fzc2VydCAoIWRl cml2ZWQtPmF0dHIucGR0X3RlbXBsYXRlICYmIGRlcml2ZWQtPmF0dHIucGR0 X3R5cGUpOworICAgICAgIGdmY19zZXRfc3ltX3JlZmVyZW5jZWQgKGRlcml2 ZWQpOworIAorICAgICAgIGdmY19jdXJyZW50X25zID0gb2xkX25zOworICAg ICB9CisgCiAgICBpZiAoZGVyaXZlZCAmJiBkZXJpdmVkLT5hdHRyLmZsYXZv ciA9PSBGTF9ERVJJVkVEKQogICAgICB7CiAgICAgICAgdHMtPnR5cGUgPSBC VF9ERVJJVkVEOwoqKioqKioqKioqKioqKiogZ2ZjX21hdGNoX3R5cGVfc3Bl YyAoZ2ZjX3R5cGVzcGVjICp0cykKKioqIDE5OTksMjAwNCAqKioqCi0tLSAy MDQ3LDIwNTMgLS0tLQogICAgZ2ZjX2NsZWFyX3RzICh0cyk7CiAgICBnZmNf Z29iYmxlX3doaXRlc3BhY2UgKCk7CiAgICBvbGRfbG9jdXMgPSBnZmNfY3Vy cmVudF9sb2N1czsKKyAgIHR5cGVfcGFyYW1fc3BlY19saXN0ID0gTlVMTDsK ICAKICAgIGlmIChtYXRjaF9kZXJpdmVkX3R5cGVfc3BlYyAodHMpID09IE1B VENIX1lFUykKICAgICAgewoqKioqKioqKioqKioqKiogZ2ZjX21hdGNoX3N0 b3Bjb2RlIChnZmNfc3RhdGVtZW50IHN0KQoqKiogMjg2OSwyODc1ICoqKioK ICAJCQkJIHwgR0ZDX1NURF9GMjAwOF9PQlMpOwogIAogICAgLyogU2V0IGYw MyBmb3IgLXN0ZD1mMjAwMy4gICovCiEgICBmMDMgPSBnZmNfb3B0aW9uLmFs bG93X3N0ZCA9PSAoR0ZDX1NURF9GOTVfT0JTIHwgR0ZDX1NURF9GOTUgfCBH RkNfU1REX0Y3NyAKICAJCQkJIHwgR0ZDX1NURF9GMjAwOF9PQlMgfCBHRkNf U1REX0YyMDAzKTsKICAKICAgIC8qIExvb2sgZm9yIGEgYmxhbmsgYmV0d2Vl biBTVE9QIGFuZCB0aGUgc3RvcC1jb2RlIGZvciBGMjAwOCBvciBsYXRlci4g ICovCi0tLSAyOTE4LDI5MjQgLS0tLQogIAkJCQkgfCBHRkNfU1REX0YyMDA4 X09CUyk7CiAgCiAgICAvKiBTZXQgZjAzIGZvciAtc3RkPWYyMDAzLiAgKi8K ISAgIGYwMyA9IGdmY19vcHRpb24uYWxsb3dfc3RkID09IChHRkNfU1REX0Y5 NV9PQlMgfCBHRkNfU1REX0Y5NSB8IEdGQ19TVERfRjc3CiAgCQkJCSB8IEdG Q19TVERfRjIwMDhfT0JTIHwgR0ZDX1NURF9GMjAwMyk7CiAgCiAgICAvKiBM b29rIGZvciBhIGJsYW5rIGJldHdlZW4gU1RPUCBhbmQgdGhlIHN0b3AtY29k ZSBmb3IgRjIwMDggb3IgbGF0ZXIuICAqLwoqKioqKioqKioqKioqKiogZ2Zj X21hdGNoX2FsbG9jYXRlICh2b2lkKQoqKiogMzkzNSwzOTQxICoqKioKICAg ICAgewogICAgICAgIGlmIChnZmNfbWF0Y2ggKCIgOjogIikgPT0gTUFUQ0hf WUVTKQogIAl7CiEgCSAgaWYgKCFnZmNfbm90aWZ5X3N0ZCAoR0ZDX1NURF9G MjAwMywgInR5cGVzcGVjIGluIEFMTE9DQVRFIGF0ICVMIiwgCiAgCQkJICAg ICAgICZvbGRfbG9jdXMpKQogIAkgICAgZ290byBjbGVhbnVwOwogIAotLS0g Mzk4NCwzOTkwIC0tLS0KICAgICAgewogICAgICAgIGlmIChnZmNfbWF0Y2gg KCIgOjogIikgPT0gTUFUQ0hfWUVTKQogIAl7CiEgCSAgaWYgKCFnZmNfbm90 aWZ5X3N0ZCAoR0ZDX1NURF9GMjAwMywgInR5cGVzcGVjIGluIEFMTE9DQVRF IGF0ICVMIiwKICAJCQkgICAgICAgJm9sZF9sb2N1cykpCiAgCSAgICBnb3Rv IGNsZWFudXA7CiAgCioqKioqKioqKioqKioqKiBnZmNfbWF0Y2hfYWxsb2Nh dGUgKHZvaWQpCioqKiAzOTQ4LDM5NTMgKioqKgotLS0gMzk5Nyw0MDEyIC0t LS0KICAKICAJICBpZiAodHMudHlwZSA9PSBCVF9DSEFSQUNURVIpCiAgCSAg ICB0cy51LmNsLT5sZW5ndGhfZnJvbV90eXBlc3BlYyA9IHRydWU7CisgCisg CSAgLyogVE9ETyB1bmRlcnN0YW5kIHdoeSB0aGlzIGVycm9yIGRvZXMgbm90 IGFwcGVhciBidXQsIGluc3RlYWQsCisgCSAgICAgdGhlIGRlcml2ZWQgdHlw ZSBpcyBjYXVnaHQgYXMgYSB2YXJpYWJsZSBpbiBwcmltYXJ5LmMuICAqLwor IAkgIGlmIChnZmNfc3BlY19saXN0X3R5cGUgKHR5cGVfcGFyYW1fc3BlY19s aXN0LCBOVUxMKSAhPSBTUEVDX0VYUExJQ0lUKQorIAkgICAgeworIAkgICAg ICBnZmNfZXJyb3IgKCJUaGUgdHlwZSBwYXJhbWV0ZXIgc3BlYyBsaXN0IGlu IHRoZSB0eXBlLXNwZWMgYXQgIgorIAkJCSAiJUwgY2Fubm90IGNvbnRhaW4g QVNTVU1FRCBvciBERUZFUlJFRCBwYXJhbWV0ZXJzIiwKKyAJCQkgJm9sZF9s b2N1cyk7CisgCSAgICAgIGdvdG8gY2xlYW51cDsKKyAJICAgIH0KICAJfQog ICAgICAgIGVsc2UKICAJewoqKioqKioqKioqKioqKiogZ2ZjX21hdGNoX2Fs bG9jYXRlICh2b2lkKQoqKiogNDA1OSw0MDY0ICoqKioKLS0tIDQxMTgsNDEy NiAtLS0tCiAgICAgICAgaWYgKHRhaWwtPmV4cHItPnRzLnR5cGUgPT0gQlRf REVSSVZFRCkKICAJdGFpbC0+ZXhwci0+dHMudS5kZXJpdmVkID0gZ2ZjX3Vz ZV9kZXJpdmVkICh0YWlsLT5leHByLT50cy51LmRlcml2ZWQpOwogIAorICAg ICAgIGlmICh0eXBlX3BhcmFtX3NwZWNfbGlzdCkKKyAJdGFpbC0+ZXhwci0+ cGFyYW1fbGlzdCA9IGdmY19jb3B5X2FjdHVhbF9hcmdsaXN0ICh0eXBlX3Bh cmFtX3NwZWNfbGlzdCk7CisgCiAgICAgICAgc2F3X3VubGltaXRlZCA9IHNh d191bmxpbWl0ZWQgfCBVTkxJTUlURURfUE9MWSAodGFpbC0+ZXhwcik7CiAg CiAgICAgICAgaWYgKGdmY19wZWVrX2FzY2lpX2NoYXIgKCkgPT0gJygnICYm ICFzeW0tPmF0dHIuZGltZW5zaW9uKQoqKioqKioqKioqKioqKiogYWxsb2Nf b3B0X2xpc3Q6CioqKiA0MTQzLDQxNDkgKioqKgogIAogIAkgIGlmIChoZWFk LT5uZXh0CiAgCSAgICAgICYmICFnZmNfbm90aWZ5X3N0ZCAoR0ZDX1NURF9G MjAwOCwgIlNPVVJDRSB0YWcgYXQgJUwiCiEgCQkJCSAgIiB3aXRoIG1vcmUg dGhhbiBhIHNpbmdsZSBhbGxvY2F0ZSBvYmplY3QiLCAKICAJCQkJICAmdG1w LT53aGVyZSkpCiAgCSAgICBnb3RvIGNsZWFudXA7CiAgCi0tLSA0MjA1LDQy MTEgLS0tLQogIAogIAkgIGlmIChoZWFkLT5uZXh0CiAgCSAgICAgICYmICFn ZmNfbm90aWZ5X3N0ZCAoR0ZDX1NURF9GMjAwOCwgIlNPVVJDRSB0YWcgYXQg JUwiCiEgCQkJCSAgIiB3aXRoIG1vcmUgdGhhbiBhIHNpbmdsZSBhbGxvY2F0 ZSBvYmplY3QiLAogIAkJCQkgICZ0bXAtPndoZXJlKSkKICAJICAgIGdvdG8g Y2xlYW51cDsKICAKKioqKioqKioqKioqKioqIGFsbG9jX29wdF9saXN0Ogoq KiogNDIzNiw0MjQxICoqKioKLS0tIDQyOTgsNDMwNiAtLS0tCiAgICBuZXdf c3QuZXh0LmFsbG9jLmxpc3QgPSBoZWFkOwogICAgbmV3X3N0LmV4dC5hbGxv Yy50cyA9IHRzOwogIAorICAgaWYgKHR5cGVfcGFyYW1fc3BlY19saXN0KQor ICAgICBnZmNfZnJlZV9hY3R1YWxfYXJnbGlzdCAodHlwZV9wYXJhbV9zcGVj X2xpc3QpOworIAogICAgcmV0dXJuIE1BVENIX1lFUzsKICAKICBzeW50YXg6 CioqKioqKioqKioqKioqKiBjbGVhbnVwOgoqKiogNDI0OCw0MjUzICoqKioK LS0tIDQzMTMsNDMyMCAtLS0tCiAgICBnZmNfZnJlZV9leHByIChtb2xkKTsK ICAgIGlmICh0bXAgJiYgdG1wLT5leHByX3R5cGUpIGdmY19mcmVlX2V4cHIg KHRtcCk7CiAgICBnZmNfZnJlZV9hbGxvY19saXN0IChoZWFkKTsKKyAgIGlm ICh0eXBlX3BhcmFtX3NwZWNfbGlzdCkKKyAgICAgZ2ZjX2ZyZWVfYWN0dWFs X2FyZ2xpc3QgKHR5cGVfcGFyYW1fc3BlY19saXN0KTsKICAgIHJldHVybiBN QVRDSF9FUlJPUjsKICB9CiAgCioqKioqKioqKioqKioqKiBnZmNfbWF0Y2hf Y29tbW9uICh2b2lkKQoqKiogNDkwMSw0OTA3ICoqKioKICAJICAgICAgIHx8 IHN5bS0+YXR0ci5kYXRhKSAmJiBnZmNfY3VycmVudF9zdGF0ZSAoKSAhPSBD T01QX0JMT0NLX0RBVEEpCiAgCSAgICB7CiAgCSAgICAgIGlmICghZ2ZjX25v dGlmeV9zdGQgKEdGQ19TVERfR05VLCAiSW5pdGlhbGl6ZWQgc3ltYm9sICVx cyBhdCAiCiEgCQkJCSAgICIlQyBjYW4gb25seSBiZSBDT01NT04gaW4gQkxP Q0sgREFUQSIsIAogIAkJCQkgICBzeW0tPm5hbWUpKQogIAkJZ290byBjbGVh bnVwOwogIAkgICAgfQotLS0gNDk2OCw0OTc0IC0tLS0KICAJICAgICAgIHx8 IHN5bS0+YXR0ci5kYXRhKSAmJiBnZmNfY3VycmVudF9zdGF0ZSAoKSAhPSBD T01QX0JMT0NLX0RBVEEpCiAgCSAgICB7CiAgCSAgICAgIGlmICghZ2ZjX25v dGlmeV9zdGQgKEdGQ19TVERfR05VLCAiSW5pdGlhbGl6ZWQgc3ltYm9sICVx cyBhdCAiCiEgCQkJCSAgICIlQyBjYW4gb25seSBiZSBDT01NT04gaW4gQkxP Q0sgREFUQSIsCiAgCQkJCSAgIHN5bS0+bmFtZSkpCiAgCQlnb3RvIGNsZWFu dXA7CiAgCSAgICB9CioqKioqKioqKioqKioqKiBnZmNfbWF0Y2hfbmFtZWxp c3QgKHZvaWQpCioqKiA1MTE0LDUxMjAgKioqKgogIAlyZXR1cm4gTUFUQ0hf RVJST1I7CiAgCiAgICAgICAgaWYgKGdyb3VwX25hbWUtPmF0dHIuZmxhdm9y ICE9IEZMX05BTUVMSVNUCiEgCSAgJiYgIWdmY19hZGRfZmxhdm9yICgmZ3Jv dXBfbmFtZS0+YXR0ciwgRkxfTkFNRUxJU1QsIAogIAkJCSAgICAgIGdyb3Vw X25hbWUtPm5hbWUsIE5VTEwpKQogIAlyZXR1cm4gTUFUQ0hfRVJST1I7CiAg Ci0tLSA1MTgxLDUxODcgLS0tLQogIAlyZXR1cm4gTUFUQ0hfRVJST1I7CiAg CiAgICAgICAgaWYgKGdyb3VwX25hbWUtPmF0dHIuZmxhdm9yICE9IEZMX05B TUVMSVNUCiEgCSAgJiYgIWdmY19hZGRfZmxhdm9yICgmZ3JvdXBfbmFtZS0+ YXR0ciwgRkxfTkFNRUxJU1QsCiAgCQkJICAgICAgZ3JvdXBfbmFtZS0+bmFt ZSwgTlVMTCkpCiAgCXJldHVybiBNQVRDSF9FUlJPUjsKICAKKioqKioqKioq KioqKioqIGdmY19tYXRjaF9tb2R1bGUgKHZvaWQpCioqKiA1MTkzLDUxOTkg KioqKgogICAgaWYgKG0gIT0gTUFUQ0hfWUVTKQogICAgICByZXR1cm4gbTsK ICAKISAgIGlmICghZ2ZjX2FkZF9mbGF2b3IgKCZnZmNfbmV3X2Jsb2NrLT5h dHRyLCBGTF9NT0RVTEUsIAogIAkJICAgICAgIGdmY19uZXdfYmxvY2stPm5h bWUsIE5VTEwpKQogICAgICByZXR1cm4gTUFUQ0hfRVJST1I7CiAgCi0tLSA1 MjYwLDUyNjYgLS0tLQogICAgaWYgKG0gIT0gTUFUQ0hfWUVTKQogICAgICBy ZXR1cm4gbTsKICAKISAgIGlmICghZ2ZjX2FkZF9mbGF2b3IgKCZnZmNfbmV3 X2Jsb2NrLT5hdHRyLCBGTF9NT0RVTEUsCiAgCQkgICAgICAgZ2ZjX25ld19i bG9jay0+bmFtZSwgTlVMTCkpCiAgICAgIHJldHVybiBNQVRDSF9FUlJPUjsK ICAKKioqKioqKioqKioqKioqIGdmY19tYXRjaF90eXBlX2lzICh2b2lkKQoq KiogNjExNCw2MTI2ICoqKioKICAgICAgICByZXR1cm4gTUFUQ0hfRVJST1I7 CiAgICAgIH0KICAKICAgIC8qIENyZWF0ZSB0ZW1wb3JhcnkgdmFyaWFibGUu ICAqLwogICAgc2VsZWN0X3R5cGVfc2V0X3RtcCAoJmMtPnRzKTsKICAKICAg IHJldHVybiBNQVRDSF9ZRVM7CiAgCiAgc3ludGF4OgohICAgZ2ZjX2Vycm9y ICgiU3ludGF4IGVycm9yIGluIFRZUEUgSVMgc3BlY2lmaWNhdGlvbiBhdCAl QyIpOwogIAogIGNsZWFudXA6CiAgICBpZiAoYyAhPSBOVUxMKQotLS0gNjE4 MSw2MjAzIC0tLS0KICAgICAgICByZXR1cm4gTUFUQ0hfRVJST1I7CiAgICAg IH0KICAKKyAgIGlmIChjLT50cy50eXBlID09IEJUX0RFUklWRUQKKyAgICAg ICAmJiBjLT50cy51LmRlcml2ZWQgJiYgYy0+dHMudS5kZXJpdmVkLT5hdHRy LnBkdF90eXBlCisgICAgICAgJiYgZ2ZjX3NwZWNfbGlzdF90eXBlICh0eXBl X3BhcmFtX3NwZWNfbGlzdCwgYy0+dHMudS5kZXJpdmVkKQorIAkJCQkJCQkh PSBTUEVDX0FTU1VNRUQpCisgICAgIHsKKyAgICAgICBnZmNfZXJyb3IgKCJB bGwgdGhlIExFTiB0eXBlIHBhcmFtZXRlcnMgaW4gdGhlIFRZUEUgSVMgc3Rh dGVtZW50ICIKKyAJCSAiYXQgJUMgbXVzdCBiZSBBU1NVTUVEIik7CisgICAg ICAgcmV0dXJuIE1BVENIX0VSUk9SOworICAgICB9CisgCiAgICAvKiBDcmVh dGUgdGVtcG9yYXJ5IHZhcmlhYmxlLiAgKi8KICAgIHNlbGVjdF90eXBlX3Nl dF90bXAgKCZjLT50cyk7CiAgCiAgICByZXR1cm4gTUFUQ0hfWUVTOwogIAog IHN5bnRheDoKISAgIGdmY19lcnJvciAoIlNzeW50YXggZXJyb3IgaW4gVFlQ RSBJUyBzcGVjaWZpY2F0aW9uIGF0ICVDIik7CiAgCiAgY2xlYW51cDoKICAg IGlmIChjICE9IE5VTEwpCkluZGV4OiBnY2MvZm9ydHJhbi9tYXRjaC5oCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy9mb3J0cmFuL21hdGNoLmgJ KHJldmlzaW9uIDI1MTU0NikKLS0tIGdjYy9mb3J0cmFuL21hdGNoLmgJKHdv cmtpbmcgY29weSkKKioqKioqKioqKioqKioqIG1hdGNoIGdmY19tYXRjaF9k ZWNsX3R5cGVfc3BlYyAoZ2ZjX3R5cGUKKioqIDIxMywyMTkgKioqKgogIAog IG1hdGNoIGdmY19tYXRjaF9lbmQgKGdmY19zdGF0ZW1lbnQgKik7CiAgbWF0 Y2ggZ2ZjX21hdGNoX2RhdGFfZGVjbCAodm9pZCk7CiEgbWF0Y2ggZ2ZjX21h dGNoX2Zvcm1hbF9hcmdsaXN0IChnZmNfc3ltYm9sICosIGludCwgaW50KTsK ICBtYXRjaCBnZmNfbWF0Y2hfcHJvY2VkdXJlICh2b2lkKTsKICBtYXRjaCBn ZmNfbWF0Y2hfZ2VuZXJpYyAodm9pZCk7CiAgbWF0Y2ggZ2ZjX21hdGNoX2Z1 bmN0aW9uX2RlY2wgKHZvaWQpOwotLS0gMjEzLDIxOSAtLS0tCiAgCiAgbWF0 Y2ggZ2ZjX21hdGNoX2VuZCAoZ2ZjX3N0YXRlbWVudCAqKTsKICBtYXRjaCBn ZmNfbWF0Y2hfZGF0YV9kZWNsICh2b2lkKTsKISBtYXRjaCBnZmNfbWF0Y2hf Zm9ybWFsX2FyZ2xpc3QgKGdmY19zeW1ib2wgKiwgaW50LCBpbnQsIGJvb2wg PSBmYWxzZSk7CiAgbWF0Y2ggZ2ZjX21hdGNoX3Byb2NlZHVyZSAodm9pZCk7 CiAgbWF0Y2ggZ2ZjX21hdGNoX2dlbmVyaWMgKHZvaWQpOwogIG1hdGNoIGdm Y19tYXRjaF9mdW5jdGlvbl9kZWNsICh2b2lkKTsKKioqKioqKioqKioqKioq IG1hdGNoIGdmY19nZXRfdHlwZV9hdHRyX3NwZWMgKHN5bWJvbF9hdHQKKioq IDI3NCwyODAgKioqKgogIG1hdGNoIGdmY19tYXRjaF9zdHJ1Y3R1cmVfY29u c3RydWN0b3IgKGdmY19zeW1ib2wgKiwgZ2ZjX2V4cHIgKiopOwogIG1hdGNo IGdmY19tYXRjaF92YXJpYWJsZSAoZ2ZjX2V4cHIgKiosIGludCk7CiAgbWF0 Y2ggZ2ZjX21hdGNoX2VxdWl2X3ZhcmlhYmxlIChnZmNfZXhwciAqKik7CiEg bWF0Y2ggZ2ZjX21hdGNoX2FjdHVhbF9hcmdsaXN0IChpbnQsIGdmY19hY3R1 YWxfYXJnbGlzdCAqKik7CiAgbWF0Y2ggZ2ZjX21hdGNoX2xpdGVyYWxfY29u c3RhbnQgKGdmY19leHByICoqLCBpbnQpOwogIAogIC8qIGV4cHIuYyAtLSBG SVhNRTogdGhpcyBvbmUgc2hvdWxkIGJlIGVsaW1pbmF0ZWQgYnkgbW92aW5n IHRoZQotLS0gMjc0LDI4MCAtLS0tCiAgbWF0Y2ggZ2ZjX21hdGNoX3N0cnVj dHVyZV9jb25zdHJ1Y3RvciAoZ2ZjX3N5bWJvbCAqLCBnZmNfZXhwciAqKik7 CiAgbWF0Y2ggZ2ZjX21hdGNoX3ZhcmlhYmxlIChnZmNfZXhwciAqKiwgaW50 KTsKICBtYXRjaCBnZmNfbWF0Y2hfZXF1aXZfdmFyaWFibGUgKGdmY19leHBy ICoqKTsKISBtYXRjaCBnZmNfbWF0Y2hfYWN0dWFsX2FyZ2xpc3QgKGludCwg Z2ZjX2FjdHVhbF9hcmdsaXN0ICoqLCBib29sID0gZmFsc2UpOwogIG1hdGNo IGdmY19tYXRjaF9saXRlcmFsX2NvbnN0YW50IChnZmNfZXhwciAqKiwgaW50 KTsKICAKICAvKiBleHByLmMgLS0gRklYTUU6IHRoaXMgb25lIHNob3VsZCBi ZSBlbGltaW5hdGVkIGJ5IG1vdmluZyB0aGUKSW5kZXg6IGdjYy9mb3J0cmFu L21vZHVsZS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy9mb3J0 cmFuL21vZHVsZS5jCShyZXZpc2lvbiAyNTE1NDYpCi0tLSBnY2MvZm9ydHJh bi9tb2R1bGUuYwkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogZW51 bSBhYl9hdHRyaWJ1dGUKKioqIDE5OTgsMjAwNCAqKioqCiAgICBBQl9BUlJB WV9PVVRFUl9ERVBFTkRFTkNZLCBBQl9NT0RVTEVfUFJPQ0VEVVJFLCBBQl9P QUNDX0RFQ0xBUkVfQ1JFQVRFLAogICAgQUJfT0FDQ19ERUNMQVJFX0NPUFlJ TiwgQUJfT0FDQ19ERUNMQVJFX0RFVklDRVBUUiwKICAgIEFCX09BQ0NfREVD TEFSRV9ERVZJQ0VfUkVTSURFTlQsIEFCX09BQ0NfREVDTEFSRV9MSU5LLAoh ICAgQUJfT01QX0RFQ0xBUkVfVEFSR0VUX0xJTksKICB9OwogIAogIHN0YXRp YyBjb25zdCBtc3RyaW5nIGF0dHJfYml0c1tdID0KLS0tIDE5OTgsMjAwNSAt LS0tCiAgICBBQl9BUlJBWV9PVVRFUl9ERVBFTkRFTkNZLCBBQl9NT0RVTEVf UFJPQ0VEVVJFLCBBQl9PQUNDX0RFQ0xBUkVfQ1JFQVRFLAogICAgQUJfT0FD Q19ERUNMQVJFX0NPUFlJTiwgQUJfT0FDQ19ERUNMQVJFX0RFVklDRVBUUiwK ICAgIEFCX09BQ0NfREVDTEFSRV9ERVZJQ0VfUkVTSURFTlQsIEFCX09BQ0Nf REVDTEFSRV9MSU5LLAohICAgQUJfT01QX0RFQ0xBUkVfVEFSR0VUX0xJTkss IEFCX1BEVF9LSU5ELCBBQl9QRFRfTEVOLCBBQl9QRFRfVFlQRSwKISAgIEFC X1BEVF9URU1QTEFURSwgQUJfUERUX0FSUkFZLCBBQl9QRFRfU1RSSU5HCiAg fTsKICAKICBzdGF0aWMgY29uc3QgbXN0cmluZyBhdHRyX2JpdHNbXSA9Cioq KioqKioqKioqKioqKiBzdGF0aWMgY29uc3QgbXN0cmluZyBhdHRyX2JpdHNb XSA9CioqKiAyMDYyLDIwNjcgKioqKgotLS0gMjA2MywyMDc0IC0tLS0KICAg ICAgbWluaXQgKCJPQUNDX0RFQ0xBUkVfREVWSUNFX1JFU0lERU5UIiwgQUJf T0FDQ19ERUNMQVJFX0RFVklDRV9SRVNJREVOVCksCiAgICAgIG1pbml0ICgi T0FDQ19ERUNMQVJFX0xJTksiLCBBQl9PQUNDX0RFQ0xBUkVfTElOSyksCiAg ICAgIG1pbml0ICgiT01QX0RFQ0xBUkVfVEFSR0VUX0xJTksiLCBBQl9PTVBf REVDTEFSRV9UQVJHRVRfTElOSyksCisgICAgIG1pbml0ICgiUERUX0tJTkQi LCBBQl9QRFRfS0lORCksCisgICAgIG1pbml0ICgiUERUX0xFTiIsIEFCX1BE VF9MRU4pLAorICAgICBtaW5pdCAoIlBEVF9UWVBFIiwgQUJfUERUX1RZUEUp LAorICAgICBtaW5pdCAoIlBEVF9URU1QTEFURSIsIEFCX1BEVF9URU1QTEFU RSksCisgICAgIG1pbml0ICgiUERUX0FSUkFZIiwgQUJfUERUX0FSUkFZKSwK KyAgICAgbWluaXQgKCJQRFRfU1RSSU5HIiwgQUJfUERUX1NUUklORyksCiAg ICAgIG1pbml0IChOVUxMLCAtMSkKICB9OwogIAoqKioqKioqKioqKioqKiog bWlvX3N5bWJvbF9hdHRyaWJ1dGUgKHN5bWJvbF9hdHRyaWJ1dGUgKgoqKiog MjI2MCwyMjY1ICoqKioKLS0tIDIyNjcsMjI4NCAtLS0tCiAgCU1JT19OQU1F IChhYl9hdHRyaWJ1dGUpIChBQl9PQUNDX0RFQ0xBUkVfTElOSywgYXR0cl9i aXRzKTsKICAgICAgICBpZiAoYXR0ci0+b21wX2RlY2xhcmVfdGFyZ2V0X2xp bmspCiAgCU1JT19OQU1FIChhYl9hdHRyaWJ1dGUpIChBQl9PTVBfREVDTEFS RV9UQVJHRVRfTElOSywgYXR0cl9iaXRzKTsKKyAgICAgICBpZiAoYXR0ci0+ cGR0X2tpbmQpCisgCU1JT19OQU1FIChhYl9hdHRyaWJ1dGUpIChBQl9QRFRf S0lORCwgYXR0cl9iaXRzKTsKKyAgICAgICBpZiAoYXR0ci0+cGR0X2xlbikK KyAJTUlPX05BTUUgKGFiX2F0dHJpYnV0ZSkgKEFCX1BEVF9MRU4sIGF0dHJf Yml0cyk7CisgICAgICAgaWYgKGF0dHItPnBkdF90eXBlKQorIAlNSU9fTkFN RSAoYWJfYXR0cmlidXRlKSAoQUJfUERUX1RZUEUsIGF0dHJfYml0cyk7Cisg ICAgICAgaWYgKGF0dHItPnBkdF90ZW1wbGF0ZSkKKyAJTUlPX05BTUUgKGFi X2F0dHJpYnV0ZSkgKEFCX1BEVF9URU1QTEFURSwgYXR0cl9iaXRzKTsKKyAg ICAgICBpZiAoYXR0ci0+cGR0X2FycmF5KQorIAlNSU9fTkFNRSAoYWJfYXR0 cmlidXRlKSAoQUJfUERUX0FSUkFZLCBhdHRyX2JpdHMpOworICAgICAgIGlm IChhdHRyLT5wZHRfc3RyaW5nKQorIAlNSU9fTkFNRSAoYWJfYXR0cmlidXRl KSAoQUJfUERUX1NUUklORywgYXR0cl9iaXRzKTsKICAKICAgICAgICBtaW9f cnBhcmVuICgpOwogIAoqKioqKioqKioqKioqKiogbWlvX3N5bWJvbF9hdHRy aWJ1dGUgKHN5bWJvbF9hdHRyaWJ1dGUgKgoqKiogMjQ1MywyNDU4ICoqKioK LS0tIDI0NzIsMjQ5NSAtLS0tCiAgCSAgICBjYXNlIEFCX09BQ0NfREVDTEFS RV9MSU5LOgogIAkgICAgICBhdHRyLT5vYWNjX2RlY2xhcmVfbGluayA9IDE7 CiAgCSAgICAgIGJyZWFrOworIAkgICAgY2FzZSBBQl9QRFRfS0lORDoKKyAJ ICAgICAgYXR0ci0+cGR0X2tpbmQgPSAxOworIAkgICAgICBicmVhazsKKyAJ ICAgIGNhc2UgQUJfUERUX0xFTjoKKyAJICAgICAgYXR0ci0+cGR0X2xlbiA9 IDE7CisgCSAgICAgIGJyZWFrOworIAkgICAgY2FzZSBBQl9QRFRfVFlQRToK KyAJICAgICAgYXR0ci0+cGR0X3R5cGUgPSAxOworIAkgICAgICBicmVhazsK KyAJICAgIGNhc2UgQUJfUERUX1RFTVBMQVRFOgorIAkgICAgICBhdHRyLT5w ZHRfdGVtcGxhdGUgPSAxOworIAkgICAgICBicmVhazsKKyAJICAgIGNhc2Ug QUJfUERUX0FSUkFZOgorIAkgICAgICBhdHRyLT5wZHRfYXJyYXkgPSAxOwor IAkgICAgICBicmVhazsKKyAJICAgIGNhc2UgQUJfUERUX1NUUklORzoKKyAJ ICAgICAgYXR0ci0+cGR0X3N0cmluZyA9IDE7CisgCSAgICAgIGJyZWFrOwog IAkgICAgfQogIAl9CiAgICAgIH0KKioqKioqKioqKioqKioqIG1pb19jb21w b25lbnQgKGdmY19jb21wb25lbnQgKmMsIGludCB2dHkKKioqIDI3NzksMjc4 NCAqKioqCi0tLSAyODE2LDI4MjQgLS0tLQogICAgbWlvX3R5cGVzcGVjICgm Yy0+dHMpOwogICAgbWlvX2FycmF5X3NwZWMgKCZjLT5hcyk7CiAgCisgICAv KiBQRFQgdGVtcGxhdGVzIHN0b3JlIHRoZSBleHByZXNzaW9uIGZvciB0aGUg a2luZCBvZiBhIGNvbXBvbmVudCBoZXJlLiAgKi8KKyAgIG1pb19leHByICgm Yy0+a2luZF9leHByKTsKKyAKICAgIG1pb19zeW1ib2xfYXR0cmlidXRlICgm Yy0+YXR0cik7CiAgICBpZiAoYy0+dHMudHlwZSA9PSBCVF9DTEFTUykKICAg ICAgYy0+YXR0ci5jbGFzc19vayA9IDE7CioqKioqKioqKioqKioqKiBtaW9f ZnVsbF9mMmtfZGVyaXZlZCAoZ2ZjX3N5bWJvbCAqc3ltKQoqKiogMzk5OCw0 MDA0ICoqKioKLS0tIDQwMzgsNDA2MSAtLS0tCiAgICAgIHsKICAgICAgICBp ZiAocGVla19hdG9tICgpICE9IEFUT01fUlBBUkVOKQogIAl7CisgCSAgZ2Zj X25hbWVzcGFjZSAqbnM7CisgCiAgCSAgc3ltLT5mMmtfZGVyaXZlZCA9IGdm Y19nZXRfbmFtZXNwYWNlIChOVUxMLCAwKTsKKyAKKyAJICAvKiBQRFQgdGVt cGxhdGVzIG1ha2UgdXNlIG9mIHRoZSBtZWNoYW5pc21zIGZvciBmb3JtYWwg YXJncworIAkgICAgIGFuZCBzbyB0aGUgcGFyYW1ldGVyIHN5bWJvbHMgYXJl IHN0b3JlZCBpbiB0aGUgZm9ybWFsCisgCSAgICAgbmFtZXNwYWNlLiAgVHJh bnNmZXIgdGhlIHN5bV9yb290IHRvIGYya19kZXJpdmVkIGFuZCB0aGVuCisg CSAgICAgZnJlZSB0aGUgZm9ybWFsIG5hbWVzcGFjZSBzaW5jZSBpdCBpcyB1 bmVlZGVkLiAgKi8KKyAJICBpZiAoc3ltLT5hdHRyLnBkdF90ZW1wbGF0ZSAm JiBzeW0tPmZvcm1hbCAmJiBzeW0tPmZvcm1hbC0+c3ltKQorIAkgICAgewor IAkgICAgICBucyA9IHN5bS0+Zm9ybWFsLT5zeW0tPm5zOworIAkgICAgICBz eW0tPmYya19kZXJpdmVkLT5zeW1fcm9vdCA9IG5zLT5zeW1fcm9vdDsKKyAJ ICAgICAgbnMtPnN5bV9yb290ID0gTlVMTDsKKyAJICAgICAgbnMtPnJlZnMr KzsKKyAJICAgICAgZ2ZjX2ZyZWVfbmFtZXNwYWNlIChucyk7CisgCSAgICAg IG5zID0gTlVMTDsKKyAJICAgIH0KKyAKICAJICBtaW9fZjJrX2Rlcml2ZWQg KHN5bS0+ZjJrX2Rlcml2ZWQpOwogIAl9CiAgICAgICAgZWxzZQpJbmRleDog Z2NjL2ZvcnRyYW4vcHJpbWFyeS5jCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K KioqIGdjYy9mb3J0cmFuL3ByaW1hcnkuYwkocmV2aXNpb24gMjUxNTQ2KQot LS0gZ2NjL2ZvcnRyYW4vcHJpbWFyeS5jCSh3b3JraW5nIGNvcHkpCioqKioq KioqKioqKioqKiBtYXRjaF9hY3R1YWxfYXJnIChnZmNfZXhwciAqKnJlc3Vs dCkKKioqIDE2MDksMTYxOCAqKioqCiAgfQogIAogIAohIC8qIE1hdGNoIGEg a2V5d29yZCBhcmd1bWVudC4gICovCiAgCiAgc3RhdGljIG1hdGNoCiEgbWF0 Y2hfa2V5d29yZF9hcmcgKGdmY19hY3R1YWxfYXJnbGlzdCAqYWN0dWFsLCBn ZmNfYWN0dWFsX2FyZ2xpc3QgKmJhc2UpCiAgewogICAgY2hhciBuYW1lW0dG Q19NQVhfU1lNQk9MX0xFTiArIDFdOwogICAgZ2ZjX2FjdHVhbF9hcmdsaXN0 ICphOwotLS0gMTYwOSwxNjE4IC0tLS0KICB9CiAgCiAgCiEgLyogTWF0Y2gg YSBrZXl3b3JkIGFyZ3VtZW50IG9yIHR5cGUgcGFyYW1ldGVyIHNwZWMgbGlz dC4uICAqLwogIAogIHN0YXRpYyBtYXRjaAohIG1hdGNoX2tleXdvcmRfYXJn IChnZmNfYWN0dWFsX2FyZ2xpc3QgKmFjdHVhbCwgZ2ZjX2FjdHVhbF9hcmds aXN0ICpiYXNlLCBib29sIHBkdCkKICB7CiAgICBjaGFyIG5hbWVbR0ZDX01B WF9TWU1CT0xfTEVOICsgMV07CiAgICBnZmNfYWN0dWFsX2FyZ2xpc3QgKmE7 CioqKioqKioqKioqKioqKiBtYXRjaF9rZXl3b3JkX2FyZyAoZ2ZjX2FjdHVh bF9hcmdsaXN0ICphCioqKiAxNjMwLDE2NDEgKioqKgogICAgICAgIGdvdG8g Y2xlYW51cDsKICAgICAgfQogIAogICAgbSA9IG1hdGNoX2FjdHVhbF9hcmcg KCZhY3R1YWwtPmV4cHIpOwogICAgaWYgKG0gIT0gTUFUQ0hfWUVTKQogICAg ICBnb3RvIGNsZWFudXA7CiAgCiAgICAvKiBNYWtlIHN1cmUgdGhpcyBuYW1l IGhhcyBub3QgYXBwZWFyZWQgeWV0LiAgKi8KISAKICAgIGlmIChuYW1lWzBd ICE9ICdcMCcpCiAgICAgIHsKICAgICAgICBmb3IgKGEgPSBiYXNlOyBhOyBh ID0gYS0+bmV4dCkKLS0tIDE2MzAsMTY1NyAtLS0tCiAgICAgICAgZ290byBj bGVhbnVwOwogICAgICB9CiAgCisgICBpZiAocGR0KQorICAgICB7CisgICAg ICAgaWYgKGdmY19tYXRjaF9jaGFyICgnKicpID09IE1BVENIX1lFUykKKyAJ eworIAkgIGFjdHVhbC0+c3BlY190eXBlID0gU1BFQ19BU1NVTUVEOworIAkg IGdvdG8gYWRkX25hbWU7CisgCX0KKyAgICAgICBlbHNlIGlmIChnZmNfbWF0 Y2hfY2hhciAoJzonKSA9PSBNQVRDSF9ZRVMpCisgCXsKKyAJICBhY3R1YWwt PnNwZWNfdHlwZSA9IFNQRUNfREVGRVJSRUQ7CisgCSAgZ290byBhZGRfbmFt ZTsKKyAJfQorICAgICAgIGVsc2UKKyAJYWN0dWFsLT5zcGVjX3R5cGUgPSBT UEVDX0VYUExJQ0lUOworICAgICB9CisgCiAgICBtID0gbWF0Y2hfYWN0dWFs X2FyZyAoJmFjdHVhbC0+ZXhwcik7CiAgICBpZiAobSAhPSBNQVRDSF9ZRVMp CiAgICAgIGdvdG8gY2xlYW51cDsKICAKICAgIC8qIE1ha2Ugc3VyZSB0aGlz IG5hbWUgaGFzIG5vdCBhcHBlYXJlZCB5ZXQuICAqLwohIGFkZF9uYW1lOgog ICAgaWYgKG5hbWVbMF0gIT0gJ1wwJykKICAgICAgewogICAgICAgIGZvciAo YSA9IGJhc2U7IGE7IGEgPSBhLT5uZXh0KQoqKioqKioqKioqKioqKiogY2xl YW51cDoKKioqIDE3MzcsMTc0NiAqKioqCiAgICAgbGlzdCBpcyBhc3N1bWVk IHRvIGFsbG93IGtleXdvcmQgYXJndW1lbnRzIGJlY2F1c2Ugd2UgZG9uJ3Qg a25vdyBpZgogICAgIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBw cm9jZWR1cmUgaGFzIGFuIGltcGxpY2l0IGludGVyZmFjZQogICAgIG9yIG5v dC4gIFdlIG1ha2Ugc3VyZSBrZXl3b3JkcyBhcmUgdW5pcXVlLiBJZiBzdWJf ZmxhZyBpcyBzZXQsCiEgICAgd2UncmUgbWF0Y2hpbmcgdGhlIGFyZ3VtZW50 IGxpc3Qgb2YgYSBzdWJyb3V0aW5lLiAgKi8KICAKICBtYXRjaAohIGdmY19t YXRjaF9hY3R1YWxfYXJnbGlzdCAoaW50IHN1Yl9mbGFnLCBnZmNfYWN0dWFs X2FyZ2xpc3QgKiphcmdwKQogIHsKICAgIGdmY19hY3R1YWxfYXJnbGlzdCAq aGVhZCwgKnRhaWw7CiAgICBpbnQgc2Vlbl9rZXl3b3JkOwotLS0gMTc1Mywx NzY3IC0tLS0KICAgICBsaXN0IGlzIGFzc3VtZWQgdG8gYWxsb3cga2V5d29y ZCBhcmd1bWVudHMgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmCiAgICAgdGhl IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2NlZHVyZSBoYXMgYW4g aW1wbGljaXQgaW50ZXJmYWNlCiAgICAgb3Igbm90LiAgV2UgbWFrZSBzdXJl IGtleXdvcmRzIGFyZSB1bmlxdWUuIElmIHN1Yl9mbGFnIGlzIHNldCwKISAg ICB3ZSdyZSBtYXRjaGluZyB0aGUgYXJndW1lbnQgbGlzdCBvZiBhIHN1YnJv dXRpbmUuCiEgCiEgICAgTk9URTogQW4gYWx0ZXJuYXRpdmUgdXNlIGZvciB0 aGlzIGZ1bmN0aW9uIGlzIHRvIG1hdGNoIHR5cGUgcGFyYW1ldGVyCiEgICAg c3BlYyBsaXN0cywgd2hpY2ggYXJlIHNvIHNpbWlsYXIgdG8gYWN0dWFsIGFy Z3VtZW50IGxpc3RzIHRoYXQgdGhlCiEgICAgbWFjaGluZXJ5IGNhbiBiZSBy ZXVzZWQuIFRoaXMgdXNlIGlzIGZsYWdnZWQgYnkgdGhlIG9wdGlvbmFsIGFy Z3VtZW50CiEgICAgJ3BkdCcuICAqLwogIAogIG1hdGNoCiEgZ2ZjX21hdGNo X2FjdHVhbF9hcmdsaXN0IChpbnQgc3ViX2ZsYWcsIGdmY19hY3R1YWxfYXJn bGlzdCAqKmFyZ3AsIGJvb2wgcGR0KQogIHsKICAgIGdmY19hY3R1YWxfYXJn bGlzdCAqaGVhZCwgKnRhaWw7CiAgICBpbnQgc2Vlbl9rZXl3b3JkOwoqKioq KioqKioqKioqKiogZ2ZjX21hdGNoX2FjdHVhbF9hcmdsaXN0IChpbnQgc3Vi X2ZsYWcsCioqKiAxNzU4LDE3NjMgKioqKgotLS0gMTc3OSwxNzg1IC0tLS0K ICAKICAgIGlmIChnZmNfbWF0Y2hfY2hhciAoJyknKSA9PSBNQVRDSF9ZRVMp CiAgICAgIHJldHVybiBNQVRDSF9ZRVM7CisgCiAgICBoZWFkID0gTlVMTDsK ICAKICAgIG1hdGNoaW5nX2FjdHVhbF9hcmdsaXN0Kys7CioqKioqKioqKioq KioqKiBnZmNfbWF0Y2hfYWN0dWFsX2FyZ2xpc3QgKGludCBzdWJfZmxhZywK KioqIDE3NzIsMTc3OSAqKioqCiAgCSAgdGFpbCA9IHRhaWwtPm5leHQ7CiAg CX0KICAKISAgICAgICBpZiAoc3ViX2ZsYWcgJiYgZ2ZjX21hdGNoX2NoYXIg KCcqJykgPT0gTUFUQ0hfWUVTKQogIAl7CiAgCSAgbSA9IGdmY19tYXRjaF9z dF9sYWJlbCAoJmxhYmVsKTsKICAJICBpZiAobSA9PSBNQVRDSF9OTykKICAJ ICAgIGdmY19lcnJvciAoIkV4cGVjdGVkIGFsdGVybmF0ZSByZXR1cm4gbGFi ZWwgYXQgJUMiKTsKLS0tIDE3OTQsMTgwNiAtLS0tCiAgCSAgdGFpbCA9IHRh aWwtPm5leHQ7CiAgCX0KICAKISAgICAgICBpZiAoc3ViX2ZsYWcgJiYgIXBk dCAmJiBnZmNfbWF0Y2hfY2hhciAoJyonKSA9PSBNQVRDSF9ZRVMpCiAgCXsK KyAJICBpZiAocGR0KQorIAkgICAgeworIAkgICAgICB0YWlsLT5zcGVjX3R5 cGUgPSBTUEVDX0FTU1VNRUQ7CisgCSAgICAgIGdvdG8gbmV4dDsKKyAJICAg IH0KICAJICBtID0gZ2ZjX21hdGNoX3N0X2xhYmVsICgmbGFiZWwpOwogIAkg IGlmIChtID09IE1BVENIX05PKQogIAkgICAgZ2ZjX2Vycm9yICgiRXhwZWN0 ZWQgYWx0ZXJuYXRlIHJldHVybiBsYWJlbCBhdCAlQyIpOwoqKioqKioqKioq KioqKiogZ2ZjX21hdGNoX2FjdHVhbF9hcmdsaXN0IChpbnQgc3ViX2ZsYWcs CioqKiAxNzg4LDE3OTggKioqKgogIAkgIGdvdG8gbmV4dDsKICAJfQogIAog ICAgICAgIC8qIEFmdGVyIHRoZSBmaXJzdCBrZXl3b3JkIGFyZ3VtZW50IGlz IHNlZW4sIHRoZSBmb2xsb3dpbmcKICAJIGFyZ3VtZW50cyBtdXN0IGFsc28g aGF2ZSBrZXl3b3Jkcy4gICovCiAgICAgICAgaWYgKHNlZW5fa2V5d29yZCkK ICAJewohIAkgIG0gPSBtYXRjaF9rZXl3b3JkX2FyZyAodGFpbCwgaGVhZCk7 CiAgCiAgCSAgaWYgKG0gPT0gTUFUQ0hfRVJST1IpCiAgCSAgICBnb3RvIGNs ZWFudXA7Ci0tLSAxODE1LDE4NDEgLS0tLQogIAkgIGdvdG8gbmV4dDsKICAJ fQogIAorICAgICAgIGlmIChwZHQgJiYgIXNlZW5fa2V5d29yZCkKKyAJewor IAkgIGlmIChnZmNfbWF0Y2hfY2hhciAoJzonKSA9PSBNQVRDSF9ZRVMpCisg CSAgICB7CisgCSAgICAgIHRhaWwtPnNwZWNfdHlwZSA9IFNQRUNfREVGRVJS RUQ7CisgCSAgICAgIGdvdG8gbmV4dDsKKyAJICAgIH0KKyAJICBlbHNlIGlm IChnZmNfbWF0Y2hfY2hhciAoJyonKSA9PSBNQVRDSF9ZRVMpCisgCSAgICB7 CisgCSAgICAgIHRhaWwtPnNwZWNfdHlwZSA9IFNQRUNfQVNTVU1FRDsKKyAJ ICAgICAgZ290byBuZXh0OworIAkgICAgfQorIAkgIGVsc2UKKyAJICAgIHRh aWwtPnNwZWNfdHlwZSA9IFNQRUNfRVhQTElDSVQ7CisgCX0KKyAKICAgICAg ICAvKiBBZnRlciB0aGUgZmlyc3Qga2V5d29yZCBhcmd1bWVudCBpcyBzZWVu LCB0aGUgZm9sbG93aW5nCiAgCSBhcmd1bWVudHMgbXVzdCBhbHNvIGhhdmUg a2V5d29yZHMuICAqLwogICAgICAgIGlmIChzZWVuX2tleXdvcmQpCiAgCXsK ISAJICBtID0gbWF0Y2hfa2V5d29yZF9hcmcgKHRhaWwsIGhlYWQsIHBkdCk7 CiAgCiAgCSAgaWYgKG0gPT0gTUFUQ0hfRVJST1IpCiAgCSAgICBnb3RvIGNs ZWFudXA7CioqKioqKioqKioqKioqKiBnZmNfbWF0Y2hfYWN0dWFsX2FyZ2xp c3QgKGludCBzdWJfZmxhZywKKioqIDE4MTMsMTgxOSAqKioqCiAgCSAgLyog U2VlIGlmIHdlIGhhdmUgdGhlIGZpcnN0IGtleXdvcmQgYXJndW1lbnQuICAq LwogIAkgIGlmIChtID09IE1BVENIX05PKQogIAkgICAgewohIAkgICAgICBt ID0gbWF0Y2hfa2V5d29yZF9hcmcgKHRhaWwsIGhlYWQpOwogIAkgICAgICBp ZiAobSA9PSBNQVRDSF9ZRVMpCiAgCQlzZWVuX2tleXdvcmQgPSAxOwogIAkg ICAgICBpZiAobSA9PSBNQVRDSF9FUlJPUikKLS0tIDE4NTYsMTg2MiAtLS0t CiAgCSAgLyogU2VlIGlmIHdlIGhhdmUgdGhlIGZpcnN0IGtleXdvcmQgYXJn dW1lbnQuICAqLwogIAkgIGlmIChtID09IE1BVENIX05PKQogIAkgICAgewoh IAkgICAgICBtID0gbWF0Y2hfa2V5d29yZF9hcmcgKHRhaWwsIGhlYWQsIGZh bHNlKTsKICAJICAgICAgaWYgKG0gPT0gTUFUQ0hfWUVTKQogIAkJc2Vlbl9r ZXl3b3JkID0gMTsKICAJICAgICAgaWYgKG0gPT0gTUFUQ0hfRVJST1IpCioq KioqKioqKioqKioqKiBnZmNfbWF0Y2hfc3RydWN0dXJlX2NvbnN0cnVjdG9y IChnZmNfc3ltCioqKiAyOTQ4LDI5NTQgKioqKgogICAgICAgZXhwcmVzc2lv biBoZXJlLiAgKi8KICAgIGlmIChnZmNfaW5fbWF0Y2hfZGF0YSAoKSkKICAg ICAgZ2ZjX3JlZHVjZV9pbml0X2V4cHIgKGUpOwohICAKICAgICpyZXN1bHQg PSBlOwogICAgcmV0dXJuIE1BVENIX1lFUzsKICB9Ci0tLSAyOTkxLDI5OTcg LS0tLQogICAgICAgZXhwcmVzc2lvbiBoZXJlLiAgKi8KICAgIGlmIChnZmNf aW5fbWF0Y2hfZGF0YSAoKSkKICAgICAgZ2ZjX3JlZHVjZV9pbml0X2V4cHIg KGUpOwohIAogICAgKnJlc3VsdCA9IGU7CiAgICByZXR1cm4gTUFUQ0hfWUVT OwogIH0KKioqKioqKioqKioqKioqIG1hdGNoX3ZhcmlhYmxlIChnZmNfZXhw ciAqKnJlc3VsdCwgaW50IGUKKioqIDM2NjIsMzY2OCAqKioqCiAgCWltcGxp Y2l0X25zID0gZ2ZjX2N1cnJlbnRfbnM7CiAgICAgICAgZWxzZQogIAlpbXBs aWNpdF9ucyA9IHN5bS0+bnM7CiEgCQogICAgICAgIG9sZF9sb2MgPSBnZmNf Y3VycmVudF9sb2N1czsKICAgICAgICBpZiAoZ2ZjX21hdGNoX21lbWJlcl9z ZXAgKHN5bSkgPT0gTUFUQ0hfWUVTCiAgCSAgJiYgc3ltLT50cy50eXBlID09 IEJUX1VOS05PV04KLS0tIDM3MDUsMzcxMSAtLS0tCiAgCWltcGxpY2l0X25z ID0gZ2ZjX2N1cnJlbnRfbnM7CiAgICAgICAgZWxzZQogIAlpbXBsaWNpdF9u cyA9IHN5bS0+bnM7CiEgCiAgICAgICAgb2xkX2xvYyA9IGdmY19jdXJyZW50 X2xvY3VzOwogICAgICAgIGlmIChnZmNfbWF0Y2hfbWVtYmVyX3NlcCAoc3lt KSA9PSBNQVRDSF9ZRVMKICAJICAmJiBzeW0tPnRzLnR5cGUgPT0gQlRfVU5L Tk9XTgpJbmRleDogZ2NjL2ZvcnRyYW4vcmVzb2x2ZS5jCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KKioqIGdjYy9mb3J0cmFuL3Jlc29sdmUuYwkocmV2aXNp b24gMjUxNTQ2KQotLS0gZ2NjL2ZvcnRyYW4vcmVzb2x2ZS5jCSh3b3JraW5n IGNvcHkpCioqKioqKioqKioqKioqKiByZXNvbHZlX2NvbnRhaW5lZF9mdW5j dGlvbnMgKGdmY19uYW1lc3BhCioqKiAxMTMwLDExMzUgKioqKgotLS0gMTEz MCwxMjE4IC0tLS0KICB9CiAgCiAgCisgCisgLyogQSBQYXJhbWV0ZXJpemVk IERlcml2ZWQgVHlwZSBjb25zdHJ1Y3RvciBtdXN0IGNvbnRhaW4gdmFsdWVz IGZvcgorICAgIHRoZSBQRFQgS0lORCBwYXJhbWV0ZXJzIG9yIHRoZXkgbXVz dCBoYXZlIGEgZGVmYXVsdCBpbml0aWFsaXplci4KKyAgICBHbyB0aHJvdWdo IHRoZSBjb25zdHJ1Y3RvciBwaWNraW5nIG91dCB0aGUgS0lORCBleHByZXNz aW9ucywKKyAgICBzdG9yaW5nIHRoZW0gaW4gJ3BhcmFtX2xpc3QnIGFuZCB0 aGVuIGNhbGwgZ2ZjX2dldF9wZHRfaW5zdGFuY2UKKyAgICB0byBvYnRhaW4g dGhlIFBEVCBpbnN0YW5jZS4gICovCisgCisgc3RhdGljIGdmY19hY3R1YWxf YXJnbGlzdCAqcGFyYW1fbGlzdCwgKnBhcmFtX3RhaWwsICpwYXJhbTsKKyAK KyBzdGF0aWMgYm9vbAorIGdldF9wZHRfc3BlY19leHByIChnZmNfY29tcG9u ZW50ICpjLCBnZmNfZXhwciAqZXhwcikKKyB7CisgICBwYXJhbSA9IGdmY19n ZXRfYWN0dWFsX2FyZ2xpc3QgKCk7CisgICBpZiAoIXBhcmFtX2xpc3QpCisg ICAgIHBhcmFtX2xpc3QgPSBwYXJhbV90YWlsID0gcGFyYW07CisgICBlbHNl CisgICAgIHsKKyAgICAgICBwYXJhbV90YWlsLT5uZXh0ID0gcGFyYW07Cisg ICAgICAgcGFyYW1fdGFpbCA9IHBhcmFtX3RhaWwtPm5leHQ7CisgICAgIH0K KyAKKyAgIHBhcmFtX3RhaWwtPm5hbWUgPSBjLT5uYW1lOworICAgaWYgKGV4 cHIpCisgICAgIHBhcmFtX3RhaWwtPmV4cHIgPSBnZmNfY29weV9leHByIChl eHByKTsKKyAgIGVsc2UgaWYgKGMtPmluaXRpYWxpemVyKQorICAgICBwYXJh bV90YWlsLT5leHByID0gZ2ZjX2NvcHlfZXhwciAoYy0+aW5pdGlhbGl6ZXIp OworICAgZWxzZQorICAgICB7CisgICAgICAgcGFyYW1fdGFpbC0+c3BlY190 eXBlID0gU1BFQ19BU1NVTUVEOworICAgICAgIGlmIChjLT5hdHRyLnBkdF9r aW5kKQorIAl7CisgCSAgZ2ZjX2Vycm9yICgiVGhlIEtJTkQgcGFyYW1ldGVy IGluIHRoZSBQRFQgY29uc3RydWN0b3IgIgorIAkJICAgICAiYXQgJUMgaGFz IG5vIHZhbHVlIik7CisgCSAgcmV0dXJuIGZhbHNlOworIAl9CisgICAgIH0K KyAKKyAgIHJldHVybiB0cnVlOworIH0KKyAKKyBzdGF0aWMgYm9vbAorIGdl dF9wZHRfY29uc3RydWN0b3IgKGdmY19leHByICpleHByLCBnZmNfY29uc3Ry dWN0b3IgKipjb25zdHIsCisgCQkgICAgIGdmY19zeW1ib2wgKmRlcml2ZWQp CisgeworICAgZ2ZjX2NvbnN0cnVjdG9yICpjb25zOworICAgZ2ZjX2NvbXBv bmVudCAqY29tcDsKKyAgIGJvb2wgdCA9IHRydWU7CisgCisgICBpZiAoZXhw ciAmJiBleHByLT5leHByX3R5cGUgPT0gRVhQUl9TVFJVQ1RVUkUpCisgICAg IGNvbnMgPSBnZmNfY29uc3RydWN0b3JfZmlyc3QgKGV4cHItPnZhbHVlLmNv bnN0cnVjdG9yKTsKKyAgIGVsc2UgaWYgKGNvbnN0cikKKyAgICAgY29ucyA9 ICpjb25zdHI7CisgICBnY2NfYXNzZXJ0IChjb25zKTsKKyAKKyAgIGNvbXAg PSBkZXJpdmVkLT5jb21wb25lbnRzOworIAorICAgZm9yICg7IGNvbXAgJiYg Y29uczsgY29tcCA9IGNvbXAtPm5leHQsIGNvbnMgPSBnZmNfY29uc3RydWN0 b3JfbmV4dCAoY29ucykpCisgICAgIHsKKyAgICAgICBpZiAoY29ucy0+ZXhw ci0+ZXhwcl90eXBlID09IEVYUFJfU1RSVUNUVVJFCisgCSAgJiYgY29tcC0+ dHMudHlwZSA9PSBCVF9ERVJJVkVEKQorIAl7CisgCSAgdCA9IGdldF9wZHRf Y29uc3RydWN0b3IgKGNvbnMtPmV4cHIsIE5VTEwsIGNvbXAtPnRzLnUuZGVy aXZlZCk7CisgCSAgaWYgKCF0KQorIAkgICAgcmV0dXJuIHQ7CisgCX0KKyAg ICAgICBlbHNlIGlmIChjb21wLT50cy50eXBlID09IEJUX0RFUklWRUQpCisg CXsKKyAJICB0ID0gZ2V0X3BkdF9jb25zdHJ1Y3RvciAoTlVMTCwgJmNvbnMs IGNvbXAtPnRzLnUuZGVyaXZlZCk7CisgCSAgaWYgKCF0KQorIAkgICAgcmV0 dXJuIHQ7CisgCX0KKyAgICAgIGVsc2UgaWYgKChjb21wLT5hdHRyLnBkdF9r aW5kIHx8IGNvbXAtPmF0dHIucGR0X2xlbikKKyAJICAgICAgICYmIGRlcml2 ZWQtPmF0dHIucGR0X3RlbXBsYXRlKQorIAl7CisgCSAgdCA9IGdldF9wZHRf c3BlY19leHByIChjb21wLCBjb25zLT5leHByKTsKKyAJICBpZiAoIXQpCisg CSAgICByZXR1cm4gdDsKKyAJfQorICAgICB9CisgICByZXR1cm4gdDsKKyB9 CisgCisgCiAgc3RhdGljIGJvb2wgcmVzb2x2ZV9mbF9kZXJpdmVkMCAoZ2Zj X3N5bWJvbCAqc3ltKTsKICBzdGF0aWMgYm9vbCByZXNvbHZlX2ZsX3N0cnVj dCAoZ2ZjX3N5bWJvbCAqc3ltKTsKICAKKioqKioqKioqKioqKioqIHJlc29s dmVfc3RydWN0dXJlX2NvbnMgKGdmY19leHByICpleHByLAoqKiogMTE1NCwx MTU5ICoqKioKLS0tIDEyMzcsMTI2MSAtLS0tCiAgICAgICAgICByZXNvbHZl X2ZsX2Rlcml2ZWQwIChleHByLT50cy51LmRlcml2ZWQpOwogICAgICAgIGVs c2UKICAgICAgICAgIHJlc29sdmVfZmxfc3RydWN0IChleHByLT50cy51LmRl cml2ZWQpOworIAorICAgICAgIC8qIElmIHRoaXMgaXMgYSBQYXJhbWV0ZXJp emVkIERlcml2ZWQgVHlwZSB0ZW1wbGF0ZSwgZmluZCB0aGUKKyAJIGluc3Rh bmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFBEVCBraW5kIHBhcmFtZXRlcnMu ICAqLworICAgICAgIGlmIChleHByLT50cy51LmRlcml2ZWQtPmF0dHIucGR0 X3RlbXBsYXRlKQorIAl7CisgCSAgcGFyYW1fbGlzdCA9IE5VTEw7CisgCSAg dCA9IGdldF9wZHRfY29uc3RydWN0b3IgKGV4cHIsIE5VTEwsIGV4cHItPnRz LnUuZGVyaXZlZCk7CisgCSAgaWYgKCF0KQorIAkgICAgcmV0dXJuIHQ7Cisg CSAgZ2ZjX2dldF9wZHRfaW5zdGFuY2UgKHBhcmFtX2xpc3QsICZleHByLT50 cy51LmRlcml2ZWQsIE5VTEwpOworIAorIAkgIGV4cHItPnBhcmFtX2xpc3Qg PSBnZmNfY29weV9hY3R1YWxfYXJnbGlzdCAocGFyYW1fbGlzdCk7CisgCisg CSAgaWYgKHBhcmFtX2xpc3QpCisgCSAgICBnZmNfZnJlZV9hY3R1YWxfYXJn bGlzdCAocGFyYW1fbGlzdCk7CisgCisgCSAgaWYgKCFleHByLT50cy51LmRl cml2ZWQtPmF0dHIucGR0X3R5cGUpCisgCSAgICByZXR1cm4gZmFsc2U7Cisg CX0KICAgICAgfQogIAogICAgY29ucyA9IGdmY19jb25zdHJ1Y3Rvcl9maXJz dCAoZXhwci0+dmFsdWUuY29uc3RydWN0b3IpOwoqKioqKioqKioqKioqKiog cmVzb2x2ZV9jb21wb25lbnQgKGdmY19jb21wb25lbnQgKmMsIGdmYwoqKiog MTM1NDcsMTM1NTMgKioqKgogICAgICB9CiAgCiAgICAvKiBBZGQgdGhlIGhp ZGRlbiBkZWZlcnJlZCBsZW5ndGggZmllbGQuICAqLwohICAgaWYgKGMtPnRz LnR5cGUgPT0gQlRfQ0hBUkFDVEVSICYmIGMtPnRzLmRlZmVycmVkICYmICFj LT5hdHRyLmZ1bmN0aW9uCiAgICAgICAgJiYgIXN5bS0+YXR0ci5pc19jbGFz cykKICAgICAgewogICAgICAgIGNoYXIgbmFtZVtHRkNfTUFYX1NZTUJPTF9M RU4rOV07Ci0tLSAxMzY0OSwxMzY1NyAtLS0tCiAgICAgIH0KICAKICAgIC8q IEFkZCB0aGUgaGlkZGVuIGRlZmVycmVkIGxlbmd0aCBmaWVsZC4gICovCiEg ICBpZiAoYy0+dHMudHlwZSA9PSBCVF9DSEFSQUNURVIKISAgICAgICAmJiAo Yy0+dHMuZGVmZXJyZWQgfHwgYy0+YXR0ci5wZHRfc3RyaW5nKQohICAgICAg ICYmICFjLT5hdHRyLmZ1bmN0aW9uCiAgICAgICAgJiYgIXN5bS0+YXR0ci5p c19jbGFzcykKICAgICAgewogICAgICAgIGNoYXIgbmFtZVtHRkNfTUFYX1NZ TUJPTF9MRU4rOV07CioqKioqKioqKioqKioqKiByZXNvbHZlX2NvbXBvbmVu dCAoZ2ZjX2NvbXBvbmVudCAqYywgZ2ZjCioqKiAxMzY0NywxMzY1MiAqKioq Ci0tLSAxMzc1MSwxMzc1NyAtLS0tCiAgICAgIHJldHVybiBmYWxzZTsKICAK ICAgIGlmIChjLT5pbml0aWFsaXplciAmJiAhc3ltLT5hdHRyLnZ0eXBlCisg ICAgICAgJiYgIWMtPmF0dHIucGR0X2tpbmQgJiYgIWMtPmF0dHIucGR0X2xl bgogICAgICAgICYmICFnZmNfY2hlY2tfYXNzaWduX3N5bWJvbCAoc3ltLCBj LCBjLT5pbml0aWFsaXplcikpCiAgICAgIHJldHVybiBmYWxzZTsKICAKKioq KioqKioqKioqKioqIHJlc29sdmVfc3ltYm9sIChnZmNfc3ltYm9sICpzeW0p CioqKiAxNDI3NiwxNDI4MSAqKioqCi0tLSAxNDM4MSwxNDM5NSAtLS0tCiAg ICAgICAgcmV0dXJuOwogICAgICB9CiAgCisgICBpZiAoc3ltLT5hdHRyLmR1 bW15ICYmIHN5bS0+dHMudHlwZSA9PSBCVF9ERVJJVkVECisgICAgICAgJiYg c3ltLT50cy51LmRlcml2ZWQtPmF0dHIucGR0X3R5cGUKKyAgICAgICAmJiBn ZmNfc3BlY19saXN0X3R5cGUgKHN5bS0+cGFyYW1fbGlzdCwgTlVMTCkgPT0g U1BFQ19ERUZFUlJFRCkKKyAgICAgeworICAgICAgIGdmY19lcnJvciAoIiVx cyBhdCAlTCBjYW5ub3QgaGF2ZSBERUZFUlJFRCB0eXBlIHBhcmFtZXRlcnMg YmVjYXVzZSAiCisgCQkgIml0IGlzIGEgZHVtbXkgYXJndW1lbnQiLCBzeW0t Pm5hbWUsICZzeW0tPmRlY2xhcmVkX2F0KTsKKyAgICAgICByZXR1cm47Cisg ICAgIH0KKyAKICAgIGlmIChzeW0tPmF0dHIudmFsdWUgJiYgc3ltLT50cy50 eXBlID09IEJUX0NIQVJBQ1RFUikKICAgICAgewogICAgICAgIGdmY19jaGFy bGVuICpjbCA9IHN5bS0+dHMudS5jbDsKSW5kZXg6IGdjYy9mb3J0cmFuL3N5 bWJvbC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy9mb3J0cmFu L3N5bWJvbC5jCShyZXZpc2lvbiAyNTE1NDYpCi0tLSBnY2MvZm9ydHJhbi9z eW1ib2wuYwkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogZ2ZjX2Fk ZF9vcHRpb25hbCAoc3ltYm9sX2F0dHJpYnV0ZSAqYXR0cgoqKiogMTEwNiwx MTExICoqKioKLS0tIDExMDYsMTEzNyAtLS0tCiAgICByZXR1cm4gY2hlY2tf Y29uZmxpY3QgKGF0dHIsIE5VTEwsIHdoZXJlKTsKICB9CiAgCisgYm9vbAor IGdmY19hZGRfa2luZCAoc3ltYm9sX2F0dHJpYnV0ZSAqYXR0ciwgbG9jdXMg KndoZXJlKQorIHsKKyAgIGlmIChhdHRyLT5wZHRfa2luZCkKKyAgICAgewor ICAgICAgIGR1cGxpY2F0ZV9hdHRyICgiS0lORCIsIHdoZXJlKTsKKyAgICAg ICByZXR1cm4gZmFsc2U7CisgICAgIH0KKyAKKyAgIGF0dHItPnBkdF9raW5k ID0gMTsKKyAgIHJldHVybiBjaGVja19jb25mbGljdCAoYXR0ciwgTlVMTCwg d2hlcmUpOworIH0KKyAKKyBib29sCisgZ2ZjX2FkZF9sZW4gKHN5bWJvbF9h dHRyaWJ1dGUgKmF0dHIsIGxvY3VzICp3aGVyZSkKKyB7CisgICBpZiAoYXR0 ci0+cGR0X2xlbikKKyAgICAgeworICAgICAgIGR1cGxpY2F0ZV9hdHRyICgi TEVOIiwgd2hlcmUpOworICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgfQor IAorICAgYXR0ci0+cGR0X2xlbiA9IDE7CisgICByZXR1cm4gY2hlY2tfY29u ZmxpY3QgKGF0dHIsIE5VTEwsIHdoZXJlKTsKKyB9CisgCiAgCiAgYm9vbAog IGdmY19hZGRfcG9pbnRlciAoc3ltYm9sX2F0dHJpYnV0ZSAqYXR0ciwgbG9j dXMgKndoZXJlKQoqKioqKioqKioqKioqKiogZnJlZV9jb21wb25lbnRzIChn ZmNfY29tcG9uZW50ICpwKQoqKiogMjQ0NywyNDUyICoqKioKLS0tIDI0NzMs MjQ4MiAtLS0tCiAgCiAgICAgICAgZ2ZjX2ZyZWVfYXJyYXlfc3BlYyAocC0+ YXMpOwogICAgICAgIGdmY19mcmVlX2V4cHIgKHAtPmluaXRpYWxpemVyKTsK KyAgICAgICBpZiAocC0+a2luZF9leHByKQorIAlnZmNfZnJlZV9leHByIChw LT5raW5kX2V4cHIpOworICAgICAgIGlmIChwLT5wYXJhbV9saXN0KQorIAln ZmNfZnJlZV9hY3R1YWxfYXJnbGlzdCAocC0+cGFyYW1fbGlzdCk7CiAgICAg ICAgZnJlZSAocC0+dGIpOwogIAogICAgICAgIGZyZWUgKHApOwoqKioqKioq KioqKioqKiogZ2ZjX2ZyZWVfc3ltYm9sIChnZmNfc3ltYm9sICpzeW0pCioq KiAyOTI5LDI5MzQgKioqKgotLS0gMjk1OSwyOTY3IC0tLS0KICAKICAgIHNl dF9zeW1ib2xfY29tbW9uX2Jsb2NrIChzeW0sIE5VTEwpOwogIAorICAgaWYg KHN5bS0+cGFyYW1fbGlzdCkKKyAgICAgZ2ZjX2ZyZWVfYWN0dWFsX2FyZ2xp c3QgKHN5bS0+cGFyYW1fbGlzdCk7CisgCiAgICBmcmVlIChzeW0pOwogIH0K ICAKKioqKioqKioqKioqKioqIGdmY19maW5kX3N5bV90cmVlIChjb25zdCBj aGFyICpuYW1lLCBnZmMKKioqIDMwOTEsMzA5NyAqKioqCi0tLSAzMTI0LDMx NDggLS0tLQogICAgICB9CiAgICB3aGlsZSAobnMgIT0gTlVMTCk7CiAgCisg ICBpZiAoZ2ZjX2N1cnJlbnRfc3RhdGUoKSA9PSBDT01QX0RFUklWRUQKKyAg ICAgICAmJiBnZmNfY3VycmVudF9ibG9jayAoKS0+YXR0ci5wZHRfdGVtcGxh dGUpCisgICAgIHsKKyAgICAgICBnZmNfc3ltYm9sICpkZXIgPSBnZmNfY3Vy cmVudF9ibG9jayAoKTsKKyAgICAgICBmb3IgKDsgZGVyOyBkZXIgPSBnZmNf Z2V0X2Rlcml2ZWRfc3VwZXJfdHlwZSAoZGVyKSkKKyAJeworIAkgIGlmIChk ZXItPmYya19kZXJpdmVkICYmIGRlci0+ZjJrX2Rlcml2ZWQtPnN5bV9yb290 KQorIAkgICAgeworIAkgICAgICBzdCA9IGdmY19maW5kX3N5bXRyZWUgKGRl ci0+ZjJrX2Rlcml2ZWQtPnN5bV9yb290LCBuYW1lKTsKKyAJICAgICAgaWYg KHN0KQorIAkJYnJlYWs7CisgCSAgICB9CisgCX0KKyAgICAgICAqcmVzdWx0 ID0gc3Q7CisgICAgICAgcmV0dXJuIDA7CisgICAgIH0KKyAKICAgICpyZXN1 bHQgPSBOVUxMOworIAogICAgcmV0dXJuIDA7CiAgfQogIAoqKioqKioqKioq KioqKiogZ2ZjX2ZyZWVfbmFtZXNwYWNlIChnZmNfbmFtZXNwYWNlICpucykK KioqIDM4OTAsMzg5NSAqKioqCi0tLSAzOTQxLDM5NDcgLS0tLQogICAgbnMt PnJlZnMtLTsKICAgIGlmIChucy0+cmVmcyA+IDApCiAgICAgIHJldHVybjsK KyAKICAgIGdjY19hc3NlcnQgKG5zLT5yZWZzID09IDApOwogIAogICAgZ2Zj X2ZyZWVfc3RhdGVtZW50cyAobnMtPmNvZGUpOwpJbmRleDogZ2NjL2ZvcnRy YW4vdHJhbnMtYXJyYXkuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiBn Y2MvZm9ydHJhbi90cmFucy1hcnJheS5jCShyZXZpc2lvbiAyNTE1NDYpCi0t LSBnY2MvZm9ydHJhbi90cmFucy1hcnJheS5jCSh3b3JraW5nIGNvcHkpCioq KioqKioqKioqKioqKiBnZmNfY2FmX2lzX2RlYWxsb2Nfb25seSAoaW50IGNh Zl9tb2RlKQoqKiogODA3Myw4MDc5ICoqKioKICAgICBmdW5jdGlvbiBmb3Ig dGhlIGZ1bmN0aW9ucyBuYW1lZCBpbiB0aGlzIGVudW0uICAqLwogIAogIGVu dW0ge0RFQUxMT0NBVEVfQUxMT0NfQ09NUCA9IDEsIE5VTExJRllfQUxMT0Nf Q09NUCwKISAgICAgICBDT1BZX0FMTE9DX0NPTVAsIENPUFlfT05MWV9BTExP Q19DT01QLCBSRUFTU0lHTl9DQUZfQ09NUH07CiAgCiAgc3RhdGljIHRyZWUK ICBzdHJ1Y3R1cmVfYWxsb2NfY29tcHMgKGdmY19zeW1ib2wgKiBkZXJfdHlw ZSwgdHJlZSBkZWNsLAotLS0gODA3Myw4MDgyIC0tLS0KICAgICBmdW5jdGlv biBmb3IgdGhlIGZ1bmN0aW9ucyBuYW1lZCBpbiB0aGlzIGVudW0uICAqLwog IAogIGVudW0ge0RFQUxMT0NBVEVfQUxMT0NfQ09NUCA9IDEsIE5VTExJRllf QUxMT0NfQ09NUCwKISAgICAgICBDT1BZX0FMTE9DX0NPTVAsIENPUFlfT05M WV9BTExPQ19DT01QLCBSRUFTU0lHTl9DQUZfQ09NUCwKISAgICAgICBBTExP Q0FURV9QRFRfQ09NUCwgREVBTExPQ0FURV9QRFRfQ09NUCwgQ0hFQ0tfUERU X0RVTU1ZfTsKISAKISBzdGF0aWMgZ2ZjX2FjdHVhbF9hcmdsaXN0ICpwZHRf cGFyYW1fbGlzdDsKICAKICBzdGF0aWMgdHJlZQogIHN0cnVjdHVyZV9hbGxv Y19jb21wcyAoZ2ZjX3N5bWJvbCAqIGRlcl90eXBlLCB0cmVlIGRlY2wsCioq KioqKioqKioqKioqKiBzdHJ1Y3R1cmVfYWxsb2NfY29tcHMgKGdmY19zeW1i b2wgKiBkZXJfCioqKiA4NzM1LDg3NDAgKioqKgotLS0gODczOCw4OTkyIC0t LS0KICAKICAJICBicmVhazsKICAKKyAJY2FzZSBBTExPQ0FURV9QRFRfQ09N UDoKKyAKKyAJICBjb21wID0gZm9sZF9idWlsZDNfbG9jIChpbnB1dF9sb2Nh dGlvbiwgQ09NUE9ORU5UX1JFRiwgY3R5cGUsCisgCQkJCSAgZGVjbCwgY2Rl Y2wsIE5VTExfVFJFRSk7CisgCisgCSAgLyogU2V0IHRoZSBQRFQgS0lORCBh bmQgTEVOIGZpZWxkcy4gICovCisgCSAgaWYgKGMtPmF0dHIucGR0X2tpbmQg fHwgYy0+YXR0ci5wZHRfbGVuKQorIAkgICAgeworIAkgICAgICBnZmNfc2Ug dHNlOworIAkgICAgICBnZmNfZXhwciAqY19leHByID0gTlVMTDsKKyAJICAg ICAgZ2ZjX2FjdHVhbF9hcmdsaXN0ICpwYXJhbSA9IHBkdF9wYXJhbV9saXN0 OworIAkgICAgICBnZmNfaW5pdF9zZSAoJnRzZSwgTlVMTCk7CisgCSAgICAg IGZvciAoOyBwYXJhbTsgcGFyYW0gPSBwYXJhbS0+bmV4dCkKKyAJCWlmICgh c3RyY21wIChjLT5uYW1lLCBwYXJhbS0+bmFtZSkpCisgCQkgIGNfZXhwciA9 IHBhcmFtLT5leHByOworIAorIAkgICAgICBpZiAoIWNfZXhwcikKKyAJCWNf ZXhwciA9IGMtPmluaXRpYWxpemVyOworIAorIAkgICAgICBpZiAoY19leHBy KQorIAkJeworIAkJICBnZmNfY29udl9leHByX3R5cGUgKCZ0c2UsIGNfZXhw ciwgVFJFRV9UWVBFIChjb21wKSk7CisgCQkgIGdmY19hZGRfbW9kaWZ5ICgm Zm5ibG9jaywgY29tcCwgdHNlLmV4cHIpOworIAkJfQorIAkgICAgfQorIAor IAkgIGlmIChjLT5hdHRyLnBkdF9zdHJpbmcpCisgCSAgICB7CisgCSAgICAg IGdmY19zZSB0c2U7CisgCSAgICAgIGdmY19pbml0X3NlICgmdHNlLCBOVUxM KTsKKyAJICAgICAgdHJlZSBzdHJsZW47CisgCSAgICAgIC8qIENvbnZlcnQg dGhlIHBhcmFtZXRlcml6ZWQgc3RyaW5nIGxlbmd0aCB0byBpdHMgdmFsdWUu IFRoZQorIAkJIHN0cmluZyBsZW5ndGggaXMgc3RvcmVkIGluIGEgaGlkZGVu IGZpZWxkIGluIHRoZSBzYW1lIHdheSBhcworIAkJIGRlZmVycmVkIHN0cmlu ZyBsZW5ndGhzLiAgKi8KKyAJICAgICAgZ2ZjX2luc2VydF9wYXJhbWV0ZXJf ZXhwcnMgKGMtPnRzLnUuY2wtPmxlbmd0aCwgcGR0X3BhcmFtX2xpc3QpOwor IAkgICAgICBpZiAoZ2ZjX2RlZmVycmVkX3N0cmxlbiAoYywgJnN0cmxlbikg JiYgc3RybGVuICE9IE5VTExfVFJFRSkKKyAJCXsKKyAJCSAgZ2ZjX2NvbnZf ZXhwcl90eXBlICgmdHNlLCBjLT50cy51LmNsLT5sZW5ndGgsCisgCQkJCSAg ICAgIFRSRUVfVFlQRSAoc3RybGVuKSk7CisgCQkgIHN0cmxlbiA9IGZvbGRf YnVpbGQzX2xvYyAoaW5wdXRfbG9jYXRpb24sIENPTVBPTkVOVF9SRUYsCisg CQkJCQkgICAgVFJFRV9UWVBFIChzdHJsZW4pLAorIAkJCQkJICAgIGRlY2ws IHN0cmxlbiwgTlVMTF9UUkVFKTsKKyAJCSAgZ2ZjX2FkZF9tb2RpZnkgKCZm bmJsb2NrLCBzdHJsZW4sIHRzZS5leHByKTsKKyAJCSAgYy0+dHMudS5jbC0+ YmFja2VuZF9kZWNsID0gc3RybGVuOworIAkJfQorIAkgICAgICAvKiBTY2Fs YXIgcGFyYW1ldGVyaXppZWQgc3RyaW5ncyBjYW4gYmUgYWxsb2NhdGVkIG5v dy4gICovCisgCSAgICAgIGlmICghYy0+YXMpCisgCQl7CisgCQkgIHRtcCA9 IGZvbGRfY29udmVydCAoZ2ZjX2FycmF5X2luZGV4X3R5cGUsIHN0cmxlbik7 CisgCQkgIHRtcCA9IHNpemVfb2Zfc3RyaW5nX2luX2J5dGVzIChjLT50cy5r aW5kLCB0bXApOworIAkJICB0bXAgPSBnZmNfZXZhbHVhdGVfbm93ICh0bXAs ICZmbmJsb2NrKTsKKyAJCSAgdG1wID0gZ2ZjX2NhbGxfbWFsbG9jICgmZm5i bG9jaywgVFJFRV9UWVBFIChjb21wKSwgdG1wKTsKKyAJCSAgZ2ZjX2FkZF9t b2RpZnkgKCZmbmJsb2NrLCBjb21wLCB0bXApOworIAkJfQorIAkgICAgfQor IAorIAkgIC8qIEFsbG9jYXRlIHBhcmFtdGVyaXplZCBhcnJheXMgb2YgcGFy YW1ldGVyaXplZCBkZXJpdmVkIHR5cGVzLiAgKi8KKyAJICBpZiAoIShjLT5h dHRyLnBkdF9hcnJheSAmJiBjLT5hcyAmJiBjLT5hcy0+dHlwZSA9PSBBU19F WFBMSUNJVCkKKyAJICAgICAgJiYgISgoYy0+dHMudHlwZSA9PSBCVF9ERVJJ VkVEIHx8IGMtPnRzLnR5cGUgPT0gQlRfQ0xBU1MpCisgCQkgICAmJiAoYy0+ dHMudS5kZXJpdmVkICYmIGMtPnRzLnUuZGVyaXZlZC0+YXR0ci5wZHRfdHlw ZSkpKQorIAkgICAgY29udGludWU7CisgCisgCSAgaWYgKGMtPnRzLnR5cGUg PT0gQlRfQ0xBU1MpCisgCSAgICBjb21wID0gZ2ZjX2NsYXNzX2RhdGFfZ2V0 IChjb21wKTsKKyAKKyAJICBpZiAoYy0+YXR0ci5wZHRfYXJyYXkpCisgCSAg ICB7CisgCSAgICAgIGdmY19zZSB0c2U7CisgCSAgICAgIGludCBpOworIAkg ICAgICB0cmVlIHNpemUgPSBnZmNfaW5kZXhfb25lX25vZGU7CisgCSAgICAg IHRyZWUgb2Zmc2V0ID0gZ2ZjX2luZGV4X3plcm9fbm9kZTsKKyAJICAgICAg dHJlZSBsb3dlciwgdXBwZXI7CisgCSAgICAgIGdmY19leHByICplOworIAor IAkgICAgICAvKiBUaGlzIGNodW5rIHRha2VzIHRoZSBleHByZXNzaW9ucyBm b3IgJ2xvd2VyJyBhbmQgJ3VwcGVyJworIAkJIGluIHRoZSBhcnJheXNwZWMg YW5kIHN1YnN0aXR1dGVzIGluIHRoZSBleHByZXNzaW9ucyBmb3IKKyAJCSB0 aGUgcGFyYW1ldGVycyBmcm9tICdwZHRfcGFyYW1fbGlzdCcuIFRoZSBkZXNj cmlwdG9yCisgCQkgZmllbGRzIGNhbiB0aGVuIGJlIGZpbGxlZCBmcm9tIHRo ZSB2YWx1ZXMgc28gb2J0YWluZWQuICAqLworIAkgICAgICBnY2NfYXNzZXJ0 IChHRkNfREVTQ1JJUFRPUl9UWVBFX1AgKFRSRUVfVFlQRSAoY29tcCkpKTsK KyAJICAgICAgZm9yIChpID0gMDsgaSA8IGMtPmFzLT5yYW5rOyBpKyspCisg CQl7CisgCQkgIGdmY19pbml0X3NlICgmdHNlLCBOVUxMKTsKKyAJCSAgZSA9 IGdmY19jb3B5X2V4cHIgKGMtPmFzLT5sb3dlcltpXSk7CisgCQkgIGdmY19p bnNlcnRfcGFyYW1ldGVyX2V4cHJzIChlLCBwZHRfcGFyYW1fbGlzdCk7Cisg CQkgIGdmY19jb252X2V4cHJfdHlwZSAoJnRzZSwgZSwgZ2ZjX2FycmF5X2lu ZGV4X3R5cGUpOworIAkJICBnZmNfZnJlZV9leHByIChlKTsKKyAJCSAgbG93 ZXIgPSB0c2UuZXhwcjsKKyAJCSAgZ2ZjX2NvbnZfZGVzY3JpcHRvcl9sYm91 bmRfc2V0ICgmZm5ibG9jaywgY29tcCwKKyAJCQkJCQkgIGdmY19yYW5rX2Nz dFtpXSwKKyAJCQkJCQkgIGxvd2VyKTsKKyAJCSAgZSA9IGdmY19jb3B5X2V4 cHIgKGMtPmFzLT51cHBlcltpXSk7CisgCQkgIGdmY19pbnNlcnRfcGFyYW1l dGVyX2V4cHJzIChlLCBwZHRfcGFyYW1fbGlzdCk7CisgCQkgIGdmY19jb252 X2V4cHJfdHlwZSAoJnRzZSwgZSwgZ2ZjX2FycmF5X2luZGV4X3R5cGUpOwor IAkJICBnZmNfZnJlZV9leHByIChlKTsKKyAJCSAgdXBwZXIgPSB0c2UuZXhw cjsKKyAJCSAgZ2ZjX2NvbnZfZGVzY3JpcHRvcl91Ym91bmRfc2V0ICgmZm5i bG9jaywgY29tcCwKKyAJCQkJCQkgIGdmY19yYW5rX2NzdFtpXSwKKyAJCQkJ CQkgIHVwcGVyKTsKKyAJCSAgZ2ZjX2NvbnZfZGVzY3JpcHRvcl9zdHJpZGVf c2V0ICgmZm5ibG9jaywgY29tcCwKKyAJCQkJCQkgIGdmY19yYW5rX2NzdFtp XSwKKyAJCQkJCQkgIHNpemUpOworIAkJICBzaXplID0gZ2ZjX2V2YWx1YXRl X25vdyAoc2l6ZSwgJmZuYmxvY2spOworIAkJICBvZmZzZXQgPSBmb2xkX2J1 aWxkMl9sb2MgKGlucHV0X2xvY2F0aW9uLAorIAkJCQkJICAgIE1JTlVTX0VY UFIsCisgCQkJCQkgICAgZ2ZjX2FycmF5X2luZGV4X3R5cGUsCisgCQkJCQkg ICAgb2Zmc2V0LCBzaXplKTsKKyAJCSAgb2Zmc2V0ID0gZ2ZjX2V2YWx1YXRl X25vdyAob2Zmc2V0LCAmZm5ibG9jayk7CisgCQkgIHRtcCA9IGZvbGRfYnVp bGQyX2xvYyAoaW5wdXRfbG9jYXRpb24sIE1JTlVTX0VYUFIsCisgCQkJCQkg Z2ZjX2FycmF5X2luZGV4X3R5cGUsCisgCQkJCQkgdXBwZXIsIGxvd2VyKTsK KyAJCSAgdG1wID0gZm9sZF9idWlsZDJfbG9jIChpbnB1dF9sb2NhdGlvbiwg UExVU19FWFBSLAorIAkJCQkJIGdmY19hcnJheV9pbmRleF90eXBlLAorIAkJ CQkJIHRtcCwgZ2ZjX2luZGV4X29uZV9ub2RlKTsKKyAJCSAgc2l6ZSA9IGZv bGRfYnVpbGQyX2xvYyAoaW5wdXRfbG9jYXRpb24sIE1VTFRfRVhQUiwKKyAJ CQkJCSAgZ2ZjX2FycmF5X2luZGV4X3R5cGUsIHNpemUsIHRtcCk7CisgCQl9 CisgCSAgICAgIGdmY19jb252X2Rlc2NyaXB0b3Jfb2Zmc2V0X3NldCAoJmZu YmxvY2ssIGNvbXAsIG9mZnNldCk7CisgCSAgICAgIGlmIChjLT50cy50eXBl ID09IEJUX0NMQVNTKQorIAkJeworIAkJICB0bXAgPSBnZmNfZ2V0X3ZwdHJf ZnJvbV9leHByIChjb21wKTsKKyAJCSAgaWYgKFBPSU5URVJfVFlQRV9QIChU UkVFX1RZUEUgKHRtcCkpKQorIAkJICAgIHRtcCA9IGJ1aWxkX2ZvbGRfaW5k aXJlY3RfcmVmX2xvYyAoaW5wdXRfbG9jYXRpb24sIHRtcCk7CisgCQkgIHRt cCA9IGdmY192cHRyX3NpemVfZ2V0ICh0bXApOworIAkJfQorIAkgICAgICBl bHNlCisgCQl0bXAgPSBUWVBFX1NJWkVfVU5JVCAoZ2ZjX2dldF9lbGVtZW50 X3R5cGUgKGN0eXBlKSk7CisgCSAgICAgIHRtcCA9IGZvbGRfY29udmVydCAo Z2ZjX2FycmF5X2luZGV4X3R5cGUsIHRtcCk7CisgCSAgICAgIHNpemUgPSBm b2xkX2J1aWxkMl9sb2MgKGlucHV0X2xvY2F0aW9uLCBNVUxUX0VYUFIsCisg CQkJCSAgICAgIGdmY19hcnJheV9pbmRleF90eXBlLCBzaXplLCB0bXApOwor IAkgICAgICBzaXplID0gZ2ZjX2V2YWx1YXRlX25vdyAoc2l6ZSwgJmZuYmxv Y2spOworIAkgICAgICB0bXAgPSBnZmNfY2FsbF9tYWxsb2MgKCZmbmJsb2Nr LCBOVUxMLCBzaXplKTsKKyAJICAgICAgZ2ZjX2NvbnZfZGVzY3JpcHRvcl9k YXRhX3NldCAoJmZuYmxvY2ssIGNvbXAsIHRtcCk7CisgCSAgICAgIHRtcCA9 IGdmY19jb252X2Rlc2NyaXB0b3JfZHR5cGUgKGNvbXApOworIAkgICAgICBn ZmNfYWRkX21vZGlmeSAoJmZuYmxvY2ssIHRtcCwgZ2ZjX2dldF9kdHlwZSAo Y3R5cGUpKTsKKyAJICAgIH0KKyAKKyAJICAvKiBSZWN1cnNlIGluIHRvIFBE VCBjb21wb25lbnRzLiAgKi8KKyAJICBpZiAoKGMtPnRzLnR5cGUgPT0gQlRf REVSSVZFRCB8fCBjLT50cy50eXBlID09IEJUX0NMQVNTKQorIAkgICAgICAm JiBjLT50cy51LmRlcml2ZWQgJiYgYy0+dHMudS5kZXJpdmVkLT5hdHRyLnBk dF90eXBlKQorIAkgICAgeworIAkgICAgICBib29sIGlzX2RlZmVycmVkID0g ZmFsc2U7CisgCSAgICAgIGdmY19hY3R1YWxfYXJnbGlzdCAqdGFpbCA9IGMt PnBhcmFtX2xpc3Q7CisgCisgCSAgICAgIGZvciAoOyB0YWlsOyB0YWlsID0g dGFpbC0+bmV4dCkKKyAJCWlmICghdGFpbC0+ZXhwcikKKyAJCSAgaXNfZGVm ZXJyZWQgPSB0cnVlOworIAorIAkgICAgICB0YWlsID0gaXNfZGVmZXJyZWQg PyBwZHRfcGFyYW1fbGlzdCA6IGMtPnBhcmFtX2xpc3Q7CisgCSAgICAgIHRt cCA9IGdmY19hbGxvY2F0ZV9wZHRfY29tcCAoYy0+dHMudS5kZXJpdmVkLCBj b21wLAorIAkJCQkJICAgYy0+YXMgPyBjLT5hcy0+cmFuayA6IDAsCisgCQkJ CQkgICB0YWlsKTsKKyAJICAgICAgZ2ZjX2FkZF9leHByX3RvX2Jsb2NrICgm Zm5ibG9jaywgdG1wKTsKKyAJICAgIH0KKyAKKyAJICBicmVhazsKKyAKKyAJ Y2FzZSBERUFMTE9DQVRFX1BEVF9DT01QOgorIAkgIC8qIERlYWxsb2NhdGUg YXJyYXkgb3IgcGFyYW1ldGVyaXplZCBzdHJpbmcgbGVuZ3RoIGNvbXBvbmVu dHMKKyAJICAgICBvZiBwYXJhbWV0ZXJpemVkIGRlcml2ZWQgdHlwZXMuICAq LworIAkgIGlmICghKGMtPmF0dHIucGR0X2FycmF5ICYmIGMtPmFzICYmIGMt PmFzLT50eXBlID09IEFTX0VYUExJQ0lUKQorIAkgICAgICAmJiAhYy0+YXR0 ci5wZHRfc3RyaW5nCisgCSAgICAgICYmICEoKGMtPnRzLnR5cGUgPT0gQlRf REVSSVZFRCB8fCBjLT50cy50eXBlID09IEJUX0NMQVNTKQorIAkJICAgJiYg KGMtPnRzLnUuZGVyaXZlZCAmJiBjLT50cy51LmRlcml2ZWQtPmF0dHIucGR0 X3R5cGUpKSkKKyAJICAgIGNvbnRpbnVlOworIAorIAkgIGNvbXAgPSBmb2xk X2J1aWxkM19sb2MgKGlucHV0X2xvY2F0aW9uLCBDT01QT05FTlRfUkVGLCBj dHlwZSwKKyAJCQkJICBkZWNsLCBjZGVjbCwgTlVMTF9UUkVFKTsKKyAJICBp ZiAoYy0+dHMudHlwZSA9PSBCVF9DTEFTUykKKyAJICAgIGNvbXAgPSBnZmNf Y2xhc3NfZGF0YV9nZXQgKGNvbXApOworIAorIAkgIC8qIFJlY3Vyc2UgaW4g dG8gUERUIGNvbXBvbmVudHMuICAqLworIAkgIGlmICgoYy0+dHMudHlwZSA9 PSBCVF9ERVJJVkVEIHx8IGMtPnRzLnR5cGUgPT0gQlRfQ0xBU1MpCisgCSAg ICAgICYmIGMtPnRzLnUuZGVyaXZlZCAmJiBjLT50cy51LmRlcml2ZWQtPmF0 dHIucGR0X3R5cGUpCisgCSAgICB7CisgCSAgICAgIHRtcCA9IGdmY19kZWFs bG9jYXRlX3BkdF9jb21wIChjLT50cy51LmRlcml2ZWQsIGNvbXAsCisgCQkJ CQkgICAgIGMtPmFzID8gYy0+YXMtPnJhbmsgOiAwKTsKKyAJICAgICAgZ2Zj X2FkZF9leHByX3RvX2Jsb2NrICgmZm5ibG9jaywgdG1wKTsKKyAJICAgIH0K KyAKKyAJICBpZiAoYy0+YXR0ci5wZHRfYXJyYXkpCisgCSAgICB7CisgCSAg ICAgIHRtcCA9IGdmY19jb252X2Rlc2NyaXB0b3JfZGF0YV9nZXQgKGNvbXAp OworIAkgICAgICB0bXAgPSBnZmNfY2FsbF9mcmVlICh0bXApOworIAkgICAg ICBnZmNfYWRkX2V4cHJfdG9fYmxvY2sgKCZmbmJsb2NrLCB0bXApOworIAkg ICAgICBnZmNfY29udl9kZXNjcmlwdG9yX2RhdGFfc2V0ICgmZm5ibG9jaywg Y29tcCwgbnVsbF9wb2ludGVyX25vZGUpOworIAkgICAgfQorIAkgIGVsc2Ug aWYgKGMtPmF0dHIucGR0X3N0cmluZykKKyAJICAgIHsKKyAJICAgICAgdG1w ID0gZ2ZjX2NhbGxfZnJlZSAoY29tcCk7CisgCSAgICAgIGdmY19hZGRfZXhw cl90b19ibG9jayAoJmZuYmxvY2ssIHRtcCk7CisgCSAgICAgIHRtcCA9IGZv bGRfY29udmVydCAoVFJFRV9UWVBFIChjb21wKSwgbnVsbF9wb2ludGVyX25v ZGUpOworIAkgICAgICBnZmNfYWRkX21vZGlmeSAoJmZuYmxvY2ssIGNvbXAs IHRtcCk7CisgCSAgICB9CisgCisgCSAgYnJlYWs7CisgCisgCWNhc2UgQ0hF Q0tfUERUX0RVTU1ZOgorIAorIAkgIGNvbXAgPSBmb2xkX2J1aWxkM19sb2Mg KGlucHV0X2xvY2F0aW9uLCBDT01QT05FTlRfUkVGLCBjdHlwZSwKKyAJCQkJ ICBkZWNsLCBjZGVjbCwgTlVMTF9UUkVFKTsKKyAJICBpZiAoYy0+dHMudHlw ZSA9PSBCVF9DTEFTUykKKyAJICAgIGNvbXAgPSBnZmNfY2xhc3NfZGF0YV9n ZXQgKGNvbXApOworIAorIAkgIC8qIFJlY3Vyc2UgaW4gdG8gUERUIGNvbXBv bmVudHMuICAqLworIAkgIGlmICgoYy0+dHMudHlwZSA9PSBCVF9ERVJJVkVE IHx8IGMtPnRzLnR5cGUgPT0gQlRfQ0xBU1MpCisgCSAgICAgICYmIGMtPnRz LnUuZGVyaXZlZCAmJiBjLT50cy51LmRlcml2ZWQtPmF0dHIucGR0X3R5cGUp CisgCSAgICB7CisgCSAgICAgIHRtcCA9IGdmY19jaGVja19wZHRfZHVtbXkg KGMtPnRzLnUuZGVyaXZlZCwgY29tcCwKKyAJCQkJCSBjLT5hcyA/IGMtPmFz LT5yYW5rIDogMCwKKyAJCQkJCSBwZHRfcGFyYW1fbGlzdCk7CisgCSAgICAg IGdmY19hZGRfZXhwcl90b19ibG9jayAoJmZuYmxvY2ssIHRtcCk7CisgCSAg ICB9CisgCisgCSAgaWYgKCFjLT5hdHRyLnBkdF9sZW4pCisgCSAgICBjb250 aW51ZTsKKyAJICBlbHNlCisgCSAgICB7CisgCSAgICAgIGdmY19zZSB0c2U7 CisgCSAgICAgIGdmY19leHByICpjX2V4cHIgPSBOVUxMOworIAkgICAgICBn ZmNfYWN0dWFsX2FyZ2xpc3QgKnBhcmFtID0gcGR0X3BhcmFtX2xpc3Q7Cisg CisgCSAgICAgIGdmY19pbml0X3NlICgmdHNlLCBOVUxMKTsKKyAJICAgICAg Zm9yICg7IHBhcmFtOyBwYXJhbSA9IHBhcmFtLT5uZXh0KQorIAkJaWYgKCFz dHJjbXAgKGMtPm5hbWUsIHBhcmFtLT5uYW1lKSkKKyAJCSAgY19leHByID0g cGFyYW0tPmV4cHI7CisgCisgCSAgICAgIGlmIChjX2V4cHIpCisgCQl7Cisg CQkgIHRyZWUgZXJyb3IsIGNvbmQsIGNuYW1lOworIAkJICBnZmNfY29udl9l eHByX3R5cGUgKCZ0c2UsIGNfZXhwciwgVFJFRV9UWVBFIChjb21wKSk7Cisg CQkgIGNvbmQgPSBmb2xkX2J1aWxkMl9sb2MgKGlucHV0X2xvY2F0aW9uLCBO RV9FWFBSLAorIAkJCQkJICBib29sZWFuX3R5cGVfbm9kZSwKKyAJCQkJCSAg Y29tcCwgdHNlLmV4cHIpOworIAkJICBjbmFtZSA9IGdmY19idWlsZF9jc3Ry aW5nX2NvbnN0IChjLT5uYW1lKTsKKyAJCSAgY25hbWUgPSBnZmNfYnVpbGRf YWRkcl9leHByIChwY2hhcl90eXBlX25vZGUsIGNuYW1lKTsKKyAJCSAgZXJy b3IgPSBnZmNfdHJhbnNfcnVudGltZV9lcnJvciAodHJ1ZSwgTlVMTCwKKyAJ CQkJCQkgICAiVGhlIHZhbHVlIG9mIHRoZSBQRFQgTEVOICIKKyAJCQkJCQkg ICAicGFyYW1ldGVyICclcycgZG9lcyBub3QgIgorIAkJCQkJCSAgICJhZ3Jl ZSB3aXRoIHRoYXQgaW4gdGhlICIKKyAJCQkJCQkgICAiZHVtbXkgZGVjbGFy YXRpb24iLAorIAkJCQkJCSAgIGNuYW1lKTsKKyAJCSAgdG1wID0gZm9sZF9i dWlsZDNfbG9jIChpbnB1dF9sb2NhdGlvbiwgQ09ORF9FWFBSLAorIAkJCQkJ IHZvaWRfdHlwZV9ub2RlLCBjb25kLCBlcnJvciwKKyAJCQkJCSBidWlsZF9l bXB0eV9zdG10IChpbnB1dF9sb2NhdGlvbikpOworIAkJICBnZmNfYWRkX2V4 cHJfdG9fYmxvY2sgKCZmbmJsb2NrLCB0bXApOworIAkJfQorIAkgICAgfQor IAkgIGJyZWFrOworIAogIAlkZWZhdWx0OgogIAkgIGdjY191bnJlYWNoYWJs ZSAoKTsKICAJICBicmVhazsKKioqKioqKioqKioqKioqIGdmY19jb3B5X29u bHlfYWxsb2NfY29tcCAoZ2ZjX3N5bWJvbCAqIGQKKioqIDg4MTQsODgxOSAq KioqCi0tLSA5MDY2LDkxMTUgLS0tLQogIH0KICAKICAKKyAvKiBSZWN1cnNp dmVseSB0cmF2ZXJzZSBhbiBvYmplY3Qgb2YgcGFyYW10ZXJpemVkIGRlcml2 ZWQgdHlwZSwgZ2VuZXJhdGluZworICAgIGNvZGUgdG8gYWxsb2NhdGUgcGFy YW1ldGVyaXplZCBjb21wb25lbnRzLiAgKi8KKyAKKyB0cmVlCisgZ2ZjX2Fs bG9jYXRlX3BkdF9jb21wIChnZmNfc3ltYm9sICogZGVyX3R5cGUsIHRyZWUg ZGVjbCwgaW50IHJhbmssCisgCQkgICAgICAgZ2ZjX2FjdHVhbF9hcmdsaXN0 ICpwYXJhbV9saXN0KQorIHsKKyAgIHRyZWUgcmVzOworICAgZ2ZjX2FjdHVh bF9hcmdsaXN0ICpvbGRfcGFyYW1fbGlzdCA9IHBkdF9wYXJhbV9saXN0Owor ICAgcGR0X3BhcmFtX2xpc3QgPSBwYXJhbV9saXN0OworICAgcmVzID0gc3Ry dWN0dXJlX2FsbG9jX2NvbXBzIChkZXJfdHlwZSwgZGVjbCwgTlVMTF9UUkVF LCByYW5rLAorIAkJCSAgICAgICBBTExPQ0FURV9QRFRfQ09NUCwgMCk7Cisg ICBwZHRfcGFyYW1fbGlzdCA9IG9sZF9wYXJhbV9saXN0OworICAgcmV0dXJu IHJlczsKKyB9CisgCisgLyogUmVjdXJzaXZlbHkgdHJhdmVyc2UgYW4gb2Jq ZWN0IG9mIHBhcmFtdGVyaXplZCBkZXJpdmVkIHR5cGUsIGdlbmVyYXRpbmcK KyAgICBjb2RlIHRvIGRlYWxsb2NhdGUgcGFyYW1ldGVyaXplZCBjb21wb25l bnRzLiAgKi8KKyAKKyB0cmVlCisgZ2ZjX2RlYWxsb2NhdGVfcGR0X2NvbXAg KGdmY19zeW1ib2wgKiBkZXJfdHlwZSwgdHJlZSBkZWNsLCBpbnQgcmFuaykK KyB7CisgICByZXR1cm4gc3RydWN0dXJlX2FsbG9jX2NvbXBzIChkZXJfdHlw ZSwgZGVjbCwgTlVMTF9UUkVFLCByYW5rLAorIAkJCQlERUFMTE9DQVRFX1BE VF9DT01QLCAwKTsKKyB9CisgCisgCisgLyogUmVjdXJzaXZlbHkgdHJhdmVy c2UgYSBkdW1teSBvZiBwYXJhbXRlcml6ZWQgZGVyaXZlZCB0eXBlIHRvIGNo ZWNrIHRoZQorICAgIHZhbHVlcyBvZiBMRU4gcGFyYW1ldGVycy4gICovCisg CisgdHJlZQorIGdmY19jaGVja19wZHRfZHVtbXkgKGdmY19zeW1ib2wgKiBk ZXJfdHlwZSwgdHJlZSBkZWNsLCBpbnQgcmFuaywKKyAJCSAgICAgZ2ZjX2Fj dHVhbF9hcmdsaXN0ICpwYXJhbV9saXN0KQorIHsKKyAgIHRyZWUgcmVzOwor ICAgZ2ZjX2FjdHVhbF9hcmdsaXN0ICpvbGRfcGFyYW1fbGlzdCA9IHBkdF9w YXJhbV9saXN0OworICAgcGR0X3BhcmFtX2xpc3QgPSBwYXJhbV9saXN0Owor ICAgcmVzID0gc3RydWN0dXJlX2FsbG9jX2NvbXBzIChkZXJfdHlwZSwgZGVj bCwgTlVMTF9UUkVFLCByYW5rLAorIAkJCSAgICAgICBDSEVDS19QRFRfRFVN TVksIDApOworICAgcGR0X3BhcmFtX2xpc3QgPSBvbGRfcGFyYW1fbGlzdDsK KyAgIHJldHVybiByZXM7CisgfQorIAorIAogIC8qIFJldHVybnMgdGhlIHZh bHVlIG9mIExCT1VORCBmb3IgYW4gZXhwcmVzc2lvbi4gIFRoaXMgY291bGQg YmUgYnJva2VuIG91dAogICAgIGZyb20gZ2ZjX2NvbnZfaW50cmluc2ljX2Jv dW5kIGJ1dCB0aGlzIHNlZW1lZCB0byBiZSBzaW1wbGVyLiAgVGhpcyBpcwog ICAgIGNhbGxlZCBieSBnZmNfYWxsb2NfYWxsb2NhdGFibGVfZm9yX2Fzc2ln bm1lbnQuICAqLwpJbmRleDogZ2NjL2ZvcnRyYW4vdHJhbnMtYXJyYXkuaAo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CioqKiBnY2MvZm9ydHJhbi90cmFucy1h cnJheS5oCShyZXZpc2lvbiAyNTE1NDYpCi0tLSBnY2MvZm9ydHJhbi90cmFu cy1hcnJheS5oCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioqKioqKiB0cmVl IGdmY19jb3B5X2FsbG9jX2NvbXAgKGdmY19zeW1ib2wgKiwKKioqIDU5LDY0 ICoqKioKLS0tIDU5LDY4IC0tLS0KICAKICB0cmVlIGdmY19jb3B5X29ubHlf YWxsb2NfY29tcCAoZ2ZjX3N5bWJvbCAqLCB0cmVlLCB0cmVlLCBpbnQpOwog IAorIHRyZWUgZ2ZjX2FsbG9jYXRlX3BkdF9jb21wIChnZmNfc3ltYm9sICos IHRyZWUsIGludCwgZ2ZjX2FjdHVhbF9hcmdsaXN0ICopOworIHRyZWUgZ2Zj X2RlYWxsb2NhdGVfcGR0X2NvbXAgKGdmY19zeW1ib2wgKiwgdHJlZSwgaW50 KTsKKyB0cmVlIGdmY19jaGVja19wZHRfZHVtbXkgKGdmY19zeW1ib2wgKiwg dHJlZSwgaW50LCBnZmNfYWN0dWFsX2FyZ2xpc3QgKik7CisgCiAgdHJlZSBn ZmNfYWxsb2NfYWxsb2NhdGFibGVfZm9yX2Fzc2lnbm1lbnQgKGdmY19sb29w aW5mbyosIGdmY19leHByKiwgZ2ZjX2V4cHIqKTsKICAKICAvKiBBZGQgaW5p dGlhbGl6YXRpb24gZm9yIGRlZmVycmVkIGFycmF5cy4gICovCkluZGV4OiBn Y2MvZm9ydHJhbi90cmFucy1kZWNsLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQoqKiogZ2NjL2ZvcnRyYW4vdHJhbnMtZGVjbC5jCShyZXZpc2lvbiAyNTE1 NDYpCi0tLSBnY2MvZm9ydHJhbi90cmFucy1kZWNsLmMJKHdvcmtpbmcgY29w eSkKKioqKioqKioqKioqKioqIGdmY19nZXRfc3ltYm9sX2RlY2wgKGdmY19z eW1ib2wgKiBzeW0pCioqKiAxNDgzLDE0ODggKioqKgotLS0gMTQ4MywxNTAz IC0tLS0KICAJfQogICAgICB9CiAgCisgICAvKiBQRFQgcGFyYW1ldGVyaXpl ZCBhcnJheSBjb21wb25lbnRzIGFuZCBzdHJpbmdfbGVuZ3RocyBtdXN0IGhh dmUgdGhlCisgICAgICAnbGVuJyBwYXJhbWV0ZXJzIHN1YnN0aXR1dGVkIGZv ciB0aGUgZXhwcmVzc2lvbnMgYXBwZWFyaW5nIGluIHRoZQorICAgICAgZGVj bGFyYXRpb24gb2YgdGhlIGVudGl0eSBhbmQgbWVtb3J5IGFsbG9jYXRlZC9k ZWFsbG9jYXRlZC4gICovCisgICBpZiAoKHN5bS0+dHMudHlwZSA9PSBCVF9E RVJJVkVEIHx8IHN5bS0+dHMudHlwZSA9PSBCVF9DTEFTUykKKyAgICAgICAm JiBzeW0tPnBhcmFtX2xpc3QgIT0gTlVMTAorICAgICAgICYmICEoc3ltLT5h dHRyLmhvc3RfYXNzb2MgfHwgc3ltLT5hdHRyLnVzZV9hc3NvYyB8fCBzeW0t PmF0dHIuZHVtbXkpKQorICAgICBnZmNfZGVmZXJfc3ltYm9sX2luaXQgKHN5 bSk7CisgCisgICAvKiBEdW1teSBQRFQgJ2xlbicgcGFyYW1ldGVycyBzaG91 bGQgYmUgY2hlY2tlZCB3aGVuIHRoZXkgYXJlIGV4cGxpY2l0LiAgKi8KKyAg IGlmICgoc3ltLT50cy50eXBlID09IEJUX0RFUklWRUQgfHwgc3ltLT50cy50 eXBlID09IEJUX0NMQVNTKQorICAgICAgICYmIChnZmNfb3B0aW9uLnJ0Y2hl Y2sgJiBHRkNfUlRDSEVDS19CT1VORFMpCisgICAgICAgJiYgc3ltLT5wYXJh bV9saXN0ICE9IE5VTEwKKyAgICAgICAmJiBzeW0tPmF0dHIuZHVtbXkpCisg ICAgIGdmY19kZWZlcl9zeW1ib2xfaW5pdCAoc3ltKTsKKyAKICAgIC8qIEFs bCBkZWZlcnJlZCBjaGFyYWN0ZXIgbGVuZ3RoIHByb2NlZHVyZXMgbmVlZCB0 byByZXRhaW4gdGhlIGJhY2tlbmQKICAgICAgIGRlY2wsIHdoaWNoIGlzIGEg cG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGxlbmd0aCBpbiB0aGUgY2FsbGVy J3MKICAgICAgIG5hbWVzcGFjZSBhbmQgdG8gZGVjbGFyZSBhIGxvY2FsIGNo YXJhY3RlciBsZW5ndGguICAqLwoqKioqKioqKioqKioqKiogZ2ZjX3RyYW5z X2RlZmVycmVkX3ZhcnMgKGdmY19zeW1ib2wgKiBwcgoqKiogNDE1OSw0MTY0 ICoqKioKLS0tIDQxNzQsNDE4MCAtLS0tCiAgICBnZmNfZm9ybWFsX2FyZ2xp c3QgKmY7CiAgICBzdG10YmxvY2tfdCB0bXBibG9jazsKICAgIGJvb2wgc2Vl bl90cmFuc19kZWZlcnJlZF9hcnJheSA9IGZhbHNlOworICAgYm9vbCBpc19w ZHRfdHlwZSA9IGZhbHNlOwogICAgdHJlZSB0bXAgPSBOVUxMOwogICAgZ2Zj X2V4cHIgKmU7CiAgICBnZmNfc2Ugc2U7CioqKioqKioqKioqKioqKiBnZmNf dHJhbnNfZGVmZXJyZWRfdmFycyAoZ2ZjX3N5bWJvbCAqIHByCioqKiA0MjY5 LDQyNzQgKioqKgotLS0gNDI4NSw0MzUyIC0tLS0KICAgICAgICBpZiAoc3lt LT5hc3NvYykKICAJY29udGludWU7CiAgCisgICAgICAgaWYgKHN5bS0+dHMu dHlwZSA9PSBCVF9ERVJJVkVECisgCSAgJiYgc3ltLT50cy51LmRlcml2ZWQK KyAJICAmJiBzeW0tPnRzLnUuZGVyaXZlZC0+YXR0ci5wZHRfdHlwZSkKKyAJ eworIAkgIGlzX3BkdF90eXBlID0gdHJ1ZTsKKyAJICBnZmNfaW5pdF9ibG9j ayAoJnRtcGJsb2NrKTsKKyAJICBpZiAoIShzeW0tPmF0dHIuZHVtbXkKKyAJ CXx8IHN5bS0+YXR0ci5wb2ludGVyCisgCQl8fCBzeW0tPmF0dHIuYWxsb2Nh dGFibGUpKQorIAkgICAgeworIAkgICAgICB0bXAgPSBnZmNfYWxsb2NhdGVf cGR0X2NvbXAgKHN5bS0+dHMudS5kZXJpdmVkLAorIAkJCQkJICAgc3ltLT5i YWNrZW5kX2RlY2wsCisgCQkJCQkgICBzeW0tPmFzID8gc3ltLT5hcy0+cmFu ayA6IDAsCisgCQkJCQkgICBzeW0tPnBhcmFtX2xpc3QpOworIAkgICAgICBn ZmNfYWRkX2V4cHJfdG9fYmxvY2sgKCZ0bXBibG9jaywgdG1wKTsKKyAJICAg ICAgdG1wID0gZ2ZjX2RlYWxsb2NhdGVfcGR0X2NvbXAgKHN5bS0+dHMudS5k ZXJpdmVkLAorIAkJCQkJICAgICBzeW0tPmJhY2tlbmRfZGVjbCwKKyAJCQkJ CSAgICAgc3ltLT5hcyA/IHN5bS0+YXMtPnJhbmsgOiAwKTsKKyAJICAgICAg Z2ZjX2FkZF9pbml0X2NsZWFudXAgKGJsb2NrLCBnZmNfZmluaXNoX2Jsb2Nr ICgmdG1wYmxvY2spLCB0bXApOworIAkgICAgfQorIAkgIGVsc2UgaWYgKHN5 bS0+YXR0ci5kdW1teSkKKyAJICAgIHsKKyAJICAgICAgdG1wID0gZ2ZjX2No ZWNrX3BkdF9kdW1teSAoc3ltLT50cy51LmRlcml2ZWQsCisgCQkJCQkgc3lt LT5iYWNrZW5kX2RlY2wsCisgCQkJCQkgc3ltLT5hcyA/IHN5bS0+YXMtPnJh bmsgOiAwLAorIAkJCQkJIHN5bS0+cGFyYW1fbGlzdCk7CisgCSAgICAgIGdm Y19hZGRfZXhwcl90b19ibG9jayAoJnRtcGJsb2NrLCB0bXApOworIAkgICAg ICBnZmNfYWRkX2luaXRfY2xlYW51cCAoYmxvY2ssIGdmY19maW5pc2hfYmxv Y2sgKCZ0bXBibG9jayksIE5VTEwpOworIAkgICAgfQorIAl9CisgICAgICAg ZWxzZSBpZiAoc3ltLT50cy50eXBlID09IEJUX0NMQVNTCisgCSAgICAgICAm JiBDTEFTU19EQVRBIChzeW0pLT50cy51LmRlcml2ZWQKKyAJICAgICAgICYm IENMQVNTX0RBVEEgKHN5bSktPnRzLnUuZGVyaXZlZC0+YXR0ci5wZHRfdHlw ZSkKKyAJeworIAkgIGdmY19jb21wb25lbnQgKmRhdGEgPSBDTEFTU19EQVRB IChzeW0pOworIAkgIGlzX3BkdF90eXBlID0gdHJ1ZTsKKyAJICBnZmNfaW5p dF9ibG9jayAoJnRtcGJsb2NrKTsKKyAJICBpZiAoIShzeW0tPmF0dHIuZHVt bXkKKyAJCXx8IENMQVNTX0RBVEEgKHN5bSktPmF0dHIucG9pbnRlcgorIAkJ fHwgQ0xBU1NfREFUQSAoc3ltKS0+YXR0ci5hbGxvY2F0YWJsZSkpCisgCSAg ICB7CisgCSAgICAgIHRtcCA9IGdmY19jbGFzc19kYXRhX2dldCAoc3ltLT5i YWNrZW5kX2RlY2wpOworIAkgICAgICB0bXAgPSBnZmNfYWxsb2NhdGVfcGR0 X2NvbXAgKGRhdGEtPnRzLnUuZGVyaXZlZCwgdG1wLAorIAkJCQkJICAgZGF0 YS0+YXMgPyBkYXRhLT5hcy0+cmFuayA6IDAsCisgCQkJCQkgICBzeW0tPnBh cmFtX2xpc3QpOworIAkgICAgICBnZmNfYWRkX2V4cHJfdG9fYmxvY2sgKCZ0 bXBibG9jaywgdG1wKTsKKyAJICAgICAgdG1wID0gZ2ZjX2NsYXNzX2RhdGFf Z2V0IChzeW0tPmJhY2tlbmRfZGVjbCk7CisgCSAgICAgIHRtcCA9IGdmY19k ZWFsbG9jYXRlX3BkdF9jb21wIChkYXRhLT50cy51LmRlcml2ZWQsIHRtcCwK KyAJCQkJCSAgICAgZGF0YS0+YXMgPyBkYXRhLT5hcy0+cmFuayA6IDApOwor IAkgICAgICBnZmNfYWRkX2luaXRfY2xlYW51cCAoYmxvY2ssIGdmY19maW5p c2hfYmxvY2sgKCZ0bXBibG9jayksIHRtcCk7CisgCSAgICB9CisgCSAgZWxz ZSBpZiAoc3ltLT5hdHRyLmR1bW15KQorIAkgICAgeworIAkgICAgICB0bXAg PSBnZmNfY2xhc3NfZGF0YV9nZXQgKHN5bS0+YmFja2VuZF9kZWNsKTsKKyAJ ICAgICAgdG1wID0gZ2ZjX2NoZWNrX3BkdF9kdW1teSAoZGF0YS0+dHMudS5k ZXJpdmVkLCB0bXAsCisgCQkJCQkgZGF0YS0+YXMgPyBkYXRhLT5hcy0+cmFu ayA6IDAsCisgCQkJCQkgc3ltLT5wYXJhbV9saXN0KTsKKyAJICAgICAgZ2Zj X2FkZF9leHByX3RvX2Jsb2NrICgmdG1wYmxvY2ssIHRtcCk7CisgCSAgICAg IGdmY19hZGRfaW5pdF9jbGVhbnVwIChibG9jaywgZ2ZjX2ZpbmlzaF9ibG9j ayAoJnRtcGJsb2NrKSwgTlVMTCk7CisgCSAgICB9CisgCX0KKyAKICAgICAg ICBpZiAoc3ltLT5hdHRyLnN1YnJlZl9hcnJheV9wb2ludGVyCiAgCSAgJiYg R0ZDX0RFQ0xfU1BBTiAoc3ltLT5iYWNrZW5kX2RlY2wpCiAgCSAgJiYgIVRS RUVfU1RBVElDIChHRkNfREVDTF9TUEFOIChzeW0tPmJhY2tlbmRfZGVjbCkp KQoqKioqKioqKioqKioqKiogZ2ZjX3RyYW5zX2RlZmVycmVkX3ZhcnMgKGdm Y19zeW1ib2wgKiBwcgoqKiogNDYwMSw0NjA3ICoqKioKICAJICBnZmNfYWRk X2luaXRfY2xlYW51cCAoYmxvY2ssIGdmY19maW5pc2hfYmxvY2sgKCZ0bXBi bG9jayksCiAgCQkJCU5VTExfVFJFRSk7CiAgCX0KISAgICAgICBlbHNlIGlm ICghKFVOTElNSVRFRF9QT0xZKHN5bSkpKQogIAlnY2NfdW5yZWFjaGFibGUg KCk7CiAgICAgIH0KICAKLS0tIDQ2NzksNDY4NSAtLS0tCiAgCSAgZ2ZjX2Fk ZF9pbml0X2NsZWFudXAgKGJsb2NrLCBnZmNfZmluaXNoX2Jsb2NrICgmdG1w YmxvY2spLAogIAkJCQlOVUxMX1RSRUUpOwogIAl9CiEgICAgICAgZWxzZSBp ZiAoIShVTkxJTUlURURfUE9MWShzeW0pKSAmJiAhaXNfcGR0X3R5cGUpCiAg CWdjY191bnJlYWNoYWJsZSAoKTsKICAgICAgfQogIApJbmRleDogZ2NjL2Zv cnRyYW4vdHJhbnMtZXhwci5jCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioq IGdjYy9mb3J0cmFuL3RyYW5zLWV4cHIuYwkocmV2aXNpb24gMjUxNTQ2KQot LS0gZ2NjL2ZvcnRyYW4vdHJhbnMtZXhwci5jCSh3b3JraW5nIGNvcHkpCioq KioqKioqKioqKioqKiBnZmNfdHJhbnNfc3ViY29tcG9uZW50X2Fzc2lnbiAo dHJlZSBkZXN0CioqKiA3Mjg2LDcyOTIgKioqKgogICAgICB7CiAgICAgICAg aWYgKGNtLT5hdHRyLmFsbG9jYXRhYmxlICYmIGV4cHItPmV4cHJfdHlwZSA9 PSBFWFBSX05VTEwpCiAgIAlnZmNfY29udl9kZXNjcmlwdG9yX2RhdGFfc2V0 ICgmYmxvY2ssIGRlc3QsIG51bGxfcG9pbnRlcl9ub2RlKTsKISAgICAgICBl bHNlIGlmIChjbS0+YXR0ci5hbGxvY2F0YWJsZSkKICAJewogIAkgIHRtcCA9 IGdmY190cmFuc19hbGxvY19zdWJhcnJheV9hc3NpZ24gKGRlc3QsIGNtLCBl eHByKTsKICAJICBnZmNfYWRkX2V4cHJfdG9fYmxvY2sgKCZibG9jaywgdG1w KTsKLS0tIDcyODYsNzI5MiAtLS0tCiAgICAgIHsKICAgICAgICBpZiAoY20t PmF0dHIuYWxsb2NhdGFibGUgJiYgZXhwci0+ZXhwcl90eXBlID09IEVYUFJf TlVMTCkKICAgCWdmY19jb252X2Rlc2NyaXB0b3JfZGF0YV9zZXQgKCZibG9j aywgZGVzdCwgbnVsbF9wb2ludGVyX25vZGUpOwohICAgICAgIGVsc2UgaWYg KGNtLT5hdHRyLmFsbG9jYXRhYmxlIHx8IGNtLT5hdHRyLnBkdF9hcnJheSkK ICAJewogIAkgIHRtcCA9IGdmY190cmFuc19hbGxvY19zdWJhcnJheV9hc3Np Z24gKGRlc3QsIGNtLCBleHByKTsKICAJICBnZmNfYWRkX2V4cHJfdG9fYmxv Y2sgKCZibG9jaywgdG1wKTsKSW5kZXg6IGdjYy9mb3J0cmFuL3RyYW5zLXN0 bXQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiBnY2MvZm9ydHJhbi90 cmFucy1zdG10LmMJKHJldmlzaW9uIDI1MTU0NikKLS0tIGdjYy9mb3J0cmFu L3RyYW5zLXN0bXQuYwkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiog Z2ZjX3RyYW5zX2FsbG9jYXRlIChnZmNfY29kZSAqIGNvZGUpCioqKiA1NTQ1 LDU1NTAgKioqKgotLS0gNTU0NSw1NTUxIC0tLS0KICAgIGJvb2wgbmVlZHNf Y2FmX3N5bmMsIGNhZl9yZWZzX2NvbXA7CiAgICBnZmNfc3ltdHJlZSAqbmV3 c3ltID0gTlVMTDsKICAgIHN5bWJvbF9hdHRyaWJ1dGUgY2FmX2F0dHI7Cisg ICBnZmNfYWN0dWFsX2FyZ2xpc3QgKnBhcmFtX2xpc3Q7CiAgCiAgICBpZiAo IWNvZGUtPmV4dC5hbGxvYy5saXN0KQogICAgICByZXR1cm4gTlVMTF9UUkVF OwoqKioqKioqKioqKioqKiogZ2ZjX3RyYW5zX2FsbG9jYXRlIChnZmNfY29k ZSAqIGNvZGUpCioqKiA2MzI2LDYzMzEgKioqKgotLS0gNjMyNyw2MzYxIC0t LS0KICAJICAgIGdmY19mcmVlX2V4cHIgKHJocyk7CiAgCSAgZ2ZjX2FkZF9l eHByX3RvX2Jsb2NrICgmYmxvY2ssIHRtcCk7CiAgCX0KKyAgICAgICAvKiBT ZXQgS0lORCBhbmQgTEVOIFBEVCBjb21wb25lbnRzIGFuZCBhbGxvY2F0ZSB0 aG9zZSB0aGF0IGFyZQorICAgICAgICAgIHBhcmFtZXRlcml6ZWQuICAqLwor ICAgICAgIGVsc2UgaWYgKGV4cHItPnRzLnR5cGUgPT0gQlRfREVSSVZFRAor IAkgICAgICAgJiYgZXhwci0+dHMudS5kZXJpdmVkLT5hdHRyLnBkdF90eXBl KQorIAl7CisgCSAgaWYgKGNvZGUtPmV4cHIzICYmIGNvZGUtPmV4cHIzLT5w YXJhbV9saXN0KQorIAkgICAgcGFyYW1fbGlzdCA9IGNvZGUtPmV4cHIzLT5w YXJhbV9saXN0OworIAkgIGVsc2UgaWYgKGV4cHItPnBhcmFtX2xpc3QpCisg CSAgICBwYXJhbV9saXN0ID0gZXhwci0+cGFyYW1fbGlzdDsKKyAJICBlbHNl CisgCSAgICBwYXJhbV9saXN0ID0gZXhwci0+c3ltdHJlZS0+bi5zeW0tPnBh cmFtX2xpc3Q7CisgCSAgdG1wID0gZ2ZjX2FsbG9jYXRlX3BkdF9jb21wIChl eHByLT50cy51LmRlcml2ZWQsIHNlLmV4cHIsCisgCQkJCSAgICAgICBleHBy LT5yYW5rLCBwYXJhbV9saXN0KTsKKyAJICBnZmNfYWRkX2V4cHJfdG9fYmxv Y2sgKCZibG9jaywgdG1wKTsKKyAJfQorICAgICAgIC8qIERpdHRvIGZvciBD TEFTUyBleHByZXNzaW9ucy4gICovCisgICAgICAgZWxzZSBpZiAoZXhwci0+ dHMudHlwZSA9PSBCVF9DTEFTUworIAkgICAgICAgJiYgQ0xBU1NfREFUQSAo ZXhwciktPnRzLnUuZGVyaXZlZC0+YXR0ci5wZHRfdHlwZSkKKyAJeworIAkg IGlmIChjb2RlLT5leHByMyAmJiBjb2RlLT5leHByMy0+cGFyYW1fbGlzdCkK KyAJICAgIHBhcmFtX2xpc3QgPSBjb2RlLT5leHByMy0+cGFyYW1fbGlzdDsK KyAJICBlbHNlIGlmIChleHByLT5wYXJhbV9saXN0KQorIAkgICAgcGFyYW1f bGlzdCA9IGV4cHItPnBhcmFtX2xpc3Q7CisgCSAgZWxzZQorIAkgICAgcGFy YW1fbGlzdCA9IGV4cHItPnN5bXRyZWUtPm4uc3ltLT5wYXJhbV9saXN0Owor IAkgIHRtcCA9IGdmY19hbGxvY2F0ZV9wZHRfY29tcCAoQ0xBU1NfREFUQSAo ZXhwciktPnRzLnUuZGVyaXZlZCwKKyAJCQkJICAgICAgIHNlLmV4cHIsIGV4 cHItPnJhbmssIHBhcmFtX2xpc3QpOworIAkgIGdmY19hZGRfZXhwcl90b19i bG9jayAoJmJsb2NrLCB0bXApOworIAl9CiAgICAgICAgZWxzZSBpZiAoY29k ZS0+ZXhwcjMgJiYgY29kZS0+ZXhwcjMtPm1vbGQKICAJICAgICAgICYmIGNv ZGUtPmV4cHIzLT50cy50eXBlID09IEJUX0NMQVNTKQogIAl7CioqKioqKioq KioqKioqKiBnZmNfdHJhbnNfZGVhbGxvY2F0ZSAoZ2ZjX2NvZGUgKmNvZGUp CioqKiA2NTMzLDY1MzggKioqKgotLS0gNjU2Myw2NTgzIC0tLS0KICAgICAg ICBzZS5kZXNjcmlwdG9yX29ubHkgPSAxOwogICAgICAgIGdmY19jb252X2V4 cHIgKCZzZSwgZXhwcik7CiAgCisgICAgICAgLyogRGVhbGxvY2F0ZSBQRFQg Y29tcG9uZW50cyB0aGF0IGFyZSBwYXJhbWV0ZXJpemVkLiAgKi8KKyAgICAg ICB0bXAgPSBOVUxMOworICAgICAgIGlmIChleHByLT50cy50eXBlID09IEJU X0RFUklWRUQKKyAJICAmJiBleHByLT50cy51LmRlcml2ZWQtPmF0dHIucGR0 X3R5cGUKKyAJICAmJiBleHByLT5zeW10cmVlLT5uLnN5bS0+cGFyYW1fbGlz dCkKKyAJdG1wID0gZ2ZjX2RlYWxsb2NhdGVfcGR0X2NvbXAgKGV4cHItPnRz LnUuZGVyaXZlZCwgc2UuZXhwciwgZXhwci0+cmFuayk7CisgICAgICAgZWxz ZSBpZiAoZXhwci0+dHMudHlwZSA9PSBCVF9DTEFTUworIAkgICAgICAgJiYg Q0xBU1NfREFUQSAoZXhwciktPnRzLnUuZGVyaXZlZC0+YXR0ci5wZHRfdHlw ZQorIAkgICAgICAgJiYgZXhwci0+c3ltdHJlZS0+bi5zeW0tPnBhcmFtX2xp c3QpCisgCXRtcCA9IGdmY19kZWFsbG9jYXRlX3BkdF9jb21wIChDTEFTU19E QVRBIChleHByKS0+dHMudS5kZXJpdmVkLAorIAkJCQkgICAgICAgc2UuZXhw ciwgZXhwci0+cmFuayk7CisgCisgICAgICAgaWYgKHRtcCkKKyAJZ2ZjX2Fk ZF9leHByX3RvX2Jsb2NrICgmYmxvY2ssIHRtcCk7CisgCiAgICAgICAgaWYg KGZsYWdfY29hcnJheSA9PSBHRkNfRkNPQVJSQVlfTElCCiAgCSAgfHwgZmxh Z19jb2FycmF5ID09IEdGQ19GQ09BUlJBWV9TSU5HTEUpCiAgCXsKSW5kZXg6 IGdjYy9mb3J0cmFuL3RyYW5zLXR5cGVzLmMKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQoqKiogZ2NjL2ZvcnRyYW4vdHJhbnMtdHlwZXMuYwkocmV2aXNpb24g MjUxNTQ2KQotLS0gZ2NjL2ZvcnRyYW4vdHJhbnMtdHlwZXMuYwkod29ya2lu ZyBjb3B5KQoqKioqKioqKioqKioqKiogZ2ZjX2dldF9kZXJpdmVkX3R5cGUg KGdmY19zeW1ib2wgKiBkZXJpdgoqKiogMjQ0MSwyNDQ2ICoqKioKLS0tIDI0 NDEsMjQ0OCAtLS0tCiAgICBnZmNfbmFtZXNwYWNlICpuczsKICAgIHRyZWUg dG1wOwogIAorICAgZ2NjX2Fzc2VydCAoIWRlcml2ZWQtPmF0dHIucGR0X3Rl bXBsYXRlKTsKKyAKICAgIGlmIChkZXJpdmVkLT5hdHRyLnVubGltaXRlZF9w b2x5bW9ycGhpYwogICAgICAgIHx8IChmbGFnX2NvYXJyYXkgPT0gR0ZDX0ZD T0FSUkFZX0xJQgogIAkgICYmIGRlcml2ZWQtPmZyb21faW50bW9kID09IElO VE1PRF9JU09fRk9SVFJBTl9FTlYKKioqKioqKioqKioqKioqIGdmY19nZXRf ZGVyaXZlZF90eXBlIChnZmNfc3ltYm9sICogZGVyaXYKKioqIDI2MzUsMjY0 MSAqKioqCiAgICAgICAgICBmaWVsZF90eXBlID0gYy0+dHMudS5kZXJpdmVk LT5iYWNrZW5kX2RlY2w7CiAgICAgICAgZWxzZQogIAl7CiEgCSAgaWYgKGMt PnRzLnR5cGUgPT0gQlRfQ0hBUkFDVEVSICYmICFjLT50cy5kZWZlcnJlZCkK ICAJICAgIHsKICAJICAgICAgLyogRXZhbHVhdGUgdGhlIHN0cmluZyBsZW5n dGguICAqLwogIAkgICAgICBnZmNfY29udl9jb25zdF9jaGFybGVuIChjLT50 cy51LmNsKTsKLS0tIDI2MzcsMjY0NCAtLS0tCiAgICAgICAgICBmaWVsZF90 eXBlID0gYy0+dHMudS5kZXJpdmVkLT5iYWNrZW5kX2RlY2w7CiAgICAgICAg ZWxzZQogIAl7CiEgCSAgaWYgKGMtPnRzLnR5cGUgPT0gQlRfQ0hBUkFDVEVS CiEgCSAgICAgICYmICFjLT50cy5kZWZlcnJlZCAmJiAhYy0+YXR0ci5wZHRf c3RyaW5nKQogIAkgICAgewogIAkgICAgICAvKiBFdmFsdWF0ZSB0aGUgc3Ry aW5nIGxlbmd0aC4gICovCiAgCSAgICAgIGdmY19jb252X2NvbnN0X2NoYXJs ZW4gKGMtPnRzLnUuY2wpOwoqKioqKioqKioqKioqKiogZ2ZjX2dldF9kZXJp dmVkX3R5cGUgKGdmY19zeW1ib2wgKiBkZXJpdgoqKiogMjY1MiwyNjU4ICoq KioKICAgICAgICAgICByZXF1aXJlZC4gICovCiAgICAgICAgaWYgKChjLT5h dHRyLmRpbWVuc2lvbiB8fCBjLT5hdHRyLmNvZGltZW5zaW9uKSAmJiAhYy0+ YXR0ci5wcm9jX3BvaW50ZXIgKQogIAl7CiEgCSAgaWYgKGMtPmF0dHIucG9p bnRlciB8fCBjLT5hdHRyLmFsbG9jYXRhYmxlKQogIAkgICAgewogIAkgICAg ICBlbnVtIGdmY19hcnJheV9raW5kIGFraW5kOwogIAkgICAgICBpZiAoYy0+ YXR0ci5wb2ludGVyKQotLS0gMjY1NSwyNjYxIC0tLS0KICAgICAgICAgICBy ZXF1aXJlZC4gICovCiAgICAgICAgaWYgKChjLT5hdHRyLmRpbWVuc2lvbiB8 fCBjLT5hdHRyLmNvZGltZW5zaW9uKSAmJiAhYy0+YXR0ci5wcm9jX3BvaW50 ZXIgKQogIAl7CiEgCSAgaWYgKGMtPmF0dHIucG9pbnRlciB8fCBjLT5hdHRy LmFsbG9jYXRhYmxlIHx8IGMtPmF0dHIucGR0X2FycmF5KQogIAkgICAgewog IAkgICAgICBlbnVtIGdmY19hcnJheV9raW5kIGFraW5kOwogIAkgICAgICBp ZiAoYy0+YXR0ci5wb2ludGVyKQoqKioqKioqKioqKioqKiogZ2ZjX2dldF9k ZXJpdmVkX3R5cGUgKGdmY19zeW1ib2wgKiBkZXJpdgoqKiogMjY3MywyNjc5 ICoqKioKICAJCQkJCQkgICAgUEFDS0VEX1NUQVRJQywKICAJCQkJCQkgICAg IWMtPmF0dHIudGFyZ2V0KTsKICAJfQohICAgICAgIGVsc2UgaWYgKChjLT5h dHRyLnBvaW50ZXIgfHwgYy0+YXR0ci5hbGxvY2F0YWJsZSkKICAJICAgICAg ICYmICFjLT5hdHRyLnByb2NfcG9pbnRlcgogIAkgICAgICAgJiYgISh1bmxp bWl0ZWRfZW50aXR5ICYmIGMgPT0gZGVyaXZlZC0+Y29tcG9uZW50cykpCiAg CWZpZWxkX3R5cGUgPSBidWlsZF9wb2ludGVyX3R5cGUgKGZpZWxkX3R5cGUp OwotLS0gMjY3NiwyNjgyIC0tLS0KICAJCQkJCQkgICAgUEFDS0VEX1NUQVRJ QywKICAJCQkJCQkgICAgIWMtPmF0dHIudGFyZ2V0KTsKICAJfQohICAgICAg IGVsc2UgaWYgKChjLT5hdHRyLnBvaW50ZXIgfHwgYy0+YXR0ci5hbGxvY2F0 YWJsZSB8fCBjLT5hdHRyLnBkdF9zdHJpbmcpCiAgCSAgICAgICAmJiAhYy0+ YXR0ci5wcm9jX3BvaW50ZXIKICAJICAgICAgICYmICEodW5saW1pdGVkX2Vu dGl0eSAmJiBjID09IGRlcml2ZWQtPmNvbXBvbmVudHMpKQogIAlmaWVsZF90 eXBlID0gYnVpbGRfcG9pbnRlcl90eXBlIChmaWVsZF90eXBlKTsKSW5kZXg6 IGdjYy9mb3J0cmFuL3RyYW5zLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoq KiogZ2NjL2ZvcnRyYW4vdHJhbnMuYwkocmV2aXNpb24gMjUxNTQ2KQotLS0g Z2NjL2ZvcnRyYW4vdHJhbnMuYwkod29ya2luZyBjb3B5KQoqKioqKioqKioq KioqKiogZ2ZjX2RlZmVycmVkX3N0cmxlbiAoZ2ZjX2NvbXBvbmVudCAqYywg dAoqKiogMjMwMiwyMzA4ICoqKioKICB7CiAgICBjaGFyIG5hbWVbR0ZDX01B WF9TWU1CT0xfTEVOKzldOwogICAgZ2ZjX2NvbXBvbmVudCAqc3RybGVuOwoh ICAgaWYgKCEoYy0+dHMudHlwZSA9PSBCVF9DSEFSQUNURVIgJiYgYy0+dHMu ZGVmZXJyZWQpKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBzcHJpbnRmIChu YW1lLCAiXyVzX2xlbmd0aCIsIGMtPm5hbWUpOwogICAgZm9yIChzdHJsZW4g PSBjOyBzdHJsZW47IHN0cmxlbiA9IHN0cmxlbi0+bmV4dCkKLS0tIDIzMDIs MjMwOSAtLS0tCiAgewogICAgY2hhciBuYW1lW0dGQ19NQVhfU1lNQk9MX0xF Tis5XTsKICAgIGdmY19jb21wb25lbnQgKnN0cmxlbjsKISAgIGlmICghKGMt PnRzLnR5cGUgPT0gQlRfQ0hBUkFDVEVSCiEgCSYmIChjLT50cy5kZWZlcnJl ZCB8fCBjLT5hdHRyLnBkdF9zdHJpbmcpKSkKICAgICAgcmV0dXJuIGZhbHNl OwogICAgc3ByaW50ZiAobmFtZSwgIl8lc19sZW5ndGgiLCBjLT5uYW1lKTsK ICAgIGZvciAoc3RybGVuID0gYzsgc3RybGVuOyBzdHJsZW4gPSBzdHJsZW4t Pm5leHQpCkluZGV4OiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BkdF8x LmYwMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiBnY2MvdGVzdHN1aXRl L2dmb3J0cmFuLmRnL3BkdF8xLmYwMwkobm9uZXhpc3RlbnQpCi0tLSBnY2Mv dGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BkdF8xLmYwMwkod29ya2luZyBjb3B5 KQoqKioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw2MiAtLS0tCisg ISB7IGRnLWRvIHJ1biB9CisgISB7IGRnLW9wdGlvbnMgIi1mY2hlY2s9YWxs IiB9CisgIQorICEgQmFzaWMgY2hlY2sgb2YgUGFyYW1ldGVyaXplZCBEZXJp dmVkIFR5cGVzLgorICEKKyAhIC1mY2hlY2s9YWxsIGlzIHVzZWQgaGVyZSB0 byBlbnN1cmUgdGhhdCB3aGVuIHRoZSBwYXJhbWV0ZXIKKyAhICdiJyBvZiB0 aGUgZHVtbXkgaW4gJ2ZvbycgaXMgYXNzdW1lZCwgdGhlcmUgaXMgbm8gZXJy b3IuCisgISBMaWtld2lzZSBpbiAnYmFyJyBhbmQgJ2Zvb2JhcicsIHdoZW4g J2InIGhhcyB0aGUgY29ycmVjdAorICEgZXhwbGljaXQgdmFsdWUuCisgIQor ICAgaW1wbGljaXQgbm9uZQorICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGZ0 eXBlID0ga2luZCgwLjBlMCkKKyAgIGludGVnZXIgOjogcGR0X2xlbiA9IDQK KyAgIGludGVnZXIgOjogaQorICAgdHlwZSA6OiBteXR5cGUgKGEsYikKKyAg ICAgaW50ZWdlciwga2luZCA6OiBhID0ga2luZCgwLjBkMCkKKyAgICAgaW50 ZWdlciwgTEVOIDo6IGIKKyAgICAgaW50ZWdlciA6OiBpCisgICAgIHJlYWwo a2luZCA9IGEpIDo6IGQoYiwgYikKKyAgICAgY2hhcmFjdGVyIChsZW4gPSBi KmIpIDo6IGNocgorICAgZW5kIHR5cGUKKyAKKyAgIHR5cGUobXl0eXBlKGI9 NCkpIDo6IHooMikKKyAgIHR5cGUobXl0eXBlKGZ0eXBlLCBwZHRfbGVuKSkg OjogejIKKyAKKyAgIHooMSklaSA9IDEKKyAgIHooMiklaSA9IDIKKyAgIHoo MSklZCA9IHJlc2hhcGUgKFsocmVhbChpKSwgaSA9IDEsIDE2KV0sWzQsNF0p CisgICB6KDIpJWQgPSAxMCp6KDEpJWQKKyAgIHooMSklY2hyID0gImhlbGxv IHBkdCIKKyAgIHooMiklY2hyID0gImdvb2RieWUgcGR0IgorIAorICAgejIl ZCA9IHooMSklZCAqIDEwIC0gMQorICAgejIlY2hyID0gInNjYWxhciBwZHQi CisgCisgICBjYWxsIGZvbyAoeikKKyAgIGNhbGwgYmFyICh6KQorICAgY2Fs bCBmb29iYXIgKHoyKQorIGNvbnRhaW5zCisgICBlbGVtZW50YWwgc3Vicm91 dGluZSBmb28gKGFyZykKKyAgICAgdHlwZShteXR5cGUoOCwqKSksIGludGVu dChpbikgOjogYXJnCisgICAgIGlmIChhcmclaSAuZXEuIDEpIHRoZW4KKyAg ICAgICBpZiAodHJpbSAoYXJnJWNocikgLm5lLiAiaGVsbG8gcGR0IikgZXJy b3Igc3RvcAorICAgICAgIGlmIChpbnQgKHN1bSAoYXJnJWQpKSAubmUuIDEz NikgZXJyb3Igc3RvcAorICAgICBlbHNlIGlmIChhcmclaSAuZXEuIDIgKSB0 aGVuCisgICAgICAgaWYgKHRyaW0gKGFyZyVjaHIpIC5uZS4gImdvb2RieWUg cGR0IikgZXJyb3Igc3RvcAorICAgICAgIGlmIChpbnQgKHN1bSAoYXJnJWQp KSAubmUuIDEzNjApIGVycm9yIHN0b3AKKyAgICAgZWxzZQorICAgICAgIGVy cm9yIHN0b3AKKyAgICAgZW5kIGlmCisgICBlbmQgc3Vicm91dGluZQorICAg c3Vicm91dGluZSBiYXIgKGFyZykKKyAgICAgdHlwZShteXR5cGUoYj00KSkg OjogYXJnKDopCisgICAgIGlmIChpbnQgKHN1bSAoYXJnKDEpJWQpKSAubmUu IDEzNikgY2FsbCBhYm9ydAorICAgICBpZiAodHJpbSAoYXJnKDIpJWNocikg Lm5lLiAiZ29vZGJ5ZSBwZHQiKSBjYWxsIGFib3J0CisgICBlbmQgc3Vicm91 dGluZQorICAgc3Vicm91dGluZSBmb29iYXIgKGFyZykKKyAgICAgdHlwZSht eXR5cGUoZnR5cGUsIHBkdF9sZW4pKSA6OiBhcmcKKyAgICAgaWYgKGludCAo c3VtIChhcmclZCkpIC5uZS4gMTM0NCkgY2FsbCBhYm9ydAorICAgICBpZiAo dHJpbSAoYXJnJWNocikgLm5lLiAic2NhbGFyIHBkdCIpIGNhbGwgYWJvcnQK KyAgIGVuZCBzdWJyb3V0aW5lCisgZW5kCkluZGV4OiBnY2MvdGVzdHN1aXRl L2dmb3J0cmFuLmRnL3BkdF8yLmYwMwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CioqKiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BkdF8yLmYwMwkobm9u ZXhpc3RlbnQpCi0tLSBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BkdF8y LmYwMwkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKioKKioqIDAgKioq KgotLS0gMSwyNyAtLS0tCisgISB7IGRnLWRvIHJ1biB9CisgISB7IGRnLW9w dGlvbnMgIi1mY2hlY2s9YWxsIiB9CisgISB7IGRnLXNob3VsZGZhaWwgInZh bHVlIG9mIHRoZSBQRFQgTEVOIHBhcmFtZXRlciIgfQorICEKKyAhIFJlZHVj ZWQgdmVyc2lvbiBvZiBwZHRfMS5mMDMgdG8gY2hlY2sgdGhhdCBhbiBpbmNv cnJlY3QKKyAhIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyICdiJyBpbiB0aGUg ZHVtbXkgaXMgcGlja2VkIHVwLgorICEKKyAgIGltcGxpY2l0IG5vbmUKKyAg IGludGVnZXIsIHBhcmFtZXRlciA6OiBmdHlwZSA9IGtpbmQoMC4wZTApCisg ICBpbnRlZ2VyIDo6IHBkdF9sZW4gPSA0CisgICBpbnRlZ2VyIDo6IGkKKyAg IHR5cGUgOjogbXl0eXBlIChhLGIpCisgICAgIGludGVnZXIsIGtpbmQgOjog YSA9IGtpbmQoMC4wZDApCisgICAgIGludGVnZXIsIExFTiA6OiBiCisgICAg IGludGVnZXIgOjogaQorICAgICByZWFsKGtpbmQgPSBhKSA6OiBkKGIsIGIp CisgICAgIGNoYXJhY3RlciAobGVuID0gYipiKSA6OiBjaHIKKyAgIGVuZCB0 eXBlCisgCisgICB0eXBlKG15dHlwZShmdHlwZSwgcGR0X2xlbikpIDo6IHoy CisgICBjYWxsIGZvb2JhciAoejIpCisgY29udGFpbnMKKyAgIHN1YnJvdXRp bmUgZm9vYmFyIChhcmcpCisgICAgIHR5cGUobXl0eXBlKGZ0eXBlLCA4KSkg OjogYXJnCisgICAgIHByaW50ICosIGFyZyVpCisgICBlbmQgc3Vicm91dGlu ZQorIGVuZApJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wZHRf My5mMDMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3RzdWl0 ZS9nZm9ydHJhbi5kZy9wZHRfMy5mMDMJKG5vbmV4aXN0ZW50KQotLS0gZ2Nj L3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wZHRfMy5mMDMJKHdvcmtpbmcgY29w eSkKKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEsNzkgLS0tLQor ICEgeyBkZy1kbyBydW4gfQorICEKKyAhIENoZWNrIFBEVCB0eXBlIGV4dGVu c2lvbiBhbmQgc2ltcGxlIE9PUC4KKyAhCisgbW9kdWxlIHZhcnMKKyAgIGlu dGVnZXIgOjogZF9kaW0gPSA0CisgICBpbnRlZ2VyIDo6IG1hdF9kaW0gPSAy NTYKKyAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBmdHlwZSA9IGtpbmQoMC4w ZDApCisgZW5kIG1vZHVsZQorIAorICAgdXNlIHZhcnMKKyAgIGltcGxpY2l0 IG5vbmUKKyAgIGludGVnZXIgOjogaQorICAgdHlwZSA6OiBteXR5cGUgKGEs YikKKyAgICAgaW50ZWdlciwga2luZCA6OiBhID0ga2luZCgwLjBlMCkKKyAg ICAgaW50ZWdlciwgTEVOIDo6IGIgPSA0CisgICAgIGludGVnZXIgOjogaQor ICAgICByZWFsKGtpbmQgPSBhKSA6OiBkKGIsIGIpCisgICBlbmQgdHlwZQor IAorICAgdHlwZSwgZXh0ZW5kcyhteXR5cGUpIDo6IHRoeXR5cGUoaCkKKyAg ICAgaW50ZWdlciwga2luZCA6OiBoCisgICAgIGludGVnZXIoa2luZCA9IGgp IDo6IGoKKyAgIGVuZCB0eXBlCisgCisgICB0eXBlIHggKHEsIHIsIHMpCisg ICAgIGludGVnZXIsIGtpbmQgOjogcQorICAgICBpbnRlZ2VyLCBraW5kIDo6 IHIKKyAgICAgaW50ZWdlciwgTEVOIDo6IHMKKyAgICAgaW50ZWdlcihraW5k ID0gcSkgOjogaWR4X21hdCgyLDIpICAhIGNoZWNrIHRoZXNlIGRvIG5vdCBn ZXQgdHJlYXRlZCBhcyBwZHRfYXJyYXlzLgorICAgICB0eXBlIChteXR5cGUg KGI9cykpIDo6IG1hdDEKKyAgICAgdHlwZSAobXl0eXBlIChiPXMqMikpIDo6 IG1hdDIKKyAgIGVuZCB0eXBlIHgKKyAKKyAgIHJlYWwsIGFsbG9jYXRhYmxl IDo6IG1hdHJpeCAoOiw6KQorICAgdHlwZSh0aHl0eXBlKGZ0eXBlLCA0LCA0 KSkgOjogdworICAgdHlwZSh4KDgsNCxtYXRfZGltKSkgOjogcQorICAgY2xh c3MobXl0eXBlKGZ0eXBlLCA6KSksIGFsbG9jYXRhYmxlIDo6IGN6CisgCisg ICB3JWQgPSByZXNoYXBlIChbKHJlYWwoaSksIGkgPSAxLCBkX2RpbSpkX2Rp bSldLFtkX2RpbSxkX2RpbV0pCisgCisgISBNYWtlIHN1cmUgdGhhdCB0aGUg dHlwZSBleHRlbnNpb24gaXMgb3JkZXJpbmcgdGhlIHBhcmFtZXRlcnMgY29y cmVjdGx5LgorICAgaWYgKHclYSAubmUuIGZ0eXBlKSBjYWxsIGFib3J0Cisg ICBpZiAodyViIC5uZS4gNCkgY2FsbCBhYm9ydAorICAgaWYgKHclaCAubmUu IDQpIGNhbGwgYWJvcnQKKyAgIGlmIChzaXplICh3JWQpIC5uZS4gMTYpIGNh bGwgYWJvcnQKKyAgIGlmIChpbnQgKHclZCgyLDQpKSAubmUuIDE0KSBjYWxs IGFib3J0CisgICBpZiAoa2luZCAodyVqKSAubmUuIHclaCkgY2FsbCBhYm9y dAorIAorICEgQXMgYSBzaWRlIGlzc3VlLCBlbnN1cmUgUERUIGNvbXBvbmVu dHMgYXJlIE9LCisgICBpZiAocSVtYXQxJWIgLm5lLiBxJXMpIGNhbGwgYWJv cnQKKyAgIGlmIChxJW1hdDIlYiAubmUuIHElcyoyKSBjYWxsIGFib3J0Cisg ICBpZiAoc2l6ZSAocSVtYXQxJWQpIC5uZS4gbWF0X2RpbSoqMikgY2FsbCBh Ym9ydAorICAgaWYgKHNpemUgKHElbWF0MiVkKSAubmUuIDQqbWF0X2RpbSoq MikgY2FsbCBhYm9ydAorIAorICEgTm93IGNoZWNrIHNvbWUgYmFzaWMgT09Q IHdpdGggUERUcworICAgbWF0cml4ID0gdyVkCisgCisgISBUT0RPIC0gZm9y IHNvbWUgcmVhc29uLCB1c2luZyB3JWQgZGlyZWN0bHkgaW4gdGhlIHNvdXJj ZSBjYXVzZXMgYSBzZWcgZmF1bHQuCisgICBhbGxvY2F0ZSAoY3osIHNvdXJj ZSA9IG15dHlwZShmdHlwZSwgZF9kaW0sIDAsIG1hdHJpeCkpCisgICBzZWxl Y3QgdHlwZSAoY3opCisgICAgIHR5cGUgaXMgKG15dHlwZShmdHlwZSwgKikp CisgICAgICAgaWYgKGludCAoc3VtIChjeiVkKSkgLm5lLiAxMzYpIGNhbGwg YWJvcnQKKyAgICAgdHlwZSBpcyAodGh5dHlwZShmdHlwZSwgKiwgOCkpCisg ICAgICAgY2FsbCBhYm9ydAorICAgZW5kIHNlbGVjdAorICAgZGVhbGxvY2F0 ZSAoY3opCisgCisgICBhbGxvY2F0ZSAodGh5dHlwZShmdHlwZSwgZF9kaW0q MiwgOCkgOjogY3opCisgICBjeiVkID0gcmVzaGFwZSAoWyhpKjEwLCBpID0g MSwgY3olYioqMildLCBbY3olYixjeiViXSkKKyAgIHNlbGVjdCB0eXBlIChj eikKKyAgICAgdHlwZSBpcyAobXl0eXBlKGZ0eXBlLCAqKSkKKyAgICAgICBj YWxsIGFib3J0CisgICAgIHR5cGUgaXMgKHRoeXR5cGUoZnR5cGUsICosIDgp KQorICAgICAgIGlmIChpbnQgKHN1bSAoY3olZCkpIC5uZS4gMjA4MDApIGNh bGwgYWJvcnQKKyAgIGVuZCBzZWxlY3QKKyAKKyAgIGRlYWxsb2NhdGUgKGN6 KQorIGVuZApJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wZHRf NC5mMDMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3RzdWl0 ZS9nZm9ydHJhbi5kZy9wZHRfNC5mMDMJKG5vbmV4aXN0ZW50KQotLS0gZ2Nj L3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wZHRfNC5mMDMJKHdvcmtpbmcgY29w eSkKKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEsOTAgLS0tLQor ICEgeyBkZy1kbyBjb21waWxlIH0KKyAhCisgISBUZXN0IGJhZCBQRFQgY29k aW5nOiBCYXNlZCBvbiBwZHRfMy5mMDMKKyAhCisgbW9kdWxlIHZhcnMKKyAg IGludGVnZXIgOjogZF9kaW0gPSA0CisgICBpbnRlZ2VyIDo6IG1hdF9kaW0g PSAyNTYKKyAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBmdHlwZSA9IGtpbmQo MC4wZDApCisgZW5kIG1vZHVsZQorIAorICAgdXNlIHZhcnMKKyAgIGltcGxp Y2l0IG5vbmUKKyAgIGludGVnZXIgOjogaQorICAgaW50ZWdlciwga2luZCA6 OiBiYWRfa2luZCAgICAhIHsgZGctZXJyb3IgIm5vdCBhbGxvd2VkIG91dHNp ZGUgYSBUWVBFIGRlZmluaXRpb24iIH0KKyAgIGludGVnZXIsIGxlbiA6OiBi YWRfbGVuICAgICAgISB7IGRnLWVycm9yICJub3QgYWxsb3dlZCBvdXRzaWRl IGEgVFlQRSBkZWZpbml0aW9uIiB9CisgCisgICB0eXBlIDo6IGJhZF9wZHQg KGEsYiwgYywgZCkKKyAgICAgcmVhbCwga2luZCA6OiBhICAgICAgICAgICAg ISB7IGRnLWVycm9yICJtdXN0IGJlIElOVEVHRVIiIH0KKyAgICAgSU5URUdF Uig4KSwga2luZCA6OiBiICAgICAgISB7IGRnLWVycm9yICJiZSBkZWZhdWx0 IGludGVnZXIga2luZCIgfQorICAgICByZWFsLCBMRU4gOjogYyAgICAgICAg ICAgICAhIHsgZGctZXJyb3IgIm11c3QgYmUgSU5URUdFUiIgfQorICAgICBJ TlRFR0VSKDgpLCBMRU4gOjogZCAgICAgICAhIHsgZGctZXJyb3IgImJlIGRl ZmF1bHQgaW50ZWdlciBraW5kIiB9CisgICBlbmQgdHlwZQorIAorICAgdHlw ZSA6OiBteXR5cGUgKGEsYikKKyAgICAgaW50ZWdlciwga2luZCA6OiBhID0g a2luZCgwLjBlMCkKKyAgICAgaW50ZWdlciwgTEVOIDo6IGIgPSA0CisgICAg IGludGVnZXIgOjogaQorICAgICByZWFsKGtpbmQgPSBhKSA6OiBkKGIsIGIp CisgICBlbmQgdHlwZQorIAorICAgdHlwZSwgZXh0ZW5kcyhteXR5cGUpIDo6 IHRoeXR5cGUoaCkKKyAgICAgaW50ZWdlciwga2luZCA6OiBoCisgICAgIGlu dGVnZXIoa2luZCA9IGgpIDo6IGoKKyAgIGVuZCB0eXBlCisgCisgICB0eXBl IHggKHEsIHIsIHMpCisgICAgIGludGVnZXIsIGtpbmQgOjogcQorICAgICBp bnRlZ2VyLCBraW5kIDo6IHIKKyAgICAgaW50ZWdlciwgTEVOIDo6IHMKKyAg ICAgaW50ZWdlcihraW5kID0gcSkgOjogaWR4X21hdCgyLDIpCisgICAgIHR5 cGUgKG15dHlwZSAoYj1zKSkgOjogbWF0MQorICAgICB0eXBlIChteXR5cGUg KGI9cyoyKSkgOjogbWF0MgorICAgZW5kIHR5cGUgeAorIAorICAgcmVhbCwg YWxsb2NhdGFibGUgOjogbWF0cml4ICg6LDopCisgCisgISBCYWQgS0lORCBw YXJhbWV0ZXJzCisgICB0eXBlKHRoeXR5cGUoZF9kaW0sIDQsIDQpKSA6OiB3 YmFkICEgeyBkZy1lcnJvciAiZG9lcyBub3QgcmVkdWNlIHRvIGEgY29uc3Rh bnQiIH0KKyAgIHR5cGUodGh5dHlwZSgqLCA0LCA0KSkgOjogd29yc2UgICAg ISB7IGRnLWVycm9yICJjYW5ub3QgZWl0aGVyIGJlIEFTU1VNRUQgb3IgREVG RVJSRUQiIH0KKyAgIHR5cGUodGh5dHlwZSg6LCA0LCA0KSkgOjogd191Z2gg ICAgISB7IGRnLWVycm9yICJjYW5ub3QgZWl0aGVyIGJlIEFTU1VNRUQgb3Ig REVGRVJSRUQiIH0KKyAKKyAgIHR5cGUodGh5dHlwZShmdHlwZSwgYj00LCBo PTQpKSA6OiB3CisgICB0eXBlKHgoOCw0LG1hdF9kaW0pKSA6OiBxCisgICBj bGFzcyhteXR5cGUoZnR5cGUsIDopKSwgYWxsb2NhdGFibGUgOjogY3oKKyAK KyAgIHclYSA9IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAhIHsgZGct ZXJyb3IgImFzc2lnbm1lbnQgdG8gYSBLSU5EIG9yIExFTiBjb21wb25lbnQi IH0KKyAgIHclYiA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAhIHsg ZGctZXJyb3IgImFzc2lnbm1lbnQgdG8gYSBLSU5EIG9yIExFTiBjb21wb25l bnQiIH0KKyAgIHclaCA9IDMgICAgICAgICAgICAgICAgICAgICAgICAgICAh IHsgZGctZXJyb3IgImFzc2lnbm1lbnQgdG8gYSBLSU5EIG9yIExFTiBjb21w b25lbnQiIH0KKyAKKyAgIHclZCA9IHJlc2hhcGUgKFsocmVhbChpKSwgaSA9 IDEsIGRfZGltKmRfZGltKV0sW2RfZGltLGRfZGltXSkKKyAKKyAgIG1hdHJp eCA9IHclZAorIAorICAgYWxsb2NhdGUgKGN6LCBzb3VyY2UgPSBteXR5cGUo KiwgZF9kaW0sIDAsIG1hdHJpeCkpICEgeyBkZy1lcnJvciAiU3ludGF4IGVy cm9yIiB9CisgICBhbGxvY2F0ZSAoY3osIHNvdXJjZSA9IG15dHlwZShmdHlw ZSwgOiwgMCwgbWF0cml4KSkgISB7IGRnLWVycm9yICJTeW50YXggZXJyb3Ii IH0KKyAgIHNlbGVjdCB0eXBlIChjeikKKyAgICAgdHlwZSBpcyAobXl0eXBl KGZ0eXBlLCBkX2RpbSkpICAhIHsgZGctZXJyb3IgIm11c3QgYmUgQVNTVU1F RCIgfQorICAgICAgIGlmIChpbnQgKHN1bSAoY3olZCkpIC5uZS4gMTM2KSBj YWxsIGFib3J0ICEgeyBkZy1lcnJvciAiRXhwZWN0ZWQgVFlQRSBJUyIgfQor ICAgICB0eXBlIGlzICh0aHl0eXBlKGZ0eXBlLCAqLCA4KSkKKyAgICAgICBj YWxsIGFib3J0CisgICBlbmQgc2VsZWN0CisgICBkZWFsbG9jYXRlIChjeikK KyAKKyAgIGFsbG9jYXRlICh0aHl0eXBlKGZ0eXBlLCBkX2RpbSoyLCA4KSA6 OiBjeikKKyAgIGN6JWQgPSByZXNoYXBlIChbKGkqMTAsIGkgPSAxLCBjeiVi KioyKV0sIFtjeiViLGN6JWJdKQorICAgc2VsZWN0IHR5cGUgKGN6KQorICAg ICB0eXBlIGlzIChteXR5cGUoNCwgKikpICAgICAgICAhICB7IGRnLWVycm9y ICJtdXN0IGJlIGFuIGV4dGVuc2lvbiIgfQorICAgICAgIGNhbGwgYWJvcnQK KyAgICAgdHlwZSBpcyAodGh5dHlwZShmdHlwZSwgKiwgOCkpCisgICAgICAg aWYgKGludCAoc3VtIChjeiVkKSkgLm5lLiAyMDgwMCkgY2FsbCBhYm9ydAor ICAgZW5kIHNlbGVjdAorICAgZGVhbGxvY2F0ZSAoY3opCisgY29udGFpbnMK KyAgIHN1YnJvdXRpbmUgZm9vKGFyZykgICAgICAgICAgICAgICAhIHsgZGct ZXJyb3IgImhhcyBubyBJTVBMSUNJVCB0eXBlIiB9CisgICAgIHR5cGUgKG15 dHlwZSg0LCAqKSkgOjogYXJnICAgICAgISB7IGRnLWVycm9yICJpcyBiZWlu ZyB1c2VkIGJlZm9yZSBpdCBpcyBkZWZpbmVkIiB9CisgICBlbmQgc3Vicm91 dGluZQorICAgc3Vicm91dGluZSBiYXIoYXJnKSAgICAgICAgICAgICAgICEg eyBkZy1lcnJvciAiY2Fubm90IGhhdmUgREVGRVJSRUQgdHlwZSBwYXJhbWV0 ZXJzIiB9CisgICAgIHR5cGUgKHRoeXR5cGUoOCwgOiwgNCkgOjogYXJnCisg ICBlbmQgc3Vicm91dGluZQorIGVuZApJbmRleDogZ2NjL3Rlc3RzdWl0ZS9n Zm9ydHJhbi5kZy9wZHRfNS5mMDMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoq KiogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wZHRfNS5mMDMJKG5vbmV4 aXN0ZW50KQotLS0gZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wZHRfNS5m MDMJKHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqCioqKiAwICoqKioK LS0tIDEsMjIzIC0tLS0KKyAhIHsgZGctZG8gcnVuIH0KKyAhCisgISBUaGly ZCwgY29tcGxldGUgZXhhbXBsZSBmcm9tIHRoZSBQR0luc2lkZXIgYXJ0aWNs ZToKKyAhICJPYmplY3QtT3JpZW50ZWQgUHJvZ3JhbW1pbmcgaW4gRm9ydHJh biAyMDAzIFBhcnQgMzogUGFyYW1ldGVyaXplZCBEZXJpdmVkIFR5cGVzIgor ICEgYnkgTWFyayBMZWFpcgorICEKKyAhICAgICBDb3B5cmlnaHQgKGMpIDIw MTMsIE5WSURJQSBDT1JQT1JBVElPTi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu CisgIQorICEgTlZJRElBIENPUlBPUkFUSU9OIGFuZCBpdHMgbGljZW5zb3Jz IHJldGFpbiBhbGwgaW50ZWxsZWN0dWFsIHByb3BlcnR5CisgISBhbmQgcHJv cHJpZXRhcnkgcmlnaHRzIGluIGFuZCB0byB0aGlzIHNvZnR3YXJlLCByZWxh dGVkIGRvY3VtZW50YXRpb24KKyAhIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyB0 aGVyZXRvLiAgQW55IHVzZSwgcmVwcm9kdWN0aW9uLCBkaXNjbG9zdXJlIG9y CisgISBkaXN0cmlidXRpb24gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgcmVsYXRl ZCBkb2N1bWVudGF0aW9uIHdpdGhvdXQgYW4gZXhwcmVzcworICEgbGljZW5z ZSBhZ3JlZW1lbnQgZnJvbSBOVklESUEgQ09SUE9SQVRJT04gaXMgc3RyaWN0 bHkgcHJvaGliaXRlZC4KKyAhCisgCisgISAgICAgICAgICBUSElTIENPREUg QU5EIElORk9STUFUSU9OIEFSRSBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQK KyAhICAgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQg T1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAorICEgICBOT1QgTElNSVRFRCBU TyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB TkQvT1IKKyAhICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu CisgIQorICEgTm90ZSB0aGF0IG1vZGlmaWNhdGlvbiBoYWQgdG8gYmUgbWFk ZSBhbGwgb2Ygd2hpY2ggYXJlIGNvbW1lbnRlZC4KKyAhCisgbW9kdWxlIG1h dHJpeAorIAorIHR5cGUgOjogYmFzZV9tYXRyaXgoayxjLHIpCisgICBwcml2 YXRlCisgICAgIGludGVnZXIsIGtpbmQgOjogayA9IDQKKyAgICAgaW50ZWdl ciwgbGVuIDo6IGMgPSAxCisgICAgIGludGVnZXIsIGxlbiA6OiByID0gMQor IGVuZCB0eXBlIGJhc2VfbWF0cml4CisgCisgdHlwZSwgZXh0ZW5kcyhiYXNl X21hdHJpeCkgOjogIGFkal9tYXRyaXgKKyAgIHByaXZhdGUKKyAgICAgY2xh c3MoKiksIHBvaW50ZXIgOjogbSg6LDopID0+IG51bGwoKQorIGVuZCB0eXBl IGFkal9tYXRyaXgKKyAKKyBpbnRlcmZhY2UgZ2V0S2luZAorICAgbW9kdWxl IHByb2NlZHVyZSBnZXRLaW5kNAorICAgbW9kdWxlIHByb2NlZHVyZSBnZXRL aW5kOAorIGVuZCBpbnRlcmZhY2UgZ2V0S2luZAorIAorIGludGVyZmFjZSBn ZXRDb2x1bW5zCisgICBtb2R1bGUgcHJvY2VkdXJlIGdldE51bUNvbHM0Cisg ICBtb2R1bGUgcHJvY2VkdXJlIGdldE51bUNvbHM4CisgZW5kIGludGVyZmFj ZSBnZXRDb2x1bW5zCisgCisgaW50ZXJmYWNlIGdldFJvd3MKKyAgIG1vZHVs ZSBwcm9jZWR1cmUgZ2V0TnVtUm93czQKKyAgIG1vZHVsZSBwcm9jZWR1cmUg Z2V0TnVtUm93czgKKyBlbmQgaW50ZXJmYWNlIGdldFJvd3MKKyAKKyBpbnRl cmZhY2UgYWRqX21hdHJpeAorICAgIG1vZHVsZSBwcm9jZWR1cmUgY29uc3Ry dWN0XzQgICAhIGtpbmQ9NCBjb25zdHJ1Y3RvcgorICAgIG1vZHVsZSBwcm9j ZWR1cmUgY29uc3RydWN0XzggICAhIGtpbmQ9OCBjb25zdHJ1Y3RvcgorIGVu ZCBpbnRlcmZhY2UgYWRqX21hdHJpeAorIAorIGludGVyZmFjZSBhc3NpZ25t ZW50KD0pCisgICAgbW9kdWxlIHByb2NlZHVyZSBtMm00ICAgICAgICAgICEg YXNzaWduIGtpbmQ9NCBtYXRyaXgKKyAgICBtb2R1bGUgcHJvY2VkdXJlIGEy bTQgICAgICAgICAgISBhc3NpZ24ga2luZD00IGFycmF5CisgICAgbW9kdWxl IHByb2NlZHVyZSBtMm04ICAgICAgICAgICEgYXNzaWduIGtpbmQ9OCBtYXRy aXgKKyAgICBtb2R1bGUgcHJvY2VkdXJlIGEybTggICAgICAgICAgISBhc3Np Z24ga2luZD04IGFycmF5CisgICAgbW9kdWxlIHByb2NlZHVyZSBtMmE0ICAg ICAgICAgICEgYXNzaWduIGtpbmQ9NCBtYXRyaXggdG8gYXJyYXkKKyAgICBt b2R1bGUgcHJvY2VkdXJlIG0yYTggICAgICAgICAgISBhc3NpZ24ga2luZD04 IG1hdHJpeCB0byBhcnJheQorIGVuZCBpbnRlcmZhY2UgYXNzaWdubWVudCg9 KQorIAorIAorIGNvbnRhaW5zCisgCisgICBmdW5jdGlvbiBnZXRLaW5kNCh0 aGlzKSByZXN1bHQocnNsdCkKKyAgICBjbGFzcyhhZGpfbWF0cml4KDQsKiwq KSkgOjogdGhpcworICAgIGludGVnZXIgOjogcnNsdAorICAgIHJzbHQgPSB0 aGlzJWsKKyAgIGVuZCBmdW5jdGlvbiBnZXRLaW5kNAorIAorICBmdW5jdGlv biBnZXRLaW5kOCh0aGlzKSByZXN1bHQocnNsdCkKKyAgICBjbGFzcyhhZGpf bWF0cml4KDgsKiwqKSkgOjogdGhpcworICAgIGludGVnZXIgOjogcnNsdAor ICAgIHJzbHQgPSB0aGlzJWsKKyAgZW5kIGZ1bmN0aW9uIGdldEtpbmQ4Cisg CisgICBmdW5jdGlvbiBnZXROdW1Db2xzNCh0aGlzKSByZXN1bHQocnNsdCkK KyAgICBjbGFzcyhhZGpfbWF0cml4KDQsKiwqKSkgOjogdGhpcworICAgIGlu dGVnZXIgOjogcnNsdAorICAgIHJzbHQgPSB0aGlzJWMKKyAgIGVuZCBmdW5j dGlvbiBnZXROdW1Db2xzNAorIAorICAgZnVuY3Rpb24gZ2V0TnVtQ29sczgo dGhpcykgcmVzdWx0KHJzbHQpCisgICAgY2xhc3MoYWRqX21hdHJpeCg4LCos KikpIDo6IHRoaXMKKyAgICBpbnRlZ2VyIDo6IHJzbHQKKyAgICByc2x0ID0g dGhpcyVjCisgICBlbmQgZnVuY3Rpb24gZ2V0TnVtQ29sczgKKyAKKyAgIGZ1 bmN0aW9uIGdldE51bVJvd3M0KHRoaXMpIHJlc3VsdChyc2x0KQorICAgIGNs YXNzKGFkal9tYXRyaXgoNCwqLCopKSA6OiB0aGlzCisgICAgaW50ZWdlciA6 OiByc2x0CisgICAgcnNsdCA9IHRoaXMlcgorICAgZW5kIGZ1bmN0aW9uIGdl dE51bVJvd3M0CisgCisgICBmdW5jdGlvbiBnZXROdW1Sb3dzOCh0aGlzKSBy ZXN1bHQocnNsdCkKKyAgICBjbGFzcyhhZGpfbWF0cml4KDgsKiwqKSkgOjog dGhpcworICAgIGludGVnZXIgOjogcnNsdAorICAgIHJzbHQgPSB0aGlzJXIK KyAgIGVuZCBmdW5jdGlvbiBnZXROdW1Sb3dzOAorIAorIAorICBmdW5jdGlv biBjb25zdHJ1Y3RfNChrLGMscikgcmVzdWx0KG1hdCkKKyAgICAgIGludGVn ZXIoNCkgOjogaworICAgICAgaW50ZWdlciA6OiBjCisgICAgICBpbnRlZ2Vy IDo6IHIKKyAgICAgIGNsYXNzKGFkal9tYXRyaXgoNCw6LDopKSxhbGxvY2F0 YWJsZSA6OiBtYXQKKyAKKyAgICAgIGFsbG9jYXRlKGFkal9tYXRyaXgoNCxj LHIpOjptYXQpCisgCisgICBlbmQgZnVuY3Rpb24gY29uc3RydWN0XzQKKyAK KyAgIGZ1bmN0aW9uIGNvbnN0cnVjdF84KGssYyxyKSByZXN1bHQobWF0KQor ICAgICAgaW50ZWdlcig4KSA6OiBrCisgICAgICBpbnRlZ2VyIDo6IGMKKyAg ICAgIGludGVnZXIgOjogcgorICAgICAgY2xhc3MoYWRqX21hdHJpeCg4LDos OikpLGFsbG9jYXRhYmxlIDo6IG1hdAorIAorICAgICAgYWxsb2NhdGUoYWRq X21hdHJpeCg4LGMscik6Om1hdCkKKyAKKyAgIGVuZCBmdW5jdGlvbiBjb25z dHJ1Y3RfOAorIAorICAgc3Vicm91dGluZSBhMm00KGQscykKKyAgICBjbGFz cyhhZGpfbWF0cml4KDQsOiw6KSksYWxsb2NhdGFibGUgOjogZAorICAgIGNs YXNzKCopLGRpbWVuc2lvbig6LDopIDo6IHMKKyAKKyAgICBpZiAoYWxsb2Nh dGVkKGQpKSBkZWFsbG9jYXRlKGQpCisgISAgICBhbGxvY2F0ZShhZGpfbWF0 cml4KDQsc2l6ZShzLDEpLHNpemUocywyKSk6OmQpICAgICAhIGdlbmVyYXRl cyBhc3NlbWJsZXIgZXJyb3IKKyAgICBhbGxvY2F0ZShkLCBtb2xkID0gYWRq X21hdHJpeCg0LHNpemUocywxKSxzaXplKHMsMikpKQorICAgIGFsbG9jYXRl KGQlbShzaXplKHMsMSksc2l6ZShzLDIpKSxzb3VyY2U9cykKKyAgZW5kIHN1 YnJvdXRpbmUgYTJtNAorIAorICBzdWJyb3V0aW5lIGEybTgoZCxzKQorICAg IGNsYXNzKGFkal9tYXRyaXgoOCw6LDopKSxhbGxvY2F0YWJsZSA6OiBkCisg ICAgY2xhc3MoKiksZGltZW5zaW9uKDosOikgOjogcworIAorICAgIGlmIChh bGxvY2F0ZWQoZCkpIGRlYWxsb2NhdGUoZCkKKyAhICAgIGFsbG9jYXRlKGFk al9tYXRyaXgoOCxzaXplKHMsMSksc2l6ZShzLDIpKTo6ZCkgICAgICEgZ2Vu ZXJhdGVzIGFzc2VtYmxlciBlcnJvcgorICAgIGFsbG9jYXRlKGQsIG1vbGQg PSBhZGpfbWF0cml4KDhfOCxzaXplKHMsMSksc2l6ZShzLDIpKSkgISBOZWVk cyA4XzggdG8gbWF0Y2ggYXJnMSBvZiAnY29uc3RydWN0XzgnCisgICAgYWxs b2NhdGUoZCVtKHNpemUocywxKSxzaXplKHMsMikpLHNvdXJjZT1zKQorICBl bmQgc3Vicm91dGluZSBhMm04CisgCisgc3Vicm91dGluZSBtMmE4KGEsdGhp cykKKyBjbGFzcyhhZGpfbWF0cml4KDgsKiwqKSksIGludGVudChpbikgOjog dGhpcyAgICAgICAgICEgSW50ZW50cyByZXF1aXJlZCBmb3IKKyByZWFsKDgp LGFsbG9jYXRhYmxlLCBpbnRlbnQob3V0KSA6OiBhKDosOikgICAgICAgICAg ICEgZGVmaW5lZCBhc3NpZ25tZW50CisgICBzZWxlY3QgdHlwZSAoYXJyYXkg PT4gdGhpcyVtKSAgICAgICAgICAgICAgICAgICAgICAhIEFkZGVkIFNFTEVD VCBUWVBFIGJlY2F1c2UuLi4KKyAgICAgdHlwZSBpcyAocmVhbCg4KSkKKyAg IGlmIChhbGxvY2F0ZWQoYSkpIGRlYWxsb2NhdGUoYSkKKyAgIGFsbG9jYXRl KGEsc291cmNlPWFycmF5KQorICAgZW5kIHNlbGVjdAorICEgICBhbGxvY2F0 ZShhKHNpemUodGhpcyVtLDEpLHNpemUodGhpcyVtLDIpKSxzb3VyY2U9dGhp cyVtKSAhIC4uLkNMQVNTKCopIHNvdXJjZSBkb2VzIG5vdCB3b3JrIGluIGdm b3J0cmFuCisgIGVuZCBzdWJyb3V0aW5lIG0yYTgKKyAKKyAgc3Vicm91dGlu ZSBtMmE0KGEsdGhpcykKKyAgY2xhc3MoYWRqX21hdHJpeCg0LCosKikpLCBp bnRlbnQoaW4pIDo6IHRoaXMgICAgICAgICEgSW50ZW50cyByZXF1aXJlZCBm b3IKKyAgcmVhbCg0KSxhbGxvY2F0YWJsZSwgaW50ZW50KG91dCkgOjogYSg6 LDopICAgICAgICAgICEgZGVmaW5lZCBhc3NpZ25tZW50CisgICBzZWxlY3Qg dHlwZSAoYXJyYXkgPT4gdGhpcyVtKSAgICAgICAgICAgICAgICAgICAgICAh IEFkZGVkIFNFTEVDVCBUWVBFIGJlY2F1c2UuLi4KKyAgICAgdHlwZSBpcyAo cmVhbCg0KSkKKyAgICBpZiAoYWxsb2NhdGVkKGEpKSBkZWFsbG9jYXRlKGEp CisgICAgYWxsb2NhdGUoYSxzb3VyY2U9YXJyYXkpCisgICBlbmQgc2VsZWN0 CisgISAgIGFsbG9jYXRlKGEoc2l6ZSh0aGlzJW0sMSksc2l6ZSh0aGlzJW0s MikpLHNvdXJjZT10aGlzJW0pICEgLi4uQ0xBU1MoKikgc291cmNlIGRvZXMg bm90IHdvcmsgaW4gZ2ZvcnRyYW4KKyAgZW5kIHN1YnJvdXRpbmUgbTJhNAor IAorICAgc3Vicm91dGluZSBtMm00KGQscykKKyAgICBDTEFTUyhhZGpfbWF0 cml4KDQsOiw6KSksYWxsb2NhdGFibGUsIGludGVudChPVVQpIDo6IGQgICAh IEludGVudHMgcmVxdWlyZWQgZm9yCisgICAgQ0xBU1MoYWRqX21hdHJpeCg0 LCosKikpLCBpbnRlbnQoaW4pIDo6IHMgICAgICAgICAgICAgICAgISBkZWZp bmVkIGFzc2lnbm1lbnQKKyAKKyAgICBpZiAoYWxsb2NhdGVkKGQpKSBkZWFs bG9jYXRlKGQpCisgICAgYWxsb2NhdGUoZCxzb3VyY2U9cykKKyAgZW5kIHN1 YnJvdXRpbmUgbTJtNAorIAorICBzdWJyb3V0aW5lIG0ybTgoZCxzKQorICAg IENMQVNTKGFkal9tYXRyaXgoOCw6LDopKSxhbGxvY2F0YWJsZSwgaW50ZW50 KE9VVCkgOjogZCAgICEgSW50ZW50cyByZXF1aXJlZCBmb3IKKyAgICBDTEFT UyhhZGpfbWF0cml4KDgsKiwqKSksIGludGVudChpbikgOjogcyAgICAgICAg ICAgICAgICAhIGRlZmluZWQgYXNzaWdubWVudAorIAorICAgIGlmIChhbGxv Y2F0ZWQoZCkpIGRlYWxsb2NhdGUoZCkKKyAgICBhbGxvY2F0ZShkLHNvdXJj ZT1zKQorICBlbmQgc3Vicm91dGluZSBtMm04CisgCisgCisgZW5kIG1vZHVs ZSBtYXRyaXgKKyAKKyAKKyBwcm9ncmFtIGFkajMKKyAKKyAgIHVzZSBtYXRy aXgKKyAgIGltcGxpY2l0IG5vbmUKKyAgIGludGVnZXIoOCkgOjogaQorIAor ICAgY2xhc3MoYWRqX21hdHJpeCg4LDosOikpLGFsbG9jYXRhYmxlIDo6IGFk aiAgICAgICAgICAgICAhIFdhcyBUWVBFOiBGYWlscyBpbgorICAgcmVhbCg4 KSA6OiBhKDIsMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAhIGRlZmluZWQgYXNzaWdubWVudAorICAgcmVhbCg4KSxhbGxvY2F0 YWJsZSA6OiBiKDosOikKKyAKKyAgIGNsYXNzKGFkal9tYXRyaXgoNCw6LDop KSxhbGxvY2F0YWJsZSA6OiBhZGpfNCAgICAgICAgICAgISBEaXR0byBhbmQg Li4uLgorICAgcmVhbCg0KSA6OiBhXzQoMywyKSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAhIC4uLiB0aGVzZSBkZWNsYXJhdGlvbnMg d2VyZQorICAgcmVhbCg0KSxhbGxvY2F0YWJsZSA6OiBiXzQoOiw6KSAgICAg ICAgICAgICAgICAgICAgICAgICAhIGFkZGVkIHRvIGNoZWNrIEtJTkQ9NAor IAorICEgQ2hlY2sgY29uc3RydWN0b3Igb2YgUERUIGFuZCBpbnN0cmluc2lj IGFzc2lnbm1lbnQKKyAgIGFkaiA9IGFkal9tYXRyaXgoSU5UKDgsOCksMiw0 KQorICAgaWYgKGFkaiVrIC5uZS4gOCkgY2FsbCBhYm9ydAorICAgaWYgKGFk aiVjIC5uZS4gMikgY2FsbCBhYm9ydAorICAgaWYgKGFkaiVyIC5uZS4gNCkg Y2FsbCBhYm9ydAorICAgYSA9IHJlc2hhcGUgKFsoaSwgaSA9IDEsIDYpXSwg WzIsM10pCisgICBhZGogPSBhCisgICBiID0gYWRqCisgICBpZiAoYW55IChi IC5uZS4gYSkpIGNhbGwgYWJvcnQKKyAKKyAhIENoZWNrIGFsbG9jYXRpb24g d2l0aCBNT0xEIG9mIFBEVC4gTm90ZSB0aGF0IG9ubHkgS0lORCBwYXJhbWV0 ZXJzIHNldC4KKyAgIGFsbG9jYXRlIChhZGpfNCwgbW9sZCA9IGFkal9tYXRy aXgoNCwzLDIpKSAgICAgICAgICAgISBBZGRlZCBjaGVjayBvZiBLSU5EID0g NAorICAgaWYgKGFkal80JWsgLm5lLiA0KSBjYWxsIGFib3J0CisgICBhXzQg PSByZXNoYXBlIChhLCBbMywyXSkKKyAgIGFkal80ID0gYV80CisgICBiXzQg PSBhZGpfNAorICAgaWYgKGFueSAoYl80IC5uZS4gYV80KSkgY2FsbCBhYm9y dAorIAorIGVuZCBwcm9ncmFtIGFkajMKKyAKKyAKKyAK --001a113b3dd8f6e259055884fcd1--