From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13135 invoked by alias); 19 Feb 2003 04:16:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 13109 invoked by uid 71); 19 Feb 2003 04:16:00 -0000 Resent-Date: 19 Feb 2003 04:16:00 -0000 Resent-Message-ID: <20030219041600.13106.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, aaronw@net.com Received: (qmail 12878 invoked by uid 48); 19 Feb 2003 04:14:19 -0000 Message-Id: <20030219041419.12877.qmail@sources.redhat.com> Date: Wed, 19 Feb 2003 04:16:00 -0000 From: aaronw@net.com Reply-To: aaronw@net.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: optimization/9752: gcc generates bad code when -fgcse or -frerun-cse-after-loop used X-SW-Source: 2003-02/txt/msg00875.txt.bz2 List-Id: >Number: 9752 >Category: optimization >Synopsis: gcc generates bad code when -fgcse or -frerun-cse-after-loop used >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Wed Feb 19 04:16:00 UTC 2003 >Closed-Date: >Last-Modified: >Originator: Aaron Williams >Release: g++ 3.2.2 >Organization: >Environment: Sparc Sun Solaris 2.7, 32-bit environment >Description: When I compile ui.cpp with -O2 as part of KDE in kdeaddons-3.1/noatun-plugins/tippercanoe/ I get link errors: ld: warning: relocation error: R_SPARC_32: file ui.o: symbol .LLC23: external symbolic relocation against non-allocatable section .stab; cannot be processed at runtime: relocation ignored ld: warning: relocation error: R_SPARC_32: file ui.o: symbol .LLC86: external symbolic relocation against non-allocatable section .stab; cannot be processed at runtime: relocation ignored Undefined first referenced symbol in file .LLC86 ui.o .LLC23 ui.o ld: fatal: Symbol referencing errors. No output written to noatuntippecanoe.bin collect2: ld returned 1 exit status *** Error code 1 According to the .s file, the following parameters were used for compiling: ! GNU C++ version 3.2.2 (sparc-sun-solaris2.7) ! compiled by GNU C version 2.95.3 20010315 (release). ! options passed: -I. -I. -I../.. -I/tools/kde/3.1gcc/include ! -I/tools/qt/qt-3.1.1gcc/include -I/tools/qt/share/include ! -I/tools/qt/share/include -I/tools/qt/share/include/SDL ! -I/tools/qt/share/include -iprefix -D__GNUC__=3 -D__GNUC_MINOR__=2 ! -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -Dsparc -Dsun -Dunix ! -D__svr4__ -D__SVR4 -D__PRAGMA_REDEFINE_EXTNAME -D__sparc__ -D__sun__ ! -D__unix__ -D__svr4__ -D__SVR4 -D__PRAGMA_REDEFINE_EXTNAME -D__sparc ! -D__sun -D__unix -Asystem=unix -Asystem=svr4 -D__OPTIMIZE__ ! -D__STDC_HOSTED__=1 -D_XOPEN_SOURCE=500 -D_LARGEFILE_SOURCE=1 ! -D_LARGEFILE64_SOURCE=1 -D__EXTENSIONS__ -D__SIZE_TYPE__=unsigned int ! -D__PTRDIFF_TYPE__=int -D__WCHAR_TYPE__=long int -D__WINT_TYPE__=long int ! -D__GCC_NEW_VARARGS__ -Acpu=sparc -Amachine=sparc -DHAVE_CONFIG_H ! -D_REENTRANT -DQT_THREAD_SUPPORT -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS ! -DUSE_SOLARIS -DSVR4 -DNDEBUG -DNO_DEBUG -DQT_CLEAN_NAMESPACE ! -DQT_NO_COMPAT -DQT_NO_ASCII_CAST -D__GNUG__=3 -D__DEPRECATED -g -O2 ! -Wnon-virtual-dtor -Wno-long-long -Wundef -Wall -W -Wpointer-arith ! -Wmissing-prototypes -Wwrite-strings -pedantic -fno-exceptions ! -fno-check-new -fverbose-asm ! options enabled: -fdefer-pop -fomit-frame-pointer ! -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks ! -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole ! -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves ! -fpcc-struct-return -fdelayed-branch -fgcse -fgcse-lm -fgcse-sm ! -frerun-cse-after-loop -frerun-loop-opt -fdelete-null-pointer-checks ! -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec ! -fbranch-count-reg -freorder-blocks -fcprop-registers -fcommon ! -fverbose-asm -fgnu-linker -fregmove -foptimize-register-move ! -fargument-alias -fstrict-aliasing -fmerge-constants -fident -fpeephole2 ! -fguess-branch-probability -fmath-errno -ftrapping-math If instead of -O2 I use -O1 and all of the aboce -fxxx options except -fgcse and -frerun-cse-after-loop then everything links fine. Looking at the assembly code, I see: .LLC11: .asciz "mode" .align 8 .LLC12: .asciz "diamonds" .align 8 .LLC13: .asciz "brightness" .align 8 .LLC15: .asciz "starsize" .align 8 .LLC17: .asciz "FGRed" .align 8 .LLC19: .asciz "FGgreen" .align 8 .LLC21: .asciz "BGRed" .align 8 .LLC22: .asciz "BGGreen" .align 8 .LLC18: .long 0 .long 0 .align 8 .LLC20: .long 1072693248 .long 0 .align 8 .LLC24: .long 1073086464 .long 0 .align 8 .LLC25: .long 1068708659 .long 858993459 .align 8 Searching for .LLC23 I see the following: ... .stabs "_vm:r(0,1)",64,0,177,10 .stabs "_x:V(0,15)",38,0,177,.LLC23 .stabs "_width:r(0,15)",64,0,177,34 .stabn 192,0,0,.LLBB24-_ZN9InterfaceC2Ev .stabn 224,0,0,.LLBE24-_ZN9InterfaceC2Ev .stabs "_am:r(0,1)",64,0,177,16 .stabs "_vm:r(0,1)",64,0,177,10 .stabs "_x:V(0,15)",38,0,177,.LLC23 .stabs "_width:r(0,15)",64,0,177,34 .stabn 192,0,0,.LLBB27-_ZN9InterfaceC2Ev .stabn 224,0,0,.LLBE27-_ZN9InterfaceC2Ev .stabs "_am:r(0,1)",64,0,177,16 .stabs "_vm:r(0,1)",64,0,177,10 .stabs "_x:V(0,15)",38,0,177,.LLC23 .stabs "_width:r(0,15)",64,0,177,34 .stabn 192,0,0,.LLBB29-_ZN9InterfaceC2Ev .stabn 224,0,0,.LLBE29-_ZN9InterfaceC2Ev .stabs "_am:r(0,1)",64,0,177,16 .stabs "_vm:r(0,1)",64,0,177,10 .stabs "_x:V(0,15)",38,0,177,.LLC23 .stabs "_width:r(0,15)",64,0,177,34 .stabn 192,0,0,.LLBB32-_ZN9InterfaceC2Ev .stabn 224,0,0,.LLBE32-_ZN9InterfaceC2Ev .stabs "_am:r(0,1)",64,0,177,16 .stabs "_vm:r(0,1)",64,0,177,10 .stabs "_x:V(0,15)",38,0,177,.LLC23 .stabs "_width:r(0,15)",64,0,177,34 .stabn 192,0,0,.LLBB34-_ZN9InterfaceC2Ev ... and .LLC86 I see: .stabs "_x:V(0,15)",38,0,177,.LLC86 .stabs "_width:r(0,15)",64,0,177,34 .stabn 192,0,0,.LLBB201-_ZN9InterfaceC1Ev .stabn 224,0,0,.LLBE201-_ZN9InterfaceC1Ev .stabs "_am:r(0,1)",64,0,177,16 .stabs "_vm:r(0,1)",64,0,177,10 .stabs "_x:V(0,15)",38,0,177,.LLC86 .stabs "_width:r(0,15)",64,0,177,34 .stabn 192,0,0,.LLBB204-_ZN9InterfaceC1Ev .stabn 224,0,0,.LLBE204-_ZN9InterfaceC1Ev .stabs "_am:r(0,1)",64,0,177,16 .stabs "_vm:r(0,1)",64,0,177,10 .stabs "_x:V(0,15)",38,0,177,.LLC86 .stabs "_width:r(0,15)",64,0,177,34 .stabn 192,0,0,.LLBB206-_ZN9InterfaceC1Ev .stabn 224,0,0,.LLBE206-_ZN9InterfaceC1Ev .stabs "_am:r(0,1)",64,0,177,16 .stabs "_vm:r(0,1)",64,0,177,10 .stabs "_x:V(0,15)",38,0,177,.LLC86 .stabs "_width:r(0,15)",64,0,177,34 .stabn 192,0,0,.LLBB209-_ZN9InterfaceC1Ev .stabn 224,0,0,.LLBE209-_ZN9InterfaceC1Ev .stabs "_am:r(0,1)",64,0,177,16 .stabs "_vm:r(0,1)",64,0,177,10 .stabs "_x:V(0,15)",38,0,177,.LLC86 The section of the .S file where I guess .LLC86 should be looks like: .LLC84: .long 0 .long 0 .align 8 .LLC85: .long 1072693248 .long 0 .align 8 .LLC87: .long 1073086464 .long 0 .align 8 .LLC88: .long 1068708659 .long 858993459 .align 8 .LLC89: .long 1068079513 .long -1717986918 .align 8 Let me know if more information is needed. All of the files were taken from KDE 3.1 kdeaddons. >How-To-Repeat: Compile kdeaddons-3.1/noatun-plugins/tippercanoe/ui.cpp and attempt to link. >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: text/x-c++src; name="ui.cpp" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="ui.cpp" I2luY2x1ZGUgImZvbnQuaCIKI2luY2x1ZGUgImljb25zLmgiCiNpbmNsdWRlICJzeW5hLmgiCiNp bmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGtjb25maWcuaD4K CiNkZWZpbmUgb3V0cHV0IGNvcmUtPm91dHB1dCgpCgpzdGF0aWMgdm9pZCBwdXRDaGFyKHVuc2ln bmVkIGNoYXIgY2hhcmFjdGVyLGludCB4LGludCB5LGludCByZWQsaW50IGJsdWUpCnsKCXVuc2ln bmVkIHNob3J0ICpwdHIgPSAoKHVuc2lnbmVkIHNob3J0ICopb3V0cHV0KSArIHggKyB5KmNvcmUt Pm91dFdpZHRoOwoJdW5zaWduZWQgc2hvcnQgIHB1dCA9IChibHVlPDw4KStyZWQ7CglpbnQgaSxq OwoJZm9yKGk9MDtpPDg7aSsrLHB0ciArPSBjb3JlLT5vdXRXaWR0aC04KQoJCWZvcihqPTA7ajw4 O2orKyxwdHIrKykKCQkJaWYgKGZvbnRbY2hhcmFjdGVyKjgraV0gJiAoMTI4Pj5qKSkKCQkJCSpw dHIgPSBwdXQ7Cn0KCnZvaWQgSW50ZXJmYWNlOjpwdXRTdHJpbmcoY2hhciAqc3RyaW5nLGludCB4 LGludCB5LGludCByZWQsaW50IGJsdWUpCnsKCWlmICh4IDwgMCB8fCB5IDwgMCB8fCB5ID49IGNv cmUtPm91dEhlaWdodC04KQoJCXJldHVybjsKCWZvcig7KnN0cmluZyAmJiB4IDw9IGNvcmUtPm91 dFdpZHRoLTg7c3RyaW5nKysseCs9OCkKCQlwdXRDaGFyKCh1bnNpZ25lZCBjaGFyKSgqc3RyaW5n KSx4LHkscmVkLGJsdWUpOwp9Cgp2b2lkIFVJT2JqZWN0OjpjaGFuZ2VkKCkKewp9CgpzdHJ1Y3Qg QnV0dG9uIDogcHVibGljIFVJT2JqZWN0CnsKCWludCBpY29uOwoJY2hhciBob3RLZXk7CgoJYm9v bCBwYXNzaXZlLCBicmlnaHQ7CgoJQnV0dG9uKGludCBfYW0saW50IF92bSxkb3VibGUgX3gsZG91 YmxlIF95LAoJCQlkb3VibGUgX3NpemUsaW50IF9pY29uLGNoYXIgX2tleSA9IDAsIAoJCQlib29s IF9wYXNzaXZlID0gZmFsc2UsIGJvb2wgX2JyaWdodCA9IGZhbHNlKQoJewoJCWFjdGl2ZU1hc2sg PSBfYW07IHZpc2libGVNYXNrID0gX3ZtOwoJCXggPSBfeDsgeSA9IF95OyB3aWR0aCA9IGhlaWdo dCA9IF9zaXplOwoJCWljb24gPSBfaWNvbjsgaG90S2V5ID0gX2tleTsgcGFzc2l2ZSA9IF9wYXNz aXZlOyBicmlnaHQgPSBfYnJpZ2h0OwoJfQoKCWludCBnbyhib29sIG1vdXNlRG93bixib29sIG1v dXNlQ2xpY2ssYm9vbCBtb3VzZU92ZXIsCgkJCWRvdWJsZSBfeCwgZG91YmxlIF95LCBkb3VibGUg c2NhbGUsIGNoYXIgJl9ob3RLZXksIGludCAmYWN0aW9uKQoJewoJCSh2b2lkKW1vdXNlRG93bjsK CQkodm9pZClfeDsKCQkodm9pZClfeTsKCQljb3JlLT5wb2x5Z29uRW5naW5lLmljb24oCgkJCQlJ Y29uc1tpY29uXSwKCQkJCShicmlnaHQgPyAweDAyMDIgOiAweDAxMDApLAoJCQkJeCpzY2FsZSx5 KnNjYWxlLHdpZHRoKnNjYWxlLGhlaWdodCpzY2FsZSk7CgoJCWlmIChtb3VzZU92ZXIgJiYgIXBh c3NpdmUpCgkJCWNvcmUtPnBvbHlnb25FbmdpbmUuaWNvbigKCQkJCQlJY29uc1tpY29uXSwKCQkJ CQkweDAwMDIsCgkJCQkJKHgtSWNvbldpZHRoc1tpY29uXSp3aWR0aC8yKSpzY2FsZSwKCQkJCQko eS1oZWlnaHQvMikqc2NhbGUsd2lkdGgqc2NhbGUqMixoZWlnaHQqc2NhbGUqMik7CgoJCWlmICht b3VzZU92ZXIgJiYgbW91c2VDbGljayAmJiAhcGFzc2l2ZSkKCQkJYWN0aW9uID0gaWNvbjsKCgkJ aWYgKG1vdXNlT3ZlciAmJiAhcGFzc2l2ZSAmJiBob3RLZXkpCgkJCV9ob3RLZXkgPSBob3RLZXk7 CgoJCXJldHVybiAwOwoJfQoKCXZvaWQgaGFuZGxlS2V5KGNoYXIga2V5LCBpbnQgJmFjdGlvbikK CXsKCQlpZiAoa2V5ID09IGhvdEtleSAmJiAhcGFzc2l2ZSkKCQkJYWN0aW9uID0gaWNvbjsKCX0K fTsKI2RlZmluZSBCYXJXaWR0aCAwLjEKc3RydWN0IFNsaWRlckJhciA6IHB1YmxpYyBVSU9iamVj dAp7Cglkb3VibGUgKnZhbHVlOwoJY2hhciBsZWZ0S2V5LCByaWdodEtleTsKCgl0eXBlZGVmIHZv aWQgKENvcmU6OipDYWxsYmFjaykoZG91YmxlIHYpOwoJQ2FsbGJhY2sgY2FsbGJhY2s7CgoJU2xp ZGVyQmFyKGludCBfYW0saW50IF92bSxkb3VibGUgX3gsZG91YmxlIF95LAoJCQlkb3VibGUgX3dp ZHRoLGRvdWJsZSBfaGVpZ2h0LCBkb3VibGUgKl92YWx1ZSwKCQkJQ2FsbGJhY2sgX2NhbGxiYWNr LCBjaGFyIF9sZWZ0S2V5LCBjaGFyIF9yaWdodEtleSkKCXsKCQlhY3RpdmVNYXNrID0gX2FtOyB2 aXNpYmxlTWFzayA9IF92bTsKCQl4ID0gX3g7IHkgPSBfeTsgd2lkdGggPSBfd2lkdGg7IGhlaWdo dCA9IF9oZWlnaHQ7CgkJdmFsdWUgPSBfdmFsdWU7IGNhbGxiYWNrID0gX2NhbGxiYWNrOwoJCWxl ZnRLZXkgPSBfbGVmdEtleTsgcmlnaHRLZXkgPSBfcmlnaHRLZXk7Cgl9CgoJaW50IGdvKGJvb2wg bW91c2VEb3duLGJvb2wgbW91c2VDbGljayxib29sIG1vdXNlT3ZlciwKCQkJZG91YmxlIF94LCBk b3VibGUgX3ksIGRvdWJsZSBzY2FsZSwgY2hhciAmX2hvdEtleSwgaW50ICZhY3Rpb24pCgl7CgkJ KHZvaWQpbW91c2VDbGljazsKCQkodm9pZClfeTsKCQkodm9pZClhY3Rpb247CgkJY29yZS0+cG9s eWdvbkVuZ2luZS5pY29uKAoJCQlJY29uc1tCYXJdLAoJCQkweDAxMDAsCgkJCXgqc2NhbGUseSpz Y2FsZSx3aWR0aCpzY2FsZSxoZWlnaHQqc2NhbGUpOwoJCWNvcmUtPnBvbHlnb25FbmdpbmUuaWNv bigKCQkJSWNvbnNbU2xpZGVyXSwKCQkJMHgwMjAwLAoJCQkoeCsqdmFsdWUqd2lkdGgtSWNvbldp ZHRoc1tTbGlkZXJdKmhlaWdodC8yKSpzY2FsZSwKCQkJeSpzY2FsZSxoZWlnaHQqc2NhbGUsaGVp Z2h0KnNjYWxlKTsKCgkJaWYgKG1vdXNlT3ZlcikKCQl7CgkJCWRvdWJsZSBuZXdWYWx1ZSA9IChf eCkvKHdpZHRoKTsKCQkJaWYgKG5ld1ZhbHVlIDwgMC4wKSBuZXdWYWx1ZSA9IDAuMDsKCQkJaWYg KG5ld1ZhbHVlID4gMS4wKSBuZXdWYWx1ZSA9IDEuMDsKCgkJCWNvcmUtPnBvbHlnb25FbmdpbmUu aWNvbigKCQkJCQlJY29uc1tTZWxlY3Rvcl0sCgkJCQkJMHgwMDAyLAoJCQkJCSh4K25ld1ZhbHVl KndpZHRoLUljb25XaWR0aHNbU2VsZWN0b3JdKmhlaWdodC8yKSpzY2FsZSwKCQkJCQl5KnNjYWxl LGhlaWdodCpzY2FsZSxoZWlnaHQqc2NhbGUpOwoKCQkJaWYgKG1vdXNlRG93bikKCQkJewoJCQkJ KnZhbHVlID0gbmV3VmFsdWU7CgoJCQkJaWYgKGNhbGxiYWNrKQoJCQkJCShjb3JlLT4qY2FsbGJh Y2spKCp2YWx1ZSk7CgkJCQljaGFuZ2VkKCk7CgkJCX0KCgkJCWlmIChtb3VzZU92ZXIpCgkJCQlf aG90S2V5ID0gKG5ld1ZhbHVlIDwgKnZhbHVlID8gbGVmdEtleSA6IHJpZ2h0S2V5KTsKCQl9CgoJ CXJldHVybiAwOwoJfQoJdm9pZCBoYW5kbGVLZXkoY2hhciBrZXksIGludCAmYWN0aW9uKQoJewoJ CSh2b2lkKWFjdGlvbjsKCQlpZiAoa2V5ID09IGxlZnRLZXkgfHwga2V5ID09IHJpZ2h0S2V5KQoJ CXsKCQkJaWYgKGtleSA9PSBsZWZ0S2V5KQoJCQl7CgkJCQlpZiAoKnZhbHVlID09IDAuMCkgcmV0 dXJuOwoJCQkJKnZhbHVlIC09IDAuMDU7CgkJCQlpZiAoKnZhbHVlIDwgMC4wKSAqdmFsdWUgPSAw LjA7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZiAoKnZhbHVlID09IDEuMCkgcmV0dXJuOwoJCQkJ KnZhbHVlICs9IDAuMDU7CgkJCQlpZiAoKnZhbHVlID4gMS4wKSAqdmFsdWUgPSAxLjA7CgkJCX0K CgkJCWlmIChjYWxsYmFjaykKCQkJCShjb3JlLT4qY2FsbGJhY2spKCp2YWx1ZSk7CgkJCWNoYW5n ZWQoKTsKCQl9Cgl9Cn07CiN1bmRlZiBCYXJXaWR0aAoKCnN0cnVjdCBQb3BwZXJVcHBlciA6IHB1 YmxpYyBVSU9iamVjdAp7CglpbnQgbWFza0FkZDsKCglQb3BwZXJVcHBlcihpbnQgX2FtLGludCBf dm0sZG91YmxlIF94LGRvdWJsZSBfeSwKCQkJZG91YmxlIF93aWR0aCxkb3VibGUgX2hlaWdodCwg aW50IF9tYXNrQWRkKQoJewoJCWFjdGl2ZU1hc2sgPSBfYW07IHZpc2libGVNYXNrID0gX3ZtOyAK CQl4ID0gX3g7IHkgPSBfeTsgd2lkdGggPSBfd2lkdGg7IGhlaWdodCA9IF9oZWlnaHQ7CgkJbWFz a0FkZCA9IF9tYXNrQWRkOwoJfQoKCWludCBnbyhib29sIG1vdXNlRG93bixib29sIG1vdXNlQ2xp Y2ssIGJvb2wgbW91c2VPdmVyLAoJCQlkb3VibGUgX3gsIGRvdWJsZSBfeSwgZG91YmxlIHNjYWxl LCBjaGFyICZfaG90S2V5LCBpbnQgJmFjdGlvbikKCXsKCQkodm9pZCltb3VzZURvd247CgkJKHZv aWQpbW91c2VDbGljazsKCQkodm9pZClfeDsKCQkodm9pZClfeTsKCQkodm9pZClfaG90S2V5OwoJ CSh2b2lkKWFjdGlvbjsKCQkKCQljb3JlLT5wb2x5Z29uRW5naW5lLmljb24oCgkJCQlJY29uc1tC b3hdLAoJCQkJMHgwMjAwLAoJCQkJeCpzY2FsZSx5KnNjYWxlLHdpZHRoKnNjYWxlLGhlaWdodCpz Y2FsZSk7CgoJCXJldHVybiBtb3VzZU92ZXIgPyBtYXNrQWRkIDogMDsKCX0KCgl2b2lkIGhhbmRs ZUtleShjaGFyIGtleSwgaW50ICZhY3Rpb24pCgl7CgkJKHZvaWQpa2V5OwoJCSh2b2lkKWFjdGlv bjsKCX0KfTsKCnZvaWQgSW50ZXJmYWNlOjpzZXR1cFBhbGV0dGUoKQp7CiNkZWZpbmUgQk9VTkQo eCkgKCh4KSA+IDI1NSA/IDI1NSA6ICh4KSkKI2RlZmluZSBQRUFLSUZZKHgpIGludChCT1VORCgo eCkgLSAoeCkqKDI1NS0oeCkpLzI1NS8yKSkKI2RlZmluZSBNQVgoeCx5KSAoKHgpID4gKHkpID8g KHgpIDogKHkpKQoJaW50IGk7Cgl1bnNpZ25lZCBjaGFyIHBhbGV0dGVbNzY4XTsKCglkb3VibGUg c2NhbGUsIGZnUmVkLCBmZ0dyZWVuLCBmZ0JsdWUsIGJnUmVkLCBiZ0dyZWVuLCBiZ0JsdWU7Cglm Z1JlZCA9IGNvcmUtPmZnUmVkU2xpZGVyOwoJZmdHcmVlbiA9IGNvcmUtPmZnR3JlZW5TbGlkZXI7 CglmZ0JsdWUgPSAxLjAgLSBNQVgoY29yZS0+ZmdSZWRTbGlkZXIsY29yZS0+ZmdHcmVlblNsaWRl cik7CglzY2FsZSA9IE1BWChNQVgoZmdSZWQsZmdHcmVlbiksZmdCbHVlKTsKCWZnUmVkIC89IHNj YWxlOwoJZmdHcmVlbiAvPSBzY2FsZTsKCWZnQmx1ZSAvPSBzY2FsZTsKCgliZ1JlZCA9IGNvcmUt PmJnUmVkU2xpZGVyOwoJYmdHcmVlbiA9IGNvcmUtPmJnR3JlZW5TbGlkZXI7CgliZ0JsdWUgPSAx LjAgLSBNQVgoY29yZS0+YmdSZWRTbGlkZXIsIGNvcmUtPmJnR3JlZW5TbGlkZXIpOwoJc2NhbGUg PSBNQVgoTUFYKGJnUmVkLCBiZ0dyZWVuKSwgYmdCbHVlKTsKCWJnUmVkIC89IHNjYWxlOwoJYmdH cmVlbiAvPSBzY2FsZTsKCWJnQmx1ZSAvPSBzY2FsZTsKCglmb3IoaT0wO2k8MjU2O2krKykKCXsK CQlpbnQgZiA9IGkmMTUsIGIgPSBpLzE2OwoJCXBhbGV0dGVbaSozKzBdID0gUEVBS0lGWShiKmJn UmVkKjE2K2YqZmdSZWQqMTYpOwoJCXBhbGV0dGVbaSozKzFdID0gUEVBS0lGWShiKmJnR3JlZW4q MTYrZipmZ0dyZWVuKjE2KTsKCQlwYWxldHRlW2kqMysyXSA9IFBFQUtJRlkoYipiZ0JsdWUqMTYr ZipmZ0JsdWUqMTYpOwoJfQoJY29yZS0+c2NyZWVuLT5zZXRQYWxldHRlKHBhbGV0dGUpOwojdW5k ZWYgQk9VTkQKI3VuZGVmIFBFQUtJRlkKI3VuZGVmIE1BWAp9CgovL1Zpc2libGUgbWFzawojZGVm aW5lIEFMTCAxCiNkZWZpbmUgQlVUVE9OQkFSIDIKI2RlZmluZSBUUkFDS0JBUiA0CiNkZWZpbmUg RElBTEJBUiA4CiNkZWZpbmUgVk9MVU1FQkFSIDE2CgovL0FjdGl2ZSBtYXNrCi8vI2RlZmluZSBB TEwgMQojZGVmaW5lIFBMQVlJTkcgMgojZGVmaW5lIFBBVVNFRCA0CiNkZWZpbmUgU1RPUFBFRCA4 CiNkZWZpbmUgTk9DRCAzMiAKI2RlZmluZSBPUEVOIDY0IAoKCi8vIFRPRE8gTGF5IHRoaW5ncyBv dXQgd2l0aCBwYXJlbnRzIGFuZCBhIHN0YWNrLCBsaWtlIFFUCkludGVyZmFjZTo6SW50ZXJmYWNl KCkKewoJc3RhdGljIGNvbnN0IGZsb2F0IEljb25TaXplPTAuMjsKCXN0YXRpYyBjb25zdCBmbG9h dCBTbGlkZXJTaXplPTAuMTI1OwoKCXsKCQlLQ29uZmlnIGNvbmZpZygibm9hdHVuL3N5bmFlc2Nv cGUiLCBmYWxzZSwgZmFsc2UsICJkYXRhIik7CgkJY29yZS0+ZmFkZU1vZGU9KFN5bWJvbElEKWNv bmZpZy5yZWFkTnVtRW50cnkoIm1vZGUiLCAoaW50KVN0YXJzKTsKCQljb3JlLT5wb2ludHNBcmVE aWFtb25kcz1jb25maWcucmVhZEJvb2xFbnRyeSgiZGlhbW9uZHMiLCBmYWxzZSk7CgkJY29yZS0+ YnJpZ2h0bmVzc1R3aWRkbGVyPWNvbmZpZy5yZWFkRG91YmxlTnVtRW50cnkoImJyaWdodG5lc3Mi LCAuNCk7CgkJY29yZS0+c3RhclNpemU9Y29uZmlnLnJlYWREb3VibGVOdW1FbnRyeSgic3RhcnNp emUiLCAuMSk7CgkJY29yZS0+ZmdSZWRTbGlkZXI9Y29uZmlnLnJlYWREb3VibGVOdW1FbnRyeSgi RkdSZWQiLCAwLjApOwoJCWNvcmUtPmZnR3JlZW5TbGlkZXI9Y29uZmlnLnJlYWREb3VibGVOdW1F bnRyeSgiRkdncmVlbiIsIDEuMCk7CgkJY29yZS0+YmdSZWRTbGlkZXI9Y29uZmlnLnJlYWREb3Vi bGVOdW1FbnRyeSgiQkdSZWQiLCAwLjApOwoJCWNvcmUtPmJnR3JlZW5TbGlkZXI9Y29uZmlnLnJl YWREb3VibGVOdW1FbnRyeSgiQkdHcmVlbiIsIDAuMCk7Cgl9CgkKCXVpT2JqZWN0cy5zZXRBdXRv RGVsZXRlKHRydWUpOwoKCWRvdWJsZSB4LHk7CgkKCS8vYWRkVUkobmV3IEJ1dHRvbihBTEwsMC4w MjUsMC41MjUsSWNvblNpemUsIDAsICd4JykpOwovLwlhZGRVSShuZXcgUG9wcGVyVXBwZXIoQUxM LEFMTCwwLDAsMC4yNSwwLjI1LCBCVVRUT05CQVIpKTsKLy8JYWRkVUkoc3RhdGVCdXR0b24gPSBu ZXcgQnV0dG9uKEFMTCxBTEwsMC4wNSwwLjAyNSxJY29uU2l6ZSwgMCwgMCwgdHJ1ZSwgZmFsc2Up KTsKCglhZGRVSShuZXcgUG9wcGVyVXBwZXIoQUxMLEJVVFRPTkJBUix4PTAuMjUseT0wLDEuMzc1 LDAuMjUsIEJVVFRPTkJBUikpOwovLwl4ICs9IDAuMTsgeSArPSAwLjAyNTsKCi8vCWFkZFVJKG5l dyBQb3BwZXJVcHBlcihQTEFZSU5HfFBBVVNFRHxTVE9QUEVELCBBTEwsMCwwLjI1LDAuMjUsMC4y NSwgVFJBQ0tCQVIpKTsKLy8JYWRkVUkobmV3IFBvcHBlclVwcGVyKFBMQVlJTkd8UEFVU0VEfFNU T1BQRUQsIFRSQUNLQkFSLHg9MC4yNSx5PTAuMjUsMS4wLDAuNjI1LCBUUkFDS0JBUikpOwovLwl4 ICs9IDAuMTsgeSArPSAwLjE7CgoJYWRkVUkobmV3IFBvcHBlclVwcGVyKEFMTCxBTEwsMCwwLjAs MC4yNSwwLjI1LCBESUFMQkFSKSk7CglhZGRVSShuZXcgQnV0dG9uKEFMTCxBTEwsMC4wNzUsMC4w NSxJY29uU2l6ZSwgQnVsYiwgMCwgdHJ1ZSwgZmFsc2UpKTsKCglhZGRVSShuZXcgUG9wcGVyVXBw ZXIoQUxMLERJQUxCQVIseD0wLjI1LHk9MC4wLDEuMjUsMS4wLCBESUFMQkFSKSk7Cgl4ICs9IDAu MDU7IHkgKz0gMC4wMjU7CgoJYWRkVUkoc3RhcnNCdXR0b24gPSBuZXcgQnV0dG9uKEFMTCxESUFM QkFSLHgseSxJY29uU2l6ZSwgU3RhcnMsICdkJykpOwoJYWRkVUkod2F2ZUJ1dHRvbiA9IG5ldyBC dXR0b24oQUxMLERJQUxCQVIseCtJY29uU2l6ZSx5LEljb25TaXplLCBXYXZlLCAnZicpKTsKCWFk ZFVJKGZsYW1lQnV0dG9uID0gbmV3IEJ1dHRvbihBTEwsRElBTEJBUix4K0ljb25TaXplKjIuNSx5 LEljb25TaXplLCBGbGFtZSwgJ2cnKSk7CgoJYWRkVUkoc3RhckJ1dHRvbiA9IG5ldyBCdXR0b24o QUxMLERJQUxCQVIseCtJY29uU2l6ZSozLjUseSxJY29uU2l6ZSwgU3RhciwgJ2gnKSk7CglhZGRV SShkaWFtb25kQnV0dG9uID0gbmV3IEJ1dHRvbihBTEwsRElBTEJBUix4K0ljb25TaXplKjQuNSx5 LEljb25TaXplLCBEaWFtb25kLCAnaicpKTsKCgl5ICs9IEljb25TaXplKjEuMzsKCglhZGRVSShu ZXcgQnV0dG9uKEFMTCxESUFMQkFSLHgseS0wLjA1LEljb25TaXplLCBCdWxiLCAwLCB0cnVlKSk7 CglhZGRVSShuZXcgU2xpZGVyQmFyKEFMTCxESUFMQkFSLAoJCXgrSWNvblNpemUseSwgMC43NSwg U2xpZGVyU2l6ZSwgJmNvcmUtPmJyaWdodG5lc3NUd2lkZGxlciwgLyomQ29yZTo6c2V0QnJpZ2h0 bmVzcywqLzAsICd6JywgJ3gnKSk7CgoJYWRkVUkobmV3IEJ1dHRvbihBTEwsRElBTEJBUix4LHkr U2xpZGVyU2l6ZSoxLEljb25TaXplLCBTaXplLCAneCcsIHRydWUpKTsKCWFkZFVJKG5ldyBTbGlk ZXJCYXIoQUxMLERJQUxCQVIsCgkJeCtJY29uU2l6ZSx5K1NsaWRlclNpemUsIDAuNzUsIFNsaWRl clNpemUsICZjb3JlLT5zdGFyU2l6ZSwgJkNvcmU6OnNldFN0YXJTaXplLCAnYycsJ3YnKSk7CgoJ YWRkVUkobmV3IEJ1dHRvbihBTEwsRElBTEJBUix4KzAuNSx5K1NsaWRlclNpemUqMi0wLjAyNSxJ Y29uU2l6ZSwgRmdDb2xvciwgMCwgdHJ1ZSkpOwoJYWRkVUkobmV3IFNsaWRlckJhcihBTEwsRElB TEJBUiwKCQl4LHkrU2xpZGVyU2l6ZSoyLCAwLjQ1LCBTbGlkZXJTaXplLCAmKGNvcmUtPmZnUmVk U2xpZGVyKSwgJkNvcmU6OnNldHVwUGFsZXR0ZSwgJ2InLCduJykpOwoJYWRkVUkobmV3IFNsaWRl ckJhcihBTEwsRElBTEJBUiwKCQkJCXgrMC41K1NsaWRlclNpemUseStTbGlkZXJTaXplKjIsIDAu NDUsIFNsaWRlclNpemUsICZjb3JlLT5mZ0dyZWVuU2xpZGVyLCAmQ29yZTo6c2V0dXBQYWxldHRl LCAnbScsJywnKSk7CgoJYWRkVUkobmV3IEJ1dHRvbihBTEwsRElBTEJBUix4KzAuNSx5K1NsaWRl clNpemUqMyxJY29uU2l6ZSwgQmdDb2xvciwgMCwgdHJ1ZSkpOwoJYWRkVUkobmV3IFNsaWRlckJh cihBTEwsRElBTEJBUiwKCQkJCXgseStTbGlkZXJTaXplKjMsIDAuNDUsIFNsaWRlclNpemUsICZj b3JlLT5iZ1JlZFNsaWRlciwgJkNvcmU6OnNldHVwUGFsZXR0ZSwgJ0InLCdOJykpOwoJYWRkVUko bmV3IFNsaWRlckJhcihBTEwsRElBTEJBUiwKCQkJCXgrMC41K1NsaWRlclNpemUseStTbGlkZXJT aXplKjMsIDAuNDUsIFNsaWRlclNpemUsICZjb3JlLT5iZ0dyZWVuU2xpZGVyLCAmQ29yZTo6c2V0 dXBQYWxldHRlLCAnTScsJzwnKSk7CgoJeCArPSAwLjE7Ly8geSArPSAwLjA2MjU7CgkvL3N0YXRp YyBkb3VibGUgdmFsdWUgPSAwLjU7CgkvL2FkZFVJKG5ldyBTbGlkZXJCYXIoQUxMLDAsMC43NSwx LjAsMC4yNSwmdmFsdWUpKTsgCgoJLy9hZGRVSShuZXcgQnV0dG9uKEJVVFRPTkJBUix4LHksSWNv blNpemUsIDEsICd4JykpOwoJLy9hZGRVSShuZXcgQnV0dG9uKEJVVFRPTkJBUix4ICs9IEljb25T aXplLHksSWNvblNpemUsIDIsICd4JykpOwoJLy9hZGRVSShuZXcgQnV0dG9uKEJVVFRPTkJBUix4 ICs9IEljb25TaXplLHksSWNvblNpemUsIDMsICd4JykpOwoKCXZpc2libGVNYXNrID0gQUxMOwoJ bW91c2VYID0gLTE7Cgltb3VzZVkgPSAtMTsKCWxhc3RZID0gLTE7CglsYXN0WSA9IC0xOwoJY291 bnREb3duID0gMDsKCW1vdXNlQnV0dG9ucyA9IDA7CgoJc3luY1RvU3RhdGUoKTsKCQp9CgpJbnRl cmZhY2U6On5JbnRlcmZhY2UoKQp7CglLQ29uZmlnIGNvbmZpZygibm9hdHVuL3N5bmFlc2NvcGUi LCBmYWxzZSwgZmFsc2UsICJkYXRhIik7Cgljb25maWcud3JpdGVFbnRyeSgibW9kZSIsY29yZS0+ ZmFkZU1vZGUpOwoJY29uZmlnLndyaXRlRW50cnkoImRpYW1vbmRzIiwgY29yZS0+cG9pbnRzQXJl RGlhbW9uZHMpOwoJY29uZmlnLndyaXRlRW50cnkoImJyaWdodG5lc3MiLCBjb3JlLT5icmlnaHRu ZXNzVHdpZGRsZXIpOwoJY29uZmlnLndyaXRlRW50cnkoInN0YXJzaXplIiwgY29yZS0+c3RhclNp emUpOwoJY29uZmlnLndyaXRlRW50cnkoIkZHUmVkIiwgY29yZS0+ZmdSZWRTbGlkZXIpOwoJY29u ZmlnLndyaXRlRW50cnkoIkZHZ3JlZW4iLCBjb3JlLT5mZ0dyZWVuU2xpZGVyKTsKCWNvbmZpZy53 cml0ZUVudHJ5KCJCR1JlZCIsIGNvcmUtPmJnUmVkU2xpZGVyKTsKCWNvbmZpZy53cml0ZUVudHJ5 KCJCR0dyZWVuIiwgY29yZS0+YmdHcmVlblNsaWRlcik7Cn0KCnZvaWQgSW50ZXJmYWNlOjphZGRV SShVSU9iamVjdCAqb2JqKQp7Cgl1aU9iamVjdHMuYXBwZW5kKG9iaik7Cn0KCnZvaWQgSW50ZXJm YWNlOjpzeW5jVG9TdGF0ZSgpCnsKCXN0YXJzQnV0dG9uLT5icmlnaHQgPSAoY29yZS0+ZmFkZU1v ZGUgPT0gU3RhcnMpOyAKCWZsYW1lQnV0dG9uLT5icmlnaHQgPSAoY29yZS0+ZmFkZU1vZGUgPT0g RmxhbWUpOyAKCXdhdmVCdXR0b24tPmJyaWdodCA9IChjb3JlLT5mYWRlTW9kZSA9PSBXYXZlKTsK CglzdGFyQnV0dG9uLT5icmlnaHQgPSAhY29yZS0+cG9pbnRzQXJlRGlhbW9uZHM7CglkaWFtb25k QnV0dG9uLT5icmlnaHQgPSBjb3JlLT5wb2ludHNBcmVEaWFtb25kczsKCglzZXR1cFBhbGV0dGUo KTsKfQoKdm9pZCBJbnRlcmZhY2U6OmNoYW5nZVN0YXRlKGludCB0cmFuc2l0aW9uU3ltYm9sKQp7 CglpZiAodHJhbnNpdGlvblN5bWJvbCA8IDApCgl7CgkJcmV0dXJuIDsKCX0KCglpbnQgcmV0VmFs ID0gMDsKCXN3aXRjaCh0cmFuc2l0aW9uU3ltYm9sKQoJewoJCWNhc2UgRmxhbWUgOgoJCQlzdGFy c0J1dHRvbi0+YnJpZ2h0ID0gZmFsc2U7CgkJCWZsYW1lQnV0dG9uLT5icmlnaHQgPSB0cnVlOwoJ CQl3YXZlQnV0dG9uLT5icmlnaHQgPSBmYWxzZTsKCQkJY29yZS0+ZmFkZU1vZGUgPSBGbGFtZTsK CQkJY29yZS0+c2V0U3RhclNpemUoY29yZS0+c3RhclNpemUpOwoJCQlicmVhazsKCQljYXNlIFdh dmUgOgoJCQlzdGFyc0J1dHRvbi0+YnJpZ2h0ID0gZmFsc2U7CgkJCWZsYW1lQnV0dG9uLT5icmln aHQgPSBmYWxzZTsKCQkJd2F2ZUJ1dHRvbi0+YnJpZ2h0ID0gdHJ1ZTsKCQkJY29yZS0+ZmFkZU1v ZGUgPSBXYXZlOwoJCQljb3JlLT5zZXRTdGFyU2l6ZShjb3JlLT5zdGFyU2l6ZSk7CgkJCWJyZWFr OwoJCWNhc2UgU3RhcnMgOgoJCQlzdGFyc0J1dHRvbi0+YnJpZ2h0ID0gdHJ1ZTsKCQkJZmxhbWVC dXR0b24tPmJyaWdodCA9IGZhbHNlOwoJCQl3YXZlQnV0dG9uLT5icmlnaHQgPSBmYWxzZTsKCQkJ Y29yZS0+ZmFkZU1vZGUgPSBTdGFyczsKCQkJY29yZS0+c2V0U3RhclNpemUoY29yZS0+c3RhclNp emUpOwoJCQlicmVhazsKCgkJY2FzZSBTdGFyIDoKCQkJY29yZS0+cG9pbnRzQXJlRGlhbW9uZHMg PSBmYWxzZTsKCQkJc3RhckJ1dHRvbi0+YnJpZ2h0ID0gdHJ1ZTsKCQkJZGlhbW9uZEJ1dHRvbi0+ YnJpZ2h0ID0gZmFsc2U7CgkJCWJyZWFrOwoJCWNhc2UgRGlhbW9uZCA6CgkJCWNvcmUtPnBvaW50 c0FyZURpYW1vbmRzID0gdHJ1ZTsKCQkJc3RhckJ1dHRvbi0+YnJpZ2h0ID0gZmFsc2U7CgkJCWRp YW1vbmRCdXR0b24tPmJyaWdodCA9IHRydWU7CgkJCWJyZWFrOwoKCQljYXNlIEV4aXQgIDogCgkJ CXJldFZhbCA9IDE7IGJyZWFrOwoJfQovLwlyZXR1cm4gcmV0VmFsOwp9Cgpib29sIEludGVyZmFj ZTo6Z28oKQp7CglpbnQgbmV3VmlzaWJsZU1hc2sgPSBBTEw7CgljaGFyIGtleUhpdDsKCWludCBh Y3Rpb24gPSBOb3RBU3ltYm9sOwoJaW50IG9sZEJ1dHRvbnMgPSBtb3VzZUJ1dHRvbnM7CgoJY29y ZS0+c2NyZWVuLT5zaXplVXBkYXRlKCk7CglpZiAoIWNvcmUtPnNjcmVlbi0+aW5wdXRVcGRhdGUo bW91c2VYLG1vdXNlWSxtb3VzZUJ1dHRvbnMsa2V5SGl0KSkKCQlyZXR1cm4gZmFsc2U7CgoJYm9v bCBtb3VzZUNsaWNrID0gKG1vdXNlQnV0dG9ucyAmJiAhb2xkQnV0dG9ucyk7CgoJaWYgKChtb3Vz ZVggIT0gbGFzdFggfHwgbW91c2VZICE9IGxhc3RZKSAmJiAKCQkJbGFzdFggPiAwICYmIGxhc3RZ ID4gMCAmJiAKCQkJbGFzdFggPCBjb3JlLT5vdXRXaWR0aCAmJiBsYXN0WSA8IGNvcmUtPm91dEhl aWdodCkKCQljb3VudERvd24gPSA0MDsKCglpbnQgYWN0aXZlTWFzayA9IEFMTDsKCglpZiAoY291 bnREb3duKQoJewoJCWNvdW50RG93bi0tOwoKCQlkb3VibGUgc2NhbGUgPSAKCQkJKGNvcmUtPm91 dFdpZHRoKjAuNjI1IDwgY29yZS0+b3V0SGVpZ2h0ID8gY29yZS0+b3V0V2lkdGgqMC42MjUgOiBj b3JlLT5vdXRIZWlnaHQpOwoJCWRvdWJsZSBzY2FsZWRYID0gbW91c2VYIC8gc2NhbGU7CgkJZG91 YmxlIHNjYWxlZFkgPSBtb3VzZVkgLyBzY2FsZTsKCgkJY2hhciBob3RLZXkgPSAwOwoKCQljb3Jl LT5wb2x5Z29uRW5naW5lLmNsZWFyKCk7CgovLwkJc3RhdGVCdXR0b24tPmljb24gPSBjb3JlLT5z dGF0ZTsKCgoJCWZvciAoVUlPYmplY3QgKmk9dWlPYmplY3RzLmZpcnN0KCk7IGkhPTA7IGkgPSB1 aU9iamVjdHMubmV4dCgpKQoJCXsKCQkJaWYgKChpLT52aXNpYmxlTWFzayAmIHZpc2libGVNYXNr KSAmJiAoaS0+YWN0aXZlTWFzayAmIGFjdGl2ZU1hc2spKQoJCQkJbmV3VmlzaWJsZU1hc2sgfD0g aS0+Z28obW91c2VCdXR0b25zLG1vdXNlQ2xpY2ssCgkJCQkJCShzY2FsZWRYID49IGktPnggJiYK CQkJCQkJIHNjYWxlZFkgPj0gaS0+eSAmJgoJCQkJCQkgc2NhbGVkWCA8IGktPngraS0+d2lkdGgg JiYKCQkJCQkJIHNjYWxlZFkgPCBpLT55K2ktPmhlaWdodCksCgkJCQkJCXNjYWxlZFggLSBpLT54 LAoJCQkJCQlzY2FsZWRZIC0gaS0+eSwKCQkJCQkJc2NhbGUsCgkJCQkJCWhvdEtleSwKCQkJCQkJ YWN0aW9uKTsKCQl9CgoJCXZpc2libGVNYXNrID0gbmV3VmlzaWJsZU1hc2s7ICAKCQlpZiAodmlz aWJsZU1hc2sgIT0gMSkKCQkJY291bnREb3duID0gMjA7CgoJCWNvcmUtPnBvbHlnb25FbmdpbmUu aWNvbihJY29uc1tQb2ludGVyXSwweDAzMDMsbW91c2VYLG1vdXNlWSw1MCw1MCk7CgoJCWNvcmUt PnBvbHlnb25FbmdpbmUuYXBwbHkoY29yZS0+b3V0cHV0Qm1wLmRhdGEpOwoKCQljaGFyIGhpbnRb Ml0gPSAiICI7CgkJaGludFswXSA9IGhvdEtleTsKCQlwdXRTdHJpbmcoaGludCxtb3VzZVgrNixt b3VzZVkrNywwLDApOwoJfQoKCWlmIChrZXlIaXQpCgkJZm9yKFVJT2JqZWN0ICppPXVpT2JqZWN0 cy5maXJzdCgpOyBpIT0wOyBpID0gdWlPYmplY3RzLm5leHQoKSkgCgkJCWlmIChpLT5hY3RpdmVN YXNrICYgYWN0aXZlTWFzaykKCQkJCWktPmhhbmRsZUtleShrZXlIaXQsYWN0aW9uKTsKCgoJbGFz dFggPSBtb3VzZVg7CglsYXN0WSA9IG1vdXNlWTsKCgljaGFuZ2VTdGF0ZShhY3Rpb24pOwoKCXJl dHVybiB0cnVlOwp9CgojdW5kZWYgb3V0cHV0Cg==