Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gT3V0cHV0RGV2LmgKLy8KLy8gQ29weXJpZ2h0IDE5OTYtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA1IEpvbmF0aGFuIEJsYW5kZm9yZCA8anJiQHJlZGhhdC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwNiBUaG9ya2lsZCBTdHJheSA8dGhvcmtpbGRAaWZpLnVpby5ubz4KLy8gQ29weXJpZ2h0IChDKSAyMDA3IEplZmYgTXVpemVsYWFyIDxqZWZmQGluZmlkaWdtLm5ldD4KLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDExLCAyMDE3IEFkcmlhbiBKb2huc29uIDxham9obnNvbkByZWRuZW9uLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMsIDIwMTUgVGhvbWFzIEZyZWl0YWcgPFRob21hcy5GcmVpdGFnQGFsZmEuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMSBDYXJsb3MgR2FyY2lhIENhbXBvcyA8Y2FybG9zZ2NAZ25vbWUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTIsIDIwMTMgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBDaHJpc3RpYW4gRmV1ZXJz5G5nZXIgPGNmZXVlcnNhZW5nZXJAZ29vZ2xlbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMiBGYWJpbyBEJ1Vyc28gPGZhYmlvZHVyc29AaG90bWFpbC5pdD4KLy8gQ29weXJpZ2h0IChDKSAyMDEyIFdpbGxpYW0gQmFkZXIgPHdpbGxpYW1iYWRlckBob3RtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDE3LCAyMDE4IE9saXZlciBTYW5kZXIgPG9saXZlci5zYW5kZXJAdHUtZHJlc2Rlbi5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDE4IEtsYXLkbHZkYWxlbnMgRGF0YWtvbnN1bHQgQUIsIGEgS0RBQiBHcm91cCBjb21wYW55LCA8aW5mb0BrZGFiLmNvbT4uIFdvcmsgc3BvbnNvcmVkIGJ5IHRoZSBMaU11eCBwcm9qZWN0IG9mIHRoZSBjaXR5IG9mIE11bmljaAovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIE9VVFBVVERFVl9ICiNkZWZpbmUgT1VUUFVUREVWX0gKCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbnRlcmZhY2UKI2VuZGlmCgojaW5jbHVkZSAicG9wcGxlci1jb25maWcuaCIKI2luY2x1ZGUgImdvby9ndHlwZXMuaCIKI2luY2x1ZGUgIkNoYXJUeXBlcy5oIgojaW5jbHVkZSAiT2JqZWN0LmgiCiNpbmNsdWRlICJQb3BwbGVyQ2FjaGUuaCIKCmNsYXNzIEFubm90OwpjbGFzcyBEaWN0OwpjbGFzcyBHb29IYXNoOwpjbGFzcyBHb29TdHJpbmc7CmNsYXNzIEdmeFN0YXRlOwpjbGFzcyBHZng7CnN0cnVjdCBHZnhDb2xvcjsKY2xhc3MgR2Z4Q29sb3JTcGFjZTsKY2xhc3MgR2Z4SW1hZ2VDb2xvck1hcDsKY2xhc3MgR2Z4RnVuY3Rpb25TaGFkaW5nOwpjbGFzcyBHZnhBeGlhbFNoYWRpbmc7CmNsYXNzIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmc7CmNsYXNzIEdmeFBhdGNoTWVzaFNoYWRpbmc7CmNsYXNzIEdmeFJhZGlhbFNoYWRpbmc7CmNsYXNzIEdmeEdvdXJhdWRUcmlhbmdsZVNoYWRpbmc7CmNsYXNzIEdmeFBhdGNoTWVzaFNoYWRpbmc7CmNsYXNzIFN0cmVhbTsKY2xhc3MgTGlua3M7CmNsYXNzIEFubm90TGluazsKY2xhc3MgQ2F0YWxvZzsKY2xhc3MgUGFnZTsKY2xhc3MgRnVuY3Rpb247CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBPdXRwdXREZXYKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNsYXNzIE91dHB1dERldiB7CnB1YmxpYzoKCiAgLy8gQ29uc3RydWN0b3IuCiAgT3V0cHV0RGV2KCkgCiNpZmRlZiBVU0VfQ01TCiA6IGljY0NvbG9yU3BhY2VDYWNoZSg1KQojZW5kaWYKICB7CiAgICAgIHByb2ZpbGVIYXNoID0gbnVsbHB0cjsKICB9CgogIC8vIERlc3RydWN0b3IuCiAgdmlydHVhbCB+T3V0cHV0RGV2KCkge30KCiAgLy8tLS0tLSBnZXQgaW5mbyBhYm91dCBvdXRwdXQgZGV2aWNlCgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIHVwc2lkZS1kb3duIGNvb3JkaW5hdGVzPwogIC8vIChVcHNpZGUtZG93biBtZWFucyAoMCwwKSBpcyB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBwYWdlLikKICB2aXJ0dWFsIEdCb29sIHVwc2lkZURvd24oKSA9IDA7CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGRyYXdDaGFyKCkgb3IgZHJhd1N0cmluZygpPwogIHZpcnR1YWwgR0Jvb2wgdXNlRHJhd0NoYXIoKSA9IDA7CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIHRpbGluZ1BhdHRlcm5GaWxsKCk/ICBJZiB0aGlzIHJldHVybnMgZmFsc2UsCiAgLy8gdGlsaW5nIHBhdHRlcm4gZmlsbHMgd2lsbCBiZSByZWR1Y2VkIHRvIGEgc2VyaWVzIG9mIG90aGVyIGRyYXdpbmcKICAvLyBvcGVyYXRpb25zLgogIHZpcnR1YWwgR0Jvb2wgdXNlVGlsaW5nUGF0dGVybkZpbGwoKSB7IHJldHVybiBnRmFsc2U7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSBzdXBwb3J0IHNwZWNpZmljIHNoYWRpbmcgdHlwZXM/CiAgLy8gc2VlIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoKSBhbmQgcGF0Y2hNZXNoU2hhZGVkRmlsbCgpCiAgdmlydHVhbCBHQm9vbCB1c2VTaGFkZWRGaWxscyhpbnQgdHlwZSkgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIEZpbGxDb2xvclN0b3AoKT8KICB2aXJ0dWFsIEdCb29sIHVzZUZpbGxDb2xvclN0b3AoKSB7IHJldHVybiBnRmFsc2U7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgZHJhd0Zvcm0oKT8gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwKICAvLyBmb3JtLXR5cGUgWE9iamVjdHMgd2lsbCBiZSBpbnRlcnByZXRlZCAoaS5lLiwgdW5yb2xsZWQpLgogIHZpcnR1YWwgR0Jvb2wgdXNlRHJhd0Zvcm0oKSB7IHJldHVybiBnRmFsc2U7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgYmVnaW5UeXBlM0NoYXIvZW5kVHlwZTNDaGFyPyAgT3RoZXJ3aXNlLAogIC8vIHRleHQgaW4gVHlwZSAzIGZvbnRzIHdpbGwgYmUgZHJhd24gd2l0aCBkcmF3Q2hhci9kcmF3U3RyaW5nLgogIHZpcnR1YWwgR0Jvb2wgaW50ZXJwcmV0VHlwZTNDaGFycygpID0gMDsKCiAgLy8gRG9lcyB0aGlzIGRldmljZSBuZWVkIG5vbi10ZXh0IGNvbnRlbnQ/CiAgdmlydHVhbCBHQm9vbCBuZWVkTm9uVGV4dCgpIHsgcmV0dXJuIGdUcnVlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgcmVxdWlyZSBpbmNDaGFyQ291bnQgdG8gYmUgY2FsbGVkIGZvciB0ZXh0IG9uCiAgLy8gbm9uLXNob3duIGxheWVycz8KICB2aXJ0dWFsIEdCb29sIG5lZWRDaGFyQ291bnQoKSB7IHJldHVybiBnRmFsc2U7IH0KICAKICAvLyBEb2VzIHRoaXMgZGV2aWNlIG5lZWQgdG8gY2xpcCBwYWdlcyB0byB0aGUgY3JvcCBib3ggZXZlbiB3aGVuIHRoZQogIC8vIGJveCBpcyB0aGUgY3JvcCBib3g/CiAgdmlydHVhbCBHQm9vbCBuZWVkQ2xpcFRvQ3JvcEJveCgpIHsgcmV0dXJuIGdGYWxzZTsgfQoKICAvLy0tLS0tIGluaXRpYWxpemF0aW9uIGFuZCBjb250cm9sCgogIC8vIFNldCBkZWZhdWx0IHRyYW5zZm9ybSBtYXRyaXguCiAgdmlydHVhbCB2b2lkIHNldERlZmF1bHRDVE0oZG91YmxlICpjdG0pOwoKICAvLyBDaGVjayB0byBzZWUgaWYgYSBwYWdlIHNsaWNlIHNob3VsZCBiZSBkaXNwbGF5ZWQuICBJZiB0aGlzCiAgLy8gcmV0dXJucyBmYWxzZSwgdGhlIHBhZ2UgZGlzcGxheSBpcyBhYm9ydGVkLiAgVHlwaWNhbGx5LCBhbgogIC8vIE91dHB1dERldiB3aWxsIHVzZSBzb21lIGFsdGVybmF0ZSBtZWFucyB0byBkaXNwbGF5IHRoZSBwYWdlCiAgLy8gYmVmb3JlIHJldHVybmluZyBmYWxzZS4KICB2aXJ0dWFsIEdCb29sIGNoZWNrUGFnZVNsaWNlKFBhZ2UgKnBhZ2UsIGRvdWJsZSBoRFBJLCBkb3VibGUgdkRQSSwKCQkJICAgICAgIGludCByb3RhdGUsIEdCb29sIHVzZU1lZGlhQm94LCBHQm9vbCBjcm9wLAoJCQkgICAgICAgaW50IHNsaWNlWCwgaW50IHNsaWNlWSwgaW50IHNsaWNlVywgaW50IHNsaWNlSCwKCQkJICAgICAgIEdCb29sIHByaW50aW5nLAoJCQkgICAgICAgR0Jvb2wgKCogYWJvcnRDaGVja0Niaykodm9pZCAqZGF0YSkgPSBOVUxMLAoJCQkgICAgICAgdm9pZCAqIGFib3J0Q2hlY2tDYmtEYXRhID0gTlVMTCwKCQkJICAgICAgIEdCb29sICgqYW5ub3REaXNwbGF5RGVjaWRlQ2JrKShBbm5vdCAqYW5ub3QsIHZvaWQgKnVzZXJfZGF0YSkgPSBOVUxMLAoJCQkgICAgICAgdm9pZCAqYW5ub3REaXNwbGF5RGVjaWRlQ2JrRGF0YSA9IE5VTEwpCiAgICB7IHJldHVybiBnVHJ1ZTsgfQoKICAvLyBTdGFydCBhIHBhZ2UuCiAgdmlydHVhbCB2b2lkIHN0YXJ0UGFnZShpbnQgcGFnZU51bSwgR2Z4U3RhdGUgKnN0YXRlLCBYUmVmICp4cmVmKSB7fQoKICAvLyBFbmQgYSBwYWdlLgogIHZpcnR1YWwgdm9pZCBlbmRQYWdlKCkge30KCiAgLy8gRHVtcCBwYWdlIGNvbnRlbnRzIHRvIGRpc3BsYXkuCiAgdmlydHVhbCB2b2lkIGR1bXAoKSB7fQoKICAvLy0tLS0tIGNvb3JkaW5hdGUgY29udmVyc2lvbgoKICAvLyBDb252ZXJ0IGJldHdlZW4gZGV2aWNlIGFuZCB1c2VyIGNvb3JkaW5hdGVzLgogIHZpcnR1YWwgdm9pZCBjdnREZXZUb1VzZXIoZG91YmxlIGR4LCBkb3VibGUgZHksIGRvdWJsZSAqdXgsIGRvdWJsZSAqdXkpOwogIHZpcnR1YWwgdm9pZCBjdnRVc2VyVG9EZXYoZG91YmxlIHV4LCBkb3VibGUgdXksIGludCAqZHgsIGludCAqZHkpOwoKICBkb3VibGUgKmdldERlZkNUTSgpIHsgcmV0dXJuIGRlZkNUTTsgfQogIGRvdWJsZSAqZ2V0RGVmSUNUTSgpIHsgcmV0dXJuIGRlZklDVE07IH0KCiAgLy8tLS0tLSBzYXZlL3Jlc3RvcmUgZ3JhcGhpY3Mgc3RhdGUKICB2aXJ0dWFsIHZvaWQgc2F2ZVN0YXRlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCByZXN0b3JlU3RhdGUoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CgogIC8vLS0tLS0gdXBkYXRlIGdyYXBoaWNzIHN0YXRlCiAgdmlydHVhbCB2b2lkIHVwZGF0ZUFsbChHZnhTdGF0ZSAqc3RhdGUpOwoKICAvLyBVcGRhdGUgdGhlIEN1cnJlbnQgVHJhbnNmb3JtYXRpb24gTWF0cml4IChDVE0pLCBpLmUuLCB0aGUgbmV3IG1hdHJpeAogIC8vIGdpdmVuIGluIG0xMSwgLi4uLCBtMzIgaXMgY29tYmluZWQgd2l0aCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgQ1RNLgogIC8vIEF0IHRoZSBzYW1lIHRpbWUsIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzdGF0ZS0+Z2V0Q1RNKCkgYWxyZWFkeQogIC8vIGNvbnRhaW5zIHRoZSBjb3JyZWN0IG5ldyBDVE0sIHNvIG9uZSBtYXkgYXMgd2VsbCByZXBsYWNlIHRoZQogIC8vIENUTSBvZiB0aGUgcmVuZGVyZXIgd2l0aCB0aGF0LgogIHZpcnR1YWwgdm9pZCB1cGRhdGVDVE0oR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAvKm0xMSovLCBkb3VibGUgLyptMTIqLywKCQkJIGRvdWJsZSAvKm0yMSovLCBkb3VibGUgLyptMjIqLywgZG91YmxlIC8qbTMxKi8sIGRvdWJsZSAvKm0zMiovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVMaW5lRGFzaChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmxhdG5lc3MoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUxpbmVKb2luKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVMaW5lQ2FwKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVNaXRlckxpbWl0KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVMaW5lV2lkdGgoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0cm9rZUFkanVzdChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlQWxwaGFJc1NoYXBlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVUZXh0S25vY2tvdXQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZpbGxDb2xvclNwYWNlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHJva2VDb2xvclNwYWNlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVGaWxsQ29sb3IoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0cm9rZUNvbG9yKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVCbGVuZE1vZGUoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZpbGxPcGFjaXR5KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHJva2VPcGFjaXR5KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVQYXR0ZXJuT3BhY2l0eShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgY2xlYXJQYXR0ZXJuT3BhY2l0eShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlsbE92ZXJwcmludChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3Ryb2tlT3ZlcnByaW50KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVPdmVycHJpbnRNb2RlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVUcmFuc2ZlcihHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlsbENvbG9yU3RvcChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgZG91YmxlIC8qb2Zmc2V0Ki8pIHt9CgogIC8vLS0tLS0gdXBkYXRlIHRleHQgc3RhdGUKICB2aXJ0dWFsIHZvaWQgdXBkYXRlRm9udChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlVGV4dE1hdChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ2hhclNwYWNlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVSZW5kZXIoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVJpc2UoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVdvcmRTcGFjZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlSG9yaXpTY2FsaW5nKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVUZXh0UG9zKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVUZXh0U2hpZnQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAvKnNoaWZ0Ki8pIHt9CiAgdmlydHVhbCB2b2lkIHNhdmVUZXh0UG9zKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCByZXN0b3JlVGV4dFBvcyhHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KCiAgLy8tLS0tLSBwYXRoIHBhaW50aW5nCiAgdmlydHVhbCB2b2lkIHN0cm9rZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgZmlsbChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgZW9GaWxsKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgR0Jvb2wgdGlsaW5nUGF0dGVybkZpbGwoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIEdmeCAqIC8qZ2Z4Ki8sIENhdGFsb2cgKiAvKmNhdCovLCBPYmplY3QgKiAvKnN0ciovLAoJCQkJICBkb3VibGUgKiAvKnBtYXQqLywgaW50IC8qcGFpbnRUeXBlKi8sIGludCAvKnRpbGluZ1R5cGUqLywgRGljdCAqIC8qcmVzRGljdCovLAoJCQkJICBkb3VibGUgKiAvKm1hdCovLCBkb3VibGUgKiAvKmJib3gqLywKCQkJCSAgaW50IC8qeDAqLywgaW50IC8qeTAqLywgaW50IC8qeDEqLywgaW50IC8qeTEqLywKCQkJCSAgZG91YmxlIC8qeFN0ZXAqLywgZG91YmxlIC8qeVN0ZXAqLykKICAgIHsgcmV0dXJuIGdGYWxzZTsgfQogIHZpcnR1YWwgR0Jvb2wgZnVuY3Rpb25TaGFkZWRGaWxsKEdmeFN0YXRlICogLypzdGF0ZSovLAoJCQkJICAgR2Z4RnVuY3Rpb25TaGFkaW5nICogLypzaGFkaW5nKi8pCiAgICB7IHJldHVybiBnRmFsc2U7IH0KICB2aXJ0dWFsIEdCb29sIGF4aWFsU2hhZGVkRmlsbChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgR2Z4QXhpYWxTaGFkaW5nICogLypzaGFkaW5nKi8sIGRvdWJsZSAvKnRNaW4qLywgZG91YmxlIC8qdE1heCovKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCBheGlhbFNoYWRlZFN1cHBvcnRFeHRlbmQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIEdmeEF4aWFsU2hhZGluZyAqIC8qc2hhZGluZyovKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCByYWRpYWxTaGFkZWRGaWxsKEdmeFN0YXRlICogLypzdGF0ZSovLCBHZnhSYWRpYWxTaGFkaW5nICogLypzaGFkaW5nKi8sIGRvdWJsZSAvKnNNaW4qLywgZG91YmxlIC8qc01heCovKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCByYWRpYWxTaGFkZWRTdXBwb3J0RXh0ZW5kKEdmeFN0YXRlICogLypzdGF0ZSovLCBHZnhSYWRpYWxTaGFkaW5nICogLypzaGFkaW5nKi8pCiAgICB7IHJldHVybiBnRmFsc2U7IH0KICB2aXJ0dWFsIEdCb29sIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBHZnhHb3VyYXVkVHJpYW5nbGVTaGFkaW5nICpzaGFkaW5nKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCBwYXRjaE1lc2hTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4UGF0Y2hNZXNoU2hhZGluZyAqc2hhZGluZykKICAgIHsgcmV0dXJuIGdGYWxzZTsgfQoKICAvLy0tLS0tIHBhdGggY2xpcHBpbmcKICB2aXJ0dWFsIHZvaWQgY2xpcChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgZW9DbGlwKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCBjbGlwVG9TdHJva2VQYXRoKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQoKICAvLy0tLS0tIHRleHQgZHJhd2luZwogIHZpcnR1YWwgdm9pZCBiZWdpblN0cmluZ09wKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCBlbmRTdHJpbmdPcChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgYmVnaW5TdHJpbmcoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGNvbnN0IEdvb1N0cmluZyAqIC8qcyovKSB7fQogIHZpcnR1YWwgdm9pZCBlbmRTdHJpbmcoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CgogIC8vIERyYXcgb25lIGdseXBoIGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uCiAgLy8KICAvLyBBcmd1bWVudHMgYXJlOgogIC8vIENoYXJDb2RlIGNvZGU6IFRoaXMgaXMgdGhlIGNoYXJhY3RlciBjb2RlIGluIHRoZSBjb250ZW50IHN0cmVhbS4gSXQgbmVlZHMgdG8gYmUgbWFwcGVkIGJhY2sgdG8gYSBnbHlwaCBpbmRleC4KICAvLyBpbnQgbkJ5dGVzOiBUaGUgdGV4dCBzdHJpbmdzIGluIHRoZSBjb250ZW50IHN0cmVhbSBjYW4gY29uc2lzdHMgb2YgZWl0aGVyIDgtYml0IG9yIDE2LWJpdAogIC8vICAgICAgICAgICAgIGNoYXJhY3RlciBjb2RlcyBkZXBlbmRpbmcgb24gdGhlIGZvbnQuIG5CeXRlcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjaGFyYWN0ZXIgY29kZS4KICAvLyBVbmljb2RlICp1OiBUaGUgVUNTLTQgbWFwcGluZyB1c2VkIGZvciB0ZXh0IGV4dHJhY3Rpb24gKFRleHRPdXRwdXREZXYpLgogIC8vIGludCB1TGVuOiBUaGUgbnVtYmVyIG9mIHVuaWNvZGUgZW50cmllcyBpbiB1LiAgVXN1YWxseSAnMScsIGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIsCiAgLy8gICAgICAgICAgIGJ1dCBpdCBtYXkgYWxzbyBoYXZlIGxhcmdlciB2YWx1ZXMsIGZvciBleGFtcGxlIGZvciBsaWdhdHVyZXMuCiAgdmlydHVhbCB2b2lkIGRyYXdDaGFyKEdmeFN0YXRlICogLypzdGF0ZSovLCBkb3VibGUgLyp4Ki8sIGRvdWJsZSAvKnkqLywKCQkJZG91YmxlIC8qZHgqLywgZG91YmxlIC8qZHkqLywKCQkJZG91YmxlIC8qb3JpZ2luWCovLCBkb3VibGUgLypvcmlnaW5ZKi8sCgkJCUNoYXJDb2RlIC8qY29kZSovLCBpbnQgLypuQnl0ZXMqLywgVW5pY29kZSAqIC8qdSovLCBpbnQgLyp1TGVuKi8pIHt9CiAgdmlydHVhbCB2b2lkIGRyYXdTdHJpbmcoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGNvbnN0IEdvb1N0cmluZyAqIC8qcyovKSB7fQogIHZpcnR1YWwgR0Jvb2wgYmVnaW5UeXBlM0NoYXIoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAvKngqLywgZG91YmxlIC8qeSovLAoJCQkgICAgICAgZG91YmxlIC8qZHgqLywgZG91YmxlIC8qZHkqLywKCQkJICAgICAgIENoYXJDb2RlIC8qY29kZSovLCBVbmljb2RlICogLyp1Ki8sIGludCAvKnVMZW4qLyk7CiAgdmlydHVhbCB2b2lkIGVuZFR5cGUzQ2hhcihHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgYmVnaW5UZXh0T2JqZWN0KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCBlbmRUZXh0T2JqZWN0KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCBpbmNDaGFyQ291bnQoaW50IC8qbkNoYXJzKi8pIHt9CiAgdmlydHVhbCB2b2lkIGJlZ2luQWN0dWFsVGV4dChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgY29uc3QgR29vU3RyaW5nICogLyp0ZXh0Ki8gKSB7fQogIHZpcnR1YWwgdm9pZCBlbmRBY3R1YWxUZXh0KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQoKICAvLy0tLS0tIGltYWdlIGRyYXdpbmcKICAvLyBEcmF3IGFuIGltYWdlIG1hc2suICBBbiBpbWFnZSBtYXNrIGlzIGEgb25lLWJpdC1wZXItcGl4ZWwgaW1hZ2UsIHdoZXJlIGVhY2ggcGl4ZWwKICAvLyBjYW4gb25seSBiZSAnZmlsbCBjb2xvcicgb3IgJ3RyYW5zcGFyZW50Jy4KICAvLwogIC8vIElmICdpbnZlcnQnIGlzIGZhbHNlLCBhIHNhbXBsZSB2YWx1ZSBvZiAwIG1hcmtzIHRoZSBwYWdlIHdpdGggdGhlIGN1cnJlbnQgY29sb3IsCiAgLy8gYW5kIGEgMSBsZWF2ZXMgdGhlIHByZXZpb3VzIGNvbnRlbnRzIHVuY2hhbmdlZC4gSWYgJ2ludmVydCcgaXMgdHJ1ZSwgdGhlc2UgbWVhbmluZ3MgYXJlIHJldmVyc2VkLgogIHZpcnR1YWwgdm9pZCBkcmF3SW1hZ2VNYXNrKEdmeFN0YXRlICpzdGF0ZSwgT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgR0Jvb2wgaW52ZXJ0LCBHQm9vbCBpbnRlcnBvbGF0ZSwKCQkJICAgICBHQm9vbCBpbmxpbmVJbWcpOwogIHZpcnR1YWwgdm9pZCBzZXRTb2Z0TWFza0Zyb21JbWFnZU1hc2soR2Z4U3RhdGUgKnN0YXRlLAoJCQkJCU9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJCQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIEdCb29sIGludmVydCwKCQkJCQlHQm9vbCBpbmxpbmVJbWcsIGRvdWJsZSAqYmFzZU1hdHJpeCk7CiAgdmlydHVhbCB2b2lkIHVuc2V0U29mdE1hc2tGcm9tSW1hZ2VNYXNrKEdmeFN0YXRlICpzdGF0ZSwgZG91YmxlICpiYXNlTWF0cml4KTsKICB2aXJ0dWFsIHZvaWQgZHJhd0ltYWdlKEdmeFN0YXRlICpzdGF0ZSwgT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBHZnhJbWFnZUNvbG9yTWFwICpjb2xvck1hcCwKCQkJIEdCb29sIGludGVycG9sYXRlLCBpbnQgKm1hc2tDb2xvcnMsIEdCb29sIGlubGluZUltZyk7CiAgdmlydHVhbCB2b2lkIGRyYXdNYXNrZWRJbWFnZShHZnhTdGF0ZSAqc3RhdGUsIE9iamVjdCAqcmVmLCBTdHJlYW0gKnN0ciwKCQkJICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKCQkJICAgICAgIEdmeEltYWdlQ29sb3JNYXAgKmNvbG9yTWFwLCBHQm9vbCBpbnRlcnBvbGF0ZSwKCQkJICAgICAgIFN0cmVhbSAqbWFza1N0ciwgaW50IG1hc2tXaWR0aCwgaW50IG1hc2tIZWlnaHQsCgkJCSAgICAgICBHQm9vbCBtYXNrSW52ZXJ0LCBHQm9vbCBtYXNrSW50ZXJwb2xhdGUpOwogIHZpcnR1YWwgdm9pZCBkcmF3U29mdE1hc2tlZEltYWdlKEdmeFN0YXRlICpzdGF0ZSwgT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkJICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAoJCQkJICAgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsCgkJCQkgICBHQm9vbCBpbnRlcnBvbGF0ZSwKCQkJCSAgIFN0cmVhbSAqbWFza1N0ciwKCQkJCSAgIGludCBtYXNrV2lkdGgsIGludCBtYXNrSGVpZ2h0LAoJCQkJICAgR2Z4SW1hZ2VDb2xvck1hcCAqbWFza0NvbG9yTWFwLAoJCQkJICAgR0Jvb2wgbWFza0ludGVycG9sYXRlKTsKCiAgLy8tLS0tLSBncm91cGluZyBvcGVyYXRvcnMKCiAgdmlydHVhbCB2b2lkIGVuZE1hcmtlZENvbnRlbnQoR2Z4U3RhdGUgKnN0YXRlKTsKICB2aXJ0dWFsIHZvaWQgYmVnaW5NYXJrZWRDb250ZW50KGNvbnN0IGNoYXIgKm5hbWUsIERpY3QgKnByb3BlcnRpZXMpOwogIHZpcnR1YWwgdm9pZCBtYXJrUG9pbnQoY29uc3QgY2hhciAqbmFtZSk7CiAgdmlydHVhbCB2b2lkIG1hcmtQb2ludChjb25zdCBjaGFyICpuYW1lLCBEaWN0ICpwcm9wZXJ0aWVzKTsKCgoKI2lmZGVmIE9QSV9TVVBQT1JUCiAgLy8tLS0tLSBPUEkgZnVuY3Rpb25zCiAgdmlydHVhbCB2b2lkIG9waUJlZ2luKEdmeFN0YXRlICpzdGF0ZSwgRGljdCAqb3BpRGljdCk7CiAgdmlydHVhbCB2b2lkIG9waUVuZChHZnhTdGF0ZSAqc3RhdGUsIERpY3QgKm9waURpY3QpOwojZW5kaWYKCiAgLy8tLS0tLSBUeXBlIDMgZm9udCBvcGVyYXRvcnMKICB2aXJ0dWFsIHZvaWQgdHlwZTNEMChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgZG91YmxlIC8qd3gqLywgZG91YmxlIC8qd3kqLykge30KICB2aXJ0dWFsIHZvaWQgdHlwZTNEMShHZnhTdGF0ZSAqIC8qc3RhdGUqLywgZG91YmxlIC8qd3gqLywgZG91YmxlIC8qd3kqLywKCQkgICAgICAgZG91YmxlIC8qbGx4Ki8sIGRvdWJsZSAvKmxseSovLCBkb3VibGUgLyp1cngqLywgZG91YmxlIC8qdXJ5Ki8pIHt9CgogIC8vLS0tLS0gZm9ybSBYT2JqZWN0cwogIHZpcnR1YWwgdm9pZCBkcmF3Rm9ybShSZWYgLyppZCovKSB7fQoKICAvLy0tLS0tIFBvc3RTY3JpcHQgWE9iamVjdHMKICB2aXJ0dWFsIHZvaWQgcHNYT2JqZWN0KFN0cmVhbSAqIC8qcHNTdHJlYW0qLywgU3RyZWFtICogLypsZXZlbDFTdHJlYW0qLykge30KCiAgLy8tLS0tLSBQcm9maWxpbmcKICB2aXJ0dWFsIHZvaWQgc3RhcnRQcm9maWxlKCk7CiAgdmlydHVhbCBHb29IYXNoICpnZXRQcm9maWxlSGFzaCgpIHtyZXR1cm4gcHJvZmlsZUhhc2g7IH0KICB2aXJ0dWFsIEdvb0hhc2ggKmVuZFByb2ZpbGUoKTsKCiAgLy8tLS0tLSB0cmFuc3BhcmVuY3kgZ3JvdXBzIGFuZCBzb2Z0IG1hc2tzCiAgdmlydHVhbCBHQm9vbCBjaGVja1RyYW5zcGFyZW5jeUdyb3VwKEdmeFN0YXRlICogLypzdGF0ZSovLCBHQm9vbCAvKmtub2Nrb3V0Ki8pIHsgcmV0dXJuIGdUcnVlOyB9CiAgdmlydHVhbCB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAqIC8qYmJveCovLAoJCQkJICAgICAgR2Z4Q29sb3JTcGFjZSAqIC8qYmxlbmRpbmdDb2xvclNwYWNlKi8sCgkJCQkgICAgICBHQm9vbCAvKmlzb2xhdGVkKi8sIEdCb29sIC8qa25vY2tvdXQqLywKCQkJCSAgICAgIEdCb29sIC8qZm9yU29mdE1hc2sqLykge30KICB2aXJ0dWFsIHZvaWQgZW5kVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHBhaW50VHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAqIC8qYmJveCovKSB7fQogIHZpcnR1YWwgdm9pZCBzZXRTb2Z0TWFzayhHZnhTdGF0ZSAqIC8qc3RhdGUqLywgZG91YmxlICogLypiYm94Ki8sIEdCb29sIC8qYWxwaGEqLywKCQkJICAgRnVuY3Rpb24gKiAvKnRyYW5zZmVyRnVuYyovLCBHZnhDb2xvciAqIC8qYmFja2Ryb3BDb2xvciovKSB7fQogIHZpcnR1YWwgdm9pZCBjbGVhclNvZnRNYXNrKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQoKICAvLy0tLS0tIGxpbmtzCiAgdmlydHVhbCB2b2lkIHByb2Nlc3NMaW5rKEFubm90TGluayAqIC8qbGluayovKSB7fQoKI2lmIDEgLy9+dG1wOiB0dXJuIG9mZiBhbnRpLWFsaWFzaW5nIHRlbXBvcmFyaWx5CiAgdmlydHVhbCBHQm9vbCBnZXRWZWN0b3JBbnRpYWxpYXMoKSB7IHJldHVybiBnRmFsc2U7IH0KICB2aXJ0dWFsIHZvaWQgc2V0VmVjdG9yQW50aWFsaWFzKEdCb29sIC8qdmFhKi8pIHt9CiNlbmRpZgoKI2lmZGVmIFVTRV9DTVMKICBQb3BwbGVyQ2FjaGUgKmdldEljY0NvbG9yU3BhY2VDYWNoZSgpOwojZW5kaWYKCnByaXZhdGU6CgogIGRvdWJsZSBkZWZDVE1bNl07CQkvLyBkZWZhdWx0IGNvb3JkaW5hdGUgdHJhbnNmb3JtIG1hdHJpeAogIGRvdWJsZSBkZWZJQ1RNWzZdOwkJLy8gaW52ZXJzZSBvZiBkZWZhdWx0IENUTQogIEdvb0hhc2ggKnByb2ZpbGVIYXNoOwoKI2lmZGVmIFVTRV9DTVMKICBQb3BwbGVyQ2FjaGUgaWNjQ29sb3JTcGFjZUNhY2hlOwojZW5kaWYKfTsKCiNlbmRpZgo=