LyoKICogc2xfc29ja2V0LmggLSBDQzMxeHgvQ0MzMnh4IEhvc3QgRHJpdmVyIEltcGxlbWVudGF0aW9uCiAqCiAqIENvcHlyaWdodCAoQykgMjAxNyBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8gCiAqIAogKiAKICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKICogIGFyZSBtZXQ6CiAqCiAqICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqCiAqICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAgIAogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIG5vciB0aGUgbmFtZXMgb2YKICogICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAogKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIAogKiAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgCiAqICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKICogIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIAogKiAgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAogKiAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAKICogIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAogKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIAogKiAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICoKKi8KIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8dGkvZHJpdmVycy9uZXQvd2lmaS9zaW1wbGVsaW5rLmg+CgojaWZuZGVmIF9fU0xfU09DS0VUX0hfXwojZGVmaW5lIF9fU0xfU09DS0VUX0hfXwoKCiNpZmRlZiAgICBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmCgovKiEKICAgIFxkZWZncm91cCBTb2NrZXQgCiAgICBcc2hvcnQgQ29udHJvbHMgc3RhbmRhcmQgY2xpZW50L3NlcnZlciBzb2NrZXRzIHByb2dyYW1taW5nIG9wdGlvbnMgYW5kIGNhcGFiaWxpdGllcwoKKi8KLyohCgogICAgXGFkZHRvZ3JvdXAgU29ja2V0CiAgICBAewoKKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogTWFjcm8gZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiN1bmRlZiBTTF9GRF9TRVRTSVpFCiNkZWZpbmUgU0xfRkRfU0VUU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfTUFYX1NPQ0tFVFMgICAgICAgICAvKiBOdW1iZXIgb2Ygc29ja2V0cyB0byBzZWxlY3Qgb24gLSBzYW1lIGlzIG1heCBzb2NrZXRzISAgICAgICAgICAgICAgICovCiNkZWZpbmUgU0xfQlNEX1NPQ0tFVF9JRF9NQVNLICAgICAgICAgICAgICAgICAgKDB4MUYpICAgICAgICAgICAgICAgICAvKiBJbmRleCB1c2luZyB0aGUgTEJTIDQgYml0cyBmb3Igc29ja2V0IGlkIDAtNyAqLwoKLyogRGVmaW5lIHNvbWUgQlNEIHByb3RvY29sIGNvbnN0YW50cy4gICovCiNkZWZpbmUgU0xfU09DS19TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgKDEpICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ1AgU29ja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgU0xfU09DS19ER1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpICAgICAgICAgICAgICAgICAgICAgICAvKiBVRFAgU29ja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgU0xfU09DS19SQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMpICAgICAgICAgICAgICAgICAgICAgICAvKiBSYXcgc29ja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgU0xfSVBQUk9UT19UQ1AgICAgICAgICAgICAgICAgICAgICAgICAgKDYpICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ1AgUmF3IFNvY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgU0xfSVBQUk9UT19VRFAgICAgICAgICAgICAgICAgICAgICAgICAgKDE3KSAgICAgICAgICAgICAgICAgICAgICAvKiBVRFAgUmF3IFNvY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgU0xfSVBQUk9UT19SQVcgICAgICAgICAgICAgICAgICAgICAgICAgKDI1NSkgICAgICAgICAgICAgICAgICAgICAvKiBSYXcgU29ja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgU0xfU0VDX1NPQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMCkgICAgICAgICAgICAgICAgICAgICAvKiBTZWN1cmVkIFNvY2tldCBMYXllciAoU1NMLFRMUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgovKiBBZGRyZXNzIGZhbWlsaWVzLiAgKi8KI2RlZmluZSAgICAgU0xfQUZfSU5FVCAgICAgICAgICAgICAgICAgICAgICAgICAoMikgICAgICAgICAgICAgICAgICAgICAgIC8qIElQdjQgc29ja2V0IChVRFAsIFRDUCwgZXRjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgICAgIFNMX0FGX0lORVQ2ICAgICAgICAgICAgICAgICAgICAgICAgKDMpICAgICAgICAgICAgICAgICAgICAgICAvKiBJUHY2IHNvY2tldCAoVURQLCBUQ1AsIGV0YykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lICAgICBTTF9BRl9SRiAgICAgICAgICAgICAgICAgICAgICAgICAgICg2KSAgICAgICAgICAgICAgICAgICAgICAgLyogZGF0YSBpbmNsdWRlIFJGIHBhcmFtZXRlciwgQWxsIGxheWVyIGJ5IHVzZXIgKFdpZmkgY291bGQgYmUgZGlzY29ubmVjdGVkKSAqLyAKI2RlZmluZSAgICAgU0xfQUZfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAoMTcpCi8qIFByb3RvY29sIGZhbWlsaWVzLCBzYW1lIGFzIGFkZHJlc3MgZmFtaWxpZXMuICAqLwojZGVmaW5lICAgICBTTF9QRl9JTkVUICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0lORVQKI2RlZmluZSAgICAgU0xfUEZfSU5FVDYgICAgICAgICAgICAgICAgICAgICAgICBBRl9JTkVUNgojZGVmaW5lICAgICBTTF9JTkFERFJfQU5ZICAgICAgICAgICAgICAgICAgICAgICgwKSAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpbmQgYW55IGFkZHJlc3MgICovCiNkZWZpbmUgICAgIFNMX0lONkFERFJfQU5ZICAgICAgICAgICAgICAgICAgICAgKDApCgoKLyogTWF4IHBheWxvYWQgc2l6ZSBieSBwcm90b2NvbCAqLwojZGVmaW5lIFNMX1NPQ0tFVF9QQVlMT0FEX1RZUEVfTUFTSyAgICAgICAgICAgICgweEYwKSAgLyo0IGJpdHMgdHlwZSwgNCBiaXRzIHNvY2tldHMgaWQgKi8KI2RlZmluZSBTTF9TT0NLRVRfUEFZTE9BRF9UWVBFX1JBV19UUkFOQ0VJVkVSICAoMHg4MCkgIC8qIDE1MzYgYnl0ZXMgKi8KCiAgCi8qIFNMX1NPQ0tFVF9FVkVOVF9DTEFTU19CU0QgdXNlciBldmVudHMgKi8gICAgICAgICAgICAgICAKI2RlZmluZSAgICBTTF9TT0NLRVRfVFhfRkFJTEVEX0VWRU5UICAgICAgICAgICAgICAoMSkgCiNkZWZpbmUgICAgU0xfU09DS0VUX0FTWU5DX0VWRU5UICAgICAgICAgICAgICAgICAgKDIpCgoKLyogU0xfU09DS0VUX0VWRU5UX0NMQVNTX0JTRCB1c2VyIHRyaWdnZXIgZXZlbnRzICovICAgICAgICAgICAgICAgCiNkZWZpbmUgICAgU0xfU09DS0VUX1RSSUdHRVJfRVZFTlRfU0VMRUNUICAgICAgICAgKDEpIAoKI2RlZmluZSBTTF9TT0xfU09DS0VUICAgICAgICAgICgxKSAgIC8qIERlZmluZSB0aGUgc29ja2V0IG9wdGlvbiBjYXRlZ29yeS4gKi8KI2RlZmluZSBTTF9JUFBST1RPX0lQICAgICAgICAgICgyKSAgIC8qIERlZmluZSB0aGUgSVAgb3B0aW9uIGNhdGVnb3J5LiAgICAgKi8KI2RlZmluZSBTTF9TT0xfUEhZX09QVCAgICAgICAgICgzKSAgIC8qIERlZmluZSB0aGUgUEhZIG9wdGlvbiBjYXRlZ29yeS4gICAgKi8KCiNkZWZpbmUgU0xfU09fUkNWQlVGICAgICAgICAgICAoOCkgICAvKiBTZXR0aW5nIFRDUCByZWNlaXZlIGJ1ZmZlciBzaXplICovCiNkZWZpbmUgU0xfU09fS0VFUEFMSVZFICAgICAgICAoOSkgICAvKiBDb25uZWN0aW9ucyBhcmUga2VwdCBhbGl2ZSB3aXRoIHBlcmlvZGljIG1lc3NhZ2VzICovCiNkZWZpbmUgU0xfU09fTElOR0VSICAgICAgICAgICAoMTMpICAvKiBTb2NrZXQgbGluZ2VycyBvbiBjbG9zZSBwZW5kaW5nIHJlbWFpbmluZyBzZW5kL3JlY2VpdmUgcGFja2V0cy4gKi8KI2RlZmluZSBTTF9TT19SQ1ZUSU1FTyAgICAgICAgICgyMCkgIC8qIEVuYWJsZSByZWNlaXZlIHRpbWVvdXQgKi8KI2RlZmluZSBTTF9TT19OT05CTE9DS0lORyAgICAgICgyNCkgIC8qIEVuYWJsZSAuIGRpc2FibGUgbm9uYmxvY2tpbmcgbW9kZSAgKi8KI2RlZmluZSBTTF9TT19TRUNNRVRIT0QgICAgICAgICgyNSkgIC8qIHNlY3VyaXR5IG1ldG9oZCAqLwojZGVmaW5lIFNMX1NPX1NFQ1VSRV9NQVNLICAgICAgKDI2KSAgLyogc2VjdXJpdHkgbWFzayAqLwojZGVmaW5lIFNMX1NPX1NFQ1VSRV9GSUxFUyAgICAgKDI3KSAgLyogc2VjdXJpdHkgZmlsZXMgKi8KI2RlZmluZSBTTF9TT19DSEFOR0VfQ0hBTk5FTCAgICgyOCkgIC8qIFRoaXMgb3B0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gdHJhbnNjZWl2ZXIgc3RhcnRlZCAqLwojZGVmaW5lIFNMX1NPX1NFQ1VSRV9GSUxFU19QUklWQVRFX0tFWV9GSUxFX05BTUUgKDMwKSAvKiBUaGlzIG9wdGlvbiB1c2VkIHRvIGNvbmZpZ3VlIHNlY3VyZSBmaWxlICovCiNkZWZpbmUgU0xfU09fU0VDVVJFX0ZJTEVTX0NFUlRJRklDQVRFX0ZJTEVfTkFNRSAoMzEpIC8qIFRoaXMgb3B0aW9uIHVzZWQgdG8gY29uZmlndWUgc2VjdXJlIGZpbGUgKi8KI2RlZmluZSBTTF9TT19TRUNVUkVfRklMRVNfQ0FfRklMRV9OQU1FICAgICAgICAgICgzMikgLyogVGhpcyBvcHRpb24gdXNlZCB0byBjb25maWd1ZSBzZWN1cmUgZmlsZSAqLwojZGVmaW5lIFNMX1NPX1NFQ1VSRV9GSUxFU19QRUVSX0NFUlRfT1JfREhfS0VZX0ZJTEVfTkFNRSAgICAgICgzMykgLyogVGhpcyBvcHRpb24gdXNlZCB0byBjb25maWd1ZSBzZWN1cmUgZmlsZSAtIGluIHNlcnZlciBtb2RlIERIIHBhcmFtcyBmaWxlLCBhbmQgaW4gY2xpZW50IG1vZGUgcGVlciBjZXJ0IGZvciBkb21haW4gdmVyaWZpY2F0aW9uICovCiNkZWZpbmUgU0xfU09fU1RBUlRUTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzUpICAvKiBpbml0aWF0ZSBTVEFSVFRMUyBvbiBub24gc2VjdXJlIHNvY2tldCAqLwojZGVmaW5lIFNMX1NPX1NTTF9DT05ORUNUSU9OX1BBUkFNUyAgICAgICAgICAgICAgKDM2KSAgLyogcmV0cmlldmUgYnkgZ2V0c29ja29wdCB0aGUgY29ubmVjdGlvbiBwYXJhbXMgb2YgdGhlIGN1cnJlbnQgU1NMIGNvbm5lY3Rpb24gaW4gdG8gU2xTb2NrU1NMQ29ubmVjdGlvblBhcmFtc190Ki8KI2RlZmluZSBTTF9TT19LRUVQQUxJVkVUSU1FICAgICAgICAgICAgICAgICAgICAgICgzNykgIC8qIGtlZXBhbGl2ZSB0aW1lIG91dCAgKi8KI2RlZmluZSBTTF9TT19TRUNVUkVfRElTQUJMRV9DRVJUSUZJQ0FURV9TVE9SRSAgICgzOCkgIC8qIGRpc2FibGUgY2VydGlmaWNhdGUgc3RvcmUgKi8KI2RlZmluZSBTTF9TT19SWF9OT19JUF9CT1VOREFSWSAgICAgICAgICAgICAgICAgICgzOSkgIC8qIGNvbm5lY3Rpb25sZXNzIHNvY2tldCBkaXNhYmxlIHJ4IGJvdW5kYXJ5ICovCiNkZWZpbmUgU0xfU09fU0VDVVJFX0FMUE4gICAgICAgKDQwKSAvKiBzZXQgdGhlIEFMUE4gYml0bWFwIGxpc3QgKi8KI2RlZmluZSBTTF9TT19TRUNVUkVfRVhUX0NMSUVOVF9DSExOR19SRVNQICg0MSkgLypzZXQgZXh0ZXJuYWwgY2hhbGxhbmdlIGZvciBjbGllbnQgY2VydGlmaWNhdGUgKi8KI2RlZmluZSBTTF9TT19TRUNVUkVfRE9NQUlOX05BTUVfVkVSSUZJQ0FUSU9OICg0MikgLyogc2V0IGEgZG9tYWluIG5hbWUgZm9yIHZlcmlmaWNhdGlvbiAqLwoKI2RlZmluZSBTTF9JUF9NVUxUSUNBU1RfSUYgICAgICAoNjApIC8qIFNwZWNpZnkgb3V0Z29pbmcgbXVsdGljYXN0IGludGVyZmFjZSAqLwojZGVmaW5lIFNMX0lQX01VTFRJQ0FTVF9UVEwgICAgICg2MSkgLyogU3BlY2lmeSB0aGUgVFRMIHZhbHVlIHRvIHVzZSBmb3Igb3V0Z29pbmcgbXVsdGljYXN0IHBhY2tldC4gKi8KI2RlZmluZSBTTF9JUF9BRERfTUVNQkVSU0hJUCAgICAoNjUpIC8qIEpvaW4gSVB2NCBtdWx0aWNhc3QgbWVtYmVyc2hpcCAqLwojZGVmaW5lIFNMX0lQX0RST1BfTUVNQkVSU0hJUCAgICg2NikgLyogTGVhdmUgSVB2NCBtdWx0aWNhc3QgbWVtYmVyc2hpcCAqLwojZGVmaW5lIFNMX0lQX0hEUklOQ0wgICAgICAgICAgICg2NykgLyogUmF3IHNvY2tldCBJUHY0IGhlYWRlciBpbmNsdWRlZC4gKi8KI2RlZmluZSBTTF9JUF9SQVdfUlhfTk9fSEVBREVSICAoNjgpIC8qIFByb3ByaWV0YXJ5IHNvY2tldCBvcHRpb24gdGhhdCBkb2VzIG5vdCBpbmNsdWRlSVB2NC9JUHY2IGhlYWRlciAoYW5kIGV4dGVuc2lvbiBoZWFkZXJzKSBvbiByZWNlaXZlZCByYXcgc29ja2V0cyovCiNkZWZpbmUgU0xfSVBfUkFXX0lQVjZfSERSSU5DTCAgKDY5KSAvKiBUcmFuc21pdHRlZCBidWZmZXIgb3ZlciBJUHY2IHNvY2tldCBjb250YWlucyBJUHY2IGhlYWRlci4gKi8KI2RlZmluZSBTTF9JUFY2X0FERF9NRU1CRVJTSElQICAoNzApIC8qIEpvaW4gSVB2NiBtdWx0aWNhc3QgbWVtYmVyc2hpcCAqLwojZGVmaW5lIFNMX0lQVjZfRFJPUF9NRU1CRVJTSElQICg3MSkgLyogTGVhdmUgSVB2NiBtdWx0aWNhc3QgbWVtYmVyc2hpcCAqLwojZGVmaW5lIFNMX0lQVjZfTVVMVElDQVNUX0hPUFMgICg3MikgLyogU3BlY2lmeSB0aGUgaG9wcyB2YWx1ZSB0byB1c2UgZm9yIG91dGdvaW5nIG11bHRpY2FzdCBwYWNrZXQuICovCgojZGVmaW5lIFNMX1NPX1BIWV9SQVRFICAgICAgICAgICAgICAoMTAwKSAgIC8qIFdMQU4gVHJhbnNtaXQgcmF0ZSAqLwojZGVmaW5lIFNMX1NPX1BIWV9UWF9QT1dFUiAgICAgICAgICAoMTAxKSAgIC8qIFRYIFBvd2VyIGxldmVsICovICAKI2RlZmluZSBTTF9TT19QSFlfTlVNX0ZSQU1FU19UT19UWCAgKDEwMikgICAvKiBOdW1iZXIgb2YgZnJhbWVzIHRvIHRyYW5zbWl0ICovCiNkZWZpbmUgU0xfU09fUEhZX1BSRUFNQkxFICAgICAgICAgICgxMDMpICAgLyogUHJlYW1ibGUgZm9yIHRyYW5zbWlzc2lvbiAqLwojZGVmaW5lIFNMX1NPX1BIWV9UWF9JTkhJQklUX1RIUkVTSE9MRCAoMTA0KSAgIC8qIFRYIEluaGliaXQgVGhyZXNob2xkIChDQ0EpICovCiNkZWZpbmUgU0xfU09fUEhZX1RYX1RJTUVPVVQgICAgICAgICAgICgxMDUpICAgLyogVFggdGltZW91dCBmb3IgVHJhbnNjZWl2ZXIgZnJhbWVzIChsaWZldGltZSkgaW4gbWlsaXNlY29uZHMgKG1heCB2YWx1ZSBpcyAxMDBtcykgKi8KI2RlZmluZSBTTF9TT19QSFlfQUxMT1dfQUNLUyAgICAgICAgICAgKDEwNikgICAvKiBFbmFibGUgc2VuZGluZyBBQ0tzIGluIHRyYW5zY2VpdmVyIG1vZGUgKi8KCnR5cGVkZWYgZW51bQp7CiAgU0xfVFhfSU5ISUJJVF9USFJFU0hPTERfTUlOID0gMSwKICBTTF9UWF9JTkhJQklUX1RIUkVTSE9MRF9MT1cgPSAyLAogIFNMX1RYX0lOSElCSVRfVEhSRVNIT0xEX0RFRkFVTFQgPSAzLAogIFNMX1RYX0lOSElCSVRfVEhSRVNIT0xEX01FRCA9IDQsCiAgU0xfVFhfSU5ISUJJVF9USFJFU0hPTERfSElHSCA9IDUsCiAgU0xfVFhfSU5ISUJJVF9USFJFU0hPTERfTUFYID0gNgp9IFNsVHhJbmhpYml0VGhyZXNob2xkX2U7CgojZGVmaW5lIFNMX1NPX1NFQ19NRVRIT0RfU1NMVjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKSAgLyogc2VjdXJpdHkgbWV0b2hkIFNTTCB2MyovCiNkZWZpbmUgU0xfU09fU0VDX01FVEhPRF9UTFNWMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpICAvKiBzZWN1cml0eSBtZXRvaGQgVExTIHYxKi8KI2RlZmluZSBTTF9TT19TRUNfTUVUSE9EX1RMU1YxXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAoMikgIC8qIHNlY3VyaXR5IG1ldG9oZCBUTFMgdjFfMSovCiNkZWZpbmUgU0xfU09fU0VDX01FVEhPRF9UTFNWMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMpICAvKiBzZWN1cml0eSBtZXRvaGQgVExTIHYxXzIqLwojZGVmaW5lIFNMX1NPX1NFQ19NRVRIT0RfU1NMdjNfVExTVjFfMiAgICAgICAgICAgICAgICAgICAgICg0KSAgLyogdXNlIGhpZ2hlc3QgcG9zc2libGUgdmVyc2lvbiBmcm9tIFNTTHYzIC0gVExTIDEuMiovCiNkZWZpbmUgU0xfU09fU0VDX01FVEhPRF9ETFNWMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUpICAvKiBzZWN1cml0eSBtZXRvaGQgRFRMIHYxICAqLwoKI2RlZmluZSBTTF9TRUNfTUFTS19TU0xfUlNBX1dJVEhfUkM0XzEyOF9TSEEgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKI2RlZmluZSBTTF9TRUNfTUFTS19TU0xfUlNBX1dJVEhfUkM0XzEyOF9NRDUgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgICAgICAgICAgICAgKDEgPDwgMykKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAgICAgICAgKDEgPDwgNCkKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfRUNESEVfUlNBX1dJVEhfUkM0XzEyOF9TSEEgICAgICAgICAgICAgICAgICAgKDEgPDwgNSkKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ICAgICAgICAgICAgICAgICAgKDEgPDwgNikKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2ICAgICAgICAgICAgICAgICAgKDEgPDwgNykKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ICAgICAgICAgICAgKDEgPDwgOCkKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgICAgICAgICAgKDEgPDwgOSkKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgICAgICAgKDEgPDwgMTApCiNkZWZpbmUgU0xfU0VDX01BU0tfVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAgICAgICgxIDw8IDExKQojZGVmaW5lIFNMX1NFQ19NQVNLX1RMU19SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgICAgICAgICAgICAgICAgICAoMSA8PCAxMikKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ICAgICAgICAgICAgICAgICAgKDEgPDwgMTMpCiNkZWZpbmUgU0xfU0VDX01BU0tfVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgICAgICAgICAgICAgICgxIDw8IDE0KQojZGVmaW5lIFNMX1NFQ19NQVNLX1RMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ICAgICAgICAgICAgICAoMSA8PCAxNSkKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ICAgICAgICAgICAgKDEgPDwgMTYpCiNkZWZpbmUgU0xfU0VDX01BU0tfVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCAgICAgICAgICAgICgxIDw8IDE3KQojZGVmaW5lIFNMX1NFQ19NQVNLX1RMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiAgICAgICAgICAoMSA8PCAxOCkKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgICAgICAgICAgKDEgPDwgMTkpCiNkZWZpbmUgU0xfU0VDX01BU0tfVExTX0VDREhFX0VDRFNBX1dJVEhfQ0hBQ0hBMjBfUE9MWTEzMDVfU0hBMjU2ICAgICgxIDw8IDIwKQojZGVmaW5lIFNMX1NFQ19NQVNLX1RMU19FQ0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYgICAgICAoMSA8PCAyMSkKI2RlZmluZSBTTF9TRUNfTUFTS19UTFNfREhFX1JTQV9XSVRIX0NIQUNIQTIwX1BPTFkxMzA1X1NIQTI1NiAgICAgICAgKDEgPDwgMjIpCgojZGVmaW5lIFNMX1NFQ19NQVNLX1NFQ1VSRV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICgoU0xfU0VDX01BU0tfVExTX0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYgIDw8ICAxKSAgLSAgMSkKCiNkZWZpbmUgU0xfU0VDVVJFX0FMUE5fSDEgICAgICAgICAgICAgICAoMSA8PCAwKQojZGVmaW5lIFNMX1NFQ1VSRV9BTFBOX0gyICAgICAgICAgICAgICAgKDEgPDwgMSkKI2RlZmluZSBTTF9TRUNVUkVfQUxQTl9IMkMgICAgICAgICAgICAgICgxIDw8IDIpCiNkZWZpbmUgU0xfU0VDVVJFX0FMUE5fSDJfMTQgICAgICAgICAgICAoMSA8PCAzKQojZGVmaW5lIFNMX1NFQ1VSRV9BTFBOX0gyXzE2ICAgICAgICAgICAgKDEgPDwgNCkKI2RlZmluZSBTTF9TRUNVUkVfQUxQTl9GVUxMX0xJU1QgICAgICAgICgoU0xfU0VDVVJFX0FMUE5fSDJfMTYgPDwgMSApIC0gMSkKCgojZGVmaW5lIFNMX01TR19ET05UV0FJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDgpICAvKiBOb25ibG9ja2luZyBJTyAqLwoKLyogQVAgREhDUCBTZXJ2ZXIgLSBJUCBSZWxlYXNlIHJlYXNvbiBjb2RlICovCiNkZWZpbmUgU0xfSVBfTEVBU0VfUEVFUl9SRUxFQVNFICAgICAoMCkKI2RlZmluZSBTTF9JUF9MRUFTRV9QRUVSX0RFQ0xJTkUgICAgICgxKQojZGVmaW5lIFNMX0lQX0xFQVNFX0VYUElSRUQgICAgICAgICAgKDIpCgovKiBwb3NzaWJsZSB0eXBlcyB3aGVuIHJlY2VpdmluZyBTTF9TT0NLRVRfQVNZTkNfRVZFTlQqLwojZGVmaW5lIFNMX1NTTF9BQ0NFUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApIC8qIGFjY2VwdCBmYWlsZWQgZHVlIHRvIHNzbCBpc3N1ZSAoIHRjcCBwYXNzKSAqLwojZGVmaW5lIFNMX1JYX0ZSQUdNRU5UQVRJT05fVE9PX0JJRyAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpIC8qIGNvbm5lY3Rpb24gbGVzcyBtb2RlLCByeCBwYWNrZXQgZnJhZ21lbnRhdGlvbiA+IDE2SywgcGFja2V0IGlzIGJlaW5nIHJlbGVhc2VkICovCiNkZWZpbmUgU0xfT1RIRVJfU0lERV9DTE9TRV9TU0xfREFUQV9OT1RfRU5DUllQVEVEICAgICAgICAgICAoMikgLyogcmVtb3RlIHNpZGUgZG93biBmcm9tIHNlY3VyZSB0byB1bnNlY3VyZSAqLwojZGVmaW5lIFNMX1NTTF9OT1RJRklDQVRJT05fQ09OTkVDVEVEX1NFQ1VSRUQgICAgICAgICAgICAgICAgKDMpIC8qIFNUQVJUVExTIHN1Y2Nlc3MgKi8KI2RlZmluZSBTTF9TU0xfTk9USUZJQ0FUSU9OX0hBTkRTSEFLRV9GQUlMRUQgICAgICAgICAgICAgICAgICg0KSAvKiBTVEFSVFRMUyBoYW5kc2hha2UgZmFpbGQgKi8KI2RlZmluZSBTTF9TU0xfTk9USUZJQ0FUSU9OX1dST05HX1JPT1RfQ0EgICAgICAgICAgICAgICAgICAgICg1KSAvKiBSb290IENBIGNvbmZpZ3VyZWQgaXMgd3JvbmcsIHRoZSBuYW1lIGlzIGluIFNvY2tldEFzeW5jRXZlbnQuRXZlbnREYXRhLmV4dHJhSW5mbyAqLwojZGVmaW5lIFNMX1NPQ0tFVF9BU1lOQ19FVkVOVF9TU0xfTk9USUZJQ0FUSU9OX1dST05HX1JPT1RfQ0EgKDUpCiNkZWZpbmUgU0xfTUFYX0lTU1VFUl9BTkRfU1VCSkVDVF9OQU1FX0xFTiAgICAgICAgICAgICAgICAgICAoMTYpCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0cnVjdHVyZS9FbnVtIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogSW50ZXJuZXQgYWRkcmVzcyAgICovCnR5cGVkZWYgc3RydWN0IFNsSW5BZGRyX3QKewojaWZuZGVmIHNfYWRkcgogICAgX3UzMiAgICAgICAgICAgc19hZGRyOyAgICAgICAgICAgICAvKiBJbnRlcm5ldCBhZGRyZXNzIDMyIGJpdHMgKi8KI2Vsc2UKICAgIHVuaW9uIFNfdW4gewogICAgICAgc3RydWN0IHsgX3U4IHNfYjEsc19iMixzX2IzLHNfYjQ7IH0gU191bl9iOwogICAgICAgc3RydWN0IHsgX3UxNiBzX3cxLHNfdzI7IH0gU191bl93OwogICAgICAgIF91MzIgU19hZGRyOwogICAgfSBTX3VuOwojZW5kaWYKfVNsSW5BZGRyX3Q7CgovKiBJcFY2IG9yIElwdjYgRVVJNjQgKi8KdHlwZWRlZiBzdHJ1Y3QgU2xJbjZBZGRyX3QKewogICAgdW5pb24gCiAgICB7CiAgICAgICAgX3U4ICAgX1M2X3U4WzE2XTsKICAgICAgICBfdTMyICBfUzZfdTMyWzRdOwogICAgfSBfUzZfdW47Cn1TbEluNkFkZHJfdDsKCgovKiBzb2Nrb3B0ICovCnR5cGVkZWYgc3RydWN0IAp7CiAgICBfdTMyIEtlZXBhbGl2ZUVuYWJsZWQ7IC8qIDAgPSBkaXNhYmxlZDsxID0gZW5hYmxlZDsgZGVmYXVsdCA9IDEqLwp9U2xTb2NrS2VlcGFsaXZlX3Q7Cgp0eXBlZGVmIHN0cnVjdCAKewogICAgX3UzMiBSZXVzZWFkZHJFbmFibGVkOyAvKiAwID0gZGlzYWJsZWQ7IDEgPSBlbmFibGVkOyBkZWZhdWx0ID0gMSovCn1TbFNvY2tSZXVzZWFkZHJfdDsKCnR5cGVkZWYgc3RydWN0IAp7CiAgICBfaTMyIFJ4SXBOb0JvdW5kYXJ5RW5hYmxlZDsgIC8qIDAgPSBrZWVwIElQIGJvdW5kYXJ5OyAxID0gZG9uYHQga2VlcCBpcCBib3VuZGFyeTsgZGVmYXVsdCA9IDA7ICovCn0gU2xTb2NrUnhOb0lwQm91bmRhcnlfdDsKCgp0eXBlZGVmIHN0cnVjdCAKewogICAgX3UzMiBXaW5TaXplOyAgICAgICAgICAvKiByZWNlaXZlIHdpbmRvdyBzaXplIGZvciB0Y3Agc29ja2V0cyAgKi8KfVNsU29ja1dpbnNpemVfdDsKCnR5cGVkZWYgc3RydWN0IAp7CiAgICBfdTMyIE5vbkJsb2NraW5nRW5hYmxlZDsvKiAwID0gZGlzYWJsZWQ7MSA9IGVuYWJsZWQ7ZGVmYXVsdCA9IDEqLwp9U2xTb2NrTm9uYmxvY2tpbmdfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIF91OCAgIFNkOwogICAgX3U4ICAgVHlwZTsKICAgIF9pMTYgIFZhbDsKICAgIF9pOCAgIHBFeHRyYUluZm9bMTI4XTsKfSBTbFNvY2tldEFzeW5jRXZlbnRfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgX2kxNiAgICAgICAgU3RhdHVzOwogICAgX3U4ICAgICAgICBTZDsKICAgIF91OCAgICAgICAgUGFkZGluZzsKfSBTbFNvY2tUeEZhaWxFdmVudERhdGFfdDsKCgp0eXBlZGVmIHVuaW9uCnsKICAgIFNsU29ja1R4RmFpbEV2ZW50RGF0YV90ICAgU29ja1R4RmFpbERhdGE7CiAgICBTbFNvY2tldEFzeW5jRXZlbnRfdCAgICAgIFNvY2tBc3luY0RhdGE7Cn0gU2xTb2NrRXZlbnREYXRhX3U7CgoKdHlwZWRlZiBzdHJ1Y3QKewogICBfdTMyICAgICAgICAgICAgICAgICAgICBFdmVudDsKICAgIFNsU29ja0V2ZW50RGF0YV91ICAgICAgU29ja2V0QXN5bmNFdmVudDsKfSBTbFNvY2tFdmVudF90OwoKdHlwZWRlZiBzdHJ1Y3QKewogICBfdTMyICAgICAgICAgRXZlbnQ7CiAgIF91MzIgICAgICAgICBFdmVudERhdGE7Cn0gU2xTb2NrVHJpZ2dlckV2ZW50X3Q7CgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgX3UzMiAgICBTZWN1cmVBTFBOOwp9IFNsU29ja1NlY3VyZUFMUE5fdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIF91MzIgICAgU2VjdXJlTWFzazsKfSBTbFNvY2tTZWN1cmVNYXNrX3Q7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTggICAgIFNlY3VyZU1ldGhvZDsKfSBTbFNvY2tTZWN1cmVNZXRob2RfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIF91MTYgU3ViamVjdE5hbWVYb3JlZFNoYTE7CiAgICBfdTE2IElzc3Vlck5hbWVYb3JlZFNoYTE7CiAgICBfaTggIEZyb21EYXRlWzhdOwogICAgX2k4ICBUb0RhdGVbOF07CiAgICBfaTggIFN1YmplY3ROYW1lW1NMX01BWF9JU1NVRVJfQU5EX1NVQkpFQ1RfTkFNRV9MRU5dOwogICAgX2k4ICBJc3N1ZXJOYW1lW1NMX01BWF9JU1NVRVJfQU5EX1NVQkpFQ1RfTkFNRV9MRU5dOwogICAgX2k4ICBTdWJqZWN0TmFtZUxlbjsKICAgIF9pOCAgSXNzdWVyTmFtZUxlbjsgCiAgICBfaTggIFBhZGRpbmdbMl07Cn0gU2xTb2NrU1NMQ2VydEluZm9fdDsKCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBfdTMyICAgICBTZWN1cmVWZXJzaW9uOyAgICAgICAgICAgICAgLyogd2hhdCB2ZXJzaW9uIG9mIFNTTCBkZWNpZGVkIGluIHRoZSBoYW5kc2hha2UgICAgKi8KICAgIF91MzIgICAgIFNlY3VyZUNpcGhlclN1aXQ7ICAgICAgICAgICAvKiB3aGF0IENpcGhlciBJbmRleCB3YXMgZGVjaWRlZCBpbiB0aGUgaGFuZHNoYWtlICAqLwogICAgX3UzMiAgICAgU2VjdXJlSXNQZWVyVmFsaWRhdGVkOyAgICAgIC8qIHdhcyB0aGUgb3RoZXIgcGVlciB2ZXJpZmllZCAgICAgICAgICovCiAgICBfdTMyICAgICBTZWN1cmVBTFBOQ2hvc2VuUHJvdG9jb2w7ICAgIC8qIGJpdCBpbmRpY2F0ZSBvbmUgb2YgdGhlIHByb3RvY29sIGRlZmluZWQgYWJvdmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9TRUNVUkVfQUxQTl9IMSAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1NFQ1VSRV9BTFBOX0gyICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfU0VDVVJFX0FMUE5fSDJDICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9TRUNVUkVfQUxQTl9IMl8xNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1NFQ1VSRV9BTFBOX0gyXzE2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIFNsU29ja1NTTENlcnRJbmZvX3QgU2VjdXJlUGVlckNlcnRpbmZvOwp9IFNsU29ja1NTTENvbm5lY3Rpb25QYXJhbXNfdDsKCnR5cGVkZWYgZW51bQp7CiAgU0xfQlNEX1NFQ1VSRURfUFJJVkFURV9LRVlfSURYID0gMCwKICBTTF9CU0RfU0VDVVJFRF9DRVJUSUZJQ0FURV9JRFgsCiAgU0xfQlNEX1NFQ1VSRURfQ0FfSURYLAogIFNMX0JTRF9TRUNVUkVEX0RIX0lEWAp9U2xTb2NrU2VjdXJlU29ja2V0RmlsZXNJbmRleF9lOwoKdHlwZWRlZiBzdHJ1Y3QgCnsKICAgIFNsSW5BZGRyX3QgICBpbXJfbXVsdGlhZGRyOyAgICAgLyogVGhlIElQdjQgbXVsdGljYXN0IGFkZHJlc3MgdG8gam9pbiAqLwogICAgU2xJbkFkZHJfdCAgIGltcl9pbnRlcmZhY2U7ICAgICAvKiBUaGUgaW50ZXJmYWNlIHRvIHVzZSBmb3IgdGhpcyBncm91cCAqLwp9U2xTb2NrSXBNcmVxX3Q7Cgp0eXBlZGVmIHN0cnVjdHsKICAgIFNsSW42QWRkcl90IGlwdjZtcl9tdWx0aWFkZHI7IC8qIElQdjYgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAgKi8KICAgIF91MzIgICAgICAgIGlwdjZtcl9pbnRlcmZhY2U7IC8qc2hvdWxkIGJlIDAgdG8gY2hvb3NlIHRoZSBkZWZhdWx0IG11bHRpY2FzdCBpbnRlcmZhY2UqLwp9U2xTb2NrSXBWNk1yZXFfdDsKCnR5cGVkZWYgc3RydWN0IAp7CiAgICBfdTMyIGxfb25vZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgPSBkaXNhYmxlZDsgMSA9IGVuYWJsZWQ7IGRlZmF1bHQgPSAwOyovCiAgICBfdTMyIGxfbGluZ2VyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbmdlciB0aW1lIGluIHNlY29uZHM7IGRlZmF1bHQgPSAwOyovCn1TbFNvY2tsaW5nZXJfdDsKCi8qIHNvY2tvcHQgKi8KdHlwZWRlZiBfaTMyICAgU2xUaW1lX3Q7CnR5cGVkZWYgX2kzMiAgIFNsU3VzZWNvbmRzX3Q7Cgp0eXBlZGVmIHN0cnVjdCBTbFRpbWV2YWxfdAp7CiAgICBTbFRpbWVfdCAgICAgICAgICB0dl9zZWM7ICAgICAgICAgICAgIC8qIFNlY29uZHMgICAgICAqLwogICAgU2xTdXNlY29uZHNfdCAgICAgdHZfdXNlYzsgICAgICAgICAgICAvKiBNaWNyb3NlY29uZHMgKi8KfVNsVGltZXZhbF90OwoKdHlwZWRlZiBfdTE2IFNsU29ja2xlbl90OwoKLyogSXBWNCBzb2NrZXQgYWRkcmVzcyAqLwp0eXBlZGVmIHN0cnVjdCBTbFNvY2tBZGRyX3QKewogICAgX3UxNiAgICAgICAgICBzYV9mYW1pbHk7ICAgICAvKiBBZGRyZXNzIGZhbWlseSAoZS5nLiAsIEFGX0lORVQpICAgICAqLwogICAgX3U4ICAgICAgICAgICBzYV9kYXRhWzE0XTsgIC8qIFByb3RvY29sLSBzcGVjaWZpYyBhZGRyZXNzIGluZm9ybWF0aW9uKi8KfVNsU29ja0FkZHJfdDsKCgp0eXBlZGVmIHN0cnVjdCBTbFNvY2tBZGRySW42X3QKewogICAgX3UxNiAgICAgICAgICAgc2luNl9mYW1pbHk7ICAgICAgICAgICAgICAgICAvKiBBRl9JTkVUNiB8fCBBRl9JTkVUNl9FVUlfNDgqLwogICAgX3UxNiAgICAgICAgICAgc2luNl9wb3J0OyAgICAgICAgICAgICAgICAgICAvKiBUcmFuc3BvcnQgbGF5ZXIgcG9ydC4gICovCiAgICBfdTMyICAgICAgICAgICBzaW42X2Zsb3dpbmZvOyAgICAgICAgICAgICAgIC8qIElQdjYgZmxvdyBpbmZvcm1hdGlvbi4gKi8KICAgIFNsSW42QWRkcl90ICAgIHNpbjZfYWRkcjsgICAgICAgICAgICAgICAgICAgLyogSVB2NiBhZGRyZXNzLiAqLwogICAgX3UzMiAgICAgICAgICAgc2luNl9zY29wZV9pZDsgICAgICAgICAgICAgICAvKiBzZXQgb2YgaW50ZXJmYWNlcyBmb3IgYSBzY29wZS4gKi8KfVNsU29ja0FkZHJJbjZfdDsKCi8qIFNvY2tldCBhZGRyZXNzLCBJbnRlcm5ldCBzdHlsZS4gKi8KCnR5cGVkZWYgc3RydWN0IFNsU29ja0FkZHJJbl90CnsKICAgIF91MTYgICAgICAgICAgICAgIHNpbl9mYW1pbHk7ICAgICAgICAgLyogSW50ZXJuZXQgUHJvdG9jb2wgKEFGX0lORVQpLiAgICAgICAgICAgICAgICAgICAgKi8KICAgIF91MTYgICAgICAgICAgICAgIHNpbl9wb3J0OyAgICAgICAgICAgLyogQWRkcmVzcyBwb3J0ICgxNiBiaXRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIFNsSW5BZGRyX3QgICAgICAgIHNpbl9hZGRyOyAgICAgICAgICAgLyogSW50ZXJuZXQgYWRkcmVzcyAoMzIgYml0cykuICAgICAgICAgICAgICAgICAgICAgKi8KICAgIF9pOCAgICAgICAgICAgICAgIHNpbl96ZXJvWzhdOyAgICAgICAgLyogTm90IHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KfVNsU29ja0FkZHJJbl90OwoKCnR5cGVkZWYgc3RydWN0CnsKICAgIF91OCAgU2VjdXJlRmlsZXNbNF07Cn1TbFNvY2tTZWN1cmVGaWxlc190OwoKCnR5cGVkZWYgc3RydWN0IFNsRmRTZXRfdCAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlbGVjdCBzb2NrZXQgYXJyYXkgbWFuYWdlciAqLwp7IAogICBfdTMyICAgICAgICBmZF9hcnJheVsoU0xfRkRfU0VUU0laRSArIChfdTgpMzEpLyhfdTgpMzJdOyAvKiBCaXQgbWFwIG9mIFNPQ0tFVCBEZXNjcmlwdG9ycyAqLwp9IFNsRmRTZXRfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIF91OCAgIFJhdGU7ICAgICAgICAgICAgICAgLyogUmVjZXZpZWQgUmF0ZSAgKi8KICAgIF91OCAgIENoYW5uZWw7ICAgICAgICAgICAgLyogVGhlIHJlY2VpdmVkIGNoYW5uZWwqLwogICAgX2k4ICAgUnNzaTsgICAgICAgICAgICAgICAvKiBUaGUgY29tcHV0ZWQgUlNTSSB2YWx1ZSBpbiBkYiBvZiBjdXJyZW50IGZyYW1lICovCiAgICBfdTggICBQYWRkaW5nOyAgICAgICAgICAgIC8qIHBhZCB0byBhbGlnbiB0byAzMiBiaXRzICovCiAgICBfdTMyICBUaW1lc3RhbXA7ICAgICAgICAgIC8qIFRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMsICAgICAqLwp9U2xUcmFuc2NlaXZlclJ4T3ZlckhlYWRfdDsKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIQoKICAgIFxicmllZiBDcmVhdGUgYW4gZW5kcG9pbnQgZm9yIGNvbW11bmljYXRpb24KIAogICAgVGhlIHNvY2tldCBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHNvY2tldCBvZiBhIGNlcnRhaW4gc29ja2V0IHR5cGUsIGlkZW50aWZpZWQgCiAgICBieSBhbiBpbnRlZ2VyIG51bWJlciwgYW5kIGFsbG9jYXRlcyBzeXN0ZW0gcmVzb3VyY2VzIHRvIGl0LlxuCiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYXBwbGljYXRpb24gbGF5ZXIgdG8gb2J0YWluIGEgc29ja2V0IGhhbmRsZS4KIAogICAgXHBhcmFtW2luXSBEb21haW4gICAgICAgICAgIFNwZWNpZmllcyB0aGUgcHJvdG9jb2wgZmFtaWx5IG9mIHRoZSBjcmVhdGVkIHNvY2tldC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNMX0FGX0lORVQgZm9yIG5ldHdvcmsgcHJvdG9jb2wgSVB2NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfQUZfSU5FVDYgZm9yIG5ldHdvcmsgcHJvdG9jb2wgSVB2NgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfQUZfUkYgZm9yIHN0YXJ0aW5nIHRyYW5zY2VpdmVyIG1vZGUuIE5vdGVzOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2VuZGluZyBhbmQgcmVjZWl2aW5nIGFueSBwYWNrZXQgb3ZlcnJpZGluZyA4MDIuMTEgaGVhZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGZvciBvcHRpbWl6ZWQgcG93ZXIgY29uc3VtcHRpb24gdGhlIHNvY2tldCB3aWxsIGJlIHN0YXJ0ZWQgaW4gVFggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBtb2RlIHVudGlsIHJlY2VpdmUgY29tbWFuZCBpcyBhY3RpdmF0ZWQKCiAgICBccGFyYW1baW5dIFR5cGUgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgY29tbXVuaWNhdGlvbiBzZW1hbnRpYywgb25lIG9mOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfU09DS19TVFJFQU0gKHJlbGlhYmxlIHN0cmVhbS1vcmllbnRlZCBzZXJ2aWNlIG9yIFN0cmVhbSBTb2NrZXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfU09DS19ER1JBTSAoZGF0YWdyYW0gc2VydmljZSBvciBEYXRhZ3JhbSBTb2NrZXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfU09DS19SQVcgKHJhdyBwcm90b2NvbHMgYXRvcCB0aGUgbmV0d29yayBsYXllcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHdoZW4gdXNlZCB3aXRoIEFGX1JGOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfU09DS19ER1JBTSAtIEwyIHNvY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfU09DS19SQVcgLSBMMSBzb2NrZXQgLSBieXBhc3MgV0xBTiBDQ0EgKENsZWFyIENoYW5uZWwgQXNzZXNzbWVudCkKCiAgICBccGFyYW1baW5dIFByb3RvY29sICAgICAgICAgc3BlY2lmaWVzIGEgcGFydGljdWxhciB0cmFuc3BvcnQgdG8gYmUgdXNlZCB3aXRoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb2NrZXQuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1vc3QgY29tbW9uIGFyZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9JUFBST1RPX1RDUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNMX0lQUFJPVE9fVURQIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSAwIG1heSBiZSB1c2VkIHRvIHNlbGVjdCBhIGRlZmF1bHQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgZnJvbSB0aGUgc2VsZWN0ZWQgZG9tYWluIGFuZCB0eXBlCiAKICAgIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICBPbiBzdWNjZXNzLCBzb2NrZXQgaGFuZGxlIHRoYXQgaXMgdXNlZCBmb3IgY29uc2VxdWVudCBzb2NrZXQgb3BlcmF0aW9ucy4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHN1Y2Nlc3NmdWwgcmV0dXJuIGNvZGUgc2hvdWxkIGJlIGEgcG9zaXRpdmUgbnVtYmVyIChpbnQxNilcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIGVycm9yLCBhIG5lZ2F0aXZlIChpbnQxNikgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBzcGVjaWZ5aW5nIHRoZSBlcnJvciBjb2RlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfRUFGTk9TVVBQT1JUICAtIGlsbGVnYWwgZG9tYWluIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfRVBST1RPVFlQRSAgLSBpbGxlZ2FsIHR5cGUgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9FQUNDRVMgICAtIHBlcm1pc3Npb24gZGVuaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9FTlNPQ0sgIC0gZXhjZWVkZWQgbWF4aW1hbCBudW1iZXIgb2Ygc29ja2V0IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfRU5PTUVNICAtIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTF9FSU5WQUwgIC0gZXJyb3IgaW4gc29ja2V0IGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNMX0VQUk9UT05PU1VQUE9SVCAgLSBpbGxlZ2FsIHByb3RvY29sIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU0xfRU9QTk9UU1VQUCAgLSBpbGxlZ2FsIGNvbWJpbmF0aW9uIG9mIHByb3RvY29sIGFuZCB0eXBlIHBhcmFtZXRlcnMKIAogICAgXHNhICAgICAgICAgICAgICAgICAgICAgICAgIHNsX0Nsb3NlCiAgICBcbm90ZSAgICAgICAgICAgICAgICAgICAgICAgYmVsb25ncyB0byBccmVmIGJhc2ljX2FwaQogICAgXHdhcm5pbmcKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfU29ja2V0KQpfaTE2IHNsX1NvY2tldChfaTE2IERvbWFpbiwgX2kxNiBUeXBlLCBfaTE2IFByb3RvY29sKTsKI2VuZGlmCgovKiEKICAgIFxicmllZiBHcmFjZWZ1bGx5IGNsb3NlIHNvY2tldAoKICAgIFRoaXMgZnVuY3Rpb24gY2F1c2VzIHRoZSBzeXN0ZW0gdG8gcmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGEgc29ja2V0LiAgXG4KICAgIEluIGNhc2Ugb2YgVENQLCB0aGUgY29ubmVjdGlvbiBpcyB0ZXJtaW5hdGVkLgoKICAgIFxwYXJhbVtpbl0gc2QgICAgICAgICAgICAgICBTb2NrZXQgaGFuZGxlIChyZWNlaXZlZCBpbiBzbF9Tb2NrZXQpCgogICAgXHJldHVybiAgICAgICAgICAgICAgICAgICAgIFplcm8gb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgIFxzYSAgICAgICAgICAgICAgICAgICAgICAgICBzbF9Tb2NrZXQKICAgIFxub3RlICAgICAgICAgICAgICAgICAgICAgICBiZWxvbmdzIHRvIFxyZWYgZXh0X2FwaQogICAgXHdhcm5pbmcKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfQ2xvc2UpCl9pMTYgc2xfQ2xvc2UoX2kxNiBzZCk7CiNlbmRpZgoKLyohCiAgICBcYnJpZWYgQWNjZXB0IGEgY29ubmVjdGlvbiBvbiBhIHNvY2tldAogICAgCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCBjb25uZWN0aW9uLWJhc2VkIHNvY2tldCB0eXBlcyAoU09DS19TVFJFQU0pLlxuCiAgICBJdCBleHRyYWN0cyB0aGUgZmlyc3QgY29ubmVjdGlvbiByZXF1ZXN0IG9uIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIAogICAgY29ubmVjdGlvbnMsIGNyZWF0ZXMgYSBuZXcgY29ubmVjdGVkIHNvY2tldCwgYW5kIHJldHVybnMgYSBuZXcgZmlsZSAKICAgIGRlc2NyaXB0b3IgcmVmZXJyaW5nIHRvIHRoYXQgc29ja2V0LlxuCiAgICBUaGUgbmV3bHkgY3JlYXRlZCBzb2NrZXQgaXMgbm90IGluIHRoZSBsaXN0ZW5pbmcgc3RhdGUuIFRoZSAKICAgIG9yaWdpbmFsIHNvY2tldCBzZCBpcyB1bmFmZmVjdGVkIGJ5IHRoaXMgY2FsbC4gXG4KICAgIFRoZSBhcmd1bWVudCBzZCBpcyBhIHNvY2tldCB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCAKICAgIHNsX1NvY2tldCgpLCBib3VuZCB0byBhIGxvY2FsIGFkZHJlc3Mgd2l0aCBzbF9CaW5kKCksIGFuZCBpcyAKICAgIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgYWZ0ZXIgYSBzbF9MaXN0ZW4oKS4gVGhlIGFyZ3VtZW50IFxiIAogICAgXGUgYWRkciBpcyBhIHBvaW50ZXIgdG8gYSBzb2NrYWRkciBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIAogICAgaXMgZmlsbGVkIGluIHdpdGggdGhlIGFkZHJlc3Mgb2YgdGhlIHBlZXIgc29ja2V0LCBhcyBrbm93biB0byAKICAgIHRoZSBjb21tdW5pY2F0aW9ucyBsYXllci4gVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgYWRkcmVzcyAKICAgIHJldHVybmVkIGFkZHIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc29ja2V0J3MgYWRkcmVzcyBmYW1pbHkuIFxuCiAgICBUaGUgXGIgXGUgYWRkcmxlbiBhcmd1bWVudCBpcyBhIHZhbHVlLXJlc3VsdCBhcmd1bWVudDogaXQgCiAgICBzaG91bGQgaW5pdGlhbGx5IGNvbnRhaW4gdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZSBwb2ludGVkIHRvIAogICAgYnkgYWRkciwgb24gcmV0dXJuIGl0IHdpbGwgY29udGFpbiB0aGUgYWN0dWFsIGxlbmd0aCAoaW4gCiAgICBieXRlcykgb2YgdGhlIGFkZHJlc3MgcmV0dXJuZWQuCiAgICAKICAgIFxwYXJhbVtpbl0gc2QgICAgICAgICAgICAgICBTb2NrZXQgZGVzY3JpcHRvciAoaGFuZGxlKQogICAgXHBhcmFtW291dF0gYWRkciAgICAgICAgICAgIFRoZSBhcmd1bWVudCBhZGRyIGlzIGEgcG9pbnRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIHNvY2thZGRyIHN0cnVjdHVyZS4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBpcyBmaWxsZWQgaW4gd2l0aCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG9mIHRoZSBwZWVyIHNvY2tldCwgYXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93biB0byB0aGUgY29tbXVuaWNhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci4gVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHJldHVybmVkIGFkZHIgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSBzb2NrZXQncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2thZGRyOlxuIC0gY29kZSBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBmb3JtYXQuIE9uIHRoaXMgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgQUZfSU5FVCBpcyBzdXBwb3J0ZWQuXG4gLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldCBhZGRyZXNzLCB0aGUgbGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcyBvbiB0aGUgY29kZSBmb3JtYXQKICAgIFxwYXJhbVtvdXRdIGFkZHJsZW4gICAgICAgICBUaGUgYWRkcmxlbiBhcmd1bWVudCBpcyBhIHZhbHVlLXJlc3VsdCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudDogaXQgc2hvdWxkIGluaXRpYWxseSBjb250YWluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgb2YgdGhlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IGFkZHIKICAgIAogICAgXHJldHVybiAgICAgICAgICAgICAgICAgICAgIE9uIHN1Y2Nlc3MsIGEgc29ja2V0IGhhbmRsZS5cbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIGEgbm9uLWJsb2NraW5nIGFjY2VwdCBhIHBvc3NpYmxlIG5lZ2F0aXZlIHZhbHVlIGlzIFNMX0VBR0FJTi5cbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIGZhaWx1cmUsIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9QT09MX0lTX0VNUFRZIG1heSBiZSByZXR1cm4gaW4gY2FzZSB0aGVyZSBhcmUgbm8gcmVzb3VyY2VzIGluIHRoZSBzeXN0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRyeSBhZ2FpbiBsYXRlciBvciBpbmNyZWFzZSBNQVhfQ09OQ1VSUkVOVF9BQ1RJT05TCiAgICAKICAgIFxzYSAgICAgICAgICAgICAgICAgICAgICAgICBzbF9Tb2NrZXQgIHNsX0JpbmQgIHNsX0xpc3RlbgogICAgXG5vdGUgICAgICAgICAgICAgICAgICAgICAgIEJlbG9uZ3MgdG8gXHJlZiBzZXJ2ZXJfc2lkZQogICAgXHdhcm5pbmcKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfQWNjZXB0KQpfaTE2IHNsX0FjY2VwdChfaTE2IHNkLCBTbFNvY2tBZGRyX3QgKmFkZHIsIFNsU29ja2xlbl90ICphZGRybGVuKTsKI2VuZGlmCgovKiEKICAgIFxicmllZiBBc3NpZ24gYSBuYW1lIHRvIGEgc29ja2V0CiAKICAgIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgdGhlIHNvY2tldCB0aGUgbG9jYWwgYWRkcmVzcyBhZGRyLgogICAgYWRkciBpcyBhZGRybGVuIGJ5dGVzIGxvbmcuIFRyYWRpdGlvbmFsbHksIHRoaXMgaXMgY2FsbGVkCiAgICBXaGVuIGEgc29ja2V0IGlzIGNyZWF0ZWQgd2l0aCBzb2NrZXQsIGl0IGV4aXN0cyBpbiBhIG5hbWUKICAgIHNwYWNlIChhZGRyZXNzIGZhbWlseSkgYnV0IGhhcyBubyBuYW1lIGFzc2lnbmVkLgogICAgSXQgaXMgbmVjZXNzYXJ5IHRvIGFzc2lnbiBhIGxvY2FsIGFkZHJlc3MgYmVmb3JlIGEgU09DS19TVFJFQU0KICAgIHNvY2tldCBtYXkgcmVjZWl2ZSBjb25uZWN0aW9ucy4KIAogICAgXHBhcmFtW2luXSBzZCAgICAgICAgICAgICAgICBTb2NrZXQgZGVzY3JpcHRvciAoaGFuZGxlKQogICAgXHBhcmFtW2luXSBhZGRyICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9uIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJzXG4gc29ja2FkZHI6XG4gLSBjb2RlIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhZGRyZXNzIGZvcm1hdC4gT24gdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gb25seSBTTF9BRl9JTkVUIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLlxuIC0gc29ja2V0IGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxlbmd0aCBkZXBlbmRzIG9uIHRoZSBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0CiAgICBccGFyYW1baW5dIGFkZHJsZW4gICAgICAgICAgQ29udGFpbnMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IGFkZHIKIAogICAgXHJldHVybiAgICAgICAgICAgICAgICAgICAgIFplcm8gb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlICAgIAogCiAgICBcc2EgICAgICAgICAgICAgICAgICAgICAgICAgc2xfU29ja2V0ICBzbF9BY2NlcHQgc2xfTGlzdGVuCiAgICBcbm90ZSAgICAgICAgICAgICAgICAgICAgICAgYmVsb25ncyB0byBccmVmIGJhc2ljX2FwaQogICAgXHdhcm5pbmcKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfQmluZCkKX2kxNiBzbF9CaW5kKF9pMTYgc2QsIGNvbnN0IFNsU29ja0FkZHJfdCAqYWRkciwgX2kxNiBhZGRybGVuKTsKI2VuZGlmCgovKiEKICAgIFxicmllZiBMaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIG9uIGEgc29ja2V0CiAKICAgIFRoZSB3aWxsaW5nbmVzcyB0byBhY2NlcHQgaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIGEgcXVldWUKICAgIGxpbWl0IGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyBhcmUgc3BlY2lmaWVkIHdpdGggbGlzdGVuKCksCiAgICBhbmQgdGhlbiB0aGUgY29ubmVjdGlvbnMgYXJlIGFjY2VwdGVkIHdpdGggYWNjZXB0LgogICAgVGhlIGxpc3RlbigpIGNhbGwgYXBwbGllcyBvbmx5IHRvIHNvY2tldHMgb2YgdHlwZSBTT0NLX1NUUkVBTQogICAgVGhlIGJhY2tsb2cgcGFyYW1ldGVyIGRlZmluZXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoZSBxdWV1ZSBvZgogICAgcGVuZGluZyBjb25uZWN0aW9ucyBtYXkgZ3JvdyB0by4gCiAKICAgIFxwYXJhbVtpbl0gc2QgICAgICAgICAgICAgICBTb2NrZXQgZGVzY3JpcHRvciAoaGFuZGxlKQogICAgXHBhcmFtW2luXSBiYWNrbG9nICAgICAgICAgIFNwZWNpZmllcyB0aGUgbGlzdGVuIHF1ZXVlIGRlcHRoLiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAgXHJldHVybiAgICAgICAgICAgICAgICAgICAgIFplcm8gb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlIAogCiAgICBcc2EgICAgICAgICAgICAgICAgICAgICAgICAgc2xfU29ja2V0ICBzbF9BY2NlcHQgIHNsX0JpbmQKICAgIFxub3RlICAgICAgICAgICAgICAgICAgICAgICBCZWxvbmdzIHRvIFxyZWYgc2VydmVyX3NpZGUKICAgIFx3YXJuaW5nCiovCiNpZiBfU0xfSU5DTFVERV9GVU5DKHNsX0xpc3RlbikKX2kxNiBzbF9MaXN0ZW4oX2kxNiBzZCwgX2kxNiBiYWNrbG9nKTsKI2VuZGlmCgovKiEKICAgIFxicmllZiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gb24gYSBzb2NrZXQgCiAgIAogICAgRnVuY3Rpb24gY29ubmVjdHMgdGhlIHNvY2tldCByZWZlcnJlZCB0byBieSB0aGUgc29ja2V0IAogICAgZGVzY3JpcHRvciBzZCwgdG8gdGhlIGFkZHJlc3Mgc3BlY2lmaWVkIGJ5IGFkZHIuIFRoZSBhZGRybGVuIAogICAgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIGFkZHIuIFRoZSBmb3JtYXQgb2YgdGhlIAogICAgYWRkcmVzcyBpbiBhZGRyIGlzIGRldGVybWluZWQgYnkgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIAogICAgc29ja2V0LiBJZiBpdCBpcyBvZiB0eXBlIFNPQ0tfREdSQU0sIHRoaXMgY2FsbCBzcGVjaWZpZXMgdGhlIAogICAgcGVlciB3aXRoIHdoaWNoIHRoZSBzb2NrZXQgaXMgdG8gYmUgYXNzb2NpYXRlZDsgdGhpcyBhZGRyZXNzIAogICAgaXMgdGhhdCB0byB3aGljaCBkYXRhZ3JhbXMgYXJlIHRvIGJlIHNlbnQsIGFuZCB0aGUgb25seSAKICAgIGFkZHJlc3MgZnJvbSB3aGljaCBkYXRhZ3JhbXMgYXJlIHRvIGJlIHJlY2VpdmVkLiAgSWYgdGhlIAogICAgc29ja2V0IGlzIG9mIHR5cGUgU09DS19TVFJFQU0sIHRoaXMgY2FsbCBhdHRlbXB0cyB0byBtYWtlIGEgCiAgICBjb25uZWN0aW9uIHRvIGFub3RoZXIgc29ja2V0LiBUaGUgb3RoZXIgc29ja2V0IGlzIHNwZWNpZmllZCAKICAgIGJ5IGFkZHJlc3MsIHdoaWNoIGlzIGFuIGFkZHJlc3MgaW4gdGhlIGNvbW11bmljYXRpb25zIHNwYWNlIAogICAgb2YgdGhlIHNvY2tldC4gCiAgIAogICAKICAgIFxwYXJhbVtpbl0gc2QgICAgICAgICAgICAgICBTb2NrZXQgZGVzY3JpcHRvciAoaGFuZGxlKQogICAgXHBhcmFtW2luXSBhZGRyICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gYWRkclxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2FkZHI6XG4gLSBjb2RlIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvcm1hdC4gT24gdGhpcyB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBBRl9JTkVUIGlzIHN1cHBvcnRlZC5cbiAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0IGFkZHJlc3MsIHRoZSBsZW5ndGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzIG9uIHRoZSBjb2RlIGZvcm1hdAogICAKICAgIFxwYXJhbVtpbl0gYWRkcmxlbiAgICAgICAgICBDb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIHBvaW50ZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgYWRkcgogCiAgICBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgT24gc3VjY2VzcywgYSBzb2NrZXQgaGFuZGxlLlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gYSBub24tYmxvY2tpbmcgY29ubmVjdCBhIHBvc3NpYmxlIG5lZ2F0aXZlIHZhbHVlIGlzIFNMX0VBTFJFQURZLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIGZhaWx1cmUsIG5lZ2F0aXZlIHZhbHVlLlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfUE9PTF9JU19FTVBUWSBtYXkgYmUgcmV0dXJuIGluIGNhc2UgdGhlcmUgYXJlIG5vIHJlc291cmNlcyBpbiB0aGUgc3lzdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdHJ5IGFnYWluIGxhdGVyIG9yIGluY3JlYXNlIE1BWF9DT05DVVJSRU5UX0FDVElPTlMKIAogICAgXHNhICAgICAgICAgICAgICAgICAgICAgICAgIHNsX1NvY2tldAogICAgXG5vdGUgICAgICAgICAgICAgICAgICAgICAgIGJlbG9uZ3MgdG8gXHJlZiBjbGllbnRfc2lkZQogICAgXHdhcm5pbmcKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfQ29ubmVjdCkKX2kxNiBzbF9Db25uZWN0KF9pMTYgc2QsIGNvbnN0IFNsU29ja0FkZHJfdCAqYWRkciwgX2kxNiBhZGRybGVuKTsKI2VuZGlmCgovKiEKICAgIFxicmllZiBNb25pdG9yIHNvY2tldCBhY3Rpdml0eQogICAKICAgIFNlbGVjdCBhbGxvdyBhIHByb2dyYW0gdG8gbW9uaXRvciBtdWx0aXBsZSBmaWxlIGRlc2NyaXB0b3JzLAogICAgd2FpdGluZyB1bnRpbCBvbmUgb3IgbW9yZSBvZiB0aGUgZmlsZSBkZXNjcmlwdG9ycyBiZWNvbWUgCiAgICAicmVhZHkiIGZvciBzb21lIGNsYXNzIG9mIEkvTyBvcGVyYXRpb24uCiAgICBJZiB0cmlnZ2VyIG1vZGUgaXMgZW5hYmxlZCB0aGUgYWN0aXZlIGZkc2V0IGlzIHRoZSBvbmUgdGhhdCB3YXMgcmV0cmlldmVkIGluIHRoZSBmaXJzdCB0cmlnZ2VyZWQgY2FsbC4KICAgIFRvIGVuYWJsZSB0aGUgdHJpZ2dlciBtb2RlLCBhbiBoYW5kbGVyIG11c3QgYmUgc3RhdGljYWxseSByZWdpc3RlcmVkIGFzIHNsY2JfU29ja2V0VHJpZ2dlckV2ZW50SGFuZGxlciBpbiB1c2VyLmgKICAgCiAgIAogICAgXHBhcmFtW2luXSAgbmZkcyAgICAgICAgVGhlIGhpZ2hlc3QtbnVtYmVyZWQgZmlsZSBkZXNjcmlwdG9yIGluIGFueSBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlIHNldHMsIHBsdXMgMS4KICAgIFxwYXJhbVtvdXRdIHJlYWRzZHMgICAgIFNvY2tldCBkZXNjcmlwdG9ycyBsaXN0IGZvciByZWFkIG1vbml0b3JpbmcgYW5kIGFjY2VwdCBtb25pdG9yaW5nCiAgICBccGFyYW1bb3V0XSB3cml0ZXNkcyAgICBTb2NrZXQgZGVzY3JpcHRvcnMgbGlzdCBmb3IgY29ubmVjdCBtb25pdG9yaW5nIG9ubHksIHdyaXRlIG1vbml0b3JpbmcgaXMgbm90IHN1cHBvcnRlZAogICAgXHBhcmFtW291dF0gZXhjZXB0c2RzICAgU29ja2V0IGRlc2NyaXB0b3JzIGxpc3QgZm9yIGV4Y2VwdGlvbiBtb25pdG9yaW5nLCBub3Qgc3VwcG9ydGVkLgogICAgXHBhcmFtW2luXSAgdGltZW91dCAgICAgSXMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiB0aW1lIGVsYXBzZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBzZWxlY3QoKSByZXR1cm5zLiBOdWxsIG9yIGFib3ZlIDB4ZmZmZiBzZWNvbmRzIG1lYW5zIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5maW5pdHkgdGltZW91dC4gVGhlIG1pbmltdW0gdGltZW91dCBpcyAxMCBtaWxsaXNlY29uZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gMTAgbWlsbGlzZWNvbmRzIHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgdG8gMTAgbWlsbGlzZWNvbmRzLiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heCBtaWNyb3NlY29uZHMgc3VwcG9ydGVkIGlzIDB4ZmZmYzAwLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gdHJpZ2dlciBtb2RlIHRoZSB0aW1vdXQgZmllbGRzIG11c3QgYmUgc2V0IHRvIHplcm8uCiAgIAogICAgXHJldHVybiAgICAgICAgICAgICAgICAgT24gc3VjY2Vzcywgc2VsZWN0KCkgIHJldHVybnMgdGhlIG51bWJlciBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gdGhlIHRocmVlIHJldHVybmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHNldHMgKHRoYXQgaXMsIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgc2V0IGluIHJlYWRmZHMsIHdyaXRlZmRzLCBleGNlcHRmZHMpIHdoaWNoIG1heSBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyBpZiB0aGUgdGltZW91dCBleHBpcmVzIGJlZm9yZSBhbnl0aGluZyBpbnRlcmVzdGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFwcGVucy5cbiBPbiBlcnJvciwgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRzZHMgLSByZXR1cm4gdGhlIHNvY2tldHMgb24gd2hpY2ggcmVhZCByZXF1ZXN0IHdpbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0IGRlbGF5IHdpdGggdmFsaWQgZGF0YS5cbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVzZHMgLSByZXR1cm4gdGhlIHNvY2tldHMgb24gd2hpY2ggd3JpdGUgcmVxdWVzdCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgcmV0dXJuIHdpdGhvdXQgZGVsYXkuXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdHNkcyAtIHJldHVybiB0aGUgc29ja2V0cyBjbG9zZWQgcmVjZW50bHkuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9QT09MX0lTX0VNUFRZIG1heSBiZSByZXR1cm4gaW4gY2FzZSB0aGVyZSBhcmUgbm8gcmVzb3VyY2VzIGluIHRoZSBzeXN0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0cnkgYWdhaW4gbGF0ZXIgb3IgaW5jcmVhc2UgTUFYX0NPTkNVUlJFTlRfQUNUSU9OUwogCiAgICBcc2EgICAgIHNsX1NvY2tldAogICAgXG5vdGUgICBJZiB0aGUgdGltZW91dCB2YWx1ZSBzZXQgdG8gbGVzcyB0aGFuIDEwbXMgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCAKICAgICAgICAgICAgdG8gMTBtcyB0byBwcmV2ZW50IG92ZXJsb2FkIG9mIHRoZSBzeXN0ZW1cbgogICAgICAgICAgICBCZWxvbmdzIHRvIFxyZWYgYmFzaWNfYXBpCiAgICAgICAgICAgIAogICAgICAgICAgICBTZXZlcmFsIHRocmVhZHMgY2FuIGNhbGwgc2xfU2VsZWN0IGF0IHRoZSBzYW1lIHRpbWUuXGIKICAgICAgICAgICAgQ2FsbGluZyB0aGlzIEFQSSB3aGlsZSB0aGUgc2FtZSBjb21tYW5kIGlzIGNhbGxlZCBmcm9tIGFub3RoZXIgdGhyZWFkLCBtYXkgcmVzdWx0CiAgICAgICAgICAgICAgICBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBzY2VuYXJpb3M6CiAgICAgICAgICAgIDEuIFRoZSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgYWxvbmdzaWRlIG90aGVyIHNlbGVjdCBjYWxsZXJzIChzdWNjZXNzKS4KICAgICAgICAgICAgMi4gVGhlIGNvbW1hbmQgd2lsbCB3YWl0IChpbnRlcm5hbCkgdW50aWwgdGhlIHByZXZpb3VzIHNsX3NlbGVjdCBmaW5pc2gsIGFuZCB0aGVuIGJlIGV4ZWN1dGVkLgogICAgICAgICAgICAzLiBUaGVyZSBhcmUgbm90IGVub3VnaCByZXNvdXJjZXMgYW5kIFNMX1BPT0xfSVNfRU1QVFkgZXJyb3Igd2lsbCByZXR1cm4uIAogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIE1BWF9DT05DVVJSRU5UX0FDVElPTlMgY2FuIGJlIGluY3JlYXNlZCAocmVzdWx0IGluIG1lbW9yeSBpbmNyZWFzZSkgb3IgdHJ5CiAgICAgICAgICAgIGFnYWluIGxhdGVyIHRvIGlzc3VlIHRoZSBjb21tYW5kLgoKICAgICAgICAgICAgSW4gY2FzZSBhbGwgdGhlIHVzZXIgc29ja2V0cyBhcmUgb3Blbiwgc2xfU2VsZWN0IHdpbGwgZXhoaWJpdCB0aGUgYmVoYXZpb3VyIG1lbnRpb25lZCBpbiAoMikKICAgICAgICAgICAgVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3Qgc2xfc2VsZWN0IHN1cHBvcnRzIG11bHRpcGxlIGNhbGxlcnMgYnkgdXRpbGl6aW5nIG9uZSB1c2VyIHNvY2tldCBpbnRlcm5hbGx5LgogICAgICAgICAgICBVc2VyIHdobyB3aXNoIHRvIGVuc3VyZSBtdWx0aXBsZSBzZWxlY3QgY2FsbHMgYXQgYW55IGdpdmVuIHRpbWUsIG11c3QgcmVzZXJ2ZSBvbmUgc29ja2V0IG91dCBvZiB0aGUgMTYgZ2l2ZW4uCiAgIAogICAgXHdhcm5pbmcKICAgICAgICAgICAgbXVsdGlwbGUgc2VsZWN0IGNhbGxzIGFyZW4ndCBzdXBwb3J0ZWQgd2hlbiB0cmlnZ2VyIG1vZGUgaXMgYWN0aXZlLiBUaGUgdHdvIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCiovCiNpZiBfU0xfSU5DTFVERV9GVU5DKHNsX1NlbGVjdCkKX2kxNiBzbF9TZWxlY3QoX2kxNiBuZmRzLCBTbEZkU2V0X3QgKnJlYWRzZHMsIFNsRmRTZXRfdCAqd3JpdGVzZHMsIFNsRmRTZXRfdCAqZXhjZXB0c2RzLCBzdHJ1Y3QgU2xUaW1ldmFsX3QgKnRpbWVvdXQpOwojZW5kaWYKCi8qIQogICAgXGNvbmQgRE9YWUdFTl9JR05PUkUKKi8KCi8qIQogICAgXGJyaWVmIFNlbGVjdCdzIFNsRmRTZXRfdCBTRVQgZnVuY3Rpb24KICAgCiAgICBTZXRzIGN1cnJlbnQgc29ja2V0IGRlc2NyaXB0b3Igb24gU2xGZFNldF90IGNvbnRhaW5lcgoqLwp2b2lkIFNMX1NPQ0tFVF9GRF9TRVQoX2kxNiBmZCwgU2xGZFNldF90ICpmZHNldCk7CgovKiEKICAgIFxicmllZiBTZWxlY3QncyBTbEZkU2V0X3QgQ0xSIGZ1bmN0aW9uCiAgIAogICAgQ2xlYXJzIGN1cnJlbnQgc29ja2V0IGRlc2NyaXB0b3Igb24gU2xGZFNldF90IGNvbnRhaW5lcgoqLwp2b2lkIFNMX1NPQ0tFVF9GRF9DTFIoX2kxNiBmZCwgU2xGZFNldF90ICpmZHNldCk7CgoKLyohCiAgICBcYnJpZWYgU2VsZWN0J3MgU2xGZFNldF90IElTU0VUIGZ1bmN0aW9uCiAgIAogICAgQ2hlY2tzIGlmIGN1cnJlbnQgc29ja2V0IGRlc2NyaXB0b3IgaXMgc2V0IChUUlVFL0ZBTFNFKQoKICAgIFxyZXR1cm4gICAgICAgICAgICBSZXR1cm5zIFRSVUUgaWYgc2V0LCBGQUxTRSBpZiB1bnNldAoKKi8KX2kxNiAgU0xfU09DS0VUX0ZEX0lTU0VUKF9pMTYgZmQsIFNsRmRTZXRfdCAqZmRzZXQpOwoKLyohCiAgICBcYnJpZWYgU2VsZWN0J3MgU2xGZFNldF90IFpFUk8gZnVuY3Rpb24KICAgCiAgICBDbGVhcnMgYWxsIHNvY2tldCBkZXNjcmlwdG9ycyBmcm9tIFNsRmRTZXRfdAoqLwp2b2lkIFNMX1NPQ0tFVF9GRF9aRVJPKFNsRmRTZXRfdCAqZmRzZXQpOwoKLyohCiAgICBcZW5kY29uZAoqLwoKCi8qIQogICAgXGJyaWVmIFNldCBzb2NrZXQgb3B0aW9ucy0KIAogICAgVGhpcyBmdW5jdGlvbiBtYW5pcHVsYXRlIHRoZSBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHNvY2tldC5cbgogICAgT3B0aW9ucyBtYXkgZXhpc3QgYXQgbXVsdGlwbGUgcHJvdG9jb2wgbGV2ZWxzOyB0aGV5IGFyZSBhbHdheXMKICAgIHByZXNlbnQgYXQgdGhlIHVwcGVybW9zdCBzb2NrZXQgbGV2ZWwuXG4KIAogICAgV2hlbiBtYW5pcHVsYXRpbmcgc29ja2V0IG9wdGlvbnMgdGhlIGxldmVsIGF0IHdoaWNoIHRoZSBvcHRpb24gcmVzaWRlcwogICAgYW5kIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQuICBUbyBtYW5pcHVsYXRlIG9wdGlvbnMgYXQKICAgIHRoZSBzb2NrZXQgbGV2ZWwsIGxldmVsIGlzIHNwZWNpZmllZCBhcyBTT0xfU09DS0VULiAgVG8gbWFuaXB1bGF0ZQogICAgb3B0aW9ucyBhdCBhbnkgb3RoZXIgbGV2ZWwgdGhlIHByb3RvY29sIG51bWJlciBvZiB0aGUgYXBwcm9wcmlhdGUgcHJvdG8tCiAgICBjb2wgY29udHJvbGxpbmcgdGhlIG9wdGlvbiBpcyBzdXBwbGllZC4gIEZvciBleGFtcGxlLCB0byBpbmRpY2F0ZSB0aGF0IGFuCiAgICBvcHRpb24gaXMgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIFRDUCBwcm90b2NvbCwgbGV2ZWwgc2hvdWxkIGJlIHNldCB0bwogICAgdGhlIHByb3RvY29sIG51bWJlciBvZiBUQ1A7IFxuCiAKICAgIFRoZSBwYXJhbWV0ZXJzIG9wdHZhbCBhbmQgb3B0bGVuIGFyZSB1c2VkIHRvIGFjY2VzcyBvcHR2YWwgLSAKICAgIHVlcyBmb3Igc2V0c29ja29wdCgpLiAgRm9yIGdldHNvY2tvcHQoKSB0aGV5IGlkZW50aWZ5IGEgCiAgICBidWZmZXIgaW4gd2hpY2ggdGhlIHZhbHVlIGZvciB0aGUgcmVxdWVzdGVkIG9wdGlvbihzKSBhcmUgdG8gCiAgICBiZSByZXR1cm5lZC4gIEZvciBnZXRzb2Nrb3B0KCksIG9wdGxlbiBpcyBhIHZhbHVlLXJlc3VsdCAKICAgIHBhcmFtZXRlciwgaW5pdGlhbGx5IGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAKICAgIHBvaW50ZWQgdG8gYnkgb3B0aW9uX3ZhbHVlLCBhbmQgbW9kaWZpZWQgb24gcmV0dXJuIHRvIAogICAgaW5kaWNhdGUgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSB2YWx1ZSByZXR1cm5lZC4gIElmIG5vIG9wdGlvbiAKICAgIHZhbHVlIGlzIHRvIGJlIHN1cHBsaWVkIG9yIHJldHVybmVkLCBvcHRpb25fdmFsdWUgbWF5IGJlIAogICAgTlVMTC4KICAgCiAgICBccGFyYW1baW5dIHNkICAgICAgICAgICAgICAgU29ja2V0IGhhbmRsZQogICAgXHBhcmFtW2luXSBsZXZlbCAgICAgICAgICAgIERlZmluZXMgdGhlIHByb3RvY29sIGxldmVsIGZvciB0aGlzIG9wdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09MX1NPQ0tFVDwvYj4gICBTb2NrZXQgbGV2ZWwgY29uZmlndXJhdGlvbnMgKEw0LCB0cmFuc3BvcnQgbGF5ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9JUFBST1RPX0lQPC9iPiAgIElQIGxldmVsIGNvbmZpZ3VyYXRpb25zIChMMywgbmV0d29yayBsYXllcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPTF9QSFlfT1BUPC9iPiAgTGluayBsZXZlbCBjb25maWd1cmF0aW9ucyAoTDIsIGxpbmsgbGF5ZXIpCiAgICBccGFyYW1baW5dIG9wdG5hbWUgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9uIG5hbWUgdG8gaW50ZXJyb2dhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPTF9TT0NLRVQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9TT19LRUVQQUxJVkU8L2I+ICBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlL0Rpc2FibGUgcGVyaW9kaWMga2VlcCBhbGl2ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtlZXBzIFRDUCBjb25uZWN0aW9ucyBhY3RpdmUgYnkgZW5hYmxpbmcgdGhlIHBlcmlvZGljIHRyYW5zbWlzc2lvbiBvZiBtZXNzYWdlcyBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCBpcyA1IG1pbnV0ZXMuXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IEVuYWJsZWQgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyBTbFNvY2tLZWVwYWxpdmVfdCBzdHJ1Y3QgYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX0tFRVBBTElWRVRJTUU8L2I+ICBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IGtlZXAgYWxpdmUgdGltZW91dC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGluIHNlY29uZHMgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IDUgbWludXRlcyBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9TT19SWF9OT19JUF9CT1VOREFSWTwvYj4gIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUvRGlzYWJsZSByeCBpcCBib3VuZGFyeS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGNvbm5lY3Rpb25sZXNzIHNvY2tldCAodWRwL3JhdyksIHVucmVhZCBkYXRhIGlzIGRyb3BwZWQgKHdoZW4gcmVjdmZyb20gbGVuIHBhcmFtZXRlciA8IGRhdGEgc2l6ZSksIEVuYWJsZSB0aGlzIG9wdGlvbiBpbiBvcmRlciB0byByZWFkIHRoZSBsZWZ0IGRhdGEgb24gdGhlIG5leHQgcmVjdmZyb20gaXRlcmF0aW9uIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogRGlzYWJsZWQsIElQIGJvdW5kYXJ5IGtlcHQsICBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIFNsU29ja1J4Tm9JcEJvdW5kYXJ5X3Qgc3RydWN0IGFzIHBhcmFtZXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX1JDVlRJTUVPPC9iPiAgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHMgdGhlIHRpbWVvdXQgdmFsdWUgdGhhdCBzcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgYW4gaW5wdXQgZnVuY3Rpb24gd2FpdHMgdW50aWwgaXQgY29tcGxldGVzLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogTm8gdGltZW91dCBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIFNsVGltZXZhbF90IHN0cnVjdCBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fUkNWQlVGPC9iPiAgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHMgdGNwIG1heCByZWN2IHdpbmRvdyBzaXplLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIFNsU29ja1dpbnNpemVfdCBzdHJ1Y3QgYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX05PTkJMT0NLSU5HPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0cyBzb2NrZXQgdG8gbm9uLWJsb2NraW5nIG9wZXJhdGlvbiBJbXBhY3RzOiBjb25uZWN0LCBhY2NlcHQsIHNlbmQsIHNlbmR0bywgcmVjdiBhbmQgcmVjdmZyb20uIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiBCbG9ja2luZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyBTbFNvY2tOb25ibG9ja2luZ190IHN0cnVjdCBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fU0VDTUVUSE9EPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0cyBtZXRob2QgdG8gdGNwIHNlY3VyZWQgc29ja2V0IChTTF9TRUNfU09DS0VUKSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogU0xfU09fU0VDX01FVEhPRF9TU0x2M19UTFNWMV8yIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgU2xTb2NrU2VjdXJlTWV0aG9kX3Qgc3RydWN0IGFzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9TT19TRUNVUkVfTUFTSzwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHMgc3BlY2lmaWMgY2lwaGVyIHRvIHRjcCBzZWN1cmVkIHNvY2tldCAoU0xfU0VDX1NPQ0tFVCkgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6ICJCZXN0IiBjaXBoZXIgc3VpdGFibGUgdG8gbWV0aG9kIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgU2xTb2NrU2VjdXJlTWFza190IHN0cnVjdCBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fU0VDVVJFX0ZJTEVTX0NBX0ZJTEVfTkFNRTwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzZWN1cmVkIHNvY2tldCB0byBDQSBmaWxlIGJ5IG5hbWUgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX1NFQ1VSRV9GSUxFU19QUklWQVRFX0tFWV9GSUxFX05BTUU8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2VjdXJlZCBzb2NrZXQgdG8gcHJpdmF0ZSBrZXkgYnkgbmFtZSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91ODwvYj4gYnVmZmVyIGFzIHBhcmFtZXRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fU0VDVVJFX0ZJTEVTX0NFUlRJRklDQVRFX0ZJTEVfTkFNRTwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzZWN1cmVkIHNvY2tldCB0byBjZXJ0aWZpY2F0ZSBmaWxlIGJ5IG5hbWUgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTg8L2I+IGJ1ZmZlciBhcyBwYXJhbWV0ZXIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX1NFQ1VSRV9GSUxFU19ESF9LRVlfRklMRV9OQU1FPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHNlY3VyZWQgc29ja2V0IHRvIERpZmZpZSBIZWxsbWFuIGZpbGUgYnkgbmFtZSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91ODwvYj4gYnVmZmVyIGFzIHBhcmFtZXRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fQ0hBTkdFX0NIQU5ORUw8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRzIGNoYW5uZWwgaW4gdHJhbnNjZWl2ZXIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTMyPC9iPiBhcyBjaGFubmVsIG51bWJlciBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fU0VDVVJFX0FMUE48L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRzIHRoZSBBTFBOIGxpc3QuIHRoZSBwYXJhbWV0ZXIgaXMgYSBiaXQgbWFwIGNvbnNpc3Qgb2Ygb3Igb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfU0VDVVJFX0FMUE5fSDEgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9TRUNVUkVfQUxQTl9IMiAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1NFQ1VSRV9BTFBOX0gyQyAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfU0VDVVJFX0FMUE5fSDJfMTQgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9TRUNVUkVfQUxQTl9IMl8xNiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1NFQ1VSRV9BTFBOX0ZVTExfTElTVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfSVBQUk9UT19JUDwvYj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX0lQX01VTFRJQ0FTVF9UVEw8L2I+IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIHRpbWUtdG8tbGl2ZSB2YWx1ZSBvZiBvdXRnb2luZyBtdWx0aWNhc3QgcGFja2V0cyBmb3IgdGhpcyBzb2NrZXQuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgPGI+X3U4PC9iPiBhcyBwYXJhbWV0ZXIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX0lQX0FERF9NRU1CRVJTSElQPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVURQIHNvY2tldCwgSm9pbiBhIG11bHRpY2FzdCBncm91cC4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyBTbFNvY2tJcE1yZXFfdCBzdHJ1Y3QgYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX0lQX0RST1BfTUVNQkVSU0hJUDwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVEUCBzb2NrZXQsIExlYXZlIGEgbXVsdGljYXN0IGdyb3VwIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgU2xTb2NrSXBNcmVxX3Qgc3RydWN0IGFzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA8Yj5TTF9JUF9SQVdfUlhfTk9fSEVBREVSPC9iPiBcbiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXcgc29ja2V0IHJlbW92ZSBJUCBoZWFkZXIgZnJvbSByZWNlaXZlZCBkYXRhLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogZGF0YSBpbmNsdWRlcyBpcCBoZWFkZXIgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTMyPC9iPiBhcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfSVBfSERSSU5DTDwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVyBzb2NrZXQgb25seSwgdGhlIElQdjQgbGF5ZXIgZ2VuZXJhdGVzIGFuIElQIGhlYWRlciB3aGVuIHNlbmRpbmcgYSBwYWNrZXQgdW5sZXNzIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSVBfSERSSU5DTCBzb2NrZXQgb3B0aW9uIGlzIGVuYWJsZWQgb24gdGhlIHNvY2tldC4gICAgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gaXQgaXMgZW5hYmxlZCwgdGhlIHBhY2tldCBtdXN0IGNvbnRhaW4gYW4gSVAgaGVhZGVyLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogZGlzYWJsZWQsIElQdjQgaGVhZGVyIGdlbmVyYXRlZCBieSBOZXR3b3JrIFN0YWNrIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgPGI+X3UzMjwvYj4gYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX0lQX1JBV19JUFY2X0hEUklOQ0w8L2I+IChpbmFjdGl2ZSkgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVyBzb2NrZXQgb25seSwgdGhlIElQdjYgbGF5ZXIgZ2VuZXJhdGVzIGFuIElQIGhlYWRlciB3aGVuIHNlbmRpbmcgYSBwYWNrZXQgdW5sZXNzIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSVBfSERSSU5DTCBzb2NrZXQgb3B0aW9uIGlzIGVuYWJsZWQgb24gdGhlIHNvY2tldC4gV2hlbiBpdCBpcyBlbmFibGVkLCB0aGUgcGFja2V0IG11c3QgY29udGFpbiBhbiBJUCBoZWFkZXIgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IGRpc2FibGVkLCBJUHY0IGhlYWRlciBnZW5lcmF0ZWQgYnkgTmV0d29yayBTdGFjayBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91MzI8L2I+IGFzIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09MX1BIWV9PUFQ8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX1BIWV9SQVRFPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFXIHNvY2tldCwgc2V0IFdMQU4gUEhZIHRyYW5zbWl0IHJhdGUgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlIGJhc2VkIG9uIFNsV2xhblJhdGVJbmRleF9lICAgIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgPGI+X3UzMjwvYj4gYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX1BIWV9UWF9QT1dFUjwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVyBzb2NrZXQsIHNldCBXTEFOIFBIWSBUWCBwb3dlciBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgcmFnZSBpcyAxLTE1IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgPGI+X3UzMjwvYj4gYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX1BIWV9OVU1fRlJBTUVTX1RPX1RYPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFXIHNvY2tldCwgc2V0IG51bWJlciBvZiBmcmFtZXMgdG8gdHJhbnNtaXQgaW4gdHJhbnNjZWl2ZXIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IDEgcGFja2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbnMgdGFrZXMgPGI+X3UzMjwvYj4gYXMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX1BIWV9QUkVBTUJMRTwvYj4gXG4gIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFXIHNvY2tldCwgc2V0IFdMQU4gUEhZIHByZWFtYmxlIGZvciBMb25nL1Nob3J0XG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTMyPC9iPiBhcyBwYXJhbWV0ZXIgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fUEhZX1RYX0lOSElCSVRfVEhSRVNIT0xEPC9iPiBcbiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVcgc29ja2V0LCBzZXQgV0xBTiBUeCCWIFNldCBDQ0EgdGhyZXNob2xkLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBhcmUgYmFzZWQgb24gU2xUeEluaGliaXRUaHJlc2hvbGRfZSAgICBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91MzI8L2I+IGFzIHBhcmFtZXRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fUEhZX1RYX1RJTUVPVVQ8L2I+IFxuICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVyBzb2NrZXQsIHNldCBXTEFOIFR4IJYgY2hhbmdlcyB0aGUgVFggdGltZW91dCAobGlmZXRpbWUpIG9mIHRyYW5zY2VpdmVyIGZyYW1lcy4gXG4gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGluIE1zLCBtYXhpbXVtIHZhbHVlIGlzIDEwbXMgICAgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9ucyB0YWtlcyA8Yj5fdTMyPC9iPiBhcyBwYXJhbWV0ZXIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDxiPlNMX1NPX1BIWV9BTExPV19BQ0tTIDwvYj4gXG4gIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFXIHNvY2tldCwgc2V0IFdMQU4gVHggliBFbmFibGVcRGlzYWJsZSBzZW5kaW5nIEFDS3MgaW4gdHJhbnNjZWl2ZXIgbW9kZSBcbiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0gZGlzYWJsZWQgLyAxID0gZW5hYmxlZCAgICBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25zIHRha2VzIDxiPl91MzI8L2I+IGFzIHBhcmFtZXRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fTElOR0VSPC9iPiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IGxpbmdlcnMgb24gY2xvc2UgcGVuZGluZyByZW1haW5pbmcgc2VuZC9yZWNlaXZlIHBhY2tldHN0XG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fU0VDVVJFX0VYVF9DTElFTlRfQ0hMTkdfUkVTUDwvYj4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aXRoIG5vIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjbGllbnQgdXNlcyBleHRlcm5hbCBzaWduYXR1cmUgdXNpbmcgbmV0YXBwIHJlcXVlc3J0LlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkcyBuZXRhcHAgcmVxdWVzdCBoYW5kbGVyXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gPGI+U0xfU09fU0VDVVJFX0RPTUFJTl9OQU1FX1ZFUklGSUNBVElPTiA8L2I+XG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBhIGRvbWFpbiBuYW1lLCB0byBjaGVjayBpbiBzc2wgY2xpZW50IGNvbm5lY3Rpb24uCiAgICAgICAgICAgIAogIAogICAgXHBhcmFtW2luXSBvcHR2YWwgICAgICAgICAgIFNwZWNpZmllcyBhIHZhbHVlIGZvciB0aGUgb3B0aW9uCiAgICBccGFyYW1baW5dIG9wdGxlbiAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIAogICAgICAgIG9wdGlvbiB2YWx1ZQogCiAgICBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgWmVybyBvbiBzdWNjZXNzLCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKICAgIAogICAgXHBhciBQZXJzaXN0ZW50ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIEFsbCBwYXJhbXMgYXJlIDxiPk5vbi0gUGVyc2lzdGVudDwvYj4gCiAgICBcc2EgICAgIHNsX2dldHNvY2tvcHQKICAgIFxub3RlICAgQmVsb25ncyB0byBccmVmIGJhc2ljX2FwaSAgCiAgICBcd2FybmluZwogICAgXHBhciAgIEV4YW1wbGVzCgogICAgLSBTTF9TT19LRUVQQUxJVkUgKGRpc2FibGUgS2VlcGFsaXZlKToKICAgIFxjb2RlCiAgICAgICAgU2xTb2NrS2VlcGFsaXZlX3QgZW5hYmxlT3B0aW9uOwogICAgICAgIGVuYWJsZU9wdGlvbi5LZWVwYWxpdmVFbmFibGVkID0gMDsKICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCxTTF9TT0xfU09DS0VULFNMX1NPX0tFRVBBTElWRSwgKF91OCAqKSZlbmFibGVPcHRpb24sc2l6ZW9mKGVuYWJsZU9wdGlvbikpOyAgCiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfU09fS0VFUEFMSVZFVElNRSAoU2V0IEtlZXBhbGl2ZSB0aW1lb3V0KToKICAgIFxjb2RlICAgCiAgICAgICAgX2kxNiBTdGF0dXM7CiAgICAgICAgX3UzMiBUaW1lT3V0ID0gMTIwOwogICAgICAgIHNsX1NldFNvY2tPcHQoU2QsIFNMX1NPTF9TT0NLRVQsIFNMX1NPX0tFRVBBTElWRVRJTUUsKCBfdTgqKSAmVGltZU91dCwgc2l6ZW9mKFRpbWVPdXQpKTsKICAgIFxlbmRjb2RlCiAgICA8YnI+CgogICAgLSBTTF9TT19SWF9OT19JUF9CT1VOREFSWSAoZGlzYWJsZSBib3VuZGFyeSk6CiAgICBcY29kZQogICAgICAgIFNsU29ja1J4Tm9JcEJvdW5kYXJ5X3QgZW5hYmxlT3B0aW9uOwogICAgICAgIGVuYWJsZU9wdGlvbi5SeElwTm9Cb3VuZGFyeUVuYWJsZWQgPSAxOwogICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELFNMX1NPTF9TT0NLRVQsU0xfU09fUlhfTk9fSVBfQk9VTkRBUlksIChfdTggKikmZW5hYmxlT3B0aW9uLHNpemVvZihlbmFibGVPcHRpb24pKTsgIAogICAgXGVuZGNvZGUKICAgIDxicj4KCiAgICAtIFNMX1NPX1JDVlRJTUVPOgogICAgXGNvZGUKICAgICAgICBzdHJ1Y3QgU2xUaW1ldmFsX3QgdGltZVZhbDsKICAgICAgICB0aW1lVmFsLnR2X3NlYyA9ICAxOyAgICAgICAgICAgICAvLyBTZWNvbmRzCiAgICAgICAgdGltZVZhbC50dl91c2VjID0gMDsgICAgICAgICAgICAgLy8gTWljcm9zZWNvbmRzLiAxMDAwMCBtaWNyb3NlY29uZHMgcmVzb2x1dGlvbgogICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELFNMX1NPTF9TT0NLRVQsU0xfU09fUkNWVElNRU8sIChfdTggKikmdGltZVZhbCwgc2l6ZW9mKHRpbWVWYWwpKTsgICAgLy8gRW5hYmxlIHJlY2VpdmUgdGltZW91dCAKICAgIFxlbmRjb2RlCiAgICA8YnI+CgogICAgLSBTTF9TT19SQ1ZCVUY6CiAgICBcY29kZQogICAgICAgICAgIFNsU29ja1dpbnNpemVfdCBzaXplOwogICAgICAgICAgIHNpemUuV2luc2l6ZSA9IDMwMDA7ICAvLyBieXRlcwogICAgICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELFNMX1NPTF9TT0NLRVQsU0xfU09fUkNWQlVGLCAoX3U4ICopJnNpemUsIHNpemVvZihzaXplKSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfU09fTk9OQkxPQ0tJTkc6CiAgICBcY29kZQogICAgCiAgICAgICAgICAgU2xTb2NrTm9uYmxvY2tpbmdfdCBlbmFibGVPcHRpb247CiAgICAgICAgICAgZW5hYmxlT3B0aW9uLk5vbmJsb2NraW5nRW5hYmxlZCA9IDE7CiAgICAgICAgICAgc2xfU2V0U29ja09wdChTb2NrSUQsU0xfU09MX1NPQ0tFVCxTTF9TT19OT05CTE9DS0lORywgKF91OCAqKSZlbmFibGVPcHRpb24sc2l6ZW9mKGVuYWJsZU9wdGlvbikpOyAvLyBFbmFibGUvZGlzYWJsZSBub25ibG9ja2luZyBtb2RlCiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfU09fU0VDTUVUSE9EOgogICAgXGNvZGUKICAgICAgICAgICBTbFNvY2tTZWN1cmVNZXRob2RfdCBtZXRob2Q7CiAgICAgICAgICAgbWV0aG9kLlNlY3VyZU1ldGhvZCA9IFNMX1NPX1NFQ19NRVRIT0RfU1NMVjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VjdXJpdHkgbWV0aG9kIHdlIHdhbnQgdG8gdXNlCiAgICAgICAgICAgU29ja0lEID0gc2xfU29ja2V0KFNMX0FGX0lORVQsU0xfU09DS19TVFJFQU0sIFNMX1NFQ19TT0NLRVQpOwogICAgICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELCBTTF9TT0xfU09DS0VULCBTTF9TT19TRUNNRVRIT0QsIChfdTggKikmbWV0aG9kLCBzaXplb2YobWV0aG9kKSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfU09fU0VDVVJFX01BU0s6CiAgICBcY29kZSAKICAgICAgICAgICBTbFNvY2tTZWN1cmVNYXNrX3QgY2lwaGVyOwogICAgICAgICAgIGNpcGhlci5TZWN1cmVNYXNrID0gU0xfU0VDX01BU0tfU1NMX1JTQV9XSVRIX1JDNF8xMjhfU0hBOyAgICAgICAgICAgICAgICAgICAvLyBjaXBoZXIgdHlwZQogICAgICAgICAgIFNvY2tJRCA9IHNsX1NvY2tldChTTF9BRl9JTkVULFNMX1NPQ0tfU1RSRUFNLCBTTF9TRUNfU09DS0VUKTsKICAgICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCwgU0xfU09MX1NPQ0tFVCwgU0xfU09fU0VDVVJFX01BU0ssKF91OCAqKSZjaXBoZXIsIHNpemVvZihjaXBoZXIpKTsKICAgIFxlbmRjb2RlCiAgICA8YnI+CgogICAgLSBTTF9TT19TRUNVUkVfRklMRVNfQ0FfRklMRV9OQU1FOgogICAgXGNvZGUgICAgICAgICAgICAgICAKICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCxTTF9TT0xfU09DS0VULFNMX1NPX1NFQ1VSRV9GSUxFU19DQV9GSUxFX05BTUUsImV4dWlmYXhDYUNlcnQuZGVyIixzdHJsZW4oImV4dWlmYXhDYUNlcnQuZGVyIikpOwogICAgXGVuZGNvZGUKICAgIDxicj4KCiAgICAtIFNMX1NPX1NFQ1VSRV9GSUxFU19QUklWQVRFX0tFWV9GSUxFX05BTUU7CiAgICBcY29kZSAgICAgICAgICAgCiAgICAgICAgc2xfU2V0U29ja09wdChTb2NrSUQsU0xfU09MX1NPQ0tFVCxTTF9TT19TRUNVUkVfRklMRVNfUFJJVkFURV9LRVlfRklMRV9OQU1FLCJteVByaXZhdGVLZXkuZGVyIixzdHJsZW4oIm15UHJpdmF0ZUtleS5kZXIiKSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfU09fU0VDVVJFX0ZJTEVTX0NFUlRJRklDQVRFX0ZJTEVfTkFNRToKICAgICBcY29kZQogICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELFNMX1NPTF9TT0NLRVQsU0xfU09fU0VDVVJFX0ZJTEVTX0NFUlRJRklDQVRFX0ZJTEVfTkFNRSwibXlDZXJ0aWZpY2F0ZS5kZXIiLHN0cmxlbigibXlDZXJ0aWZpY2F0ZS5kZXIiKSk7CiAgICAgXGVuZGNvZGUKICAgICA8YnI+CgogICAgLSBTTF9TT19TRUNVUkVfRklMRVNfREhfS0VZX0ZJTEVfTkFNRToKICAgICBcY29kZQogICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELFNMX1NPTF9TT0NLRVQsU0xfU09fU0VDVVJFX0ZJTEVTX0RIX0tFWV9GSUxFX05BTUUsIm15REhpblNlcnZlck1vZGUuZGVyIixzdHJsZW4oIm15REhpblNlcnZlck1vZGUuZGVyIikpOwogICAgIFxlbmRjb2RlCiAgICAgPGJyPgoKICAgIC0gU0xfSVBfTVVMVElDQVNUX1RUTDoKICAgICBcY29kZQogICAgICAgICAgIF91OCB0dGwgPSAyMDsKICAgICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCwgU0xfSVBQUk9UT19JUCwgU0xfSVBfTVVMVElDQVNUX1RUTCwgJnR0bCwgc2l6ZW9mKHR0bCkpOwogICAgIFxlbmRjb2RlCiAgICAgPGJyPgoKICAgIC0gU0xfSVBfQUREX01FTUJFUlNISVA6CiAgICAgXGNvZGUKICAgICAgICAgICBTbFNvY2tJcE1yZXFfdCBtcmVxOwogICAgICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELCBTTF9JUFBST1RPX0lQLCBTTF9JUF9BRERfTUVNQkVSU0hJUCwgJm1yZXEsIHNpemVvZihtcmVxKSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfSVBfRFJPUF9NRU1CRVJTSElQOgogICAgXGNvZGUKICAgICAgICBTbFNvY2tJcE1yZXFfdCBtcmVxOwogICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELCBTTF9JUFBST1RPX0lQLCBTTF9JUF9EUk9QX01FTUJFUlNISVAsICZtcmVxLCBzaXplb2YobXJlcSkpOwogICAgXGVuZGNvZGUKICAgIDxicj4KCiAgICAtIFNMX1NPX0NIQU5HRV9DSEFOTkVMOgogICAgXGNvZGUKICAgICAgICBfdTMyIG5ld0NoYW5uZWwgPSA2OyAvLyByYW5nZSBpcyAxLTEzCiAgICAgICAgc2xfU2V0U29ja09wdChTb2NrSUQsIFNMX1NPTF9TT0NLRVQsIFNMX1NPX0NIQU5HRV9DSEFOTkVMLCAmbmV3Q2hhbm5lbCwgc2l6ZW9mKG5ld0NoYW5uZWwpKTsgIAogICAgXGVuZGNvZGUKICAgIDxicj4KCiAgICAtIFNMX1NPX1NFQ1VSRV9BTFBOOgogICAgXGNvZGUKICAgICAgICAgICAgU2xTb2NrU2VjdXJlQUxQTl90IGFscG47CiAgICAgICAgICAgIGFscG4uU2VjdXJlQUxQTiA9IFNMX1NFQ1VSRV9BTFBOX0gyIHwgU0xfU0VDVVJFX0FMUE5fSDJfMTQ7CiAgICAgICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELCBTTF9TT0xfU09DS0VULCBTTF9TT19TRUNVUkVfQUxQTiwgJmFscG4sIHNpemVvZihTbFNvY2tTZWN1cmVBTFBOX3QpKTsgIAogICAgXGVuZGNvZGUKICAgIDxicj4KCiAgICAtICAgU0xfSVBfUkFXX1JYX05PX0hFQURFUjoKICAgIFxjb2RlCiAgICAgICAgX3UzMiBoZWFkZXIgPSAxOyAgLy8gcmVtb3ZlIGlwIGhlYWRlcgogICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELCBTTF9JUFBST1RPX0lQLCBTTF9JUF9SQVdfUlhfTk9fSEVBREVSLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfSVBfSERSSU5DTDoKICAgIFxjb2RlCiAgICAgICAgX3UzMiBoZWFkZXIgPSAxOwogICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELCBTTF9JUFBST1RPX0lQLCBTTF9JUF9IRFJJTkNMLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfSVBfUkFXX0lQVjZfSERSSU5DTDoKICAgIFxjb2RlCiAgICAgICAgX3UzMiBoZWFkZXIgPSAxOwogICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELCBTTF9JUFBST1RPX0lQLCBTTF9JUF9SQVdfSVBWNl9IRFJJTkNMLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gICBTTF9TT19QSFlfUkFURToKICAgIFxjb2RlCiAgICAgICAgX3UzMiByYXRlID0gNjsgLy8gc2VlIHdsYW4uaCBTbFdsYW5SYXRlSW5kZXhfZSBmb3IgdmFsdWVzCiAgICAgICAgc2xfU2V0U29ja09wdChTb2NrSUQsIFNMX1NPTF9QSFlfT1BULCBTTF9TT19QSFlfUkFURSwgJnJhdGUsIHNpemVvZihyYXRlKSk7ICAKICAgIFxlbmRjb2RlCiAgICA8YnI+CgogICAgLSBTTF9TT19QSFlfVFhfUE9XRVI6CiAgICBcY29kZQogICAgICAgIF91MzIgdHhwb3dlciA9IDE7IC8vIHZhbGlkIHJhbmdlIGlzIDEtMTUKICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCwgU0xfU09MX1BIWV9PUFQsIFNMX1NPX1BIWV9UWF9QT1dFUiwgJnR4cG93ZXIsIHNpemVvZih0eHBvd2VyKSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfU09fUEhZX05VTV9GUkFNRVNfVE9fVFg6CiAgICBcY29kZQogICAgICAgIF91MzIgbnVtZnJhbWVzID0gMTsKICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCwgU0xfU09MX1BIWV9PUFQsIFNMX1NPX1BIWV9OVU1fRlJBTUVTX1RPX1RYLCAmbnVtZnJhbWVzLCBzaXplb2YobnVtZnJhbWVzKSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfU09fUEhZX1BSRUFNQkxFOgogICAgXGNvZGUKICAgICAgICBfdTMyIHByZWFtYmxlID0gMTsKICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCwgU0xfU09MX1BIWV9PUFQsIFNMX1NPX1BIWV9QUkVBTUJMRSwgJnByZWFtYmxlLCBzaXplb2YocHJlYW1ibGUpKTsKICAgIFxlbmRjb2RlCiAgICA8YnI+CgogICAgLSBTTF9TT19QSFlfVFhfSU5ISUJJVF9USFJFU0hPTEQ6CiAgICBcY29kZQogICAgICAgIF91MzIgdGhyc2hsZCA9IFNMX1RYX0lOSElCSVRfVEhSRVNIT0xEX01FRDsKICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCwgU0xfU09MX1BIWV9PUFQsIFNMX1NPX1BIWV9UWF9JTkhJQklUX1RIUkVTSE9MRCAsICZ0aHJzaGxkLCBzaXplb2YodGhyc2hsZCkpOwogICAgXGVuZGNvZGUKICAgIDxicj4KCiAgICAtIFNMX1NPX1BIWV9UWF9USU1FT1VUOgogICAgXGNvZGUKICAgICAgICBfdTMyIHRpbWVvdXQgPSA1MDsKICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCwgU0xfU09MX1BIWV9PUFQsIFNMX1NPX1BIWV9UWF9USU1FT1VUICAsICZ0aW1lb3V0LCBzaXplb2YodGltZW91dCkpOwogICAgXGVuZGNvZGUKICAgIDxicj4KICAgIAogICAgLSBTTF9TT19QSFlfQUxMT1dfQUNLUzoKICAgIFxjb2RlCiAgICAgICAgX3UzMiBhY2tzID0gMTsgLy8gMCA9IGRpc2FibGVkIC8gMSA9IGVuYWJsZWQKICAgICAgICBzbF9TZXRTb2NrT3B0KFNvY2tJRCwgU0xfU09MX1BIWV9PUFQsIFNMX1NPX1BIWV9BTExPV19BQ0tTLCAmYWNrcywgc2l6ZW9mKGFja3MpKTsKICAgIFxlbmRjb2RlCiAgICA8YnI+CiAgICAKICAgIC0gU0xfU09fTElOR0VSOgogICAgXGNvZGUKICAgICAgICBTbFNvY2tsaW5nZXJfdCBsaW5nZXI7CiAgICAgICAgbGluZ2VyLmxfb25vZmYgPSAxOwogICAgICAgIGxpbmdlci5sX2xpbmdlciA9IDEwOwogICAgICAgIHNsX1NldFNvY2tPcHQoU29ja0lELCBTTF9TT0xfU09DS0VULCBTTF9TT19MSU5HRVIsICZsaW5nZXIsIHNpemVvZihsaW5nZXIpKTsKICAgIFxlbmRjb2RlCiAgICA8YnI+CgogICAgLSBTTF9TT19TRUNVUkVfRVhUX0NMSUVOVF9DSExOR19SRVNQOgogICAgXGNvZGUKICAgICAgICBpbnQgZHVtbXk7CiAgICAgICAgc2xfU2V0U29ja09wdChTb2NrSUQsIFNMX1NPTF9TT0NLRVQsIFNMX1NPX1NFQ1VSRV9FWFRfQ0xJRU5UX0NITE5HX1JFU1AsICZkdW1teSwgc2l6ZW9mKGR1bW15KSk7CiAgICBcZW5kY29kZQogICAgPGJyPgoKICAgIC0gU0xfU09fU0VDVVJFX0RPTUFJTl9OQU1FX1ZFUklGSUNBVElPTjoKICAgIFxjb2RlCiAgICAgICAgc2xfU2V0U29ja09wdChTb2NrSUQsU0xfU09MX1NPQ0tFVCxTTF9TT19TRUNVUkVfRE9NQUlOX05BTUVfVkVSSUZJQ0FUSU9OLCJ3d3cuZ29vZ2xlLmNvLmlsIixzdHJsZW4oInd3dy5nb29nbGUuY28uaWwiKSk7CiAgICBcZW5kY29kZQogICAgICAgICAgICAgIAoqLwojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9TZXRTb2NrT3B0KQpfaTE2IHNsX1NldFNvY2tPcHQoX2kxNiBzZCwgX2kxNiBsZXZlbCwgX2kxNiBvcHRuYW1lLCBjb25zdCB2b2lkICpvcHR2YWwsIFNsU29ja2xlbl90IG9wdGxlbik7CiNlbmRpZgoKLyohCiAgICBcYnJpZWYgR2V0IHNvY2tldCBvcHRpb25zCiAgICAKICAgIFRoaXMgZnVuY3Rpb24gbWFuaXB1bGF0ZSB0aGUgb3B0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBzb2NrZXQuCiAgICBPcHRpb25zIG1heSBleGlzdCBhdCBtdWx0aXBsZSBwcm90b2NvbCBsZXZlbHM7IHRoZXkgYXJlIGFsd2F5cwogICAgcHJlc2VudCBhdCB0aGUgdXBwZXJtb3N0IHNvY2tldCBsZXZlbC5cbgogICAgCiAgICBXaGVuIG1hbmlwdWxhdGluZyBzb2NrZXQgb3B0aW9ucyB0aGUgbGV2ZWwgYXQgd2hpY2ggdGhlIG9wdGlvbiByZXNpZGVzCiAgICBhbmQgdGhlIG5hbWUgb2YgdGhlIG9wdGlvbiBtdXN0IGJlIHNwZWNpZmllZC4gIFRvIG1hbmlwdWxhdGUgb3B0aW9ucyBhdAogICAgdGhlIHNvY2tldCBsZXZlbCwgbGV2ZWwgaXMgc3BlY2lmaWVkIGFzIFNPTF9TT0NLRVQuICBUbyBtYW5pcHVsYXRlCiAgICBvcHRpb25zIGF0IGFueSBvdGhlciBsZXZlbCB0aGUgcHJvdG9jb2wgbnVtYmVyIG9mIHRoZSBhcHByb3ByaWF0ZSBwcm90by0KICAgIGNvbCBjb250cm9sbGluZyB0aGUgb3B0aW9uIGlzIHN1cHBsaWVkLiAgRm9yIGV4YW1wbGUsIHRvIGluZGljYXRlIHRoYXQgYW4KICAgIG9wdGlvbiBpcyB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgVENQIHByb3RvY29sLCBsZXZlbCBzaG91bGQgYmUgc2V0IHRvCiAgICB0aGUgcHJvdG9jb2wgbnVtYmVyIG9mIFRDUDsgXG4KICAgIAogICAgVGhlIHBhcmFtZXRlcnMgb3B0dmFsIGFuZCBvcHRsZW4gYXJlIHVzZWQgdG8gYWNjZXNzIG9wdHZhbCAtIAogICAgdWVzIGZvciBzZXRzb2Nrb3B0KCkuICBGb3IgZ2V0c29ja29wdCgpIHRoZXkgaWRlbnRpZnkgYSAKICAgIGJ1ZmZlciBpbiB3aGljaCB0aGUgdmFsdWUgZm9yIHRoZSByZXF1ZXN0ZWQgb3B0aW9uKHMpIGFyZSB0byAKICAgIGJlIHJldHVybmVkLiAgRm9yIGdldHNvY2tvcHQoKSwgb3B0bGVuIGlzIGEgdmFsdWUtcmVzdWx0IAogICAgcGFyYW1ldGVyLCBpbml0aWFsbHkgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIAogICAgcG9pbnRlZCB0byBieSBvcHRpb25fdmFsdWUsIGFuZCBtb2RpZmllZCBvbiByZXR1cm4gdG8gCiAgICBpbmRpY2F0ZSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHZhbHVlIHJldHVybmVkLiAgSWYgbm8gb3B0aW9uIAogICAgdmFsdWUgaXMgdG8gYmUgc3VwcGxpZWQgb3IgcmV0dXJuZWQsIG9wdGlvbl92YWx1ZSBtYXkgYmUgCiAgICBOVUxMLiAKICAgIAogICAgCiAgICBccGFyYW1baW5dICBzZCAgICAgICAgICAgICAgU29ja2V0IGhhbmRsZQogICAgXHBhcmFtW2luXSAgbGV2ZWwgICAgICAgICAgIERlZmluZXMgdGhlIHByb3RvY29sIGxldmVsIGZvciB0aGlzIG9wdGlvbgogICAgXHBhcmFtW2luXSAgb3B0bmFtZSAgICAgICAgIGRlZmluZXMgdGhlIG9wdGlvbiBuYW1lIHRvIGludGVycm9nYXRlCiAgICBccGFyYW1bb3V0XSBvcHR2YWwgICAgICAgICAgU3BlY2lmaWVzIGEgdmFsdWUgZm9yIHRoZSBvcHRpb24KICAgIFxwYXJhbVtvdXRdIG9wdGxlbiAgICAgICAgICBTcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIHZhbHVlCiAgICAKICAgIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICBaZXJvIG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQogICAgXHNhICAgICBzbF9TZXRTb2NrT3B0CiAgICBcbm90ZSAgIFNlZSBzbF9TZXRTb2NrT3B0CiAgICAgICAgICAgIEJlbG9uZ3MgdG8gXHJlZiBleHRfYXBpCiAgICBcd2FybmluZwoqLwojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9HZXRTb2NrT3B0KQpfaTE2IHNsX0dldFNvY2tPcHQoX2kxNiBzZCwgX2kxNiBsZXZlbCwgX2kxNiBvcHRuYW1lLCB2b2lkICpvcHR2YWwsIFNsU29ja2xlbl90ICpvcHRsZW4pOwojZW5kaWYKCi8qIQogICAgXGJyaWVmIFJlYWQgZGF0YSBmcm9tIFRDUCBzb2NrZXQKICAgICAKICAgIEZ1bmN0aW9uIHJlY2VpdmVzIGEgbWVzc2FnZSBmcm9tIGEgY29ubmVjdGlvbi1tb2RlIHNvY2tldAogICAgIAogICAgXHBhcmFtW2luXSAgc2QgICAgICAgICAgICAgIFNvY2tldCBoYW5kbGUKICAgIFxwYXJhbVtvdXRdIGJ1ZiAgICAgICAgICAgICBQb2ludHMgdG8gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBzaG91bGQgYmUgc3RvcmVkLgogICAgXHBhcmFtW2luXSAgbGVuICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgYnVmZmVyIGFyZ3VtZW50LiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZTogMS0xNjAwMCBieXRlcwogICAgXHBhcmFtW2luXSAgZmxhZ3MgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBtZXNzYWdlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VwdGlvbi4gT24gdGhpcyB2ZXJzaW9uLCB0aGlzIHBhcmFtZXRlciBpcyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuCiAgICAKICAgIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZC5cbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIGEgbm9uLWJsb2NraW5nIHJlY3YgYSBwb3NzaWJsZSBuZWdhdGl2ZSB2YWx1ZSBpcyBTTF9FQUdBSU4uXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTF9QT09MX0lTX0VNUFRZIG1heSBiZSByZXR1cm4gaW4gY2FzZSB0aGVyZSBhcmUgbm8gcmVzb3VyY2VzIGluIHRoZSBzeXN0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRyeSBhZ2FpbiBsYXRlciBvciBpbmNyZWFzZSBNQVhfQ09OQ1VSUkVOVF9BQ1RJT05TCiAgICAKICAgIFxzYSAgICAgc2xfUmVjdkZyb20KICAgIFxub3RlICAgICAgICAgICAgICAgICAgICAgICBCZWxvbmdzIHRvIFxyZWYgcmVjdl9hcGkKICAgIFx3YXJuaW5nCiAgICBccGFyICAgICAgICBFeGFtcGxlcwoKICAgIC0gUmVjZWl2aW5nIGRhdGEgdXNpbmcgVENQIHNvY2tldDoKICAgIFxjb2RlICAgIAogICAgICAgIFNsU29ja0FkZHJJbl90ICBBZGRyOwogICAgICAgIFNsU29ja0FkZHJJbl90ICBMb2NhbEFkZHI7CiAgICAgICAgX2kxNiBBZGRyU2l6ZSA9IHNpemVvZihTbFNvY2tBZGRySW5fdCk7CiAgICAgICAgX2kxNiBTb2NrSUQsIG5ld1NvY2tJRDsKICAgICAgICBfaTE2IFN0YXR1czsKICAgICAgICBfaTggQnVmW1JFQ1ZfQlVGX0xFTl07CgogICAgICAgIExvY2FsQWRkci5zaW5fZmFtaWx5ID0gU0xfQUZfSU5FVDsKICAgICAgICBMb2NhbEFkZHIuc2luX3BvcnQgPSBzbF9IdG9ucyg1MDAxKTsKICAgICAgICBMb2NhbEFkZHIuc2luX2FkZHIuc19hZGRyID0gMDsKCiAgICAgICAgQWRkci5zaW5fZmFtaWx5ID0gU0xfQUZfSU5FVDsKICAgICAgICBBZGRyLnNpbl9wb3J0ID0gc2xfSHRvbnMoNTAwMSk7CiAgICAgICAgQWRkci5zaW5fYWRkci5zX2FkZHIgPSBzbF9IdG9ubChTTF9JUFY0X1ZBTCgxMCwxLDEsMjAwKSk7CgogICAgICAgIFNvY2tJRCA9IHNsX1NvY2tldChTTF9BRl9JTkVULFNMX1NPQ0tfU1RSRUFNLCAwKTsKICAgICAgICBTdGF0dXMgPSBzbF9CaW5kKFNvY2tJRCwgKFNsU29ja0FkZHJfdCAqKSZMb2NhbEFkZHIsIEFkZHJTaXplKTsKICAgICAgICBTdGF0dXMgPSBzbF9MaXN0ZW4oU29ja0lELCAwKTsKICAgICAgICBuZXdTb2NrSUQgPSBzbF9BY2NlcHQoU29ja0lELCAoU2xTb2NrQWRkcl90KikmQWRkciwgKFNsU29ja2xlbl90KikgJkFkZHJTaXplKTsKICAgICAgICBTdGF0dXMgPSBzbF9SZWN2KG5ld1NvY2tJRCwgQnVmLCAxNDYwLCAwKTsKICAgIFxlbmRjb2RlCiAgICA8YnI+CgogICAgLSBSeCB0cmFuc2NlaXZlciBtb2RlIHVzaW5nIGEgcmF3IHNvY2tldDoKICAgIFxjb2RlICAgICAgCiAgICAgICAgX2k4IGJ1ZmZlclsxNTM2XTsKICAgICAgICBfaTE2IHNkOwogICAgICAgIF91MTYgc2l6ZTsKICAgICAgICBTbFRyYW5zY2VpdmVyUnhPdmVySGVhZF90ICp0cmFuc0hlYWRlcjsKICAgICAgICBzZCA9IHNsX1NvY2tldChTTF9BRl9SRixTTF9TT0NLX1JBVywxMSk7IC8vIGNoYW5uZWwgMTEKICAgICAgICB3aGlsZSgxKQogICAgICAgIHsKICAgICAgICAgICAgc2l6ZSA9IHNsX1JlY3Yoc2QsYnVmZmVyLDE1MzYsMCk7CiAgICAgICAgICAgIHRyYW5zSGVhZGVyID0gKFNsVHJhbnNjZWl2ZXJSeE92ZXJIZWFkX3QgKilidWZmZXI7CiAgICAgICAgICAgIHByaW50ZigiUlNTSSBpcyAlZCBmcmFtZSB0eXBlIGlzIDB4JXggc2l6ZSAlZFxuIix0cmFuc0hlYWRlci0+cnNzaSxidWZmZXJbc2l6ZW9mKFNsVHJhbnNjZWl2ZXJSeE92ZXJIZWFkX3QpXSxzaXplKTsKICAgICAgICB9CiAgICBcZW5kY29kZQoqLwojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9SZWN2KQpfaTE2IHNsX1JlY3YoX2kxNiBzZCwgdm9pZCAqYnVmLCBfaTE2IGxlbiwgX2kxNiBmbGFncyk7CiNlbmRpZgoKLyohCiAgICBcYnJpZWYgUmVhZCBkYXRhIGZyb20gc29ja2V0CiAgICAKICAgIEZ1bmN0aW9uIHJlY2VpdmVzIGEgbWVzc2FnZSBmcm9tIGEgY29ubmVjdGlvbi1tb2RlIG9yCiAgICBjb25uZWN0aW9ubGVzcy1tb2RlIHNvY2tldAogICAgCiAgICBccGFyYW1baW5dICBzZCAgICAgICAgICAgICAgU29ja2V0IGhhbmRsZSAKICAgIFxwYXJhbVtvdXRdIGJ1ZiAgICAgICAgICAgICBQb2ludHMgdG8gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc3RvcmVkLgogICAgXHBhcmFtW2luXSAgbGVuICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgYnVmZmVyIGFyZ3VtZW50LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlOiAxLTE2MDAwIGJ5dGVzCiAgICBccGFyYW1baW5dICBmbGFncyAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIG1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlcHRpb24uIE9uIHRoaXMgdmVyc2lvbiwgdGhpcyBwYXJhbWV0ZXIgaXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLgogICAgXHBhcmFtW2luXSAgZnJvbSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gYWRkcmVzcyBzdHJ1Y3R1cmUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGluZyB0aGUgc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5cbiBzb2NrYWRkcjpcbiAtIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGFkZHJlc3MgZm9ybWF0LiBPbiB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBvbmx5IEFGX0lORVQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuXG4gLSBzb2NrZXQgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGVuZ3RoIGRlcGVuZHMgb24gdGhlIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQKICAgIFxwYXJhbVtpbl0gIGZyb21sZW4gICAgICAgICBTb3VyY2UgYWRkcmVzcyBzdHJ1Y3R1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLiBUaGlzIHBhcmFtZXRlciBNVVNUIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgYWRkci4KICAgIAogICAgCiAgICBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgbmVnYXRpdmUgdmFsdWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBhIG5vbi1ibG9ja2luZyByZWN2IGEgcG9zc2libGUgbmVnYXRpdmUgdmFsdWUgaXMgU0xfRUFHQUlOLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMX1JFVF9DT0RFX0lOVkFMSURfSU5QVVQgKC0yKSB3aWxsIGJlIHJldHVybmVkIGlmIGZyb21sZW4gaGFzIGluY29ycmVjdCBsZW5ndGguIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xfUE9PTF9JU19FTVBUWSBtYXkgYmUgcmV0dXJuIGluIGNhc2UgdGhlcmUgYXJlIG5vIHJlc291cmNlcyBpbiB0aGUgc3lzdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0cnkgYWdhaW4gbGF0ZXIgb3IgaW5jcmVhc2UgTUFYX0NPTkNVUlJFTlRfQUNUSU9OUwogICAgCiAgICBcc2EgICAgIHNsX1JlY3YKICAgIFxub3RlICAgICAgICAgICAgICAgICAgICAgICBCZWxvbmdzIHRvIFxyZWYgcmVjdl9hcGkKICAgIFx3YXJuaW5nCiAgICBccGFyICAgICAgICBFeGFtcGxlCgogICAgLSBSZWNlaXZpbmcgZGF0YToKICAgIFxjb2RlCiAgICAgICAgU2xTb2NrQWRkckluX3QgIEFkZHI7CiAgICAgICAgU2xTb2NrQWRkckluX3QgIExvY2FsQWRkcjsKICAgICAgICBfaTE2IEFkZHJTaXplID0gc2l6ZW9mKFNsU29ja0FkZHJJbl90KTsKICAgICAgICBfaTE2IFNvY2tJRDsKICAgICAgICBfaTE2IFN0YXR1czsKICAgICAgICBfaTggQnVmW1JFQ1ZfQlVGX0xFTl07CgogICAgICAgIExvY2FsQWRkci5zaW5fZmFtaWx5ID0gU0xfQUZfSU5FVDsKICAgICAgICBMb2NhbEFkZHIuc2luX3BvcnQgPSBzbF9IdG9ucyg1MDAxKTsKICAgICAgICBMb2NhbEFkZHIuc2luX2FkZHIuc19hZGRyID0gMDsKCiAgICAgICAgU29ja0lEID0gc2xfU29ja2V0KFNMX0FGX0lORVQsU0xfU09DS19ER1JBTSwgMCk7CiAgICAgICAgU3RhdHVzID0gc2xfQmluZChTb2NrSUQsIChTbFNvY2tBZGRyX3QgKikmTG9jYWxBZGRyLCBBZGRyU2l6ZSk7CiAgICAgICAgU3RhdHVzID0gc2xfUmVjdkZyb20oU29ja0lELCBCdWYsIDE0NzIsIDAsIChTbFNvY2tBZGRyX3QgKikmQWRkciwgKFNsU29ja2xlbl90KikmQWRkclNpemUpOwoKICAgIFxlbmRjb2RlCiovCiNpZiBfU0xfSU5DTFVERV9GVU5DKHNsX1JlY3ZGcm9tKQpfaTE2IHNsX1JlY3ZGcm9tKF9pMTYgc2QsIHZvaWQgKmJ1ZiwgX2kxNiBsZW4sIF9pMTYgZmxhZ3MsIFNsU29ja0FkZHJfdCAqZnJvbSwgU2xTb2NrbGVuX3QgKmZyb21sZW4pOwojZW5kaWYKCi8qIQogICAgXGJyaWVmIFdyaXRlIGRhdGEgdG8gVENQIHNvY2tldAogICAgCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdHJhbnNtaXQgYSBtZXNzYWdlIHRvIGFub3RoZXIgc29ja2V0LgogICAgUmV0dXJucyBpbW1lZGlhdGVseSBhZnRlciBzZW5kaW5nIGRhdGEgdG8gZGV2aWNlLgogICAgSW4gY2FzZSBvZiBUQ1AgZmFpbHVyZSBhbiBhc3luYyBldmVudCBTTF9TT0NLRVRfVFhfRkFJTEVEX0VWRU5UIGlzIGdvaW5nIHRvCiAgICBiZSByZWNlaXZlZC5cbgogICAgSW4gY2FzZSBvZiBhIFJBVyBzb2NrZXQgKHRyYW5zY2VpdmVyIG1vZGUpLCBleHRyYSA0IGJ5dGVzIHNob3VsZCBiZSByZXNlcnZlZCBhdCB0aGUgZW5kIG9mIHRoZSAKICAgIGZyYW1lIGRhdGEgYnVmZmVyIGZvciBXTEFOIEZDUyAKICAgICAKICAgIFxwYXJhbVtpbl0gc2QgICAgICAgICAgICAgICBTb2NrZXQgaGFuZGxlCiAgICBccGFyYW1baW5dIGJ1ZiAgICAgICAgICAgICAgUG9pbnRzIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudAogICAgXHBhcmFtW2luXSBsZW4gICAgICAgICAgICAgIE1lc3NhZ2Ugc2l6ZSBpbiBieXRlcy4gUmFuZ2U6IDEtMTQ2MCBieXRlcwogICAgXHBhcmFtW2luXSBmbGFncyAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBtZXNzYWdlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbi4gT24gdGhpcyB2ZXJzaW9uLCB0aGlzIHBhcmFtZXRlciBpcyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgZm9yIFRDUC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdHJhbnNjZWl2ZXIgbW9kZSwgdGhlIFNMX1dMQU5fUkFXX1JGX1RYX1BBUkFNUyBtYWNybyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pc3Npb24gcGFyYW1ldGVycyAoY2hhbm5lbCxyYXRlLHR4X3Bvd2VyLHByZWFtYmxlKQogICAgCiAgICAKICAgIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICBaZXJvIG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQogICAgCiAgICBcc2EgICAgIHNsX1NlbmRUbyAKICAgIFxub3RlICAgICAgICAgICAgICAgICAgICAgICBCZWxvbmdzIHRvIFxyZWYgc2VuZF9hcGkKICAgIFx3YXJuaW5nICAgCiAgICBccGFyICAgICAgICBFeGFtcGxlCgogICAgLSBTZW5kaW5nIGRhdGE6CiAgICBcY29kZQogICAgICAgIFNsU29ja0FkZHJJbl90ICBBZGRyOwogICAgICAgIF9pMTYgQWRkclNpemUgPSBzaXplb2YoU2xTb2NrQWRkckluX3QpOwogICAgICAgIF9pMTYgU29ja0lEOwogICAgICAgIF9pMTYgU3RhdHVzOwogICAgICAgIF9pOCBCdWZbU0VORF9CVUZfTEVOXTsKCiAgICAgICAgQWRkci5zaW5fZmFtaWx5ID0gU0xfQUZfSU5FVDsKICAgICAgICBBZGRyLnNpbl9wb3J0ID0gc2xfSHRvbnMoNTAwMSk7CiAgICAgICAgQWRkci5zaW5fYWRkci5zX2FkZHIgPSBzbF9IdG9ubChTTF9JUFY0X1ZBTCgxMCwxLDEsMjAwKSk7CgogICAgICAgIFNvY2tJRCA9IHNsX1NvY2tldChTTF9BRl9JTkVULFNMX1NPQ0tfU1RSRUFNLCAwKTsKICAgICAgICBTdGF0dXMgPSBzbF9Db25uZWN0KFNvY2tJRCwgKFNsU29ja0FkZHJfdCAqKSZBZGRyLCBBZGRyU2l6ZSk7CiAgICAgICAgU3RhdHVzID0gc2xfU2VuZChTb2NrSUQsIEJ1ZiwgMTQ2MCwgMCApOwogICAgXGVuZGNvZGUKICovIAojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9TZW5kICkKX2kxNiBzbF9TZW5kKF9pMTYgc2QsIGNvbnN0IHZvaWQgKmJ1ZiwgX2kxNiBsZW4sIF9pMTYgZmxhZ3MpOwojZW5kaWYKCi8qIQogICAgXGJyaWVmIFdyaXRlIGRhdGEgdG8gc29ja2V0CiAgICAKICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB0cmFuc21pdCBhIG1lc3NhZ2UgdG8gYW5vdGhlciBzb2NrZXQKICAgIChjb25uZWN0aW9uIGxlc3Mgc29ja2V0IFNPQ0tfREdSQU0sICBTT0NLX1JBVykuXG4KICAgIFJldHVybnMgaW1tZWRpYXRlbHkgYWZ0ZXIgc2VuZGluZyBkYXRhIHRvIGRldmljZS5cbgogICAgSW4gY2FzZSBvZiB0cmFuc21pc3Npb24gZmFpbHVyZSBhbiBhc3luYyBldmVudCBTTF9TT0NLRVRfVFhfRkFJTEVEX0VWRU5UIGlzIGdvaW5nIHRvCiAgICBiZSByZWNlaXZlZC4KICAgIAogICAgXHBhcmFtW2luXSBzZCAgICAgICAgICAgICAgIFNvY2tldCBoYW5kbGUKICAgIFxwYXJhbVtpbl0gYnVmICAgICAgICAgICAgICBQb2ludHMgdG8gYSBidWZmZXIgY29udGFpbmluZyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBiZSBzZW50CiAgICBccGFyYW1baW5dIGxlbiAgICAgICAgICAgICAgbWVzc2FnZSBzaXplIGluIGJ5dGVzLiBSYW5nZTogMS0xNDYwIGJ5dGVzCiAgICBccGFyYW1baW5dIGZsYWdzICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIG1lc3NhZ2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXNzaW9uLiBPbiB0aGlzIHZlcnNpb24sIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCAKICAgIFxwYXJhbVtpbl0gdG8gICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGFkZHJlc3Mgc3RydWN0dXJlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRpbmcgdGhlIGRlc3RpbmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5cbiBzb2NrYWRkcjpcbiAtIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGFkZHJlc3MgZm9ybWF0LiBPbiB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBvbmx5IEFGX0lORVQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuXG4gLSBzb2NrZXQgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGVuZ3RoIGRlcGVuZHMgb24gdGhlIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQKICAgIFxwYXJhbVtpbl0gdG9sZW4gICAgICAgICAgICBEZXN0aW5hdGlvbiBhZGRyZXNzIHN0cnVjdHVyZSBzaXplIAogICAgCiAgICBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgWmVybyBvbiBzdWNjZXNzLCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKICAgIAogICAgXHNhICAgICBzbF9TZW5kCiAgICBcbm90ZSAgICAgICAgICAgICAgICAgICAgICAgQmVsb25ncyB0byBccmVmIHNlbmRfYXBpCiAgICBcd2FybmluZwogICAgXHBhciAgICAgICAgRXhhbXBsZQoKICAgIC0gU2VuZGluZyBkYXRhOgogICAgXGNvZGUKICAgICAgICBTbFNvY2tBZGRySW5fdCAgQWRkcjsKICAgICAgICBfaTE2IEFkZHJTaXplID0gc2l6ZW9mKFNsU29ja0FkZHJJbl90KTsKICAgICAgICBfaTE2IFNvY2tJRDsKICAgICAgICBfaTE2IFN0YXR1czsKICAgICAgICBfaTggQnVmW1NFTkRfQlVGX0xFTl07CgogICAgICAgIEFkZHIuc2luX2ZhbWlseSA9IFNMX0FGX0lORVQ7CiAgICAgICAgQWRkci5zaW5fcG9ydCA9IHNsX0h0b25zKDUwMDEpOwogICAgICAgIEFkZHIuc2luX2FkZHIuc19hZGRyID0gc2xfSHRvbmwoU0xfSVBWNF9WQUwoMTAsMSwxLDIwMCkpOwoKICAgICAgICBTb2NrSUQgPSBzbF9Tb2NrZXQoU0xfQUZfSU5FVCxTTF9TT0NLX0RHUkFNLCAwKTsKICAgICAgICBTdGF0dXMgPSBzbF9TZW5kVG8oU29ja0lELCBCdWYsIDE0NzIsIDAsIChTbFNvY2tBZGRyX3QgKikmQWRkciwgQWRkclNpemUpOwogICAgXGVuZGNvZGUKKi8KI2lmIF9TTF9JTkNMVURFX0ZVTkMoc2xfU2VuZFRvKQpfaTE2IHNsX1NlbmRUbyhfaTE2IHNkLCBjb25zdCB2b2lkICpidWYsIF9pMTYgbGVuLCBfaTE2IGZsYWdzLCBjb25zdCBTbFNvY2tBZGRyX3QgKnRvLCBTbFNvY2tsZW5fdCB0b2xlbik7CiNlbmRpZgoKLyohCiAgICBcYnJpZWYgUmVvcmRlciB0aGUgYnl0ZXMgb2YgYSAzMi1iaXQgdW5zaWduZWQgdmFsdWUKICAgIAogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIFJlb3JkZXIgdGhlIGJ5dGVzIG9mIGEgMzItYml0IHVuc2lnbmVkIHZhbHVlIGZyb20gcHJvY2Vzc29yIG9yZGVyIHRvIG5ldHdvcmsgb3JkZXIuCiAgICAgCiAgICBccGFyYW1baW5dIHZhbCAgICAgICAgICAgICAgVmFyaWFibGUgdG8gcmVvcmRlciAKICAgIAogICAgXHJldHVybiAgICAgICAgICAgICAgICAgICAgIFJldHVybiB0aGUgcmVvcmRlciB2YXJpYWJsZSwgCiAgICAKICAgIFxzYSAgICAgc2xfU2VuZFRvICBzbF9CaW5kICBzbF9Db25uZWN0ICBzbF9SZWN2RnJvbSAgc2xfQWNjZXB0CiAgICBcbm90ZSAgICAgICAgICAgICAgICAgICAgICAgQmVsb25ncyB0byBccmVmIHNlbmRfYXBpCiAgICBcd2FybmluZyAgIAoqLwojaWYgX1NMX0lOQ0xVREVfRlVOQyhzbF9IdG9ubCApCl91MzIgc2xfSHRvbmwoIF91MzIgdmFsICk7CgojZGVmaW5lIHNsX050b2hsIHNsX0h0b25sICAvKiBSZW9yZGVyIHRoZSBieXRlcyBvZiBhIDE2LWJpdCB1bnNpZ25lZCB2YWx1ZSBmcm9tIG5ldHdvcmsgb3JkZXIgdG8gcHJvY2Vzc29yIG9yZGUuICovCiNlbmRpZgoKLyohCiAgICBcYnJpZWYgUmVvcmRlciB0aGUgYnl0ZXMgb2YgYSAxNi1iaXQgdW5zaWduZWQgdmFsdWUKICAgIAogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIFJlb3JkZXIgdGhlIGJ5dGVzIG9mIGEgMTYtYml0IHVuc2lnbmVkIHZhbHVlIGZyb20gcHJvY2Vzc29yIG9yZGVyIHRvIG5ldHdvcmsgb3JkZXIuCiAgICAgCiAgICBccGFyYW1baW5dIHZhbCAgICAgICAgICAgICAgVmFyaWFibGUgdG8gcmVvcmRlciAKICAgIAogICAgXHJldHVybiAgICAgICAgICAgICAgICAgICAgIFJldHVybiB0aGUgcmVvcmRlciB2YXJpYWJsZSwgCiAgICAKICAgIFxzYSAgICAgc2xfU2VuZFRvICBzbF9CaW5kICAgIHNsX0Nvbm5lY3QgIHNsX1JlY3ZGcm9tICBzbF9BY2NlcHQKICAgIFxub3RlICAgICAgICAgICAgICAgICAgICAgICBCZWxvbmdzIHRvIFxyZWYgc2VuZF9hcGkKICAgIFx3YXJuaW5nICAgCiovCiNpZiBfU0xfSU5DTFVERV9GVU5DKHNsX0h0b25zICkKX3UxNiBzbF9IdG9ucyggX3UxNiB2YWwgKTsKCiNkZWZpbmUgc2xfTnRvaHMgc2xfSHRvbnMgICAvKiBSZW9yZGVyIHRoZSBieXRlcyBvZiBhIDE2LWJpdCB1bnNpZ25lZCB2YWx1ZSBmcm9tIG5ldHdvcmsgb3JkZXIgdG8gcHJvY2Vzc29yIG9yZGUuICovCiNlbmRpZgoKCi8qIQoKIENsb3NlIHRoZSBEb3h5Z2VuIGdyb3VwLgogQH0KCiAqLwoKCiNpZmRlZiAgX19jcGx1c3BsdXMKfQojZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KCiNlbmRpZiAvKiBfX1NPQ0tFVF9IX18gKi8KCgo=