From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <14ec7b180810172115y2aad7c2bkb0318c6f51ff1a7@mail.gmail.com> Date: Fri, 17 Oct 2008 22:15:04 -0600 From: "andrey mirtchovski" 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_81629_30043821.1224303304852" References: Subject: Re: [9fans] MacOS X drawterm doesn't toggle Topicbox-Message-UUID: 1fffbad0-ead4-11e9-9d60-3106f5b1d025 ------=_Part_81629_30043821.1224303304852 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline funny, looking in the archive it was exactly a year ago that i sent a patch to fix this. the patch doesn't seem to have been applied. it does two things: does ctrl+F for both full screen and full-screen-less and fixes a bug when if one is using two unequal displays (larger secondary) then drawterm won't be able to resize properly on the bigger screen. i've attached the screen.c to put in gui-osx. give it a try. other changes with the current version in cvs (except the bugfixes) are only cosmetic. andrey On Fri, Oct 17, 2008 at 9:47 PM, Michaelian Ennis wrote: > Should I just be using p9p drawterm? > > In the drawterm from "cvs.pdos.csail.mit.edu:/cvs co drawterm" > Command-F doesn't toggle from fullscreen to windowed mode. I pulled > the latest from cvs and poked around at it for a little while but I > can't figure out what the problem is. I tried to alter the switch > command on theHICommand.commandID to include this: > > case kFullScreenCmd: > if (!amFullScreen) > full_screen(); > else > leave_full_screen(); > break; > > that didn't help. In addition this particular case looked like > left-over code to me, > > switch(kind) { > case kEventRawKeyModifiersChanged: > if (macKeyModifiers == (controlKey | optionKey)) leave_full_screen(); > > and Ctl-Opt does appears to work. > > Ian > > ------=_Part_81629_30043821.1224303304852 Content-Type: text/plain; name=screen.c Content-Transfer-Encoding: base64 X-Attachment-Id: f_fmfqj77r0 Content-Disposition: attachment; filename=screen.c Ly8gaW4gdGhpcyBmaWxlLCBfUmVjdCBpcyBvcyB4IFJlY3QsCi8vIF9Qb2ludCBpcyBvcyB4IFBv aW50CiN1bmRlZiBQb2ludAojZGVmaW5lIFBvaW50IF9Qb2ludAojdW5kZWYgUmVjdAojZGVmaW5l IFJlY3QgX1JlY3QKCiNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CiNpbmNsdWRlIDxRdWlja1Rp bWUvUXVpY2tUaW1lLmg+IC8vIGZvciBmdWxsIHNjcmVlbgoKI3VuZGVmIFJlY3QKI3VuZGVmIFBv aW50CgojdW5kZWYgbmlsCgoKI2luY2x1ZGUgInUuaCIKI2luY2x1ZGUgImxpYi5oIgojaW5jbHVk ZSAia2Vybi9kYXQuaCIKI2luY2x1ZGUgImtlcm4vZm5zLmgiCiNpbmNsdWRlICJlcnJvci5oIgoj aW5jbHVkZSAidXNlci5oIgojaW5jbHVkZSA8ZHJhdy5oPgojaW5jbHVkZSA8bWVtZHJhdy5oPgoj aW5jbHVkZSAic2NyZWVuLmgiCiNpbmNsdWRlICJrZXlib2FyZC5oIgojaW5jbHVkZSAia2V5Y29k ZXMuaCIKCiNkZWZpbmUgcldpbmRvd1Jlc291cmNlICAxMjgKCiNkZWZpbmUgdG9wTGVmdChyKSAg KCgoUG9pbnQgKikgJihyKSlbMF0pCiNkZWZpbmUgYm90UmlnaHQocikgKCgoUG9pbnQgKikgJihy KSlbMV0pCgpleHRlcm4gaW50IG1vdXNlcXVldWU7CnN0YXRpYyBpbnQgZGVwdGg7CkJvb2xlYW4g ICBnRG9uZTsKUmduSGFuZGxlIGdDdXJzb3JSZWdpb25IZGw7CgpNZW1pbWFnZQkqZ3NjcmVlbjsK U2NyZWVuaW5mbwlzY3JlZW47CgpzdGF0aWMgaW50IHJlYWR5Yml0OwpzdGF0aWMgUmVuZGV6CXJl bmQ7CgovLy8KLy8gbWVudQovLwpzdGF0aWMgTWVudVJlZiB3aW5kTWVudTsKc3RhdGljIE1lbnVS ZWYgdmlld01lbnU7CnN0YXRpYyBQdHIgZnVsbFNjcmVlblJlc3RvcmU7CnN0YXRpYyBpbnQgYW1G dWxsU2NyZWVuOwpzdGF0aWMgaW50IGZyb21NZW51OwpzdGF0aWMgV2luZG93UmVmIG9sZFdpbmRv dyA9IE5VTEw7CgoKCmVudW0gewoJa1F1aXRDbWQgPSAxLAoJa0Z1bGxTY3JlZW5DbWQgPSAyLAp9 OwoKc3RhdGljIFdpbmRvd0dyb3VwUmVmIHdpbkdyb3VwID0gTlVMTDsKc3RhdGljIFdpbmRvd1Jl ZiB0aGVXaW5kb3cgPSBOVUxMOwpzdGF0aWMgQ0dDb250ZXh0UmVmIGNvbnRleHQ7CnN0YXRpYyBD R0RhdGFQcm92aWRlclJlZiBkYXRhUHJvdmlkZXJSZWY7CnN0YXRpYyBDR0ltYWdlUmVmIGZ1bGxT Y3JlZW5JbWFnZTsKc3RhdGljIENHUmVjdCBkZXZSZWN0OwpzdGF0aWMgQ0dSZWN0IGJvdW5kczsK c3RhdGljIFBhc3RlYm9hcmRSZWYgYXBwbGVjbGlwOwpzdGF0aWMgX1JlY3Qgd2luUmVjdDsKCkJv b2xlYW4gYWx0UHJlc3NlZCA9IGZhbHNlOwpCb29sZWFuIGJ1dHRvbjIgPSBmYWxzZTsKQm9vbGVh biBidXR0b24zID0gZmFsc2U7CgoKc3RhdGljIE9TU3RhdHVzIE1haW5XaW5kb3dFdmVudEhhbmRs ZXIoRXZlbnRIYW5kbGVyQ2FsbFJlZiBuZXh0SGFuZGxlciwgRXZlbnRSZWYgZXZlbnQsIHZvaWQg KnVzZXJEYXRhKTsKc3RhdGljIE9TU3RhdHVzIE1haW5XaW5kb3dDb21tYW5kSGFuZGxlcihFdmVu dEhhbmRsZXJDYWxsUmVmIG5leHRIYW5kbGVyLCBFdmVudFJlZiBldmVudCwgdm9pZCAqdXNlckRh dGEpOwp2b2lkIHdpbnByb2Modm9pZCAqYSk7CgoKc3RhdGljIGludAppc3JlYWR5KHZvaWQqYSkK ewoJcmV0dXJuIHJlYWR5Yml0Owp9CgpDR0NvbnRleHRSZWYgUXVhcnR6Q29udGV4dDsKCgovKiBm aWd1cmUgb3V0IHdoaWNoIGRpc3BsYXkgaXMgdGhlIGxhcmdlc3QgYW5kIHJldHVybiBpdHMgYm91 bmRzIHNvIHdlIGNhbgogKiBwcmVhbGxvY2F0ZSBkcmF3dGVybSdzIHNjcmVlbiB0byB0aGF0CiAq LwpQb2ludApnZXRfbGFyZ2VzdF9zY3JlZW4oKQp7CglDR0RpcmVjdERpc3BsYXlJRCAJKmRpc3Bs YXlsaXN0OwoJQ0dEaXNwbGF5Q291bnQgCQlkaXNwbGF5Y291bnQ7CglPU0VyciAJCQkJZXJyOwoJ aW50IGk7CglQb2ludCBtYXggPSBQdCgwLCAwKTsKCVBvaW50IGN1cnI7CgllcnIgPSBDR0dldEFj dGl2ZURpc3BsYXlMaXN0KDAsIE5VTEwsICZkaXNwbGF5Y291bnQpOwoJaWYoZXJyICE9IG5vRXJy KQoJCXN5c2ZhdGFsKCJjYW4gbm90IGVudW1lcmF0ZSBhY3RpdmUgZGlzcGxheXMiKTsKCglkaXNw bGF5bGlzdCA9IChDR0RpcmVjdERpc3BsYXlJRCAqKW1hbGxvYyhkaXNwbGF5Y291bnQgKiBzaXpl b2YoQ0dEaXJlY3REaXNwbGF5SUQpKTsKCWlmKGRpc3BsYXlsaXN0ID09IE5VTEwpCgkJc3lzZmF0 YWwoImNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkaXNwbGF5IGxpc3QiKTsKCgllcnIgPSBD R0dldEFjdGl2ZURpc3BsYXlMaXN0KGRpc3BsYXljb3VudCwgZGlzcGxheWxpc3QsICZkaXNwbGF5 Y291bnQpOwoJaWYoZXJyICE9IG5vRXJyKQoJCXN5c2ZhdGFsKCJjYW4gbm90IG9idGFpbiBhY3Rp dmUgZGlzcGxheSBsaXN0Iik7CgoJZm9yKGkgPSAwOyBpIDwgZGlzcGxheWNvdW50OyBpKyspIHsK CQljdXJyLnggPSBDR0Rpc3BsYXlQaXhlbHNXaWRlKGRpc3BsYXlsaXN0W2ldKTsKCQljdXJyLnkg PSBDR0Rpc3BsYXlQaXhlbHNIaWdoKGRpc3BsYXlsaXN0W2ldKTsKCgkJaWYobWF4LnggPCBjdXJy LngpCgkJCW1heC54ID0gY3Vyci54OwoJCWlmKG1heC55IDwgY3Vyci55KQoJCQltYXgueSA9IGN1 cnIueTsKCX0KCglmcmVlKGRpc3BsYXlsaXN0KTsKCglyZXR1cm4gbWF4OwoKfQoKdm9pZCAKc2Ny ZWVuaW5pdCh2b2lkKQp7CglQb2ludCBtYXg7CS8qIHRoZSBsYXJnZXN0IHNjcmVlbiwgaWYgd2Ug aGF2ZSBtdWx0aXBsZSAqLwoJaW50IGZtdDsKCglQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbiA9IHsg MCwga0N1cnJlbnRQcm9jZXNzIH07CglUcmFuc2Zvcm1Qcm9jZXNzVHlwZSgmcHNuLCBrUHJvY2Vz c1RyYW5zZm9ybVRvRm9yZWdyb3VuZEFwcGxpY2F0aW9uKTsKCVNldEZyb250UHJvY2VzcygmcHNu KTsKCW1lbWltYWdlaW5pdCgpOwoJZGVwdGggPSAzMjsgLy8gVGhhdCdzIGFsbCB0aGlzIGNvZGUg ZGVhbHMgd2l0aCBmb3Igbm93CglzY3JlZW4uZGVwdGggPSAzMjsKCWZtdCA9IFhCR1IzMjsgLy9Y UkdCMzI7CgoJbWF4ID0gZ2V0X2xhcmdlc3Rfc2NyZWVuKCk7CglkZXZSZWN0ID0gQ0dEaXNwbGF5 Qm91bmRzKENHTWFpbkRpc3BsYXlJRCgpKTsKCglnc2NyZWVuID0gYWxsb2NtZW1pbWFnZShSZWN0 KDAsIDAsIG1heC54LCBtYXgueSksIGZtdCk7CglkYXRhUHJvdmlkZXJSZWYgPSBDR0RhdGFQcm92 aWRlckNyZWF0ZVdpdGhEYXRhKDAsIGdzY3JlZW4tPmRhdGEtPmJkYXRhLAoJCQkJCQltYXgueCAq IG1heC55ICogNCwgMCk7CglmdWxsU2NyZWVuSW1hZ2UgPSBDR0ltYWdlQ3JlYXRlKG1heC54LCBt YXgueSwgOCwgMzIsIG1heC54ICogNCwKCQkJCUNHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigp LAoJCQkJa0NHSW1hZ2VBbHBoYU5vbmVTa2lwTGFzdCwKCQkJCWRhdGFQcm92aWRlclJlZiwgMCwg MCwga0NHUmVuZGVyaW5nSW50ZW50RGVmYXVsdCk7CgoJa3Byb2MoIm9zeHNjcmVlbiIsIHdpbnBy b2MsIDApOwoJa3NsZWVwKCZyZW5kLCBpc3JlYWR5LCAwKTsKfQoKdm9pZCAKd2luZG93X3Jlc2l6 ZWQoKQp7CglHZXRXaW5kb3dCb3VuZHModGhlV2luZG93LCBrV2luZG93Q29udGVudFJnbiwgJndp blJlY3QgKTsKCglib3VuZHMgPSBDR1JlY3RNYWtlKDAsIDAsIHdpblJlY3QucmlnaHQtd2luUmVj dC5sZWZ0LCB3aW5SZWN0LmJvdHRvbSAtIHdpblJlY3QudG9wKTsKfQoKdm9pZCB3aW5wcm9jKHZv aWQgKmEpCnsKCXdpblJlY3QubGVmdCA9IDMwOwoJd2luUmVjdC50b3AgPSA2MDsKCXdpblJlY3Qu Ym90dG9tID0gKGRldlJlY3Quc2l6ZS5oZWlnaHQgKiAwLjc1KSArIHdpblJlY3QudG9wOwoJd2lu UmVjdC5yaWdodCA9IChkZXZSZWN0LnNpemUud2lkdGggKiAwLjc1KSArIHdpblJlY3QubGVmdDsK CglDbGVhck1lbnVCYXIoKTsKCUluaXRDdXJzb3IoKTsKCglDcmVhdGVTdGFuZGFyZFdpbmRvd01l bnUoMCwgJndpbmRNZW51KTsKCUluc2VydE1lbnUod2luZE1lbnUsIDApOwoKICAgIE1lbnVJdGVt SW5kZXggaW5kZXg7CglDcmVhdGVOZXdNZW51KDEwMDQsIDAsICZ2aWV3TWVudSk7CglTZXRNZW51 VGl0bGVXaXRoQ0ZTdHJpbmcodmlld01lbnUsIENGU1RSKCJWaWV3IikpOwoJQXBwZW5kTWVudUl0 ZW1UZXh0V2l0aENGU3RyaW5nKHZpZXdNZW51LCBDRlNUUigiRW50ZXIgRnVsbCBTY3JlZW4iKSwg MCwKCQkJa0Z1bGxTY3JlZW5DbWQsICZpbmRleCk7CgkvL1NldE1lbnVJdGVtQ29tbWFuZEtleSh2 aWV3TWVudSwgaW5kZXgsIEZBTFNFLCAnRicpOwoJSW5zZXJ0TWVudSh2aWV3TWVudSwgR2V0TWVu dUlEKHdpbmRNZW51KSk7CgoJRHJhd01lbnVCYXIoKTsKCXVpbnQzMl90IHdpbmRvd0F0dHJzID0g MAoJCQkJfCBrV2luZG93Q2xvc2VCb3hBdHRyaWJ1dGUKCQkJCXwga1dpbmRvd0NvbGxhcHNlQm94 QXR0cmlidXRlCgkJCQl8IGtXaW5kb3dSZXNpemFibGVBdHRyaWJ1dGUKCQkJCXwga1dpbmRvd1N0 YW5kYXJkSGFuZGxlckF0dHJpYnV0ZQoJCQkJfCBrV2luZG93RnVsbFpvb21BdHRyaWJ1dGUKCQk7 CgoJQ3JlYXRlTmV3V2luZG93KGtEb2N1bWVudFdpbmRvd0NsYXNzLCB3aW5kb3dBdHRycywgJndp blJlY3QsICZ0aGVXaW5kb3cpOwoJQ3JlYXRlV2luZG93R3JvdXAoMCwgJndpbkdyb3VwKTsKCVNl dFdpbmRvd0dyb3VwKHRoZVdpbmRvdywgd2luR3JvdXApOwoKCVNldFdpbmRvd1RpdGxlV2l0aENG U3RyaW5nKHRoZVdpbmRvdywgQ0ZTVFIoIkRyYXd0ZXJtIikpOwoKCWlmKFBhc3RlYm9hcmRDcmVh dGUoa1Bhc3RlYm9hcmRDbGlwYm9hcmQsICZhcHBsZWNsaXApICE9IG5vRXJyKQoJCXN5c2ZhdGFs KCJwYXN0ZWJvYXJkIGNyZWF0ZSBmYWlsZWQiKTsKCgljb25zdCBFdmVudFR5cGVTcGVjIGNvbW1h bmRzW10gPSB7CgkJeyBrRXZlbnRDbGFzc1dpbmRvdywga0V2ZW50V2luZG93Q2xvc2VkIH0sCgkJ eyBrRXZlbnRDbGFzc1dpbmRvdywga0V2ZW50V2luZG93Qm91bmRzQ2hhbmdlZCB9LAoJCXsga0V2 ZW50Q2xhc3NDb21tYW5kLCBrRXZlbnRDb21tYW5kUHJvY2VzcyB9Cgl9OwoJY29uc3QgRXZlbnRU eXBlU3BlYyBldmVudHNbXSA9IHsKCQl7IGtFdmVudENsYXNzS2V5Ym9hcmQsIGtFdmVudFJhd0tl eURvd24gfSwKCQl7IGtFdmVudENsYXNzS2V5Ym9hcmQsIGtFdmVudFJhd0tleU1vZGlmaWVyc0No YW5nZWQgfSwKCQl7IGtFdmVudENsYXNzS2V5Ym9hcmQsIGtFdmVudFJhd0tleVJlcGVhdCB9LAoJ CXsga0V2ZW50Q2xhc3NNb3VzZSwga0V2ZW50TW91c2VEb3duIH0sCgkJeyBrRXZlbnRDbGFzc01v dXNlLCBrRXZlbnRNb3VzZVVwIH0sCgkJeyBrRXZlbnRDbGFzc01vdXNlLCBrRXZlbnRNb3VzZU1v dmVkIH0sCgkJeyBrRXZlbnRDbGFzc01vdXNlLCBrRXZlbnRNb3VzZURyYWdnZWQgfSwKCQl7IGtF dmVudENsYXNzTW91c2UsIGtFdmVudE1vdXNlV2hlZWxNb3ZlZCB9LAoJfTsKCiAJSW5zdGFsbEFw cGxpY2F0aW9uRXZlbnRIYW5kbGVyICgKIAkJCQkJCQkJTmV3RXZlbnRIYW5kbGVyVVBQIChNYWlu V2luZG93RXZlbnRIYW5kbGVyKSwKCQkJCQkJCQlHZXRFdmVudFR5cGVDb3VudChldmVudHMpLAoJ CQkJCQkJCWV2ZW50cywKCQkJCQkJCQlOVUxMLAoJCQkJCQkJCU5VTEwpOwoJSW5zdGFsbFdpbmRv d0V2ZW50SGFuZGxlciAoCgkJCQkJCQkJdGhlV2luZG93LAoJCQkJCQkJCU5ld0V2ZW50SGFuZGxl clVQUCAoTWFpbldpbmRvd0NvbW1hbmRIYW5kbGVyKSwKCQkJCQkJCQlHZXRFdmVudFR5cGVDb3Vu dChjb21tYW5kcyksCgkJCQkJCQkJY29tbWFuZHMsCgkJCQkJCQkJdGhlV2luZG93LAoJCQkJCQkJ CU5VTEwpOwoKCVNob3dXaW5kb3codGhlV2luZG93KTsKCVNob3dNZW51QmFyKCk7Cgl3aW5kb3df cmVzaXplZCgpOwoJU2VsZWN0V2luZG93KHRoZVdpbmRvdyk7Cgl0ZXJtaW5pdCgpOwoJLy8gUnVu IHRoZSBldmVudCBsb29wCglyZWFkeWJpdCA9IDE7Cgl3YWtldXAoJnJlbmQpOwoJUnVuQXBwbGlj YXRpb25FdmVudExvb3AoKTsKfQoKc3RhdGljIGludCAKY29udmVydF9rZXkoVUludDMyIGtleSkK ewoJc3dpdGNoKGtleSkgewoJCWNhc2UgUVpfSUJPT0tfRU5URVI6CgkJY2FzZSBRWl9SRVRVUk46 IHJldHVybiAnXG4nOwoJCWNhc2UgUVpfRVNDQVBFOiByZXR1cm4gMjc7CgkJY2FzZSBRWl9CQUNL U1BBQ0U6IHJldHVybiAnXGInOwoJCWNhc2UgUVpfTEFMVDogcmV0dXJuIEthbHQ7CgkJY2FzZSBR Wl9MQ1RSTDogcmV0dXJuIEtjdGw7CgkJY2FzZSBRWl9MU0hJRlQ6IHJldHVybiBLc2hpZnQ7CgkJ Y2FzZSBRWl9GMTogcmV0dXJuIEtGKzE7CgkJY2FzZSBRWl9GMjogcmV0dXJuIEtGKzI7CgkJY2Fz ZSBRWl9GMzogcmV0dXJuIEtGKzM7CgkJY2FzZSBRWl9GNDogcmV0dXJuIEtGKzQ7CgkJY2FzZSBR Wl9GNTogcmV0dXJuIEtGKzU7CgkJY2FzZSBRWl9GNjogcmV0dXJuIEtGKzY7CgkJY2FzZSBRWl9G NzogcmV0dXJuIEtGKzc7CgkJY2FzZSBRWl9GODogcmV0dXJuIEtGKzg7CgkJY2FzZSBRWl9GOTog cmV0dXJuIEtGKzk7CgkJY2FzZSBRWl9GMTA6IHJldHVybiBLRisxMDsKCQljYXNlIFFaX0YxMTog cmV0dXJuIEtGKzExOwoJCWNhc2UgUVpfRjEyOiByZXR1cm4gS0YrMTI7CgkJY2FzZSBRWl9JTlNF UlQ6IHJldHVybiBLaW5zOwoJCWNhc2UgUVpfREVMRVRFOiByZXR1cm4gMHg3RjsKCQljYXNlIFFa X0hPTUU6IHJldHVybiBLaG9tZTsKCQljYXNlIFFaX0VORDogcmV0dXJuIEtlbmQ7CgkJY2FzZSBR Wl9LUF9QTFVTOiByZXR1cm4gJysnOwoJCWNhc2UgUVpfS1BfTUlOVVM6IHJldHVybiAnLSc7CgkJ Y2FzZSBRWl9UQUI6IHJldHVybiAnXHQnOwoJCWNhc2UgUVpfUEFHRVVQOiByZXR1cm4gS3BndXA7 CgkJY2FzZSBRWl9QQUdFRE9XTjogcmV0dXJuIEtwZ2Rvd247CgkJY2FzZSBRWl9VUDogcmV0dXJu IEt1cDsKCQljYXNlIFFaX0RPV046IHJldHVybiBLZG93bjsKCQljYXNlIFFaX0xFRlQ6IHJldHVy biBLbGVmdDsKCQljYXNlIFFaX1JJR0hUOiByZXR1cm4gS3JpZ2h0OwoJCWNhc2UgUVpfS1BfTVVM VElQTFk6IHJldHVybiAnKic7CgkJY2FzZSBRWl9LUF9ESVZJREU6IHJldHVybiAnLyc7CgkJY2Fz ZSBRWl9LUF9FTlRFUjogcmV0dXJuICdcbic7CgkJY2FzZSBRWl9LUF9QRVJJT0Q6IHJldHVybiAn Lic7CgkJY2FzZSBRWl9LUDA6IHJldHVybiAnMCc7CgkJY2FzZSBRWl9LUDE6IHJldHVybiAnMSc7 CgkJY2FzZSBRWl9LUDI6IHJldHVybiAnMic7CgkJY2FzZSBRWl9LUDM6IHJldHVybiAnMyc7CgkJ Y2FzZSBRWl9LUDQ6IHJldHVybiAnNCc7CgkJY2FzZSBRWl9LUDU6IHJldHVybiAnNSc7CgkJY2Fz ZSBRWl9LUDY6IHJldHVybiAnNic7CgkJY2FzZSBRWl9LUDc6IHJldHVybiAnNyc7CgkJY2FzZSBR Wl9LUDg6IHJldHVybiAnOCc7CgkJY2FzZSBRWl9LUDk6IHJldHVybiAnOSc7CgkJZGVmYXVsdDog cmV0dXJuIC0xOwoJfQp9Cgp2b2lkCnNlbmRidXR0b25zKGludCBiLCBpbnQgeCwgaW50IHkpCnsK CWludCBpOwoJbG9jaygmbW91c2UubGspOwoJaSA9IG1vdXNlLndpOwoJaWYobW91c2VxdWV1ZSkg ewoJCWlmKGkgPT0gbW91c2UucmkgfHwgbW91c2UubGFzdGIgIT0gYiB8fCBtb3VzZS50cmFucykg ewoJCQltb3VzZS53aSA9IChpKzEpJU1vdXNlcXVldWU7CgkJCWlmKG1vdXNlLndpID09IG1vdXNl LnJpKQoJCQkJbW91c2UucmkgPSAobW91c2UucmkrMSklTW91c2VxdWV1ZTsKCQkJbW91c2UudHJh bnMgPSBtb3VzZS5sYXN0YiAhPSBiOwoJCX0gZWxzZSB7CgkJCWkgPSAoaS0xK01vdXNlcXVldWUp JU1vdXNlcXVldWU7CgkJfQoJfSBlbHNlIHsKCQltb3VzZS53aSA9IChpKzEpJU1vdXNlcXVldWU7 CgkJbW91c2UucmkgPSBpOwoJfQoJbW91c2UucXVldWVbaV0ueHkueCA9IHg7Cgltb3VzZS5xdWV1 ZVtpXS54eS55ID0geTsKCW1vdXNlLnF1ZXVlW2ldLmJ1dHRvbnMgPSBiOwoJbW91c2UucXVldWVb aV0ubXNlYyA9IHRpY2tzKCk7Cgltb3VzZS5sYXN0YiA9IGI7Cgl1bmxvY2soJm1vdXNlLmxrKTsK CXdha2V1cCgmbW91c2Uucik7Cn0KCnN0YXRpYyB2b2lkCmxlYXZlX2Z1bGxfc2NyZWVuKCkKewoJ aWYgKGFtRnVsbFNjcmVlbikgewoJCUVuZEZ1bGxTY3JlZW4oZnVsbFNjcmVlblJlc3RvcmUsIDAp OwoJCXRoZVdpbmRvdyA9IG9sZFdpbmRvdzsKCQlTaG93V2luZG93KHRoZVdpbmRvdyk7CgkJYW1G dWxsU2NyZWVuID0gMDsKCQl3aW5kb3dfcmVzaXplZCgpOwoJCVJlY3RhbmdsZSByZWN0ID0gIHsg eyAwLCAwIH0sCiAJCQkJCQkJeyBib3VuZHMuc2l6ZS53aWR0aCwKIAkJCQkJCQkgIGJvdW5kcy5z aXplLmhlaWdodH0gfTsKCQlkcmF3cWxvY2soKTsKIAkJZmx1c2htZW1zY3JlZW4ocmVjdCk7CiAJ CWRyYXdxdW5sb2NrKCk7Cgl9Cn0KCnN0YXRpYyB2b2lkCmZ1bGxfc2NyZWVuKCkKewoJR0RIYW5k bGUgZGV2aWNlOwoJaWYgKCFhbUZ1bGxTY3JlZW4pIHsKCQlvbGRXaW5kb3cgPSB0aGVXaW5kb3c7 CgkJSGlkZVdpbmRvdyh0aGVXaW5kb3cpOwoJCUdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZSh0 aGVXaW5kb3csIGtXaW5kb3dUaXRsZUJhclJnbiwgJmRldmljZSwgTlVMTCk7CgkJQmVnaW5GdWxs U2NyZWVuKCZmdWxsU2NyZWVuUmVzdG9yZSwgZGV2aWNlLCAwLCAwLCAmdGhlV2luZG93LCAwLCAw KTsKCQlhbUZ1bGxTY3JlZW4gPSAxOwoJCXdpbmRvd19yZXNpemVkKCk7CgkJUmVjdGFuZ2xlIHJl Y3QgPSAgeyB7IDAsIDAgfSwKIAkJCQkJCQl7IGJvdW5kcy5zaXplLndpZHRoLAogCQkJCQkJCSAg Ym91bmRzLnNpemUuaGVpZ2h0fSB9OwoJCWRyYXdxbG9jaygpOwogCQlmbHVzaG1lbXNjcmVlbihy ZWN0KTsKIAkJZHJhd3F1bmxvY2soKTsKCX0gZWxzZSB7CgkJbGVhdmVfZnVsbF9zY3JlZW4oKTsK CX0KfQoKc3RhdGljIE9TU3RhdHVzIE1haW5XaW5kb3dFdmVudEhhbmRsZXIoRXZlbnRIYW5kbGVy Q2FsbFJlZiBuZXh0SGFuZGxlciwgRXZlbnRSZWYgZXZlbnQsIHZvaWQgKnVzZXJEYXRhKQp7CglP U1N0YXR1cyByZXN1bHQgPSBub0VycjsKCXJlc3VsdCA9IENhbGxOZXh0RXZlbnRIYW5kbGVyKG5l eHRIYW5kbGVyLCBldmVudCk7CglVSW50MzIgY2xhc3MgPSBHZXRFdmVudENsYXNzIChldmVudCk7 CglVSW50MzIga2luZCA9IEdldEV2ZW50S2luZCAoZXZlbnQpOwoJc3RhdGljIHVpbnQzMl90IG1v dXNlYnV0dG9ucyA9IDA7IC8vIGJpdG1hc2sgb2YgYnV0dG9ucyBjdXJyZW50bHkgZG93bgoJc3Rh dGljIHVpbnQzMl90IG1vdXNlWCA9IDA7IAoJc3RhdGljIHVpbnQzMl90IG1vdXNlWSA9IDA7IAoK CWlmKGNsYXNzID09IGtFdmVudENsYXNzS2V5Ym9hcmQpIHsKCQljaGFyIG1hY0NoYXJDb2RlczsK CQlVSW50MzIgbWFjS2V5Q29kZTsKCQlVSW50MzIgbWFjS2V5TW9kaWZpZXJzOwoKCQlHZXRFdmVu dFBhcmFtZXRlcihldmVudCwga0V2ZW50UGFyYW1LZXlNYWNDaGFyQ29kZXMsIHR5cGVDaGFyLAoJ CQkJCQkJTlVMTCwgc2l6ZW9mKG1hY0NoYXJDb2RlcyksIE5VTEwsICZtYWNDaGFyQ29kZXMpOwoJ CUdldEV2ZW50UGFyYW1ldGVyKGV2ZW50LCBrRXZlbnRQYXJhbUtleUNvZGUsIHR5cGVVSW50MzIs IE5VTEwsCgkJCQkJCQlzaXplb2YobWFjS2V5Q29kZSksIE5VTEwsICZtYWNLZXlDb2RlKTsKCQlH ZXRFdmVudFBhcmFtZXRlcihldmVudCwga0V2ZW50UGFyYW1LZXlNb2RpZmllcnMsIHR5cGVVSW50 MzIsIE5VTEwsCgkJCQkJCQlzaXplb2YobWFjS2V5TW9kaWZpZXJzKSwgTlVMTCwgJm1hY0tleU1v ZGlmaWVycyk7CiAgICAgICAgc3dpdGNoKGtpbmQpIHsKCQljYXNlIGtFdmVudFJhd0tleU1vZGlm aWVyc0NoYW5nZWQ6CgkJCXN3aXRjaChtYWNLZXlNb2RpZmllcnMgJiAob3B0aW9uS2V5IHwgY21k S2V5KSkgewoJCQljYXNlIChvcHRpb25LZXkgfCBjbWRLZXkpOgoJCQkJLyogZHVlIHRvIGNob3Jk aW5nIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZW4gYm90aAoJCQkJICogbW9kaWZpZXIg a2V5cyBhcmUgcHJlc3NlZCBhdCB0aGUgc2FtZSB0aW1lLiAKCQkJCSAqIGN1cnJlbnRseSBpdCdz IG9ubHkgMi0zIHNuYXJmIGFuZCB0aGUgMy0yIG5vb3AKCQkJCSAqLwoJCQkJYWx0UHJlc3NlZCA9 IHRydWU7CgkJCQlpZihtb3VzZWJ1dHRvbnMgJiAxIHx8IG1vdXNlYnV0dG9ucyAmIDIgfHwgbW91 c2VidXR0b25zICYgNCkgewoJCQkJCW1vdXNlYnV0dG9ucyB8PSAyOwkvKiBzZXQgYnV0dG9uIDIg Ki8KCQkJCQltb3VzZWJ1dHRvbnMgfD0gNDsJLyogc2V0IGJ1dHRvbiAzICovCgkJCQkJYnV0dG9u MiA9IHRydWU7CgkJCQkJYnV0dG9uMyA9IHRydWU7CgkJCQkJc2VuZGJ1dHRvbnMobW91c2VidXR0 b25zLCBtb3VzZVgsIG1vdXNlWSk7CgkJCQl9IAoJCQkJYnJlYWs7CgkJCWNhc2Ugb3B0aW9uS2V5 OgoJCQkJYWx0UHJlc3NlZCA9IHRydWU7CgkJCQlpZihtb3VzZWJ1dHRvbnMgJiAxIHx8IG1vdXNl YnV0dG9ucyAmIDQpIHsKCQkJCQltb3VzZWJ1dHRvbnMgfD0gMjsJLyogc2V0IGJ1dHRvbiAyICov CgkJCQkJYnV0dG9uMiA9IHRydWU7CgkJCQkJc2VuZGJ1dHRvbnMobW91c2VidXR0b25zLCBtb3Vz ZVgsIG1vdXNlWSk7CgkJCQl9IAoJCQkJYnJlYWs7CgkJCWNhc2UgY21kS2V5OgoJCQkJaWYobW91 c2VidXR0b25zICYgMSB8fCBtb3VzZWJ1dHRvbnMgJiAyKSB7CgkJCQkJbW91c2VidXR0b25zIHw9 IDQ7CS8qIHNldCBidXR0b24gMyAqLwoJCQkJCWJ1dHRvbjMgPSB0cnVlOwoJCQkJCXNlbmRidXR0 b25zKG1vdXNlYnV0dG9ucywgbW91c2VYLCBtb3VzZVkpOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNh c2UgMDoKCQkJZGVmYXVsdDoKCQkJCWlmKGJ1dHRvbjIgfHwgYnV0dG9uMykgewoJCQkJCWlmKGJ1 dHRvbjIpIHsKCQkJCQkJbW91c2VidXR0b25zICY9IH4yOwkvKiBjbGVhciBidXR0b24gMiAqLwoJ CQkJCQlidXR0b24yID0gZmFsc2U7CgkJCQkJCWFsdFByZXNzZWQgPSBmYWxzZTsKCQkJCQl9IAoJ CQkJCWlmKGJ1dHRvbjMpIHsKCQkJCQkJbW91c2VidXR0b25zICY9IH40OwkvKiBjbGVhciBidXR0 b24gMyAqLwoJCQkJCQlidXR0b24zID0gZmFsc2U7CgkJCQkJfQoJCQkJCXNlbmRidXR0b25zKG1v dXNlYnV0dG9ucywgbW91c2VYLCBtb3VzZVkpOwoJCQkJfQoJCQkJaWYoYWx0UHJlc3NlZCkgewoJ CQkJCWtiZHB1dGMoa2JkcSwgS2FsdCk7CgkJCQkJYWx0UHJlc3NlZCA9IGZhbHNlOwoJCQkJfSAK CQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2Uga0V2ZW50UmF3S2V5RG93bjoKCQljYXNl IGtFdmVudFJhd0tleVJlcGVhdDoKCQkJaWYobWFjS2V5TW9kaWZpZXJzICE9IGNtZEtleSkgewoJ CQkJVW5pQ2hhciB1YzsKCQkJCWludCBrZXkgPSBjb252ZXJ0X2tleShtYWNLZXlDb2RlKTsKCQkJ CUdldEV2ZW50UGFyYW1ldGVyKGV2ZW50LCBrRXZlbnRQYXJhbUtleVVuaWNvZGVzLCB0eXBlVW5p Y29kZVRleHQsIE5VTEwsIHNpemVvZih1YyksIE5VTEwsICZ1Yyk7CgoJCQkJaWYoa2V5ICE9IC0x KQoJCQkJCWtiZHB1dGMoa2JkcSwga2V5KTsKCQkJCWVsc2UKCQkJCQlrYmRwdXRjKGtiZHEsIHVj KTsKCQkJfSBlbHNlIHsKCQkJCWlmKG1hY0NoYXJDb2RlcyA9PSAnZicgfHwgbWFjQ2hhckNvZGVz ID09ICdGJykgewoJCQkJCWZ1bGxfc2NyZWVuKCk7CgkJCQl9IGVsc2UgaWYobWFjQ2hhckNvZGVz ID09ICdxJyB8fCBtYWNDaGFyQ29kZXMgPT0gJ1EnKSB7CgkJCQkJZXhpdCgwKTsKCQkJCX0gCgkJ CX0KCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJCX0KCX0gZWxzZSBpZihjbGFzcyA9 PSBrRXZlbnRDbGFzc01vdXNlKSB7CgkJX1BvaW50IG1vdXNlUG9zOwoKCQlHZXRFdmVudFBhcmFt ZXRlcihldmVudCwga0V2ZW50UGFyYW1Nb3VzZUxvY2F0aW9uLCB0eXBlUURQb2ludCwKCQkJCQkJ CTAsIHNpemVvZiBtb3VzZVBvcywgMCwgJm1vdXNlUG9zKTsKCQkKCQlzd2l0Y2ggKGtpbmQpIHsK CQkJY2FzZSBrRXZlbnRNb3VzZVdoZWVsTW92ZWQ6CgkJCXsKCQkJICAgIGludDMyX3Qgd2hlZWxk ZWx0YTsKCQkJCUdldEV2ZW50UGFyYW1ldGVyKGV2ZW50LGtFdmVudFBhcmFtTW91c2VXaGVlbERl bHRhLHR5cGVTSW50MzIsCgkJCQkJCQkJCTAsc2l6ZW9mKHdoZWVsZGVsdGEpLCAwLCAmd2hlZWxk ZWx0YSk7CgkJCQltb3VzZVggPSBtb3VzZVBvcy5oIC0gd2luUmVjdC5sZWZ0OwoJCQkJbW91c2VZ ID0gbW91c2VQb3MudiAtIHdpblJlY3QudG9wOwoJCQkJc2VuZGJ1dHRvbnMod2hlZWxkZWx0YT4w ID8gOCA6IDE2LCBtb3VzZVgsIG1vdXNlWSk7CgkJCQlicmVhazsKCQkJfQoJCQljYXNlIGtFdmVu dE1vdXNlVXA6CgkJCWNhc2Uga0V2ZW50TW91c2VEb3duOgoJCQl7CgkJCQl1aW50MzJfdCBidXR0 b25zOwoJCQkJdWludDMyX3QgbW9kaWZpZXJzOwoJCQkJR2V0RXZlbnRQYXJhbWV0ZXIoZXZlbnQs IGtFdmVudFBhcmFtS2V5TW9kaWZpZXJzLCB0eXBlVUludDMyLCAKCQkJCQkJCQkJMCwgc2l6ZW9m KG1vZGlmaWVycyksIDAsICZtb2RpZmllcnMpOwoJCQkJR2V0RXZlbnRQYXJhbWV0ZXIoZXZlbnQs IGtFdmVudFBhcmFtTW91c2VDaG9yZCwgdHlwZVVJbnQzMiwgCgkJCQkJCQkJCTAsIHNpemVvZiBi dXR0b25zLCAwLCAmYnV0dG9ucyk7CgkJCQkvKiBzaW11bGF0ZSBvdGhlciBidXR0b25zIHZpYSBh bHQvYXBwbGUga2V5LiBsaWtlIHgxMSAqLwoJCQkJaWYobW9kaWZpZXJzICYgb3B0aW9uS2V5KSB7 CgkJCQkJbW91c2VidXR0b25zID0gKChidXR0b25zICYgMSkgPyAyIDogMCk7CgkJCQkJYWx0UHJl c3NlZCA9IGZhbHNlOwoJCQkJfSBlbHNlIGlmKG1vZGlmaWVycyAmIGNtZEtleSkKCQkJCQltb3Vz ZWJ1dHRvbnMgPSAoKGJ1dHRvbnMgJiAxKSA/IDQgOiAwKTsKCQkJCWVsc2UKCQkJCQltb3VzZWJ1 dHRvbnMgPSAoYnV0dG9ucyAmIDEpOwoKCQkJCW1vdXNlYnV0dG9ucyB8PSAoKGJ1dHRvbnMgJiAy KTw8MSk7CgkJCQltb3VzZWJ1dHRvbnMgfD0gKChidXR0b25zICYgNCk+PjEpOwoKCQkJfSAvKiBG YWxsdGhyb3VnaCAqLwoJCQljYXNlIGtFdmVudE1vdXNlTW92ZWQ6CgkJCWNhc2Uga0V2ZW50TW91 c2VEcmFnZ2VkOgoJCQkJbW91c2VYID0gbW91c2VQb3MuaCAtIHdpblJlY3QubGVmdDsKCQkJCW1v dXNlWSA9IG1vdXNlUG9zLnYgLSB3aW5SZWN0LnRvcDsKCQkJCXNlbmRidXR0b25zKG1vdXNlYnV0 dG9ucywgbW91c2VYLCBtb3VzZVkpOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlyZXN1bHQg PSBldmVudE5vdEhhbmRsZWRFcnI7CgkJCQlicmVhazsKCQl9Cgl9IAoJcmV0dXJuIHJlc3VsdDsK fQoKCi8vZGVmYXVsdCB3aW5kb3cgY29tbWFuZCBoYW5kbGVyIChmcm9tIG1lbnVzKQpzdGF0aWMg T1NTdGF0dXMgTWFpbldpbmRvd0NvbW1hbmRIYW5kbGVyKEV2ZW50SGFuZGxlckNhbGxSZWYgbmV4 dEhhbmRsZXIsCgkJCQkJRXZlbnRSZWYgZXZlbnQsIHZvaWQgKnVzZXJEYXRhKQp7CglPU1N0YXR1 cyByZXN1bHQgPSBub0VycjsKCVVJbnQzMiBjbGFzcyA9IEdldEV2ZW50Q2xhc3MgKGV2ZW50KTsK CVVJbnQzMiBraW5kID0gR2V0RXZlbnRLaW5kIChldmVudCk7CgoJcmVzdWx0ID0gQ2FsbE5leHRF dmVudEhhbmRsZXIobmV4dEhhbmRsZXIsIGV2ZW50KTsKCglpZihjbGFzcyA9PSBrRXZlbnRDbGFz c0NvbW1hbmQpCgl7CgkJSElDb21tYW5kIHRoZUhJQ29tbWFuZDsKCQlHZXRFdmVudFBhcmFtZXRl ciggZXZlbnQsIGtFdmVudFBhcmFtRGlyZWN0T2JqZWN0LCB0eXBlSElDb21tYW5kLAoJCQkJCQkJ TlVMTCwgc2l6ZW9mKCBISUNvbW1hbmQgKSwgTlVMTCwgJnRoZUhJQ29tbWFuZCApOwoKCQlzd2l0 Y2ggKCB0aGVISUNvbW1hbmQuY29tbWFuZElEICkgewoJCQljYXNlIGtISUNvbW1hbmRRdWl0OgoJ CQkJZXhpdCgwKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSBrRnVsbFNjcmVlbkNtZDoKCQkJCS8qIHNp bmNlIHdlIHdvbid0IHNlZSB0aGlzIGV2ZW50IGluIGZ1bGwtc2NyZWVuIG1vZGUgd2UgbmVlZAoJ CQkJICogdG8gaW50ZXJjZXB0IGtleWJvYXJkIGNsaWNrcyB0b28gKGFwcGxlLUYpLiAKCQkJCSAq LwoJCQkJZnVsbF9zY3JlZW4oKTsKCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCXJlc3VsdCA9 IGV2ZW50Tm90SGFuZGxlZEVycjsKCQkJCWJyZWFrOwoJCX0KCX0gZWxzZSBpZihjbGFzcyA9PSBr RXZlbnRDbGFzc1dpbmRvdykgewoJCVdpbmRvd1JlZgkJd2luZG93OwoJCV9SZWN0CQkJcmVjdFBv cnQgPSB7MCwwLDAsMH07CgoJCUdldEV2ZW50UGFyYW1ldGVyKGV2ZW50LCBrRXZlbnRQYXJhbURp cmVjdE9iamVjdCwgdHlwZVdpbmRvd1JlZiwKCQkJCQkJCU5VTEwsIHNpemVvZihXaW5kb3dSZWYp LCBOVUxMLCAmd2luZG93KTsKCgkJaWYod2luZG93KQoJCQlHZXRQb3J0Qm91bmRzKEdldFdpbmRv d1BvcnQod2luZG93KSwgJnJlY3RQb3J0KTsKCgkJc3dpdGNoIChraW5kKSB7CgkJCWNhc2Uga0V2 ZW50V2luZG93Q2xvc2VkOgoJCQkJdGhlV2luZG93ID0gTlVMTDsKCQkJCWV4aXQoMCk7CgkJCQli cmVhazsKCgkJCS8vcmVzaXplIHdpbmRvdwoJCQljYXNlIGtFdmVudFdpbmRvd0JvdW5kc0NoYW5n ZWQ6CgkJCQl3aW5kb3dfcmVzaXplZCgpOwoJCQkJUmVjdGFuZ2xlIHJlY3QgPSAgeyB7IDAsIDAg fSwKIAkJCQkJCQkJCXsgYm91bmRzLnNpemUud2lkdGgsCiAJCQkJCQkJCQkgIGJvdW5kcy5zaXpl LmhlaWdodH0gfTsKCQkJCWRyYXdxbG9jaygpOwogCQkJCWZsdXNobWVtc2NyZWVuKHJlY3QpOwog CQkJCWRyYXdxdW5sb2NrKCk7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlyZXN1bHQgPSBl dmVudE5vdEhhbmRsZWRFcnI7CgkJCQlicmVhazsKCQl9Cgl9CgoJcmV0dXJuIHJlc3VsdDsKfQoK dm9pZApmbHVzaG1lbXNjcmVlbihSZWN0YW5nbGUgcikKewoJLy8gc2FuaXR5IGNoZWNrLiAgVHJp cHMgZnJvbSB0aGUgaW5pdGlhbCAidGVybWluYWwiCiAgICBpZiAoci5tYXgueCA8IHIubWluLngg fHwgci5tYXgueSA8IHIubWluLnkpIHJldHVybjsKICAgIAoJc2NyZWVubG9hZChyLCBnc2NyZWVu LT5kZXB0aCwgYnl0ZWFkZHIoZ3NjcmVlbiwgWlApLCBaUCwKCQlnc2NyZWVuLT53aWR0aCpzaXpl b2YodWxvbmcpKTsKfQoKdWNoYXIqCmF0dGFjaHNjcmVlbihSZWN0YW5nbGUgKnIsIHVsb25nICpj aGFuLCBpbnQgKmRlcHRoLCBpbnQgKndpZHRoLCBpbnQgKnNvZnRzY3JlZW4sIHZvaWQgKipYKQp7 CgkqciA9IGdzY3JlZW4tPnI7CgkqY2hhbiA9IGdzY3JlZW4tPmNoYW47CgkqZGVwdGggPSBnc2Ny ZWVuLT5kZXB0aDsKCSp3aWR0aCA9IGdzY3JlZW4tPndpZHRoOwoJKnNvZnRzY3JlZW4gPSAxOwoK CXJldHVybiBnc2NyZWVuLT5kYXRhLT5iZGF0YTsKfQoKLy8gUEFMIC0gbm8gcGFsZXR0ZSBoYW5k bGluZy4gIERvbid0IGludGVuZCB0byBlaXRoZXIuCnZvaWQKZ2V0Y29sb3IodWxvbmcgaSwgdWxv bmcgKnIsIHVsb25nICpnLCB1bG9uZyAqYikKewoKLy8gUEFMOiBDZXJ0YWlubHkgd3JvbmcgdG8g cmV0dXJuIGEgZ3JheXNjYWxlLgoJICpyID0gaTsKCSAqZyA9IGk7CgkgKmIgPSBpOwp9Cgp2b2lk CnNldGNvbG9yKHVsb25nIGluZGV4LCB1bG9uZyByZWQsIHVsb25nIGdyZWVuLCB1bG9uZyBibHVl KQp7Cglhc3NlcnQoMCk7Cn0KCgpzdGF0aWMgY2hhciBzbmFyZlszKlNuYXJmU2l6ZSsxXTsKc3Rh dGljIFJ1bmUgcnNuYXJmW1NuYXJmU2l6ZSsxXTsKCmNoYXIqCmNsaXByZWFkKHZvaWQpCnsKCUNG RGF0YVJlZiBjZmRhdGE7CglPU1N0YXR1cyBlcnIgPSBub0VycjsKCUl0ZW1Db3VudCBuSXRlbXM7 CgoJLy8gV293LiAgVGhpcyBpcyByaWRpY3Vsb3VzbHkgY29tcGxpY2F0ZWQuCglQYXN0ZWJvYXJk U3luY2hyb25pemUoYXBwbGVjbGlwKTsKCWlmKChlcnIgPSBQYXN0ZWJvYXJkR2V0SXRlbUNvdW50 KGFwcGxlY2xpcCwgJm5JdGVtcykpICE9IG5vRXJyKSB7CgkJZnByaW50ZihzdGRlcnIsICJhcHBs ZSBwYXN0ZWJvYXJkIEdldEl0ZW1Db3VudCBmYWlsZWQgLSBFcnJvciAlZFxuIiwgKGludCllcnIp OwoJCXJldHVybiAwOwoJfQoKCXVpbnQzMl90IGk7CgkvLyBZZXMsIGJhc2VkIGF0IDEuICBTaWxs eSBBUEkuCglmb3IoaSA9IDE7IGkgPD0gbkl0ZW1zOyArK2kpIHsKCQlQYXN0ZWJvYXJkSXRlbUlE IGl0ZW1JRDsKCQlDRkFycmF5UmVmIGZsYXZvclR5cGVBcnJheTsKCQlDRkluZGV4IGZsYXZvckNv dW50OwoKCQlpZigoZXJyID0gUGFzdGVib2FyZEdldEl0ZW1JZGVudGlmaWVyKGFwcGxlY2xpcCwg aSwgJml0ZW1JRCkpICE9IG5vRXJyKXsKCQkJZnByaW50ZihzdGRlcnIsICJDYW4ndCBnZXQgcGFz dGVib2FyZCBpdGVtIGlkZW50aWZpZXI6ICVkXG4iLCAoaW50KWVycik7CgkJCXJldHVybiAwOwoJ CX0KCgkJaWYoKGVyciA9IFBhc3RlYm9hcmRDb3B5SXRlbUZsYXZvcnMoYXBwbGVjbGlwLCBpdGVt SUQsICZmbGF2b3JUeXBlQXJyYXkpKSE9bm9FcnIpewoJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0 IGNvcHkgcGFzdGVib2FyZCBpdGVtIGZsYXZvcnM6ICVkXG4iLCAoaW50KWVycik7CgkJCXJldHVy biAwOwoJCX0KCgkJZmxhdm9yQ291bnQgPSBDRkFycmF5R2V0Q291bnQoZmxhdm9yVHlwZUFycmF5 KTsKCQlDRkluZGV4IGZsYXZvckluZGV4OwoJCWZvcihmbGF2b3JJbmRleCA9IDA7IGZsYXZvcklu ZGV4IDwgZmxhdm9yQ291bnQ7ICsrZmxhdm9ySW5kZXgpewoJCQlDRlN0cmluZ1JlZiBmbGF2b3JU eXBlOwoJCQlmbGF2b3JUeXBlID0gKENGU3RyaW5nUmVmKUNGQXJyYXlHZXRWYWx1ZUF0SW5kZXgo Zmxhdm9yVHlwZUFycmF5LCBmbGF2b3JJbmRleCk7CgkJCWlmIChVVFR5cGVDb25mb3Jtc1RvKGZs YXZvclR5cGUsIENGU1RSKCJwdWJsaWMudXRmMTYtcGxhaW4tdGV4dCIpKSl7CgkJCQlpZigoZXJy ID0gUGFzdGVib2FyZENvcHlJdGVtRmxhdm9yRGF0YShhcHBsZWNsaXAsIGl0ZW1JRCwKCQkJCQlD RlNUUigicHVibGljLnV0ZjE2LXBsYWluLXRleHQiKSwgJmNmZGF0YSkpICE9IG5vRXJyKXsKCQkJ CQlmcHJpbnRmKHN0ZGVyciwgImFwcGxlIHBhc3RlYm9hcmQgQ29weUl0ZW0gZmFpbGVkIC0gRXJy b3IgJWRcbiIsIChpbnQpZXJyKTsKCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJCUNGSW5kZXggbGVu Z3RoID0gQ0ZEYXRhR2V0TGVuZ3RoKGNmZGF0YSk7CgkJCQlpZiAobGVuZ3RoID4gc2l6ZW9mIHJz bmFyZikgbGVuZ3RoID0gc2l6ZW9mIHJzbmFyZjsKCQkJCUNGRGF0YUdldEJ5dGVzKGNmZGF0YSwg Q0ZSYW5nZU1ha2UoMCwgbGVuZ3RoKSwgKHVpbnQ4X3QgKilyc25hcmYpOwoJCQkJc25wcmludChz bmFyZiwgc2l6ZW9mIHNuYXJmLCAiJS4qUyIsIGxlbmd0aC9zaXplb2YoUnVuZSksIHJzbmFyZik7 CgkJCQljaGFyICpzID0gc25hcmY7CgkJCQl3aGlsZSAoKnMpIHsKCQkJCQlpZiAoKnMgPT0gJ1xy JykgKnMgPSAnXG4nOwoJCQkJCXMrKzsKCQkJCX0KCQkJCUNGUmVsZWFzZShjZmRhdGEpOwoJCQkJ cmV0dXJuIHN0cmR1cChzbmFyZik7CgkJCX0KCQl9Cgl9CglyZXR1cm4gMDsKfQoKaW50CmNsaXB3 cml0ZShjaGFyICpzbmFyZikKewoJQ0ZEYXRhUmVmIGNmZGF0YTsKCVBhc3RlYm9hcmRTeW5jRmxh Z3MgZmxhZ3M7CgoJcnVuZXNucHJpbnQocnNuYXJmLCBuZWxlbShyc25hcmYpLCAiJXMiLCBzbmFy Zik7CglpZihQYXN0ZWJvYXJkQ2xlYXIoYXBwbGVjbGlwKSAhPSBub0Vycil7CgkJZnByaW50Zihz dGRlcnIsICJhcHBsZSBwYXN0ZWJvYXJkIGNsZWFyIGZhaWxlZFxuIik7CgkJcmV0dXJuIDA7Cgl9 CglmbGFncyA9IFBhc3RlYm9hcmRTeW5jaHJvbml6ZShhcHBsZWNsaXApOwoJaWYoKGZsYWdzJmtQ YXN0ZWJvYXJkTW9kaWZpZWQpIHx8ICEoZmxhZ3Mma1Bhc3RlYm9hcmRDbGllbnRJc093bmVyKSl7 CgkJZnByaW50ZihzdGRlcnIsICJhcHBsZSBwYXN0ZWJvYXJkIGNhbm5vdCBhc3NlcnQgb3duZXJz aGlwXG4iKTsKCQlyZXR1cm4gMDsKCX0KCWNmZGF0YSA9IENGRGF0YUNyZWF0ZShrQ0ZBbGxvY2F0 b3JEZWZhdWx0LCAKCQkodWNoYXIqKXJzbmFyZiwgcnVuZXN0cmxlbihyc25hcmYpKjIpOwoJaWYo Y2ZkYXRhID09IG5pbCl7CgkJZnByaW50ZihzdGRlcnIsICJhcHBsZSBwYXN0ZWJvYXJkIGNmZGF0 YWNyZWF0ZSBmYWlsZWRcbiIpOwoJCXJldHVybiAwOwoJfQoJaWYoUGFzdGVib2FyZFB1dEl0ZW1G bGF2b3IoYXBwbGVjbGlwLCAoUGFzdGVib2FyZEl0ZW1JRCkxLAoJCUNGU1RSKCJwdWJsaWMudXRm MTYtcGxhaW4tdGV4dCIpLCBjZmRhdGEsIDApICE9IG5vRXJyKXsKCQlmcHJpbnRmKHN0ZGVyciwg ImFwcGxlIHBhc3RlYm9hcmQgcHV0aXRlbSBmYWlsZWRcbiIpOwoJCUNGUmVsZWFzZShjZmRhdGEp OwoJCXJldHVybiAwOwoJfQoJQ0ZSZWxlYXNlKGNmZGF0YSk7CglyZXR1cm4gMTsKfQoKCnZvaWQK bW91c2VzZXQoUG9pbnQgeHkpCnsKCUNHUG9pbnQgcG50OwoJcG50LnggPSB4eS54ICsgd2luUmVj dC5sZWZ0OwoJcG50LnkgPSB4eS55ICsgd2luUmVjdC50b3A7CglDR1dhcnBNb3VzZUN1cnNvclBv c2l0aW9uKHBudCk7Cn0KCnZvaWQKc2NyZWVubG9hZChSZWN0YW5nbGUgciwgaW50IGRlcHRoLCB1 Y2hhciAqcCwgUG9pbnQgcHQsIGludCBzdGVwKQp7CglDR1JlY3QgcmJvdW5kczsKCXJib3VuZHMu c2l6ZS53aWR0aCA9IHIubWF4LnggLSByLm1pbi54OwoJcmJvdW5kcy5zaXplLmhlaWdodCA9IHIu bWF4LnkgLSByLm1pbi55OwoJcmJvdW5kcy5vcmlnaW4ueCA9IHIubWluLng7CglyYm91bmRzLm9y aWdpbi55ID0gci5taW4ueTsKCQkKCWlmKGRlcHRoICE9IGdzY3JlZW4tPmRlcHRoKQoJCXBhbmlj KCJzY3JlZW5sb2FkOiBiYWQgbGRlcHRoIik7CgkJCglRREJlZ2luQ0dDb250ZXh0KCBHZXRXaW5k b3dQb3J0KHRoZVdpbmRvdyksICZjb250ZXh0KTsKCQoJLy8gVGhlIHN1Yi1pbWFnZSBpcyByZWxh dGl2ZSB0byBvdXIgd2hvbGUgc2NyZWVuIGltYWdlLgoJQ0dJbWFnZVJlZiBzdWJpbWcgPSBDR0lt YWdlQ3JlYXRlV2l0aEltYWdlSW5SZWN0KGZ1bGxTY3JlZW5JbWFnZSwgcmJvdW5kcyk7CgkKCS8v IERyYXdpbmcgdGhlIHN1Yi1pbWFnZSBpcyByZWxhdGl2ZSB0byB0aGUgd2luZG93LgoJcmJvdW5k cy5vcmlnaW4ueSA9IHdpblJlY3QuYm90dG9tIC0gd2luUmVjdC50b3AgLSByLm1pbi55IC0gcmJv dW5kcy5zaXplLmhlaWdodDsKCUNHQ29udGV4dERyYXdJbWFnZShjb250ZXh0LCByYm91bmRzLCBz dWJpbWcpOwoJQ0dDb250ZXh0Rmx1c2goY29udGV4dCk7CglDR0ltYWdlUmVsZWFzZShzdWJpbWcp OwoJUURFbmRDR0NvbnRleHQoIEdldFdpbmRvd1BvcnQodGhlV2luZG93KSwgJmNvbnRleHQpOwoK fQoKdm9pZApzZXRjdXJzb3Iodm9pZCkKewogICAgQ3Vyc29yIGNyc3I7CiAgICBpbnQgaTsKICAg IAoJZm9yKGk9MDsgaTwxNjsgaSsrKXsKCQljcnNyLmRhdGFbaV0gPSAoKHVzaG9ydCopY3Vyc29y LnNldClbaV07CgkJY3Jzci5tYXNrW2ldID0gY3Jzci5kYXRhW2ldIHwgKCh1c2hvcnQqKWN1cnNv ci5jbHIpW2ldOwoJfQoJY3Jzci5ob3RTcG90LmggPSAtY3Vyc29yLm9mZnNldC54OwoJY3Jzci5o b3RTcG90LnYgPSAtY3Vyc29yLm9mZnNldC55OwoJU2V0Q3Vyc29yKCZjcnNyKTsKfQoKdm9pZApj dXJzb3JhcnJvdyh2b2lkKQp7CglJbml0Q3Vyc29yKCk7Cn0K ------=_Part_81629_30043821.1224303304852--