From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: Date: Tue, 9 Dec 2008 14:38:03 -0500 From: "Michaelian Ennis" To: "Fans of the OS Plan 9 from Bell Labs" <9fans@9fans.net> In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_17102_14687047.1228851483718" References: <14ec7b180810172115y2aad7c2bkb0318c6f51ff1a7@mail.gmail.com> <14ec7b180812091112k7cf2ff0r8b1a9896f9e005da@mail.gmail.com> Subject: Re: [9fans] MacOS X drawterm doesn't toggle Topicbox-Message-UUID: 5ea81f66-ead4-11e9-9d60-3106f5b1d025 ------=_Part_17102_14687047.1228851483718 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline On Tue, Dec 9, 2008 at 2:37 PM, Michaelian Ennis wrote: > Attached is my merge of the two versions. Yes I am a monkey. No I > don't know what I am doing. Now that said, can you point me to why > the application exits when I try to toggle full screen with command-F? > > > Ian > ------=_Part_17102_14687047.1228851483718 Content-Type: application/octet-stream; name=screen.c Content-Transfer-Encoding: base64 X-Attachment-Id: f_foiyfr110 Content-Disposition: attachment; filename=screen.c Ly8gaW4gdGhpcyBmaWxlLCBfUmVjdCBpcyBvcyB4IFJlY3QsCi8vIF9Qb2ludCBpcyBvcyB4IFBv aW50CiN1bmRlZiBQb2ludAojZGVmaW5lIFBvaW50IF9Qb2ludAojdW5kZWYgUmVjdAojZGVmaW5l IFJlY3QgX1JlY3QKCiNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CiNpbmNsdWRlIDxRdWlja1Rp bWUvUXVpY2tUaW1lLmg+IC8vIGZvciBmdWxsIHNjcmVlbgoKI3VuZGVmIFJlY3QKI3VuZGVmIFBv aW50CgojdW5kZWYgbmlsCgoKI2luY2x1ZGUgInUuaCIKI2luY2x1ZGUgImxpYi5oIgojaW5jbHVk ZSAia2Vybi9kYXQuaCIKI2luY2x1ZGUgImtlcm4vZm5zLmgiCiNpbmNsdWRlICJlcnJvci5oIgoj aW5jbHVkZSAidXNlci5oIgojaW5jbHVkZSA8ZHJhdy5oPgojaW5jbHVkZSA8bWVtZHJhdy5oPgoj aW5jbHVkZSAic2NyZWVuLmgiCiNpbmNsdWRlICJrZXlib2FyZC5oIgojaW5jbHVkZSAia2V5Y29k ZXMuaCIKCiNkZWZpbmUgcldpbmRvd1Jlc291cmNlICAxMjgKCiNkZWZpbmUgdG9wTGVmdChyKSAg KCgoUG9pbnQgKikgJihyKSlbMF0pCiNkZWZpbmUgYm90UmlnaHQocikgKCgoUG9pbnQgKikgJihy KSlbMV0pCgpleHRlcm4gaW50IG1vdXNlcXVldWU7CnN0YXRpYyBpbnQgZGVwdGg7CkJvb2xlYW4g ICBnRG9uZTsKUmduSGFuZGxlIGdDdXJzb3JSZWdpb25IZGw7CgpNZW1pbWFnZQkqZ3NjcmVlbjsK U2NyZWVuaW5mbwlzY3JlZW47CgpzdGF0aWMgaW50IHJlYWR5Yml0OwpzdGF0aWMgUmVuZGV6CXJl bmQ7CgovLy8KLy8gbWVudQovLwpzdGF0aWMgTWVudVJlZiB3aW5kTWVudTsKc3RhdGljIE1lbnVS ZWYgdmlld01lbnU7CnN0YXRpYyBQdHIgZnVsbFNjcmVlblJlc3RvcmU7CnN0YXRpYyBpbnQgYW1G dWxsU2NyZWVuOwpzdGF0aWMgaW50IGZyb21NZW51OwpzdGF0aWMgV2luZG93UmVmIG9sZFdpbmRv dyA9IE5VTEw7CgplbnVtIHsKCWtRdWl0Q21kID0gMSwKCWtGdWxsU2NyZWVuQ21kID0gMiwKfTsK CnN0YXRpYyBXaW5kb3dHcm91cFJlZiB3aW5Hcm91cCA9IE5VTEw7CnN0YXRpYyBXaW5kb3dSZWYg dGhlV2luZG93ID0gTlVMTDsKc3RhdGljIENHQ29udGV4dFJlZiBjb250ZXh0OwpzdGF0aWMgQ0dE YXRhUHJvdmlkZXJSZWYgZGF0YVByb3ZpZGVyUmVmOwpzdGF0aWMgQ0dJbWFnZVJlZiBmdWxsU2Ny ZWVuSW1hZ2U7CnN0YXRpYyBDR1JlY3QgZGV2UmVjdDsKc3RhdGljIENHUmVjdCBib3VuZHM7CnN0 YXRpYyBQYXN0ZWJvYXJkUmVmIGFwcGxlY2xpcDsKc3RhdGljIF9SZWN0IHdpblJlY3Q7CgpCb29s ZWFuIGFsdFByZXNzZWQgPSBmYWxzZTsKQm9vbGVhbiBidXR0b24yID0gZmFsc2U7CkJvb2xlYW4g YnV0dG9uMyA9IGZhbHNlOwoKc3RhdGljIE9TU3RhdHVzIEFwcGxpY2F0aW9uUXVpdEV2ZW50SGFu ZGxlcihFdmVudEhhbmRsZXJDYWxsUmVmIG5leHRIYW5kbGVyLCBFdmVudFJlZiBldmVudCwgdm9p ZCAqdXNlckRhdGEpOwpzdGF0aWMgT1NTdGF0dXMgTWFpbldpbmRvd0V2ZW50SGFuZGxlcihFdmVu dEhhbmRsZXJDYWxsUmVmIG5leHRIYW5kbGVyLCBFdmVudFJlZiBldmVudCwgdm9pZCAqdXNlckRh dGEpOwpzdGF0aWMgT1NTdGF0dXMgTWFpbldpbmRvd0NvbW1hbmRIYW5kbGVyKEV2ZW50SGFuZGxl ckNhbGxSZWYgbmV4dEhhbmRsZXIsIEV2ZW50UmVmIGV2ZW50LCB2b2lkICp1c2VyRGF0YSk7CnZv aWQgd2lucHJvYyh2b2lkICphKTsKCnN0YXRpYyBpbnQKaXNyZWFkeSh2b2lkKmEpCnsKCXJldHVy biByZWFkeWJpdDsKfQoKQ0dDb250ZXh0UmVmIFF1YXJ0ekNvbnRleHQ7CgovKiBnZXQgdGhlIGRp bWVuc2lvbnMgb2YgdGhlIGxhcmdlc3Qgc2NyZWVuICovCgpQb2ludApnZXRfbGFyZ2VzdF9zY3Jl ZW4oKQp7CglDR0RpcmVjdERpc3BsYXlJRCAJKmRpc3BsYXlsaXN0OwoJQ0dEaXNwbGF5Q291bnQg CQlkaXNwbGF5Y291bnQ7CglPU0VyciAJCQkJZXJyOwoJaW50IGk7CglQb2ludCBtYXggPSBQdCgw LCAwKTsKCVBvaW50IGN1cnI7CgllcnIgPSBDR0dldEFjdGl2ZURpc3BsYXlMaXN0KDAsIE5VTEws ICZkaXNwbGF5Y291bnQpOwoJaWYoZXJyICE9IG5vRXJyKQoJCXN5c2ZhdGFsKCJjYW4gbm90IGVu dW1lcmF0ZSBhY3RpdmUgZGlzcGxheXMiKTsKCglkaXNwbGF5bGlzdCA9IChDR0RpcmVjdERpc3Bs YXlJRCAqKW1hbGxvYyhkaXNwbGF5Y291bnQgKiBzaXplb2YoQ0dEaXJlY3REaXNwbGF5SUQpKTsK CWlmKGRpc3BsYXlsaXN0ID09IE5VTEwpCgkJc3lzZmF0YWwoImNhbiBub3QgYWxsb2NhdGUgbWVt b3J5IGZvciBkaXNwbGF5IGxpc3QiKTsKCgllcnIgPSBDR0dldEFjdGl2ZURpc3BsYXlMaXN0KGRp c3BsYXljb3VudCwgZGlzcGxheWxpc3QsICZkaXNwbGF5Y291bnQpOwoJaWYoZXJyICE9IG5vRXJy KQoJCXN5c2ZhdGFsKCJjYW4gbm90IG9idGFpbiBhY3RpdmUgZGlzcGxheSBsaXN0Iik7CgoJZm9y KGkgPSAwOyBpIDwgZGlzcGxheWNvdW50OyBpKyspIHsKCQljdXJyLnggPSBDR0Rpc3BsYXlQaXhl bHNXaWRlKGRpc3BsYXlsaXN0W2ldKTsKCQljdXJyLnkgPSBDR0Rpc3BsYXlQaXhlbHNIaWdoKGRp c3BsYXlsaXN0W2ldKTsKCgkJaWYobWF4LnggPCBjdXJyLngpCgkJCW1heC54ID0gY3Vyci54OwoJ CWlmKG1heC55IDwgY3Vyci55KQoJCQltYXgueSA9IGN1cnIueTsKCX0KCglmcmVlKGRpc3BsYXls aXN0KTsKCglyZXR1cm4gbWF4OwoKfQoKCnZvaWQgCnNjcmVlbmluaXQodm9pZCkKewoJUG9pbnQg bWF4OwkvKiB0aGUgbGFyZ2VzdCBzY3JlZW4sIGlmIHdlIGhhdmUgbXVsdGlwbGUgKi8KCWludCBm bXQ7CgoJUHJvY2Vzc1NlcmlhbE51bWJlciBwc24gPSB7IDAsIGtDdXJyZW50UHJvY2VzcyB9OwoJ VHJhbnNmb3JtUHJvY2Vzc1R5cGUoJnBzbiwga1Byb2Nlc3NUcmFuc2Zvcm1Ub0ZvcmVncm91bmRB cHBsaWNhdGlvbik7CglTZXRGcm9udFByb2Nlc3MoJnBzbik7CgoJbWVtaW1hZ2Vpbml0KCk7Cglk ZXB0aCA9IDMyOyAvLyBUaGF0J3MgYWxsIHRoaXMgY29kZSBkZWFscyB3aXRoIGZvciBub3cKCXNj cmVlbi5kZXB0aCA9IDMyOwoJZm10ID0gWEJHUjMyOyAvL1hSR0IzMjsKCW1heCA9IGdldF9sYXJn ZXN0X3NjcmVlbigpOwoJZGV2UmVjdCA9IENHRGlzcGxheUJvdW5kcyhDR01haW5EaXNwbGF5SUQo KSk7CgoJZ3NjcmVlbiA9IGFsbG9jbWVtaW1hZ2UoUmVjdCgwLCAwLCBtYXgueCwgbWF4LnkpLCBm bXQpOwoJZGF0YVByb3ZpZGVyUmVmID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YSgwLCBn c2NyZWVuLT5kYXRhLT5iZGF0YSwKCQkJCQkJbWF4LnggKiBtYXgueSAqIDQsIDApOwoJZnVsbFNj cmVlbkltYWdlID0gQ0dJbWFnZUNyZWF0ZShtYXgueCwgbWF4LnksIDgsIDMyLCBtYXgueCAqIDQs CgkJCQlDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKSwKCQkJCWtDR0ltYWdlQWxwaGFOb25l U2tpcExhc3QsCgkJCQlkYXRhUHJvdmlkZXJSZWYsIDAsIDAsIGtDR1JlbmRlcmluZ0ludGVudERl ZmF1bHQpOwoKCWtwcm9jKCJvc3hzY3JlZW4iLCB3aW5wcm9jLCAwKTsKCWtzbGVlcCgmcmVuZCwg aXNyZWFkeSwgMCk7Cn0KCgp2b2lkIAp3aW5kb3dfcmVzaXplZCgpCnsKCUdldFdpbmRvd0JvdW5k cyh0aGVXaW5kb3csIGtXaW5kb3dDb250ZW50UmduLCAmd2luUmVjdCApOwoKCWJvdW5kcyA9IENH UmVjdE1ha2UoMCwgMCwgd2luUmVjdC5yaWdodC13aW5SZWN0LmxlZnQsIHdpblJlY3QuYm90dG9t IC0gd2luUmVjdC50b3ApOwp9CgoKdm9pZCAKd2lucHJvYyh2b2lkICphKQp7Cgl3aW5SZWN0Lmxl ZnQgPSAzMDsKCXdpblJlY3QudG9wID0gNjA7Cgl3aW5SZWN0LmJvdHRvbSA9IChkZXZSZWN0LnNp emUuaGVpZ2h0ICogMC43NSkgKyB3aW5SZWN0LnRvcDsKCXdpblJlY3QucmlnaHQgPSAoZGV2UmVj dC5zaXplLndpZHRoICogMC43NSkgKyB3aW5SZWN0LmxlZnQ7CgoJQ2xlYXJNZW51QmFyKCk7CglJ bml0Q3Vyc29yKCk7CgoJQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51KDAsICZ3aW5kTWVudSk7CglJ bnNlcnRNZW51KHdpbmRNZW51LCAwKTsKCiAgICBNZW51SXRlbUluZGV4IGluZGV4OwoJQ3JlYXRl TmV3TWVudSgxMDA0LCAwLCAmdmlld01lbnUpOwoJU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKHZp ZXdNZW51LCBDRlNUUigiVmlldyIpKTsKCUFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyh2 aWV3TWVudSwgQ0ZTVFIoIkZ1bGwgU2NyZWVuIiksIDAsCgkJCWtGdWxsU2NyZWVuQ21kLCAmaW5k ZXgpOwogCUluc2VydE1lbnUodmlld01lbnUsIEdldE1lbnVJRCh3aW5kTWVudSkpOwoKCURyYXdN ZW51QmFyKCk7Cgl1aW50MzJfdCB3aW5kb3dBdHRycyA9IDAKCQkJCXwga1dpbmRvd0Nsb3NlQm94 QXR0cmlidXRlCgkJCQl8IGtXaW5kb3dDb2xsYXBzZUJveEF0dHJpYnV0ZQoJCQkJfCBrV2luZG93 UmVzaXphYmxlQXR0cmlidXRlCgkJCQl8IGtXaW5kb3dTdGFuZGFyZEhhbmRsZXJBdHRyaWJ1dGUK CQkJCXwga1dpbmRvd0Z1bGxab29tQXR0cmlidXRlCgkJOwoKCUNyZWF0ZU5ld1dpbmRvdyhrRG9j dW1lbnRXaW5kb3dDbGFzcywgd2luZG93QXR0cnMsICZ3aW5SZWN0LCAmdGhlV2luZG93KTsKCUNy ZWF0ZVdpbmRvd0dyb3VwKDAsICZ3aW5Hcm91cCk7CglTZXRXaW5kb3dHcm91cCh0aGVXaW5kb3cs IHdpbkdyb3VwKTsKCglTZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZyh0aGVXaW5kb3csIENGU1RS KCJEcmF3dGVybSIpKTsKCglpZihQYXN0ZWJvYXJkQ3JlYXRlKGtQYXN0ZWJvYXJkQ2xpcGJvYXJk LCAmYXBwbGVjbGlwKSAhPSBub0VycikKCQlzeXNmYXRhbCgicGFzdGVib2FyZCBjcmVhdGUgZmFp bGVkIik7CgoJY29uc3QgRXZlbnRUeXBlU3BlYyBxdWl0X2V2ZW50c1tdID0gewoJCXsga0V2ZW50 Q2xhc3NXaW5kb3csIGtFdmVudFdpbmRvd0Nsb3NlZCB9LAoJCXsga0V2ZW50Q2xhc3NXaW5kb3cs IGtFdmVudFdpbmRvd0JvdW5kc0NoYW5nZWQgfSwKCQl7IGtFdmVudENsYXNzQ29tbWFuZCwga0V2 ZW50Q29tbWFuZFByb2Nlc3MgfQoJfTsKCWNvbnN0IEV2ZW50VHlwZVNwZWMgY29tbWFuZHNbXSA9 IHsKCQl7IGtFdmVudENsYXNzV2luZG93LCBrRXZlbnRXaW5kb3dDbG9zZWQgfSwKCQl7IGtFdmVu dENsYXNzV2luZG93LCBrRXZlbnRXaW5kb3dCb3VuZHNDaGFuZ2VkIH0sCgkJeyBrRXZlbnRDbGFz c0NvbW1hbmQsIGtFdmVudENvbW1hbmRQcm9jZXNzIH0KCX07Cgljb25zdCBFdmVudFR5cGVTcGVj IGV2ZW50c1tdID0gewoJCXsga0V2ZW50Q2xhc3NLZXlib2FyZCwga0V2ZW50UmF3S2V5RG93biB9 LAoJCXsga0V2ZW50Q2xhc3NLZXlib2FyZCwga0V2ZW50UmF3S2V5TW9kaWZpZXJzQ2hhbmdlZCB9 LAoJCXsga0V2ZW50Q2xhc3NLZXlib2FyZCwga0V2ZW50UmF3S2V5UmVwZWF0IH0sCgkJeyBrRXZl bnRDbGFzc01vdXNlLCBrRXZlbnRNb3VzZURvd24gfSwKCQl7IGtFdmVudENsYXNzTW91c2UsIGtF dmVudE1vdXNlVXAgfSwKCQl7IGtFdmVudENsYXNzTW91c2UsIGtFdmVudE1vdXNlTW92ZWQgfSwK CQl7IGtFdmVudENsYXNzTW91c2UsIGtFdmVudE1vdXNlRHJhZ2dlZCB9LAoJCXsga0V2ZW50Q2xh c3NNb3VzZSwga0V2ZW50TW91c2VXaGVlbE1vdmVkIH0sCgl9OwoKCUluc3RhbGxBcHBsaWNhdGlv bkV2ZW50SGFuZGxlciAoCgkJCQkJCQkJTmV3RXZlbnRIYW5kbGVyVVBQIChBcHBsaWNhdGlvblF1 aXRFdmVudEhhbmRsZXIpLAoJCQkJCQkJCUdldEV2ZW50VHlwZUNvdW50KHF1aXRfZXZlbnRzKSwK CQkJCQkJCQlxdWl0X2V2ZW50cywKCQkJCQkJCQlOVUxMLAoJCQkJCQkJCU5VTEwpOwoKIAlJbnN0 YWxsQXBwbGljYXRpb25FdmVudEhhbmRsZXIgKAogCQkJCQkJCQlOZXdFdmVudEhhbmRsZXJVUFAg KE1haW5XaW5kb3dFdmVudEhhbmRsZXIpLAoJCQkJCQkJCUdldEV2ZW50VHlwZUNvdW50KGV2ZW50 cyksCgkJCQkJCQkJZXZlbnRzLAoJCQkJCQkJCU5VTEwsCgkJCQkJCQkJTlVMTCk7CglJbnN0YWxs V2luZG93RXZlbnRIYW5kbGVyICgKCQkJCQkJCQl0aGVXaW5kb3csCgkJCQkJCQkJTmV3RXZlbnRI YW5kbGVyVVBQIChNYWluV2luZG93Q29tbWFuZEhhbmRsZXIpLAoJCQkJCQkJCUdldEV2ZW50VHlw ZUNvdW50KGNvbW1hbmRzKSwKCQkJCQkJCQljb21tYW5kcywKCQkJCQkJCQl0aGVXaW5kb3csCgkJ CQkJCQkJTlVMTCk7CgoJU2hvd1dpbmRvdyh0aGVXaW5kb3cpOwoJU2hvd01lbnVCYXIoKTsKCXdp bmRvd19yZXNpemVkKCk7CglTZWxlY3RXaW5kb3codGhlV2luZG93KTsKCXRlcm1pbml0KCk7Cgkv LyBSdW4gdGhlIGV2ZW50IGxvb3AKCXJlYWR5Yml0ID0gMTsKCXdha2V1cCgmcmVuZCk7CglSdW5B cHBsaWNhdGlvbkV2ZW50TG9vcCgpOwoKfQoKc3RhdGljIGlubGluZSBpbnQgCmNvbnZlcnRfa2V5 KFVJbnQzMiBrZXksIFVJbnQzMiBjaGFyY29kZSkKewoJc3dpdGNoKGtleSkgewoJCWNhc2UgUVpf SUJPT0tfRU5URVI6CgkJY2FzZSBRWl9SRVRVUk46IHJldHVybiAnXG4nOwoJCWNhc2UgUVpfRVND QVBFOiByZXR1cm4gMjc7CgkJY2FzZSBRWl9CQUNLU1BBQ0U6IHJldHVybiAnXGInOwoJCWNhc2Ug UVpfTEFMVDogcmV0dXJuIEthbHQ7CgkJY2FzZSBRWl9MQ1RSTDogcmV0dXJuIEtjdGw7CgkJY2Fz ZSBRWl9MU0hJRlQ6IHJldHVybiBLc2hpZnQ7CgkJY2FzZSBRWl9GMTogcmV0dXJuIEtGKzE7CgkJ Y2FzZSBRWl9GMjogcmV0dXJuIEtGKzI7CgkJY2FzZSBRWl9GMzogcmV0dXJuIEtGKzM7CgkJY2Fz ZSBRWl9GNDogcmV0dXJuIEtGKzQ7CgkJY2FzZSBRWl9GNTogcmV0dXJuIEtGKzU7CgkJY2FzZSBR Wl9GNjogcmV0dXJuIEtGKzY7CgkJY2FzZSBRWl9GNzogcmV0dXJuIEtGKzc7CgkJY2FzZSBRWl9G ODogcmV0dXJuIEtGKzg7CgkJY2FzZSBRWl9GOTogcmV0dXJuIEtGKzk7CgkJY2FzZSBRWl9GMTA6 IHJldHVybiBLRisxMDsKCQljYXNlIFFaX0YxMTogcmV0dXJuIEtGKzExOwoJCWNhc2UgUVpfRjEy OiByZXR1cm4gS0YrMTI7CgkJY2FzZSBRWl9JTlNFUlQ6IHJldHVybiBLaW5zOwoJCWNhc2UgUVpf REVMRVRFOiByZXR1cm4gMHg3RjsKCQljYXNlIFFaX0hPTUU6IHJldHVybiBLaG9tZTsKCQljYXNl IFFaX0VORDogcmV0dXJuIEtlbmQ7CgkJY2FzZSBRWl9LUF9QTFVTOiByZXR1cm4gJysnOwoJCWNh c2UgUVpfS1BfTUlOVVM6IHJldHVybiAnLSc7CgkJY2FzZSBRWl9UQUI6IHJldHVybiAnXHQnOwoJ CWNhc2UgUVpfUEFHRVVQOiByZXR1cm4gS3BndXA7CgkJY2FzZSBRWl9QQUdFRE9XTjogcmV0dXJu IEtwZ2Rvd247CgkJY2FzZSBRWl9VUDogcmV0dXJuIEt1cDsKCQljYXNlIFFaX0RPV046IHJldHVy biBLZG93bjsKCQljYXNlIFFaX0xFRlQ6IHJldHVybiBLbGVmdDsKCQljYXNlIFFaX1JJR0hUOiBy ZXR1cm4gS3JpZ2h0OwoJCWNhc2UgUVpfS1BfTVVMVElQTFk6IHJldHVybiAnKic7CgkJY2FzZSBR Wl9LUF9ESVZJREU6IHJldHVybiAnLyc7CgkJY2FzZSBRWl9LUF9FTlRFUjogcmV0dXJuICdcbic7 CgkJY2FzZSBRWl9LUF9QRVJJT0Q6IHJldHVybiAnLic7CgkJY2FzZSBRWl9LUDA6IHJldHVybiAn MCc7CgkJY2FzZSBRWl9LUDE6IHJldHVybiAnMSc7CgkJY2FzZSBRWl9LUDI6IHJldHVybiAnMic7 CgkJY2FzZSBRWl9LUDM6IHJldHVybiAnMyc7CgkJY2FzZSBRWl9LUDQ6IHJldHVybiAnNCc7CgkJ Y2FzZSBRWl9LUDU6IHJldHVybiAnNSc7CgkJY2FzZSBRWl9LUDY6IHJldHVybiAnNic7CgkJY2Fz ZSBRWl9LUDc6IHJldHVybiAnNyc7CgkJY2FzZSBRWl9LUDg6IHJldHVybiAnOCc7CgkJY2FzZSBR Wl9LUDk6IHJldHVybiAnOSc7CgkJZGVmYXVsdDogcmV0dXJuIGNoYXJjb2RlOwoJfQp9Cgp2b2lk CnNlbmRidXR0b25zKGludCBiLCBpbnQgeCwgaW50IHkpCnsKCWludCBpOwoJbG9jaygmbW91c2Uu bGspOwoJaSA9IG1vdXNlLndpOwoJaWYobW91c2VxdWV1ZSkgewoJCWlmKGkgPT0gbW91c2Uucmkg fHwgbW91c2UubGFzdGIgIT0gYiB8fCBtb3VzZS50cmFucykgewoJCQltb3VzZS53aSA9IChpKzEp JU1vdXNlcXVldWU7CgkJCWlmKG1vdXNlLndpID09IG1vdXNlLnJpKQoJCQkJbW91c2UucmkgPSAo bW91c2UucmkrMSklTW91c2VxdWV1ZTsKCQkJbW91c2UudHJhbnMgPSBtb3VzZS5sYXN0YiAhPSBi OwoJCX0gZWxzZSB7CgkJCWkgPSAoaS0xK01vdXNlcXVldWUpJU1vdXNlcXVldWU7CgkJfQoJfSBl bHNlIHsKCQltb3VzZS53aSA9IChpKzEpJU1vdXNlcXVldWU7CgkJbW91c2UucmkgPSBpOwoJfQoJ bW91c2UucXVldWVbaV0ueHkueCA9IHg7Cgltb3VzZS5xdWV1ZVtpXS54eS55ID0geTsKCW1vdXNl LnF1ZXVlW2ldLmJ1dHRvbnMgPSBiOwoJbW91c2UucXVldWVbaV0ubXNlYyA9IHRpY2tzKCk7Cglt b3VzZS5sYXN0YiA9IGI7Cgl1bmxvY2soJm1vdXNlLmxrKTsKCXdha2V1cCgmbW91c2Uucik7Cn0K CgpzdGF0aWMgdm9pZApsZWF2ZV9mdWxsX3NjcmVlbigpCnsKCWlmIChhbUZ1bGxTY3JlZW4pIHsK CQlFbmRGdWxsU2NyZWVuKGZ1bGxTY3JlZW5SZXN0b3JlLCAwKTsKCQl0aGVXaW5kb3cgPSBvbGRX aW5kb3c7CgkJU2hvd1dpbmRvdyh0aGVXaW5kb3cpOwoJCWFtRnVsbFNjcmVlbiA9IDA7CgkJd2lu ZG93X3Jlc2l6ZWQoKTsKCQlSZWN0YW5nbGUgcmVjdCA9ICB7IHsgMCwgMCB9LAogCQkJCQkJCXsg Ym91bmRzLnNpemUud2lkdGgsCiAJCQkJCQkJICBib3VuZHMuc2l6ZS5oZWlnaHR9IH07CgkJZHJh d3Fsb2NrKCk7CiAJCWZsdXNobWVtc2NyZWVuKHJlY3QpOwogCQlkcmF3cXVubG9jaygpOwoJfQp9 CgoKc3RhdGljIHZvaWQKZnVsbF9zY3JlZW4oKQp7CglHREhhbmRsZSBkZXZpY2U7CglpZiAoIWFt RnVsbFNjcmVlbikgewoJCW9sZFdpbmRvdyA9IHRoZVdpbmRvdzsKCQlIaWRlV2luZG93KHRoZVdp bmRvdyk7CgkJR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKHRoZVdpbmRvdywga1dpbmRvd1Rp dGxlQmFyUmduLCAmZGV2aWNlLCBOVUxMKTsKCQlCZWdpbkZ1bGxTY3JlZW4oJmZ1bGxTY3JlZW5S ZXN0b3JlLCBkZXZpY2UsIDAsIDAsICZ0aGVXaW5kb3csIDAsIDApOwoJCWFtRnVsbFNjcmVlbiA9 IDE7CgkJd2luZG93X3Jlc2l6ZWQoKTsKCQlSZWN0YW5nbGUgcmVjdCA9ICB7IHsgMCwgMCB9LAog CQkJCQkJCXsgYm91bmRzLnNpemUud2lkdGgsCiAJCQkJCQkJICBib3VuZHMuc2l6ZS5oZWlnaHR9 IH07CgkJZHJhd3Fsb2NrKCk7CiAJCWZsdXNobWVtc2NyZWVuKHJlY3QpOwogCQlkcmF3cXVubG9j aygpOwoJfSBlbHNlIGxlYXZlX2Z1bGxfc2NyZWVuKCk7CgkKfQoKLy8gY2F0Y2ggcXVpdCBldmVu dHMgdG8gaGFuZGxlIHF1aXRzIGZyb20gbWVudSwgQ21kK1EsIGFwcGxlc2NyaXB0LCBhbmQgdGFz ayBzd2l0Y2hlcgpzdGF0aWMgT1NTdGF0dXMgCkFwcGxpY2F0aW9uUXVpdEV2ZW50SGFuZGxlcihF dmVudEhhbmRsZXJDYWxsUmVmIG5leHRIYW5kbGVyLCBFdmVudFJlZiBldmVudCwgdm9pZCAqdXNl ckRhdGEpCnsKCWZwcmludGYoc3RkZXJyLCJBcHBsaWNhdGlvblF1aXRFdmVudEhhbmRsZXIgY2Fs bGVkIik7CglleGl0KDApOwovLwlRdWl0QXBwbGljYXRpb25FdmVudExvb3AoKTsKCXJldHVybiBu b0VycjsKfQogCnN0YXRpYyBPU1N0YXR1cyAKTWFpbldpbmRvd0V2ZW50SGFuZGxlcihFdmVudEhh bmRsZXJDYWxsUmVmIG5leHRIYW5kbGVyLCBFdmVudFJlZiBldmVudCwgdm9pZCAqdXNlckRhdGEp CnsKCU9TU3RhdHVzIHJlc3VsdCA9IG5vRXJyOwoJcmVzdWx0ID0gQ2FsbE5leHRFdmVudEhhbmRs ZXIobmV4dEhhbmRsZXIsIGV2ZW50KTsKCVVJbnQzMiBjbGFzcyA9IEdldEV2ZW50Q2xhc3MgKGV2 ZW50KTsKCVVJbnQzMiBraW5kID0gR2V0RXZlbnRLaW5kIChldmVudCk7CglzdGF0aWMgdWludDMy X3QgbW91c2VidXR0b25zID0gMDsgLy8gYml0bWFzayBvZiBidXR0b25zIGN1cnJlbnRseSBkb3du CglzdGF0aWMgdWludDMyX3QgbW91c2VYID0gMDsgCglzdGF0aWMgdWludDMyX3QgbW91c2VZID0g MDsgCgoJaWYoY2xhc3MgPT0ga0V2ZW50Q2xhc3NLZXlib2FyZCkgewoJCWNoYXIgbWFjQ2hhckNv ZGVzOwoJCVVJbnQzMiBtYWNLZXlDb2RlOwoJCVVJbnQzMiBtYWNLZXlNb2RpZmllcnM7CgoJCUdl dEV2ZW50UGFyYW1ldGVyKGV2ZW50LCBrRXZlbnRQYXJhbUtleU1hY0NoYXJDb2RlcywgdHlwZUNo YXIsCgkJCQkJCQlOVUxMLCBzaXplb2YobWFjQ2hhckNvZGVzKSwgTlVMTCwgJm1hY0NoYXJDb2Rl cyk7CgkJR2V0RXZlbnRQYXJhbWV0ZXIoZXZlbnQsIGtFdmVudFBhcmFtS2V5Q29kZSwgdHlwZVVJ bnQzMiwgTlVMTCwKCQkJCQkJCXNpemVvZihtYWNLZXlDb2RlKSwgTlVMTCwgJm1hY0tleUNvZGUp OwoJCUdldEV2ZW50UGFyYW1ldGVyKGV2ZW50LCBrRXZlbnRQYXJhbUtleU1vZGlmaWVycywgdHlw ZVVJbnQzMiwgTlVMTCwKCQkJCQkJCXNpemVvZihtYWNLZXlNb2RpZmllcnMpLCBOVUxMLCAmbWFj S2V5TW9kaWZpZXJzKTsKICAgICAgICBzd2l0Y2goa2luZCkgewoJCWNhc2Uga0V2ZW50UmF3S2V5 TW9kaWZpZXJzQ2hhbmdlZDoKCQkJc3dpdGNoKG1hY0tleU1vZGlmaWVycyAmIChvcHRpb25LZXkg fCBjbWRLZXkpKSB7CgkJCWNhc2UgKG9wdGlvbktleSB8IGNtZEtleSk6CgkJCQkvKiBkdWUgdG8g Y2hvcmRpbmcgd2UgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBib3RoCgkJCQkgKiBtb2Rp ZmllciBrZXlzIGFyZSBwcmVzc2VkIGF0IHRoZSBzYW1lIHRpbWUuIAoJCQkJICogY3VycmVudGx5 IGl0J3Mgb25seSAyLTMgc25hcmYgYW5kIHRoZSAzLTIgbm9vcAoJCQkJICovCgkJCQlhbHRQcmVz c2VkID0gdHJ1ZTsKCQkJCWlmKG1vdXNlYnV0dG9ucyAmIDEgfHwgbW91c2VidXR0b25zICYgMiB8 fCBtb3VzZWJ1dHRvbnMgJiA0KSB7CgkJCQkJbW91c2VidXR0b25zIHw9IDI7CS8qIHNldCBidXR0 b24gMiAqLwoJCQkJCW1vdXNlYnV0dG9ucyB8PSA0OwkvKiBzZXQgYnV0dG9uIDMgKi8KCQkJCQli dXR0b24yID0gdHJ1ZTsKCQkJCQlidXR0b24zID0gdHJ1ZTsKCQkJCQlzZW5kYnV0dG9ucyhtb3Vz ZWJ1dHRvbnMsIG1vdXNlWCwgbW91c2VZKTsKCQkJCX0gCgkJCQlicmVhazsKCQkJY2FzZSBvcHRp b25LZXk6CgkJCQlhbHRQcmVzc2VkID0gdHJ1ZTsKCQkJCWlmKG1vdXNlYnV0dG9ucyAmIDEgfHwg bW91c2VidXR0b25zICYgNCkgewoJCQkJCW1vdXNlYnV0dG9ucyB8PSAyOwkvKiBzZXQgYnV0dG9u IDIgKi8KCQkJCQlidXR0b24yID0gdHJ1ZTsKCQkJCQlzZW5kYnV0dG9ucyhtb3VzZWJ1dHRvbnMs IG1vdXNlWCwgbW91c2VZKTsKCQkJCX0gCgkJCQlicmVhazsKCQkJY2FzZSBjbWRLZXk6CgkJCQlp Zihtb3VzZWJ1dHRvbnMgJiAxIHx8IG1vdXNlYnV0dG9ucyAmIDIpIHsKCQkJCQltb3VzZWJ1dHRv bnMgfD0gNDsJLyogc2V0IGJ1dHRvbiAzICovCgkJCQkJYnV0dG9uMyA9IHRydWU7CgkJCQkJc2Vu ZGJ1dHRvbnMobW91c2VidXR0b25zLCBtb3VzZVgsIG1vdXNlWSk7CgkJCQl9CgkJCQlicmVhazsK CQkJY2FzZSAwOgoJCQlkZWZhdWx0OgoJCQkJaWYoYnV0dG9uMiB8fCBidXR0b24zKSB7CgkJCQkJ aWYoYnV0dG9uMikgewoJCQkJCQltb3VzZWJ1dHRvbnMgJj0gfjI7CS8qIGNsZWFyIGJ1dHRvbiAy ICovCgkJCQkJCWJ1dHRvbjIgPSBmYWxzZTsKCQkJCQkJYWx0UHJlc3NlZCA9IGZhbHNlOwoJCQkJ CX0gCgkJCQkJaWYoYnV0dG9uMykgewoJCQkJCQltb3VzZWJ1dHRvbnMgJj0gfjQ7CS8qIGNsZWFy IGJ1dHRvbiAzICovCgkJCQkJCWJ1dHRvbjMgPSBmYWxzZTsKCQkJCQl9CgkJCQkJc2VuZGJ1dHRv bnMobW91c2VidXR0b25zLCBtb3VzZVgsIG1vdXNlWSk7CgkJCQl9CgkJCQlpZihhbHRQcmVzc2Vk KSB7CgkJCQkJa2JkcHV0YyhrYmRxLCBLYWx0KTsKCQkJCQlhbHRQcmVzc2VkID0gZmFsc2U7CgkJ CQl9IAoJCQkJYnJlYWs7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBrRXZlbnRSYXdLZXlEb3duOgoJ CWNhc2Uga0V2ZW50UmF3S2V5UmVwZWF0OgoJCQlpZihtYWNLZXlNb2RpZmllcnMgIT0gY21kS2V5 KSB7CgkJCQlVbmlDaGFyIHVjOwoJCQkJaW50IGtleSA9IGNvbnZlcnRfa2V5KG1hY0tleUNvZGUs IG1hY0NoYXJDb2Rlcyk7CgkJCQlHZXRFdmVudFBhcmFtZXRlcihldmVudCwga0V2ZW50UGFyYW1L ZXlVbmljb2RlcywgdHlwZVVuaWNvZGVUZXh0LCBOVUxMLCBzaXplb2YodWMpLCBOVUxMLCAmdWMp OwoKCQkJCWlmKGtleSAhPSAtMSkKCQkJCQlrYmRwdXRjKGtiZHEsIGtleSk7CgkJCQllbHNlCgkJ CQkJa2JkcHV0YyhrYmRxLCB1Yyk7CgkJCQl9IAoJCQllbHNlIHsKCQkJCWlmKG1hY0NoYXJDb2Rl cyA9PSAnZicgfHwgbWFjQ2hhckNvZGVzID09ICdGJykgewoJCQkJCWZ1bGxfc2NyZWVuKCk7CgkJ CQkJfSAKCQkJCWVsc2UgaWYobWFjQ2hhckNvZGVzID09ICdxJyB8fCBtYWNDaGFyQ29kZXMgPT0g J1EnKSB7CgkJCQkJCWV4aXQoMCk7CgkJCQkJfSAKCQkJCX0KCQkJCWJyZWFrOwoJCX0KCX0KCWVs c2UgaWYoY2xhc3MgPT0ga0V2ZW50Q2xhc3NNb3VzZSkgewoJCV9Qb2ludCBtb3VzZVBvczsKCgkJ R2V0RXZlbnRQYXJhbWV0ZXIoZXZlbnQsIGtFdmVudFBhcmFtTW91c2VMb2NhdGlvbiwgdHlwZVFE UG9pbnQsCgkJCQkJCQkwLCBzaXplb2YgbW91c2VQb3MsIDAsICZtb3VzZVBvcyk7CgkJCgkJc3dp dGNoIChraW5kKSB7CgkJCWNhc2Uga0V2ZW50TW91c2VXaGVlbE1vdmVkOgoJCQl7CgkJCSAgICBp bnQzMl90IHdoZWVsZGVsdGE7CgkJCQlHZXRFdmVudFBhcmFtZXRlcihldmVudCxrRXZlbnRQYXJh bU1vdXNlV2hlZWxEZWx0YSx0eXBlU0ludDMyLAoJCQkJCQkJCQkwLHNpemVvZih3aGVlbGRlbHRh KSwgMCwgJndoZWVsZGVsdGEpOwoJCQkJbW91c2VYID0gbW91c2VQb3MuaCAtIHdpblJlY3QubGVm dDsKCQkJCW1vdXNlWSA9IG1vdXNlUG9zLnYgLSB3aW5SZWN0LnRvcDsKCQkJCXNlbmRidXR0b25z KHdoZWVsZGVsdGE+MCA/IDggOiAxNiwgbW91c2VYLCBtb3VzZVkpOwoJCQkJYnJlYWs7CgkJCX0K CQkJY2FzZSBrRXZlbnRNb3VzZVVwOgoJCQljYXNlIGtFdmVudE1vdXNlRG93bjoKCQkJewoJCQkJ dWludDMyX3QgYnV0dG9uczsKCQkJCXVpbnQzMl90IG1vZGlmaWVyczsKCQkJCUdldEV2ZW50UGFy YW1ldGVyKGV2ZW50LCBrRXZlbnRQYXJhbUtleU1vZGlmaWVycywgdHlwZVVJbnQzMiwgCgkJCQkJ CQkJCTAsIHNpemVvZihtb2RpZmllcnMpLCAwLCAmbW9kaWZpZXJzKTsKCQkJCUdldEV2ZW50UGFy YW1ldGVyKGV2ZW50LCBrRXZlbnRQYXJhbU1vdXNlQ2hvcmQsIHR5cGVVSW50MzIsIAoJCQkJCQkJ CQkwLCBzaXplb2YgYnV0dG9ucywgMCwgJmJ1dHRvbnMpOwoJCQkJLyogc2ltdWxhdGUgb3RoZXIg YnV0dG9ucyB2aWEgYWx0L2FwcGxlIGtleS4gbGlrZSB4MTEgKi8KCQkJCWlmKG1vZGlmaWVycyAm IG9wdGlvbktleSkgewoJCQkJCW1vdXNlYnV0dG9ucyA9ICgoYnV0dG9ucyAmIDEpID8gMiA6IDAp OwoJCQkJCWFsdFByZXNzZWQgPSBmYWxzZTsKCQkJCX0gZWxzZSBpZihtb2RpZmllcnMgJiBjbWRL ZXkpCgkJCQkJbW91c2VidXR0b25zID0gKChidXR0b25zICYgMSkgPyA0IDogMCk7CgkJCQllbHNl CgkJCQkJbW91c2VidXR0b25zID0gKGJ1dHRvbnMgJiAxKTsKCgkJCQltb3VzZWJ1dHRvbnMgfD0g KChidXR0b25zICYgMik8PDEpOwoJCQkJbW91c2VidXR0b25zIHw9ICgoYnV0dG9ucyAmIDQpPj4x KTsKCgkJCX0gLyogRmFsbHRocm91Z2ggKi8KCQkJY2FzZSBrRXZlbnRNb3VzZU1vdmVkOgoJCQlj YXNlIGtFdmVudE1vdXNlRHJhZ2dlZDoKCQkJCW1vdXNlWCA9IG1vdXNlUG9zLmggLSB3aW5SZWN0 LmxlZnQ7CgkJCQltb3VzZVkgPSBtb3VzZVBvcy52IC0gd2luUmVjdC50b3A7CgkJCQlzZW5kYnV0 dG9ucyhtb3VzZWJ1dHRvbnMsIG1vdXNlWCwgbW91c2VZKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0 OgoJCQkJcmVzdWx0ID0gZXZlbnROb3RIYW5kbGVkRXJyOwoJCQkJYnJlYWs7CgkJfQoJfQoJcmV0 dXJuIHJlc3VsdDsKfQoKCi8vZGVmYXVsdCB3aW5kb3cgY29tbWFuZCBoYW5kbGVyIChmcm9tIG1l bnVzKQpzdGF0aWMgT1NTdGF0dXMgCk1haW5XaW5kb3dDb21tYW5kSGFuZGxlcihFdmVudEhhbmRs ZXJDYWxsUmVmIG5leHRIYW5kbGVyLAoJCQkJCUV2ZW50UmVmIGV2ZW50LCB2b2lkICp1c2VyRGF0 YSkKewoJT1NTdGF0dXMgcmVzdWx0ID0gbm9FcnI7CglVSW50MzIgY2xhc3MgPSBHZXRFdmVudENs YXNzIChldmVudCk7CglVSW50MzIga2luZCA9IEdldEV2ZW50S2luZCAoZXZlbnQpOwoKCXJlc3Vs dCA9IENhbGxOZXh0RXZlbnRIYW5kbGVyKG5leHRIYW5kbGVyLCBldmVudCk7CgoJaWYoY2xhc3Mg PT0ga0V2ZW50Q2xhc3NDb21tYW5kKQoJewoJCUhJQ29tbWFuZCB0aGVISUNvbW1hbmQ7CgkJR2V0 RXZlbnRQYXJhbWV0ZXIoIGV2ZW50LCBrRXZlbnRQYXJhbURpcmVjdE9iamVjdCwgdHlwZUhJQ29t bWFuZCwKCQkJCQkJCU5VTEwsIHNpemVvZiggSElDb21tYW5kICksIE5VTEwsICZ0aGVISUNvbW1h bmQgKTsKCgkJc3dpdGNoICggdGhlSElDb21tYW5kLmNvbW1hbmRJRCApCgkJewoJCQljYXNlIGtI SUNvbW1hbmRRdWl0OgoJCQkJZXhpdCgwKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSBrRnVsbFNjcmVl bkNtZDoKCQkJCWlmKGFtRnVsbFNjcmVlbikKCQkJCQlsZWF2ZV9mdWxsX3NjcmVlbigpOwoJCQkJ ZWxzZSAKCQkJCQlmdWxsX3NjcmVlbigpOwoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJcmVz dWx0ID0gZXZlbnROb3RIYW5kbGVkRXJyOwoJCQkJYnJlYWs7CgkJfQoJfQoJZWxzZSBpZihjbGFz cyA9PSBrRXZlbnRDbGFzc1dpbmRvdykKCXsKCQlXaW5kb3dSZWYgICAgIHdpbmRvdzsKCQlfUmVj dCAgICAgICAgICByZWN0UG9ydCA9IHswLDAsMCwwfTsKCgkJR2V0RXZlbnRQYXJhbWV0ZXIoZXZl bnQsIGtFdmVudFBhcmFtRGlyZWN0T2JqZWN0LCB0eXBlV2luZG93UmVmLAoJCQkJCQkJTlVMTCwg c2l6ZW9mKFdpbmRvd1JlZiksIE5VTEwsICZ3aW5kb3cpOwoKCQlpZih3aW5kb3cpCgkJewoJCQlH ZXRQb3J0Qm91bmRzKEdldFdpbmRvd1BvcnQod2luZG93KSwgJnJlY3RQb3J0KTsKCQl9CgoJCXN3 aXRjaCAoa2luZCkKCQl7CgkJCWNhc2Uga0V2ZW50V2luZG93Q2xvc2VkOgoJCQkJLy8gc2VuZCBh IHF1aXQgY2FyYm9uIGV2ZW50IGluc3RlYWQgb2YgZGlyZWN0bHkgY2FsbGluZyBjbGVhbmV4aXQg CgkJCQkvLyBzbyB0aGF0IGFsbCBxdWl0cyBhcmUgZG9uZSBpbiBBcHBsaWNhdGlvblF1aXRFdmVu dEhhbmRsZXIKCQkJCXsKCQkJCUV2ZW50UmVmIHF1aXRFdmVudDsKCQkJCUNyZWF0ZUV2ZW50KE5V TEwsCgkJCQkJCQlrRXZlbnRDbGFzc0FwcGxpY2F0aW9uLAoJCQkJCQkJa0V2ZW50QXBwUXVpdCwK CQkJCQkJCTAsCgkJCQkJCQlrRXZlbnRBdHRyaWJ1dGVOb25lLAoJCQkJCQkJJnF1aXRFdmVudCk7 CgkJCQlFdmVudFRhcmdldFJlZiB0YXJnZXQ7CgkJCQl0YXJnZXQgPSBHZXRBcHBsaWNhdGlvbkV2 ZW50VGFyZ2V0KCk7CgkJCQlTZW5kRXZlbnRUb0V2ZW50VGFyZ2V0KHF1aXRFdmVudCwgdGFyZ2V0 KTsKCQkJCX0KIAkJCQlicmVhazsKCgkJCS8vcmVzaXplIHdpbmRvdwoJCQljYXNlIGtFdmVudFdp bmRvd0JvdW5kc0NoYW5nZWQ6CgkJCQl3aW5kb3dfcmVzaXplZCgpOwoJCQkJUmVjdGFuZ2xlIHJl Y3QgPSAgeyB7IDAsIDAgfSwKIAkJCQkJCQkJCXsgYm91bmRzLnNpemUud2lkdGgsCiAJCQkJCQkJ CQkgIGJvdW5kcy5zaXplLmhlaWdodH0gfTsKCQkJCWRyYXdxbG9jaygpOwogCQkJCWZsdXNobWVt c2NyZWVuKHJlY3QpOwogCQkJCWRyYXdxdW5sb2NrKCk7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6 CgkJCQlyZXN1bHQgPSBldmVudE5vdEhhbmRsZWRFcnI7CgkJCQlicmVhazsKCQl9Cgl9CgoJcmV0 dXJuIHJlc3VsdDsKfQoKdm9pZApmbHVzaG1lbXNjcmVlbihSZWN0YW5nbGUgcikKewoJLy8gc2Fu aXR5IGNoZWNrLiAgVHJpcHMgZnJvbSB0aGUgaW5pdGlhbCAidGVybWluYWwiCiAgICBpZiAoci5t YXgueCA8IHIubWluLnggfHwgci5tYXgueSA8IHIubWluLnkpIHJldHVybjsKICAgIAoJc2NyZWVu bG9hZChyLCBnc2NyZWVuLT5kZXB0aCwgYnl0ZWFkZHIoZ3NjcmVlbiwgWlApLCBaUCwKCQlnc2Ny ZWVuLT53aWR0aCpzaXplb2YodWxvbmcpKTsKfQoKdWNoYXIqCmF0dGFjaHNjcmVlbihSZWN0YW5n bGUgKnIsIHVsb25nICpjaGFuLCBpbnQgKmRlcHRoLCBpbnQgKndpZHRoLCBpbnQgKnNvZnRzY3Jl ZW4sIHZvaWQgKipYKQp7CgkqciA9IGdzY3JlZW4tPnI7CgkqY2hhbiA9IGdzY3JlZW4tPmNoYW47 CgkqZGVwdGggPSBnc2NyZWVuLT5kZXB0aDsKCSp3aWR0aCA9IGdzY3JlZW4tPndpZHRoOwoJKnNv ZnRzY3JlZW4gPSAxOwoKCXJldHVybiBnc2NyZWVuLT5kYXRhLT5iZGF0YTsKfQoKLy8gUEFMIC0g bm8gcGFsZXR0ZSBoYW5kbGluZy4gIERvbid0IGludGVuZCB0byBlaXRoZXIuCnZvaWQKZ2V0Y29s b3IodWxvbmcgaSwgdWxvbmcgKnIsIHVsb25nICpnLCB1bG9uZyAqYikKewoKLy8gUEFMOiBDZXJ0 YWlubHkgd3JvbmcgdG8gcmV0dXJuIGEgZ3JheXNjYWxlLgoJICpyID0gaTsKCSAqZyA9IGk7Cgkg KmIgPSBpOwp9Cgp2b2lkCnNldGNvbG9yKHVsb25nIGluZGV4LCB1bG9uZyByZWQsIHVsb25nIGdy ZWVuLCB1bG9uZyBibHVlKQp7Cglhc3NlcnQoMCk7Cn0KCgpzdGF0aWMgY2hhciBzbmFyZlszKlNu YXJmU2l6ZSsxXTsKc3RhdGljIFJ1bmUgcnNuYXJmW1NuYXJmU2l6ZSsxXTsKCmNoYXIqCmNsaXBy ZWFkKHZvaWQpCnsKCUNGRGF0YVJlZiBjZmRhdGE7CglPU1N0YXR1cyBlcnIgPSBub0VycjsKCUl0 ZW1Db3VudCBuSXRlbXM7CgoJLy8gV293LiAgVGhpcyBpcyByaWRpY3Vsb3VzbHkgY29tcGxpY2F0 ZWQuCglQYXN0ZWJvYXJkU3luY2hyb25pemUoYXBwbGVjbGlwKTsKCWlmKChlcnIgPSBQYXN0ZWJv YXJkR2V0SXRlbUNvdW50KGFwcGxlY2xpcCwgJm5JdGVtcykpICE9IG5vRXJyKSB7CgkJZnByaW50 KDIsICJhcHBsZSBwYXN0ZWJvYXJkIEdldEl0ZW1Db3VudCBmYWlsZWQgLSBFcnJvciAlZFxuIiwg ZXJyKTsKCQlyZXR1cm4gMDsKCX0KCgl1aW50MzJfdCBpOwoJLy8gWWVzLCBiYXNlZCBhdCAxLiAg U2lsbHkgQVBJLgoJZm9yKGkgPSAxOyBpIDw9IG5JdGVtczsgKytpKSB7CgkJUGFzdGVib2FyZEl0 ZW1JRCBpdGVtSUQ7CgkJQ0ZBcnJheVJlZiBmbGF2b3JUeXBlQXJyYXk7CgkJQ0ZJbmRleCBmbGF2 b3JDb3VudDsKCgkJaWYoKGVyciA9IFBhc3RlYm9hcmRHZXRJdGVtSWRlbnRpZmllcihhcHBsZWNs aXAsIGksICZpdGVtSUQpKSAhPSBub0Vycil7CgkJCWZwcmludCgyLCAiQ2FuJ3QgZ2V0IHBhc3Rl Ym9hcmQgaXRlbSBpZGVudGlmaWVyOiAlZFxuIiwgZXJyKTsKCQkJcmV0dXJuIDA7CgkJfQoKCQlp ZigoZXJyID0gUGFzdGVib2FyZENvcHlJdGVtRmxhdm9ycyhhcHBsZWNsaXAsIGl0ZW1JRCwgJmZs YXZvclR5cGVBcnJheSkpIT1ub0Vycil7CgkJCWZwcmludCgyLCAiQ2FuJ3QgY29weSBwYXN0ZWJv YXJkIGl0ZW0gZmxhdm9yczogJWRcbiIsIGVycik7CgkJCXJldHVybiAwOwoJCX0KCgkJZmxhdm9y Q291bnQgPSBDRkFycmF5R2V0Q291bnQoZmxhdm9yVHlwZUFycmF5KTsKCQlDRkluZGV4IGZsYXZv ckluZGV4OwoJCWZvcihmbGF2b3JJbmRleCA9IDA7IGZsYXZvckluZGV4IDwgZmxhdm9yQ291bnQ7 ICsrZmxhdm9ySW5kZXgpewoJCQlDRlN0cmluZ1JlZiBmbGF2b3JUeXBlOwoJCQlmbGF2b3JUeXBl ID0gKENGU3RyaW5nUmVmKUNGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoZmxhdm9yVHlwZUFycmF5LCBm bGF2b3JJbmRleCk7CgkJCWlmIChVVFR5cGVDb25mb3Jtc1RvKGZsYXZvclR5cGUsIENGU1RSKCJw dWJsaWMudXRmMTYtcGxhaW4tdGV4dCIpKSl7CgkJCQlpZigoZXJyID0gUGFzdGVib2FyZENvcHlJ dGVtRmxhdm9yRGF0YShhcHBsZWNsaXAsIGl0ZW1JRCwKCQkJCQlDRlNUUigicHVibGljLnV0ZjE2 LXBsYWluLXRleHQiKSwgJmNmZGF0YSkpICE9IG5vRXJyKXsKCQkJCQlmcHJpbnQoMiwgImFwcGxl IHBhc3RlYm9hcmQgQ29weUl0ZW0gZmFpbGVkIC0gRXJyb3IgJWRcbiIsIGVycik7CgkJCQkJcmV0 dXJuIDA7CgkJCQl9CgkJCQlDRkluZGV4IGxlbmd0aCA9IENGRGF0YUdldExlbmd0aChjZmRhdGEp OwoJCQkJaWYgKGxlbmd0aCA+IHNpemVvZiByc25hcmYpIGxlbmd0aCA9IHNpemVvZiByc25hcmY7 CgkJCQlDRkRhdGFHZXRCeXRlcyhjZmRhdGEsIENGUmFuZ2VNYWtlKDAsIGxlbmd0aCksICh1aW50 OF90ICopcnNuYXJmKTsKCQkJCXNucHJpbnQoc25hcmYsIHNpemVvZiBzbmFyZiwgIiUuKlMiLCBs ZW5ndGgvc2l6ZW9mKFJ1bmUpLCByc25hcmYpOwoJCQkJY2hhciAqcyA9IHNuYXJmOwoJCQkJd2hp bGUgKCpzKSB7CgkJCQkJaWYgKCpzID09ICdccicpICpzID0gJ1xuJzsKCQkJCQlzKys7CgkJCQl9 CgkJCQlDRlJlbGVhc2UoY2ZkYXRhKTsKCQkJCXJldHVybiBzdHJkdXAoc25hcmYpOwoJCQl9CgkJ fQoJfQoJcmV0dXJuIDA7Cn0KCmludApjbGlwd3JpdGUoY2hhciAqc25hcmYpCnsKCUNGRGF0YVJl ZiBjZmRhdGE7CglQYXN0ZWJvYXJkU3luY0ZsYWdzIGZsYWdzOwoKCXJ1bmVzbnByaW50KHJzbmFy ZiwgbmVsZW0ocnNuYXJmKSwgIiVzIiwgc25hcmYpOwoJaWYoUGFzdGVib2FyZENsZWFyKGFwcGxl Y2xpcCkgIT0gbm9FcnIpewoJCWZwcmludGYoc3RkZXJyLCAiYXBwbGUgcGFzdGVib2FyZCBjbGVh ciBmYWlsZWRcbiIpOwoJCXJldHVybiAwOwoJfQoJZmxhZ3MgPSBQYXN0ZWJvYXJkU3luY2hyb25p emUoYXBwbGVjbGlwKTsKCWlmKChmbGFncyZrUGFzdGVib2FyZE1vZGlmaWVkKSB8fCAhKGZsYWdz JmtQYXN0ZWJvYXJkQ2xpZW50SXNPd25lcikpewoJCWZwcmludGYoc3RkZXJyLCAiYXBwbGUgcGFz dGVib2FyZCBjYW5ub3QgYXNzZXJ0IG93bmVyc2hpcFxuIik7CgkJcmV0dXJuIDA7Cgl9CgljZmRh dGEgPSBDRkRhdGFDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgCgkJKHVjaGFyKilyc25hcmYs IHJ1bmVzdHJsZW4ocnNuYXJmKSoyKTsKCWlmKGNmZGF0YSA9PSBuaWwpewoJCWZwcmludGYoc3Rk ZXJyLCAiYXBwbGUgcGFzdGVib2FyZCBjZmRhdGFjcmVhdGUgZmFpbGVkXG4iKTsKCQlyZXR1cm4g MDsKCX0KCWlmKFBhc3RlYm9hcmRQdXRJdGVtRmxhdm9yKGFwcGxlY2xpcCwgKFBhc3RlYm9hcmRJ dGVtSUQpMSwKCQlDRlNUUigicHVibGljLnV0ZjE2LXBsYWluLXRleHQiKSwgY2ZkYXRhLCAwKSAh PSBub0Vycil7CgkJZnByaW50ZihzdGRlcnIsICJhcHBsZSBwYXN0ZWJvYXJkIHB1dGl0ZW0gZmFp bGVkXG4iKTsKCQlDRlJlbGVhc2UoY2ZkYXRhKTsKCQlyZXR1cm4gMDsKCX0KCUNGUmVsZWFzZShj ZmRhdGEpOwoJcmV0dXJuIDE7Cn0KCgp2b2lkCm1vdXNlc2V0KFBvaW50IHh5KQp7CglDR1BvaW50 IHBudDsKCXBudC54ID0geHkueCArIHdpblJlY3QubGVmdDsKCXBudC55ID0geHkueSArIHdpblJl Y3QudG9wOwoJQ0dXYXJwTW91c2VDdXJzb3JQb3NpdGlvbihwbnQpOwp9Cgp2b2lkCnNjcmVlbmxv YWQoUmVjdGFuZ2xlIHIsIGludCBkZXB0aCwgdWNoYXIgKnAsIFBvaW50IHB0LCBpbnQgc3RlcCkK ewoJQ0dSZWN0IHJib3VuZHM7CglyYm91bmRzLnNpemUud2lkdGggPSByLm1heC54IC0gci5taW4u eDsKCXJib3VuZHMuc2l6ZS5oZWlnaHQgPSByLm1heC55IC0gci5taW4ueTsKCXJib3VuZHMub3Jp Z2luLnggPSByLm1pbi54OwoJcmJvdW5kcy5vcmlnaW4ueSA9IHIubWluLnk7CgkJCglpZihkZXB0 aCAhPSBnc2NyZWVuLT5kZXB0aCkKCQlwYW5pYygic2NyZWVubG9hZDogYmFkIGxkZXB0aCIpOwoJ CQoJUURCZWdpbkNHQ29udGV4dCggR2V0V2luZG93UG9ydCh0aGVXaW5kb3cpLCAmY29udGV4dCk7 CgkKCS8vIFRoZSBzdWItaW1hZ2UgaXMgcmVsYXRpdmUgdG8gb3VyIHdob2xlIHNjcmVlbiBpbWFn ZS4KCUNHSW1hZ2VSZWYgc3ViaW1nID0gQ0dJbWFnZUNyZWF0ZVdpdGhJbWFnZUluUmVjdChmdWxs U2NyZWVuSW1hZ2UsIHJib3VuZHMpOwoJCgkvLyBEcmF3aW5nIHRoZSBzdWItaW1hZ2UgaXMgcmVs YXRpdmUgdG8gdGhlIHdpbmRvdy4KCXJib3VuZHMub3JpZ2luLnkgPSB3aW5SZWN0LmJvdHRvbSAt IHdpblJlY3QudG9wIC0gci5taW4ueSAtIHJib3VuZHMuc2l6ZS5oZWlnaHQ7CglDR0NvbnRleHRE cmF3SW1hZ2UoY29udGV4dCwgcmJvdW5kcywgc3ViaW1nKTsKCUNHQ29udGV4dEZsdXNoKGNvbnRl eHQpOwoJQ0dJbWFnZVJlbGVhc2Uoc3ViaW1nKTsKCVFERW5kQ0dDb250ZXh0KCBHZXRXaW5kb3dQ b3J0KHRoZVdpbmRvdyksICZjb250ZXh0KTsKCn0KCi8vIFBBTDogdGhlc2UgZG9uJ3Qgd29yay4K Ly8gU2V0Q3Vyc29yIGFuZCBJbml0Q3Vyc29yIGFyZSBtYXJrZWQgYXMgZGVwcmVjYXRlZCBpbiAx MC40LCBhbmQgSSBjYW4ndCBmb3IgdGhlCi8vIGxpZmUgb2YgbWUgZmluZCBvdXQgd2hhdCBoYXMg cmVwbGFjZWQgdGhlbS4Kdm9pZApzZXRjdXJzb3Iodm9pZCkKewogICAgQ3Vyc29yIGNyc3I7CiAg ICBpbnQgaTsKICAgIAoJZm9yKGk9MDsgaTwxNjsgaSsrKXsKCQljcnNyLmRhdGFbaV0gPSAoKHVz aG9ydCopY3Vyc29yLnNldClbaV07CgkJY3Jzci5tYXNrW2ldID0gY3Jzci5kYXRhW2ldIHwgKCh1 c2hvcnQqKWN1cnNvci5jbHIpW2ldOwoJfQoJY3Jzci5ob3RTcG90LmggPSAtY3Vyc29yLm9mZnNl dC54OwoJY3Jzci5ob3RTcG90LnYgPSAtY3Vyc29yLm9mZnNldC55OwoJU2V0Q3Vyc29yKCZjcnNy KTsKfQoKdm9pZApjdXJzb3JhcnJvdyh2b2lkKQp7CglJbml0Q3Vyc29yKCk7Cn0K ------=_Part_17102_14687047.1228851483718--