Return-Path: Delivered-To: apmail-velocity-dev-archive@www.apache.org Received: (qmail 96861 invoked from network); 6 Feb 2009 04:45:58 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 6 Feb 2009 04:45:58 -0000 Received: (qmail 28290 invoked by uid 500); 6 Feb 2009 04:45:58 -0000 Delivered-To: apmail-velocity-dev-archive@velocity.apache.org Received: (qmail 28270 invoked by uid 500); 6 Feb 2009 04:45:58 -0000 Mailing-List: contact dev-help@velocity.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Velocity Developers List" Delivered-To: mailing list dev@velocity.apache.org Received: (qmail 28259 invoked by uid 99); 6 Feb 2009 04:45:58 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 05 Feb 2009 20:45:58 -0800 X-ASF-Spam-Status: No, hits=2.2 required=10.0 tests=FB_WORD1_END_DOLLAR,HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of sdh5724@gmail.com designates 209.85.200.172 as permitted sender) Received: from [209.85.200.172] (HELO wf-out-1314.google.com) (209.85.200.172) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 06 Feb 2009 04:45:51 +0000 Received: by wf-out-1314.google.com with SMTP id 25so691006wfa.1 for ; Thu, 05 Feb 2009 20:45:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:date:message-id:subject :from:to:content-type; bh=0UVExx1WR4BXfT8iwH/iGKd8rcpfIvjkRu+He6Eju2Q=; b=OE9D3cxNkAdGoYN2ZQ45qES3sRjdhBhNNl50Tv0Lhyum2kn5AS71Wyqoqs+aR0e6FZ pXz2rGYzRgwsrILE1kyUShZzFNKxw8dRKN2EocgUs5lzxrs7GbXpYtrU5/AULetu3uv5 2qm/2t0FqoQwyNKwpWba1zkFlTjZqQcqovDsI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=cK6ehYV5j3tqgNLRN2ouiGAWgtP+z1z0xyriA2KyZjlM8RExmBAoVCoNRAkHU1zSxz 3NwhArG8D860LZOWkeENwz9uRPZ42Ha0/ll7YULdS+SEEC511GNfa+8bSX6Um7CGyceH l4w9hiV5JZ3NU/60kb9uatO5MOEub8TOjrc2A= MIME-Version: 1.0 Received: by 10.142.148.19 with SMTP id v19mr745142wfd.16.1233895531659; Thu, 05 Feb 2009 20:45:31 -0800 (PST) Date: Fri, 6 Feb 2009 12:45:31 +0800 Message-ID: <53dafd4c0902052045pa5065eeta1a0edde6dcc6e17@mail.gmail.com> Subject: A web page security enhancement demo patch From: Leon sdh5724 To: dev@velocity.apache.org Content-Type: multipart/mixed; boundary=000e0cd31144dac37a046238b086 X-Virus-Checked: Checked by ClamAV on apache.org --000e0cd31144dac37a046238b086 Content-Type: multipart/alternative; boundary=000e0cd31144dac372046238b084 --000e0cd31144dac372046238b084 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Dear Devs, Velocity is a great opensource component for weg page render. We deploy it on our site that render dynamic web pages more than 1 billion pages everyday. But velocity have no security protected xss + csrf attack. Every render reference point need programmer writing code as "$stringEscapedUtil.escapedHtml($ref)". But the such code will be forgoten by programmer, especialy a newbie. So security can not be handled at every output. Infact, every web page output need to be html encode , about more than 90%. The best solution we shuold do html encode for every output refrence with default.Some spec Macro directive left 10% content output. The attachment is my demo code (Infact we have deploy it in our product enviroment). The code implementation is very ugly, but bring us security sophisticated. Maybe it can bring Velocity Dev Team some idea on web security. Sorry for my code's coment writing in chinese. I think the code is very simple. I explain it now: 1. html/xml encode part, I copy it from apache commons component, and rewrite it for performace issue and remove encode for non-ascii unicode. Encode all unicode chars are not wize , cause more large web page and cause debug problem. 2. I implement xml/html/javascript/XSS filtter. I think Xss filter shuold be optional, because it has many security rules. It is ONLY a adive. Leon Liu --000e0cd31144dac372046238b084 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Dear Devs,
     Velocity is a great opensource compo= nent for weg page render. We deploy it  on our site that render dynami= c web pages more than 1 billion pages everyday. But velocity have no securi= ty protected xss + csrf attack. Every render reference point need programme= r writing code as "$stringEscapedUtil.escapedHtml($ref)". But the= such code will be forgoten by programmer, especialy a newbie.  So&nbs= p; security can not be handled at every output.
    Infact, every web page output need to be html encode , a= bout more than 90%. The best solution we shuold do html encode for every ou= tput refrence with default.Some spec Macro directive left 10% content outpu= t.   The attachment is my demo code (Infact we have deploy it in = our product enviroment).  The code implementation is very ugly, but br= ing us security sophisticated. Maybe it can bring Velocity Dev Team some id= ea on web security. 
    Sorry for my code's coment writing in chinese. I thi= nk the code is very simple.  I explain it now:
    1= . html/xml encode part, I copy it from apache commons component, and rewrit= e it for performace issue and remove encode for non-ascii unicode. Encode a= ll unicode chars are not wize , cause more large web page and cause debug p= roblem.
    2. I implement xml/html/javascript/XSS filtter.  I = think Xss filter shuold be optional, because it has many security rules.    
  It is ONLY a adive.

Leon Liu

