From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 7657B3858D29 for ; Fri, 17 Sep 2021 15:31:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7657B3858D29 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1F265101E; Fri, 17 Sep 2021 08:31:18 -0700 (PDT) Received: from [10.57.71.131] (unknown [10.57.71.131]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 693A23F59C; Fri, 17 Sep 2021 08:31:17 -0700 (PDT) Subject: [PATCH 1/3][vect] Add main vectorized loop unrolling To: "gcc-patches@gcc.gnu.org" Cc: Richard Sandiford , Richard Biener References: <4a2e6dde-cc5c-97fe-7a43-bd59d542c2ce@arm.com> From: "Andre Vieira (lists)" Message-ID: <27777876-4201-5e86-bf9a-063143d38641@arm.com> Date: Fri, 17 Sep 2021 16:31:24 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 In-Reply-To: <4a2e6dde-cc5c-97fe-7a43-bd59d542c2ce@arm.com> Content-Type: multipart/mixed; boundary="------------FDF207D17C210BE80C44DF08" Content-Language: en-US X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00, BODY_8BITS, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LOTSOFHASH, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Sep 2021 15:31:21 -0000 This is a multi-part message in MIME format. --------------FDF207D17C210BE80C44DF08 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Hi all, This patch adds the ability to define a target hook to unroll the main vectorized loop. It also introduces --param's vect-unroll and vect-unroll-reductions to control this through a command-line. I found this useful to experiment and believe can help when tuning, so I decided to leave it in. We only unroll the main loop and have disabled unrolling epilogues for now. We also do not support unrolling of any loop that has a negative step and we do not support unrolling a loop with any reduction other than a TREE_CODE_REDUCTION. Bootstrapped and regression tested on aarch64-linux-gnu as part of the series. gcc/ChangeLog:         * doc/tm.texi: Document TARGET_VECTORIZE_UNROLL_FACTOR         and TARGET_VECTORIZE_ADD_STMT_COST_FOR_UNROLL.         * doc/tm.texi.in: Add entries for target hooks above.         * params.opt: Add vect-unroll and vect-unroll-reductions parameters.         * target.def: Define hooks TARGET_VECTORIZE_UNROLL_FACTOR         and TARGET_VECTORIZE_ADD_STMT_COST_FOR_UNROLL.         * targhooks.c (default_add_stmt_cost_for_unroll): New.         (default_unroll_factor): Likewise.         * targhooks.h (default_add_stmt_cost_for_unroll): Likewise.         (default_unroll_factor): Likewise.         * tree-vect-loop.c (_loop_vec_info::_loop_vec_info): Initialize         par_unrolling_factor.         (vect_update_vf_for_slp): Use unrolling factor to update vectorization         factor.         (vect_determine_partial_vectors_and_peeling): Account for unrolling.         (vect_determine_unroll_factor): Determine how much to unroll vectorized         main loop.         (vect_analyze_loop_2): Call vect_determine_unroll_factor.         (vect_analyze_loop): Allow for epilogue vectorization when unrolling         and rewalk vector_mode array for the epilogues.         (vectorizable_reduction): Disable single_defuse_cycle when unrolling.         * tree-vectorizer.h (vect_unroll_value): Declare par_unrolling_factor         as a member of loop_vec_info. --------------FDF207D17C210BE80C44DF08 Content-Type: text/plain; charset=UTF-8; name="vect_unroll.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="vect_unroll.patch" ZGlmZiAtLWdpdCBhL2djYy9kb2MvdG0udGV4aSBiL2djYy9kb2MvdG0udGV4aQppbmRleCBm NjhmNDI2MzhhMTEyYmVkODM5NmZkNjM0YmQzZmQzYzQ0Y2U4NDhhLi4zYmM5Njk0ZDIxNjIw NTVkM2RiMTY1ZWY4ODhmMzVkZWI2NzY1NDhiIDEwMDY0NAotLS0gYS9nY2MvZG9jL3RtLnRl eGkKKysrIGIvZ2NjL2RvYy90bS50ZXhpCkBAIC02MjgzLDYgKzYyODMsMTkgQEAgYWxsb2Nh dGVkIGJ5IFRBUkdFVF9WRUNUT1JJWkVfSU5JVF9DT1NULiAgVGhlIGRlZmF1bHQgcmVsZWFz ZXMgdGhlCiBhY2N1bXVsYXRvci4KIEBlbmQgZGVmdHlwZWZuCiAKK0BkZWZ0eXBlZm4ge1Rh cmdldCBIb29rfSB2b2lkIFRBUkdFVF9WRUNUT1JJWkVfQUREX1NUTVRfQ09TVF9GT1JfVU5S T0xMIChjbGFzcyB2ZWNfaW5mbyAqQHZhcnt2aW5mb30sIGNsYXNzIF9zdG10X3ZlY19pbmZv ICpAdmFye3N0bXRfaW5mb30sIHZvaWQgKkB2YXJ7ZGF0YX0pCitUaGlzIGhvb2sgc2hvdWxk IHVwZGF0ZSB0aGUgdGFyZ2V0LXNwZWNpZmljIEB2YXJ7ZGF0YX0gcmVsYXRpdmUKK3JlbGF0 aXZlIHRvIHRoZSBzdGF0ZW1lbnQgcmVwcmVzZW50ZWQgYnkgQHZhcntzdG10X3ZpbmZvfSB0 byBiZSB1c2VkCitsYXRlciB0byBkZXRlcm1pbmUgdGhlIHVucm9sbGluZyBmYWN0b3IgZm9y IHRoaXMgbG9vcCB1c2luZyB0aGUgY3VycmVudAordmVjdG9yaXphdGlvbiBmYWN0b3IuCitA ZW5kIGRlZnR5cGVmbgorCitAZGVmdHlwZWZuIHtUYXJnZXQgSG9va30gdW5zaWduZWQgVEFS R0VUX1ZFQ1RPUklaRV9VTlJPTExfRkFDVE9SIChjbGFzcyB2ZWNfaW5mbyAqQHZhcnt2aW5m b30sIHZvaWQgKkB2YXJ7ZGF0YX0pCitUaGlzIGhvb2sgc2hvdWxkIHJldHVybiB0aGUgZGVz aXJlZCB2ZWN0b3IgdW5yb2xsaW5nIGZhY3RvciBmb3IgYSBsb29wIHdpdGgKK0B2YXJ7dmlu Zm99IGJhc2VkIG9uIHRoZSB0YXJnZXQtc3BlY2lmaWMgQHZhcntkYXRhfS4gVGhlIGRlZmF1 bHQgcmV0dXJucyBvbmUsCit3aGljaCBtZWFucyBubyB1bnJvbGxpbmcgd2lsbCBiZSBwZXJm b3JtZWQuCitAZW5kIGRlZnR5cGVmbgorCiBAZGVmdHlwZWZuIHtUYXJnZXQgSG9va30gdHJl ZSBUQVJHRVRfVkVDVE9SSVpFX0JVSUxUSU5fR0FUSEVSIChjb25zdF90cmVlIEB2YXJ7bWVt X3ZlY3R5cGV9LCBjb25zdF90cmVlIEB2YXJ7aW5kZXhfdHlwZX0sIGludCBAdmFye3NjYWxl fSkKIFRhcmdldCBidWlsdGluIHRoYXQgaW1wbGVtZW50cyB2ZWN0b3IgZ2F0aGVyIG9wZXJh dGlvbi4gIEB2YXJ7bWVtX3ZlY3R5cGV9CiBpcyB0aGUgdmVjdG9yIHR5cGUgb2YgdGhlIGxv YWQgYW5kIEB2YXJ7aW5kZXhfdHlwZX0gaXMgc2NhbGFyIHR5cGUgb2YKZGlmZiAtLWdpdCBh L2djYy9kb2MvdG0udGV4aS5pbiBiL2djYy9kb2MvdG0udGV4aS5pbgppbmRleCBmZGYxNmI5 MDFjNTM3ZTZhMDJmNjMwYTgwYTIyMTNkMmRjYjZkNWQ2Li40MGY0Y2IwMmMzNGY1NzU0Mzlm MzUwNzAzMDE4NTVkZGFmODJhMjFhIDEwMDY0NAotLS0gYS9nY2MvZG9jL3RtLnRleGkuaW4K KysrIGIvZ2NjL2RvYy90bS50ZXhpLmluCkBAIC00MTk1LDYgKzQxOTUsMTAgQEAgYWRkcmVz czsgIGJ1dCBvZnRlbiBhIG1hY2hpbmUtZGVwZW5kZW50IHN0cmF0ZWd5IGNhbiBnZW5lcmF0 ZSBiZXR0ZXIgY29kZS4KIAogQGhvb2sgVEFSR0VUX1ZFQ1RPUklaRV9ERVNUUk9ZX0NPU1Rf REFUQQogCitAaG9vayBUQVJHRVRfVkVDVE9SSVpFX0FERF9TVE1UX0NPU1RfRk9SX1VOUk9M TAorCitAaG9vayBUQVJHRVRfVkVDVE9SSVpFX1VOUk9MTF9GQUNUT1IKKwogQGhvb2sgVEFS R0VUX1ZFQ1RPUklaRV9CVUlMVElOX0dBVEhFUgogCiBAaG9vayBUQVJHRVRfVkVDVE9SSVpF X0JVSUxUSU5fU0NBVFRFUgpkaWZmIC0tZ2l0IGEvZ2NjL3BhcmFtcy5vcHQgYi9nY2MvcGFy YW1zLm9wdAppbmRleCBmNDE0ZGMxYTYxY2ZhOWQ1YjlkZWQ3NWU5NjU2MGZjMWY3MzA0MWE1 Li4wMGY5MmQ0NDg0Nzk3ZGYwZGJiYWQwNTJmNDUyMDU0NjljYmIyYzQ5IDEwMDY0NAotLS0g YS9nY2MvcGFyYW1zLm9wdAorKysgYi9nY2MvcGFyYW1zLm9wdApAQCAtMTExNyw0ICsxMTE3 LDEyIEBAIENvbnRyb2xzIGhvdyBsb29wIHZlY3Rvcml6ZXIgdXNlcyBwYXJ0aWFsIHZlY3Rv cnMuICAwIG1lYW5zIG5ldmVyLCAxIG1lYW5zIG9ubHkKIENvbW1vbiBKb2luZWQgVUludGVn ZXIgVmFyKHBhcmFtX3ZlY3RfaW5uZXJfbG9vcF9jb3N0X2ZhY3RvcikgSW5pdCg1MCkgSW50 ZWdlclJhbmdlKDEsIDEwMDAwKSBQYXJhbSBPcHRpbWl6YXRpb24KIFRoZSBtYXhpbXVtIGZh Y3RvciB3aGljaCB0aGUgbG9vcCB2ZWN0b3JpemVyIGFwcGxpZXMgdG8gdGhlIGNvc3Qgb2Yg c3RhdGVtZW50cyBpbiBhbiBpbm5lciBsb29wIHJlbGF0aXZlIHRvIHRoZSBsb29wIGJlaW5n IHZlY3Rvcml6ZWQuCiAKKy1wYXJhbT12ZWN0LXVucm9sbD0KK0NvbW1vbiBKb2luZWQgVUlu dGVnZXIgVmFyKHBhcmFtX3ZlY3RfdW5yb2xsKSBJbml0KDApIEludGVnZXJSYW5nZSgwLCAz MikgUGFyYW0gT3B0aW1pemF0aW9uCitDb250cm9scyBob3cgbWFueSB0aW1lcyB0aGUgdmVj dG9yaXplciB0cmllcyB0byB1bnJvbGwgbG9vcHMuICBBbHNvIHNlZSB2ZWN0LXVucm9sbC1y ZWR1Y3Rpb25zLgorCistcGFyYW09dmVjdC11bnJvbGwtcmVkdWN0aW9ucz0KK0NvbW1vbiBK b2luZWQgVUludGVnZXIgVmFyKHBhcmFtX3ZlY3RfdW5yb2xsX3JlZHVjdGlvbnMpIEluaXQo MCkgSW50ZWdlclJhbmdlKDAsIDMyKSBQYXJhbSBPcHRpbWl6YXRpb24KK0NvbnRyb2xzIGhv dyBtYW55IHRpbWVzIHRoZSB2ZWN0b3JpemVyIHRyaWVzIHRvIHVucm9sbCBsb29wcyB0aGF0 IGNvbnRhaW4gYXNzb2NpYXRpdmUgcmVkdWN0aW9ucy4gIDAgbWVhbnMgdGhhdCBzdWNoIGxv b3BzIHNob3VsZCBiZSB1bnJvbGxlZCB2ZWN0LXVucm9sbCB0aW1lcy4KKwogOyBUaGlzIGNv bW1lbnQgaXMgdG8gZW5zdXJlIHdlIHJldGFpbiB0aGUgYmxhbmsgbGluZSBhYm92ZS4KZGlm ZiAtLWdpdCBhL2djYy90YXJnZXQuZGVmIGIvZ2NjL3RhcmdldC5kZWYKaW5kZXggMjhhMzRm MWQ1MWI1YWJiNDFjNTM3YjljZDMyN2NhNTlmMWY5MjYwZi4uMGVhYzUyOWYxN2JkOTgxYjY0 OTRmZTYxMzExN2YyODgwM2EwMjM5MCAxMDA2NDQKLS0tIGEvZ2NjL3RhcmdldC5kZWYKKysr IGIvZ2NjL3RhcmdldC5kZWYKQEAgLTIwOTUsNiArMjA5NSwyOCBAQCBhY2N1bXVsYXRvci4i LAogICh2b2lkICpkYXRhKSwKICBkZWZhdWx0X2Rlc3Ryb3lfY29zdF9kYXRhKQogCisvKiBU YXJnZXQgZnVuY3Rpb24gdG8gcmVjb3JkIGNvc3QgYXBwcm94aW1hdGlvbiB0byBiZSB1c2Vk IGJ5CisgICBUQVJHRVRfVkVDVE9SSVpFX1VOUk9MTF9GQUNUT1IuICAqLworREVGSE9PSwor KGFkZF9zdG10X2Nvc3RfZm9yX3Vucm9sbCwKKyAiVGhpcyBob29rIHNob3VsZCB1cGRhdGUg dGhlIHRhcmdldC1zcGVjaWZpYyBAdmFye2RhdGF9IHJlbGF0aXZlXG5cCityZWxhdGl2ZSB0 byB0aGUgc3RhdGVtZW50IHJlcHJlc2VudGVkIGJ5IEB2YXJ7c3RtdF92aW5mb30gdG8gYmUg dXNlZFxuXAorbGF0ZXIgdG8gZGV0ZXJtaW5lIHRoZSB1bnJvbGxpbmcgZmFjdG9yIGZvciB0 aGlzIGxvb3AgdXNpbmcgdGhlIGN1cnJlbnRcblwKK3ZlY3Rvcml6YXRpb24gZmFjdG9yLiIs Cisgdm9pZCwKKyAoY2xhc3MgdmVjX2luZm8gKnZpbmZvLCBjbGFzcyBfc3RtdF92ZWNfaW5m byAqc3RtdF9pbmZvLCB2b2lkICpkYXRhKSwKKyBkZWZhdWx0X2FkZF9zdG10X2Nvc3RfZm9y X3Vucm9sbCkKKworLyogRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHVucm9sbCBmYWN0b3IgZm9y IHZlY3Rvcml6YXRpb24uICAqLworREVGSE9PSworKHVucm9sbF9mYWN0b3IsCisgIlRoaXMg aG9vayBzaG91bGQgcmV0dXJuIHRoZSBkZXNpcmVkIHZlY3RvciB1bnJvbGxpbmcgZmFjdG9y IGZvciBhIGxvb3Agd2l0aFxuXAorQHZhcnt2aW5mb30gYmFzZWQgb24gdGhlIHRhcmdldC1z cGVjaWZpYyBAdmFye2RhdGF9LiBUaGUgZGVmYXVsdCByZXR1cm5zIG9uZSxcblwKK3doaWNo IG1lYW5zIG5vIHVucm9sbGluZyB3aWxsIGJlIHBlcmZvcm1lZC4iLAorIHVuc2lnbmVkLAor IChjbGFzcyB2ZWNfaW5mbyAqdmluZm8sIHZvaWQgKmRhdGEpLAorIGRlZmF1bHRfdW5yb2xs X2ZhY3RvcikKKwogSE9PS19WRUNUT1JfRU5EICh2ZWN0b3JpemUpCiAKICN1bmRlZiBIT09L X1BSRUZJWApkaWZmIC0tZ2l0IGEvZ2NjL3Rhcmdob29rcy5oIGIvZ2NjL3Rhcmdob29rcy5o CmluZGV4IDkyZDUxOTkyZTYyNWMyNDk3YWE4NDk2YjFlMmUzZDkxNmU1NzA2ZmQuLmQyODVj MjRkNmQzOThjZmFiYjU4YzI5MWZkMmRjYmZhNmUxYmQ4ZjYgMTAwNjQ0Ci0tLSBhL2djYy90 YXJnaG9va3MuaAorKysgYi9nY2MvdGFyZ2hvb2tzLmgKQEAgLTEyNSw2ICsxMjUsOSBAQCBl eHRlcm4gdW5zaWduZWQgZGVmYXVsdF9hZGRfc3RtdF9jb3N0IChjbGFzcyB2ZWNfaW5mbyAq LCB2b2lkICosIGludCwKIAkJCQkgICAgICAgZW51bSB2ZWN0X2Nvc3RfbW9kZWxfbG9jYXRp b24pOwogZXh0ZXJuIHZvaWQgZGVmYXVsdF9maW5pc2hfY29zdCAodm9pZCAqLCB1bnNpZ25l ZCAqLCB1bnNpZ25lZCAqLCB1bnNpZ25lZCAqKTsKIGV4dGVybiB2b2lkIGRlZmF1bHRfZGVz dHJveV9jb3N0X2RhdGEgKHZvaWQgKik7CitleHRlcm4gdm9pZCBkZWZhdWx0X2FkZF9zdG10 X2Nvc3RfZm9yX3Vucm9sbCAoY2xhc3MgdmVjX2luZm8gKiwKKwkJCQkJICAgICAgY2xhc3Mg X3N0bXRfdmVjX2luZm8gKiwgdm9pZCAqKTsKK2V4dGVybiB1bnNpZ25lZCBkZWZhdWx0X3Vu cm9sbF9mYWN0b3IgKGNsYXNzIHZlY19pbmZvICosIHZvaWQgKik7CiAKIC8qIE9wZW5BQ0Mg aG9va3MuICAqLwogZXh0ZXJuIGJvb2wgZGVmYXVsdF9nb2FjY192YWxpZGF0ZV9kaW1zICh0 cmVlLCBpbnQgW10sIGludCwgdW5zaWduZWQpOwpkaWZmIC0tZ2l0IGEvZ2NjL3Rhcmdob29r cy5jIGIvZ2NjL3Rhcmdob29rcy5jCmluZGV4IGM5YjUyMDg4NTNkYmMxNTcwNmE2NWQxZWIz MzVlMjhlMDU2NDMyNWUuLjliYzdlODBlNWE2NzEyOTYzM2RhYjk5YTg3MWI2YmFiZmY2NWRl OTcgMTAwNjQ0Ci0tLSBhL2djYy90YXJnaG9va3MuYworKysgYi9nY2MvdGFyZ2hvb2tzLmMK QEAgLTE1MzUsNiArMTUzNSwyNiBAQCBkZWZhdWx0X2Rlc3Ryb3lfY29zdF9kYXRhICh2b2lk ICpkYXRhKQogICBmcmVlIChkYXRhKTsKIH0KIAorLyogQnkgZGVmYXVsdCwgd2UgZG8gbm90 IHBlcmZvcm0gdW5yb2xsaW5nIHNvIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbmVlZAorICAg dG8gZG8gYW55dGhpbmcuICAqLwordm9pZAorZGVmYXVsdF9hZGRfc3RtdF9jb3N0X2Zvcl91 bnJvbGwgKGNsYXNzIHZlY19pbmZvICp2aW5mbyBBVFRSSUJVVEVfVU5VU0VELAorCQkJCSAg Y2xhc3MgX3N0bXRfdmVjX2luZm8gKnN0bXRfaW5mbworCQkJCSAgQVRUUklCVVRFX1VOVVNF RCwKKwkJCQkgIHZvaWQgKmRhdGEgQVRUUklCVVRFX1VOVVNFRCkKK3sKK30KKworCisvKiBC eSBkZWZhdWx0LCByZXR1cm4gYSB2ZWN0b3IgdW5yb2xsIGZhY3RvciBvZiBvbmUsIG1lYW5p bmcgbm8gdW5yb2xsaW5nIHdpbGwKKyAgIGJlIHBlcmZvcm1lZC4gICovCit1bnNpZ25lZAor ZGVmYXVsdF91bnJvbGxfZmFjdG9yIChjbGFzcyB2ZWNfaW5mbyAqdmluZm8gQVRUUklCVVRF X1VOVVNFRCwKKwkJICAgICAgIHZvaWQgKmRhdGEgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAg cmV0dXJuIDE7Cit9CisKIC8qIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhIHBvaW50ZXIg bW9kZSBpcyB2YWxpZC4gQXNzdW1lIGRlZmF1bHRzCiAgICBvZiBwdHJfbW9kZSBvciBQbW9k ZSAtIGNhbiBiZSBvdmVycmlkZGVuLiAgKi8KIGJvb2wKZGlmZiAtLWdpdCBhL2djYy90cmVl LXZlY3QtbG9vcC5jIGIvZ2NjL3RyZWUtdmVjdC1sb29wLmMKaW5kZXggMGM4ZDk5MjYyNGI1 OWRkZDA1NmFmZjU5NDczODMwNWQ2YmU1YWZhOC4uMTRmODE1MGQ3YzI2MmI5NDIyNzg0ZTBl OTk3Y2E0Mzg3NjY0YTIwYSAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtdmVjdC1sb29wLmMKKysr IGIvZ2NjL3RyZWUtdmVjdC1sb29wLmMKQEAgLTgyOCw2ICs4MjgsNyBAQCBfbG9vcF92ZWNf aW5mbzo6X2xvb3BfdmVjX2luZm8gKGNsYXNzIGxvb3AgKmxvb3BfaW4sIHZlY19pbmZvX3No YXJlZCAqc2hhcmVkKQogICAgIHNraXBfbWFpbl9sb29wX2VkZ2UgKG51bGxwdHIpLAogICAg IHNraXBfdGhpc19sb29wX2VkZ2UgKG51bGxwdHIpLAogICAgIHJldXNhYmxlX2FjY3VtdWxh dG9ycyAoKSwKKyAgICBwYXJfdW5yb2xsaW5nX2ZhY3RvciAoMSksCiAgICAgbWF4X3ZlY3Rv cml6YXRpb25fZmFjdG9yICgwKSwKICAgICBtYXNrX3NraXBfbml0ZXJzIChOVUxMX1RSRUUp LAogICAgIHJncm91cF9jb21wYXJlX3R5cGUgKE5VTExfVFJFRSksCkBAIC0xNTk0LDYgKzE1 OTUsNyBAQCB2ZWN0X3VwZGF0ZV92Zl9mb3Jfc2xwIChsb29wX3ZlY19pbmZvIGxvb3Bfdmlu Zm8pCiAJZHVtcF9wcmludGZfbG9jIChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKIAkJCSAi TG9vcCBjb250YWlucyBvbmx5IFNMUCBzdG10c1xuIik7CiAgICAgICB2ZWN0b3JpemF0aW9u X2ZhY3RvciA9IExPT1BfVklORk9fU0xQX1VOUk9MTElOR19GQUNUT1IgKGxvb3BfdmluZm8p OworICAgICAgdmVjdG9yaXphdGlvbl9mYWN0b3IgKj0gbG9vcF92aW5mby0+cGFyX3Vucm9s bGluZ19mYWN0b3I7CiAgICAgfQogICBlbHNlCiAgICAgewpAQCAtMjEzMSw3ICsyMTMzLDgg QEAgdmVjdF9kZXRlcm1pbmVfcGFydGlhbF92ZWN0b3JzX2FuZF9wZWVsaW5nIChsb29wX3Zl Y19pbmZvIGxvb3BfdmluZm8sCiAJID8/PyBXZSBjb3VsZCB0aGVuIGVuZCB1cCBmYWlsaW5n IHRvIHVzZSBwYXJ0aWFsIHZlY3RvcnMgaWYgd2UKIAkgZGVjaWRlIHRvIHBlZWwgaXRlcmF0 aW9ucyBpbnRvIGEgcHJvbG9ndWUsIGFuZCBpZiB0aGUgbWFpbiBsb29wCiAJIHRoZW4gZW5k cyB1cCBwcm9jZXNzaW5nIGZld2VyIHRoYW4gVkYgaXRlcmF0aW9ucy4gICovCi0gICAgICBp ZiAocGFyYW1fdmVjdF9wYXJ0aWFsX3ZlY3Rvcl91c2FnZSA9PSAxCisgICAgICBpZiAoKHBh cmFtX3ZlY3RfcGFydGlhbF92ZWN0b3JfdXNhZ2UgPT0gMQorCSAgIHx8IGxvb3BfdmluZm8t PnBhcl91bnJvbGxpbmdfZmFjdG9yID4gMSkKIAkgICYmICFMT09QX1ZJTkZPX0VQSUxPR1VF X1AgKGxvb3BfdmluZm8pCiAJICAmJiAhdmVjdF9rbm93bl9uaXRlcnNfc21hbGxlcl90aGFu X3ZmIChsb29wX3ZpbmZvKSkKIAlMT09QX1ZJTkZPX0VQSUxfVVNJTkdfUEFSVElBTF9WRUNU T1JTX1AgKGxvb3BfdmluZm8pID0gdHJ1ZTsKQEAgLTIxOTIsNiArMjE5NSwxMDEgQEAgdmVj dF9kZXRlcm1pbmVfcGFydGlhbF92ZWN0b3JzX2FuZF9wZWVsaW5nIChsb29wX3ZlY19pbmZv IGxvb3BfdmluZm8sCiAgIHJldHVybiBvcHRfcmVzdWx0OjpzdWNjZXNzICgpOwogfQogCisK K3N0YXRpYyBwb2x5X3VpbnQ2NAordmVjdF9kZXRlcm1pbmVfdW5yb2xsX2ZhY3RvciAobG9v cF92ZWNfaW5mbyBsb29wX3ZpbmZvKQoreworICBzdG10X3ZlY19pbmZvIHN0bXRfaW5mbzsK KyAgdW5zaWduZWQgaTsKKyAgYm9vbCBzZWVuX3JlZHVjdGlvbl9wID0gZmFsc2U7CisgIGJv b2wgY2FuX3Vucm9sbF9wID0gIUxPT1BfVklORk9fT1JJR19MT09QX0lORk8gKGxvb3Bfdmlu Zm8pOworICBwb2x5X3VpbnQ2NCB2ZWN0b3JpemF0aW9uX2ZhY3RvciA9IExPT1BfVklORk9f VkVDVF9GQUNUT1IgKGxvb3BfdmluZm8pOworCisgIGlmICghY2FuX3Vucm9sbF9wKQorICAg IHJldHVybiB2ZWN0b3JpemF0aW9uX2ZhY3RvcjsKKworICBEVU1QX1ZFQ1RfU0NPUEUgKCJ2 ZWN0X2RldGVybWluZV91bnJvbGxfZmFjdG9yIik7CisKKyAgdm9pZCAqdGFyZ2V0X2Nvc3Rf ZGF0YSA9IGluaXRfY29zdCAobG9vcF92aW5mby0+bG9vcCwgdHJ1ZSk7CisKKyAgRk9SX0VB Q0hfVkVDX0VMVCAobG9vcF92aW5mby0+c3RtdF92ZWNfaW5mb3MsIGksIHN0bXRfaW5mbykK KyAgICB7CisgICAgICBpZiAoU1RNVF9WSU5GT19JTl9QQVRURVJOX1AgKHN0bXRfaW5mbykK KwkgIHx8ICFTVE1UX1ZJTkZPX1JFTEVWQU5UX1AgKHN0bXRfaW5mbykKKwkgIHx8IHN0bXRf aW5mby0+dmVjdHlwZSA9PSBOVUxMX1RSRUUpCisJY29udGludWU7CisgICAgICAvKiBEbyBu b3QgdW5yb2xsIGxvb3BzIHdpdGggbmVnYXRpdmUgc3RlcHMgYXMgaXQgaXMgdW5saWtlbHkg dGhhdAorCSB2ZWN0b3JpemF0aW9uIHdpbGwgc3VjY2VlZCBkdWUgdG8gdGhlIHdheSB3ZSBk ZWFsIHdpdGggbmVnYXRpdmUgc3RlcHMKKwkgaW4gbG9hZHMgYW5kIHN0b3JlcyBpbiAnZ2V0 X2xvYWRfc3RvcmVfdHlwZScuICAqLworICAgICAgaWYgKHN0bXRfaW5mby0+ZHJfYXV4LmRy CisJICAmJiAhU1RNVF9WSU5GT19HQVRIRVJfU0NBVFRFUl9QIChzdG10X2luZm8pKQorCXsK KwkgIGRyX3ZlY19pbmZvICpkcl9pbmZvID0gU1RNVF9WSU5GT19EUl9JTkZPIChzdG10X2lu Zm8pOworCSAgdHJlZSBzdGVwID0gdmVjdF9kcl9iZWhhdmlvciAobG9vcF92aW5mbywgZHJf aW5mbyktPnN0ZXA7CisJICBpZiAoVFJFRV9DT0RFIChzdGVwKSA9PSBJTlRFR0VSX0NTVAor CSAgICAgICYmIHRyZWVfaW50X2NzdF9jb21wYXJlIChzdGVwLCBzaXplX3plcm9fbm9kZSkg PCAwKQorCSAgICB7CisJICAgICAgY2FuX3Vucm9sbF9wID0gZmFsc2U7CisJICAgICAgaWYg KGR1bXBfZW5hYmxlZF9wICgpKQorCQlkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0 X2xvY2F0aW9uLAorCQkJCSAiY291bGQgbm90IHVucm9sbCBkdWUgdG8gbmVnYXRpdmUgc3Rl cFxuIik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChTVE1UX1ZJ TkZPX0RFRl9UWVBFIChzdG10X2luZm8pID09IHZlY3RfcmVkdWN0aW9uX2RlZikKKwl7CisJ ICBhdXRvIHJlZF9pbmZvID0gaW5mb19mb3JfcmVkdWN0aW9uIChsb29wX3ZpbmZvLCBzdG10 X2luZm8pOworCSAgaWYgKFNUTVRfVklORk9fUkVEVUNfVFlQRSAocmVkX2luZm8pID09IFRS RUVfQ09ERV9SRURVQ1RJT04pCisJICAgIHNlZW5fcmVkdWN0aW9uX3AgPSB0cnVlOworCSAg ZWxzZQorCSAgICB7CisJICAgICAgY2FuX3Vucm9sbF9wID0gZmFsc2U7CisJICAgICAgaWYg KGR1bXBfZW5hYmxlZF9wICgpKQorCQlkdW1wX3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0 X2xvY2F0aW9uLAorCQkJCSAiY291bGQgbm90IHVucm9sbCBkdWUgdG8gdW5zdXBwb3J0ZWQg IgorCQkJCSAicmVkdWN0aW9uXG4iKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKwor ICAgICAgdGFyZ2V0bS52ZWN0b3JpemUuYWRkX3N0bXRfY29zdF9mb3JfdW5yb2xsIChsb29w X3ZpbmZvLCBzdG10X2luZm8sCisJCQkJCQkgIHRhcmdldF9jb3N0X2RhdGEpOworICAgIH0K KworICBpZiAoIWNhbl91bnJvbGxfcCkKKyAgICB7CisgICAgICByZXR1cm4gdmVjdG9yaXph dGlvbl9mYWN0b3I7CisgICAgfQorCisgIHVuc2lnbmVkIGludCB1bnJvbGxpbmdfZmFjdG9y ID0gMTsKKyAgaWYgKG1heWJlX2d0ICh2ZWN0b3JpemF0aW9uX2ZhY3RvciwgMVUpKQorICAg IHVucm9sbGluZ19mYWN0b3IgPSB2ZWN0X3Vucm9sbF92YWx1ZSAobG9vcF92aW5mbywgc2Vl bl9yZWR1Y3Rpb25fcCwKKwkJCQkJICB0YXJnZXRfY29zdF9kYXRhKTsKKworCisgIGRlc3Ry b3lfY29zdF9kYXRhICh0YXJnZXRfY29zdF9kYXRhKTsKKworICB3aGlsZSAodW5yb2xsaW5n X2ZhY3RvciA+IDEpCisgICAgeworICAgICAgcG9seV91aW50NjQgY2FuZGlkYXRlX2ZhY3Rv ciA9IHZlY3Rvcml6YXRpb25fZmFjdG9yICogdW5yb2xsaW5nX2ZhY3RvcjsKKyAgICAgIGlm IChlc3RpbWF0ZWRfcG9seV92YWx1ZSAoY2FuZGlkYXRlX2ZhY3RvciwgUE9MWV9WQUxVRV9N QVgpCisJICA8PSAoSE9TVF9XSURFX0lOVCkgTE9PUF9WSU5GT19NQVhfVkVDVF9GQUNUT1Ig KGxvb3BfdmluZm8pKQorCXsKKwkgIHZlY3Rvcml6YXRpb25fZmFjdG9yID0gY2FuZGlkYXRl X2ZhY3RvcjsKKwkgIGJyZWFrOworCX0KKyAgICAgIHVucm9sbGluZ19mYWN0b3IgLz0gMjsK KyAgICB9CisgIGxvb3BfdmluZm8tPnBhcl91bnJvbGxpbmdfZmFjdG9yID0gdW5yb2xsaW5n X2ZhY3RvcjsKKyAgTE9PUF9WSU5GT19WRUNUX0ZBQ1RPUiAobG9vcF92aW5mbykgPSB2ZWN0 b3JpemF0aW9uX2ZhY3RvcjsKKyAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQorICAgIGR1bXBf cHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3RfbG9jYXRpb24sICJ1bnJvbGxpbmcgZmFjdG9y ID0gJWRcbiIsCisJCSAgICAgdW5yb2xsaW5nX2ZhY3Rvcik7CisKKyAgcmV0dXJuIHZlY3Rv cml6YXRpb25fZmFjdG9yOworfQorCiAvKiBGdW5jdGlvbiB2ZWN0X2FuYWx5emVfbG9vcF8y LgogCiAgICBBcHBseSBhIHNldCBvZiBhbmFseXNlcyBvbiBMT09QLCBhbmQgY3JlYXRlIGEg bG9vcF92ZWNfaW5mbyBzdHJ1Y3QKQEAgLTIzMjAsNiArMjQxOCw4IEBAIHZlY3RfYW5hbHl6 ZV9sb29wXzIgKGxvb3BfdmVjX2luZm8gbG9vcF92aW5mbywgYm9vbCAmZmF0YWwsIHVuc2ln bmVkICpuX3N0bXRzKQogCQkJICJjYW4ndCBkZXRlcm1pbmUgdmVjdG9yaXphdGlvbiBmYWN0 b3IuXG4iKTsKICAgICAgIHJldHVybiBvazsKICAgICB9CisKKyAgdmVjdF9kZXRlcm1pbmVf dW5yb2xsX2ZhY3RvciAobG9vcF92aW5mbyk7CiAgIGlmIChtYXhfdmYgIT0gTUFYX1ZFQ1RP UklaQVRJT05fRkFDVE9SCiAgICAgICAmJiBtYXliZV9sdCAobWF4X3ZmLCBMT09QX1ZJTkZP X1ZFQ1RfRkFDVE9SIChsb29wX3ZpbmZvKSkpCiAgICAgcmV0dXJuIG9wdF9yZXN1bHQ6OmZh aWx1cmVfYXQgKHZlY3RfbG9jYXRpb24sICJiYWQgZGF0YSBkZXBlbmRlbmNlLlxuIik7CkBA IC0zMDYyLDcgKzMxNjIsMTQgQEAgdmVjdF9hbmFseXplX2xvb3AgKGNsYXNzIGxvb3AgKmxv b3AsIHZlY19pbmZvX3NoYXJlZCAqc2hhcmVkKQogCQkgIGdjY19hc3NlcnQgKHZlY3RfZXBp bG9ndWVzKTsKIAkJICBkZWxldGUgdmluZm9zLnBvcCAoKTsKIAkJfQorCSAgICAgIC8qIENo ZWNrIGlmIHdlIG1heSB3YW50IHRvIHJlcGxhY2UgdGhlIGN1cnJlbnQgZmlyc3RfbG9vcF92 aW5mbworCQkgd2l0aCB0aGUgbmV3IGxvb3AsIGJ1dCBvbmx5IGlmIHRoZXkgaGF2ZSBkaWZm ZXJlbnQgdmVjdG9yCisJCSBtb2Rlcy4gIElmIHRoZXkgaGF2ZSB0aGUgc2FtZSB2ZWN0b3Ig bW9kZSB0aGlzIG1lYW5zIHRoZSBtYWluCisJCSBsb29wIGlzIGFuIHVucm9sbGVkIGxvb3Ag YW5kIHdlIGFyZSB0cnlpbmcgdG8gdmVjdG9yaXplIHRoZQorCQkgZXBpbG9ndWUgdXNpbmcg dGhlIHNhbWUgdmVjdG9yIG1vZGUgYnV0IHdpdGggYSBsb3dlcgorCQkgdmVjdG9yaXphdGlv biBmYWN0b3IuICAqLwogCSAgICAgIGlmICh2aW5mb3MuaXNfZW1wdHkgKCkKKwkJICAmJiBs b29wX3ZpbmZvLT52ZWN0b3JfbW9kZSAhPSBmaXJzdF9sb29wX3ZpbmZvLT52ZWN0b3JfbW9k ZQogCQkgICYmIHZlY3Rfam91c3RfbG9vcF92aW5mb3MgKGxvb3BfdmluZm8sIGZpcnN0X2xv b3BfdmluZm8pKQogCQl7CiAJCSAgbG9vcF92ZWNfaW5mbyBtYWluX2xvb3BfdmluZm8KQEAg LTMxNTYsMTAgKzMyNjMsMjYgQEAgdmVjdF9hbmFseXplX2xvb3AgKGNsYXNzIGxvb3AgKmxv b3AsIHZlY19pbmZvX3NoYXJlZCAqc2hhcmVkKQogCSBUaGUgcmV0cnkgc2hvdWxkIGJlIGlu IHRoZSBzYW1lIG1vZGUgYXMgb3JpZ2luYWwuICAqLwogICAgICAgaWYgKHZlY3RfZXBpbG9n dWVzCiAJICAmJiBsb29wX3ZpbmZvCi0JICAmJiBMT09QX1ZJTkZPX0VQSUxfVVNJTkdfUEFS VElBTF9WRUNUT1JTX1AgKGxvb3BfdmluZm8pKQorCSAgJiYgKExPT1BfVklORk9fRVBJTF9V U0lOR19QQVJUSUFMX1ZFQ1RPUlNfUCAobG9vcF92aW5mbykKKwkgICAgICB8fCBsb29wX3Zp bmZvLT5wYXJfdW5yb2xsaW5nX2ZhY3RvciA+IDEpKQogCXsKLQkgIGdjY19hc3NlcnQgKExP T1BfVklORk9fQ0FOX1VTRV9QQVJUSUFMX1ZFQ1RPUlNfUCAobG9vcF92aW5mbykKKwkgIGdj Y19hc3NlcnQgKChMT09QX1ZJTkZPX0NBTl9VU0VfUEFSVElBTF9WRUNUT1JTX1AgKGxvb3Bf dmluZm8pCisJCSAgICAgICB8fCBsb29wX3ZpbmZvLT5wYXJfdW5yb2xsaW5nX2ZhY3RvciA+ IDEpCiAJCSAgICAgICYmICFMT09QX1ZJTkZPX1VTSU5HX1BBUlRJQUxfVkVDVE9SU19QIChs b29wX3ZpbmZvKSk7CisJICAvKiBJZiB3ZSBhcmUgdW5yb2xsaW5nLCB0cnkgYWxsIFZFQ1RP Ul9NT0RFUyBmb3IgdGhlIGVwaWxvZ3VlLiAgKi8KKwkgIGlmIChsb29wX3ZpbmZvLT5wYXJf dW5yb2xsaW5nX2ZhY3RvciA+IDEpCisJICAgIHsKKwkgICAgICBuZXh0X3ZlY3Rvcl9tb2Rl ID0gdmVjdG9yX21vZGVzWzBdOworCSAgICAgIG1vZGVfaSA9IDE7CisKKwkgICAgICBpZiAo ZHVtcF9lbmFibGVkX3AgKCkpCisJCWR1bXBfcHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3Rf bG9jYXRpb24sCisJCQkJICIqKioqKiBSZS10cnlpbmcgYW5hbHlzaXMgd2l0aCB2ZWN0b3Ig bW9kZSIKKwkJCQkgIiAlcyBmb3IgZXBpbG9ndWUgd2l0aCBwYXJ0aWFsIHZlY3RvcnMuXG4i LAorCQkJCSBHRVRfTU9ERV9OQU1FIChuZXh0X3ZlY3Rvcl9tb2RlKSk7CisJICAgICAgY29u dGludWU7CisJICAgIH0KKwogCSAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQogCSAgICBkdW1w X3ByaW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAogCQkJICAgICAiKioqKiog UmUtdHJ5aW5nIGFuYWx5c2lzIHdpdGggc2FtZSB2ZWN0b3IgbW9kZSIKQEAgLTcyMTIsNyAr NzMzNSw4IEBAIHZlY3Rvcml6YWJsZV9yZWR1Y3Rpb24gKGxvb3BfdmVjX2luZm8gbG9vcF92 aW5mbywKICAgIHBhcnRpY2lwYXRpbmcuICAqLwogICBpZiAobmNvcGllcyA+IDEKICAgICAg ICYmIChTVE1UX1ZJTkZPX1JFTEVWQU5UIChzdG10X2luZm8pIDw9IHZlY3RfdXNlZF9vbmx5 X2xpdmUpCi0gICAgICAmJiByZWR1Y19jaGFpbl9sZW5ndGggPT0gMSkKKyAgICAgICYmIHJl ZHVjX2NoYWluX2xlbmd0aCA9PSAxCisgICAgICAmJiBsb29wX3ZpbmZvLT5wYXJfdW5yb2xs aW5nX2ZhY3RvciA9PSAxKQogICAgIHNpbmdsZV9kZWZ1c2VfY3ljbGUgPSB0cnVlOwogCiAg IGlmIChzaW5nbGVfZGVmdXNlX2N5Y2xlIHx8IGxhbmVfcmVkdWNfY29kZV9wKQpkaWZmIC0t Z2l0IGEvZ2NjL3RyZWUtdmVjdG9yaXplci5oIGIvZ2NjL3RyZWUtdmVjdG9yaXplci5oCmlu ZGV4IDljMmMyOWQ2MWZhZTVlNjUxYTExMmIxMDM0ODIxMzFlM2Q2NDZmYjYuLmI1MWU4MmEw NjYzYTM5MWEwOTY0ODBiZmYwM2EyMTkxYmMxMWRjZjQgMTAwNjQ0Ci0tLSBhL2djYy90cmVl LXZlY3Rvcml6ZXIuaAorKysgYi9nY2MvdHJlZS12ZWN0b3JpemVyLmgKQEAgLTYyMCw2ICs2 MjAsMTEgQEAgcHVibGljOgogICAgICBhYm91dCB0aGUgcmVkdWN0aW9ucyB0aGF0IGdlbmVy YXRlZCB0aGVtLiAgKi8KICAgaGFzaF9tYXA8dHJlZSwgdmVjdF9yZXVzYWJsZV9hY2N1bXVs YXRvcj4gcmV1c2FibGVfYWNjdW11bGF0b3JzOwogCisgIC8qIFRoZSBudW1iZXIgb2YgdGlt ZXMgdGhhdCB3ZSd2ZSB1bnJvbGxlZCB0aGUgdmVjdG9yIGxvb3AgaW4gb3JkZXIKKyAgICAg dG8gcHJvbW90ZSBtb3JlIElMUC4gIFRoaXMgdmFsdWUgaXMgZm9sZGVkIGludG8gdmVjdG9y aXphdGlvbl9mYWN0b3IKKyAgICAgKGFuZCB0aGVyZWZvcmUgZXhhY3RseSBkaXZpZGVzIHZl Y3Rvcml6YXRpb25fZmFjdG9yKS4gICovCisgIHVuc2lnbmVkIGludCBwYXJfdW5yb2xsaW5n X2ZhY3RvcjsKKwogICAvKiBNYXhpbXVtIHJ1bnRpbWUgdmVjdG9yaXphdGlvbiBmYWN0b3Is IG9yIE1BWF9WRUNUT1JJWkFUSU9OX0ZBQ1RPUgogICAgICBpZiB0aGVyZSBpcyBubyBwYXJ0 aWN1bGFyIGxpbWl0LiAgKi8KICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBtYXhfdmVjdG9y aXphdGlvbl9mYWN0b3I7CkBAIC0xODEwLDYgKzE4MTUsMjAgQEAgdmVjdF9hcHBseV9ydW50 aW1lX3Byb2ZpdGFiaWxpdHlfY2hlY2tfcCAobG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvKQog CSAgJiYgdGggPj0gdmVjdF92Zl9mb3JfY29zdCAobG9vcF92aW5mbykpOwogfQogCisvKiBS ZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHdlIHNob3VsZCB1bnJvbGwgZ2VuZXJh bAorICAgcmVkdWN0aW9uLWZyZWUgbG9vcHMuICAqLworCitpbmxpbmUgdW5zaWduZWQgaW50 Cit2ZWN0X3Vucm9sbF92YWx1ZSAobG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvLCBib29sIHNl ZW5fcmVkdWN0aW9uX3AsIHZvaWQgKmRhdGEpCit7CisgIGlmIChzZWVuX3JlZHVjdGlvbl9w ICYmIHBhcmFtX3ZlY3RfdW5yb2xsX3JlZHVjdGlvbnMgPj0gMSkKKyAgICByZXR1cm4gcGFy YW1fdmVjdF91bnJvbGxfcmVkdWN0aW9uczsKKyAgaWYgKHBhcmFtX3ZlY3RfdW5yb2xsID49 IDEpCisgICAgcmV0dXJuIHBhcmFtX3ZlY3RfdW5yb2xsOworICBlbHNlCisgICAgcmV0dXJu IHRhcmdldG0udmVjdG9yaXplLnVucm9sbF9mYWN0b3IgKGxvb3BfdmluZm8sIGRhdGEpOwor fQorCiAvKiBTb3VyY2UgbG9jYXRpb24gKyBob3RuZXNzIGluZm9ybWF0aW9uLiAqLwogZXh0 ZXJuIGR1bXBfdXNlcl9sb2NhdGlvbl90IHZlY3RfbG9jYXRpb247CiAK --------------FDF207D17C210BE80C44DF08--