LyoKICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwogKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgTW9kdWxlIE5hbWUgOiBtbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbW1vbiBmdW5jdGlvbnMgZm9yIGhhbmRsZSBtYW5hZ2VtZW50ICAgICAqLwovKiAgICAgIGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSAiY3ByZWNvbXAuaCIKI2luY2x1ZGUgIi4uL2hhbC9ocHJlZy5oIgoKLyogVE9ETyA6IHB1dCBhbGwgY29uc3RhbnQgdGFibGVzIHRvIGEgZmlsZSAqLwpjb25zdCB1OF90IHpnMTFiUmF0ZVRibFs0XSA9IHsyLCA0LCAxMSwgMjJ9Owpjb25zdCB1OF90IHpnMTFnUmF0ZVRibFs4XSA9IHsxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4fTsKCi8qIDB4ZmYgPT4gZWxlbWVudCBkb2VzIG5vdCBleGlzdCAqLwpjb25zdCB1OF90IHpnRWxlbWVudE9mZnNldFRhYmxlW10gPQp7CiAgICA0LCAgICAgIC8qICAwIDogYXNvYyByZXEgKi8KICAgIDYsICAgICAgLyogIDEgOiBhc29jIHJzcCAqLwogICAgMTAsICAgICAvKiAgMiA6IHJlYXNvYyByZXEqLwogICAgNiwgICAgICAvKiAgMyA6IHJlYXNvYyByc3AgKi8KICAgIDAsICAgICAgLyogIDQgOiBwcm9iZSByZXEgKi8KICAgIDEyLCAgICAgLyogIDUgOiBwcm9iZSByc3AgKi8KICAgIDB4ZmYsICAgLyogIDYgOiByZXNlcnZlZCAqLwogICAgMHhmZiwgICAvKiAgNyA6IHJlc2VydmVkICovCiAgICAxMiwgICAgIC8qICA4IDogYmVhY29uICovCiAgICA0LCAgICAgIC8qICA5IDogQVRJTSAqLwogICAgMHhmZiwgICAvKiAxMCA6IGRpc2Fzb2MgKi8KICAgIDYsICAgICAgLyogMTEgOiBhdXRoICovCiAgICAweGZmLCAgIC8qIDEyIDogZGVhdXRoICovCiAgICA0LCAgICAgIC8qIDEzIDogYWN0aW9uICovCiAgICAweGZmLCAgIC8qIDE0IDogcmVzZXJ2ZWQgKi8KICAgIDB4ZmYsICAgLyogMTUgOiByZXNlcnZlZCAqLwp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZpbmRFbGVtZW50ICAgICAgICAgICAgICAgKi8KLyogICAgICBGaW5kIGEgc3BlY2lmaWMgZWxlbWVudCBpbiBtYW5hZ2VtZW50IGZyYW1lICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiBtYW5hZ2VtZW50IGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBlaWQgOiB0YXJnZXQgZWxlbWVudCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBieXRlIG9mZnNldCBvZiB0YXJnZXQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBvciAweGZmZmYgaWYgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdTE2X3QgemZGaW5kRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgZWlkKQp7CiAgICB1OF90IHN1YlR5cGU7CiAgICB1MTZfdCBvZmZzZXQ7CiAgICB1MTZfdCBidWZMZW47CiAgICB1MTZfdCBlbGVuOwogICAgdThfdCBpZCwgSFRFaWQ9MDsKICAgIHU4X3Qgb3VpWzRdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OwogICAgdThfdCBvdWkxMW5bM10gPSB7MHgwMCwweDkwLDB4NEN9OwogICAgdThfdCBIVFR5cGUgPSAwOwoKICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLwogICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCiAgICB7CiAgICAgICAgem1fYXNzZXJ0KDApOwogICAgfQoKICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KICAgIG9mZnNldCArPSAyNDsKCiAgICAvLyBqaGxlZSBIVCAwCgogICAgaWYgKChlaWQgPT0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkgfHwKICAgICAgICAoZWlkID09IFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKQogICAgewogICAgICAgIEhURWlkID0gZWlkOwogICAgICAgIGVpZCA9IFpNX1dMQU5fRUlEX1dQQV9JRTsKICAgICAgICBIVFR5cGUgPSAxOwogICAgfQoKCiAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKICAgIC8qIFNlYXJjaCBsb29wICovCiAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKICAgIHsKICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gZWlkKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKT4oYnVmTGVuIC0gb2Zmc2V0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICYmIGVpZCAhPSBaTV9XTEFOX0VJRF9TU0lEKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBlaWQgPT0gWk1fV0xBTl9FSURfV1BBX0lFICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogYXZvaWQgc3RhIHRvIGJlIHRob3VnaHQgdXNlIDExbiB3aGVuIGZpbmQgYSBXUEFfSUUgKi8KICAgICAgICAgICAgICAgIGlmICggKEhUVHlwZSA9PSAwKSAmJiB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1Ziwgb3VpLCBvZmZzZXQrMiwgNCkgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gamhsZWUgSFQgMAogICAgICAgICAgICAgICAgLy8gQ1dZYW5nKCspCgogICAgICAgICAgICAgICAgaWYgKChIVFR5cGUgPT0gMSkgJiYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1Ziwgb3VpMTFuLCBvZmZzZXQrMiwgMykgKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KSA9PSBIVEVpZCApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0ICsgNTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLwogICAgICAgICNpZiAxCiAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICAjZWxzZQogICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgfQogICAgICAgICNlbmRpZgoKICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZpbmRXaWZpRWxlbWVudCAgICAgICAgICAgKi8KLyogICAgICBGaW5kIGEgc3BlY2lmaWMgV2lmaSBlbGVtZW50IGluIG1hbmFnZW1lbnQgZnJhbWUgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiBtYW5hZ2VtZW50IGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICB0eXBlIDogT1VJIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBzdWJUeXBlIDogT1VJIHN1YnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBieXRlIG9mZnNldCBvZiB0YXJnZXQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBvciAweGZmZmYgaWYgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdTE2X3QgemZGaW5kV2lmaUVsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHR5cGUsIHU4X3Qgc3VidHlwZSkKewogICAgdThfdCBzdWJUeXBlOwogICAgdTE2X3Qgb2Zmc2V0OwogICAgdTE2X3QgYnVmTGVuOwogICAgdTE2X3QgZWxlbjsKICAgIHU4X3QgaWQ7CiAgICB1OF90IHRtcDsKCiAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CgogICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKICAgIHsKICAgICAgICB6bV9hc3NlcnQoMCk7CiAgICB9CgogICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLwogICAgb2Zmc2V0ICs9IDI0OwoKICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOwogICAgLyogU2VhcmNoIGxvb3AgKi8KICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQogICAgewogICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLwogICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9XSUZJX0lFKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKT4oYnVmTGVuIC0gb2Zmc2V0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpKSA9PSAweDUwKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweEYyKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA9PSB0eXBlKSkKCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICggc3VidHlwZSAhPSAweGZmICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpID09IHN1YnR5cGUgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgIH0KICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9Cgp1MTZfdCB6ZlJlbW92ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCBlaWQpCnsKICAgIHUxNl90IG9mZnNldCA9IDA7CiAgICB1MTZfdCBlbGVuOwogICAgdThfdCAgSFRFaWQgPSAwOwogICAgdThfdCAgb3VpWzRdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OwogICAgdThfdCAgb3VpMTFuWzNdID0gezB4MDAsMHg5MCwweDRDfTsKICAgIHU4X3QgIEhUVHlwZSA9IDA7CgogICAgaWYgKChlaWQgPT0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkgfHwKICAgICAgICAoZWlkID09IFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKQogICAgewogICAgICAgIEhURWlkID0gZWlkOwogICAgICAgIGVpZCA9IFpNX1dMQU5fRUlEX1dQQV9JRTsKICAgICAgICBIVFR5cGUgPSAxOwogICAgfQoKICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKQogICAgewogICAgICAgIGVsZW4gPSAqKGJ1ZitvZmZzZXQrMSk7CgogICAgICAgIGlmICgqKGJ1ZitvZmZzZXQpID09IGVpZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggZWlkID09IFpNX1dMQU5fRUlEX1dQQV9JRSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICggKEhUVHlwZSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzIpID09IG91aVswXSkKICAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCszKSA9PSBvdWlbMV0pCiAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNCkgPT0gb3VpWzJdKQogICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzUpID09IG91aVszXSkgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHpmTWVtb3J5TW92ZShidWYrb2Zmc2V0LCBidWYrb2Zmc2V0K2VsZW4rMiwgc2l6ZS1vZmZzZXQtZWxlbi0yKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNpemUtZWxlbi0yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIChIVFR5cGUgPT0gMSkKICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzIpID09IG91aTExblswXSkKICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzMpID09IG91aTExblsxXSkKICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzQpID09IG91aTExblsyXSkKICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzUpID09IEhURWlkKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlNb3ZlKGJ1ZitvZmZzZXQsIGJ1ZitvZmZzZXQrZWxlbisyLCBzaXplLW9mZnNldC1lbGVuLTIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgemZNZW1vcnlNb3ZlKGJ1ZitvZmZzZXQsIGJ1ZitvZmZzZXQrZWxlbisyLCBzaXplLW9mZnNldC1lbGVuLTIpOwogICAgICAgICAgICAgICAgcmV0dXJuIChzaXplLWVsZW4tMik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKICAgIH0KCiAgICByZXR1cm4gc2l6ZTsKfQoKdTE2X3QgemZVcGRhdGVFbGVtZW50KHpkZXZfdCogZGV2LCB1OF90KiBidWYsIHUxNl90IHNpemUsIHU4X3QqIHVwZGF0ZWVpZCkKewogICAgdTE2X3Qgb2Zmc2V0ID0gMDsKICAgIHUxNl90IGVsZW47CgogICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKICAgICAgICBlbGVuID0gKihidWYrb2Zmc2V0KzEpOwoKICAgICAgICBpZiAoKihidWYrb2Zmc2V0KSA9PSB1cGRhdGVlaWRbMF0pIHsKICAgICAgICAgICAgaWYgKHVwZGF0ZWVpZFsxXSA8PSBlbGVuKSB7CiAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgdXBkYXRlZWlkLCB1cGRhdGVlaWRbMV0rMik7CiAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCt1cGRhdGVlaWRbMV0rMiwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CgogICAgICAgICAgICAgICAgcmV0dXJuIHNpemUtKGVsZW4tdXBkYXRlZWlkWzFdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHpmTWVtb3J5TW92ZShidWYrb2Zmc2V0K3VwZGF0ZWVpZFsxXSsyLCBidWYrb2Zmc2V0K2VsZW4rMiwgc2l6ZS1vZmZzZXQtZWxlbi0yKTsKICAgICAgICAgICAgICAgIHpmTWVtb3J5TW92ZShidWYrb2Zmc2V0LCB1cGRhdGVlaWQsIHVwZGF0ZWVpZFsxXSsyKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZSsodXBkYXRlZWlkWzFdLWVsZW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CgogICAgcmV0dXJuIHNpemU7Cn0KCnUxNl90IHpmRmluZFN1cGVyR0VsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHR5cGUpCnsKICAgIHU4X3Qgc3ViVHlwZTsKICAgIHUxNl90IG9mZnNldDsKICAgIHUxNl90IGJ1ZkxlbjsKICAgIHUxNl90IGVsZW47CiAgICB1OF90IGlkOwogICAgdThfdCBzdXBlcl9mZWF0dXJlOwogICAgdThfdCBvdWlTdXBlckdbNl0gPSB7MHgwMCwweDAzLDB4N2YsMHgwMSwgMHgwMSwgMHgwMH07CgogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLwogICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCiAgICB7CiAgICAgICAgem1fYXNzZXJ0KDApOwogICAgfQoKICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KICAgIG9mZnNldCArPSAyNDsKCiAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKICAgIC8qIFNlYXJjaCBsb29wICovCiAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKICAgIHsKICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfVkVORE9SX1BSSVZBVEUpCiAgICAgICAgewogICAgICAgICAgICAvKiBCaW5nbyAqLwogICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIG91aVN1cGVyRywgb2Zmc2V0KzIsIDYpICYmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpID49IDYpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBzdXBlcl9mZWF0dXJlIDA6dXNlRmFzdEZyYW1lLCAxOnVzZUNvbXByZXNzaW9uLCAyOnVzZVR1cmJvUHJpbWUgKi8KICAgICAgICAgICAgICAgIHN1cGVyX2ZlYXR1cmU9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs4KTsKICAgICAgICAgICAgICAgIGlmICgoc3VwZXJfZmVhdHVyZSAmIDB4MDEpIHx8IChzdXBlcl9mZWF0dXJlICYgMHgwMikgfHwgKHN1cGVyX2ZlYXR1cmUgJiAweDA0KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCiAgICAgICAgI2lmIDEKICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgICNlbHNlCiAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICB9CiAgICAgICAgI2VuZGlmCgogICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKICAgIH0KICAgIHJldHVybiAweGZmZmY7Cn0KCnUxNl90IHpmRmluZFhSRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSkKewogICAgdThfdCBzdWJUeXBlOwogICAgdTE2X3Qgb2Zmc2V0OwogICAgdTE2X3QgYnVmTGVuOwogICAgdTE2X3QgZWxlbjsKICAgIHU4X3QgaWQ7CiAgICB1OF90IG91aXhyWzZdID0gezB4MDAsMHgwMywweDdmLDB4MDMsIDB4MDEsIDB4MDB9OwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CiAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQogICAgewogICAgICAgIHptX2Fzc2VydCgwKTsKICAgIH0KCiAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCiAgICBvZmZzZXQgKz0gMjQ7CgogICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CiAgICAvKiBTZWFyY2ggbG9vcCAqLwogICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCiAgICB7CiAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCiAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1ZFTkRPUl9QUklWQVRFKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKT4oYnVmTGVuIC0gb2Zmc2V0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWl4ciwgb2Zmc2V0KzIsIDYpICYmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpID49IDYpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCiAgICAgICAgI2lmIDEKICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgICNlbHNlCiAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICB9CiAgICAgICAgI2VuZGlmCgogICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKICAgIH0KICAgIHJldHVybiAweGZmZmY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZNbUFkZEllU3VwcG9ydFJhdGUgICAgICAgICovCi8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgU3VwcG9ydCBSYXRlIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCi8qICAgICAgZWlkIDogZWxlbWVudCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgcmF0ZVNldCA6ICBDQ0sgb3IgT0ZETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnUxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGVpZCwgdThfdCByYXRlU2V0KQp7CiAgICB1OF90IGxlbiA9IDA7CiAgICB1MTZfdCBpOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAvL2lmICggKHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfT0ZETSkmJigod2QtPmdSYXRlICYgMHhmZikgPT0gMCkgKQogICAgLy97CiAgICAvLyAgICByZXR1cm4gb2Zmc2V0OwogICAgLy99CgogICAgLyogSW5mb3JtYXRpb24gOiBTdXBwb3J0IFJhdGUgKi8KICAgIGlmICggcmF0ZVNldCA9PSBaTV9SQVRFX1NFVF9DQ0sgKQogICAgewogICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgod2QtPmJSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQogICAgICAgICAgICAvL2lmICgoMHhmICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2xlbisyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemcxMWJSYXRlVGJsW2ldKygod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKSk7CiAgICAgICAgICAgICAgICBsZW4rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCByYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0gKQogICAgewogICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQogICAgICAgICAgICAvL2lmICgoMHhmZiAmICgweDE8PGkpKSA9PSAoMHgxPDxpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtsZW4rMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpnMTFnUmF0ZVRibFtpXSsoKHdkLT5nUmF0ZUJhc2ljICYgKDB4MTw8aSkpPDwoNy1pKSkpOwogICAgICAgICAgICAgICAgbGVuKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGxlbiA+IDApCiAgICB7CiAgICAgICAgLyogRWxlbWVudCBJRCAqLwogICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIGVpZCk7CgogICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsxLCBsZW4pOwoKICAgICAgICAvKiBSZXR1cm4gdmFsdWUgKi8KICAgICAgICBvZmZzZXQgKz0gKDIrbGVuKTsKICAgIH0KCiAgICByZXR1cm4gb2Zmc2V0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZURzICAgICAgICAgICAgICAgICAqLwovKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IERTIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKewogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIC8qIEVsZW1lbnQgSUQgKi8KICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfRFMpOwoKICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDEpOwoKICAgIC8qIEluZm9ybWF0aW9uIDogRFMgKi8KICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywKICAgICAgICAgICAgICAgICAgICAgICAgIHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCkpOwoKICAgIHJldHVybiBvZmZzZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZUVycCAgICAgICAgICAgICAgICAqLwovKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IEVSUCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1MTZfdCB6Zk1tQWRkSWVFcnAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCnsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAvKiBFbGVtZW50IElEICovCiAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX0VSUCk7CgogICAgLyogRWxlbWVudCBMZW5ndGggKi8KICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CgogICAgLyogSW5mb3JtYXRpb24gOiBFUlAgKi8KICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmVycEVsZW1lbnQpOwoKICAgIHJldHVybiBvZmZzZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVdwYSAgICAgICAgICAgICAgICAqLwovKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IFdQQSB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjIgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpCnsKICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOwogICAgaW50IGk7CgogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIC8qIEVsZW1lbnQgSUQgKi8KICAgIC8vem13X2ludHR4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9XUEFfSUUpOwoKICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICAvL3ptd19pbnR0eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLndwYUxlbik7CiAgICBmb3IoaSA9IDA7IGkgPCB3ZC0+YXAud3BhTGVuW2FwSWRdOyBpKyspCiAgICB7CiAgICAgICAgLyogSW5mb3JtYXRpb24gOiBXUEEgKi8KICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC53cGFJZVthcElkXVtpXSk7CiAgICB9CgogICAgcmV0dXJuIG9mZnNldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6Zk1tQWRkSFRDYXBhYmlsaXR5ICAgICAgICAgKi8KLyogICAgICBBZGQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBDaGFvLVdlbiBZYW5nICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgICAgIDIwMDYuMDYgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdTE2X3QgemZNbUFkZEhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKewogICAgdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CiAgICB1MTZfdCBpOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAvKiBQcm9iIElEICovCiAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CgogICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCiAgICB7CiAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkxlbmd0aCArIDQpOwoKICAgICAgICAvKiBPVUkgRGF0YSAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIE9VSVtpXSk7CiAgICAgICAgfQoKICAgICAgICAvKiBFbGVtZW50IFR5cGUgSUQgKi8KICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkVsZW1lbnRJRCk7CgogICAgICAgIC8qIEhUIENhcGFiaWxpdHkgRGF0YSAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+YXAuSFRDYXAuQnl0ZVtpKzJdKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuRGF0YS5MZW5ndGggKyA0KTsKCiAgICAgICAgLyogT1VJIERhdGEgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOwogICAgICAgIH0KCiAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCiAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkRhdGEuRWxlbWVudElEKTsKCiAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuQnl0ZVtpKzJdKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIG9mZnNldDsKfQoKCnUxNl90IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQp7CiAgICAvL3U4X3QgT1VJWzNdID0gezB4MCwweDkwLDB4NEN9OwogICAgdTE2X3QgaTsKCiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CgogICAgLyogUHJvYiBJRCAqLwogICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpOwoKICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQogICAgewogICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+YXAuSFRDYXAuRGF0YS5MZW5ndGgpOwoKICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkJ5dGVbaSsyXSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKCiAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuQnl0ZVtpKzJdKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIG9mZnNldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgemZNbUFkZEV4dGVuZGVkSFRDYXBhYmlsaXR5ICAgKi8KLyogICAgICBBZGQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBDaGFvLVdlbiBZYW5nICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgICAgIDIwMDYuMDYgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdTE2X3QgemZNbUFkZEV4dGVuZGVkSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQp7CiAgICB1OF90IE9VSVszXSA9IHsweDAsMHg5MCwweDRDfTsKICAgIHUxNl90IGk7CgogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIC8qIFByb2IgSUQgKi8KICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfV1BBX0lFKTsKCiAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKICAgIHsKICAgICAgICAvKiBFbGVtZW50IExlbmd0aCAqLwogICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CgogICAgICAgIC8qIE9VSSBEYXRhICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKICAgICAgICB9CgogICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLwogICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEKTsKCiAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5FeHRIVENhcC5CeXRlW2krMl0pOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvKiBFbGVtZW50IExlbmd0aCAqLwogICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5FeHRIVENhcC5EYXRhLkxlbmd0aCArIDQpOwoKICAgICAgICAvKiBPVUkgRGF0YSAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIE9VSVtpXSk7CiAgICAgICAgfQoKICAgICAgICAvKiBFbGVtZW50IFR5cGUgSUQgKi8KICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5FbGVtZW50SUQpOwoKICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjI7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5FeHRIVENhcC5CeXRlW2krMl0pOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gb2Zmc2V0Owp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZSAgICAgICAgICAgICAgICovCi8qICAgICAgU2VuZCBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZnJhbWVUeXBlIDogbWFuYWdlbWVudCBmcmFtZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZHN0IDogZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgcDEgOiBwYXJhbWV0ZXIgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgcDIgOiBwYXJhbWV0ZXIgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgcDMgOiBwYXJhbWV0ZXIgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHByb2JlIHJlcSA6IHAxPT4gYldpdGhTU0lELCBwMj0+UiwgcDM9PlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIHByb2JlIHJzcCA6IHAxPT5SLCBwMj0+UiwgcDM9PlZBUCBJRChBUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIGRlYXV0aCA6IHAxPT5SZWFzb24gQ29kZSwgcDI9PlIsIHAzPT5WQVAgSUQoQVApICAgICAgICAgICAgICAgICAgICAgICovCi8qIERpc2Fzb2MgOiBwMT0+UmVhc29uIENvZGUsIHAyPT5SLCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgICAgICAgICovCi8qIEFUSU0gOiBwMT0+UiwgcDI9PlIsIHAzPT5SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIChyZSlhc29jIHJzcCA6IHAxPT5TdGF0dXMgQ29kZSwgcDI9PkFJRCwgcDM9PlZBUCBJRChBUCkgICAgICAgICAgICAgICovCi8qIGFzb2MgcmVxIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIHJlYXNvYyByZXEgOiBwMT0+QVAgTUFDWzBdLCBwMj0+QVAgTUFDWzFdLCBwMz0+QVAgTUFDWzJdICAgICAgICAgICAgICovCi8qIGF1dGggOiBwMT0+bG93PUFsZ29yaXRobSwgaGlnaD1UcmFuc2FjdGlvbiwgcDI9PlN0YXR1cywgcDM9PlZBUCBJRCAgICovCnZvaWQgemZTZW5kTW1GcmFtZSh6ZGV2X3QqIGRldiwgdThfdCBmcmFtZVR5cGUsIHUxNl90KiBkc3QsCiAgICAgICAgICAgICAgICAgICB1MzJfdCBwMSwgdTMyX3QgcDIsIHUzMl90IHAzKQp7CiAgICB6YnVmX3QqIGJ1ZjsKICAgIC8vdTE2X3QgYWRkclRibFNpemU7CiAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKICAgIHUxNl90IG9mZnNldCA9IDA7CiAgICB1MTZfdCBobGVuID0gMzI7CiAgICB1MTZfdCBoZWFkZXJbKDI0KzI1KzEpLzJdOwogICAgdTE2X3QgdmFwID0gMDsKICAgIHUxNl90IGk7CiAgICB1OF90IGVuY3J5cHQgPSAwOwogICAgdTE2X3QgYWlkOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CgogICAgem1fbXNnMl9tbShaTV9MVl8yLCAiU2VuZCBtbSBmcmFtZSwgdHlwZT0iLCBmcmFtZVR5cGUpOwogICAgLyogVEJEIDogTWF4aW11bSBzaXplIG9mIG1hbmFnZW1lbnQgZnJhbWUgKi8KICAgIGlmICgoYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCAxMDI0KSkgPT0gTlVMTCkKICAgIHsKICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLy9SZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCiAgICBvZmZzZXQgPSBobGVuOwoKICAgIHN3aXRjaCAoZnJhbWVUeXBlKQogICAgewogICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRIDoKICAgICAgICAgICAgb2Zmc2V0ID0gemZTZW5kUHJvYmVSZXEoZGV2LCBidWYsIG9mZnNldCwgKHU4X3QpIHAxKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAicHJvYmUgcnNwIik7CiAgICAgICAgICAgIC8qIDI0LTMxIFRpbWUgU3RhbXAgOiBoYXJkd2FyZSBXT04nVCBmaWxsIHRoaXMgZmllbGQgKi8KICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrMiwgMCk7CiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNCwgMCk7CiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNiwgMCk7CiAgICAgICAgICAgIG9mZnNldCs9ODsKCiAgICAgICAgICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+YmVhY29uSW50ZXJ2YWwpOwogICAgICAgICAgICBvZmZzZXQrPTI7CgogICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CiAgICAgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCiAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+YXAuY2FwYWJbdmFwXSk7CiAgICAgICAgICAgICAgICBvZmZzZXQrPTI7CiAgICAgICAgICAgICAgICAvKiBTU0lEICovCiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZkFwQWRkSWVTc2lkKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCiAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVswXSk7CiAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSk7CiAgICAgICAgICAgICAgICAvKiBTU0lEICovCiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZEllU3NpZChkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCiAgICAgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllRHMoZGV2LCBidWYsIG9mZnNldCk7CgogICAgICAgICAgICAvKiBUT0RPIKFHIElCU1MgKi8KICAgICAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZUlic3MoZGV2LCBidWYsIG9mZnNldCk7CgogICAgICAgICAgICAgICAgaWYgKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKCB3ZC0+d2ZjLmJJYnNzR01vZGUKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpICkgICAgLy8gT25seSBhY2NvbXBhbnkgd2l0aCBlbmFibGluZyBhIG1vZGUgLgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5lcnBFbGVtZW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllRXJwKGRldiwgYnVmLCBvZmZzZXQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIEcgTW9kZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KICAgICAgICAgICAgICAgICAgIAkgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKICAgICAgICAgICAgCSAgICB9CiAgICAgICAgCSAgICB9CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBpZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQogICAgICAgICAgICAgICAgICYmICh3ZC0+YXAud2xhblR5cGVbdmFwXSAhPSBaTV9XTEFOX1RZUEVfUFVSRV9CKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CgogICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCgkJaWYgKCB3ZC0+ZnJlcXVlbmN5IDwgMzAwMCApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLwogICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKCiAgICAgICAgICAgIC8qIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLwogICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CgogICAgICAgICAgICAvKiBUT0RPIDogUlNOICovCiAgICAgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCAmJiB3ZC0+YXAud3BhU3VwcG9ydFt2YXBdID09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVdwYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICYmIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQTJQU0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmd1N0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIFpNX1dMQU5fRlJBTUVfVFlQRV9BVVRIKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogV01FIFBhcmFtZXRlcnMgKi8KICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnFvc01vZGUgPT0gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZkFwQWRkSWVXbWVQYXJhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgLy8gamhsZWUgSFQgMAogICAgICAgICAgICAvL0NXWWFuZygrKQogICAgICAgICAgICAgICAgLyogVE9ETyA6IE5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgb2sgKi8KICAgICAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICAgICAgLy9DV1lhbmcoKykKICAgICAgICAgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEV4dGVuZGVkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIHdkLT5zdGEuaWJzc0FkZGl0aW9uYWxJRVNpemUgKQogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJYnNzQWRkaXRpb25hbElFKGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCA6CiAgICAgICAgICAgIGlmIChwMSA9PSAweDMwMDAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBobGVuICs9IDQ7CiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsgICAgICAgIC8vIGZvciByZXNlcnZpbmcgd2VwIGhlYWRlcgogICAgICAgICAgICAgICAgZW5jcnlwdCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEFsZ290cml0aG0gTnVtYmVyICovCiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsICh1MTZfdCkocDEmMHhmZmZmKSk7CiAgICAgICAgICAgIG9mZnNldCs9MjsKCiAgICAgICAgICAgIC8qIFRyYW5zYWN0aW9uIE51bWJlciAqLwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAxPj4xNikpOwogICAgICAgICAgICBvZmZzZXQrPTI7CgogICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpcDIpOwogICAgICAgICAgICBvZmZzZXQrPTI7CgogICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIENoYWxsZW5nZSBUZXh0ID0+IHNoYXJlLTIgb3Igc2hhcmUtMyAqLwogICAgICAgICAgICBpZiAocDEgPT0gMHgyMDAwMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHAyID09IDApIC8vU3RhdHVzID09IHN1Y2Nlc3MKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDgwMTApOwogICAgICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKICAgICAgICAgICAgICAgICAgICAvKiBzaGFyZS0yIDogQVAgZ2VuZXJhdGUgY2hhbGxlbmdlIHRleHQgKi8KICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwxMjg7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5hcC5jaGFsbGVuZ2VUZXh0W2ldID0gKHU4X3QpemZHZXRSYW5kb21OdW1iZXIoZGV2LCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPmFwLmNoYWxsZW5nZVRleHQsIG9mZnNldCwgMTI4KTsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTI4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHAxID09IDB4MzAwMDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIHNoYXJlLTMgOiBTVEEgcmV0dXJuIGNoYWxsZW5nZSBUZXh0ICovCiAgICAgICAgICAgICAgICB6ZkNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCB3ZC0+c3RhLmNoYWxsZW5nZVRleHQsIG9mZnNldCwgd2QtPnN0YS5jaGFsbGVuZ2VUZXh0WzFdKzIpOwogICAgICAgICAgICAgICAgb2Zmc2V0ICs9ICh3ZC0+c3RhLmNoYWxsZW5nZVRleHRbMV0rMik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUkVRIDoKICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgOgogICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzBdKTsKICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0pOwoKICAgICAgICAgICAgLyogTGlzdGVuIEludGVydmFsICovCiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAwNSk7CiAgICAgICAgICAgIG9mZnNldCs9MjsKCiAgICAgICAgICAgIC8qIFJlYXNzb2NhaXRlZCBSZXF1ZXN0IDogQ3VycmVudCBBUCBhZGRyZXNzICovCiAgICAgICAgICAgIGlmIChmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSkKICAgICAgICAgICAgewogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+c3RhLmJzc2lkWzBdKTsKICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5ic3NpZFsxXSk7CiAgICAgICAgICAgICAgICBvZmZzZXQrPTI7CiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMl0pOwogICAgICAgICAgICAgICAgb2Zmc2V0Kz0yOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBTU0lEICovCiAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVTc2lkKGRldiwgYnVmLCBvZmZzZXQpOwoKCiAgICAgICAgICAgIGlmICggd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFN1cHBvcnQgUmF0ZSAqLwogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9DQ0spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoKHdkLT5zdGEuY2FwYWJpbGl0eVsxXSAmIFpNX0JJVF8wKSA9PSAxKQogICAgICAgICAgICB7ICAgLy9zcGVjdHJ1bSBtYW5hZ2VtZW50IGZsYWcgZW5hYmxlCiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZEllUG93ZXJDYXAoZGV2LCBidWYsIG9mZnNldCk7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZEllU3VwcG9ydENoKGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCiAgICAgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vb2Zmc2V0ID0gemZTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBmcmFtZVR5cGUpOwogICAgICAgICAgICAvL01vdmUgdG8gd3JhcHBlciBmdW5jdGlvbiwgZm9yIE9TIGRpZmZlcmVuY2UtLUNXWWFuZyhtKQogICAgICAgICAgICAvL2ZvciB3aW5kb3dzIHdyYXBwZXIsIHpmd1N0YUFkZEllV3BhUnNuKCkgc2hvdWxkIGJlIGJlbG93OgogICAgICAgICAgICAvL3UxNl90IHpmd1N0YUFkZEllV3BhUnNuKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGZyYW1lVHlwZSkKICAgICAgICAgICAgLy97CiAgICAgICAgICAgIC8vICAgIHJldHVybiB6ZlN0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIGZyYW1lVHlwZSk7CiAgICAgICAgICAgIC8vfQogICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBmcmFtZVR5cGUpOwoKI2lmZGVmIFpNX0VOQUJMRV9DRU5DCiAgICAgICAgICAgIC8qIENFTkMgKi8KICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fQ0VOQykKICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZUNlbmMoZGV2LCBidWYsIG9mZnNldCk7CiNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCiAgICAgICAgICAgIGlmICgoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9XTUVfRU5BQkxFX0JJVCkgIT0gMCkgLy9XTUUgZW5hYmxlZAogICAgICAgICAgICAgICYmICgod2QtPnN0YS5hcFdtZUNhcGFiaWxpdHkgJiAweDEpICE9IDApKSAvL1dNRSBBUAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+c3RhLmFwV21lQ2FwYWJpbGl0eSAmIDB4ODApICE9IDApIC8vVUFQU0QgQVAKICAgICAgICAgICAgICAgICAmJiAoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9VQVBTRF9FTkFCTEVfQklUKSAhPSAwKSkgLy9VQVBTRCBlbmFibGVkCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS53bWVRb3NJbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZEllV21lSW5mbyhkZXYsIGJ1Ziwgb2Zmc2V0LCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBqaGxlZSBIVCAwCiAgICAgICAgICAgIC8vQ1dZYW5nKCspCiAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUICE9IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICNpZm5kZWYgWk1fRElTQUJMRV9BTVNEVThLX1NVUFBPUlQKICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgOEsgQS1NU0RVCiAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9NYXhBTVNEVUxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyAmPSAofkhUQ0FQX01heEFNU0RVTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjZWxzZQogICAgICAgICAgICAgICAgICAgIC8vU3VwcG9ydCA0SyBBLU1TRFUKICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvICY9ICh+SFRDQVBfTWF4QU1TRFVMZW5ndGgpOwogICAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KICAgICAgICAgICAgICAgIGlmICh3ZC0+QmFuZFdpZHRoNDAgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gfD0gSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyAmPSB+SFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0OwogICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TdXBDaGFubmVsV2lkdGhTZXQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkFNUERVUGFyYW0gJj0gfkhUQ0FQX01heFJ4QU1QRFUzOwogICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkFNUERVUGFyYW0gfD0gSFRDQVBfTWF4UnhBTVBEVTM7CiAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuTUNTU2V0WzFdID0gMHhGRjsgLy8gTUNTIDggfiAxNQogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgLy9DV1lhbmcoKykKICAgICAgICAgICAgICAgIC8qIEV4dGVuZGVkIEhUIENhcGFiaWxpdGllcyBJbmZvICovCiAgICAgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vU3RvcmUgYXNvYyByZXF1ZXN0IGZyYW1lIGJvZHksIGZvciBWSVNUQSBvbmx5CiAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JlcUZyYW1lQm9keVNpemUgPSAoKG9mZnNldCAtIGhsZW4pID4KICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkUpPwogICAgICAgICAgICAgICAgICAgIFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRToob2Zmc2V0IC0gaGxlbik7CiAgICAgICAgICAgIGZvciAoaT0wOyBpPHdkLT5zdGEuYXNvY1JlcUZyYW1lQm9keVNpemU7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2QtPnN0YS5hc29jUmVxRnJhbWVCb2R5W2ldID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSArIGhsZW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUlNQIDoKICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgOgogICAgICAgICAgICB2YXAgPSAodTE2X3QpIHAzOwoKICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+YXAuY2FwYWJbdmFwXSk7CiAgICAgICAgICAgIG9mZnNldCs9MjsKCiAgICAgICAgICAgIC8qIFN0YXR1cyBDb2RlICovCiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsICh1MTZfdClwMSk7CiAgICAgICAgICAgIG9mZnNldCs9MjsKCiAgICAgICAgICAgIC8qIEFJRCAqLwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAyfDB4YzAwMCkpOwogICAgICAgICAgICBvZmZzZXQrPTI7CgoKICAgICAgICAgICAgaWYgKCB3ZC0+ZnJlcXVlbmN5IDwgMzAwMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCiAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKCiAgICAgICAgICAgIC8qIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLwogICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFN1cHBvcnQgUmF0ZSAqLwogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKICAgICAgICAgICAgfQoKCgogICAgICAgICAgICAvKiBXTUUgUGFyYW1ldGVycyAqLwogICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFRPRE8gOiBpZiBXTUUgU1RBIHRoZW4gc2VuZCBXTUUgcGFyYW1ldGVyIGVsZW1lbnQgKi8KICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAucW9zTW9kZSA9PSAxKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVdtZVBhcmEoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBqaGxlZSBIVCAwCiAgICAgICAgICAgIC8vQ1dZYW5nKCspCiAgICAgICAgICAgIC8qIEhUIENhcGFiaWxpdGllcyBJbmZvICovCiAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CiAgICAgICAgICAgIC8vQ1dZYW5nKCspCiAgICAgICAgICAgIC8qIEV4dGVuZGVkIEhUIENhcGFiaWxpdGllcyBJbmZvICovCiAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU0gOgogICAgICAgICAgICAvKiBOVUxMIGZyYW1lICovCiAgICAgICAgICAgIC8qIFRPRE8gOiBhZGQgdHdvIGR1bWIgYnl0ZXMgdGVtcG9yYXJpbHkgKi8KICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCA6CiAgICAgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAxMCk7CiAgICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBaTV9XTEFOX0RBVEFfRlJBTUUgOgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyA6CiAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRIIDoKICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdmFwID0gKHUxNl90KSBwMzsKCiAgICAgICAgICAgICAgaWYgKChhaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRzdCkpICE9IDB4ZmZmZikKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CiAgICAgICAgICAgICAgICAgIC8qIENsZWFyIFNUQSB0YWJsZSAqLwogICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbYWlkXS52YWxpZCA9IDA7CgogICAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOwoKICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopZHN0LCB2YXApOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIFJlYXNvbiBDb2RlICovCiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsICh1MTZfdClwMSk7CiAgICAgICAgICAgIG9mZnNldCs9MjsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKCiAgICB6bV9tc2cyX21tKFpNX0xWXzIsICJtYW5hZ2VtZW50IGZyYW1lIGJvZHkgc2l6ZT0iLCBvZmZzZXQtaGxlbik7CgogICAgLy9Db3B5IHdsYW4gaGVhZGVyCiAgICB6ZlR4R2VuTW1IZWFkZXIoZGV2LCBmcmFtZVR5cGUsIGRzdCwgaGVhZGVyLCBvZmZzZXQtaGxlbiwgYnVmLCB2YXAsIGVuY3J5cHQpOwogICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCiAgICB7CiAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIGkqMiwgaGVhZGVyW2ldKTsKICAgIH0KCiAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCiAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCiAgICAvL3sKICAgIC8vICAgIGdvdG8gemxFcnJvcjsKICAgIC8vfQoKICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOwogICAgem1fbXNnMl9tbShaTV9MVl8yLCAiaGxlbj0iLCBobGVuKTsKICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibFNpemU9IiwgYWRkclRibFNpemUpOwogICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CiAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwucGh5c0FkZHJsWzBdPSIsIGFkZHJUYmwucGh5c0FkZHJsWzBdKTsKICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5kYXRhPSIsIGJ1Zi0+ZGF0YSk7CgogICAgI2lmIDAKICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwLCBidWYsIDAsCiAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCiAgICB7CiAgICAgICAgZ290byB6bEVycm9yOwogICAgfQogICAgI2Vsc2UKICAgIHpmUHV0Vm1tcShkZXYsIGJ1Zik7CiAgICB6ZlB1c2hWdHhxKGRldik7CiAgICAjZW5kaWYKCiAgICByZXR1cm47CiNpZiAwCnpsRXJyb3I6CgogICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CiAgICByZXR1cm47CiNlbmRpZgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NNYW5hZ2VtZW50ICAgICAgICAgKi8KLyogICAgICBQcm9jZXNzIHJlY2VpdmVkIG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZQcm9jZXNzTWFuYWdlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykgLy9DV1lhbmcobSkKewogICAgdThfdCBmcmFtZVR5cGU7CiAgICB1MTZfdCB0YVszXTsKICAgIHUxNl90IHJhWzNdOwogICAgdTE2X3QgdmFwID0gMCwgaW5kZXggPSAwOwogICAgLy91MTZfdCBpOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICByYVswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOwogICAgcmFbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKICAgIHJhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CgogICAgdGFbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CiAgICB0YVsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKICAgIHRhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOwoKICAgIGZyYW1lVHlwZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApOwoKICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKICAgIHsKI2lmIDEKICAgICAgICB2YXAgPSAwOwogICAgICAgIGlmICgocmFbMF0gJiAweDEpICE9IDEpCiAgICAgICAgewogICAgICAgICAgICAvKiBBUCA6IEZpbmQgdmlydHVhbCBBUCAqLwogICAgICAgICAgICBpZiAoKGluZGV4ID0gemZBcEZpbmRTdGEoZGV2LCB0YSkpICE9IDB4ZmZmZikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFwID0gd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgem1fbXNnMl9tbShaTV9MVl8yLCAidmFwPSIsIHZhcCk7CiNlbmRpZgoKICAgICAgICAvKiBEaXNwYXRjaCBieSBmcmFtZSB0eXBlICovCiAgICAgICAgc3dpdGNoIChmcmFtZVR5cGUpCiAgICAgICAgewogICAgICAgICAgICAgICAgLyogQmVhY29uICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0JFQUNPTiA6CiAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0JlYWNvbihkZXYsIGJ1Zik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgogICAgICAgICAgICAgICAgemZBcFByb2Nlc3NBdXRoKGRldiwgYnVmLCB0YSwgdmFwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUkVRIDoKICAgICAgICAgICAgICAgIC8qIFJlYXNzb2NpYXRpb24gcmVxdWVzdCAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgOgogICAgICAgICAgICAgICAgemZBcFByb2Nlc3NBc29jUmVxKGRldiwgYnVmLCB0YSwgdmFwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JTUCA6CiAgICAgICAgICAgICAgICAvL3pmQXBQcm9jZXNzQXNvY1JzcChkZXYsIGJ1Zik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIERlYXV0aGVudGljYXRpb24gKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRIIDoKICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzRGVhdXRoKGRldiwgYnVmLCB0YSwgdmFwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogRGlzYXNzb2NpYXRpb24gKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyA6CiAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0Rpc2Fzb2MoZGV2LCBidWYsIHRhLCB2YXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXF1ZXN0ICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRIDoKICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxKGRldiwgYnVmLCB0YSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIFByb2JlIHJlc3BvbnNlICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAvKiBBY3Rpb24gKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OIDoKICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQWN0aW9uKGRldiwgYnVmKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgLy9pZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSB8fCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykpCiAgICB7CiAgICAgICAgLyogRGlzcGF0Y2ggYnkgZnJhbWUgdHlwZSAqLwogICAgICAgIHN3aXRjaCAoZnJhbWVUeXBlKQogICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEJlYWNvbiAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9CRUFDT04gOgogICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBiZWFjb24gZnJvbSBvdGhlciBBUCAqLwogICAgICAgICAgICAgICAgaWYgKCgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbd2QtPnJlZ3VsYXRpb25UYWJsZS5DdXJDaEluZGV4XS5jaGFubmVsRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSkgIT0gMCkgJiYgd2QtPnN0YS5ERlNFbmFibGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbd2QtPnJlZ3VsYXRpb25UYWJsZS5DdXJDaEluZGV4XS5jaGFubmVsRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9IH4oWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzQmVhY29uKGRldiwgYnVmLCBBZGRJbmZvKTsgLy9DV1lhbmcobSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCA6CiAgICAgICAgICAgICAgICAvKiBUT0RPIDogdmFwIHBhcmFtZXRlciBpcyB1c2VsZXNzIGluIFNUQSBtb2RlLCBnZXQgcmlkIG9mIGl0ICovCiAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBdXRoKGRldiwgYnVmLCB0YSwgMCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIEFzc29jaWF0aW9uIHJlcXVlc3QgKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CiAgICAgICAgICAgICAgICAvKiBUT0RPIDogdmFwIHBhcmFtZXRlciBpcyB1c2VsZXNzIGluIFNUQSBtb2RlLCBnZXQgcmlkIG9mIGl0ICovCiAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBc29jUmVxKGRldiwgYnVmLCB0YSwgMCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIEFzc29jaWF0aW9uIHJlc3BvbnNlICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgogICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JTUCA6CiAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBc29jUnNwKGRldiwgYnVmKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogRGVhdXRoZW50aWNhdGlvbiAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgogICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRGVhdXRoZW50aWNhdGlvbiByZWNlaXZlZCIpOwogICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzRGVhdXRoKGRldiwgYnVmKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogRGlzYXNzb2NpYXRpb24gKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyA6CiAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEaXNhc3NvY2lhdGlvbiByZWNlaXZlZCIpOwogICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzRGlzYXNvYyhkZXYsIGJ1Zik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIFByb2JlIHJlcXVlc3QgKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgogICAgICAgICAgICAgICAgemZQcm9jZXNzUHJvYmVSZXEoZGV2LCBidWYsIHRhKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogUHJvYmUgcmVzcG9uc2UgKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AgOgogICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBwcm9iZSByZXNwb25zZSBmcm9tIG90aGVyIEFQICovCiAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncwogICAgICAgICAgICAgICAgICAgICAgICAmIFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKSAhPSAwKSAmJiB3ZC0+c3RhLkRGU0VuYWJsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJj0gfihaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSAmIFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NQcm9iZVJzcChkZXYsIGJ1ZiwgQWRkSW5mbyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU06CiAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBdGltKGRldiwgYnVmKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogQWN0aW9uICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FDVElPTiA6CiAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzIsICJQcm9jZXNzQWN0aW9uTWd0RnJhbWUiKTsKICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0FjdGlvbihkZXYsIGJ1Zik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZQcm9jZXNzUHJvYmVSZXEgICAgICAgICAgICovCi8qICAgICAgUHJvY2VzcyBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZQcm9jZXNzUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjKQp7CiAgICB1MTZfdCBvZmZzZXQ7CiAgICB1OF90IGxlbjsKICAgIHUxNl90IGksIGo7CiAgICB1OF90IGNoOwogICAgdTE2X3Qgc2VuZEZsYWc7CgogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIC8qIGNoZWNrIG1vZGUgOiBBUC9JQlNTICovCiAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUykpCiAgICB7CiAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAiSWdub3JlIHByb2JlIHJlcSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QpKQogICAgewogICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgIlBhY2tldHMgZHJvcHBlZCBkdWUgdG8gZGlzY29ubmVjdCBzdGF0ZSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQogICAgewogICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AsIHNyYywgMCwgMCwgMCk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBjaGVjayBTU0lEICovCiAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX1NTSUQpKSA9PSAweGZmZmYpCiAgICB7CiAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAicHJvYmUgcmVxIFNTSUQgbm90IGZvdW5kIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKCiAgICBmb3IgKGk9MDsgaTxaTV9NQVhfQVBfU1VQUE9SVDsgaSsrKQogICAgewogICAgICAgIGlmICgod2QtPmFwLmFwQml0bWFwICYgKDE8PGkpKSAhPSAwKQogICAgICAgIHsKICAgICAgICAgICAgem1fbXNnMV9tbShaTV9MVl8zLCAibGVuPSIsIGxlbik7CiAgICAgICAgICAgIHNlbmRGbGFnID0gMDsKICAgICAgICAgICAgLyogYm9hcmRjYXN0IFNTSUQgKi8KICAgICAgICAgICAgaWYgKGxlbiA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAod2QtPmFwLmhpZGVTc2lkW2ldID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VuZEZsYWcgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIE5vdCBicm9hZGNhc3QgU1NJRCAqLwogICAgICAgICAgICBlbHNlIGlmICh3ZC0+YXAuc3NpZExlbltpXSA9PSBsZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgoY2ggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMitqKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkW2ldW2pdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGogPT0gbGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNlbmRGbGFnID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2VuZEZsYWcgPT0gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogU2VuZCBwcm9iZSByZXNwb25zZSAqLwogICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCwgc3JjLCBpLCAwLCBpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NQcm9iZVJzcCAgICAgICAgICAgKi8KLyogICAgICBQcm9jZXNzIHByb2JlIHJlc3BvbnNlIG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiBhdXRoIGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIEFkZEluZm8gOiBSeCBIZWFkZXIgYW5kIFJ4IE1hYyBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBBcmVzcyBZYW5nICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xMSAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB6ZlByb2Nlc3NQcm9iZVJzcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykKewogICAgLyogR2F0aGVyIHNjYW4gcmVzdWx0ICovCiAgICAvKiBQYXJzZSBUSU0gYW5kIHNlbmQgUFMtUE9MTCBpbiBwb3dlciBzYXZpbmcgbW9kZSAqLwogICAgc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIqICBwUHJvYmVSc3BIZWFkZXI7CiAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbzsKICAgIHU4X3QgICBwQnVmW3NpemVvZihzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlcildOwogICAgaW50ICAgIHJlczsKCiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CgogICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKCiAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCdWYsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyKSk7CiAgICBwUHJvYmVSc3BIZWFkZXIgPSAoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIqKSBwQnVmOwoKICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CgogICAgLy96bV9kZWJ1Z19tc2cxKCJic3MgY291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOwoKICAgIHBCc3NJbmZvID0gemZTdGFGaW5kQnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyKTsKCiAgICAvL2lmICggaSA9PSB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQgKQogICAgaWYgKCBwQnNzSW5mbyA9PSBOVUxMICkKICAgIHsKICAgICAgICAvKiBBbGxvY2F0ZSBhIG5ldyBlbnRyeSBpZiBCU1Mgbm90IGluIHRoZSBzY2FuIGxpc3QgKi8KICAgICAgICBwQnNzSW5mbyA9IHpmQnNzSW5mb0FsbG9jYXRlKGRldik7CiAgICAgICAgaWYgKHBCc3NJbmZvICE9IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICByZXMgPSB6ZlN0YUluaXRCc3NJbmZvKGRldiwgYnVmLCBwUHJvYmVSc3BIZWFkZXIsIHBCc3NJbmZvLCBBZGRJbmZvLCAwKTsKICAgICAgICAgICAgLy96ZkR1bXBTU0lEKHBCc3NJbmZvLT5zc2lkWzFdLCAmKHBCc3NJbmZvLT5zc2lkWzJdKSk7CiAgICAgICAgICAgIGlmICggcmVzICE9IDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgemZCc3NJbmZvSW5zZXJ0VG9MaXN0KGRldiwgcEJzc0luZm8pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJlcyA9IHpmU3RhSW5pdEJzc0luZm8oZGV2LCBidWYsIHBQcm9iZVJzcEhlYWRlciwgcEJzc0luZm8sIEFkZEluZm8sIDEpOwogICAgICAgIGlmIChyZXMgPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOwogICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCiAgICAgICAgewogICAgICAgICAgICBpbnQgaWR4OwoKICAgICAgICAgICAgLy8gSXQgd291bGQgcmVzZXQgdGhlIGFsaXZlIGNvdW50ZXIgaWYgdGhlIHBlZXIgc3RhdGlvbiBpcyBmb3VuZCEKICAgICAgICAgICAgemZTdGFGaW5kRnJlZU9wcG9zaXRlKGRldiwgKHUxNl90ICopcEJzc0luZm8tPm1hY2FkZHIsICZpZHgpOwogICAgICAgIH0KICAgIH0KCiAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOwoKICAgIHJldHVybjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlNlbmRQcm9iZVJlcSAgICAgICAgICAgICAgKi8KLyogICAgICBTZW5kIHByb2JlIHJlcXVlc3QgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBKaS1IdWFuZyBMZWUgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMSAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnUxNl90IHpmU2VuZFByb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGJXaXRoU1NJRCkKewogICAgem13X2dldF93bGFuX2RldihkZXYpOwogICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKCgogICAgLyogU1NJRCAqLwogICAgaWYgKGJXaXRoU1NJRCA9PSAwKSAgLyogYnJvYWRjYXN0IHNzaWQgKi8KICAgIHsKICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CiAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TU0lEKTsKICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDApOyAgIC8qIGxlbmd0aCA9IDAgKi8KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOwogICAgICAgIGlmICh3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuID09IDApCiAgICAgICAgewogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDApOyAgIC8qIGxlbmd0aCA9IDAgKi8KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TU0lEKTsKICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLAogICAgICAgICAgICAgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbYldpdGhTU0lELTFdLnNzaWRMZW4pOwogICAgICAgICAgICB6ZkNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLAogICAgICAgICAgICAgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbYldpdGhTU0lELTFdLnNzaWQsCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbYldpdGhTU0lELTFdLnNzaWRMZW4pOyAvKiBzc2lkICovCiAgICAgICAgICAgIG9mZnNldCArPSB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuOwogICAgICAgIH0KICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOwogICAgfQoKICAgIC8qIFN1cHBvcnRlZCByYXRlcyAqLwogICAgaWYgKCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwICkKICAgIHsgICAvKiA4MDIuMTFiK2cgKi8KICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKCiAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpIHsKICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpIHsKICAgICAgICAgICAgICAgIGlmICh3ZC0+d2ZjLmJJYnNzR01vZGUpIHsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsgIC8qIDgwMi4xMWEgKi8KICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CiAgICB9CgogICAgcmV0dXJuIG9mZnNldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyICovCi8qICAgICAgVXBkYXRlIFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIGRlZmF1bHQgdmFsdWUuICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgbW9kZSA6IDA9PlNUQSwgMT0+QVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCnsKICAgIHUxNl90IGN3bWluWzVdOwogICAgdTE2X3QgY3dtYXhbNV07CiAgICB1MTZfdCBhaWZzWzVdOwogICAgdTE2X3QgdHhvcFs1XTsKCiAgICAvKiBXTU0gcGFyYW1ldGVyIGZvciBTVEEgKi8KICAgIC8qIEJlc3QgRWZmb3IgKi8KICAgIGN3bWluWzBdID0gMTU7CiAgICBjd21heFswXSA9IDEwMjM7CiAgICBhaWZzWzBdID0gMyAqIDkgKyAxMDsKICAgIHR4b3BbMF0gPSAwOwogICAgLyogQmFjayBHcm91bmQgKi8KICAgIGN3bWluWzFdID0gMTU7CiAgICBjd21heFsxXSA9IDEwMjM7CiAgICBhaWZzWzFdID0gNyAqIDkgKyAxMDsKICAgIHR4b3BbMV0gPSAwOwogICAgLyogVklERU8gKi8KICAgIGN3bWluWzJdID0gNzsKICAgIGN3bWF4WzJdID0gMTU7CiAgICBhaWZzWzJdID0gMiAqIDkgKyAxMDsKICAgIHR4b3BbMl0gPSA5NDsKICAgIC8qIFZPSUNFICovCiAgICBjd21pblszXSA9IDM7CiAgICBjd21heFszXSA9IDc7CiAgICBhaWZzWzNdID0gMiAqIDkgKyAxMDsKICAgIHR4b3BbM10gPSA0NzsKICAgIC8qIFNwZWNpYWwgVHhRICovCiAgICBjd21pbls0XSA9IDM7CiAgICBjd21heFs0XSA9IDc7CiAgICBhaWZzWzRdID0gMiAqIDkgKyAxMDsKICAgIHR4b3BbNF0gPSAwOwoKICAgIC8qIFdNTSBwYXJhbWV0ZXIgZm9yIEFQICovCiAgICBpZiAobW9kZSA9PSAxKQogICAgewogICAgICAgIGN3bWF4WzBdID0gNjM7CiAgICAgICAgYWlmc1szXSA9IDEgKiA5ICsgMTA7CiAgICAgICAgYWlmc1s0XSA9IDEgKiA5ICsgMTA7CiAgICB9CiAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKGRldiwgY3dtaW4sIGN3bWF4LCBhaWZzLCB0eG9wKTsKfQoKdTE2X3QgemZGaW5kQVRIRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpCnsKICAgIHU4X3Qgc3ViVHlwZTsKICAgIHUxNl90IG9mZnNldDsKICAgIHUxNl90IGJ1ZkxlbjsKICAgIHUxNl90IGVsZW47CiAgICB1OF90IGlkOwogICAgdThfdCB0bXA7CgogICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCiAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOwoKICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCiAgICB7CiAgICAgICAgem1fYXNzZXJ0KDApOwogICAgfQoKICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KICAgIG9mZnNldCArPSAyNDsKCiAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKCiAgICAvKiBTZWFyY2ggbG9vcCAqLwogICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCiAgICB7CiAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCiAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCiAgICAgICAgewogICAgICAgICAgICAvKiBCaW5nbyAqLwogICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpID09IDB4MDApCiAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4MDMpCiAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4N2YpCiAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNSkpID09IHR5cGUpKQoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCBzdWJ0eXBlICE9IDB4ZmYgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPT0gc3VidHlwZSAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgIH0KICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9Cgp1MTZfdCB6ZkZpbmRCcmRjbU1ydmxSbG5rRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKewogICAgdThfdCBzdWJUeXBlOwogICAgdTE2X3Qgb2Zmc2V0OwogICAgdTE2X3QgYnVmTGVuOwogICAgdTE2X3QgZWxlbjsKICAgIHU4X3QgaWQ7CiAgICB1OF90IHRtcDsKCiAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CgogICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKICAgIHsKICAgICAgICB6bV9hc3NlcnQoMCk7CiAgICB9CgogICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLwogICAgb2Zmc2V0ICs9IDI0OwoKICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOwoKICAgIC8qIFNlYXJjaCBsb29wICovCiAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKICAgIHsKICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIEJpbmdvICovCiAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgxMCkKICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KSkgPT0gMHgxOCkpCgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpKSA9PSAweDUwKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweDQzKSkKCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gMHg3RikKICAgICAgICB7CiAgICAgICAgICAgIC8qIEJpbmdvICovCiAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAxKQoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgIH0KICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9Cgp1MTZfdCB6ZkZpbmRNYXJ2ZWxFeHRDYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQp7CiAgICB1OF90IHN1YlR5cGU7CiAgICB1MTZfdCBvZmZzZXQ7CiAgICB1MTZfdCBidWZMZW47CiAgICB1MTZfdCBlbGVuOwogICAgdThfdCBpZDsKICAgIHU4X3QgdG1wOwoKICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLwogICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKCiAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQogICAgewogICAgICAgIHptX2Fzc2VydCgwKTsKICAgIH0KCiAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCiAgICBvZmZzZXQgKz0gMjQ7CgogICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CgogICAgLyogU2VhcmNoIGxvb3AgKi8KICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQogICAgewogICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLwogICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9XSUZJX0lFKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKT4oYnVmTGVuIC0gb2Zmc2V0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQogICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHg1MCkKICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4NDMpKQoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgIH0KICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9Cgp1MTZfdCB6ZkZpbmRCcm9hZGNvbUV4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCnsKICAgIHU4X3Qgc3ViVHlwZTsKICAgIHUxNl90IG9mZnNldDsKICAgIHUxNl90IGJ1ZkxlbjsKICAgIHUxNl90IGVsZW47CiAgICB1OF90IGlkOwogICAgdThfdCB0bXA7CgogICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCiAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOwoKICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCiAgICB7CiAgICAgICAgem1fYXNzZXJ0KDApOwogICAgfQoKICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KICAgIG9mZnNldCArPSAyNDsKCiAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKCiAgICAvKiBTZWFyY2ggbG9vcCAqLwogICAgd2hpbGUoKG9mZnNldCsyKSA8IGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQogICAgewogICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLwogICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9XSUZJX0lFKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA+IChidWZMZW4gLSBvZmZzZXQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGVsZW4gPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgxMCkKICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KSkgPT0gMHgxOCkgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLwogICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgfQoKICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CgogICAgcmV0dXJuIDB4ZmZmZjsKfQoKdTE2X3QgemZGaW5kUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCnsKICAgIHU4X3Qgc3ViVHlwZTsKICAgIHUxNl90IG9mZnNldDsKICAgIHUxNl90IGJ1ZkxlbjsKICAgIHUxNl90IGVsZW47CiAgICB1OF90IGlkOwogICAgdThfdCB0bXA7CgogICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCiAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOwoKICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCiAgICB7CiAgICAgICAgem1fYXNzZXJ0KDApOwogICAgfQoKICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KICAgIG9mZnNldCArPSAyNDsKCiAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKCiAgICAvKiBTZWFyY2ggbG9vcCAqLwogICAgd2hpbGUoKG9mZnNldCsyKSA8IGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQogICAgewogICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLwogICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSAweDdGKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA+IChidWZMZW4gLSBvZmZzZXQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMSkKCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCiAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICB9CgogICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKICAgIH0KCiAgICByZXR1cm4gMHhmZmZmOwp9Cg==