Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1t41FM-00FyKa-TD for pgsql-general@arkaria.postgresql.org; Thu, 24 Oct 2024 17:03:41 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1t41FL-005fmG-7A for pgsql-general@arkaria.postgresql.org; Thu, 24 Oct 2024 17:03:39 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1t41FK-005fm1-PB for pgsql-general@lists.postgresql.org; Thu, 24 Oct 2024 17:03:39 +0000 Received: from mail-pj1-x1031.google.com ([2607:f8b0:4864:20::1031]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1t41FI-002lip-9Y for pgsql-general@lists.postgresql.org; Thu, 24 Oct 2024 17:03:38 +0000 Received: by mail-pj1-x1031.google.com with SMTP id 98e67ed59e1d1-2e34a089cd3so930060a91.3 for ; Thu, 24 Oct 2024 10:03:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1729789414; x=1730394214; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Wm4Q7uKHre/R3l5jsHYNro0LO1rIupvWToN5sMopblQ=; b=h5ktxasv4a4FmzUM4TKw9sbGQd9X4xMDtEO0MOHOfBoSNFci68v6GWC+o8EKwvKhug AyQNrwJLWmIn1gSeW6+z6ZRIb7kSDUg3RAX9X1OYHcnIu4fSUpwRum5qXw24lpTV66rq VFp9yw7T7FHOPn9jto4vUfI6rgbBeeGYnDTIzChLQuIHg03oqmL2BVIlmszIIr1HdHjw pddNGHvM3rr0yexZiDTqYbWl7YzkEs7Klw+UPD1C8w4AQdYQGjD0XipQlgGEIvT14w/3 vZSysKpsGot6sYaFUZvNKfTH+h2TmV5c3nwJj8cJDSpygeLsk2q37KLKKsd0QQ88ddJI LvvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729789414; x=1730394214; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Wm4Q7uKHre/R3l5jsHYNro0LO1rIupvWToN5sMopblQ=; b=PhsNXgTFR2iasiJBb3r+2yP8qBcpiVh38No89vNns3h7yzd3zfE+D4Q0B3cqj1154B I64VaXq2JenNuoK0GLWkr0ssffXB2ZdR/VtmOsauzoJ6wGrUxi9UbGQVsri+B0LdhgDK WG4KTz47FdG8pDwl8fVLzGW2kmkI5wZYwayd47vJWv14Tc0KD73OFX4bdi17c6LxJwrx LmFE8TGGK+cbGewWLzmfk8xRHQPgUq/unC3Ev1iTmA51jlTH3EWwHlWJGWSDQ0EXxb9y 1q4CwzxHZ1KtFQHwVVj3ZIoX3q1emBV+zSzl6bVTuaT1N8a0mmsiuTEl4UIpTeQx6JRt 7FYA== X-Forwarded-Encrypted: i=1; AJvYcCX1ckrDGC7waHt2UE7u2Mc+kdbKY2nauyYONrv5ad6NumbMtp7lnOYqiqgsVZlldoju+9iqAcjqF/zjSPml@lists.postgresql.org X-Gm-Message-State: AOJu0Yx8PppbogSGsB2FtBdKV1DupHqB3FbOvJ6t5VPhwWbwQZg1Wj9l EC07v/Kn5CBqD6GFsUvkGd4OPf3j4ck8IGCSC5rSdncaS4S8n1muuktrXPGa2ZZznP6w346I5Vf 4CSHgWZaI25louFovq0OSrHMRGKpaRsfnpKM= X-Google-Smtp-Source: AGHT+IGB5XWkmCblh8aKSePNDob2oBCCD4ntMavQylgnsQeAzVr/cMhYejbKNJb4LZi9Yks0uUM9eMzIB0oO4H/tvMc= X-Received: by 2002:a17:90b:3c47:b0:2e2:bd68:b8d8 with SMTP id 98e67ed59e1d1-2e77f3226cemr3008248a91.8.1729789413908; Thu, 24 Oct 2024 10:03:33 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Sasmit Utkarsh Date: Thu, 24 Oct 2024 22:33:22 +0530 Message-ID: Subject: Re: Assistance Required: Timeout or Buffer Overflow Issue in PostgreSQL Client Application To: Igor Korot Cc: pgsql-general , pgsql-general@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000008d8ba206253bfbaa" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000008d8ba206253bfbaa Content-Type: multipart/alternative; boundary="0000000000008d8ba106253bfba8" --0000000000008d8ba106253bfba8 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, Please find the complete stack trace, the language is C and thread here was just performing the operation of fetching records from the postgresDB using SQL_get_tpf_rw() function for which I've also attached implementation here as well Stack trace of thread 966070: #0 0x00000000f7ee1129 __kernel_vsyscall (linux-gate.so.1) #1 0x00000000f6ba23b7 __poll (libc.so.6) #2 0x00000000f792e5b5 __interceptor_poll (libasan.so.8) #3 0x00000000f72b30a8 pqSocketCheck (libpq.so.5) #4 0x00000000f72b3864 pqWaitTimed (libpq.so.5) #5 0x00000000f72b38d2 pqWait (libpq.so.5) #6 0x00000000f72aff03 PQgetResult (libpq.so.5) #7 0x00000000f72b036a PQexecFinish (libpq.so.5) #8 0x0000000008106dd4 checkLOCK (server) #9 0x000000000811d871 SQL_get_tpf_rw (server) #10 0x0000000008180269 get_tpf_rw (server) #11 0x0000000008189e47 FINDC (server) #12 0x000000000818cd20 FINWC (server) #13 0x00000000f2d03778 _segKIP8 (kip8.so) #14 0x000000000816ad0e call_segment (server) #15 0x000000000816ba0b ENTRC (server) #16 0x00000000f2d096ee _segKIP5 (kip5.so) #17 0x000000000816ad0e call_segment (server) #18 0x000000000816ba0b ENTRC (server) #19 0x00000000f2d1722d _segKIP4 (kip4.so) #20 0x000000000816ad0e call_segment (server) #21 0x000000000816ba0b ENTRC (server) #22 0x00000000f2d1dee1 _segKIPB (kipb.so) #23 0x000000000816ad0e call_segment (server) #24 0x000000000816c454 ENTNC (server) #25 0x00000000f2d2be54 _segKIP9 (kip9.so) #26 0x000000000816ad0e call_segment (server) #27 0x00000000081c264d call_appl_entry (server) #28 0x000000000807f227 extest (server) #29 0x000000000808923f handle_COMMS_TYPE_FUNCTIONAL_MESSAGE (server) #30 0x000000000808d849 handle_comms_message (server) #31 0x00000000f77d6e41 worker (libuv.so.1) #32 0x00000000f78ff67a _ZL17asan_thread_startPv (libasan.so.8) #33 0x00000000f6b170ad start_thread (libc.so.6) #34 0x00000000f6bb1dea __clone (libc.so.6) Regards, Sasmit Utkarsh +91-7674022625 On Thu, Oct 24, 2024 at 9:47=E2=80=AFPM Igor Korot wro= te: > Hi, > Is this a complete backtrace? > Can you post a complete backtrace? We need to see if there is a reference > to your application code? > > What language is it written in? > What operation this thread was performing? > > Thank you. > > On Thu, Oct 24, 2024 at 11:12=E2=80=AFAM Sasmit Utkarsh > wrote: > > > > Dear PostgreSQL Community Team, > > > > I hope this message finds you well. I am reaching out for assistance > with an issue encountered in our application, which communicates with > PostgreSQL using the libpq client library. > > > > Issue Details: > > We have observed a problem where one of the application's threads gets > stuck during a database operation. Below is a stack trace of the affected > thread: > > > > Application Logs: > > Oct 23 10:08:44.806235 cucmtpccu1 shc-server@2.service[966034]: > 0966070{ef5f81a7-d35b-4604-953d-a35665e505b7.010000}KIP8-SQL_get_tpf_rw()= -SQL > read data from File Address before lock fa(-1810606079) fa(94145801) fa2 > htonl(22549652) > > Oct 23 10:08:44.806235 cucmtpccu1 shc-server@2.service[966034]: > 0966070{ef5f81a7-d35b-4604-953d-a35665e505b7.010000}KIP8-SQL_get_tpf_rw() > SelectDataCommand =3D CALL SQL_select_data_procedure($1, $2, NULL, NULL) > hold(0) fa(-1810606079) > > Oct 23 10:08:44.807814 cucmtpccu1 shc-server@2.service[966034]: *** > buffer overflow detected ***: terminated > > > > Stack Trace of Thread 966070: > > #0 0x00000000f7ee1129 __kernel_vsyscall (linux-gate.so.1) > > #1 0x00000000f6ba23b7 __poll (libc.so.6) > > #2 0x00000000f792e5b5 __interceptor_poll (libasan.so.8) > > #3 0x00000000f72b30a8 pqSocketCheck (libpq.so.5) > > #4 0x00000000f72b3864 pqWaitTimed (libpq.so.5) > > #5 0x00000000f72b38d2 pqWait (libpq.so.5) > > #6 0x00000000f72aff03 PQgetResult (libpq.so.5) > > #7 0x00000000f72b036a PQexecFinish (libpq.so.5) > > #8 0x0000000008106dd4 checkLOCK (server) > > #9 0x000000000811d871 SQL_get_tpf_rw (server) > > ... > > > > The stack trace shows that the thread is stuck in a poll operation whil= e > waiting for socket activity within the PostgreSQL client library (libpq). > We suspect this could be related to a network timeout or issue. However, > the application logs indicate a buffer overflow before the crash, which > raises questions about whether these are related. > > > > Questions: > > -Could the buffer overflow be causing the crash, and if so, how is it > related to the socket activity? > > -Are there specific configurations or checks we should perform to > diagnose this issue further? > > -Any suggestions for possible solutions to resolve this problem? > > > > For additional context, I've verified that the specified record does > exist in the database, and I am also attaching the implementation details > for the checkLOCK function corresponding to the stack trace. > > > > Please let me know if you need any more details > > > > Your assistance with troubleshooting this would be highly appreciated. > > > > Regards, > > Sasmit Utkarsh > > +91-7674022625 > --0000000000008d8ba106253bfba8 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+SGksPGRpdj48YnI+PC9kaXY+PGRpdj5QbGVhc2UgZmluZMKgdGhlIGNv bXBsZXRlIHN0YWNrIHRyYWNlLCB0aGUgbGFuZ3VhZ2UgaXMgQyBhbmQgdGhyZWFkIGhlcmUgd2Fz IGp1c3QgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uIG9mIGZldGNoaW5nIHJlY29yZHMgZnJvbSB0 aGUgcG9zdGdyZXNEQiB1c2luZyBTUUxfZ2V0X3RwZl9ydygpIGZ1bmN0aW9uIGZvciB3aGljaCBJ JiMzOTt2ZSBhbHNvIGF0dGFjaGVkIGltcGxlbWVudGF0aW9uIGhlcmUgYXMgd2VsbDwvZGl2Pjxk aXY+PGJyPjwvZGl2PjxkaXY+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjowaW47 Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48c3BhbiBsYW5n PSJFTi1JTiI+U3RhY2sgdHJhY2UNCm9mIHRocmVhZCA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDp5 ZWxsb3ciPjk2NjA3MDwvc3Bhbj46PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIg c3R5bGU9Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5z LXNlcmlmIj48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMMKgIDB4MDAwMDAwMDBmN2VlMTEy OSBfX2tlcm5lbF92c3lzY2FsbCAobGludXgtZ2F0ZS5zby4xKTwvc3Bhbj48L3A+DQoNCjxwIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFt aWx5OkNhbGlicmksc2Fucy1zZXJpZiI+PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzHCoCAw eDAwMDAwMDAwZjZiYTIzYjcgX19wb2xsIChsaWJjLnNvLjYpPC9zcGFuPjwvcD4NCg0KPHAgY2xh c3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1p bHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMsKgIDB4 MDAwMDAwMDBmNzkyZTViNSBfX2ludGVyY2VwdG9yX3BvbGwgKGxpYmFzYW4uc28uOCk8L3NwYW4+ PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOjBpbjtmb250LXNpemU6 MTFwdDtmb250LWZhbWlseTpDYWxpYnJpLHNhbnMtc2VyaWYiPjxzcGFuIGxhbmc9IkVOLUlOIj7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqANCiMzwqAgMHgwMDAwMDAwMGY3MmIzMGE4IHBxU29ja2V0Q2hlY2sgKGxpYnBxLnNvLjUp PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjowaW47Zm9u dC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48c3BhbiBsYW5nPSJF Ti1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgDQojNMKgIDB4MDAwMDAwMDBmNzJiMzg2NCBwcVdhaXRUaW1lZCAobGlicHEu c28uNSk8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOjBp bjtmb250LXNpemU6MTFwdDtmb250LWZhbWlseTpDYWxpYnJpLHNhbnMtc2VyaWYiPjxzcGFuIGxh bmc9IkVOLUlOIj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqANCiM1wqAgMHgwMDAwMDAwMGY3MmIzOGQyIHBxV2FpdCAobGlicHEu c28uNSk8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOjBp bjtmb250LXNpemU6MTFwdDtmb250LWZhbWlseTpDYWxpYnJpLHNhbnMtc2VyaWYiPjxzcGFuIGxh bmc9IkVOLUlOIj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqANCiM2wqAgMHgwMDAwMDAwMGY3MmFmZjAzIFBRZ2V0UmVzdWx0IChs aWJwcS5zby41KTwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJn aW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFtaWx5OkNhbGlicmksc2Fucy1zZXJpZiI+PHNw YW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzfCoCAweDAwMDAwMDAwZjcyYjAzNmEgUFFleGVjRmlu aXNoIChsaWJwcS5zby41KTwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxl PSJtYXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFtaWx5OkNhbGlicmksc2Fucy1zZXJp ZiI+PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzjCoCAweDAwMDAwMDAwMDgxMDZkZDQgY2hl Y2tMT0NLIChzZXJ2ZXIpPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlm Ij48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojOcKgIDB4MDAwMDAwMDAwODExZDg3MSBTUUxf Z2V0X3RwZl9ydyAoc2VydmVyKTwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJtYXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFtaWx5OkNhbGlicmksc2Fucy1z ZXJpZiI+PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzEwIDB4MDAwMDAwMDAwODE4MDI2OSBn ZXRfdHBmX3J3IChzZXJ2ZXIpPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5 bGU9Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNl cmlmIj48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMTEgMHgwMDAwMDAwMDA4MTg5ZTQ3IEZJ TkRDIChzZXJ2ZXIpPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1h cmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48 c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMTIgMHgwMDAwMDAwMDA4MThjZDIwIEZJTldDIChz ZXJ2ZXIpPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjow aW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48c3BhbiBs YW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgDQojMTMgMHgwMDAwMDAwMGYyZDAzNzc4IF88c3BhbiBzdHlsZT0i YmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcG9zaXRpb246aW5pdGlhbDtiYWNr Z3JvdW5kLXNpemU6aW5pdGlhbDtiYWNrZ3JvdW5kLXJlcGVhdDppbml0aWFsO2JhY2tncm91bmQt b3JpZ2luOmluaXRpYWw7YmFja2dyb3VuZC1jbGlwOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjpy Z2IoMjQzLDI0MywyNDMpIj5zZWdLSVA4PC9zcGFuPg0KKGtpcDguc28pPC9zcGFuPjwvcD4NCg0K PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9u dC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQoj MTQgMHgwMDAwMDAwMDA4MTZhZDBlIGNhbGxfc2VnbWVudCAoc2VydmVyKTwvc3Bhbj48L3A+DQoN CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2Zv bnQtZmFtaWx5OkNhbGlicmksc2Fucy1zZXJpZiI+PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0K IzE1IDB4MDAwMDAwMDAwODE2YmEwYiBFTlRSQyAoc2VydmVyKTwvc3Bhbj48L3A+DQoNCjxwIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFt aWx5OkNhbGlicmksc2Fucy1zZXJpZiI+PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzE2IDB4 MDAwMDAwMDBmMmQwOTZlZSBfc2VnS0lQNSAoa2lwNS5zbyk8L3NwYW4+PC9wPg0KDQo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOjBpbjtmb250LXNpemU6MTFwdDtmb250LWZhbWls eTpDYWxpYnJpLHNhbnMtc2VyaWYiPjxzcGFuIGxhbmc9IkVOLUlOIj7CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqANCiMxNyAweDAw MDAwMDAwMDgxNmFkMGUgY2FsbF9zZWdtZW50IChzZXJ2ZXIpPC9zcGFuPjwvcD4NCg0KPHAgY2xh c3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1p bHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMTggMHgw MDAwMDAwMDA4MTZiYTBiIEVOVFJDIChzZXJ2ZXIpPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1z b05vcm1hbCIgc3R5bGU9Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2Fs aWJyaSxzYW5zLXNlcmlmIj48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMTkgMHgwMDAwMDAw MGYyZDE3MjJkIF9zZWdLSVA0IChraXA0LnNvKTwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJtYXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFtaWx5OkNhbGli cmksc2Fucy1zZXJpZiI+PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzIwIDB4MDAwMDAwMDAw ODE2YWQwZSBjYWxsX3NlZ21lbnQgKHNlcnZlcik8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNv Tm9ybWFsIiBzdHlsZT0ibWFyZ2luOjBpbjtmb250LXNpemU6MTFwdDtmb250LWZhbWlseTpDYWxp YnJpLHNhbnMtc2VyaWYiPjxzcGFuIGxhbmc9IkVOLUlOIj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqANCiMyMSAweDAwMDAwMDAw MDgxNmJhMGIgRU5UUkMgKHNlcnZlcik8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFs IiBzdHlsZT0ibWFyZ2luOjBpbjtmb250LXNpemU6MTFwdDtmb250LWZhbWlseTpDYWxpYnJpLHNh bnMtc2VyaWYiPjxzcGFuIGxhbmc9IkVOLUlOIj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqANCiMyMiAweDAwMDAwMDAwZjJkMWRl ZTEgX3NlZ0tJUEIgKGtpcGIuc28pPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIg c3R5bGU9Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5z LXNlcmlmIj48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMjMgMHgwMDAwMDAwMDA4MTZhZDBl IGNhbGxfc2VnbWVudCAoc2VydmVyKTwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwi IHN0eWxlPSJtYXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFtaWx5OkNhbGlicmksc2Fu cy1zZXJpZiI+PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzI0IDB4MDAwMDAwMDAwODE2YzQ1 NCBFTlROQyAoc2VydmVyKTwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxl PSJtYXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFtaWx5OkNhbGlicmksc2Fucy1zZXJp ZiI+PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzI1IDB4MDAwMDAwMDBmMmQyYmU1NCBfc2Vn S0lQOSAoa2lwOS5zbyk8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luOjBpbjtmb250LXNpemU6MTFwdDtmb250LWZhbWlseTpDYWxpYnJpLHNhbnMtc2VyaWYi PjxzcGFuIGxhbmc9IkVOLUlOIj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqANCiMyNiAweDAwMDAwMDAwMDgxNmFkMGUgY2FsbF9z ZWdtZW50IChzZXJ2ZXIpPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlm Ij48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMjcgMHgwMDAwMDAwMDA4MWMyNjRkIGNhbGxf YXBwbF9lbnRyeSAoc2VydmVyKTwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJtYXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFtaWx5OkNhbGlicmksc2Fucy1z ZXJpZiI+PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzI4IDB4MDAwMDAwMDAwODA3ZjIyNyBl eHRlc3QgKHNlcnZlcik8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luOjBpbjtmb250LXNpemU6MTFwdDtmb250LWZhbWlseTpDYWxpYnJpLHNhbnMtc2VyaWYi PjxzcGFuIGxhbmc9IkVOLUlOIj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqANCiMyOSAweDAwMDAwMDAwMDgwODkyM2YgaGFuZGxl X0NPTU1TX1RZUEVfRlVOQ1RJT05BTF9NRVNTQUdFIChzZXJ2ZXIpPC9zcGFuPjwvcD4NCg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1m YW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48c3BhbiBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMzAg MHgwMDAwMDAwMDA4MDhkODQ5IGhhbmRsZV9jb21tc19tZXNzYWdlIChzZXJ2ZXIpPC9zcGFuPjwv cD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjowaW47Zm9udC1zaXplOjEx cHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48c3BhbiBsYW5nPSJFTi1JTiI+wqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgDQojMzEgMHgwMDAwMDAwMGY3N2Q2ZTQxIHdvcmtlciAobGlidXYuc28uMSk8L3NwYW4+PC9w Pg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOjBpbjtmb250LXNpemU6MTFw dDtmb250LWZhbWlseTpDYWxpYnJpLHNhbnMtc2VyaWYiPjxzcGFuIGxhbmc9IkVOLUlOIj7CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqANCiMzMiAweDAwMDAwMDAwZjc4ZmY2N2EgX1pMMTdhc2FuX3RocmVhZF9zdGFydFB2IChsaWJh c2FuLnNvLjgpPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdp bjowaW47Zm9udC1zaXplOjExcHQ7Zm9udC1mYW1pbHk6Q2FsaWJyaSxzYW5zLXNlcmlmIj48c3Bh biBsYW5nPSJFTi1JTiI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgDQojMzMgMHgwMDAwMDAwMGY2YjE3MGFkIHN0YXJ0X3RocmVh ZCAobGliYy5zby42KTwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJt YXJnaW46MGluO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtZmFtaWx5OkNhbGlicmksc2Fucy1zZXJpZiI+ PHNwYW4gbGFuZz0iRU4tSU4iPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoA0KIzM0IDB4MDAwMDAwMDBmNmJiMWRlYSBfX2Nsb25l IChsaWJjLnNvLjYpPC9zcGFuPjwvcD48ZGl2PjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9z aWduYXR1cmUiIGRhdGEtc21hcnRtYWlsPSJnbWFpbF9zaWduYXR1cmUiPjxkaXYgZGlyPSJsdHIi PjxkaXY+UmVnYXJkcyw8YnI+PC9kaXY+PGRpdj5TYXNtaXQgVXRrYXJzaDwvZGl2PjxkaXY+Kzkx LTc2NzQwMjI2MjU8L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48YnI+PC9kaXY+PC9kaXY+PGJyPjxk aXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+ T24gVGh1LCBPY3QgMjQsIDIwMjQgYXQgOTo0N+KAr1BNIElnb3IgS29yb3QgJmx0OzxhIGhyZWY9 Im1haWx0bzppa29yb3QwMUBnbWFpbC5jb20iPmlrb3JvdDAxQGdtYWlsLmNvbTwvYT4mZ3Q7IHdy b3RlOjxicj48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJn aW46MHB4IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYigyMDQsMjA0LDIw NCk7cGFkZGluZy1sZWZ0OjFleCI+SGksPGJyPg0KSXMgdGhpcyBhIGNvbXBsZXRlIGJhY2t0cmFj ZT88YnI+DQpDYW4geW91IHBvc3QgYSBjb21wbGV0ZSBiYWNrdHJhY2U/IFdlIG5lZWQgdG8gc2Vl IGlmIHRoZXJlIGlzIGEgcmVmZXJlbmNlPGJyPg0KdG8geW91ciBhcHBsaWNhdGlvbiBjb2RlPzxi cj4NCjxicj4NCldoYXQgbGFuZ3VhZ2UgaXMgaXQgd3JpdHRlbiBpbj88YnI+DQpXaGF0IG9wZXJh dGlvbiB0aGlzIHRocmVhZCB3YXMgcGVyZm9ybWluZz88YnI+DQo8YnI+DQpUaGFuayB5b3UuPGJy Pg0KPGJyPg0KT24gVGh1LCBPY3QgMjQsIDIwMjQgYXQgMTE6MTLigK9BTSBTYXNtaXQgVXRrYXJz aCAmbHQ7PGEgaHJlZj0ibWFpbHRvOnV0a2Fyc2hzYXNtaXRAZ21haWwuY29tIiB0YXJnZXQ9Il9i bGFuayI+dXRrYXJzaHNhc21pdEBnbWFpbC5jb208L2E+Jmd0OyB3cm90ZTo8YnI+DQomZ3Q7PGJy Pg0KJmd0OyBEZWFyIFBvc3RncmVTUUwgQ29tbXVuaXR5IFRlYW0sPGJyPg0KJmd0Ozxicj4NCiZn dDsgSSBob3BlIHRoaXMgbWVzc2FnZSBmaW5kcyB5b3Ugd2VsbC4gSSBhbSByZWFjaGluZyBvdXQg Zm9yIGFzc2lzdGFuY2Ugd2l0aCBhbiBpc3N1ZSBlbmNvdW50ZXJlZCBpbiBvdXIgYXBwbGljYXRp b24sIHdoaWNoIGNvbW11bmljYXRlcyB3aXRoIFBvc3RncmVTUUwgdXNpbmcgdGhlIGxpYnBxIGNs aWVudCBsaWJyYXJ5Ljxicj4NCiZndDs8YnI+DQomZ3Q7IElzc3VlIERldGFpbHM6PGJyPg0KJmd0 OyBXZSBoYXZlIG9ic2VydmVkIGEgcHJvYmxlbSB3aGVyZSBvbmUgb2YgdGhlIGFwcGxpY2F0aW9u JiMzOTtzIHRocmVhZHMgZ2V0cyBzdHVjayBkdXJpbmcgYSBkYXRhYmFzZSBvcGVyYXRpb24uIEJl bG93IGlzIGEgc3RhY2sgdHJhY2Ugb2YgdGhlIGFmZmVjdGVkIHRocmVhZDo8YnI+DQomZ3Q7PGJy Pg0KJmd0OyBBcHBsaWNhdGlvbiBMb2dzOjxicj4NCiZndDsgT2N0IDIzIDEwOjA4OjQ0LjgwNjIz NSBjdWNtdHBjY3UxIHNoYy1zZXJ2ZXJAMi5zZXJ2aWNlWzk2NjAzNF06IDA5NjYwNzB7ZWY1Zjgx YTctZDM1Yi00NjA0LTk1M2QtYTM1NjY1ZTUwNWI3LjAxMDAwMH1LSVA4LVNRTF9nZXRfdHBmX3J3 KCktU1FMIHJlYWQgZGF0YSBmcm9tIEZpbGUgQWRkcmVzcyBiZWZvcmUgbG9jayBmYSgtMTgxMDYw NjA3OSkgZmEoOTQxNDU4MDEpIGZhMiBodG9ubCgyMjU0OTY1Mik8YnI+DQomZ3Q7IE9jdCAyMyAx MDowODo0NC44MDYyMzUgY3VjbXRwY2N1MSBzaGMtc2VydmVyQDIuc2VydmljZVs5NjYwMzRdOiAw OTY2MDcwe2VmNWY4MWE3LWQzNWItNDYwNC05NTNkLWEzNTY2NWU1MDViNy4wMTAwMDB9S0lQOC1T UUxfZ2V0X3RwZl9ydygpIFNlbGVjdERhdGFDb21tYW5kID0gQ0FMTCBTUUxfc2VsZWN0X2RhdGFf cHJvY2VkdXJlKCQxLCAkMiwgTlVMTCwgTlVMTCkgaG9sZCgwKSBmYSgtMTgxMDYwNjA3OSk8YnI+ DQomZ3Q7IE9jdCAyMyAxMDowODo0NC44MDc4MTQgY3VjbXRwY2N1MSBzaGMtc2VydmVyQDIuc2Vy dmljZVs5NjYwMzRdOiAqKiogYnVmZmVyIG92ZXJmbG93IGRldGVjdGVkICoqKjogdGVybWluYXRl ZDxicj4NCiZndDs8YnI+DQomZ3Q7IFN0YWNrIFRyYWNlIG9mIFRocmVhZCA5NjYwNzA6PGJyPg0K Jmd0OyAjMMKgIDB4MDAwMDAwMDBmN2VlMTEyOSBfX2tlcm5lbF92c3lzY2FsbCAobGludXgtZ2F0 ZS5zby4xKTxicj4NCiZndDsgIzHCoCAweDAwMDAwMDAwZjZiYTIzYjcgX19wb2xsIChsaWJjLnNv LjYpPGJyPg0KJmd0OyAjMsKgIDB4MDAwMDAwMDBmNzkyZTViNSBfX2ludGVyY2VwdG9yX3BvbGwg KGxpYmFzYW4uc28uOCk8YnI+DQomZ3Q7ICMzwqAgMHgwMDAwMDAwMGY3MmIzMGE4IHBxU29ja2V0 Q2hlY2sgKGxpYnBxLnNvLjUpPGJyPg0KJmd0OyAjNMKgIDB4MDAwMDAwMDBmNzJiMzg2NCBwcVdh aXRUaW1lZCAobGlicHEuc28uNSk8YnI+DQomZ3Q7ICM1wqAgMHgwMDAwMDAwMGY3MmIzOGQyIHBx V2FpdCAobGlicHEuc28uNSk8YnI+DQomZ3Q7ICM2wqAgMHgwMDAwMDAwMGY3MmFmZjAzIFBRZ2V0 UmVzdWx0IChsaWJwcS5zby41KTxicj4NCiZndDsgIzfCoCAweDAwMDAwMDAwZjcyYjAzNmEgUFFl eGVjRmluaXNoIChsaWJwcS5zby41KTxicj4NCiZndDsgIzjCoCAweDAwMDAwMDAwMDgxMDZkZDQg Y2hlY2tMT0NLIChzZXJ2ZXIpPGJyPg0KJmd0OyAjOcKgIDB4MDAwMDAwMDAwODExZDg3MSBTUUxf Z2V0X3RwZl9ydyAoc2VydmVyKTxicj4NCiZndDsgLi4uPGJyPg0KJmd0Ozxicj4NCiZndDsgVGhl IHN0YWNrIHRyYWNlIHNob3dzIHRoYXQgdGhlIHRocmVhZCBpcyBzdHVjayBpbiBhIHBvbGwgb3Bl cmF0aW9uIHdoaWxlIHdhaXRpbmcgZm9yIHNvY2tldCBhY3Rpdml0eSB3aXRoaW4gdGhlIFBvc3Rn cmVTUUwgY2xpZW50IGxpYnJhcnkgKGxpYnBxKS4gV2Ugc3VzcGVjdCB0aGlzIGNvdWxkIGJlIHJl bGF0ZWQgdG8gYSBuZXR3b3JrIHRpbWVvdXQgb3IgaXNzdWUuIEhvd2V2ZXIsIHRoZSBhcHBsaWNh dGlvbiBsb2dzIGluZGljYXRlIGEgYnVmZmVyIG92ZXJmbG93IGJlZm9yZSB0aGUgY3Jhc2gsIHdo aWNoIHJhaXNlcyBxdWVzdGlvbnMgYWJvdXQgd2hldGhlciB0aGVzZSBhcmUgcmVsYXRlZC48YnI+ DQomZ3Q7PGJyPg0KJmd0OyBRdWVzdGlvbnM6PGJyPg0KJmd0OyAtQ291bGQgdGhlIGJ1ZmZlciBv dmVyZmxvdyBiZSBjYXVzaW5nIHRoZSBjcmFzaCwgYW5kIGlmIHNvLCBob3cgaXMgaXQgcmVsYXRl ZCB0byB0aGUgc29ja2V0IGFjdGl2aXR5Pzxicj4NCiZndDsgLUFyZSB0aGVyZSBzcGVjaWZpYyBj b25maWd1cmF0aW9ucyBvciBjaGVja3Mgd2Ugc2hvdWxkIHBlcmZvcm0gdG8gZGlhZ25vc2UgdGhp cyBpc3N1ZSBmdXJ0aGVyPzxicj4NCiZndDsgLUFueSBzdWdnZXN0aW9ucyBmb3IgcG9zc2libGUg c29sdXRpb25zIHRvIHJlc29sdmUgdGhpcyBwcm9ibGVtPzxicj4NCiZndDs8YnI+DQomZ3Q7IEZv ciBhZGRpdGlvbmFsIGNvbnRleHQsIEkmIzM5O3ZlIHZlcmlmaWVkIHRoYXQgdGhlIHNwZWNpZmll ZCByZWNvcmQgZG9lcyBleGlzdCBpbiB0aGUgZGF0YWJhc2UsIGFuZCBJIGFtIGFsc28gYXR0YWNo aW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciB0aGUgY2hlY2tMT0NLIGZ1bmN0aW9u IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YWNrIHRyYWNlLjxicj4NCiZndDs8YnI+DQomZ3Q7IFBs ZWFzZSBsZXQgbWUga25vdyBpZiB5b3UgbmVlZCBhbnkgbW9yZSBkZXRhaWxzPGJyPg0KJmd0Ozxi cj4NCiZndDsgWW91ciBhc3Npc3RhbmNlIHdpdGggdHJvdWJsZXNob290aW5nIHRoaXMgd291bGQg YmUgaGlnaGx5IGFwcHJlY2lhdGVkLjxicj4NCiZndDs8YnI+DQomZ3Q7IFJlZ2FyZHMsPGJyPg0K Jmd0OyBTYXNtaXQgVXRrYXJzaDxicj4NCiZndDsgKzkxLTc2NzQwMjI2MjU8YnI+DQo8L2Jsb2Nr cXVvdGU+PC9kaXY+DQo= --0000000000008d8ba106253bfba8-- --0000000000008d8ba206253bfbaa Content-Type: text/plain; charset="US-ASCII"; name="SQL_get_tpf_rw_implementation.txt" Content-Disposition: attachment; filename="SQL_get_tpf_rw_implementation.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m2njxb5n0 aW50IGdldF90cGZfcncoIGludDMyX3QgZmEsIHVuc2lnbmVkIGNoYXIgKipjb3JlX2Jsaywgc2l6 ZV90ICpzdF9zaXplLCB1bnNpZ25lZCBjaGFyICpiaWQsIHVuc2lnbmVkIGNoYXIgKnJjYywgaW50 ICpmZCwgYm9vbCBob2xkLCB1bnNpZ25lZCBjaGFyICoqbW1hcF9wdHIpDQp7DQogIGlmKHNxbF9k YiA9PSAxKS8vICB7DQogICAgIHJldHVybiBTUUxfZ2V0X3RwZl9ydyhmYSwgY29yZV9ibGssIHN0 X3NpemUsIGJpZCwgcmNjLCBmZCwgaG9sZCwgbW1hcF9wdHIgKTsNCiAgLy8gfSAgZWxzZSAvL2lm KHNxbF9kYiA9PSAwKQ0KICByZXR1cm4gRklMRV9nZXRfdHBmX3J3KGZhLCBjb3JlX2Jsaywgc3Rf c2l6ZSwgYmlkLCByY2MsIGZkLCBob2xkLCBtbWFwX3B0ciApOw0KfQ0KDQppbnQgU1FMX2dldF90 cGZfcncoIGludDMyX3QgZmEsIHVuc2lnbmVkIGNoYXIgKipjb3JlX2Jsaywgc2l6ZV90ICpzdF9z aXplLCB1bnNpZ25lZCBjaGFyICpiaWQsIHVuc2lnbmVkIGNoYXIgKnJjYywgaW50ICpmZCwgYm9v bCBob2xkLCB1bnNpZ25lZCBjaGFyICoqbW1hcF9wdHIpDQp7DQpjaGFyICpwOw0KY2hhciAqYzsN CmludCByYzsNCnN0cnVjdCBzdGF0IHN0YXRidWY7DQoNClBHcmVzdWx0ICpyZXM9TlVMTDsNCnVp bnQzMl90IGZhMiA9IGh0b25sKGZhKTsNCmNoYXIgKmZhX3ZhbCA9IChjaGFyICopJmZhMjsNCmJv b2wgaG9sZDIgPSBob2xkOw0KY2hhciAqaG9sZF92YWwgPSAoY2hhciAqKSZob2xkMjsNCg0KDQpj b25zdCBjaGFyICpwYXJhbVZhbHVlc1syXSAgCT0ge2ZhX3ZhbCwgaG9sZF92YWx9Ow0KaW50ICAg cGFyYW1MZW5ndGhzWzJdICAgICAgIAk9IHtzaXplb2YoZmEyKSwgc2l6ZW9mKGhvbGQyKX07DQpp bnQgICBwYXJhbUZvcm1hdHNbMl0gICAgICAgCT0gezEsIDF9OyAgICAgICAvLyBpZGVudGlmeSBw YXJhbWV0ZXIgYXMgYmluYXJ5DQoNCmlmKFNRTF92c24xMCkgew0KCXBhcmFtVmFsdWVzWzBdICAJ PSBmYV92YWw7DQoJcGFyYW1WYWx1ZXNbMV0gIAk9IE5VTEw7IA0KCXBhcmFtTGVuZ3Roc1swXSAg ICAgICAJPSBzaXplb2YoZmEyKTsNCglwYXJhbUxlbmd0aHNbMV0gICAgICAgCT0gMDsgDQoJcGFy YW1Gb3JtYXRzWzBdICAgICAgIAk9IDE7ICANCglwYXJhbUZvcm1hdHNbMV0gICAgICAgCT0gMDsg DQp9DQovKioNCmlmKHNoYWRvd1NRTF92c24xMCkgew0KICAgICAgICBwYXJhbVZhbHVlc1swXSAg ICAgICAgICA9IGZhX3ZhbDsNCiAgICAgICAgcGFyYW1WYWx1ZXNbMV0gICAgICAgICAgPSBOVUxM Ow0KICAgICAgICBwYXJhbUxlbmd0aHNbMF0gICAgICAgICA9IHNpemVvZihmYTIpOw0KICAgICAg ICBwYXJhbUxlbmd0aHNbMV0gICAgICAgICA9IDA7DQogICAgICAgIHBhcmFtRm9ybWF0c1swXSAg ICAgICAgID0gMTsNCiAgICAgICAgcGFyYW1Gb3JtYXRzWzFdICAgICAgICAgPSAwOw0KfQ0KKiov DQppbnQgICByZXN1bHRGb3JtYXQgICAgICAgICAgCT0gMTsJCS8vIGJpbmFyeSANCmludCAgIG5G aWVsZHMgPSAwOw0KaW50ICAgblR1cGxlcyA9IDA7DQppbnQgICBibGtfc2l6ZSA9IDA7DQpjaGFy ICpibGtfc2l6ZV92YWw7DQpjaGFyICpkYXRhX3ZhbDsNCg0KCWlmKGJpZCkNCgl7DQoJCUxPR19U UkFDRSgiJXMoKSBTUUwgcmVhZCBkYXRhIGZyb20gRmlsZSBBZGRyZXNzIGZhKCVpKSBmYSglMDhY KSBmYTIgaHRvbmwoJWkpIGJpZCAoJTAyWCUwMlgpIixfX2Z1bmNfXyxmYSxmYSxmYTIsKmJpZCwq KGJpZCsxKSk7DQoJfQ0KCWVsc2UNCgl7DQoJCUxPR19UUkFDRSgiJXMoKSBTUUwgcmVhZCBkYXRh IGZyb20gRmlsZSBBZGRyZXNzIGZhKCVpKSBmYSglMDhYKSBmYTIgaHRvbmwoJWkpIGJpZCAoMCki LF9fZnVuY19fLGZhLGZhLGZhMik7DQoJfQ0KDQogICAgICAgIExPR19ERUJVRygiJXMoKS1TUUwg cmVhZCBkYXRhIGZyb20gRmlsZSBBZGRyZXNzIGJlZm9yZSBsb2NrIGZhKCVpKSBmYSglMDhYKSBm YTIgaHRvbmwoJWkpIixfX2Z1bmNfXyxmYSxmYSxmYTIpOyANCg0KCS8vTE9HX0RFQlVHKCIlcygp IENBTEwgU1FMX3NlbGVjdF9kYXRhX3Byb2NlZHVyZTEoJWksICVpLCBOVUxMKTsiLF9fZnVuY19f LGZhMixob2xkMik7DQogICAgICAgIC8vTE9HX0RFQlVHKCIlcygpIFNFTEVDVCBkYXRhIEZST00g ZnNfZGF0YSBXSEVSRSBmaWxlX2FkZHJlc3MgPSAlaSIsIlNRTF9zZWxlY3RfZGF0YV9wcm9jZWR1 cmUxIixmYTIpOw0KDQogICAgICAgIGJvb2wgaXNfZGF0YV9mb3VuZCA9IGZhbHNlOw0KICAgICAg ICBpZihpc19zaGFkb3dfZGIpDQogICAgICAgIHsNCiAgICAgICAgICAgIExPR19ERUJVRygiJXMo KSBzaGFkb3dTZWxlY3REYXRhQ29tbWFuZCA9ICVzIGhvbGQoJWkpIGZhKCVpKSIsX19mdW5jX18s c2hhZG93U2VsZWN0RGF0YUNvbW1hbmQsaG9sZCxmYSk7DQogICAgICAgICAgICBMT0dfREVCVUco IiVzKCkgc2hhZG93U2VsZWN0RGF0YU5QYXJhbXMgPSAlaSIsX19mdW5jX18sc2hhZG93U2VsZWN0 RGF0YU5QYXJhbXMpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KCSAgICBM T0dfREVCVUcoIiVzKCkgU2VsZWN0RGF0YUNvbW1hbmQgPSAlcyBob2xkKCVpKSBmYSglaSkiLF9f ZnVuY19fLFNlbGVjdERhdGFDb21tYW5kLGhvbGQsZmEpOw0KCSAgICBMT0dfREVCVUcoIiVzKCkg U2VsZWN0RGF0YU5QYXJhbXMgPSAlaSIsX19mdW5jX18sU2VsZWN0RGF0YU5QYXJhbXMpOw0KICAg ICAgICB9DQoJY2hlY2tMT0NLKGZhKTsNCglpZihpc19zaGFkb3dfZGIpIA0KCXsNCgkJcmVzID0g UFFleGVjUHJlcGFyZWQoc2hhZG93X2RiX2Nvbm4sDQoJCQkJICAgICBzaGFkb3dTZWxlY3REYXRh TmFtZSwNCgkJCQkgICAgIHNoYWRvd1NlbGVjdERhdGFOUGFyYW1zLA0KCQkJCSAgICAgcGFyYW1W YWx1ZXMsDQoJCQkJICAgICBwYXJhbUxlbmd0aHMsDQoJCQkJICAgICBwYXJhbUZvcm1hdHMsDQoJ CQkJICAgICByZXN1bHRGb3JtYXQpOw0KICAgICAgICAgICAgICAgIExPR19ERUJVRygiJXMoKS0g Y2hlY2sgbm93IGluIHNoYWRvdyBkYiBmb3IgZmEoJWkpIGZhKCUwOFgpIFBRcmVzdWx0U3RhdHVz KHJlcyk6JXMiLF9fZnVuY19fLGZhLGZhLFBRcmVzU3RhdHVzKFBRcmVzdWx0U3RhdHVzKHJlcykp KTsNCiAgICAgICAgICAgICAgICBpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSA9PSBQR1JFU19UVVBM RVNfT0spDQoJCXsNCiAgICAgICAgICAgICAgICAgICAgblR1cGxlcyA9IFBRbnR1cGxlcyhyZXMp OyAgICAgICAvLyBudW1iZXIgb2Ygcm93cw0KDQogICAgICAgICAgICAgICAgICAgIGlmKG5UdXBs ZXMgPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICBM T0dfREVCVUcoImZhKCVpKSBmYSglMDhYKSBjb3VsZCBub3QgYmUgcmV0cmlldmVkIGZyb20gU2hh ZG93IERCIHNvIGxvb2sgaW50byBiYXNlIGRiIixmYSxmYSk7DQogICAgICAgICAgICAgICAgICAg IH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAg ICAgICAgICAgICAgICAgICAgIGJsa19zaXplX3ZhbCA9IFBRZ2V0dmFsdWUocmVzLCAwLCAwKTsN CiAgICAgICAgICAgICAgICAgICAgICAgZGF0YV92YWwgPSBQUWdldHZhbHVlKHJlcywgMCwgMSk7 DQogICAgICAgICAgICAgICAgICAgICAgIGlmKCBkYXRhX3ZhbCAhPSBOVUxMICYmICpkYXRhX3Zh bCAhPSAnXDAnKQ0KICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAg ICAgICAgIGlzX2RhdGFfZm91bmQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICBM T0dfREVCVUcoImZhKCVpKSBmYSglMDhYKSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5IGZyb20gU2hh ZG93IERCIixmYSxmYSk7DQogICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAg ICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAg ICAgICAgICAgICAgIExPR19FUlJPUigiU0VMRUNUIGZhaWxlZCBvbiBTaGFkb3cgREI6ICVzIiwg UFFlcnJvck1lc3NhZ2Uoc2hhZG93X2RiX2Nvbm4gKSk7DQoNCiAgICAgICAgICAgICAgICBpZiAo IWlzX2RhdGFfZm91bmQpIHsNCiAgICAgICAgICAgICAgICAgICAgICBQUWNsZWFyKHJlcyk7ICAv LyBDbGVhcmVkIHJlc3VsdCBvbmx5IGlmIHdlIGFyZSBtb3ZpbmcgdG8gbWFpbiBEQiBxdWVyeQ0K ICAgICAgICAgICAgICAgIH0NCgl9DQoJaWYoaXNfZGF0YV9mb3VuZCAhPXRydWUpIA0KCXsNCgkg ICAgICAgIHJlcyA9IFBRZXhlY1ByZXBhcmVkKGNvbm4sDQoJCQkgICAgIFNlbGVjdERhdGFOYW1l LA0KCQkJICAgICBTZWxlY3REYXRhTlBhcmFtcywNCgkJCSAgICAgcGFyYW1WYWx1ZXMsDQoJCQkg ICAgIHBhcmFtTGVuZ3RocywNCgkJCSAgICAgcGFyYW1Gb3JtYXRzLA0KCQkJICAgICByZXN1bHRG b3JtYXQpOw0KICAgICAgICB9DQoJTE9HX0RFQlVHKCIlcygpIHJlcyA9ICVzIixfX2Z1bmNfXyxQ UXJlc1N0YXR1cyhQUXJlc3VsdFN0YXR1cyhyZXMpKSk7DQoNCglpZiAoIGhvbGQgKQ0KCXsNCgkJ aWYgKCBTUUxfdnNuMTAgKQ0KCQl7DQoJCQlTUUxfbG9ja19yb3coZmEpOw0KCQl9DQogICAgICAg ICAgICAgICAgTE9HX0RFQlVHKCIlcygpLVNRTCByZWFkIGRhdGEgZnJvbSBGaWxlIEFkZHJlc3Mt IGxvY2tlZCBmYSglaSkgZmEoJTA4WCkgZmEyIGh0b25sKCVpKSIsX19mdW5jX18sZmEsZmEsZmEy KTsNCgl9DQoJY2hlY2tMT0NLKGZhKTsNCg0KICAgIGlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9 IFBHUkVTX1RVUExFU19PSykNCiAgICB7DQogICAgICAgIExPR19FUlJPUigiU0VMRUNUIGZhaWxl ZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7DQoJCUxPR19ERUJVRygiUk9MTEJBQ0sgVFJB TlNBQ1RJT04gQU5EIENIQUlOIik7DQogICAgICAgIFBRY2xlYXIocmVzKTsNCgkJcmVzID0gUFFl eGVjKGNvbm4sIlJPTExCQUNLIFRSQU5TQUNUSU9OIEFORCBDSEFJTiIpOw0KCQlMT0dfRVJST1Io IklOVkFMSURfRklMRV9BRERSRVNTICUwOFgiLGZhKTsNCgkJcmMgPSBFUlJfSU5WQUxJRF9GSUxF X0FERFJFU1M7DQoJCWlmICggKCh1aW50MzJfdClmYSk+PjI0ICE9IDB4OTQpIHsNCgkJCWlmIChD T1VOVCA8IDI1NSkgew0KDQoJCQkJaWYgKCBiaWQgIT0gTlVMTCApIHsNCgkJCQkJTE9HX0lORk8o Im1pc3NpbmcgZGF0YTogJTA4eCAlMDJ4ICUwMngiLCBmYSwgKmJpZCwqKGJpZCsxKSk7DQoJCQkJ CWNoYXIgc3RyMVs4XTsNCgkJCQkJaW50MTZfdCBhPSpiaWQ7DQoJCQkJCWludDE2X3QgYj0qKGJp ZCsxKTsNCgkJCQkJc3ByaW50ZihzdHIxLCIlMDJ4JTAyeCIsYSxiKTsNCgkJCQkJRkFbQ09VTlRd PWZhOw0KCQkJCQltZW1jcHkoUkVDX0lEMVtDT1VOVF0sc3RyMSw1KTsNCgkJCQkJQ09VTlQrKzsN CgkJCQl9IGVsc2Ugew0KCQkJCQliaWQ9MHgwMDAwOw0KCQkJCQlMT0dfSU5GTygibWlzc2luZyBk YXRhOiAlMDh4IiwgZmEpOw0KCQkJCQlGQVtDT1VOVCsrXT1mYTsNCgkJCQkJUkVDX0lEMVtDT1VO VF1bMF09MHgwMDsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJUFFjbGVhcihyZXMpOw0KICAgIH0NCgll bHNlDQoJew0KCQluRmllbGRzID0gUFFuZmllbGRzKHJlcyk7CS8vIG51bWJlciBvZiBjb2x1bW5z DQoJCW5UdXBsZXMgPSBQUW50dXBsZXMocmVzKTsJLy8gbnVtYmVyIG9mIHJvd3MNCgkJTE9HX0RF QlVHKCIlcygpIG5GaWVsZHMoY29scyk9JWkgblR1cGxlcyhyb3dzKT0laSIsX19mdW5jX18sbkZp ZWxkcyxuVHVwbGVzKTsNCgkJaWYoIG5GaWVsZHMgPT0gMCB8fCBuVHVwbGVzID09IDApIA0KCQl7 DQogICAgICAgICAgICAgICAgCUxPR19FUlJPUigiU0VMRUNUIGZhaWxlZDogTk8gUk9XUyBSRVRV Uk5FRCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUFFjbGVhcihyZXMpOw0KCQkJcmVzID0g UFFleGVjKGNvbm4sIlJPTExCQUNLIFRSQU5TQUNUSU9OIEFORCBDSEFJTiIpOw0KCQkJTE9HX0VS Uk9SKCJJTlZBTElEX0ZJTEVfQUREUkVTUyAlMDhYIixmYSk7DQoJCQlyYyA9IEVSUl9JTlZBTElE X0ZJTEVfQUREUkVTUzsNCgkJCWlmICggKCh1aW50MzJfdClmYSk+PjI0ICE9IDB4OTQpIHsNCgkJ CQlpZiAoQ09VTlQgPCAyNTUpIHsNCgkJCQkJaWYgKCBiaWQgIT0gTlVMTCApIHsNCgkJCQkJCUxP R19JTkZPKCJtaXNzaW5nIGRhdGE6ICUwOHggJTAyeCAlMDJ4IiwgZmEsICpiaWQsKihiaWQrMSkp Ow0KCQkJCQkJY2hhciBzdHIxWzhdOw0KCQkJCQkJaW50MTZfdCBhPSpiaWQ7DQoJCQkJCQlpbnQx Nl90IGI9KihiaWQrMSk7DQoJCQkJCQlzcHJpbnRmKHN0cjEsIiUwMnglMDJ4IixhLGIpOw0KCQkJ CQkJRkFbQ09VTlRdPWZhOw0KCQkJCQkJbWVtY3B5KFJFQ19JRDFbQ09VTlRdLHN0cjEsNSk7DQoJ CQkJCQlDT1VOVCsrOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJYmlkPTB4MDAwMDsNCgkJCQkJCUxP R19JTkZPKCJtaXNzaW5nIGRhdGE6ICUwOHgiLCBmYSk7DQoJCQkJCQlGQVtDT1VOVCsrXT1mYTsN CgkJCQkJCVJFQ19JRDFbQ09VTlRdWzBdPTB4MDA7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQlQ UWNsZWFyKHJlcyk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlibGtfc2l6ZSA9IG50b2hsKCoodWlu dDMyX3QgKilQUWdldHZhbHVlIChyZXMsIDAsIDApKTsNCgkJCUxPR19ERUJVRygiJXMoKSBibGtf c2l6ZSByZXR1cm5lZCBpcyAlaSIsX19mdW5jX18sYmxrX3NpemUpOw0KCQkJaWYoYmxrX3NpemUg PCAxMjcgfHwgYmxrX3NpemUgPiA0MDk2KQ0KCQkJew0KICAgICAgICAgICAgICAgIAkJTE9HX0VS Uk9SKCJTRUxFQ1QgZmFpbGVkOiBOTyBST1dTIFJFVFVSTkVEIik7DQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFBRY2xlYXIocmVzKTsNCgkJCQlyZXMgPSBQUWV4ZWMoY29ubiwiUk9M TEJBQ0sgVFJBTlNBQ1RJT04gQU5EIENIQUlOIik7DQoJCQkJTE9HX0VSUk9SKCJJTlZBTElEX0ZJ TEVfQUREUkVTUyAlMDhYIixmYSk7DQoJCQkJcmMgPSBFUlJfSU5WQUxJRF9GSUxFX0FERFJFU1M7 DQoJCQkJaWYgKCAoKHVpbnQzMl90KWZhKT4+MjQgIT0gMHg5NCkgew0KCQkJCQlpZiAoQ09VTlQg PCAyNTUpIHsNCgkJCQkJCWlmICggYmlkICE9IE5VTEwgKSB7DQoJCQkJCQkJTE9HX0lORk8oIm1p c3NpbmcgZGF0YTogJTA4eCAlMDJ4ICUwMngiLCBmYSwgKmJpZCwqKGJpZCsxKSk7DQoJCQkJCQkJ Y2hhciBzdHIxWzhdOw0KCQkJCQkJCWludDE2X3QgYT0qYmlkOw0KCQkJCQkJCWludDE2X3QgYj0q KGJpZCsxKTsNCgkJCQkJCQlzcHJpbnRmKHN0cjEsIiUwMnglMDJ4IixhLGIpOw0KCQkJCQkJCUZB W0NPVU5UXT1mYTsNCgkJCQkJCQltZW1jcHkoUkVDX0lEMVtDT1VOVF0sc3RyMSw1KTsNCgkJCQkJ CQlDT1VOVCsrOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQliaWQ9MHgwMDAwOw0KCQkJCQkJCUxP R19JTkZPKCJtaXNzaW5nIGRhdGE6ICUwOHgiLCBmYSk7DQoJCQkJCQkJRkFbQ09VTlQrK109ZmE7 DQoJCQkJCQkJUkVDX0lEMVtDT1VOVF1bMF09MHgwMDsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0N CgkJCQlQUWNsZWFyKHJlcyk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJKmZkID0gZmE7CQkJ CS8vIHVzZSBGaWxlIEFkZHJlc3MgYXMgRmlsZSBEZXNjcmlwdG9yIA0KCQkJCWMgPSBQUWdldHZh bHVlKHJlcywgMCwgMSk7ICAJCS8vIFNFTEVDVCBoYXMgZGF0YSBhcyBzZWNvbmQgZmllbGQgDQoJ CQkJLy9kdW1wX2hleChjLDE2KTsNCgkJCQkvL3ByaW50ZigiIFBRZ2V0bGVuZ3RoIG9mIGRhdGEg ID0gJWlcbiIsUFFnZXRsZW5ndGgocmVzLDAsMSkpOw0KCQkJCXAgPSBjOwkvLyB1c2Ugc2FtZSBw b2ludGVyIGZvciBib3RoIG1tYXAgYW5kIGNvcmVfYmxrDQoJDQoJCQkJTE9HX0RFQlVHKCJDb3Jl IGJsb2NrIGFkZHJlc3MgJXAgZm9yIEZBICUwOFggKFJXKSIsIHAsIGZhKTsNCgkJICAgICAgICAg ICAgICAgIGR1bXBfaGV4KHAsMzIpOw0KCQkJCS8qIHByb2JhYmx5IG5lZWQgc29tZSB2YWxpZGF0 aW9uIG9mIGJsb2NrIHNpemU/ICovDQoJCQkJaWYgKGJpZCAhPSBOVUxMICYmIG1lbWNtcChiaWQs IHAsIDIpICE9IDAgJiYgbWVtY21wKGJpZCwgIlx4MDBceDAwIiwgMikgIT0gMCkgew0KCQkJCQly YyA9IEVSUl9SSURfTUlTTUFUQ0g7DQoJCQkJCWludCBiMSA9ICoodW5zaWduZWQgY2hhciAqKXA7 DQoJCQkJCWludCBiMiA9ICoodW5zaWduZWQgY2hhciAqKShwKzEpOw0KCQkJCQlpbnQgYTEgPSAq KHVuc2lnbmVkIGNoYXIgKikoYmlkKTsNCgkJCQkJaW50IGEyID0gKih1bnNpZ25lZCBjaGFyICop KGJpZCsxKTsNCgkJCQkJTE9HX0VSUk9SKCJFcnJvciByZWNvcmQgaWQgbWlzbWF0Y2ggJTAyWCUw MlggIT0gJTAyWCUwMlggRkEgJTA4WCIsIGIxLCBiMiwgYTEsIGEyLCBmYSk7DQoJCQkJfSBlbHNl IGlmIChyY2MgIT0gTlVMTCAmJiAqcmNjICE9IDAgJiYgbWVtY21wKHJjYywgcCsyLCAxKSAhPSAw KSB7DQoJCQkJCXJjID0gRVJSX1JDQ19NSVNNQVRDSDsNCgkJCQkJaW50IGIxID0gKih1bnNpZ25l ZCBjaGFyICopKHArMik7DQoJCQkJCWludCBhMSA9ICoodW5zaWduZWQgY2hhciAqKShyY2MpOw0K CQkJCQlMT0dfRVJST1IoIkVycm9yIHJjYyBtaXNtYXRjaCAlMDJYICE9ICUwMlggRkEgJTA4WCIs IGIxLCBhMSwgZmEpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXJjID0gMDsNCgkJCQl9DQoNCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvcmVfYmxrID0gKHVuc2lnbmVkIGNoYXIgKilt YWxsb2MoYmxrX3NpemUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmNv cmVfYmxrID09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExP R19FUlJPUigiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7DQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBQUWNsZWFyKHJlcyk7ICANCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiBFUlJfSU9fSEFSRFdBUkVfRVJST1I7DQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVt Y3B5KCpjb3JlX2JsayxjICwgYmxrX3NpemUpOw0KCQkJCUxPR19UUkFDRSgiQ29yZSBibG9jayBh ZGRyZXNzICVwIGFuZCBtbWFwX3B0ciAlcCBmb3IgRkEgJTA4WCAoUlcpIiwgY29yZV9ibGssIG1t YXBfcHRyLGZhKTsNCg0KCQkJCS8vKm1tYXBfcHRyID0gYzsNCgkJCQkvLypjb3JlX2JsayA9IHA7 DQoJCQkJKnN0X3NpemUgPSBibGtfc2l6ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUFFjbGVhcihyZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfREVC VUcoIiVzOiBjbGVhcmVkIHRoZSByZXN1bHQgZnJvbSBxdWVyeSBpbiB0aGUgZW5kIixfX2Z1bmNf Xyk7DQoJCQkJLy9kdW1wX2hleCgqbW1hcF9wdHIsMTA1NSk7DQoJCQl9DQoJCX0NCgl9DQoJLy9M T0dfREVCVUcoIiVzKCkgcmMgPSAlaSIsX19mdW5jX18scmMpOw0KCXJldHVybiByYzsNCn0= --0000000000008d8ba206253bfbaa--