From dev-return-4209-apmail-apr-dev-archive=apr.apache.org@apr.apache.org Tue Sep 04 20:20:29 2001 Return-Path: Delivered-To: apmail-apr-dev-archive@apr.apache.org Received: (qmail 30211 invoked by uid 500); 4 Sep 2001 20:20:29 -0000 Mailing-List: contact dev-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Delivered-To: mailing list dev@apr.apache.org Received: (qmail 30185 invoked from network); 4 Sep 2001 20:20:29 -0000 Date: Tue, 4 Sep 2001 13:20:28 -0700 From: Aaron Bannert To: dev@apr.apache.org Subject: [PATCH] apr_thread_mutex_t implementation Message-ID: <20010904132028.B29999@clove.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="KsGdsel6WgEHnImy" Content-Disposition: inline User-Agent: Mutt/1.2.5i X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N --KsGdsel6WgEHnImy Content-Type: text/plain; charset=us-ascii Content-Disposition: inline This is a bite-sized chunk of the previous mega-patch. The unfortunate thing with this patch is that there are many new files added, and they all happen to share common names. So I've done two things: 1) attached the "interesting" files inline in this message for public reviewal, and 2) attached a patch and a tarball containing the new files in their preserved patch structures. (That means that in order to apply this, one must untar the tarball *and* apply the patch.) What does this patch give us? - Thread mutexes in APR (what used to be called INTRAPROCESS locks). - apr_thread_mutex_t is fully implemented for UNIX, I've provided stubs elsewhere to keep us building. Hopefully this should be much easier to digest than the previous patch. Please excuse the tarball for the sake of namespace protection. Again: this patch does not change any existing functionality, it only adds the implementation of the new lock API in parallel with the old one. -aaron --------------------------------------------------------- Public Headers: (apr_thread_mutex.h) /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ #ifndef APR_THREAD_MUTEX_H #define APR_THREAD_MUTEX_H #include "apr.h" #include "apr_pools.h" #include "apr_errno.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * @file apr_thread_mutex.h * @brief APR Thread Mutex Routines */ /** * @defgroup APR_ThreadMutex Thread Mutex Routines * @ingroup APR * @{ */ typedef struct apr_thread_mutex_t apr_thread_mutex_t; /** * Create and initialize a mutex that can be used to synchronize threads. * @param mutex the memory address where the newly created mutex will be * stored. * @param pool the pool from which to allocate the mutex. */ APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, apr_pool_t *pool); /** * Acquire the lock for the given mutex. If the mutex is already locked, * the current thread will be put to sleep until the lock becomes available. * @param mutex the mutex on which to acquire the lock. */ APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex); /** * Attempt to acquire the lock for the given mutex. If the mutex has already * been acquired, the call returns immediately with APR_EBUSY. Note: it * is important that the APR_STATUS_IS_EBUSY(s) macro be used to determine * if the return value was APR_EBUSY, for portability reasons. * @param mutex the mutex on which to attempt the lock acquiring. */ APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex); /** * Release the lock for the given mutex. * @param mutex the mutex from which to release the lock. */ APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex); /** * Destroy the mutex and free the memory associated with the lock. * @param mutex the mutex to destroy. */ APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex); #ifdef __cplusplus } #endif #endif /* ! APR_THREAD_MUTEX_H */ --------------------------------------------------------- Private Headers (only UNIX shown): thread_mutex.h /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ #ifndef THREAD_MUTEX_H #define THREAD_MUTEX_H #include "apr.h" #include "apr_private.h" #include "apr_general.h" #include "apr_lib.h" #include "apr_thread_mutex.h" #include "apr_sms.h" #include "apr_portable.h" #if APR_HAVE_PTHREAD_H #include #endif /* End System Headers */ #if APR_HAS_THREADS struct apr_thread_mutex_t { apr_pool_t *pool; pthread_mutex_t mutex; apr_os_thread_t owner; int owner_ref; }; #endif #endif /* THREAD_MUTEX_H */ --------------------------------------------------------- Private Implementation (only UNIX shown): thread_mutex.c /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ #include "thread_mutex.h" #if APR_HAS_THREADS static apr_status_t thread_mutex_cleanup(void *data) { apr_thread_mutex_t *mutex = (apr_thread_mutex_t *)data; apr_status_t stat; pthread_mutex_unlock(&mutex->mutex); stat = pthread_mutex_destroy(&mutex->mutex); #ifdef PTHREAD_SETS_ERRNO if (stat) { stat = errno; } #endif return stat; } APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, apr_pool_t *pool) { apr_thread_mutex_t *new_mutex; pthread_mutexattr_t mattr; apr_status_t stat; new_mutex = (apr_thread_mutex_t *)apr_pcalloc(pool, sizeof(apr_thread_mutex_t)); if (new_mutex == NULL) { return APR_ENOMEM; } new_mutex->pool = pool; if ((stat = pthread_mutexattr_init(&mattr))) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif thread_mutex_cleanup(new_mutex); return stat; } if ((stat = pthread_mutex_init(&new_mutex->mutex, &mattr))) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif thread_mutex_cleanup(new_mutex); return stat; } if ((stat = pthread_mutexattr_destroy(&mattr))) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif thread_mutex_cleanup(new_mutex); return stat; } apr_pool_cleanup_register(new_mutex->pool, (void *)new_mutex, thread_mutex_cleanup, apr_pool_cleanup_null); *mutex = new_mutex; return APR_SUCCESS; } APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex) { apr_status_t stat; #if APR_HAS_THREADS apr_os_thread_t my_thrid; /* save one call to apr_os_thread_current() */ if (apr_os_thread_equal(mutex->owner, (my_thrid = apr_os_thread_current()))) { mutex->owner_ref++; return APR_SUCCESS; } #endif stat = pthread_mutex_lock(&mutex->mutex); if (stat) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif return stat; } #if APR_HAS_THREADS mutex->owner = my_thrid; mutex->owner_ref = 1; #endif return stat; } APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex) { apr_status_t stat; #if APR_HAS_THREADS apr_os_thread_t my_thrid; /* save one call to apr_os_thread_current() */ if (apr_os_thread_equal(mutex->owner, (my_thrid = apr_os_thread_current()))) { mutex->owner_ref++; return APR_SUCCESS; } #endif stat = pthread_mutex_trylock(&mutex->mutex); if (stat) { #ifdef PTHREAD_SETS_ERRNO stat = errno; #endif /* Normalize the return code. */ if (stat == EBUSY) stat = APR_EBUSY; return stat; } #if APR_HAS_THREADS mutex->owner = my_thrid; mutex->owner_ref = 1; #endif return stat; } APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex) { apr_status_t status; #if APR_HAS_THREADS if (apr_os_thread_equal(mutex->owner, apr_os_thread_current())) { mutex->owner_ref--; if (mutex->owner_ref > 0) return APR_SUCCESS; } #endif status = pthread_mutex_unlock(&mutex->mutex); if (status) { #ifdef PTHREAD_SETS_ERRNO status = errno; #endif return status; } #if APR_HAS_THREADS memset(&mutex->owner, 0, sizeof mutex->owner); mutex->owner_ref = 0; #endif return status; } APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex) { apr_status_t stat; if ((stat = thread_mutex_cleanup(mutex)) == APR_SUCCESS) { apr_pool_cleanup_kill(mutex->pool, mutex, thread_mutex_cleanup); return APR_SUCCESS; } return stat; } #endif /* APR_HAS_THREADS */ --KsGdsel6WgEHnImy Content-Type: application/x-tar Content-Disposition: attachment; filename="apr_thread_mutex.tar" Content-Transfer-Encoding: base64 aW5jbHVkZS9hcHJfdGhyZWFkX211dGV4LmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQA MDAwMDc2NAAwMDAwNzY0ADAwMDAwMDEwNzQzADA3MzQ1MjE1Njc1ADAxNTIyMwAgMAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGFhcm9u AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYWFyb24AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBUaGUgQXBh Y2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCiAqCiAqIENvcHlyaWdodCAoYykg MjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMK ICogcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBw ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJl IG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0 YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3Ry aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly aWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s bG93aW5nIGRpc2NsYWltZXIgaW4KICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90 aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAq CiAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJl ZGlzdHJpYnV0aW9uLAogKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5n IGFja25vd2xlZGdtZW50OgogKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3 YXJlIGRldmVsb3BlZCBieSB0aGUKICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCiAqICAgIEFsdGVybmF0ZWx5LCB0aGlz IGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKICog ICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5v cm1hbGx5IGFwcGVhci4KICoKICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hl IFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3Jz ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCiAqICAgIHNvZnR3YXJl IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgogKiAgICBw ZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KICoKICogNS4g UHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQg IkFwYWNoZSIsCiAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUs IHdpdGhvdXQgcHJpb3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUg U29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBg YEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJ TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwog KiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFIEFSRQogKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBT T0ZUV0FSRSBGT1VOREFUSU9OIE9SCiAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBM QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBM SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT OyBMT1NTIE9GCiAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiAqIE9SIFRPUlQg KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ IE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP RiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CiAqCiAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlv bnMgbWFkZSBieSBtYW55CiAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hl IFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiB0aGUg QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cu YXBhY2hlLm9yZy8+LgogKi8KCiNpZm5kZWYgQVBSX1RIUkVBRF9NVVRFWF9ICiNkZWZpbmUg QVBSX1RIUkVBRF9NVVRFWF9ICgojaW5jbHVkZSAiYXByLmgiCiNpbmNsdWRlICJhcHJfcG9v bHMuaCIKI2luY2x1ZGUgImFwcl9lcnJuby5oIgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVy biAiQyIgewojZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KCi8qKgogKiBAZmlsZSBhcHJfdGhy ZWFkX211dGV4LmgKICogQGJyaWVmIEFQUiBUaHJlYWQgTXV0ZXggUm91dGluZXMKICovCgov KioKICogQGRlZmdyb3VwIEFQUl9UaHJlYWRNdXRleCBUaHJlYWQgTXV0ZXggUm91dGluZXMK ICogQGluZ3JvdXAgQVBSCiAqIEB7CiAqLwoKdHlwZWRlZiBzdHJ1Y3QgYXByX3RocmVhZF9t dXRleF90IGFwcl90aHJlYWRfbXV0ZXhfdDsKCi8qKgogKiBDcmVhdGUgYW5kIGluaXRpYWxp emUgYSBtdXRleCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN5bmNocm9uaXplIHRocmVhZHMuCiAq IEBwYXJhbSBtdXRleCB0aGUgbWVtb3J5IGFkZHJlc3Mgd2hlcmUgdGhlIG5ld2x5IGNyZWF0 ZWQgbXV0ZXggd2lsbCBiZQogKiAgICAgICAgc3RvcmVkLgogKiBAcGFyYW0gcG9vbCB0aGUg cG9vbCBmcm9tIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBtdXRleC4KICovCkFQUl9ERUNMQVJF KGFwcl9zdGF0dXNfdCkgYXByX3RocmVhZF9tdXRleF9jcmVhdGUoYXByX3RocmVhZF9tdXRl eF90ICoqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgYXByX3Bvb2xfdCAqcG9vbCk7Ci8qKgogKiBBY3F1aXJlIHRoZSBsb2NrIGZv ciB0aGUgZ2l2ZW4gbXV0ZXguIElmIHRoZSBtdXRleCBpcyBhbHJlYWR5IGxvY2tlZCwKICog dGhlIGN1cnJlbnQgdGhyZWFkIHdpbGwgYmUgcHV0IHRvIHNsZWVwIHVudGlsIHRoZSBsb2Nr IGJlY29tZXMgYXZhaWxhYmxlLgogKiBAcGFyYW0gbXV0ZXggdGhlIG11dGV4IG9uIHdoaWNo IHRvIGFjcXVpcmUgdGhlIGxvY2suCiAqLwpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFw cl90aHJlYWRfbXV0ZXhfbG9jayhhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4KTsKCi8qKgog KiBBdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGxvY2sgZm9yIHRoZSBnaXZlbiBtdXRleC4gSWYg dGhlIG11dGV4IGhhcyBhbHJlYWR5CiAqIGJlZW4gYWNxdWlyZWQsIHRoZSBjYWxsIHJldHVy bnMgaW1tZWRpYXRlbHkgd2l0aCBBUFJfRUJVU1kuIE5vdGU6IGl0CiAqIGlzIGltcG9ydGFu dCB0aGF0IHRoZSBBUFJfU1RBVFVTX0lTX0VCVVNZKHMpIG1hY3JvIGJlIHVzZWQgdG8gZGV0 ZXJtaW5lCiAqIGlmIHRoZSByZXR1cm4gdmFsdWUgd2FzIEFQUl9FQlVTWSwgZm9yIHBvcnRh YmlsaXR5IHJlYXNvbnMuCiAqIEBwYXJhbSBtdXRleCB0aGUgbXV0ZXggb24gd2hpY2ggdG8g YXR0ZW1wdCB0aGUgbG9jayBhY3F1aXJpbmcuCiAqLwpBUFJfREVDTEFSRShhcHJfc3RhdHVz X3QpIGFwcl90aHJlYWRfbXV0ZXhfdHJ5bG9jayhhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4 KTsKCi8qKgogKiBSZWxlYXNlIHRoZSBsb2NrIGZvciB0aGUgZ2l2ZW4gbXV0ZXguCiAqIEBw YXJhbSBtdXRleCB0aGUgbXV0ZXggZnJvbSB3aGljaCB0byByZWxlYXNlIHRoZSBsb2NrLgog Ki8KQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkX211dGV4X3VubG9jayhh cHJfdGhyZWFkX211dGV4X3QgKm11dGV4KTsKCi8qKgogKiBEZXN0cm95IHRoZSBtdXRleCBh bmQgZnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jay4KICogQHBhcmFt IG11dGV4IHRoZSBtdXRleCB0byBkZXN0cm95LgogKi8KQVBSX0RFQ0xBUkUoYXByX3N0YXR1 c190KSBhcHJfdGhyZWFkX211dGV4X2Rlc3Ryb3koYXByX3RocmVhZF9tdXRleF90ICptdXRl eCk7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAgLyogISBBUFJfVEhS RUFEX01VVEVYX0ggKi8KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpbmNsdWRlL2Fy Y2gvdW5peC90aHJlYWRfbXV0ZXguaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAwNzY0ADAw MDA3NjQAMDAwMDAwMDYwNTEAMDczNDUyMzIwNjcAMDE2MjUwACAwAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAYWFyb24AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAABhYXJvbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFRoZSBBcGFjaGUgU29mdHdh cmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKICoKICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEg VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwogKiByZXNlcnZl ZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm b3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgog KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi b3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAg IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz Y2xhaW1lciBpbgogKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp YWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1dGlvbi4KICoKICogMy4gVGhl IGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRp b24sCiAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVk Z21lbnQ6CiAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxv cGVkIGJ5IHRoZQogKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6 Ly93d3cuYXBhY2hlLm9yZy8pLiIKICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVk Z21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAogKiAgICBpZiBhbmQg d2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBw ZWFyLgogKgogKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUg Rm91bmRhdGlvbiIgbXVzdAogKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKICogICAgc29mdHdhcmUgd2l0aG91dCBw cmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAqICAgIHBlcm1pc3Npb24s IHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgogKgogKiA1LiBQcm9kdWN0cyBk ZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwK ICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBw cmlvciB3cml0dGVuCiAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBB TkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywg QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNI QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAq IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZP VU5EQVRJT04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF Q1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8s IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YK ICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP V0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5H IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9G IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT SUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhp cyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5 IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUg Rm91bmRhdGlvbi4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29m dHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5hcGFjaGUub3Jn Lz4uCiAqLwoKI2lmbmRlZiBUSFJFQURfTVVURVhfSAojZGVmaW5lIFRIUkVBRF9NVVRFWF9I CgojaW5jbHVkZSAiYXByLmgiCiNpbmNsdWRlICJhcHJfcHJpdmF0ZS5oIgojaW5jbHVkZSAi YXByX2dlbmVyYWwuaCIKI2luY2x1ZGUgImFwcl9saWIuaCIKI2luY2x1ZGUgImFwcl90aHJl YWRfbXV0ZXguaCIKI2luY2x1ZGUgImFwcl9zbXMuaCIKI2luY2x1ZGUgImFwcl9wb3J0YWJs ZS5oIgoKI2lmIEFQUl9IQVZFX1BUSFJFQURfSAojaW5jbHVkZSA8cHRocmVhZC5oPgojZW5k aWYKLyogRW5kIFN5c3RlbSBIZWFkZXJzICovCgojaWYgQVBSX0hBU19USFJFQURTCnN0cnVj dCBhcHJfdGhyZWFkX211dGV4X3QgewogICAgYXByX3Bvb2xfdCAqcG9vbDsKICAgIHB0aHJl YWRfbXV0ZXhfdCBtdXRleDsKICAgIGFwcl9vc190aHJlYWRfdCBvd25lcjsKICAgIGludCBv d25lcl9yZWY7Cn07CiNlbmRpZgoKI2VuZGlmICAvKiBUSFJFQURfTVVURVhfSCAqLwoKAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaW5jbHVkZS9hcmNoL2Jlb3Mv dGhyZWFkX211dGV4LmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2NAAwMDAwNzY0ADAw MDAwMDA1NjAwADA3MzQ1MjIxMTE0ADAxNjIwMwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGFhcm9uAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAYWFyb24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vu c2UsIFZlcnNpb24gMS4xCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFj aGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKICogcmVzZXJ2ZWQuCiAqCiAq IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp dGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVk aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5 cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv bGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5 IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2Us IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg aW4KICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92 aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBlbmQtdXNl ciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAogKiAg ICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50Ogog KiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0 aGUKICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFw YWNoZS5vcmcvKS4iCiAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1h eSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKICogICAgaWYgYW5kIHdoZXJldmVy IHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KICoK ICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRp b24iIG11c3QKICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1 Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCiAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3Jp dHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uLCBwbGVhc2Ug Y29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KICoKICogNS4gUHJvZHVjdHMgZGVyaXZlZCBm cm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCiAqICAgIG5v ciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3Jp dHRlbgogKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlv bi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBF WFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJ VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBESVNDTEFJ TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9O IE9SCiAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ UkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQUk9DVVJF TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCiAqIFVTRSwg REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB VVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNF IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg T0YKICogU1VDSCBEQU1BR0UuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqCiAqIFRoaXMgc29mdHdh cmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CiAq IGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRp b24uICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZv dW5kYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgogKi8K CiNpZm5kZWYgVEhSRUFEX01VVEVYX0gKI2RlZmluZSBUSFJFQURfTVVURVhfSAoKI2luY2x1 ZGUgPGtlcm5lbC9PUy5oPgojaW5jbHVkZSAiYXByX3Bvb2xzLmgiCiNpbmNsdWRlICJhcHJf dGhyZWFkX211dGV4LmgiCiNpbmNsdWRlICJhcHJfZmlsZV9pby5oIgojaW5jbHVkZSAiYXBy X2dlbmVyYWwuaCIKI2luY2x1ZGUgImFwcl9saWIuaCIKI2luY2x1ZGUgImFwcl9wb3J0YWJs ZS5oIgoKc3RydWN0IGFwcl90aHJlYWRfbXV0ZXhfdCB7CiAgICBhcHJfcG9vbF90ICpwb29s Owp9OwoKI2VuZGlmICAvKiBUSFJFQURfTVVURVhfSCAqLwoKAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AABpbmNsdWRlL2FyY2gvbmV0d2FyZS90aHJlYWRfbXV0ZXguaAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0 NAAwMDAwNzY0ADAwMDA3NjQAMDAwMDAwMDU0MTAAMDczNDUyMjExMjYAMDE2NzIyACAwAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAYWFy b24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYXJvbgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qID09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFRoZSBB cGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKICoKICogQ29weXJpZ2h0IChj KSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0 cwogKiByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJl IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBh cmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIDIuIFJlZGlz dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w eXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm b2xsb3dpbmcgZGlzY2xhaW1lciBpbgogKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1dGlvbi4K ICoKICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUg cmVkaXN0cmlidXRpb24sCiAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dp bmcgYWNrbm93bGVkZ21lbnQ6CiAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29m dHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQogKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5k YXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKICogICAgQWx0ZXJuYXRlbHksIHRo aXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAog KiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMg bm9ybWFsbHkgYXBwZWFyLgogKgogKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFj aGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAogKiAgICBub3QgYmUgdXNlZCB0byBlbmRv cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKICogICAgc29mdHdh cmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAqICAg IHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgogKgogKiA1 LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxl ZCAiQXBhY2hlIiwKICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFt ZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCiAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNo ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE IGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMs IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT CiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hF IFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVN UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAq IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD RVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9S VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX QVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE IE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0 aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFj aGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIHRo ZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3 dy5hcGFjaGUub3JnLz4uCiAqLwoKI2lmbmRlZiBUSFJFQURfTVVURVhfSAojZGVmaW5lIFRI UkVBRF9NVVRFWF9ICgojaW5jbHVkZSAiYXByX3RocmVhZF9tdXRleC5oIgojaW5jbHVkZSA8 bmtzL3N5bmNoLmg+CgpzdHJ1Y3QgYXByX3RocmVhZF9tdXRleF90IHsKICAgIGFwcl9wb29s X3QgKnBvb2w7Cn07CgojZW5kaWYgIC8qIFRIUkVBRF9NVVRFWF9IICovCgoAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGluY2x1ZGUvYXJjaC9vczIvdGhyZWFkX211dGV4LmgA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDA3NjQAMDAwMDc2NAAwMDAwMDAwNTQxMgAwNzM0 NTIyMTE0MgAwMTU3NjAAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAdXN0YXIgIABhYXJvbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFhcm9u AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyogPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEu MQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZv dW5kYXRpb24uICBBbGwgcmlnaHRzCiAqIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlv biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv d2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5v dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh aW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCiAqICAgIHRoZSBk b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK ICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlv biBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKICogICAgaWYgYW55LCBtdXN0 IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKICogICAgICAgIlRoaXMg cHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCiAqICAgICAgICBB cGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgog KiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRo ZSBzb2Z0d2FyZSBpdHNlbGYsCiAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBh cnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCiAqCiAqIDQuIFRoZSBuYW1l cyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CiAqICAg IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy b20gdGhpcwogKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv bi4gRm9yIHdyaXR0ZW4KICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hl QGFwYWNoZS5vcmcuCiAqCiAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3 YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAogKiAgICBub3IgbWF5ICJBcGFjaGUi IGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KICogICAgcGVy bWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRISVMg U09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElN UExJRUQKICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI RSBJTVBMSUVEIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKICogRElTQ0xBSU1FRC4gIElOIE5PIEVW RU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgogKiBJVFMgQ09O VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U QUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ TkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJ VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9O IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg TElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFN QUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9m IHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBv biBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUK ICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVh c2Ugc2VlCiAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KICovCgojaWZuZGVmIFRIUkVB RF9NVVRFWF9ICiNkZWZpbmUgVEhSRUFEX01VVEVYX0gKCiNpbmNsdWRlICJhcHJfdGhyZWFk X211dGV4LmgiCiNpbmNsdWRlICJhcHJfZmlsZV9pby5oIgoKc3RydWN0IGFwcl90aHJlYWRf bXV0ZXhfdCB7CiAgICBhcHJfcG9vbF90ICpwb29sOwp9OwoKI2VuZGlmICAvKiBUSFJFQURf TVVURVhfSCAqLwoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaW5jbHVkZS9hcmNo L3dpbjMyL3RocmVhZF9tdXRleC5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2NAAwMDAw NzY0ADAwMDAwMDA1MzUxADA3MzQ1MjE2NTYxADAxNjIzMgAgMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGFhcm9uAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAYWFyb24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBUaGUgQXBhY2hlIFNvZnR3YXJl IExpY2Vuc2UsIFZlcnNpb24gMS4xCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRo ZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKICogcmVzZXJ2ZWQu CiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y bXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICog MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92 ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBu b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns YWltZXIgaW4KICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs cyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBl bmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9u LAogKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdt ZW50OgogKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3Bl ZCBieSB0aGUKICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8v d3d3LmFwYWNoZS5vcmcvKS4iCiAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdt ZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKICogICAgaWYgYW5kIHdo ZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVh ci4KICoKICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZv dW5kYXRpb24iIG11c3QKICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl IHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCiAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJp b3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uLCBw bGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KICoKICogNS4gUHJvZHVjdHMgZGVy aXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCiAq ICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJp b3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91 bmRhdGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5E IEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFO VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBE SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VO REFUSU9OIE9SCiAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQ Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCiAq IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF VkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiAqIE9SIFRPUlQgKElOQ0xVRElORyBO RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBU SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC SUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqCiAqIFRoaXMg c29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBt YW55CiAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZv dW5kYXRpb24uICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3 YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+ LgogKi8KCiNpZm5kZWYgVEhSRUFEX01VVEVYX0gKI2RlZmluZSBUSFJFQURfTVVURVhfSAoK I2luY2x1ZGUgImFwcl9sb2NrLmgiCgpzdHJ1Y3QgYXByX3RocmVhZF9tdXRleF90IHsKICAg IGFwcl9wb29sX3QgKnBvb2w7Cn07CgojZW5kaWYgIC8qIFRIUkVBRF9NVVRFWF9IICovCgoA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAABsb2Nrcy91bml4L3RocmVhZF9tdXRleC5jAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA MDEwMDY0NAAwMDAwNzY0ADAwMDA3NjQAMDAwMDAwMTQ1NjcAMDczNDUyMzIxMjEAMDE1MDIw ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFy ICAAYWFyb24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYXJvbgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAq IFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKICoKICogQ29weXJp Z2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxs IHJpZ2h0cwogKiByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlv biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u cwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlz dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIDIu IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv dmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgogKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBh bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1 dGlvbi4KICoKICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0 aCB0aGUgcmVkaXN0cmlidXRpb24sCiAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBm b2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CiAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVk ZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQogKiAgICAgICAgQXBhY2hlIFNvZnR3YXJl IEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKICogICAgQWx0ZXJuYXRl bHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRz ZWxmLAogKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRn bWVudHMgbm9ybWFsbHkgYXBwZWFyLgogKgogKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5k ICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAogKiAgICBub3QgYmUgdXNlZCB0 byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKICogICAg c29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVu CiAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgog KgogKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJl IGNhbGxlZCAiQXBhY2hlIiwKICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhl aXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCiAqICAgIHBlcm1pc3Npb24gb2YgdGhl IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBS T1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJB TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS QU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg QVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBM SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFM LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg Tk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig U0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9G IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICog T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO IEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29u dHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRo ZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9u IG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0 cDovL3d3dy5hcGFjaGUub3JnLz4uCiAqLwoKI2luY2x1ZGUgInRocmVhZF9tdXRleC5oIgoK I2lmIEFQUl9IQVNfVEhSRUFEUwoKc3RhdGljIGFwcl9zdGF0dXNfdCB0aHJlYWRfbXV0ZXhf Y2xlYW51cCh2b2lkICpkYXRhKQp7CiAgICBhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4ID0g KGFwcl90aHJlYWRfbXV0ZXhfdCAqKWRhdGE7CiAgICBhcHJfc3RhdHVzX3Qgc3RhdDsKCiAg ICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgtPm11dGV4KTsKICAgIHN0YXQgPSBwdGhy ZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4LT5tdXRleCk7CiNpZmRlZiBQVEhSRUFEX1NFVFNf RVJSTk8KICAgIGlmIChzdGF0KSB7CiAgICAgICAgc3RhdCA9IGVycm5vOwogICAgfQojZW5k aWYKICAgIHJldHVybiBzdGF0Owp9IAoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJf dGhyZWFkX211dGV4X2NyZWF0ZShhcHJfdGhyZWFkX211dGV4X3QgKiptdXRleCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfcG9vbF90 ICpwb29sKQp7CiAgICBhcHJfdGhyZWFkX211dGV4X3QgKm5ld19tdXRleDsKICAgIHB0aHJl YWRfbXV0ZXhhdHRyX3QgbWF0dHI7CiAgICBhcHJfc3RhdHVzX3Qgc3RhdDsKCiAgICBuZXdf bXV0ZXggPSAoYXByX3RocmVhZF9tdXRleF90ICopYXByX3BjYWxsb2MocG9vbCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXBy X3RocmVhZF9tdXRleF90KSk7CgogICAgaWYgKG5ld19tdXRleCA9PSBOVUxMKSB7CiAgICAg ICAgcmV0dXJuIEFQUl9FTk9NRU07CiAgICB9CgogICAgbmV3X211dGV4LT5wb29sID0gcG9v bDsKCiAgICBpZiAoKHN0YXQgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtYXR0cikpKSB7 CiNpZmRlZiBQVEhSRUFEX1NFVFNfRVJSTk8KICAgICAgICBzdGF0ID0gZXJybm87CiNlbmRp ZgogICAgICAgIHRocmVhZF9tdXRleF9jbGVhbnVwKG5ld19tdXRleCk7CiAgICAgICAgcmV0 dXJuIHN0YXQ7CiAgICB9CgogICAgaWYgKChzdGF0ID0gcHRocmVhZF9tdXRleF9pbml0KCZu ZXdfbXV0ZXgtPm11dGV4LCAmbWF0dHIpKSkgewojaWZkZWYgUFRIUkVBRF9TRVRTX0VSUk5P CiAgICAgICAgc3RhdCA9IGVycm5vOwojZW5kaWYKICAgICAgICB0aHJlYWRfbXV0ZXhfY2xl YW51cChuZXdfbXV0ZXgpOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQoKICAgIGlmICgo c3RhdCA9IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm1hdHRyKSkpIHsKI2lmZGVmIFBU SFJFQURfU0VUU19FUlJOTwogICAgICAgIHN0YXQgPSBlcnJubzsKI2VuZGlmCiAgICAgICAg dGhyZWFkX211dGV4X2NsZWFudXAobmV3X211dGV4KTsKICAgICAgICByZXR1cm4gc3RhdDsK ICAgIH0KCiAgICBhcHJfcG9vbF9jbGVhbnVwX3JlZ2lzdGVyKG5ld19tdXRleC0+cG9vbCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiluZXdfbXV0ZXgsIHRocmVh ZF9tdXRleF9jbGVhbnVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfcG9v bF9jbGVhbnVwX251bGwpOwoKICAgICptdXRleCA9IG5ld19tdXRleDsKICAgIHJldHVybiBB UFJfU1VDQ0VTUzsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkX211 dGV4X2xvY2soYXByX3RocmVhZF9tdXRleF90ICptdXRleCkKewogICAgYXByX3N0YXR1c190 IHN0YXQ7CgojaWYgQVBSX0hBU19USFJFQURTCiAgICBhcHJfb3NfdGhyZWFkX3QgbXlfdGhy aWQ7IC8qIHNhdmUgb25lIGNhbGwgdG8gYXByX29zX3RocmVhZF9jdXJyZW50KCkgKi8KCiAg ICBpZiAoYXByX29zX3RocmVhZF9lcXVhbChtdXRleC0+b3duZXIsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAobXlfdGhyaWQgPSBhcHJfb3NfdGhyZWFkX2N1cnJlbnQoKSkpKSB7 CiAgICAgICAgbXV0ZXgtPm93bmVyX3JlZisrOwogICAgICAgIHJldHVybiBBUFJfU1VDQ0VT UzsKICAgIH0KI2VuZGlmCgogICAgc3RhdCA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgt Pm11dGV4KTsKICAgIGlmIChzdGF0KSB7CiNpZmRlZiBQVEhSRUFEX1NFVFNfRVJSTk8KICAg ICAgICBzdGF0ID0gZXJybm87CiNlbmRpZgogICAgICAgIHJldHVybiBzdGF0OwogICAgfQoK I2lmIEFQUl9IQVNfVEhSRUFEUwogICAgbXV0ZXgtPm93bmVyID0gbXlfdGhyaWQ7CiAgICBt dXRleC0+b3duZXJfcmVmID0gMTsKI2VuZGlmCgogICAgcmV0dXJuIHN0YXQ7Cn0KCkFQUl9E RUNMQVJFKGFwcl9zdGF0dXNfdCkgYXByX3RocmVhZF9tdXRleF90cnlsb2NrKGFwcl90aHJl YWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIGFwcl9zdGF0dXNfdCBzdGF0OwoKI2lmIEFQUl9I QVNfVEhSRUFEUwogICAgYXByX29zX3RocmVhZF90IG15X3RocmlkOyAvKiBzYXZlIG9uZSBj YWxsIHRvIGFwcl9vc190aHJlYWRfY3VycmVudCgpICovCgogICAgaWYgKGFwcl9vc190aHJl YWRfZXF1YWwobXV0ZXgtPm93bmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG15 X3RocmlkID0gYXByX29zX3RocmVhZF9jdXJyZW50KCkpKSkgewogICAgICAgIG11dGV4LT5v d25lcl9yZWYrKzsKICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7CiAgICB9CiNlbmRpZgoK ICAgIHN0YXQgPSBwdGhyZWFkX211dGV4X3RyeWxvY2soJm11dGV4LT5tdXRleCk7CiAgICBp ZiAoc3RhdCkgewojaWZkZWYgUFRIUkVBRF9TRVRTX0VSUk5PCiAgICAgICAgc3RhdCA9IGVy cm5vOwojZW5kaWYKICAgICAgICAvKiBOb3JtYWxpemUgdGhlIHJldHVybiBjb2RlLiAqLwog ICAgICAgIGlmIChzdGF0ID09IEVCVVNZKQogICAgICAgICAgICBzdGF0ID0gQVBSX0VCVVNZ OwoKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KCiNpZiBBUFJfSEFTX1RIUkVBRFMKICAg IG11dGV4LT5vd25lciA9IG15X3RocmlkOwogICAgbXV0ZXgtPm93bmVyX3JlZiA9IDE7CiNl bmRpZgoKICAgIHJldHVybiBzdGF0Owp9CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFw cl90aHJlYWRfbXV0ZXhfdW5sb2NrKGFwcl90aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAg IGFwcl9zdGF0dXNfdCBzdGF0dXM7CgojaWYgQVBSX0hBU19USFJFQURTCiAgICBpZiAoYXBy X29zX3RocmVhZF9lcXVhbChtdXRleC0+b3duZXIsIGFwcl9vc190aHJlYWRfY3VycmVudCgp KSkgewogICAgICAgIG11dGV4LT5vd25lcl9yZWYtLTsKICAgICAgICBpZiAobXV0ZXgtPm93 bmVyX3JlZiA+IDApCiAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKICAgIH0KI2Vu ZGlmCgogICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4LT5tdXRleCk7 CiAgICBpZiAoc3RhdHVzKSB7CiNpZmRlZiBQVEhSRUFEX1NFVFNfRVJSTk8KICAgICAgICBz dGF0dXMgPSBlcnJubzsKI2VuZGlmCiAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgIH0KCiNp ZiBBUFJfSEFTX1RIUkVBRFMKICAgIG1lbXNldCgmbXV0ZXgtPm93bmVyLCAwLCBzaXplb2Yg bXV0ZXgtPm93bmVyKTsKICAgIG11dGV4LT5vd25lcl9yZWYgPSAwOwojZW5kaWYKICAgIAog ICAgcmV0dXJuIHN0YXR1czsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhy ZWFkX211dGV4X2Rlc3Ryb3koYXByX3RocmVhZF9tdXRleF90ICptdXRleCkKewogICAgYXBy X3N0YXR1c190IHN0YXQ7CiAgICBpZiAoKHN0YXQgPSB0aHJlYWRfbXV0ZXhfY2xlYW51cCht dXRleCkpID09IEFQUl9TVUNDRVNTKSB7CiAgICAgICAgYXByX3Bvb2xfY2xlYW51cF9raWxs KG11dGV4LT5wb29sLCBtdXRleCwgdGhyZWFkX211dGV4X2NsZWFudXApOwogICAgICAgIHJl dHVybiBBUFJfU1VDQ0VTUzsKICAgIH0KICAgIHJldHVybiBzdGF0Owp9CgojZW5kaWYgLyog QVBSX0hBU19USFJFQURTICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9ja3Mv YmVvcy90aHJlYWRfbXV0ZXguYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2 NAAwMDAwNzY0ADAwMDAwMDA2Njc3ADA3MzQ1MjMyMTMzADAxNDc3MwAgMAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGFhcm9uAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAYWFyb24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBUaGUgQXBhY2hlIFNv ZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMC0y MDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKICogcmVz ZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0 ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoK ICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo ZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlv bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAog KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n IGRpc2NsYWltZXIgaW4KICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMu IFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJp YnV0aW9uLAogKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25v d2xlZGdtZW50OgogKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRl dmVsb3BlZCBieSB0aGUKICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICho dHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCiAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25v d2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKICogICAgaWYg YW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5 IGFwcGVhci4KICoKICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3 YXJlIEZvdW5kYXRpb24iIG11c3QKICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCiAqICAgIHNvZnR3YXJlIHdpdGhv dXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgogKiAgICBwZXJtaXNz aW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KICoKICogNS4gUHJvZHVj dHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNo ZSIsCiAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhv dXQgcHJpb3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdh cmUgRm91bmRhdGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElT JycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJ TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBN RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS RQogKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FS RSBGT1VOREFUSU9OIE9SCiAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVE IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT IE9GCiAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O KSBIT1dFVkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiAqIE9SIFRPUlQgKElOQ0xV RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAog KiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg UE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqID09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqCiAq IFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFk ZSBieSBtYW55CiAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3 YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hl IFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuYXBhY2hl Lm9yZy8+LgogKi8KCi8qUmVhZC9Xcml0ZSBsb2NraW5nIGltcGxlbWVudGF0aW9uIGJhc2Vk IG9uIHRoZSBNdWx0aUxvY2sgY29kZSBmcm9tCiAqIFN0ZXBoZW4gQmVhdWxpZXUgPGhpcHBv QGJlLmNvbT4KICovCiAKI2luY2x1ZGUgImJlb3MvdGhyZWFkX211dGV4LmgiCiNpbmNsdWRl ICJhcHJfc3RyaW5ncy5oIgojaW5jbHVkZSAiYXByX3BvcnRhYmxlLmgiCgpzdGF0aWMgYXBy X3N0YXR1c190IHRocmVhZF9tdXRleF9jbGVhbnVwKHZvaWQgKmRhdGEpCnsKICAgIHJldHVy biBBUFJfRU5PVElNUEw7Cn0KCkFQUl9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXByX3RocmVh ZF9tdXRleF9jcmVhdGUoYXByX3RocmVhZF9tdXRleF90ICoqbXV0ZXgsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3Bvb2xfdCAqcG9v bCkKewogICAgcmV0dXJuIEFQUl9FTk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1 c190KSBhcHJfdGhyZWFkX211dGV4X2xvY2soYXByX3RocmVhZF9tdXRleF90ICptdXRleCkK ewogICAgcmV0dXJuIEFQUl9FTk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190 KSBhcHJfdGhyZWFkX211dGV4X3RyeWxvY2soYXByX3RocmVhZF9tdXRleF90ICptdXRleCkK ewogICAgcmV0dXJuIEFQUl9FTk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190 KSBhcHJfdGhyZWFkX211dGV4X3VubG9jayhhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4KQp7 CiAgICByZXR1cm4gQVBSX0VOT1RJTVBMOwp9CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3Qp IGFwcl90aHJlYWRfbXV0ZXhfZGVzdHJveShhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4KQp7 CiAgICByZXR1cm4gQVBSX0VOT1RJTVBMOwp9CgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxvY2tzL29zMi90aHJl YWRfbXV0ZXguYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDA3NjQAMDAwMDc2 NAAwMDAwMDAwNjUxNwAwNzM0NTIzMjE0NQAwMTQ1NDIAIDAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABhYXJvbgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGFhcm9uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAALyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBM aWNlbnNlLCBWZXJzaW9uIDEuMQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUg QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCiAqIHJlc2VydmVkLgog KgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z LCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEu IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg Y29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90 aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp bWVyIGluCiAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg cHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBUaGUgZW5k LXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwK ICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVu dDoKICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQg YnkgdGhlCiAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3 dy5hcGFjaGUub3JnLykuIgogKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVu dCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCiAqICAgIGlmIGFuZCB3aGVy ZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIu CiAqCiAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uIiBtdXN0CiAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw cm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwogKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9y IHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KICogICAgcGVybWlzc2lvbiwgcGxl YXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCiAqCiAqIDUuIFByb2R1Y3RzIGRlcml2 ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAogKiAg ICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9y IHdyaXR0ZW4KICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5k YXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBB TlkgRVhQUkVTU0VEIE9SIElNUExJRUQKICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRB QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKICogRElT Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRB VElPTiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg SU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJP Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBV U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF UiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVH TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhF IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM SVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNv ZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFu eQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLiAgRm9yIG1vcmUKICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCiAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4K ICovCgojaW5jbHVkZSAiYXByX2dlbmVyYWwuaCIKI2luY2x1ZGUgImFwcl9saWIuaCIKI2lu Y2x1ZGUgImFwcl9zdHJpbmdzLmgiCiNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKI2luY2x1 ZGUgInRocmVhZF9tdXRleC5oIgojaW5jbHVkZSAiZmlsZWlvLmgiCiNpbmNsdWRlIDxzdHJp bmcuaD4KCkFQUl9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXByX3RocmVhZF9tdXRleF9jcmVh dGUoYXByX3RocmVhZF9tdXRleF90ICoqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3Bvb2xfdCAqcG9vbCkKewogICAgcmV0 dXJuIEFQUl9FTk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhy ZWFkX211dGV4X2xvY2soYXByX3RocmVhZF9tdXRleF90ICptdXRleCkKewogICAgcmV0dXJu IEFQUl9FTk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFk X211dGV4X3RyeWxvY2soYXByX3RocmVhZF9tdXRleF90ICptdXRleCkKewogICAgcmV0dXJu IEFQUl9FTk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFk X211dGV4X3VubG9jayhhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICByZXR1cm4g QVBSX0VOT1RJTVBMOwp9CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFwcl90aHJlYWRf bXV0ZXhfZGVzdHJveShhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICByZXR1cm4g QVBSX0VOT1RJTVBMOwp9CgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb2Nrcy93aW4zMi90aHJlYWRfbXV0 ZXguYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAwNzY0ADAwMDA3NjQAMDAwMDAw MDY2MjUAMDczNDUyMzIxNTMAMDE1MDAwACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAYWFyb24AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABhYXJvbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CiAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwg VmVyc2lvbiAxLjEKICoKICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwogKiByZXNlcnZlZC4KICoKICogUmVk aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv ciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0 IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3Ry aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo dAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93 aW5nIGRpc2NsYWltZXIuCiAqCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhp cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgog KiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk IHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1dGlvbi4KICoKICogMy4gVGhlIGVuZC11c2VyIGRv Y3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCiAqICAgIGlm IGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CiAqICAg ICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQog KiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hl Lm9yZy8pLiIKICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFw cGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAogKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3Vj aCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgogKgogKiA0 LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIg bXVzdAogKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg ZGVyaXZlZCBmcm9tIHRoaXMKICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVu IHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250 YWN0IGFwYWNoZUBhcGFjaGUub3JnLgogKgogKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20g dGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKICogICAgbm9yIG1h eSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVu CiAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgog KgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJF U1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBB TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQu ICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IK ICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU LCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRB LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE IEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD VCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0Yg VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgog KiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBj b25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5k aXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4g IEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRh dGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCiAqLwoKI2lu Y2x1ZGUgImFwci5oIgojaW5jbHVkZSAiYXByX3ByaXZhdGUuaCIKI2luY2x1ZGUgImFwcl9n ZW5lcmFsLmgiCiNpbmNsdWRlICJhcHJfc3RyaW5ncy5oIgojaW5jbHVkZSAid2luMzIvdGhy ZWFkX211dGV4LmgiCiNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKCnN0YXRpYyBhcHJfc3Rh dHVzX3QgdGhyZWFkX211dGV4X2NsZWFudXAodm9pZCAqZGF0YSkKewogICAgcmV0dXJuIEFQ Ul9FTk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkX211 dGV4X2NyZWF0ZShhcHJfdGhyZWFkX211dGV4X3QgKiptdXRleCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfcG9vbF90ICpwb29sKQp7 CiAgICByZXR1cm4gQVBSX0VOT1RJTVBMOwp9CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3Qp IGFwcl90aHJlYWRfbXV0ZXhfbG9jayhhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAg ICByZXR1cm4gQVBSX0VOT1RJTVBMOwp9CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFw cl90aHJlYWRfbXV0ZXhfdHJ5bG9jayhhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAg ICByZXR1cm4gQVBSX0VOT1RJTVBMOwp9CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFw cl90aHJlYWRfbXV0ZXhfdW5sb2NrKGFwcl90aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAg IHJldHVybiBBUFJfRU5PVElNUEw7Cn0KCkFQUl9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXBy X3RocmVhZF9tdXRleF9kZXN0cm95KGFwcl90aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAg IHJldHVybiBBUFJfRU5PVElNUEw7Cn0KCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9ja3MvbmV0d2FyZS90aHJlYWRfbXV0ZXguYwAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMDc2NAAwMDAwNzY0ADAwMDAwMDA2NjE3ADA3 MzQ1MjMyMTYxADAxNTUwMwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB1c3RhciAgAGFhcm9uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYWFy b24AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKiA9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQogKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24g MS4xCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUg Rm91bmRhdGlvbi4gIEFsbCByaWdodHMKICogcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0 aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91 dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s bG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25z IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAg bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj bGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICogICAgdGhl IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo ZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0 aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAogKiAgICBpZiBhbnksIG11 c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgogKiAgICAgICAiVGhp cyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKICogICAgICAg IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4i CiAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4g dGhlIHNvZnR3YXJlIGl0c2VsZiwKICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQt cGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KICoKICogNC4gVGhlIG5h bWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKICog ICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg ZnJvbSB0aGlzCiAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNz aW9uLiBGb3Igd3JpdHRlbgogKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFj aGVAYXBhY2hlLm9yZy4KICoKICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29m dHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCiAqICAgIG5vciBtYXkgIkFwYWNo ZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgogKiAgICBw ZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogVEhJ UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1Ig SU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg VEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBESVNDTEFJTUVELiAgSU4gTk8g RVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCiAqIElUUyBD T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF TlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg KElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCiAqIFVTRSwgREFUQSwgT1IgUFJP RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKICog T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD VCBMSUFCSUxJVFksCiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09G VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBE QU1BR0UuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CiAqCiAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMg b2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CiAqIGluZGl2aWR1YWxz IG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9y ZQogKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBs ZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgogKi8KCiNpbmNsdWRlICJh cHIuaCIKI2luY2x1ZGUgImFwcl9wcml2YXRlLmgiCiNpbmNsdWRlICJhcHJfZ2VuZXJhbC5o IgojaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKI2luY2x1ZGUgInRocmVhZF9tdXRleC5oIgoj aW5jbHVkZSAiYXByX3BvcnRhYmxlLmgiCgpzdGF0aWMgYXByX3N0YXR1c190IHRocmVhZF9t dXRleF9jbGVhbnVwKHZvaWQgKmRhdGEpCnsKICAgIHJldHVybiBBUFJfRU5PVElNUEw7Cn0K CkFQUl9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXByX3RocmVhZF9tdXRleF9jcmVhdGUoYXBy X3RocmVhZF9tdXRleF90ICoqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYXByX3Bvb2xfdCAqcG9vbCkKewogICAgcmV0dXJuIEFQ Ul9FTk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkX211 dGV4X2xvY2soYXByX3RocmVhZF9tdXRleF90ICptdXRleCkKewogICAgcmV0dXJuIEFQUl9F Tk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkX211dGV4 X3RyeWxvY2soYXByX3RocmVhZF9tdXRleF90ICptdXRleCkKewogICAgcmV0dXJuIEFQUl9F Tk9USU1QTDsKfQoKQVBSX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHJfdGhyZWFkX211dGV4 X3VubG9jayhhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICByZXR1cm4gQVBSX0VO T1RJTVBMOwp9CgpBUFJfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFwcl90aHJlYWRfbXV0ZXhf ZGVzdHJveShhcHJfdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICByZXR1cm4gQVBSX0VO T1RJTVBMOwp9CgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA= --KsGdsel6WgEHnImy Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="apr_thread_mutex.patch" Index: locks/beos/Makefile.in =================================================================== RCS file: /home/cvspublic/apr/locks/beos/Makefile.in,v retrieving revision 1.12 diff -u -r1.12 Makefile.in --- locks/beos/Makefile.in 2001/06/11 11:33:33 1.12 +++ locks/beos/Makefile.in 2001/09/04 20:08:40 @@ -1,5 +1,6 @@ -TARGETS = locks.lo +TARGETS = locks.lo \ + thread_mutex.lo # bring in rules.mk for standard functionality @INCLUDE_RULES@ Index: locks/os2/Makefile.in =================================================================== RCS file: /home/cvspublic/apr/locks/os2/Makefile.in,v retrieving revision 1.12 diff -u -r1.12 Makefile.in --- locks/os2/Makefile.in 2001/01/09 11:05:57 1.12 +++ locks/os2/Makefile.in 2001/09/04 20:08:40 @@ -1,5 +1,6 @@ -TARGETS = locks.lo +TARGETS = locks.lo \ + thread_mutex.lo # bring in rules.mk for standard functionality @INCLUDE_RULES@ Index: locks/unix/Makefile.in =================================================================== RCS file: /home/cvspublic/apr/locks/unix/Makefile.in,v retrieving revision 1.18 diff -u -r1.18 Makefile.in --- locks/unix/Makefile.in 2001/01/09 11:05:59 1.18 +++ locks/unix/Makefile.in 2001/09/04 20:08:40 @@ -2,7 +2,8 @@ TARGETS = \ locks.lo \ crossproc.lo \ - intraproc.lo + intraproc.lo \ + thread_mutex.lo # bring in rules.mk for standard functionality @INCLUDE_RULES@ --KsGdsel6WgEHnImy--