LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBTQU0gU29mdHdhcmUgUGFja2FnZSBMaWNlbnNlDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBDb3B5cmlnaHQgKGMpIDIwMTQzLCBBdG1lbCBDb3Jwb3JhdGlvbg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAqDQogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZGlzY2xhaW1lciBiZWxvdy4NCiAqDQogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0KICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUg0KICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVCBBUkUNCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQogKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwNCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQogKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsDQogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQoNCi8qKiBcYWRkdG9ncm91cCBkZHJkX21vZHVsZQ0KICoNCiAqIFRoZSBERFIvU0RSIFNEUkFNIENvbnRyb2xsZXIgKEREUlNEUkMpIGlzIGEgbXVsdGlwb3J0IG1lbW9yeSBjb250cm9sbGVyLiBJdCBjb21wcmlzZXMNCiAqIGZvdXIgc2xhdmUgQUhCIGludGVyZmFjZXMuIEFsbCBzaW11bHRhbmVvdXMgYWNjZXNzZXMgKGZvdXIgaW5kZXBlbmRlbnQgQUhCIHBvcnRzKSBhcmUgaW50ZXJsZWF2ZWQNCiAqIHRvIG1heGltaXplIG1lbW9yeSBiYW5kd2lkdGggYW5kIG1pbmltaXplIHRyYW5zYWN0aW9uIGxhdGVuY3kgZHVlIHRvIFNEUkFNIHByb3RvY29sLg0KICoNCiAqIFxzZWN0aW9uIGRkcjIgQ29uZmlndXJlcyBERFIyDQogKg0KICogVGhlIEREUjItU0RSQU0gZGV2aWNlcyBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToNCiAqIDx1bD4NCiAqIDxsaT4gRUJJIENoaXAgU2VsZWN0IDEgaXMgYXNzaWduZWQgdG8gdGhlIEREUjJTRFIgQ29udHJvbGxlciwgRW5hYmxlIEREUjIgY2xvY2sgeDIgaW4gUE1DLjwvbGk+DQogKiA8bGk+IFN0ZXAgMTogUHJvZ3JhbSB0aGUgbWVtb3J5IGRldmljZSB0eXBlPC9saT4NCiAqIDxsaT4gU3RlcCAyOg0KICogIC0jIFByb2dyYW0gdGhlIGZlYXR1cmVzIG9mIEREUjItU0RSQU0gZGV2aWNlIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuDQogKiAgLSMgUHJvZ3JhbSB0aGUgZmVhdHVyZXMgb2YgRERSMi1TRFJBTSBkZXZpY2UgaW50byB0aGUgVGltaW5nIFJlZ2lzdGVyIEhERFJTRFJDMl9UMFBSLg0KICogIC0jIFByb2dyYW0gdGhlIGZlYXR1cmVzIG9mIEREUjItU0RSQU0gZGV2aWNlIGludG8gdGhlIFRpbWluZyBSZWdpc3RlciBIRERSU0RSQzJfVDFQUi4NCiAqICAtIyBQcm9ncmFtIHRoZSBmZWF0dXJlcyBvZiBERFIyLVNEUkFNIGRldmljZSBpbnRvIHRoZSBUaW1pbmcgUmVnaXN0ZXIgSEREUlNEUkMyX1QyUFIuIDwvbGk+DQogKiA8bGk+IFN0ZXAgMzogQW4gTk9QIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBERFIyLVNEUkFNIHRvIGVuYWJsZSBjbG9jay4gPC9saT4NCiAqIDxsaT4gU3RlcCA0OiAgQW4gTk9QIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBERFIyLVNEUkFNIDwvbGk+DQogKiA8bGk+IFN0ZXAgNTogQW4gYWxsIGJhbmtzIHByZWNoYXJnZSBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgRERSMi1TRFJBTS4gPC9saT4NCiAqIDxsaT4gU3RlcCA2OiBBbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUzIpIGN5Y2xlIGlzICBpc3N1ZWQgdG8gY2hvc2UgYmV0d2VlbiBjb21tZXJjaWFsb3IgaGlnaCAgdGVtcGVyYXR1cmUgb3BlcmF0aW9ucy48L2xpPg0KICogPGxpPiBTdGVwIDc6IEFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTMykgY3ljbGUgaXMgaXNzdWVkIHRvIHNldCBhbGwgcmVnaXN0ZXJzIHRvIDAuIDwvbGk+DQogKiA8bGk+IFN0ZXAgODogIEFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTMSkgY3ljbGUgaXMgaXNzdWVkIHRvIGVuYWJsZSBETEwuPC9saT4NCiAqIDxsaT4gU3RlcCA5OiAgUHJvZ3JhbSBETEwgZmllbGQgaW50byB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci48L2xpPg0KICogPGxpPiBTdGVwIDEwOiBBIE1vZGUgUmVnaXN0ZXIgc2V0IChNUlMpIGN5Y2xlIGlzIGlzc3VlZCB0byByZXNldCBETEwuPC9saT4NCiAqIDxsaT4gU3RlcCAxMTogQW4gYWxsIGJhbmtzIHByZWNoYXJnZSBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgRERSMi1TRFJBTS48L2xpPg0KICogPGxpPiBTdGVwIDEyOiBUd28gYXV0by1yZWZyZXNoIChDQlIpIGN5Y2xlcyBhcmUgcHJvdmlkZWQuIFByb2dyYW0gdGhlIGF1dG8gcmVmcmVzaCBjb21tYW5kIChDQlIpIGludG8gdGhlIE1vZGUgUmVnaXN0ZXIuPC9saT4NCiAqIDxsaT4gU3RlcCAxMzogUHJvZ3JhbSBETEwgZmllbGQgaW50byB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciB0byBsb3coRGlzYWJsZSBETEwgcmVzZXQpLjwvbGk+DQogKiA8bGk+IFN0ZXAgMTQ6IEEgTW9kZSBSZWdpc3RlciBzZXQgKE1SUykgY3ljbGUgaXMgaXNzdWVkIHRvIHByb2dyYW0gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIEREUjItU0RSQU0gZGV2aWNlcy48L2xpPg0KICogPGxpPiBTdGVwIDE1OiBQcm9ncmFtIE9DRCBmaWVsZCBpbnRvIHRoZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIHRvIGhpZ2ggKE9DRCBjYWxpYnJhdGlvbiBkZWZhdWx0KS4gPC9saT4NCiAqIDxsaT4gU3RlcCAxNjogQW4gRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciBzZXQgKEVNUlMxKSBjeWNsZSBpcyBpc3N1ZWQgdG8gT0NEIGRlZmF1bHQgdmFsdWUuPC9saT4NCiAqIDxsaT4gU3RlcCAxNzogUHJvZ3JhbSBPQ0QgZmllbGQgaW50byB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciB0byBsb3cgKE9DRCBjYWxpYnJhdGlvbiBtb2RlIGV4aXQpLjwvbGk+DQogKiA8bGk+IFN0ZXAgMTg6IEFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTMSkgY3ljbGUgaXMgaXNzdWVkIHRvIGVuYWJsZSBPQ0QgZXhpdC48L2xpPg0KICogPGxpPiBTdGVwIDE5LDIwOiBBIG1vZGUgTm9ybWFsIGNvbW1hbmQgaXMgcHJvdmlkZWQuIFByb2dyYW0gdGhlIE5vcm1hbCBtb2RlIGludG8gTW9kZSBSZWdpc3Rlci48L2xpPg0KICogPGxpPiBTdGVwIDIxOiBXcml0ZSB0aGUgcmVmcmVzaCByYXRlIGludG8gdGhlIGNvdW50IGZpZWxkIGluIHRoZSBSZWZyZXNoIFRpbWVyIHJlZ2lzdGVyLiBUaGUgRERSMi1TRFJBTSBkZXZpY2UgcmVxdWlyZXMgYSByZWZyZXNoIGV2ZXJ5IDE1LjYyNSBvciA3LjgxLiA8L2xpPg0KICogPC91bD4NCiovDQovKkB7Ki8NCi8qQH0qLw0KDQovKiogXGFkZHRvZ3JvdXAgc2RyYW1fbW9kdWxlDQogKg0KICogXHNlY3Rpb24gc2RyYW0gQ29uZmlndXJlcyBTRFJBTQ0KICoNCiAqIFRoZSBTRFItU0RSQU0gZGV2aWNlcyBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToNCiAqIDx1bD4NCiAqIDxsaT4gRUJJIENoaXAgU2VsZWN0IDEgaXMgYXNzaWduZWQgdG8gdGhlIEREUjJTRFIgQ29udHJvbGxlciwgRW5hYmxlIEREUjIgY2xvY2sgeDIgaW4gUE1DLjwvbGk+DQogKiA8bGk+IFN0ZXAgMS4gUHJvZ3JhbSB0aGUgbWVtb3J5IGRldmljZSB0eXBlIGludG8gdGhlIE1lbW9yeSBEZXZpY2UgUmVnaXN0ZXI8L2xpPg0KICogPGxpPiBTdGVwIDIuIFByb2dyYW0gdGhlIGZlYXR1cmVzIG9mIHRoZSBTRFItU0RSQU0gZGV2aWNlIGludG8gdGhlIFRpbWluZyBSZWdpc3RlciBhbmQgaW50byB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci48L2xpPg0KICogPGxpPiBTdGVwIDMuIEZvciBsb3ctcG93ZXIgU0RSQU0sIHRlbXBlcmF0dXJlLWNvbXBlbnNhdGVkIHNlbGYgcmVmcmVzaCAoVENTUiksIGRyaXZlIHN0cmVuZ3RoIChEUykgYW5kIHBhcnRpYWwgYXJyYXkgc2VsZiByZWZyZXNoIChQQVNSKSBtdXN0IGJlIHNldCBpbiB0aGUgTG93LXBvd2VyIFJlZ2lzdGVyLjwvbGk+DQogKiA8bGk+IFN0ZXAgNC4gQSBOT1AgY29tbWFuZCBpcyBpc3N1ZWQgdG8gdGhlIFNEUi1TRFJBTS4gUHJvZ3JhbSBOT1AgY29tbWFuZCBpbnRvIE1vZGUgUmVnaXN0ZXIsIHRoZSBhcHBsaWNhdGlvbiBtdXN0DQogKiBzZXQgTW9kZSB0byAxIGluIHRoZSBNb2RlIFJlZ2lzdGVyLiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBTRFItU0RSQU0gYWRkcmVzcyB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQuDQogKiBOb3cgdGhlIGNsb2NrIHdoaWNoIGRyaXZlcyBTRFItU0RSQU0gZGV2aWNlIGlzIGVuYWJsZWQuPC9saT4NCiAqIDxsaT4gU3RlcCA1LiBBbiBhbGwgYmFua3MgcHJlY2hhcmdlIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBTRFItU0RSQU0uIFByb2dyYW0gYWxsIGJhbmtzIHByZWNoYXJnZSBjb21tYW5kIGludG8gTW9kZSBSZWdpc3RlciwgdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0IE1vZGUgdG8gMiBpbiB0aGUNCiAqIE1vZGUgUmVnaXN0ZXIgLiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBTRFJTRFJBTSBhZGRyZXNzIHRvIGFja25vd2xlZGdlIHRoaXMgY29tbWFuZC48L2xpPg0KICogPGxpPiBTdGVwIDYuIEVpZ2h0IGF1dG8tcmVmcmVzaCAoQ0JSKSBjeWNsZXMgYXJlIHByb3ZpZGVkLiBQcm9ncmFtIHRoZSBhdXRvIHJlZnJlc2ggY29tbWFuZCAoQ0JSKSBpbnRvIE1vZGUgUmVnaXN0ZXIsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCBNb2RlIHRvIDQgaW4gdGhlIE1vZGUgUmVnaXN0ZXIuDQogKiBPbmNlIGluIHRoZSBpZGxlIHN0YXRlLCB0d28gQVVUTyBSRUZSRVNIIGN5Y2xlcyBtdXN0IGJlIHBlcmZvcm1lZC48L2xpPg0KICogPGxpPiBTdGVwIDcuIEEgTW9kZSBSZWdpc3RlciBzZXQgKE1SUykgY3ljbGUgaXMgaXNzdWVkIHRvIHByb2dyYW0gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIFNEUlNEUkFNDQogKiBkZXZpY2VzLCBpbiBwYXJ0aWN1bGFyIENBUyBsYXRlbmN5IGFuZCBidXJzdCBsZW5ndGguIDwvbGk+DQogKiA8bGk+IFN0ZXAgOC4gRm9yIGxvdy1wb3dlciBTRFItU0RSQU0gaW5pdGlhbGl6YXRpb24sIGFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTKSBjeWNsZSBpcyBpc3N1ZWQgdG8gcHJvZ3JhbSB0aGUgU0RSLVNEUkFNIHBhcmFtZXRlcnMgKFRDU1IsIFBBU1IsIERTKS4gVGhlIHdyaXRlDQogKiBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMV0gaXMgc2V0IHRvIDEgYW5kIEJBWzBdIGlzIHNldCB0byAwIDwvbGk+DQogKiA8bGk+IFN0ZXAgOS4gVGhlIGFwcGxpY2F0aW9uIG11c3QgZ28gaW50byBOb3JtYWwgTW9kZSwgc2V0dGluZyBNb2RlIHRvIDAgaW4gdGhlIE1vZGUgUmVnaXN0ZXIgYW5kIHBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgYXQgYW55IGxvY2F0aW9uIGluIHRoZSBTRFJBTSB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQuPC9saT4NCiAqIDxsaT4gU3RlcCAxMC4gV3JpdGUgdGhlIHJlZnJlc2ggcmF0ZSBpbnRvIHRoZSBjb3VudCBmaWVsZCBpbiB0aGUgRERSU0RSQyBSZWZyZXNoIFRpbWVyIHJlZ2lzdGVyIDwvbGk+DQoqIDwvdWw+DQoqLw0KLypAeyovDQovKkB9Ki8NCg0KDQoNCi8qKg0KICogXGZpbGUNCiAqDQogKiBJbXBsZW1lbnRhdGlvbiBvZiBtZW1vcmllcyBjb25maWd1cmF0aW9uIG9uIGJvYXJkLg0KICoNCiAqLw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgIEhlYWRlcnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAiYm9hcmQuaCINCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqIFxicmllZiBDaGFuZ2VzIHRoZSBtYXBwaW5nIG9mIHRoZSBjaGlwIHNvIHRoYXQgdGhlIHJlbWFwIGFyZWEgbWlycm9ycyB0aGUNCiAqIGludGVybmFsIFJPTSBvciB0aGUgRUJJIENTMC4NCiAqLw0Kdm9pZCBCT0FSRF9SZW1hcFJvbSggdm9pZCApDQp7DQogICAgQVhJTVgtPkFYSU1YX1JFTUFQID0gMDsNCn0NCg0KLyoqDQogKiBcYnJpZWYgQ2hhbmdlcyB0aGUgbWFwcGluZyBvZiB0aGUgY2hpcCBzbyB0aGF0IHRoZSByZW1hcCBhcmVhIG1pcnJvcnMgdGhlDQogKiBpbnRlcm5hbCBSQU0uDQogKi8NCg0Kdm9pZCBCT0FSRF9SZW1hcFJhbSggdm9pZCApDQp7DQogICAgQVhJTVgtPkFYSU1YX1JFTUFQID0gQVhJTVhfUkVNQVBfUkVNQVAwOw0KfQ0KDQovKioNCiAqIFxicmllZiBJbml0aWFsaXplIFZkZCBFQkkgZHJpdmUNCiAqIFxwYXJhbSAwOiAxLjhWIDE6IDMuM1YNCiAqLw0Kdm9pZCBCT0FSRF9Db25maWd1cmVWZGRNZW1TZWwoIHVpbnQ4X3QgVmRkTWVtU2VsICkNCnsNCgkoIHZvaWQgKSBWZGRNZW1TZWw7DQp9DQoNCiNkZWZpbmUgRERSMl9CQTAocikgKDEgPDwgKDI2ICsgcikpDQojZGVmaW5lIEREUjJfQkExKHIpICgxIDw8ICgyNyArIHIpKQ0KDQojZGVmaW5lIEg2NE1YX0REUl9TTEFWRV9QT1JUMCAgIDMNCg0Kc3RhdGljIHZvaWQgbWF0cml4X2NvbmZpZ3VyZV9zbGF2ZV9kZHIodm9pZCkNCnsNCiAgICAgaW50IGRkcl9wb3J0Ow0KDQogICAgIC8qIERpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiAqLw0KICAgICBNQVRSSVgwLT5NQVRSSVhfV1BNUiA9IE1QRERSQ19XUE1SX1dQS0VZX1BBU1NXRDsNCg0KICAgICAvKiBQYXJ0aXRpb24gaW50ZXJuYWwgU1JBTSAqLw0KICAgICBNQVRSSVgwLT5NQVRSSVhfU1NSWzExXSAgID0gMDsNCiAgICAgTUFUUklYMC0+TUFUUklYX1NSVFNSWzExXSA9IDB4MDU7DQogICAgIE1BVFJJWDAtPk1BVFJJWF9TQVNTUlsxMV0gPSAweDA0Ow0KDQogICAgIGRkcl9wb3J0ID0gMTsNCg0KICAgICAvKiBQYXJ0aXRpb24gZXh0ZXJuYWwgRERSICovDQogICAgIC8qIEREUiBwb3J0IDAgbm90IHVzZWQgZnJvbSBOV2QgKi8NCiAgICAgZm9yIChkZHJfcG9ydCA9IDEgOyBkZHJfcG9ydCA8IDggOyBkZHJfcG9ydCsrKSB7DQogICAgICAgICAgIE1BVFJJWDAtPk1BVFJJWF9TU1JbSDY0TVhfRERSX1NMQVZFX1BPUlQwICsgZGRyX3BvcnRdICAgPSAweDAwRkZGRkZGOw0KICAgICAgICAgICBNQVRSSVgwLT5NQVRSSVhfU1JUU1JbSDY0TVhfRERSX1NMQVZFX1BPUlQwICsgZGRyX3BvcnRdID0gMHgwMDAwMDAwRjsNCiAgICAgICAgICAgTUFUUklYMC0+TUFUUklYX1NBU1NSW0g2NE1YX0REUl9TTEFWRV9QT1JUMCArIGRkcl9wb3J0XSA9IDB4MDAwMEZGRkY7DQogICAgIH0NCn0NCg0KI2RlZmluZSBNQVRSSVhfS0VZX1ZBTCAoMHg0RDQxNTR1KQ0KDQpzdGF0aWMgdm9pZCBtYXRyaXhfY29uZmlndXJlX3NsYXZlX25hbmQodm9pZCkNCnsNCiAgICAvKiBEaXNhYmxlIHdyaXRlIHByb3RlY3Rpb24gKi8NCiAgICBNQVRSSVgwLT5NQVRSSVhfV1BNUiA9IE1BVFJJWF9XUE1SX1dQS0VZKE1BVFJJWF9LRVlfVkFMKTsNCiAgICBNQVRSSVgxLT5NQVRSSVhfV1BNUiA9IE1BVFJJWF9XUE1SX1dQS0VZKE1BVFJJWF9LRVlfVkFMKTsNCg0KICAgIC8qIFBhcnRpdGlvbiBpbnRlcm5hbCBTUkFNICovDQogICAgTUFUUklYMC0+TUFUUklYX1NTUlsxMV0gICA9IDB4MDAwMTAxMDE7DQogICAgTUFUUklYMC0+TUFUUklYX1NSVFNSWzExXSA9IDB4MDU7DQogICAgTUFUUklYMC0+TUFUUklYX1NBU1NSWzExXSA9IDB4MDU7DQoNCiAgICBNQVRSSVgxLT5NQVRSSVhfU1JUU1JbM10gPSAweEJCQkJCQkJCOw0KICAgIE1BVFJJWDEtPk1BVFJJWF9TU1JbM10gICA9IDB4MDBGRkZGRkY7DQogICAgTUFUUklYMS0+TUFUUklYX1NBU1NSWzNdID0gMHhCQkJCQkJCQjsNCg0KICAgIE1BVFJJWDEtPk1BVFJJWF9TUlRTUls0XSA9IDB4MDE7DQogICAgTUFUUklYMS0+TUFUUklYX1NTUls0XSAgID0gMHgwMEZGRkZGRjsNCiAgICBNQVRSSVgxLT5NQVRSSVhfU0FTU1JbNF0gPSAweDAxOw0KICAgIE1BVFJJWDEtPk1BVFJJWF9NRUlFUiA9IDB4M0ZGOw0KfQ0KDQovKioNCiAqIFxicmllZiBDb25maWd1cmVzIEREUjIgKE1UNDdIMTI4TTE2UlQgMTI4TUIvIE1UNDdINjRNMTZIUikNCiBNVDQ3SDY0TTE2SFIgOiA4IE1lZyB4IDE2IHggOCBiYW5rcw0KIFJlZnJlc2ggY291bnQ6IDhLDQogUm93IGFkZHJlc3M6IEFbMTI6MF0gKDhLKQ0KIENvbHVtbiBhZGRyZXNzIEFbOTowXSAoMUspDQogQmFuayBhZGRyZXNzIEJBWzI6MF0gYSgyNCwyNSkgKDgpDQogKi8NCnZvaWQgQk9BUkRfQ29uZmlndXJlRGRyYW0oIHZvaWQgKQ0Kew0KICAgIHZvbGF0aWxlIHVpbnQ4X3QgKnBEZHIgPSAodWludDhfdCAqKSBERFJfQ1NfQUREUjsNCiAgICB2b2xhdGlsZSB1aW50MzJfdCBpOw0KDQogICAgdm9sYXRpbGUgdWludDMyX3QgZHVtbXlfdmFsdWU7DQoNCiAgICBtYXRyaXhfY29uZmlndXJlX3NsYXZlX2RkcigpOw0KDQogICAgLyogRW5hYmxlIEREUjIgY2xvY2sgeDIgaW4gUE1DICovDQogICAgUE1DLT5QTUNfUENFUjAgPSAoMSA8PCAoSURfTVBERFJDKSk7DQogICAgUE1DLT5QTUNfU0NFUiAgfD0gUE1DX1NDRVJfRERSQ0s7DQoNCiAgICAvKiBNUEREUkMgSS9PIENhbGlicmF0aW9uIFJlZ2lzdGVyICovDQogICAgZHVtbXlfdmFsdWUgID0gIE1QRERSQy0+TVBERFJDX0lPX0NBTElCUjsNCiAgICBkdW1teV92YWx1ZSAmPSB+TVBERFJDX0lPX0NBTElCUl9SRElWX01zazsNCiAgICBkdW1teV92YWx1ZSAmPSB+TVBERFJDX0lPX0NBTElCUl9UWlFJT19Nc2s7DQogICAgZHVtbXlfdmFsdWUgfD0gTVBERFJDX0lPX0NBTElCUl9DQUxDT0RFUCg3KTsNCiAgICBkdW1teV92YWx1ZSB8PSBNUEREUkNfSU9fQ0FMSUJSX0NBTENPREVOKDgpOw0KICAgIGR1bW15X3ZhbHVlIHw9IE1QRERSQ19JT19DQUxJQlJfUkRJVl9SWlFfNjBfUlpRXzUwOw0KICAgIGR1bW15X3ZhbHVlIHw9IE1QRERSQ19JT19DQUxJQlJfVFpRSU8oNSk7DQogICAgZHVtbXlfdmFsdWUgfD0gTVBERFJDX0lPX0NBTElCUl9FTl9DQUxJQl9FTkFCTEVfQ0FMSUJSQVRJT047DQogICAgTVBERFJDLT5NUEREUkNfSU9fQ0FMSUJSID0gZHVtbXlfdmFsdWU7DQoNCiAgICAvKiBTdGVwIDE6IFByb2dyYW0gdGhlIG1lbW9yeSBkZXZpY2UgdHlwZSAqLw0KICAgIC8qIERCVyA9IDAgKDMyIGJpdHMgYnVzIHdpZGUpOyBNZW1vcnkgRGV2aWNlID0gNiA9IEREUjItU0RSQU0gPSAweDAwMDAwMDA2Ki8NCg0KICAgIE1QRERSQy0+TVBERFJDX01EICAgPSAgTVBERFJDX01EX01EX0REUjJfU0RSQU0gfCBNUEREUkNfTURfREJXX0RCV18zMl9CSVRTOw0KDQogICAgTVBERFJDLT5NUEREUkNfUkRfREFUQV9QQVRIID0gTVBERFJDX1JEX0RBVEFfUEFUSF9TSElGVF9TQU1QTElOR19TSElGVF9PTkVfQ1lDTEU7DQoNCiAgICAvKiBTdGVwIDI6IFByb2dyYW0gdGhlIGZlYXR1cmVzIG9mIEREUjItU0RSQU0gZGV2aWNlIGludG8gdGhlIFRpbWluZyBSZWdpc3Rlci4qLw0KICAgIE1QRERSQy0+TVBERFJDX0NSICAgID0gTVBERFJDX0NSX05SXzE0X1JPV19CSVRTICAgICB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfTkNfMTBfQ09MX0JJVFMgICAgIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9DQVNfRERSX0NBUzMgICAgICAgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX0NSX0RMTF9SRVNFVF9ESVNBQkxFRCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfRFFNU19OT1RfU0hBUkVEICAgIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9FTlJETV9PRkYgICAgICAgICAgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX0NSX05CXzhfQkFOS1MgICAgICAgICB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICBNUEREUkNfQ1JfTkRRU19ESVNBQkxFRCAgICAgIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRERSQ19DUl9VTkFMX1NVUFBPUlRFRCAgICAgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBERFJDX0NSX09DRF9ERFIyX0VYSVRDQUxJQjsNCg0KICAgIE1QRERSQy0+TVBERFJDX1RQUjAgPSBNUEREUkNfVFBSMF9UUkFTKDgpICAgIC8vICA0MCBucw0KICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMF9UUkNEKDMpICAgIC8vICAxMi41IG5zDQogICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIwX1RXUigzKSAgICAgLy8gIDE1IG5zDQogICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIwX1RSQygxMCkgICAgLy8gIDU1IG5zDQogICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIwX1RSUCgzKSAgICAgLy8gIDEyLjUgbnMNCiAgICAgICAgICAgICAgICAgICAgICAgIHwgTVBERFJDX1RQUjBfVFJSRCgyKSAgICAvLyAgOCBucw0KICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMF9UV1RSKDIpICAgIC8vICAyIGNsb2NrIGN5Y2xlDQogICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIwX1RNUkQoMik7ICAgLy8gIDIgY2xvY2sgY3ljbGVzDQoNCg0KICAgIE1QRERSQy0+TVBERFJDX1RQUjEgPSBNUEREUkNfVFBSMV9UUkZDKDIzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMV9UWFNOUigyNSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHwgTVBERFJDX1RQUjFfVFhTUkQoMjAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMV9UWFAoMik7DQoNCiAgICBNUEREUkMtPk1QRERSQ19UUFIyID0gTVBERFJDX1RQUjJfVFhBUkQoOCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMl9UWEFSRFMoMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNUEREUkNfVFBSMl9UUlBBKDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgIHwgTVBERFJDX1RQUjJfVFJUUCgyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1QRERSQ19UUFIyX1RGQVcoNyk7DQoNCiAgICAvKiBERFJTRFJDIExvdy1wb3dlciBSZWdpc3RlciAqLw0KICAgIGZvciAoaSA9IDA7IGkgPCAxMzMwMDsgaSsrKSB7DQogICAgICAgIGFzbSgibm9wIik7DQogICAgfQ0KDQovKiBTdGVwIDM6IEFuIE5PUCBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgRERSMi1TRFJBTS4gUHJvZ3JhbSB0aGUgTk9QIGNvbW1hbmQgaW50bw0KICAgIHRoZSBNb2RlIFJlZ2lzdGVyLCB0aGUgYXBwbGljYXRpb24gbXVzdCBzZXQgTU9ERSB0byAxIGluIHRoZSBNb2RlIFJlZ2lzdGVyLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX01SID0gTVBERFJDX01SX01PREVfTk9QX0NNRDsNCiAgICAvKiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBERFIyLVNEUkFNIGFkZHJlc3MgdG8gYWNrbm93bGVkZ2UgdGhpcyBjb21tYW5kICovDQogICAgKnBEZHIgPSAwOyAgLyogTm93IGNsb2NrcyB3aGljaCBkcml2ZSBERFIyLVNEUkFNIGRldmljZSBhcmUgZW5hYmxlZC4qLw0KDQogICAgLyogQSBtaW5pbXVtIHBhdXNlIG9mIDIwMCCmzHMgaXMgcHJvdmlkZWQgdG8gcHJlY2VkZSBhbnkgc2lnbmFsIHRvZ2dsZS4gKDYgY29yZSBjeWNsZXMgcGVyIGl0ZXJhdGlvbiwgY29yZSBpcyBhdCAzOTZNSHo6IG1pbiAxMzIwMCBsb29wcykgKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTMzMDA7IGkrKykgew0KICAgICAgICBhc20oIm5vcCIpOw0KICAgIH0NCg0KLyogU3RlcCA0OiAgQW4gTk9QIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBERFIyLVNEUkFNICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9OT1BfQ01EOw0KICAgIC8qIFBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IEREUjItU0RSQU0gYWRkcmVzcyB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQuKi8NCiAgICAqcERkciA9IDA7IC8qIE5vdyBDS0UgaXMgZHJpdmVuIGhpZ2guKi8NCiAgICAvKiB3YWl0IDQwMCBucyBtaW4gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQoNCi8qIFN0ZXAgNTogQW4gYWxsIGJhbmtzIHByZWNoYXJnZSBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgRERSMi1TRFJBTS4gKi8NCiAgICBNUEREUkMtPk1QRERSQ19NUiA9IE1QRERSQ19NUl9NT0RFX1BSQ0dBTExfQ01EOw0KICAgIC8qIFBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IEREUjItU0RSQU0gYWRkcmVzcyB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQuKi8NCiAgICAqcERkciA9IDA7DQogICAgLyogd2FpdCA0MDAgbnMgbWluICovDQogICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7DQogICAgICAgIGFzbSgibm9wIik7DQogICAgfQ0KDQovKiBTdGVwIDY6IEFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTMikgY3ljbGUgaXMgIGlzc3VlZCB0byBjaG9zZSBiZXR3ZWVuIGNvbW1lcmNpYWxvciBoaWdoICB0ZW1wZXJhdHVyZSBvcGVyYXRpb25zLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX01SID0gTVBERFJDX01SX01PREVfRVhUX0xNUl9DTUQ7DQogICAgKigodWludDhfdCAqKShwRGRyICsgRERSMl9CQTEoMCkpKSA9IDA7IC8qIFRoZSB3cml0ZSBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMV0gaXMgc2V0IHRvIDEgYW5kIEJBWzBdIGlzIHNldCB0byAwLiAqLw0KICAgIC8qIHdhaXQgMiBjeWNsZXMgbWluICovDQogICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7DQogICAgICAgIGFzbSgibm9wIik7DQogICAgfQ0KDQovKiBTdGVwIDc6IEFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTMykgY3ljbGUgaXMgaXNzdWVkIHRvIHNldCBhbGwgcmVnaXN0ZXJzIHRvIDAuICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9FWFRfTE1SX0NNRDsNCiAgICAqKCh1aW50OF90ICopKHBEZHIgKyBERFIyX0JBMSgwKSArIEREUjJfQkEwKDApKSkgPSAwOyAgLyogVGhlIHdyaXRlIGFkZHJlc3MgbXVzdCBiZSBjaG9zZW4gc28gdGhhdCBCQVsxXSBpcyBzZXQgdG8gMSBhbmQgQkFbMF0gaXMgc2V0IHRvIDEuKi8NCiAgICAvKiB3YWl0IDIgY3ljbGVzIG1pbiAqLw0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgew0KICAgICAgICBhc20oIm5vcCIpOw0KICAgIH0NCg0KIC8qIFN0ZXAgODogIEFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTMSkgY3ljbGUgaXMgaXNzdWVkIHRvIGVuYWJsZSBETEwuICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9FWFRfTE1SX0NNRDsNCiAgICAqKCh1aW50OF90ICopKHBEZHIgKyBERFIyX0JBMCgwKSkpID0gMDsgIC8qIFRoZSB3cml0ZSBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMV0gaXMgc2V0IHRvIDAgYW5kIEJBWzBdIGlzIHNldCB0byAxLiAqLw0KICAgIC8qIEFuIGFkZGl0aW9uYWwgMjAwIGN5Y2xlcyBvZiBjbG9jayBhcmUgcmVxdWlyZWQgZm9yIGxvY2tpbmcgRExMICovDQogICAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQoNCi8qIFN0ZXAgOTogIFByb2dyYW0gRExMIGZpZWxkIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuKi8NCiAgICBNUEREUkMtPk1QRERSQ19DUiB8PSBNUEREUkNfQ1JfRExMX1JFU0VUX0VOQUJMRUQ7DQoNCi8qIFN0ZXAgMTA6IEEgTW9kZSBSZWdpc3RlciBzZXQgKE1SUykgY3ljbGUgaXMgaXNzdWVkIHRvIHJlc2V0IERMTC4gKi8NCiAgICBNUEREUkMtPk1QRERSQ19NUiA9IE1QRERSQ19NUl9NT0RFX0xNUl9DTUQ7DQogICAgKihwRGRyKSA9IDA7ICAvKiBUaGUgd3JpdGUgYWRkcmVzcyBtdXN0IGJlIGNob3NlbiBzbyB0aGF0IEJBWzE6MF0gYml0cyBhcmUgc2V0IHRvIDAuICovDQogICAgLyogd2FpdCAyIGN5Y2xlcyBtaW4gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQoNCi8qIFN0ZXAgMTE6IEFuIGFsbCBiYW5rcyBwcmVjaGFyZ2UgY29tbWFuZCBpcyBpc3N1ZWQgdG8gdGhlIEREUjItU0RSQU0uICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9QUkNHQUxMX0NNRDsNCiAgICAqKHBEZHIpID0gMDsgIC8qIFBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IEREUjItU0RSQU0gYWRkcmVzcyB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQgKi8NCiAgICAvKiB3YWl0IDIgY3ljbGVzIG1pbiAqLw0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgew0KICAgICAgICBhc20oIm5vcCIpOw0KICAgIH0NCg0KLyogU3RlcCAxMjogVHdvIGF1dG8tcmVmcmVzaCAoQ0JSKSBjeWNsZXMgYXJlIHByb3ZpZGVkLiBQcm9ncmFtIHRoZSBhdXRvIHJlZnJlc2ggY29tbWFuZCAoQ0JSKSBpbnRvIHRoZSBNb2RlIFJlZ2lzdGVyLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX01SID0gTVBERFJDX01SX01PREVfUkZTSF9DTUQ7DQogICAgKihwRGRyKSA9IDA7ICAvKiBQZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBERFIyLVNEUkFNIGFkZHJlc3MgdG8gYWNrbm93bGVkZ2UgdGhpcyBjb21tYW5kICovDQogICAgLyogd2FpdCAyIGN5Y2xlcyBtaW4gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQogICAgLyogQ29uZmlndXJlIDJuZCBDQlIuICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9SRlNIX0NNRDsNCiAgICAqKHBEZHIpID0gMDsgIC8qIFBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IEREUjItU0RSQU0gYWRkcmVzcyB0byBhY2tub3dsZWRnZSB0aGlzIGNvbW1hbmQgKi8NCiAgICAvKiB3YWl0IDIgY3ljbGVzIG1pbiAqLw0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgew0KICAgICAgICBhc20oIm5vcCIpOw0KICAgIH0NCg0KLyogU3RlcCAxMzogUHJvZ3JhbSBETEwgZmllbGQgaW50byB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciB0byBsb3coRGlzYWJsZSBETEwgcmVzZXQpLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX0NSICAgJj0gfk1QRERSQ19DUl9ETExfUkVTRVRfRU5BQkxFRDsNCg0KLyogU3RlcCAxNDogQSBNb2RlIFJlZ2lzdGVyIHNldCAoTVJTKSBjeWNsZSBpcyBpc3N1ZWQgdG8gcHJvZ3JhbSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgRERSMi1TRFJBTSBkZXZpY2VzLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX01SID0gTVBERFJDX01SX01PREVfTE1SX0NNRDsNCiAgICAqKHBEZHIpID0gMDsgIC8qIFRoZSB3cml0ZSBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMTowXSBhcmUgc2V0IHRvIDAuICovDQogICAgLyogd2FpdCAyIGN5Y2xlcyBtaW4gKi8NCiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCiAgICAgICAgYXNtKCJub3AiKTsNCiAgICB9DQoNCi8qIFN0ZXAgMTU6IFByb2dyYW0gT0NEIGZpZWxkIGludG8gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgdG8gaGlnaCAoT0NEIGNhbGlicmF0aW9uIGRlZmF1bHQpLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX0NSICAgfD0gTVBERFJDX0NSX09DRF9ERFIyX0RFRkFVTFRfQ0FMSUI7DQoNCi8qIFN0ZXAgMTY6IEFuIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgc2V0IChFTVJTMSkgY3ljbGUgaXMgaXNzdWVkIHRvIE9DRCBkZWZhdWx0IHZhbHVlLiAqLw0KICAgIE1QRERSQy0+TVBERFJDX01SID0gTVBERFJDX01SX01PREVfRVhUX0xNUl9DTUQ7DQogICAgKigodWludDhfdCAqKShwRGRyICsgRERSMl9CQTAoMCkpKSA9IDA7ICAvKiBUaGUgd3JpdGUgYWRkcmVzcyBtdXN0IGJlIGNob3NlbiBzbyB0aGF0IEJBWzFdIGlzIHNldCB0byAwIGFuZCBCQVswXSBpcyBzZXQgdG8gMS4qLw0KICAgIC8qIHdhaXQgMiBjeWNsZXMgbWluICovDQogICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7DQogICAgICAgIGFzbSgibm9wIik7DQogICAgfQ0KDQovKiBTdGVwIDE3OiBQcm9ncmFtIE9DRCBmaWVsZCBpbnRvIHRoZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIHRvIGxvdyAoT0NEIGNhbGlicmF0aW9uIG1vZGUgZXhpdCkuICovDQogICBNUEREUkMtPk1QRERSQ19DUiAgICY9IH4oTVBERFJDX0NSX09DRF9ERFIyX0RFRkFVTFRfQ0FMSUIpOw0KDQovKiBTdGVwIDE4OiBBbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUzEpIGN5Y2xlIGlzIGlzc3VlZCB0byBlbmFibGUgT0NEIGV4aXQuKi8NCiAgICBNUEREUkMtPk1QRERSQ19NUiA9IE1QRERSQ19NUl9NT0RFX0VYVF9MTVJfQ01EOw0KICAgICooKHVpbnQ4X3QgKikocERkciArIEREUjJfQkEwKDApKSkgPSAwOyAgLyogVGhlIHdyaXRlIGFkZHJlc3MgbXVzdCBiZSBjaG9zZW4gc28gdGhhdCBCQVsxXSBpcyBzZXQgdG8gMCBhbmQgQkFbMF0gaXMgc2V0IHRvIDEuKi8NCiAgICAvKiB3YWl0IDIgY3ljbGVzIG1pbiAqLw0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgew0KICAgICAgICBhc20oIm5vcCIpOw0KICAgIH0NCg0KLyogU3RlcCAxOSwyMDogQSBtb2RlIE5vcm1hbCBjb21tYW5kIGlzIHByb3ZpZGVkLiBQcm9ncmFtIHRoZSBOb3JtYWwgbW9kZSBpbnRvIE1vZGUgUmVnaXN0ZXIuICovDQogICAgTVBERFJDLT5NUEREUkNfTVIgPSBNUEREUkNfTVJfTU9ERV9OT1JNQUxfQ01EOw0KICAgICoocERkcikgPSAwOw0KDQovKiBTdGVwIDIxOiBXcml0ZSB0aGUgcmVmcmVzaCByYXRlIGludG8gdGhlIGNvdW50IGZpZWxkIGluIHRoZSBSZWZyZXNoIFRpbWVyIHJlZ2lzdGVyLiBUaGUgRERSMi1TRFJBTSBkZXZpY2UgcmVxdWlyZXMgYSByZWZyZXNoIGV2ZXJ5IDE1LjYyNSCmzHMgb3IgNy44MSCmzHMuDQogICBXaXRoIGEgMTAwTUh6IGZyZXF1ZW5jeSwgdGhlIHJlZnJlc2ggdGltZXIgY291bnQgcmVnaXN0ZXIgbXVzdCB0byBiZSBzZXQgd2l0aCAoMTUuNjI1IC8xMDAgTUh6KSA9IDE1NjIgaS5lLiAweDA2MUEgb3IgKDcuODEgLzEwME1IeikgPSA3ODEgaS5lLiAweDAzMGQuICovDQogICAgLyogRm9yIE1UNDdINjRNMTZIUiwgVGhlIHJlZnJlc2ggcGVyaW9kIGlzIDY0bXMgKGNvbW1lcmNpYWwpLCBUaGlzIGVxdWF0ZXMgdG8gYW4gYXZlcmFnZQ0KICAgICAgIHJlZnJlc2ggcmF0ZSBvZiA3LjgxMjWmzHMgKGNvbW1lcmNpYWwpLCBUbyBlbnN1cmUgYWxsIHJvd3Mgb2YgYWxsIGJhbmtzIGFyZSBwcm9wZXJseQ0KICAgICAgIHJlZnJlc2hlZCwgODE5MiBSRUZSRVNIIGNvbW1hbmRzIG11c3QgYmUgaXNzdWVkIGV2ZXJ5IDY0bXMgKGNvbW1lcmNpYWwpICovDQogICAgLyogKCg2NCB4IDEwKF4tMykpLzgxOTIpIHgxMzMgeCAoMTBeNikgKi8NCiAgICBNUEREUkMtPk1QRERSQ19SVFIgPSBNUEREUkNfUlRSX0NPVU5UKDB4MmIwKTsgLyogU2V0IFJlZnJlc2ggdGltZXIgNy44MTI1IHVzKi8NCiAgICAvKiBPSyBub3cgd2UgYXJlIHJlYWR5IHRvIHdvcmsgb24gdGhlIEREUlNEUiAqLw0KICAgIC8qIHdhaXQgZm9yIGVuZCBvZiBjYWxpYnJhdGlvbiAqLw0KICAgIGZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgew0KICAgICAgICBhc20oIiAgICBub3AiKTsNCiAgICB9DQp9DQoNCi8qKg0KICogXGJyaWVmIENvbmZpZ3VyZXMgdGhlIEVCSSBmb3IgU2RyYW0gKExQU0RSIE1pY3JvbiBNVDQ4SDhNMTYpIGFjY2Vzcy4NCiAqLw0Kdm9pZCBCT0FSRF9Db25maWd1cmVTZHJhbSggdm9pZCApDQp7DQp9DQoNCi8qKiBcYnJpZWYgQ29uZmlndXJlcyB0aGUgRUJJIGZvciBOYW5kRmxhc2ggYWNjZXNzIGF0IDEzM01oei4NCiAqLw0Kdm9pZCBCT0FSRF9Db25maWd1cmVOYW5kRmxhc2goIHVpbnQ4X3QgYnVzV2lkdGggKQ0Kew0KICAgIFBNQ19FbmFibGVQZXJpcGhlcmFsKElEX0hTTUMpOw0KICAgIG1hdHJpeF9jb25maWd1cmVfc2xhdmVfbmFuZCgpOw0KDQogICBIU01DLT5IU01DX0NTX05VTUJFUlszXS5IU01DX1NFVFVQID0gMA0KICAgICAgICAgICAgICAgICAgICB8IEhTTUNfU0VUVVBfTldFX1NFVFVQKDIpDQogICAgICAgICAgICAgICAgICAgIHwgSFNNQ19TRVRVUF9OQ1NfV1JfU0VUVVAoMikNCiAgICAgICAgICAgICAgICAgICAgfCBIU01DX1NFVFVQX05SRF9TRVRVUCgyKQ0KICAgICAgICAgICAgICAgICAgICB8IEhTTUNfU0VUVVBfTkNTX1JEX1NFVFVQKDIpOw0KDQogICAgSFNNQy0+SFNNQ19DU19OVU1CRVJbM10uSFNNQ19QVUxTRSA9IDANCiAgICAgICAgICAgICAgICAgICAgfCBIU01DX1BVTFNFX05XRV9QVUxTRSg3KQ0KICAgICAgICAgICAgICAgICAgICB8IEhTTUNfUFVMU0VfTkNTX1dSX1BVTFNFKDcpDQogICAgICAgICAgICAgICAgICAgIHwgSFNNQ19QVUxTRV9OUkRfUFVMU0UoNykNCiAgICAgICAgICAgICAgICAgICAgfCBIU01DX1BVTFNFX05DU19SRF9QVUxTRSg3KTsNCg0KICAgIEhTTUMtPkhTTUNfQ1NfTlVNQkVSWzNdLkhTTUNfQ1lDTEUgPSAwDQogICAgICAgICAgICAgICAgICAgIHwgSFNNQ19DWUNMRV9OV0VfQ1lDTEUoMTMpDQogICAgICAgICAgICAgICAgICAgIHwgSFNNQ19DWUNMRV9OUkRfQ1lDTEUoMTMpOw0KDQogICAgSFNNQy0+SFNNQ19DU19OVU1CRVJbM10uSFNNQ19USU1JTkdTID0gSFNNQ19USU1JTkdTX1RDTFIoMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSFNNQ19USU1JTkdTX1RBREwoMjcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhTTUNfVElNSU5HU19UQVIoMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSFNNQ19USU1JTkdTX1RSUig2KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIU01DX1RJTUlOR1NfVFdCKDUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhTTUNfVElNSU5HU19SQk5TRUwoMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwoSFNNQ19USU1JTkdTX05GU0VMKTsNCiAgICBIU01DLT5IU01DX0NTX05VTUJFUlszXS5IU01DX01PREUgPSBIU01DX01PREVfUkVBRF9NT0RFIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIU01DX01PREVfV1JJVEVfTU9ERSB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChidXNXaWR0aCA9PSA4ICk/IEhTTUNfTU9ERV9EQldfQklUXzggOkhTTUNfTU9ERV9EQldfQklUXzE2KSB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhTTUNfTU9ERV9UREZfQ1lDTEVTKDEpOw0KfQ0KDQoNCnZvaWQgQk9BUkRfQ29uZmlndXJlTm9yRmxhc2goIHVpbnQ4X3QgYnVzV2lkdGggKQ0Kew0KICAgIHVpbnQzMl90IGRidzsNCiAgICBQTUNfRW5hYmxlUGVyaXBoZXJhbChJRF9IU01DKTsNCiAgICBpZiAoYnVzV2lkdGggPT0gOCkNCiAgICB7DQogICAgICAgIGRidyA9IEhTTUNfTU9ERV9EQldfQklUXzg7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBkYncgPSBIU01DX01PREVfREJXX0JJVF8xNjsNCiAgICB9DQogICAgLyogQ29uZmlndXJlIFNNQywgTkNTMCBpcyBhc3NpZ25lZCB0byBhIG5vcmZsYXNoICovDQogICAgSFNNQy0+SFNNQ19DU19OVU1CRVJbMF0uSFNNQ19TRVRVUCA9IDB4MDAwMjAwMDE7DQogICAgSFNNQy0+SFNNQ19DU19OVU1CRVJbMF0uSFNNQ19QVUxTRSA9IDB4MEIwQjBBMEE7DQogICAgSFNNQy0+SFNNQ19DU19OVU1CRVJbMF0uSFNNQ19DWUNMRSA9IDB4MDAwRTAwMEI7DQogICAgSFNNQy0+SFNNQ19DU19OVU1CRVJbMF0uSFNNQ19USU1JTkdTID0gMHgwMDAwMDAwMDsNCiAgICBIU01DLT5IU01DX0NTX05VTUJFUlswXS5IU01DX01PREUgID0gSFNNQ19NT0RFX1dSSVRFX01PREUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSFNNQ19NT0RFX1JFQURfTU9ERQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkYncNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSFNNQ19NT0RFX0VYTldfTU9ERV9ESVNBQkxFRA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIU01DX01PREVfVERGX0NZQ0xFUygxKTsNCg0KfQ0K