--000e0cd31144dac372046238b084-- --000e0cd31144dac37a046238b086 Content-Type: text/x-java; name="SecurityReferenceInsertionEventHandler.java" Content-Disposition: attachment; filename="SecurityReferenceInsertionEventHandler.java" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fqube49n0 cGFja2FnZSBjb20uYWxpYmFiYS5jaGluYS5mYXN0dGV4dC5zZWN1cml0eS52ZWxvY2l0eTsKCmlt cG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Cmlt cG9ydCBqYXZhLmlvLldyaXRlcjsKaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CmltcG9ydCBqYXZh LnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmFwYWNoZS5j b21tb25zLmxvZ2dpbmcuTG9nOwppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9n RmFjdG9yeTsKaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuYXBwLmV2ZW50LlJlZmVyZW5jZUlu c2VydGlvbkV2ZW50SGFuZGxlcjsKCmltcG9ydCBjb20uYWxpYmFiYS5jaGluYS5mYXN0dGV4dC5z ZWN1cml0eS54c3MuUG9saWN5OwppbXBvcnQgY29tLmFsaWJhYmEuY2hpbmEuZmFzdHRleHQuc2Vj dXJpdHkueHNzLlBvbGljeUV4Y2VwdGlvbjsKaW1wb3J0IGNvbS5hbGliYWJhLmNoaW5hLmZhc3R0 ZXh0LnNlY3VyaXR5Lnhzcy5Yc3NYcHBTY2FubmVyOwoKLyoqCiAqIDxwcmU+CiAqIDEuaHRtbMrk s/YsIMqyw7S2vLK71rTQ0KOsILC01K3KvLjxyr3K5LP2oaMgy/uyorK7ysfV5tX9tcSyu9a00NDI zrrOseQKICogu6+jrCDS8s6qy/u74da00NB4c3O1xLn9wsu2r9f3oaPSu7j2t8ezo7i01NO1xLCy yKu0psDtuf2zzKOsIMjnufuyu8rHyuQKICogs/ZIVE1Mo6wgx+vO8Mq508OhoyDV4rj2se3Kvr2r u+HP+7rEtPPBv7XEQ1BVtKbA7aGjCiAqICNaSFRNTCgkaHRtbCkKICogMi54bWyx4MLryuSz9qOs IL2ru+HWtNDQIHhtbCBlbmNvZGXK5LP2CiAqICNaWE1MKCR4bWwpCiAqIDMuanOx4MLryuSz9iAs IL2ru+HWtNDQamF2YXNjcmlwdCBlbmNvZGXK5LP2CiAqICNaSlMoJGpzKQogKiA0LrS/zsSxvrHg wuvK5LP2LCC9q7vh1rTQ0Gh0bWwgZW5jb2RlCiAqICRwdXJlVGV4dAogKiA1LiDS0b6tsbvStc7x tPrC62VzY2FwZWS5/bXEyuSz9gogKiDV4rj2xL/HsMO709DKssO0usO1xLDst6ijrCDWu8Tc0N64 xNK1zvG0+sLro6wgyKWz/dXi0Kllc2NhcGVktcS12Le9oaMKICogyrnTw2ZpbmQgLiB8Z3JlcCBq YXZhJCB8eGFyZ3MgZ3JlcCAtaSBTdHJpbmdFc2NhcGVVdGlsLmVzY2FwZUh0bWwgwLTRsNXSCiAq ILPM0PLW0LP2z9a1xKOsIM7S1dLBy8/CZXhvZHVzwO+1xLT6wuujrCDT0DIxuPa12Le9ysfV4sO0 1/a1xKGjIM7Sz+vV4rj2CiAqINDeuMTG8MC0tcTE0bbIysexyL3Ptc21xKGjCiAqIDYuIMq508Mk c3RyaW5nRXNjYXBlVXRpbC5lc2NhcGVIdG1sKCR0ZXh0Kcrks/a1xLXYt70KICog08nT2rT6wuvQ 3rjExvDAtLHIvc/C6bezo6wgztLDx8q508PSu7j2uurAtLSmwO3V4rj2zsrM4iwg1eK49sq508PS u7j2zbMKICog0rvM5ru7uaTX96GjsNEkc3RyaW5nRXNjYXBlVXRpbC5lc2NhcGVIdG1sIMzmu7uz yQogKiAjWlBVUkVURVhUKCR0ZXh0KQogKiA3LiBVUky1xMrks/YsINKy0O3O0sPHvs29q8C00qrX 9lVSTLXEsLLIq7zssumjrCDS8rTLo6wgx+vO8Mq508PU2rfHVVJMs/YKICogz9a1xLXYt70gy+TI u8v7yrLDtNeq0uW2vLK71/ahowogKiDSu7Djx+m/9s/Co6wgztLDx7XEVVJMyuSz9sq508NVUklC b2tlcrbUz/OjrCC1q8rHo6wgztLXotLitb3By6OsINPQsr+31gogKiBVUkzKudPDwctVUklCb2tl ci5yZW5kZXIoKSC78tXfo6wgVVJJQm9rZXIudG9TdHJpbmcoKSDV4sO0yuSz9qOsINXiuPa74Qog KiDU7LPJVVJMsbtodG1sIGVuY29kZS4g1eK49srHutzO3sTOtcShowogKiDI57n7t6LJ+tXiuPbH 6b/2o6wgx+u808nPCiAqICNaVVJMKCR1cmwpLCDV4rj2uurWuMq+wcuyu9KqyrnTw2h0bWwgZW5j b2RlLgogKiA4LiDOqsHLsdzD4reiyfrG59Llo6wgI1pIVE1My+TIu8rHsrvXqtLlo6wgtavKx87S w8fD98i3y7W1xMrHSFRNTKOsILWrCiAqIMrHo6wgyOe5+9Xm09Cyu9Do0qrXqtLltcTH6b/2s/bP 1qOsIM7Sw8e/ydLUyrnTwwogKiAjWkxJVEVSQUwoJHRleHQpCiAqIHRpcHM6IGxpdGVyYWwgLSDV 1dfWw+a1xDvUrdLltcQuCiAqIAogKiC809K7uPZaysfOqsHLvqHBv7Hcw+K6zdOm08O2qNLltcS6 6rP2z9az5c27o6wgw7vT0LHwtcS6rNLlLiC1q8rHztLDx8jUyLsKICog09C8uLj2tdi3vdDo0qrO 0sPH16LS4rXEtdi3vaO6CiAqIAogKiAxo67AqdW5yrXP1rXEysex4MLryuSz9lN0cmluZ7bUz/Oj rCDI57n7xOPK5LP2tcSyu8rHU3RyaW5nttTP86OsINXi0Km66gogKiCy2df3vau74cqn0KejrCDV 4rj2ysfOqsHLzOG438+1zbO1xLHgwuvQ1MTco6yyycihtcTMrLbIoaMgyOe5+9K7uPa21M/zw7sK ICog09DW2NDCyrXP1nRvU3RyaW5nKCm1xKOsINXiuPa21M/ztcTK5LP2yseyu7/JxNzT0Gh0bWyx 4MLrtcTOyszitcSho9LyzqoKICogT2JqZWN0LnRvU3RyaW5nyrXP1rXEyse21M/ztdjWt6OsIMHt zeLKtc/Wwct0b1N0cmluZ7XEt723qKOsIM7Sw8e5w8fSyM8KICogzqrKx7CyyKujrCDV4rj2y+TI u9HPuPHS4tLlyc/Kx7K71f3It7XEo6y1q8rHo6wgztLDx7XEz7XNs7XEyLe7+bG+ysfV4tH5CiAq ILmk1/e1xKGjCiAqIDKjrsjnus6x3MPi0ru49sr9vt2xu7bgtM5lbmNvZGWhowogKiDK18/IztLD x7zZyeggJHRleHQ9JnF1b3Q7cyZhbXA7JnF1b3Q7CiAqIGEuJHN0cmluZ1V0aWwuZ2V0WFhYKCR0 ZXh0KQogKiDV4rj20M7Kvcrks/bKxyBzJmFtcDsKICogYi4kc3RyaW5nVXRpbC5nZXRYWFgoJnF1 b3Q7JHRleHQmcXVvdDspCiAqINXiuPbQzsq9yuSz9srHIHMmYW1wO2FtcDsKICogzqrKssO0u+HV 4tH5xNijrCZxdW90OyZxdW90O8rHuObL33ZlbG9jaXR5LCDPyMrks/ajrCC687DRss7K/cvNuPgK ICogI3N0cmluZ1V0aWwuZ2V0WFhYLiDV4srH0ru49rfHs6PQ6NKq16LS4rXEtdi3vaOs1eK49rXY t721vNbCwcu088G/tcS12Le9CiAqINDo0qrQ3rjEtcS12Le9oaMg0rLKx8S/x7DX7s7exM61xLXY t72ho9XiuPYKICog1eK49rvh1OyzydK70Kmx5NDOtcTM2Mrix+m/9qOsILHIyOcKICogJHN0cmlu Z1V0aWwuZXF1YWxzKCZxdW90OyR0ZXh0JnF1b3Q7o6wgJnF1b3Q7JmFtcDsmcXVvdDspCiAqINXi 0fnH6b/2vs3Kx6OsICZxdW90OyR0ZXh0JnF1b3Q7LCDV4rj20tG+rbeiyfpodGxtbCBlbmNvZGUs IMi7tvggJnF1b3Q7JmFtcDsmcXVvdDvKx7Ojwb+jrCCzo8G/CiAqIMrHzt63qLG716rS5bXEo6zS 8rTL1eK49r7Nyse3osn60c/W2LXEYnVnLgogKiC94r72tcSw7LeoysfV4sO00LSjugogKiAkc3Ry aW5nVXRpbC5lcXVhbHMoJHRleHSjrCAmcXVvdDsmYW1wOyZxdW90OykKICogYy4kc3RyaW5nVXRp bC5nZXRYWFgoJnF1b3Q7dGhlIHBybzogJHRleHQmcXVvdDspCiAqINXiuPbH6b/2o6wgxL/HsM7S w8e1xM+1zbPSssrHsci9z7bgo6wgs6PBv9PryuSz9rXEu+y6zy4gveK+9tXiuPbOyszitcSw7Aog KiC3qMrHo7pIVE1MX1hTU19GSUxURVIKICogJHN0cmluZ1V0aWwuZ2V0WFhYKCZxdW90O3RoZSBw cm86ICNaTElURVJBTCgkdGV4dCkmcXVvdDspCiAqIAogKiBkLiRjb250cm9sLnNldFRlbXBsYXRl KCR0ZXh0KQogKiDV4rj2z7XNs7vh19S2r7SmwO0KICogZS4kc3RyaW5nVXRpbC5lc2NhcGVIdG1s KCR0ZXh0KQogKiDV4rj2yc/D5rXEtdo2zPXX97P2wcu94srNCiAqIGYuJHNjcmVlbl9wbGFjZWhv bGRlcgogKiDV4rj2z7XNs7vh19S2r7SmwO0KICogCiAqIDwvcHJlPgogKiAKICogQGF1dGhvciBs ZW9uCiAqLwpwdWJsaWMgY2xhc3MgU2VjdXJpdHlSZWZlcmVuY2VJbnNlcnRpb25FdmVudEhhbmRs ZXIgZXh0ZW5kcyBSb290UmVmZXJlbmNlRmlsdGVyIGltcGxlbWVudHMgUmVmZXJlbmNlSW5zZXJ0 aW9uRXZlbnRIYW5kbGVyIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nZ2VyID0g TG9nRmFjdG9yeS5nZXRMb2coU2VjdXJpdHlSZWZlcmVuY2VJbnNlcnRpb25FdmVudEhhbmRsZXIu Y2xhc3MpOwogICAgcHJpdmF0ZSBYc3NYcHBTY2FubmVyICAgIHNjYW5uZXI7CgogICAgcHVibGlj IFNlY3VyaXR5UmVmZXJlbmNlSW5zZXJ0aW9uRXZlbnRIYW5kbGVyKCl7CiAgICAgICAgdHJ5IHsK ICAgICAgICAgICAgc2Nhbm5lciA9IG5ldyBYc3NYcHBTY2FubmVyKFBvbGljeS5nZXRMb29zZVBv bGljeUluc3RhbmNlKCkpOwogICAgICAgIH0gY2F0Y2ggKFBvbGljeUV4Y2VwdGlvbiBlKSB7CiAg ICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgIH0KICAgIH0K CiAgICAvKioKICAgICAqIEBzZWUgUmVmZXJlbmNlQWN0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBP YmplY3QgcmVmZXJlbmNlSW5zZXJ0KFN0cmluZyByZWZlcmVuY2UsIE9iamVjdCB2YWx1ZSkgewog ICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewogICAgICAgICAgICBSZWZlcmVu Y2VBY3Rpb24gYWN0aW9uID0gZ2V0UmVmZXJlbmNlQWN0aW9uKHJlZmVyZW5jZSk7CiAgICAgICAg ICAgIFN0cmluZyByZXRWYWx1ZSA9IChTdHJpbmcpIHZhbHVlOwogICAgICAgICAgICBzd2l0Y2gg KGFjdGlvbikgewogICAgICAgICAgICAgICAgY2FzZSBIVE1MX1hTU19GSUxURVI6CiAgICAgICAg ICAgICAgICAgICAgcmV0VmFsdWUgPSBzY2FubmVyLnNjYW4ocmV0VmFsdWUpOwogICAgICAgICAg ICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgSkFWQVNDUklQVF9FTkNPREU6 CiAgICAgICAgICAgICAgICAgICAgRmFzdEVudGl0aWVzLmVzY2FwZUphdmFTY3JpcHQocmV0VmFs dWUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBYTUxf RU5DT0RFOgogICAgICAgICAgICAgICAgICAgIHJldFZhbHVlID0gWE1MLmVzY2FwZShyZXRWYWx1 ZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIExJVEVS QUw6CiAgICAgICAgICAgICAgICBjYXNlIFVSTF9GSUxURVI6Ly8gZG8gbm90aGluZwogICAgICAg ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBIVE1MX0VOQ09ERToKICAg ICAgICAgICAgICAgICAgICByZXRWYWx1ZSA9IEhUTUw0MC5lc2NhcGUocmV0VmFsdWUpOwogICAg ICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBQVVJFX1RFWFRfSFRN TF9FTkNPREU6CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSBIVE1MNDAuZXNjYXBlKHJl dFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2Ug Tk9UX0RFRklORUQ6CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAg IC8vINTaxKzIz7XEx+m/9s/Co6yhocjV1r68x8K8o6yhob/JxNzKx2h0bWy1xMrks/YKICAgICAg ICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKICAgICAgICAgICAg ICAgICAgICAgICAgaWYgKHJldFZhbHVlLmluZGV4T2YoJzwnKSA+IC0xICYmIHJldFZhbHVlLmlu ZGV4T2YoJz4nKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVi dWcoInJlZmVyZW5jZT0iICsgcmVmZXJlbmNlICsgIiBtYXliZSBpcyBhIGh0bWwgY29udGVudCIp OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAg ICAgICAgICAgICAgIHJldFZhbHVlID0gSFRNTDQwLmVzY2FwZShyZXRWYWx1ZSk7CiAgICAgICAg ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJldFZh bHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9Cn0KCi8qKgogKiA8cHJl PgogKiBIVE1MX1hTU19GSUxURVI6IMq508N4c3O5/cLLuaS+38rks/YKICogSFRNTF9FTkNPREU6 ILC0aHRtbCBlbmNvZGXK5LP2CiAqIEpBVkFTQ1JJUFRfRU5DT0RFOiCwtGpzIGVuY29kZSDK5LP2 CiAqIFhNTF9FTkNPREU6ILC0eG1sIGVuY29kZcrks/YKICogTElURVJBTDogsLTUrcC0tcTK5LP2 CiAqIFVSTF9GSUxURVI6INTdyrHDu9PQ1/bIzrrOseDC69DQzqogCiAqIFBVUkVfVEVYVF9IVE1M X0VOQ09ERTogvObI3dStwLS1xM+1zbPKudPDo6wgzqrBy7Hcw+K3osn6tv60zrHgwusKICogTk9U X0RFRklORUQ6IM60tqjS5bXEo6wgyrnTw2h0bWwgZW5jb2RlCiAqIDwvcHJlPgogKi8KZW51bSBS ZWZlcmVuY2VBY3Rpb24gewogICAgSFRNTF9YU1NfRklMVEVSLCBIVE1MX0VOQ09ERSwgSkFWQVND UklQVF9FTkNPREUsIFhNTF9FTkNPREUsIExJVEVSQUwsIFVSTF9GSUxURVIsIFBVUkVfVEVYVF9I VE1MX0VOQ09ERSwKICAgIE5PVF9ERUZJTkVECn0KCi8qKgogKiA8cHJlPgogKiAjIyMjIyMjIyNo dG1sIHhzcyBmaWx0ZXIjIyMjIyMjIyMjIyMjCiAqICNtYWNybyhTSFRNTCAkU0hUTUxfKSRTSFRN TF8jZW5kCiAqICMjIyMjIyMjI3htbCBlbmNvZGUgIyMjIyMjIyMjIyMjIwogKiAjbWFjcm8oU1hN TCAkU1hNTF8pJFNYTUxfI2VuZAogKiAjIyMjIyMjIyNqYXZhc2NyaXB0IGVuY29kZSAjIyMjIyMj IyMjIyMjCiAqICNtYWNybyhTSlMgJFNKU18pJFNKU18jZW5kCiAqICMjIyMjIyMjI3B1cmUgdGV4 dCBodG1sIGVuY29kZSwgaXQgaXMgYSBjb21wYXRpYmlsaXR5IHB1cnBvc2UsIHNodW4gZG91Ymxl IGVzY2FwZWQjIyMjIyMjIyMjIyMjCiAqICNtYWNybyhTUFVSRVRFWFQgJFNQVVJFVEVYVF8pJFNQ VVJFVEVYVF8jZW5kCiAqICMjIyMjIyMjI3B1cmUgdGV4dCBhcyBsaXRlcmFsICMjIyMjIyMjIyMj IyMKICogI21hY3JvKFNMSVRFUkFMICRTTElURVJBTF8pJFNMSVRFUkFMXyNlbmQKICogIyMjIyMj IyMjdXJsIG91dHB1dCAjIyMjIyMjIyMjIyMjCiAqICNtYWNybyhTVVJMICRTVVJMXykkU1VSTF8j ZW5kCiAqPC9wcmU+CiAqLwpjbGFzcyBSb290UmVmZXJlbmNlRmlsdGVyIGV4dGVuZHMgRmFzdEVu dGl0aWVzIHsKCiAgICBzdGF0aWMgTWFwPFN0cmluZywgUmVmZXJlbmNlQWN0aW9uPiBmaWx0ZXIg PSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlZmVyZW5jZUFjdGlvbj4oKTsKCiAgICBzdGF0aWMgewog ICAgICAgIC8vIHN5c3RlbSBkZWZpbmUKICAgICAgICBmaWx0ZXIucHV0KCIkc2NyZWVuX3BsYWNl aG9sZGVyIiwgUmVmZXJlbmNlQWN0aW9uLkxJVEVSQUwpOwoKICAgICAgICAvLyBlbmNvZGUgcGFy dAogICAgICAgIGZpbHRlci5wdXQoIiQhe3NlY3VyaXR5X2hfdF9tX2xfen0iLCBSZWZlcmVuY2VB Y3Rpb24uSFRNTF9YU1NfRklMVEVSKTsKICAgICAgICBmaWx0ZXIucHV0KCIkIXtzZWN1cml0eV94 X21fbF96fSIsIFJlZmVyZW5jZUFjdGlvbi5YTUxfRU5DT0RFKTsKICAgICAgICBmaWx0ZXIucHV0 KCIkIXtzZWN1cml0eV9qX3Nfen0iLCBSZWZlcmVuY2VBY3Rpb24uSkFWQVNDUklQVF9FTkNPREUp OwogICAgICAgIGZpbHRlci5wdXQoIiQhe3NlY3VyaXR5X3BfdV9yX2VfdF9lX3hfdF96fSIsIFJl ZmVyZW5jZUFjdGlvbi5IVE1MX0VOQ09ERSk7CiAgICAgICAgZmlsdGVyLnB1dCgiJCF7c2VjdXJp dHlfbF9pX3RfZV9yX2FfbF96fSIsIFJlZmVyZW5jZUFjdGlvbi5MSVRFUkFMKTsKICAgICAgICBm aWx0ZXIucHV0KCIkIXtzZWN1cml0eV91X3JfbF96fSIsIFJlZmVyZW5jZUFjdGlvbi5VUkxfRklM VEVSKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIFJlZmVyZW5jZUFjdGlvbiBnZXRSZWZlcmVu Y2VBY3Rpb24oU3RyaW5nIHJlZikgewogICAgICAgIFJlZmVyZW5jZUFjdGlvbiBhY3Rpb24gPSBm aWx0ZXIuZ2V0KHJlZik7CiAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAg IGFjdGlvbiA9IFJlZmVyZW5jZUFjdGlvbi5OT1RfREVGSU5FRDsKICAgICAgICB9CiAgICAgICAg cmV0dXJuIGFjdGlvbjsKICAgIH0KCn0KCi8qKgogKiC/7MvZaHRtbC9qcy94bWwgseDC68q1z9YK ICovCmNsYXNzIEZhc3RFbnRpdGllcyBleHRlbmRzIEZhc3REZXRlY3RDaGFyIHsKCiAgICBwcml2 YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdICBCQVNJQ19BUlJBWSAgICAgPSB7IHsgIiZxdW90 OyIsICIzNCIgfSwgeyAiJmFtcDsiLCAiMzgiIH0sIHsgIiZsdDsiLCAiNjAiIH0sCiAgICAgICAg ICAgIHsgIiZndDsiLCAiNjIiIH0sICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgcHJpdmF0 ZSBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSAgQVBPU19BUlJBWSAgICAgID0geyB7ICImYXBvczsi LCAiMzkiIH0sIH07CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdICBJU084ODU5 XzFfQVJSQVkgPSB7IHsgIiZuYnNwOyIsICIxNjAiIH0sIHsgIiZpZXhjbDsiLCAiMTYxIiB9LAog ICAgICAgICAgICB7ICImY2VudDsiLCAiMTYyIiB9LCB7ICImcG91bmQ7IiwgIjE2MyIgfSwgeyAi JmN1cnJlbjsiLCAiMTY0IiB9LCB7ICImeWVuOyIsICIxNjUiIH0sCiAgICAgICAgICAgIHsgIiZi cnZiYXI7IiwgIjE2NiIgfSwgeyAiJnNlY3Q7IiwgIjE2NyIgfSwgeyAiJnVtbDsiLCAiMTY4IiB9 LCB7ICImY29weTsiLCAiMTY5IiB9LCB7ICImb3JkZjsiLCAiMTcwIiB9LAogICAgICAgICAgICB7 ICImbGFxdW87IiwgIjE3MSIgfSwgeyAiJm5vdDsiLCAiMTcyIiB9LCB7ICImc2h5OyIsICIxNzMi IH0sIHsgIiZyZWc7IiwgIjE3NCIgfSwgeyAiJm1hY3I7IiwgIjE3NSIgfSwKICAgICAgICAgICAg eyAiJmRlZzsiLCAiMTc2IiB9LCB7ICImcGx1c21uOyIsICIxNzciIH0sIHsgIiZzdXAyOyIsICIx NzgiIH0sIHsgIiZzdXAzOyIsICIxNzkiIH0sIHsgIiZhY3V0ZTsiLCAiMTgwIiB9LAogICAgICAg ICAgICB7ICImbWljcm87IiwgIjE4MSIgfSwgeyAiJnBhcmE7IiwgIjE4MiIgfSwgeyAiJm1pZGRv dDsiLCAiMTgzIiB9LCB7ICImY2VkaWw7IiwgIjE4NCIgfSwKICAgICAgICAgICAgeyAiJnN1cDE7 IiwgIjE4NSIgfSwgeyAiJm9yZG07IiwgIjE4NiIgfSwgeyAiJnJhcXVvOyIsICIxODciIH0sIHsg IiZmcmFjMTQ7IiwgIjE4OCIgfSwKICAgICAgICAgICAgeyAiJmZyYWMxMjsiLCAiMTg5IiB9LCB7 ICImZnJhYzM0OyIsICIxOTAiIH0sIHsgIiZpcXVlc3Q7IiwgIjE5MSIgfSwgeyAiJkFncmF2ZTsi LCAiMTkyIiB9LAogICAgICAgICAgICB7ICImQWFjdXRlOyIsICIxOTMiIH0sIHsgIiZBY2lyYzsi LCAiMTk0IiB9LCB7ICImQXRpbGRlOyIsICIxOTUiIH0sIHsgIiZBdW1sOyIsICIxOTYiIH0sCiAg ICAgICAgICAgIHsgIiZBcmluZzsiLCAiMTk3IiB9LCB7ICImQUVsaWc7IiwgIjE5OCIgfSwgeyAi JkNjZWRpbDsiLCAiMTk5IiB9LCB7ICImRWdyYXZlOyIsICIyMDAiIH0sCiAgICAgICAgICAgIHsg IiZFYWN1dGU7IiwgIjIwMSIgfSwgeyAiJkVjaXJjOyIsICIyMDIiIH0sIHsgIiZFdW1sOyIsICIy MDMiIH0sIHsgIiZJZ3JhdmU7IiwgIjIwNCIgfSwKICAgICAgICAgICAgeyAiJklhY3V0ZTsiLCAi MjA1IiB9LCB7ICImSWNpcmM7IiwgIjIwNiIgfSwgeyAiJkl1bWw7IiwgIjIwNyIgfSwgeyAiJkVU SDsiLCAiMjA4IiB9LAogICAgICAgICAgICB7ICImTnRpbGRlOyIsICIyMDkiIH0sIHsgIiZPZ3Jh dmU7IiwgIjIxMCIgfSwgeyAiJk9hY3V0ZTsiLCAiMjExIiB9LCB7ICImT2NpcmM7IiwgIjIxMiIg fSwKICAgICAgICAgICAgeyAiJk90aWxkZTsiLCAiMjEzIiB9LCB7ICImT3VtbDsiLCAiMjE0IiB9 LCB7ICImdGltZXM7IiwgIjIxNSIgfSwgeyAiJk9zbGFzaDsiLCAiMjE2IiB9LAogICAgICAgICAg ICB7ICImVWdyYXZlOyIsICIyMTciIH0sIHsgIiZVYWN1dGU7IiwgIjIxOCIgfSwgeyAiJlVjaXJj OyIsICIyMTkiIH0sIHsgIiZVdW1sOyIsICIyMjAiIH0sCiAgICAgICAgICAgIHsgIiZZYWN1dGU7 IiwgIjIyMSIgfSwgeyAiJlRIT1JOOyIsICIyMjIiIH0sIHsgIiZzemxpZzsiLCAiMjIzIiB9LCB7 ICImYWdyYXZlOyIsICIyMjQiIH0sCiAgICAgICAgICAgIHsgIiZhYWN1dGU7IiwgIjIyNSIgfSwg eyAiJmFjaXJjOyIsICIyMjYiIH0sIHsgIiZhdGlsZGU7IiwgIjIyNyIgfSwgeyAiJmF1bWw7Iiwg IjIyOCIgfSwKICAgICAgICAgICAgeyAiJmFyaW5nOyIsICIyMjkiIH0sIHsgIiZhZWxpZzsiLCAi MjMwIiB9LCB7ICImY2NlZGlsOyIsICIyMzEiIH0sIHsgIiZlZ3JhdmU7IiwgIjIzMiIgfSwKICAg ICAgICAgICAgeyAiJmVhY3V0ZTsiLCAiMjMzIiB9LCB7ICImZWNpcmM7IiwgIjIzNCIgfSwgeyAi JmV1bWw7IiwgIjIzNSIgfSwgeyAiJmlncmF2ZTsiLCAiMjM2IiB9LAogICAgICAgICAgICB7ICIm aWFjdXRlOyIsICIyMzciIH0sIHsgIiZpY2lyYzsiLCAiMjM4IiB9LCB7ICImaXVtbDsiLCAiMjM5 IiB9LCB7ICImZXRoOyIsICIyNDAiIH0sCiAgICAgICAgICAgIHsgIiZudGlsZGU7IiwgIjI0MSIg fSwgeyAiJm9ncmF2ZTsiLCAiMjQyIiB9LCB7ICImb2FjdXRlOyIsICIyNDMiIH0sIHsgIiZvY2ly YzsiLCAiMjQ0IiB9LAogICAgICAgICAgICB7ICImb3RpbGRlOyIsICIyNDUiIH0sIHsgIiZvdW1s OyIsICIyNDYiIH0sIHsgIiZkaXZpZGU7IiwgIjI0NyIgfSwgeyAiJm9zbGFzaDsiLCAiMjQ4IiB9 LAogICAgICAgICAgICB7ICImdWdyYXZlOyIsICIyNDkiIH0sIHsgIiZ1YWN1dGU7IiwgIjI1MCIg fSwgeyAiJnVjaXJjOyIsICIyNTEiIH0sIHsgIiZ1dW1sOyIsICIyNTIiIH0sCiAgICAgICAgICAg IHsgIiZ5YWN1dGU7IiwgIjI1MyIgfSwgeyAiJnRob3JuOyIsICIyNTQiIH0sIHsgIiZ5dW1sOyIs ICIyNTUiIH0sIH07CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdICBIVE1MNDBf QVJSQVkgICAgPSB7IHsgIiZmbm9mOyIsICI0MDIiIH0sIHsgIiZBbHBoYTsiLCAiOTEzIiB9LAog ICAgICAgICAgICB7ICImQmV0YTsiLCAiOTE0IiB9LCB7ICImR2FtbWE7IiwgIjkxNSIgfSwgeyAi JkRlbHRhOyIsICI5MTYiIH0sIHsgIiZFcHNpbG9uOyIsICI5MTciIH0sCiAgICAgICAgICAgIHsg IiZaZXRhOyIsICI5MTgiIH0sIHsgIiZFdGE7IiwgIjkxOSIgfSwgeyAiJlRoZXRhOyIsICI5MjAi IH0sIHsgIiZJb3RhOyIsICI5MjEiIH0sIHsgIiZLYXBwYTsiLCAiOTIyIiB9LAogICAgICAgICAg ICB7ICImTGFtYmRhOyIsICI5MjMiIH0sIHsgIiZNdTsiLCAiOTI0IiB9LCB7ICImTnU7IiwgIjky NSIgfSwgeyAiJlhpOyIsICI5MjYiIH0sIHsgIiZPbWljcm9uOyIsICI5MjciIH0sCiAgICAgICAg ICAgIHsgIiZQaTsiLCAiOTI4IiB9LCB7ICImUmhvOyIsICI5MjkiIH0sCgogICAgICAgICAgICB7 ICImU2lnbWE7IiwgIjkzMSIgfSwgeyAiJlRhdTsiLCAiOTMyIiB9LCB7ICImVXBzaWxvbjsiLCAi OTMzIiB9LCB7ICImUGhpOyIsICI5MzQiIH0sIHsgIiZDaGk7IiwgIjkzNSIgfSwKICAgICAgICAg ICAgeyAiJlBzaTsiLCAiOTM2IiB9LCB7ICImT21lZ2E7IiwgIjkzNyIgfSwgeyAiJmFscGhhOyIs ICI5NDUiIH0sIHsgIiZiZXRhOyIsICI5NDYiIH0sIHsgIiZnYW1tYTsiLCAiOTQ3IiB9LAogICAg ICAgICAgICB7ICImZGVsdGE7IiwgIjk0OCIgfSwgeyAiJmVwc2lsb247IiwgIjk0OSIgfSwgeyAi JnpldGE7IiwgIjk1MCIgfSwgeyAiJmV0YTsiLCAiOTUxIiB9LAogICAgICAgICAgICB7ICImdGhl dGE7IiwgIjk1MiIgfSwgeyAiJmlvdGE7IiwgIjk1MyIgfSwgeyAiJmthcHBhOyIsICI5NTQiIH0s IHsgIiZsYW1iZGE7IiwgIjk1NSIgfSwgeyAiJm11OyIsICI5NTYiIH0sCiAgICAgICAgICAgIHsg IiZudTsiLCAiOTU3IiB9LCB7ICImeGk7IiwgIjk1OCIgfSwgeyAiJm9taWNyb247IiwgIjk1OSIg fSwgeyAiJnBpOyIsICI5NjAiIH0sIHsgIiZyaG87IiwgIjk2MSIgfSwKICAgICAgICAgICAgeyAi JnNpZ21hZjsiLCAiOTYyIiB9LCB7ICImc2lnbWE7IiwgIjk2MyIgfSwgeyAiJnRhdTsiLCAiOTY0 IiB9LCB7ICImdXBzaWxvbjsiLCAiOTY1IiB9LAogICAgICAgICAgICB7ICImcGhpOyIsICI5NjYi IH0sIHsgIiZjaGk7IiwgIjk2NyIgfSwgeyAiJnBzaTsiLCAiOTY4IiB9LCB7ICImb21lZ2E7Iiwg Ijk2OSIgfSwgeyAiJnRoZXRhc3ltOyIsICI5NzciIH0sCiAgICAgICAgICAgIHsgIiZ1cHNpaDsi LCAiOTc4IiB9LCB7ICImcGl2OyIsICI5ODIiIH0sIHsgIiZidWxsOyIsICI4MjI2IiB9LCB7ICIm aGVsbGlwOyIsICI4MjMwIiB9LAogICAgICAgICAgICB7ICImcHJpbWU7IiwgIjgyNDIiIH0sIHsg IiZQcmltZTsiLCAiODI0MyIgfSwgeyAiJm9saW5lOyIsICI4MjU0IiB9LCB7ICImZnJhc2w7Iiwg IjgyNjAiIH0sCiAgICAgICAgICAgIHsgIiZ3ZWllcnA7IiwgIjg0NzIiIH0sIHsgIiZpbWFnZTsi LCAiODQ2NSIgfSwgeyAiJnJlYWw7IiwgIjg0NzYiIH0sIHsgIiZ0cmFkZTsiLCAiODQ4MiIgfSwK ICAgICAgICAgICAgeyAiJmFsZWZzeW07IiwgIjg1MDEiIH0sIHsgIiZsYXJyOyIsICI4NTkyIiB9 LCB7ICImdWFycjsiLCAiODU5MyIgfSwgeyAiJnJhcnI7IiwgIjg1OTQiIH0sCiAgICAgICAgICAg IHsgIiZkYXJyOyIsICI4NTk1IiB9LCB7ICImaGFycjsiLCAiODU5NiIgfSwgeyAiJmNyYXJyOyIs ICI4NjI5IiB9LCB7ICImbEFycjsiLCAiODY1NiIgfSwKICAgICAgICAgICAgeyAiJnVBcnI7Iiwg Ijg2NTciIH0sIHsgIiZyQXJyOyIsICI4NjU4IiB9LCB7ICImZEFycjsiLCAiODY1OSIgfSwgeyAi JmhBcnI7IiwgIjg2NjAiIH0sCiAgICAgICAgICAgIHsgIiZmb3JhbGw7IiwgIjg3MDQiIH0sIHsg IiZwYXJ0OyIsICI4NzA2IiB9LCB7ICImZXhpc3Q7IiwgIjg3MDciIH0sIHsgIiZlbXB0eTsiLCAi ODcwOSIgfSwKICAgICAgICAgICAgeyAiJm5hYmxhOyIsICI4NzExIiB9LCB7ICImaXNpbjsiLCAi ODcxMiIgfSwgeyAiJm5vdGluOyIsICI4NzEzIiB9LCB7ICImbmk7IiwgIjg3MTUiIH0sCiAgICAg ICAgICAgIHsgIiZwcm9kOyIsICI4NzE5IiB9LCB7ICImc3VtOyIsICI4NzIxIiB9LCB7ICImbWlu dXM7IiwgIjg3MjIiIH0sIHsgIiZsb3dhc3Q7IiwgIjg3MjciIH0sCiAgICAgICAgICAgIHsgIiZy YWRpYzsiLCAiODczMCIgfSwgeyAiJnByb3A7IiwgIjg3MzMiIH0sIHsgIiZpbmZpbjsiLCAiODcz NCIgfSwgeyAiJmFuZzsiLCAiODczNiIgfSwKICAgICAgICAgICAgeyAiJmFuZDsiLCAiODc0MyIg fSwgeyAiJm9yOyIsICI4NzQ0IiB9LCB7ICImY2FwOyIsICI4NzQ1IiB9LCB7ICImY3VwOyIsICI4 NzQ2IiB9LCB7ICImaW50OyIsICI4NzQ3IiB9LAogICAgICAgICAgICB7ICImdGhlcmU0OyIsICI4 NzU2IiB9LCB7ICImc2ltOyIsICI4NzY0IiB9LCB7ICImY29uZzsiLCAiODc3MyIgfSwgeyAiJmFz eW1wOyIsICI4Nzc2IiB9LAogICAgICAgICAgICB7ICImbmU7IiwgIjg4MDAiIH0sIHsgIiZlcXVp djsiLCAiODgwMSIgfSwgeyAiJmxlOyIsICI4ODA0IiB9LCB7ICImZ2U7IiwgIjg4MDUiIH0sIHsg IiZzdWI7IiwgIjg4MzQiIH0sCiAgICAgICAgICAgIHsgIiZzdXA7IiwgIjg4MzUiIH0sIHsgIiZz dWJlOyIsICI4ODM4IiB9LCB7ICImc3VwZTsiLCAiODgzOSIgfSwgeyAiJm9wbHVzOyIsICI4ODUz IiB9LAogICAgICAgICAgICB7ICImb3RpbWVzOyIsICI4ODU1IiB9LCB7ICImcGVycDsiLCAiODg2 OSIgfSwgeyAiJnNkb3Q7IiwgIjg5MDEiIH0sIHsgIiZsY2VpbDsiLCAiODk2OCIgfSwKICAgICAg ICAgICAgeyAiJnJjZWlsOyIsICI4OTY5IiB9LCB7ICImbGZsb29yOyIsICI4OTcwIiB9LCB7ICIm cmZsb29yOyIsICI4OTcxIiB9LCB7ICImbGFuZzsiLCAiOTAwMSIgfSwKICAgICAgICAgICAgeyAi JnJhbmc7IiwgIjkwMDIiIH0sIHsgIiZsb3o7IiwgIjk2NzQiIH0sIHsgIiZzcGFkZXM7IiwgIjk4 MjQiIH0sIHsgIiZjbHViczsiLCAiOTgyNyIgfSwKICAgICAgICAgICAgeyAiJmhlYXJ0czsiLCAi OTgyOSIgfSwgeyAiJmRpYW1zOyIsICI5ODMwIiB9LCB7ICImT0VsaWc7IiwgIjMzOCIgfSwgeyAi Jm9lbGlnOyIsICIzMzkiIH0sCiAgICAgICAgICAgIHsgIiZTY2Fyb247IiwgIjM1MiIgfSwgeyAi JnNjYXJvbjsiLCAiMzUzIiB9LCB7ICImWXVtbDsiLCAiMzc2IiB9LCB7ICImY2lyYzsiLCAiNzEw IiB9LAogICAgICAgICAgICB7ICImdGlsZGU7IiwgIjczMiIgfSwgeyAiJmVuc3A7IiwgIjgxOTQi IH0sIHsgIiZlbXNwOyIsICI4MTk1IiB9LCB7ICImdGhpbnNwOyIsICI4MjAxIiB9LAogICAgICAg ICAgICB7ICImenduajsiLCAiODIwNCIgfSwgeyAiJnp3ajsiLCAiODIwNSIgfSwgeyAiJmxybTsi LCAiODIwNiIgfSwgeyAiJnJsbTsiLCAiODIwNyIgfSwgeyAiJm5kYXNoOyIsICI4MjExIiB9LAog ICAgICAgICAgICB7ICImbWRhc2g7IiwgIjgyMTIiIH0sIHsgIiZsc3F1bzsiLCAiODIxNiIgfSwg eyAiJnJzcXVvOyIsICI4MjE3IiB9LCB7ICImc2JxdW87IiwgIjgyMTgiIH0sCiAgICAgICAgICAg IHsgIiZsZHF1bzsiLCAiODIyMCIgfSwgeyAiJnJkcXVvOyIsICI4MjIxIiB9LCB7ICImYmRxdW87 IiwgIjgyMjIiIH0sIHsgIiZkYWdnZXI7IiwgIjgyMjQiIH0sCiAgICAgICAgICAgIHsgIiZEYWdn ZXI7IiwgIjgyMjUiIH0sIHsgIiZwZXJtaWw7IiwgIjgyNDAiIH0sIHsgIiZsc2FxdW87IiwgIjgy NDkiIH0sIHsgIiZyc2FxdW87IiwgIjgyNTAiIH0sCiAgICAgICAgICAgIHsgIiZldXJvOyIsICI4 MzY0IiB9LCAgICAgICAgICAgICAgICAgICB9OwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBGYXN0 RW50aXRpZXMgWE1MOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBGYXN0RW50aXRpZXMgSFRNTDQw OwoKICAgIHN0YXRpYyB7CiAgICAgICAgWE1MID0gbmV3IEZhc3RFbnRpdGllcygpOwogICAgICAg IFhNTC5hZGRFbnRpdGllcyhCQVNJQ19BUlJBWSk7CiAgICAgICAgWE1MLmFkZEVudGl0aWVzKEFQ T1NfQVJSQVkpOwogICAgfQoKICAgIHN0YXRpYyB7CiAgICAgICAgSFRNTDQwID0gbmV3IEZhc3RF bnRpdGllcygpOwogICAgICAgIEhUTUw0MC5hZGRFbnRpdGllcyhCQVNJQ19BUlJBWSk7CiAgICAg ICAgSFRNTDQwLmFkZEVudGl0aWVzKElTTzg4NTlfMV9BUlJBWSk7CiAgICAgICAgSFRNTDQwLmFk ZEVudGl0aWVzKEhUTUw0MF9BUlJBWSk7CiAgICB9CgogICAgcHVibGljIHZvaWQgYWRkRW50aXRp ZXMoU3RyaW5nW11bXSBlbnRpdHlBcnJheSkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg ZW50aXR5QXJyYXkubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpIElu dGVnZXIucGFyc2VJbnQoZW50aXR5QXJyYXlbaV1bMV0pOwogICAgICAgICAgICBhZGRFbnRpdHko YywgZW50aXR5QXJyYXlbaV1bMF0pOwogICAgICAgICAgICB0aGlzLmFkZFRyYW5zZmVyQ2hhcihj KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiA8cHJlPgogICAgICog1/bBy7y4uPbT 0MvZtsi1xLSmwO0sINTauty24Mfpv/bPwqOsv8nE3MzhuN+jsaOwsbbS1MnPtcTQ1MTco6yhodLU vLC92tS8srvJ2cTatObKudPDoaMKICAgICAqIDEut7W72L3hufu4+b7dyrG68reiyfrBy7Hgwuu9 +NDQuMS9+KOsoaHI57n7w7vT0Leiyfqx4MLro6zEx8O01rG907e1u9jUrcC0tcRzdHIuCiAgICAg KiAyLr/sy9m87LLpyse38dKqvfjQ0NeqwusKICAgICAqIDMuyrnTw7/sy9my6bHto6yhobbUMC0y NTW1xNfWt/u9+NDQv+zL2bLp1dIKICAgICAqIDwvcHJlPgogICAgICogCiAgICAgKiBAcGFyYW0g c3RyCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgZXNjYXBlKFN0cmlu ZyBzdHIpIHsKICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51 bGw7CiAgICAgICAgfQogICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbnVsbDsKICAgICAg ICBpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwogICAgICAgIGNoYXIgY2g7CiAgICAgICAgY2hhcltd IGVudGl0eU5hbWU7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAg ICAgICAgICBjaCA9IHN0ci5jaGFyQXQoaSk7CiAgICAgICAgICAgIGVudGl0eU5hbWUgPSBnZXRF bnRpdHkoY2gpOwogICAgICAgICAgICBpZiAoZW50aXR5TmFtZSA9PSBudWxsKSB7CiAgICAgICAg ICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBidWZmZXIu YXBwZW5kKGNoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg ICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGJ1ZmZl ciA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0ci5sZW5ndGgoKSA8PCAxKTsKICAgICAgICAgICAgICAg ICAgICBidWZmZXIuYXBwZW5kKHN0ciwgMCwgaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgICBidWZmZXIuYXBwZW5kKGVudGl0eU5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAg fQogICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gYnVmZmVy LnRvU3RyaW5nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAg ICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlSmF2YVNjcmlwdChT dHJpbmcgc3RyKSB7CgogICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1 cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKICAg ICAgICBXcml0ZXIgb3V0ID0gbmV3IFN0cmluZ1dyaXRlcihsZW5ndGggPDwgMSk7CiAgICAgICAg dHJ5IHsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAg ICAgICAgICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7CgogICAgICAgICAgICAgICAgaWYg KGNoIDwgMzIpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAg ICAgICAgICAgICAgIGNhc2UgJ1xiJzoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQu d3JpdGUoJ1xcJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCdiJyk7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAg ICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgnXFwn KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgnbicpOwogICAgICAgICAg ICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdc dCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJ1xcJyk7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJ3QnKTsKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXGYnOgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCdcXCcpOwogICAgICAgICAgICAgICAgICAg ICAgICAgICAgb3V0LndyaXRlKCdmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVh azsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG91dC53cml0ZSgnXFwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91 dC53cml0ZSgncicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAg ICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg KGNoID4gMHhmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJc XHUwMCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKS50b1VwcGVyQ2FzZSgpKTsKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgb3V0LndyaXRlKCJcXHUwMDAiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkudG9VcHBlckNh c2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAg ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0g ZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgICAg ICAgICAgICBjYXNlICdcJyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUo J1xcJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJ1wnJyk7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2Fz ZSAnIic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJ1xcJyk7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJyInKTsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJ1xcJyk7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICBvdXQud3JpdGUoJ1xcJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBi cmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG91dC53cml0ZShjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVh azsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0K ICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIC8vIGltcG9zc2li bGUKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dC50b1N0cmluZygpOwogICAgfQoKfQoKY2xh c3MgRmFzdERldGVjdENoYXIgewoKICAgIHByaXZhdGUgTWFwPENoYXJhY3RlciwgY2hhcltdPiBt YXAgICAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPENoYXJhY3RlciwgY2hhcltdPigpOwogICAg cHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgIExPT0tVUF9UQUJMRV9TSVpFID0gMjU2Owog ICAgcHJpdmF0ZSBjaGFyW11bXSAgICAgICAgICAgICAgIGxvb2t1cFRhYmxlICAgICAgID0gbmV3 IGNoYXJbTE9PS1VQX1RBQkxFX1NJWkVdW107CiAgICBCaXRTZXQgICAgICAgICAgICAgICAgICAg ICAgICAgbWFza1NldCAgICAgICAgICAgPSBuZXcgQml0U2V0KDEgPDwgMTYpOwoKICAgIHB1Ymxp YyB2b2lkIGFkZEVudGl0eShjaGFyIGNoYXJWYWx1ZSwgU3RyaW5nIGVudGlyeU5hbWUpIHsKICAg ICAgICBpZiAoY2hhclZhbHVlID4gLTEgJiYgY2hhclZhbHVlIDwgTE9PS1VQX1RBQkxFX1NJWkUp IHsKICAgICAgICAgICAgbG9va3VwVGFibGVbY2hhclZhbHVlXSA9IGVudGlyeU5hbWUudG9DaGFy QXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgbWFwLnB1dChjaGFyVmFsdWUsIGVudGlyeU5hbWUu dG9DaGFyQXJyYXkoKSk7CiAgICB9CgogICAgcHVibGljIGNoYXJbXSBnZXRFbnRpdHkoY2hhciBj aGFyVmFsdWUpIHsKICAgICAgICBpZiAoY2hhclZhbHVlIDwgTE9PS1VQX1RBQkxFX1NJWkUpIHsK ICAgICAgICAgICAgcmV0dXJuIGxvb2t1cFRhYmxlW2NoYXJWYWx1ZV07CiAgICAgICAgfQogICAg ICAgIHJldHVybiAobWFza1NldC5nZXQoY2hhclZhbHVlKSA/IG1hcC5nZXQoY2hhclZhbHVlKSA6 IG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICog1Pa809K7uPbM+NS919a3+wogICAgICogCiAg ICAgKiBAcGFyYW0gYwogICAgICovCiAgICBwdWJsaWMgdm9pZCBhZGRUcmFuc2ZlckNoYXIoY2hh ciBjKSB7CiAgICAgICAgbWFza1NldC5zZXQoYyk7CiAgICB9Cn0K --000e0cd31144dac37a046238b086 Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org For additional commands, e-mail: dev-help@velocity.apache.org --000e0cd31144dac37a046238b086--